Skip to content
Snippets Groups Projects
Commit 7e314a8c authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

Merge branch 'feat/policy_recalculatePath' into 'develop'

feat: add recalculatePath as action to Policy

See merge request !115
parents 639ebee2 28707a83
No related branches found
No related tags found
2 merge requests!142Release TeraFlowSDN 2.1,!115feat: add recalculatePath as action to Policy
Showing
with 437 additions and 440 deletions
...@@ -26,6 +26,8 @@ enum PolicyRuleActionEnum { ...@@ -26,6 +26,8 @@ enum PolicyRuleActionEnum {
POLICYRULE_ACTION_SET_DEVICE_STATUS = 1; POLICYRULE_ACTION_SET_DEVICE_STATUS = 1;
POLICYRULE_ACTION_ADD_SERVICE_CONFIGRULE = 2; POLICYRULE_ACTION_ADD_SERVICE_CONFIGRULE = 2;
POLICYRULE_ACTION_ADD_SERVICE_CONSTRAINT = 3; POLICYRULE_ACTION_ADD_SERVICE_CONSTRAINT = 3;
POLICY_RULE_ACTION_CALL_SERVICE_RPC = 4;
POLICY_RULE_ACTION_RECALCULATE_PATH = 5;
} }
// Action configuration // Action configuration
...@@ -37,4 +39,4 @@ message PolicyRuleActionConfig { ...@@ -37,4 +39,4 @@ message PolicyRuleActionConfig {
// message PolicyRuleAction { // message PolicyRuleAction {
// PolicyRuleActionEnum action = 1; // PolicyRuleActionEnum action = 1;
// repeated string parameters = 2; // repeated string parameters = 2;
// } // }
\ No newline at end of file
...@@ -21,6 +21,7 @@ import eu.teraflow.policy.context.model.Device; ...@@ -21,6 +21,7 @@ import eu.teraflow.policy.context.model.Device;
import eu.teraflow.policy.context.model.EndPointId; import eu.teraflow.policy.context.model.EndPointId;
import eu.teraflow.policy.context.model.Service; import eu.teraflow.policy.context.model.Service;
import eu.teraflow.policy.context.model.ServiceId; import eu.teraflow.policy.context.model.ServiceId;
import eu.teraflow.policy.model.PolicyRuleService;
import io.smallrye.mutiny.Uni; import io.smallrye.mutiny.Uni;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -42,73 +43,44 @@ public class PolicyRuleConditionValidator { ...@@ -42,73 +43,44 @@ public class PolicyRuleConditionValidator {
this.contextService = contextService; this.contextService = contextService;
} }
public Uni<Boolean> validateDeviceId(String deviceId) { public Uni<Boolean> isDeviceIdValid(String deviceId) {
final var isDeviceIdValid = isDeviceIdValid(deviceId);
isDeviceIdValid
.subscribe()
.with(
deviceIdIdBooleanValue -> {
if (Boolean.FALSE.equals(deviceIdIdBooleanValue)) {
LOGGER.errorf(INVALID_MESSAGE, deviceId);
}
LOGGER.infof(VALID_MESSAGE, deviceId);
});
return isDeviceIdValid;
}
public Uni<Boolean> validateServiceId(ServiceId serviceId) {
final var isServiceIdValid = isServiceIdValid(serviceId);
isServiceIdValid
.subscribe()
.with(
serviceIdBooleanValue -> {
if (Boolean.FALSE.equals(serviceIdBooleanValue)) {
LOGGER.errorf(INVALID_MESSAGE, serviceId);
}
});
return isServiceIdValid;
}
public Uni<Boolean> validateUpdatedPolicyRuleId(String updatedPolicyRuleId) {
final var isUpdatedPolicyRuleIdValid = isUpdatedPolicyRuleIdValid(updatedPolicyRuleId);
isUpdatedPolicyRuleIdValid
.subscribe()
.with(
serviceIdBooleanValue -> {
if (Boolean.FALSE.equals(serviceIdBooleanValue)) {
LOGGER.errorf(INVALID_MESSAGE, updatedPolicyRuleId);
}
});
return isUpdatedPolicyRuleIdValid;
}
private Uni<Boolean> isDeviceIdValid(String deviceId) {
return contextService return contextService
.getDevice(deviceId) .getDevice(deviceId)
.onFailure()
.recoverWithItem((Device) null)
.onItem() .onItem()
.transform(device -> checkIfDeviceIdExists(device, deviceId)); .transform(device -> checkIfDeviceIdExists(device, deviceId));
} }
private boolean checkIfDeviceIdExists(Device device, String deviceId) { private boolean checkIfDeviceIdExists(Device device, String deviceId) {
final var deviceDeviceId = device.getDeviceId(); if (device == null) {
return false;
}
final var deviceDeviceId = device.getDeviceId();
return deviceDeviceId.equals(deviceId); return deviceDeviceId.equals(deviceId);
} }
private Uni<Boolean> isServiceIdValid(ServiceId serviceId) { public Uni<Boolean> isServiceIdValid(ServiceId serviceId, List<String> deviceIds) {
return contextService return contextService
.getService(serviceId) .getService(serviceId)
.onFailure()
.recoverWithItem((Service) null)
.onItem() .onItem()
.transform(service -> checkIfServiceIdExists(service, serviceId)); .transform(service -> checkIfServiceIsValid(service, serviceId, deviceIds));
}
private boolean checkIfServiceIsValid(
Service service, ServiceId serviceId, List<String> deviceIds) {
return (checkIfServiceIdExists(service, serviceId)
&& checkIfServicesDeviceIdsExist(service, deviceIds));
} }
private boolean checkIfServiceIdExists(Service service, ServiceId serviceId) { private boolean checkIfServiceIdExists(Service service, ServiceId serviceId) {
if (service == null) {
return false;
}
final var serviceServiceIdServiceId = service.getServiceId(); final var serviceServiceIdServiceId = service.getServiceId();
final var serviceServiceIdContextId = serviceServiceIdServiceId.getContextId(); final var serviceServiceIdContextId = serviceServiceIdServiceId.getContextId();
final var serviceServiceIdId = serviceServiceIdServiceId.getId(); final var serviceServiceIdId = serviceServiceIdServiceId.getId();
...@@ -117,14 +89,11 @@ public class PolicyRuleConditionValidator { ...@@ -117,14 +89,11 @@ public class PolicyRuleConditionValidator {
&& serviceServiceIdId.equals(serviceId.getId()); && serviceServiceIdId.equals(serviceId.getId());
} }
public Uni<Boolean> isServicesDeviceIdsValid(ServiceId serviceId, List<String> deviceIds) {
return contextService
.getService(serviceId)
.onItem()
.transform(service -> checkIfServicesDeviceIdsExist(service, deviceIds));
}
private boolean checkIfServicesDeviceIdsExist(Service service, List<String> deviceIds) { private boolean checkIfServicesDeviceIdsExist(Service service, List<String> deviceIds) {
if (deviceIds.isEmpty()) {
return true;
}
List<String> serviceDeviceIds = new ArrayList<>(); List<String> serviceDeviceIds = new ArrayList<>();
for (EndPointId serviceEndPointId : service.getServiceEndPointIds()) { for (EndPointId serviceEndPointId : service.getServiceEndPointIds()) {
serviceDeviceIds.add(serviceEndPointId.getDeviceId()); serviceDeviceIds.add(serviceEndPointId.getDeviceId());
...@@ -133,7 +102,7 @@ public class PolicyRuleConditionValidator { ...@@ -133,7 +102,7 @@ public class PolicyRuleConditionValidator {
return deviceIds.containsAll(serviceDeviceIds); return deviceIds.containsAll(serviceDeviceIds);
} }
private Uni<Boolean> isUpdatedPolicyRuleIdValid(String updatedPolicyRuleId) { public Uni<Boolean> isUpdatedPolicyRuleIdValid(String updatedPolicyRuleId) {
return contextService return contextService
.getPolicyRule(updatedPolicyRuleId) .getPolicyRule(updatedPolicyRuleId)
.onItem() .onItem()
...@@ -146,4 +115,25 @@ public class PolicyRuleConditionValidator { ...@@ -146,4 +115,25 @@ public class PolicyRuleConditionValidator {
.ifNull() .ifNull()
.continueWith(false); .continueWith(false);
} }
public Uni<Boolean> isPolicyRuleServiceValid(String updatedPolicyRuleId, ServiceId serviceId) {
return contextService
.getPolicyRule(updatedPolicyRuleId)
.onItem()
.ifNotNull()
.transform(
policyRule -> {
var policyRuleService =
(PolicyRuleService) policyRule.getPolicyRuleType().getPolicyRuleType();
if (policyRuleService.getServiceId().getId().equals(serviceId.getId())) {
return true;
}
return false;
})
.onItem()
.ifNull()
.continueWith(false)
.onFailure()
.recoverWithItem(false);
}
} }
...@@ -20,5 +20,7 @@ public enum ServiceStatusEnum { ...@@ -20,5 +20,7 @@ public enum ServiceStatusEnum {
UNDEFINED, UNDEFINED,
PLANNED, PLANNED,
ACTIVE, ACTIVE,
PENDING_REMOVAL PENDING_REMOVAL,
SLA_VIOLATED,
UPDATING
} }
...@@ -20,5 +20,8 @@ public enum PolicyRuleActionEnum { ...@@ -20,5 +20,8 @@ public enum PolicyRuleActionEnum {
POLICY_RULE_ACTION_NO_ACTION, POLICY_RULE_ACTION_NO_ACTION,
POLICY_RULE_ACTION_SET_DEVICE_STATUS, POLICY_RULE_ACTION_SET_DEVICE_STATUS,
POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE, POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE,
POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT,
POLICY_RULE_ACTION_CALL_SERVICE_RPC,
// This is temporary
POLICY_RULE_ACTION_RECALCULATE_PATH
} }
...@@ -22,6 +22,7 @@ public class AlarmSubscription { ...@@ -22,6 +22,7 @@ public class AlarmSubscription {
private final float subscriptionTimeoutS; private final float subscriptionTimeoutS;
private final float subscriptionFrequencyMs; private final float subscriptionFrequencyMs;
// TODO: Refactor the AlarmSubscription constructor to allow infinite subscriptionTimeoutS
public AlarmSubscription( public AlarmSubscription(
String alarmId, float subscriptionTimeoutS, float subscriptionFrequencyMs) { String alarmId, float subscriptionTimeoutS, float subscriptionFrequencyMs) {
this.alarmId = alarmId; this.alarmId = alarmId;
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package eu.teraflow.policy.service; package eu.teraflow.policy.service;
import eu.teraflow.policy.context.model.Empty;
import eu.teraflow.policy.context.model.Service; import eu.teraflow.policy.context.model.Service;
import eu.teraflow.policy.context.model.ServiceId; import eu.teraflow.policy.context.model.ServiceId;
import io.smallrye.mutiny.Uni; import io.smallrye.mutiny.Uni;
...@@ -23,4 +24,6 @@ import io.smallrye.mutiny.Uni; ...@@ -23,4 +24,6 @@ import io.smallrye.mutiny.Uni;
public interface ServiceGateway { public interface ServiceGateway {
Uni<ServiceId> updateService(Service service); Uni<ServiceId> updateService(Service service);
Uni<Empty> recomputeConnections(Service service);
} }
...@@ -17,16 +17,19 @@ ...@@ -17,16 +17,19 @@
package eu.teraflow.policy.service; package eu.teraflow.policy.service;
import eu.teraflow.policy.Serializer; import eu.teraflow.policy.Serializer;
import eu.teraflow.policy.context.model.Empty;
import eu.teraflow.policy.context.model.Service; import eu.teraflow.policy.context.model.Service;
import eu.teraflow.policy.context.model.ServiceId; import eu.teraflow.policy.context.model.ServiceId;
import io.quarkus.grpc.GrpcClient; import io.quarkus.grpc.GrpcClient;
import io.smallrye.mutiny.Uni; import io.smallrye.mutiny.Uni;
import javax.enterprise.context.ApplicationScoped; import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject; import javax.inject.Inject;
import org.jboss.logging.Logger;
import service.MutinyServiceServiceGrpc.MutinyServiceServiceStub; import service.MutinyServiceServiceGrpc.MutinyServiceServiceStub;
@ApplicationScoped @ApplicationScoped
public class ServiceGatewayImpl implements ServiceGateway { public class ServiceGatewayImpl implements ServiceGateway {
private static final Logger LOGGER = Logger.getLogger(ServiceGatewayImpl.class);
@GrpcClient("service") @GrpcClient("service")
MutinyServiceServiceStub streamingDelegateService; MutinyServiceServiceStub streamingDelegateService;
...@@ -47,4 +50,23 @@ public class ServiceGatewayImpl implements ServiceGateway { ...@@ -47,4 +50,23 @@ public class ServiceGatewayImpl implements ServiceGateway {
.onItem() .onItem()
.transform(serializer::deserialize); .transform(serializer::deserialize);
} }
@Override
public Uni<Empty> recomputeConnections(Service service) {
service.getServiceEndPointIds().clear();
service.getServiceConstraints().clear();
final var serializedService = serializer.serialize(service);
LOGGER.info(serializedService);
return streamingDelegateService
.recomputeConnections(serializedService)
.onItem()
.transform(serializer::deserializeEmpty)
.onFailure()
.invoke(
x -> {
LOGGER.info("recomputeConnections failed with:");
LOGGER.info(x);
});
}
} }
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package eu.teraflow.policy.service; package eu.teraflow.policy.service;
import eu.teraflow.policy.context.model.Empty;
import eu.teraflow.policy.context.model.Service; import eu.teraflow.policy.context.model.Service;
import eu.teraflow.policy.context.model.ServiceId; import eu.teraflow.policy.context.model.ServiceId;
import io.smallrye.mutiny.Uni; import io.smallrye.mutiny.Uni;
...@@ -23,4 +24,6 @@ import io.smallrye.mutiny.Uni; ...@@ -23,4 +24,6 @@ import io.smallrye.mutiny.Uni;
public interface ServiceService { public interface ServiceService {
Uni<ServiceId> updateService(Service service); Uni<ServiceId> updateService(Service service);
Uni<Empty> recomputeConnections(Service service);
} }
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package eu.teraflow.policy.service; package eu.teraflow.policy.service;
import eu.teraflow.policy.context.model.Empty;
import eu.teraflow.policy.context.model.Service; import eu.teraflow.policy.context.model.Service;
import eu.teraflow.policy.context.model.ServiceId; import eu.teraflow.policy.context.model.ServiceId;
import io.smallrye.mutiny.Uni; import io.smallrye.mutiny.Uni;
...@@ -36,4 +37,9 @@ public class ServiceServiceImpl implements ServiceService { ...@@ -36,4 +37,9 @@ public class ServiceServiceImpl implements ServiceService {
public Uni<ServiceId> updateService(Service service) { public Uni<ServiceId> updateService(Service service) {
return serviceGateway.updateService(service); return serviceGateway.updateService(service);
} }
@Override
public Uni<Empty> recomputeConnections(Service service) {
return serviceGateway.recomputeConnections(service);
}
} }
...@@ -1914,8 +1914,7 @@ class SerializerTest { ...@@ -1914,8 +1914,7 @@ class SerializerTest {
ServiceStatusEnum.SLA_VIOLATED, ServiceStatusEnum.SLA_VIOLATED,
ContextOuterClass.ServiceStatusEnum.SERVICESTATUS_SLA_VIOLATED), ContextOuterClass.ServiceStatusEnum.SERVICESTATUS_SLA_VIOLATED),
Arguments.of( Arguments.of(
ServiceStatusEnum.UPDATING, ServiceStatusEnum.UPDATING, ContextOuterClass.ServiceStatusEnum.SERVICESTATUS_UPDATING),
ContextOuterClass.ServiceStatusEnum.SERVICESTATUS_UPDATING),
Arguments.of( Arguments.of(
ServiceStatusEnum.UNDEFINED, ServiceStatusEnum.UNDEFINED,
ContextOuterClass.ServiceStatusEnum.SERVICESTATUS_UNDEFINED)); ContextOuterClass.ServiceStatusEnum.SERVICESTATUS_UNDEFINED));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment