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 ac0710d8590153ef8df1e9dbeb6465eac88c3fa1..fcdfffdb64ae68738adca5e417f7e852902c544b 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 955ad2a62255155bee0ec7f8aa171d91410d8519..907473f80077bd397c5219c9484893e292eae828 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 0000000000000000000000000000000000000000..b565b7e75b5cf9eb7748d0ba92e4fa3416b3b52e --- /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 3472446aa9c83c8f742462850cab79a37e0a14f1..360485dcc84c8218dc41dcb275ddc146be63391b 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: