diff --git a/src/policy/src/main/java/eu/teraflow/policy/PolicyGatewayImpl.java b/src/policy/src/main/java/eu/teraflow/policy/PolicyGatewayImpl.java index d95f3a7be3d59db80edd0a3f2fb4d1720eb9be2e..fbcdbfa5340f9df3943c7fe21db74b855c194a16 100644 --- a/src/policy/src/main/java/eu/teraflow/policy/PolicyGatewayImpl.java +++ b/src/policy/src/main/java/eu/teraflow/policy/PolicyGatewayImpl.java @@ -52,24 +52,23 @@ public class PolicyGatewayImpl implements PolicyGateway { } @Override - public Uni<PolicyRuleState> policyAddDevice(PolicyRuleDevice request) { - final var policyRuleDevice = serializer.deserialize(request); + public Uni<PolicyRuleState> policyUpdateService(PolicyRuleService request) { + final var policyRuleService = serializer.deserialize(request); return policyService - .addPolicyDevice(policyRuleDevice) + .updatePolicyService(policyRuleService) .onItem() .transform(serializer::serialize); } @Override - public Uni<PolicyRuleState> policyUpdateService(PolicyRuleService request) { - return Uni.createFrom() - .item( - () -> - Policy.PolicyRuleState.newBuilder() - .setPolicyRuleState( - request.getPolicyRuleBasic().getPolicyRuleState().getPolicyRuleState()) - .build()); + public Uni<PolicyRuleState> policyAddDevice(PolicyRuleDevice request) { + final var policyRuleDevice = serializer.deserialize(request); + + return policyService + .addPolicyDevice(policyRuleDevice) + .onItem() + .transform(serializer::serialize); } @Override diff --git a/src/policy/src/main/java/eu/teraflow/policy/PolicyRuleConditionValidator.java b/src/policy/src/main/java/eu/teraflow/policy/PolicyRuleConditionValidator.java index 0ca242dbbb860354219c4c85bb367563672572ef..3af4f3a8dea133999451b3c39bb5e57f04670078 100644 --- a/src/policy/src/main/java/eu/teraflow/policy/PolicyRuleConditionValidator.java +++ b/src/policy/src/main/java/eu/teraflow/policy/PolicyRuleConditionValidator.java @@ -70,6 +70,21 @@ public class PolicyRuleConditionValidator { 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 .getDevice(deviceId) @@ -98,4 +113,18 @@ public class PolicyRuleConditionValidator { return serviceServiceIdContextId.equals(serviceId.getContextId()) && serviceServiceIdId.equals(serviceId.getId()); } + + private Uni<Boolean> isUpdatedPolicyRuleIdValid(String updatedPolicyRuleId) { + return contextService + .getPolicyRule(updatedPolicyRuleId) + .onItem() + .ifNotNull() + .transform( + id -> { + return true; + }) + .onItem() + .ifNull() + .continueWith(false); + } } diff --git a/src/policy/src/main/java/eu/teraflow/policy/PolicyService.java b/src/policy/src/main/java/eu/teraflow/policy/PolicyService.java index dcaf43b902c95471cff2c020f0fdc5659c59e6a1..f7eda5681b288eb4e912359cb7e065efa46596a3 100644 --- a/src/policy/src/main/java/eu/teraflow/policy/PolicyService.java +++ b/src/policy/src/main/java/eu/teraflow/policy/PolicyService.java @@ -25,5 +25,7 @@ public interface PolicyService { Uni<PolicyRuleState> addPolicyService(PolicyRuleService policyRuleService); + Uni<PolicyRuleState> updatePolicyService(PolicyRuleService policyRuleService); + Uni<PolicyRuleState> addPolicyDevice(PolicyRuleDevice policyRuleDevice); } diff --git a/src/policy/src/main/java/eu/teraflow/policy/PolicyServiceImpl.java b/src/policy/src/main/java/eu/teraflow/policy/PolicyServiceImpl.java index 5a2c0c3a3ebf24a4bab187e6506acb9ca2528d5a..b7f060458b1d2e734cc35fa45a7a2c7bf2719f3d 100644 --- a/src/policy/src/main/java/eu/teraflow/policy/PolicyServiceImpl.java +++ b/src/policy/src/main/java/eu/teraflow/policy/PolicyServiceImpl.java @@ -81,6 +81,8 @@ public class PolicyServiceImpl implements PolicyService { new PolicyRuleState(PolicyRuleStateEnum.POLICY_INEFFECTIVE); private static final PolicyRuleState EFFECTIVE_POLICYRULE_STATE = new PolicyRuleState(PolicyRuleStateEnum.POLICY_EFFECTIVE); + private static final PolicyRuleState UPDATED_POLICYRULE_STATE = + new PolicyRuleState(PolicyRuleStateEnum.POLICY_UPDATED); private final ContextService contextService; private final MonitoringService monitoringService; @@ -121,6 +123,59 @@ public class PolicyServiceImpl implements PolicyService { return Long.valueOf(now).doubleValue(); } + @Override + public Uni<PolicyRuleState> addPolicyService(PolicyRuleService policyRuleService) { + LOGGER.infof("Received %s", policyRuleService); + + final var policyRuleBasic = policyRuleService.getPolicyRuleBasic(); + policyRuleBasic.setPolicyRuleState(INSERTED_POLICYRULE_STATE); + + new Thread( + () -> { + validateService(policyRuleService); + }) + .start(); + + contextService.setPolicyRule(policyRuleBasic); + + return Uni.createFrom().item(policyRuleBasic.getPolicyRuleState()); + } + + @Override + public Uni<PolicyRuleState> updatePolicyService(PolicyRuleService policyRuleService) { + LOGGER.infof("Received %s", policyRuleService); + + final var policyRuleBasic = policyRuleService.getPolicyRuleBasic(); + policyRuleBasic.setPolicyRuleState(UPDATED_POLICYRULE_STATE); + + new Thread( + () -> { + validateUpdatedPolicyService(policyRuleService); + }) + .start(); + + contextService.setPolicyRule(policyRuleBasic); + + return Uni.createFrom().item(policyRuleBasic.getPolicyRuleState()); + } + + @Override + public Uni<PolicyRuleState> addPolicyDevice(PolicyRuleDevice policyRuleDevice) { + LOGGER.infof("Received %s", policyRuleDevice); + + final var policyRuleBasic = policyRuleDevice.getPolicyRuleBasic(); + policyRuleBasic.setPolicyRuleState(INSERTED_POLICYRULE_STATE); + + new Thread( + () -> { + validateDevice(policyRuleDevice); + }) + .start(); + + contextService.setPolicyRule(policyRuleBasic); + return Uni.createFrom().item(policyRuleBasic.getPolicyRuleState()); + } + private void provisionAlarm( PolicyRuleBasic policyRuleBasic, List<AlarmDescriptor> alarmDescriptorList, @@ -374,6 +429,27 @@ public class PolicyServiceImpl implements PolicyService { return; } + private void validateUpdatedPolicyService(PolicyRuleService policyRuleService) { + + final var policyRuleBasic = policyRuleService.getPolicyRuleBasic(); + final var isUpdatedPolicyRuleValid = + policyRuleConditionValidator.validateUpdatedPolicyRuleId(policyRuleBasic.getPolicyRuleId()); + + isUpdatedPolicyRuleValid + .subscribe() + .with( + policyRuleBoolean -> { + if (Boolean.TRUE.equals(isUpdatedPolicyRuleValid)) { + validateService(policyRuleService); + return; + } else { + policyRuleBasic.setPolicyRuleState(FAILED_POLICYRULE_STATE); + contextService.setPolicyRule(policyRuleBasic); + return; + } + }); + } + private void validateService(PolicyRuleService policyRuleService) { final var serviceId = policyRuleService.getServiceId(); final var deviceIds = policyRuleService.getDeviceIds(); @@ -626,41 +702,6 @@ public class PolicyServiceImpl implements PolicyService { getTimeStamp()); } - @Override - public Uni<PolicyRuleState> addPolicyService(PolicyRuleService policyRuleService) { - LOGGER.infof("Received %s", policyRuleService); - - final var policyRuleBasic = policyRuleService.getPolicyRuleBasic(); - policyRuleBasic.setPolicyRuleState(INSERTED_POLICYRULE_STATE); - - new Thread( - () -> { - validateService(policyRuleService); - }) - .start(); - - contextService.setPolicyRule(policyRuleBasic); - - return Uni.createFrom().item(policyRuleBasic.getPolicyRuleState()); - } - - @Override - public Uni<PolicyRuleState> addPolicyDevice(PolicyRuleDevice policyRuleDevice) { - LOGGER.infof("Received %s", policyRuleDevice); - - final var policyRuleBasic = policyRuleDevice.getPolicyRuleBasic(); - policyRuleBasic.setPolicyRuleState(INSERTED_POLICYRULE_STATE); - - new Thread( - () -> { - validateDevice(policyRuleDevice); - }) - .start(); - - contextService.setPolicyRule(policyRuleBasic); - return Uni.createFrom().item(policyRuleBasic.getPolicyRuleState()); - } - private List<String> returnInvalidDeviceIds(List<String> deviceIds) { var invalidDeviceIds = new ArrayList<String>(); diff --git a/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleBasicValidationTest.java b/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleBasicValidationTest.java index 896c842d90111c423cbc117d33e095ef3288a48e..43db1b00b550914bd5a83552083cf6a26ce4e1ce 100644 --- a/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleBasicValidationTest.java +++ b/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleBasicValidationTest.java @@ -35,6 +35,8 @@ import java.util.List; import java.util.UUID; import org.junit.jupiter.api.Test; +// TODO: Revisit PolicyRuleBasicValidationTest cases after handling exceptions in PolicyRuleBasic +// constructor @QuarkusTest class PolicyRuleBasicValidationTestHelper { diff --git a/src/policy/src/test/java/eu/teraflow/policy/PolicyServiceTest.java b/src/policy/src/test/java/eu/teraflow/policy/PolicyServiceTest.java index 4b2f3d6bd9ff9d231328d779b47ac7e873ba5c5f..65bea0d04fa7a7bc64a9c47b032c9c411cb4c5e2 100644 --- a/src/policy/src/test/java/eu/teraflow/policy/PolicyServiceTest.java +++ b/src/policy/src/test/java/eu/teraflow/policy/PolicyServiceTest.java @@ -183,7 +183,7 @@ class PolicyServiceTest { final var expectedPolicyRuleState = Policy.PolicyRuleState.newBuilder() - .setPolicyRuleState(PolicyRuleStateEnum.POLICY_ENFORCED) + .setPolicyRuleState(PolicyRuleStateEnum.POLICY_UPDATED) .build(); final var policyRuleBasic =