From 9af762abee471ba5fd4088c9012dd75a9ce56b0b Mon Sep 17 00:00:00 2001 From: Fotis Soldatos <fsoldatos@ubitech.eu> Date: Fri, 5 Aug 2022 00:22:50 +0300 Subject: [PATCH] refactor(policy): add validation at PolicyRuleService --- .../policy/model/PolicyRuleService.java | 5 + .../policy/PolicyRuleBasicValidationTest.java | 2 +- .../PolicyRuleServiceValidationTest.java | 222 ++++++++++++++++++ src/policy/target/kubernetes/kubernetes.yml | 28 +-- 4 files changed, 242 insertions(+), 15 deletions(-) create mode 100644 src/policy/src/test/java/eu/teraflow/policy/PolicyRuleServiceValidationTest.java diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleService.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleService.java index ac0710d85..fcdfffdb6 100644 --- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleService.java +++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleService.java @@ -16,6 +16,8 @@ package eu.teraflow.policy.model; +import static com.google.common.base.Preconditions.checkNotNull; + import eu.teraflow.policy.common.Util; import eu.teraflow.policy.context.model.ServiceId; import java.util.List; @@ -28,8 +30,11 @@ public class PolicyRuleService { public PolicyRuleService( PolicyRuleBasic policyRuleBasic, ServiceId serviceId, List<String> deviceIds) { + checkNotNull(policyRuleBasic, "PolicyRuleBasic must not be null."); this.policyRuleBasic = policyRuleBasic; + checkNotNull(serviceId, "Service Id must not be null."); this.serviceId = serviceId; + checkNotNull(deviceIds, "Device Ids must not be null."); this.deviceIds = deviceIds; } 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 955ad2a62..907473f80 100644 --- a/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleBasicValidationTest.java +++ b/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleBasicValidationTest.java @@ -70,7 +70,7 @@ class PolicyRuleBasicValidationTest { } @Test - void shouldThrowIllegalArgumentExceptionGivenNullPolicyRuleId() { + void shouldThrowNullPointerExceptionGivenNullPolicyRuleId() { final var policyRuleConditions = createPolicyRuleConditions( UUID.randomUUID().toString(), diff --git a/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleServiceValidationTest.java b/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleServiceValidationTest.java new file mode 100644 index 000000000..b565b7e75 --- /dev/null +++ b/src/policy/src/test/java/eu/teraflow/policy/PolicyRuleServiceValidationTest.java @@ -0,0 +1,222 @@ +/* +* Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package eu.teraflow.policy; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +import eu.teraflow.policy.context.model.ServiceId; +import eu.teraflow.policy.model.BooleanOperator; +import eu.teraflow.policy.model.NumericalOperator; +import eu.teraflow.policy.model.PolicyRuleAction; +import eu.teraflow.policy.model.PolicyRuleActionEnum; +import eu.teraflow.policy.model.PolicyRuleBasic; +import eu.teraflow.policy.model.PolicyRuleCondition; +import eu.teraflow.policy.model.PolicyRuleService; +import eu.teraflow.policy.model.PolicyRuleState; +import eu.teraflow.policy.model.RuleState; +import eu.teraflow.policy.monitoring.model.IntegerKpiValue; +import eu.teraflow.policy.monitoring.model.KpiValue; +import io.quarkus.test.junit.QuarkusTest; +import java.util.Collections; +import java.util.List; +import java.util.UUID; +import org.junit.jupiter.api.Test; + +@QuarkusTest +class PolicyRuleServiceValidationTest { + + private List<PolicyRuleCondition> createPolicyRuleConditions( + String kpiId, NumericalOperator numericalOperator, KpiValue<?> kpiValue) { + final var policyRuleCondition = new PolicyRuleCondition(kpiId, numericalOperator, kpiValue); + + return List.of(policyRuleCondition); + } + + private List<PolicyRuleAction> createPolicyRuleActions( + PolicyRuleActionEnum policyRuleActionEnum, List<String> parameters) { + final var policyRuleAction = new PolicyRuleAction(policyRuleActionEnum, parameters); + + return List.of(policyRuleAction); + } + + private PolicyRuleBasic createPolicyRuleBasic( + String policyRuleId, + int priority, + PolicyRuleState policyRuleState, + BooleanOperator booleanOperator, + List<PolicyRuleCondition> policyRuleConditions, + List<PolicyRuleAction> policyRuleActions) { + + return new PolicyRuleBasic( + policyRuleId, + policyRuleState, + priority, + policyRuleConditions, + booleanOperator, + policyRuleActions); + } + + private ServiceId createServiceId(String contextId, String id) { + return new ServiceId(contextId, id); + } + + private List<String> createDeviceIds() { + return List.of("deviceIdA", "deviceIdB"); + } + + private PolicyRuleService createPolicyRuleService( + PolicyRuleBasic policyRuleBasic, ServiceId serviceId, List<String> deviceIds) { + + return new PolicyRuleService(policyRuleBasic, serviceId, deviceIds); + } + + @Test + void shouldThrowNullPointerExceptionGivenNullPolicyRuleBasic() { + final var serviceId = createServiceId("CONTEXT_ID", "id"); + final var deviceIds = createDeviceIds(); + + assertThatExceptionOfType(NullPointerException.class) + .isThrownBy(() -> createPolicyRuleService(null, serviceId, deviceIds)); + } + + @Test + void shouldThrowNullPointerExceptionGivenNullServiceId() { + final var policyRuleConditions = + createPolicyRuleConditions( + UUID.randomUUID().toString(), + NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL, + new IntegerKpiValue(3)); + final var policyRuleActions = + createPolicyRuleActions( + PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT, + List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString())); + + final var policyRuleState = new PolicyRuleState(RuleState.POLICY_EFFECTIVE); + + final var deviceIds = createDeviceIds(); + + final var policyRuleBasic = + createPolicyRuleBasic( + "policyRuleId1", + 3, + policyRuleState, + BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR, + policyRuleConditions, + policyRuleActions); + + assertThatExceptionOfType(NullPointerException.class) + .isThrownBy(() -> createPolicyRuleService(policyRuleBasic, null, deviceIds)); + } + + @Test + void shouldThrowNullPointerExceptionGivenNullDeviceIds() { + final var serviceId = createServiceId("contextId", "ID"); + + final var policyRuleConditions = + createPolicyRuleConditions( + UUID.randomUUID().toString(), + NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN, + new IntegerKpiValue(3)); + final var policyRuleActions = + createPolicyRuleActions( + PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE, + List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString())); + + final var policyRuleState = new PolicyRuleState(RuleState.POLICY_EFFECTIVE); + + final var policyRuleBasic = + createPolicyRuleBasic( + "policyRuleId2", + 2, + policyRuleState, + BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_AND, + policyRuleConditions, + policyRuleActions); + + assertThatExceptionOfType(NullPointerException.class) + .isThrownBy(() -> createPolicyRuleService(policyRuleBasic, serviceId, null)); + } + + @Test + void shouldCreatePolicyRuleServiceObjectGivenEmptyDeviceIds() { + final var serviceId = createServiceId("contextId", "id"); + final var deviceIds = Collections.<String>emptyList(); + + final var policyRuleConditions = + createPolicyRuleConditions( + UUID.randomUUID().toString(), + NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, + new IntegerKpiValue(3)); + final var policyRuleActions = + createPolicyRuleActions( + PolicyRuleActionEnum.POLICY_RULE_ACTION_SET_DEVICE_STATUS, + List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString())); + + final var policyRuleState = new PolicyRuleState(RuleState.POLICY_EFFECTIVE); + + final var policyRuleBasic = + createPolicyRuleBasic( + "policyRuleId", + 777, + policyRuleState, + BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_AND, + policyRuleConditions, + policyRuleActions); + + final var expectedPolicyRuleService = + new PolicyRuleService(policyRuleBasic, serviceId, deviceIds); + + final var policyRuleService = createPolicyRuleService(policyRuleBasic, serviceId, deviceIds); + + assertThat(policyRuleService).usingRecursiveComparison().isEqualTo(expectedPolicyRuleService); + } + + @Test + void shouldCreatePolicyRuleServiceObject() { + final var serviceId = createServiceId("contextId", "id"); + final var deviceIds = List.of("deviceIdA", "deviceIdB"); + + final var policyRuleConditions = + createPolicyRuleConditions( + UUID.randomUUID().toString(), + NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN, + new IntegerKpiValue(3)); + final var policyRuleActions = + createPolicyRuleActions( + PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT, + List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString())); + + final var policyRuleState = new PolicyRuleState(RuleState.POLICY_EFFECTIVE); + + final var policyRuleBasic = + createPolicyRuleBasic( + "policyRuleId", + 3, + policyRuleState, + BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR, + policyRuleConditions, + policyRuleActions); + + final var expectedPolicyRuleService = + new PolicyRuleService(policyRuleBasic, serviceId, deviceIds); + + final var policyRuleService = createPolicyRuleService(policyRuleBasic, serviceId, deviceIds); + + assertThat(policyRuleService).usingRecursiveComparison().isEqualTo(expectedPolicyRuleService); + } +} diff --git a/src/policy/target/kubernetes/kubernetes.yml b/src/policy/target/kubernetes/kubernetes.yml index 3472446aa..360485dcc 100644 --- a/src/policy/target/kubernetes/kubernetes.yml +++ b/src/policy/target/kubernetes/kubernetes.yml @@ -3,20 +3,20 @@ apiVersion: v1 kind: Service metadata: annotations: - app.quarkus.io/commit-id: 8d012ef481feb17b0f599b8cd2367799150706d9 - app.quarkus.io/build-timestamp: 2022-08-04 - 13:19:34 +0000 + app.quarkus.io/commit-id: a5550cfa37e56aef1054126dd063b112df66b531 + app.quarkus.io/build-timestamp: 2022-08-04 - 21:21:19 +0000 labels: app.kubernetes.io/name: policyservice app: policyservice name: policyservice spec: ports: - - name: http - port: 8080 - targetPort: 8080 - name: grpc port: 6060 targetPort: 6060 + - name: http + port: 8080 + targetPort: 8080 selector: app.kubernetes.io/name: policyservice type: ClusterIP @@ -25,8 +25,8 @@ apiVersion: apps/v1 kind: Deployment metadata: annotations: - app.quarkus.io/commit-id: 8d012ef481feb17b0f599b8cd2367799150706d9 - app.quarkus.io/build-timestamp: 2022-08-04 - 13:19:34 +0000 + app.quarkus.io/commit-id: a5550cfa37e56aef1054126dd063b112df66b531 + app.quarkus.io/build-timestamp: 2022-08-04 - 21:21:19 +0000 labels: app: policyservice app.kubernetes.io/name: policyservice @@ -39,8 +39,8 @@ spec: template: metadata: annotations: - app.quarkus.io/commit-id: 8d012ef481feb17b0f599b8cd2367799150706d9 - app.quarkus.io/build-timestamp: 2022-08-04 - 13:19:34 +0000 + app.quarkus.io/commit-id: a5550cfa37e56aef1054126dd063b112df66b531 + app.quarkus.io/build-timestamp: 2022-08-04 - 21:21:19 +0000 labels: app: policyservice app.kubernetes.io/name: policyservice @@ -51,12 +51,12 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - - name: MONITORING_SERVICE_HOST - value: monitoringservice - name: SERVICE_SERVICE_HOST value: serviceservice - name: CONTEXT_SERVICE_HOST value: contextservice + - name: MONITORING_SERVICE_HOST + value: monitoringservice image: registry.gitlab.com/teraflow-h2020/controller/policy:0.1.0 imagePullPolicy: Always livenessProbe: @@ -71,12 +71,12 @@ spec: timeoutSeconds: 10 name: policyservice ports: - - containerPort: 8080 - name: http - protocol: TCP - containerPort: 6060 name: grpc protocol: TCP + - containerPort: 8080 + name: http + protocol: TCP readinessProbe: failureThreshold: 3 httpGet: -- GitLab