2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021-2022 AT&T Intellectual Property. All rights reserved.
4 * Modifications Copyright (C) 2021, 2024 Nordix Foundation.
5 * ================================================================================
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * SPDX-License-Identifier: Apache-2.0
19 * =============LICENSE_END========================================================
22 package org.onap.policy.drools.lifecycle;
24 import static org.junit.jupiter.api.Assertions.assertEquals;
26 import java.io.IOException;
27 import java.nio.file.Files;
28 import java.nio.file.Paths;
29 import java.util.Collections;
30 import java.util.List;
32 import java.util.Properties;
34 import java.util.concurrent.ScheduledExecutorService;
35 import org.junit.jupiter.api.AfterAll;
36 import org.junit.jupiter.api.BeforeEach;
37 import org.junit.jupiter.api.Test;
38 import org.onap.policy.common.utils.coder.CoderException;
39 import org.onap.policy.common.utils.coder.StandardCoder;
40 import org.onap.policy.common.utils.logging.LoggerUtils;
41 import org.onap.policy.common.utils.resources.ResourceUtils;
42 import org.onap.policy.common.utils.time.PseudoScheduledExecutorService;
43 import org.onap.policy.common.utils.time.TestTimeMulti;
44 import org.onap.policy.drools.persistence.SystemPersistenceConstants;
45 import org.onap.policy.drools.system.PolicyEngineConstants;
46 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
47 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
52 public class LifecycleFsmTest {
54 private static final String EXAMPLE_NATIVE_CONTROLLER_POLICY_NAME = "example.controller";
55 private static final String EXAMPLE_NATIVE_CONTROLLER_POLICY_JSON =
56 "src/test/resources/tosca-policy-native-controller-example.json";
58 private static final String EXAMPLE_NATIVE_ARTIFACT_POLICY_NAME = "example.artifact";
59 private static final String EXAMPLE_NATIVE_ARTIFACT_POLICY_JSON =
60 "src/test/resources/tosca-policy-native-artifact-example.json";
62 private static final String EXAMPLE_OTHER_UNVAL_POLICY_NAME = "other-unvalidated";
63 private static final String EXAMPLE_OTHER_UNVAL_POLICY_JSON =
64 "src/test/resources/tosca-policy-other-unvalidated.json";
66 private static final String EXAMPLE_OTHER_VAL_POLICY_NAME = "other-validated";
67 private static final String EXAMPLE_OTHER_VAL_POLICY_JSON =
68 "src/test/resources/tosca-policy-other-validated.json";
70 private static final String VCPE_OP_POLICY_NAME = "operational.restart";
71 private static final String VCPE_OPERATIONAL_DROOLS_POLICY_JSON =
72 "policies/vCPE.policy.operational.input.tosca.json";
74 private static final String VFW_OP_POLICY_NAME = "operational.modifyconfig";
75 private static final String VFW_OPERATIONAL_DROOLS_POLICY_JSON =
76 "policies/vFirewall.policy.operational.input.tosca.json";
78 private static final String USECASES_NATIVE_CONTROLLER_POLICY_NAME = "usecases";
79 private static final String USECASES_NATIVE_CONTROLLER_JSON =
80 "policies/usecases.native.controller.policy.input.tosca.json";
82 private static final String USECASES_NATIVE_ARTIFACT_POLICY_NAME = "usecases.artifacts";
83 private static final String USECASES_NATIVE_ARTIFACT_JSON =
84 "policies/usecases.native.artifact.policy.input.tosca.json";
86 private static final StandardCoder coder = new StandardCoder();
88 protected LifecycleFsm fsm;
89 private ToscaPolicy opPolicy;
90 private ToscaPolicy op2Policy;
91 private ToscaPolicy valPolicy;
92 private ToscaPolicy unvalPolicy;
93 private ToscaPolicy controllerPolicy;
94 private ToscaPolicy controller2Policy;
95 private ToscaPolicy artifactPolicy;
96 private ToscaPolicy artifact2Policy;
99 * Test initialization.
102 public void beforeTest() throws CoderException, IOException {
103 LoggerUtils.setLevel(LoggerUtils.ROOT_LOGGER, "INFO");
104 LoggerUtils.setLevel("org.onap.policy.common.endpoints", "WARN");
105 LoggerUtils.setLevel("org.onap.policy.drools", "INFO");
106 SystemPersistenceConstants.getManager().setConfigurationDir("target/test-classes");
107 PolicyEngineConstants.getManager().configure(new Properties());
109 fsm = new LifecycleFsm() {
111 protected ScheduledExecutorService makeExecutor() {
112 return new PseudoScheduledExecutorService(new TestTimeMulti());
116 opPolicy = getExamplesPolicy(VFW_OPERATIONAL_DROOLS_POLICY_JSON, VFW_OP_POLICY_NAME);
117 op2Policy = getExamplesPolicy(VCPE_OPERATIONAL_DROOLS_POLICY_JSON, VCPE_OP_POLICY_NAME);
119 getPolicyFromFile(EXAMPLE_NATIVE_CONTROLLER_POLICY_JSON, EXAMPLE_NATIVE_CONTROLLER_POLICY_NAME);
120 controller2Policy = getExamplesPolicy(USECASES_NATIVE_CONTROLLER_JSON, USECASES_NATIVE_CONTROLLER_POLICY_NAME);
122 getPolicyFromFile(EXAMPLE_NATIVE_ARTIFACT_POLICY_JSON, EXAMPLE_NATIVE_ARTIFACT_POLICY_NAME);
123 artifact2Policy = getExamplesPolicy(USECASES_NATIVE_ARTIFACT_JSON, USECASES_NATIVE_ARTIFACT_POLICY_NAME);
125 getPolicyFromFile(EXAMPLE_OTHER_VAL_POLICY_JSON, EXAMPLE_OTHER_VAL_POLICY_NAME);
127 getPolicyFromFile(EXAMPLE_OTHER_UNVAL_POLICY_JSON, EXAMPLE_OTHER_UNVAL_POLICY_NAME);
129 fsm.resetPoliciesAction();
130 resetExecutionStats();
134 public static void afterClass() {
135 resetExecutionStats();
138 private static void resetExecutionStats() {
139 PolicyEngineConstants.getManager().getStats().getGroupStat().setPolicyExecutedCount(0L);
140 PolicyEngineConstants.getManager().getStats().getGroupStat().setPolicyExecutedFailCount(0L);
141 PolicyEngineConstants.getManager().getStats().getGroupStat().setPolicyExecutedSuccessCount(0L);
145 void testGetDeployableActions() {
146 List<ToscaPolicy> expectedDeployOrder =
147 List.of(controllerPolicy, controller2Policy, artifact2Policy, artifactPolicy,
148 op2Policy, opPolicy, unvalPolicy, valPolicy);
150 assertEquals(expectedDeployOrder, fsm.getDeployablePoliciesAction(expectedDeployOrder));
151 assertEquals(expectedDeployOrder,
152 fsm.getDeployablePoliciesAction(
153 List.of(op2Policy, artifact2Policy, valPolicy, opPolicy, unvalPolicy, artifactPolicy,
154 controllerPolicy, controller2Policy)));
155 assertEquals(expectedDeployOrder,
156 fsm.getDeployablePoliciesAction(
157 List.of(artifact2Policy, op2Policy, artifactPolicy, controllerPolicy, opPolicy,
158 controller2Policy, valPolicy, unvalPolicy)));
162 void testGetUndeployableActions() {
164 List<ToscaPolicy> expectedUndeployOrder =
165 List.of(opPolicy, op2Policy, unvalPolicy, valPolicy, artifactPolicy,
166 artifact2Policy, controller2Policy, controllerPolicy);
168 assertEquals(expectedUndeployOrder, fsm.getUndeployablePoliciesAction(Collections.emptyList()));
169 assertEquals(expectedUndeployOrder, fsm.getUndeployablePoliciesAction(Collections.emptyList()));
170 assertEquals(expectedUndeployOrder, fsm.getUndeployablePoliciesAction(Collections.emptyList()));
174 void testGetNativeArtifactPolicies() {
177 Map<String, List<ToscaPolicy>> deployedPolicies = fsm.groupPoliciesByPolicyType(fsm.getActivePolicies());
178 assertEquals(2, fsm.getNativeArtifactPolicies(deployedPolicies).size());
179 assertEquals(List.of(artifactPolicy, artifact2Policy), fsm.getNativeArtifactPolicies(deployedPolicies));
183 void testSetGroup() {
185 assertEquals("bar", fsm.getGroup());
189 void testSetSubGroup() {
190 fsm.setSubGroup("foo");
191 assertEquals("foo", fsm.getSubGroup());
196 assertEquals("foo", fsm.getPdpType());
200 void testMergePolicies() {
201 assertEquals(List.of(), fsm.getActivePolicies());
202 assertEquals(List.of(), fsm.mergePolicies(List.of(), List.of()));
204 fsm.deployedPolicyAction(opPolicy);
205 fsm.deployedPolicyAction(controllerPolicy);
206 assertEquals(Set.of(opPolicy, controllerPolicy), toSet(fsm.getActivePolicies()));
207 assertEquals(Set.of(opPolicy, controllerPolicy), toSet(fsm.mergePolicies(List.of(), List.of())));
208 assertEquals(Set.of(opPolicy), toSet(fsm.mergePolicies(List.of(), List.of(controllerPolicy.getIdentifier()))));
210 assertEquals(Set.of(controllerPolicy, op2Policy, valPolicy, opPolicy, unvalPolicy),
211 toSet(fsm.mergePolicies(List.of(op2Policy, valPolicy, unvalPolicy), List.of())));
212 assertEquals(Set.of(controllerPolicy, op2Policy, valPolicy, opPolicy, unvalPolicy),
213 toSet(fsm.mergePolicies(List.of(controllerPolicy, opPolicy, op2Policy, valPolicy, unvalPolicy),
215 assertEquals(Set.of(op2Policy, valPolicy, unvalPolicy),
216 toSet(fsm.mergePolicies(List.of(op2Policy, valPolicy, unvalPolicy),
217 List.of(controllerPolicy.getIdentifier(), opPolicy.getIdentifier()))));
220 private Set<ToscaPolicy> toSet(List<ToscaPolicy> policies) {
221 return Set.copyOf(policies);
226 void testGetPolicyIdsMessages() {
227 assertEquals("[operational.modifyconfig 1.0.0, example.controller 1.0.0]",
228 fsm.getPolicyIds(List.of(opPolicy, controllerPolicy)).toString());
231 protected void deployAllPolicies() {
232 fsm.deployedPolicyAction(controllerPolicy);
233 fsm.deployedPolicyAction(controller2Policy);
234 fsm.deployedPolicyAction(artifactPolicy);
235 fsm.deployedPolicyAction(artifact2Policy);
236 fsm.deployedPolicyAction(opPolicy);
237 fsm.deployedPolicyAction(valPolicy);
238 fsm.deployedPolicyAction(unvalPolicy);
239 fsm.deployedPolicyAction(op2Policy);
242 protected ToscaPolicy getPolicyFromFile(String filePath, String policyName) throws CoderException, IOException {
243 String policyJson = Files.readString(Paths.get(filePath));
244 ToscaServiceTemplate serviceTemplate = coder.decode(policyJson, ToscaServiceTemplate.class);
245 return serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyName);
248 protected ToscaPolicy getExamplesPolicy(String resourcePath, String policyName) throws CoderException {
249 String policyJson = ResourceUtils.getResourceAsString(resourcePath);
250 ToscaServiceTemplate serviceTemplate = new StandardCoder().decode(policyJson, ToscaServiceTemplate.class);
251 return serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyName);