67efa72a80b19fdef7543b7c818c8b105b693993
[policy/drools-pdp.git] /
1 /*
2  * ============LICENSE_START=======================================================
3  * Copyright (C) 2020-2022 AT&T Intellectual Property. All rights reserved.
4  * Modifications Copyright (C) 2021 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
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * =============LICENSE_END========================================================
20  */
21
22 package org.onap.policy.drools.lifecycle;
23
24 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertFalse;
27 import static org.junit.Assert.assertNotEquals;
28 import static org.junit.Assert.assertNotNull;
29 import static org.junit.Assert.assertNull;
30 import static org.junit.Assert.assertTrue;
31
32 import java.io.IOException;
33 import java.util.List;
34 import java.util.Map;
35 import java.util.Properties;
36 import java.util.Set;
37 import org.junit.Before;
38 import org.junit.Test;
39 import org.onap.policy.common.endpoints.event.comm.TopicEndpointManager;
40 import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties;
41 import org.onap.policy.common.utils.coder.CoderException;
42 import org.onap.policy.common.utils.coder.StandardCoder;
43 import org.onap.policy.drools.system.PolicyEngineConstants;
44 import org.onap.policy.models.pdp.concepts.PdpStateChange;
45 import org.onap.policy.models.pdp.concepts.PdpUpdate;
46 import org.onap.policy.models.pdp.enums.PdpState;
47 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
48 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
49
50 /**
51  * Lifecycle State Active Test.
52  */
53 public class LifecycleStateActivePoliciesTest extends LifecycleStateRunningTest {
54
55     private static final String EXAMPLE_NATIVE_DROOLS_CONTROLLER_POLICY_NAME = "example.controller";
56     private static final String EXAMPLE_NATIVE_DROOLS_ARTIFACT_POLICY_NAME = "example.artifact";
57     private static final String FOO_NATIVE_DROOLS_CONTROLLER_POLICY_NAME = "foo.controller";
58
59     private static final String EXAMPLE_NATIVE_DROOLS_POLICY_JSON =
60             "src/test/resources/tosca-policy-native-controller-example.json";
61     private static final String EXAMPLE_NATIVE_ARTIFACT_POLICY_JSON =
62             "src/test/resources/tosca-policy-native-artifact-example.json";
63     private static final String FOO_NATIVE_DROOLS_POLICY_JSON =
64             "src/test/resources/tosca-policy-native-controller-foo.json";
65
66     /**
67      * Start tests in the Active state.
68      */
69     @Before
70     public void startActive() throws CoderException {
71         fsm = makeFsmWithPseudoTime();
72
73         fsm.setStatusTimerSeconds(15);
74         assertTrue(fsm.start());
75
76         PdpStateChange change = new PdpStateChange();
77         change.setPdpGroup("A");
78         change.setPdpSubgroup("a");
79         change.setState(PdpState.ACTIVE);
80         change.setName(fsm.getPdpName());
81
82         fsm.setSubGroup("a");
83         fsm.source.offer(new StandardCoder().encode(change));
84         controllerSupport.getController().start();
85     }
86
87     @Test
88     public void testMandatoryPolicyTypes() {
89         assertEquals(Set.of("onap.policies.native.drools.Artifact", "onap.policies.native.drools.Controller"),
90             fsm.getMandatoryPolicyTypes());
91         assertEquals(fsm.getMandatoryPolicyTypes(), fsm.getCurrentPolicyTypes());
92         assertTrue(fsm.isMandatoryPolicyTypesCompliant());
93         assertTrue(fsm.status());
94
95         fsm.mandatoryPolicyTypes.add("blah");
96         assertEquals(Set.of("onap.policies.native.drools.Artifact", "onap.policies.native.drools.Controller", "blah"),
97                 fsm.getMandatoryPolicyTypes());
98         assertNotEquals(fsm.getMandatoryPolicyTypes(), fsm.getCurrentPolicyTypes());
99         assertFalse(fsm.isMandatoryPolicyTypesCompliant());
100         assertFalse(fsm.status());
101     }
102
103     @Test
104     public void testUpdatePolicies() throws IOException, CoderException {
105         assertEquals(2, fsm.policyTypesMap.size());
106         assertNotNull(fsm.getPolicyTypesMap().get(
107                 new ToscaConceptIdentifier("onap.policies.native.drools.Controller", "1.0.0")));
108         assertNotNull(fsm.getPolicyTypesMap().get(
109                 new ToscaConceptIdentifier("onap.policies.native.drools.Artifact", "1.0.0")));
110
111         //
112         // create controller using native policy
113         //
114
115         ToscaPolicy policyNativeController =
116             getPolicyFromFile(EXAMPLE_NATIVE_DROOLS_POLICY_JSON, EXAMPLE_NATIVE_DROOLS_CONTROLLER_POLICY_NAME);
117
118         PdpUpdate update = new PdpUpdate();
119         update.setName(PolicyEngineConstants.getManager().getPdpName());
120         update.setPdpGroup("W");
121         update.setPdpSubgroup("w");
122         update.setPoliciesToBeDeployed(List.of(policyNativeController));
123
124         assertFalse(fsm.update(update));
125         assertEquals(0, fsm.getPoliciesMap().size());
126
127         // add topics
128
129         Properties noopTopicProperties = new Properties();
130         noopTopicProperties.put(PolicyEndPointProperties.PROPERTY_NOOP_SOURCE_TOPICS, "DCAE_TOPIC");
131         noopTopicProperties.put(PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS, "APPC-CL");
132         TopicEndpointManager.getManager().addTopics(noopTopicProperties);
133
134         assertTrue(fsm.update(update));
135         assertEquals(1, fsm.getPoliciesMap().size());
136
137         //
138         // add an artifact policy
139         //
140
141         ToscaPolicy policyNativeArtifact =
142                 getPolicyFromFile(EXAMPLE_NATIVE_ARTIFACT_POLICY_JSON, EXAMPLE_NATIVE_DROOLS_ARTIFACT_POLICY_NAME);
143
144         @SuppressWarnings("unchecked")
145         Map<String, String> controllerMap =
146                 (Map<String, String>) policyNativeArtifact.getProperties().get("controller");
147         controllerMap.put("name", "xyz987");
148         update.setPoliciesToBeDeployed(List.of(policyNativeController, policyNativeArtifact));
149         assertFalse(fsm.update(update));
150
151         // add a registered controller
152
153         controllerMap.put("name", "lifecycle");
154         update.setPoliciesToBeDeployed(List.of(policyNativeController, policyNativeArtifact));
155         assertTrue(fsm.update(update));
156
157         assertEquals(2, fsm.getPoliciesMap().size());
158         assertEquals(policyNativeController, fsm.getPoliciesMap().get(policyNativeController.getIdentifier()));
159         assertEquals(policyNativeArtifact, fsm.getPoliciesMap().get(policyNativeArtifact.getIdentifier()));
160
161         //
162         // add an operational policy
163         //
164
165         ToscaPolicy opPolicyRestart =
166             getExamplesPolicy("policies/vCPE.policy.operational.input.tosca.json", "operational.restart");
167         update.setPoliciesToBeDeployed(List.of(policyNativeController, policyNativeArtifact, opPolicyRestart));
168         assertFalse(fsm.update(update));
169
170         assertEquals(2, fsm.getPoliciesMap().size());
171         assertEquals(policyNativeController, fsm.getPoliciesMap().get(policyNativeController.getIdentifier()));
172         assertEquals(policyNativeArtifact, fsm.getPoliciesMap().get(policyNativeArtifact.getIdentifier()));
173
174         // register controller
175
176         fsm.start(controllerSupport.getController());
177
178         assertEquals(3, fsm.policyTypesMap.size());
179         assertNotNull(fsm.getPolicyTypesMap().get(
180                 new ToscaConceptIdentifier("onap.policies.native.drools.Controller", "1.0.0")));
181         assertNotNull(fsm.getPolicyTypesMap().get(
182                 new ToscaConceptIdentifier("onap.policies.native.drools.Artifact", "1.0.0")));
183         assertNotNull(fsm.getPolicyTypesMap().get(
184                 new ToscaConceptIdentifier("onap.policies.controlloop.operational.common.Drools",
185                         "1.0.0")));
186
187         // invalid controller name
188
189         opPolicyRestart.getProperties().put("controllerName", "xyz987");
190         assertFalse(fsm.update(update));
191         assertEquals(2, fsm.getPoliciesMap().size());
192         assertEquals(policyNativeController, fsm.getPoliciesMap().get(policyNativeController.getIdentifier()));
193         assertEquals(policyNativeArtifact, fsm.getPoliciesMap().get(policyNativeArtifact.getIdentifier()));
194
195         // no controller name
196
197         opPolicyRestart.getProperties().remove("controllerName");
198         assertTrue(fsm.update(update));
199         assertEquals(3, fsm.getPoliciesMap().size());
200         assertEquals(policyNativeController, fsm.getPoliciesMap().get(policyNativeController.getIdentifier()));
201         assertEquals(policyNativeArtifact, fsm.getPoliciesMap().get(policyNativeArtifact.getIdentifier()));
202         assertEquals(opPolicyRestart, fsm.getPoliciesMap().get(opPolicyRestart.getIdentifier()));
203
204         List<ToscaPolicy> factPolicies = controllerSupport.getFacts(ToscaPolicy.class);
205         assertEquals(1, factPolicies.size());
206         assertEquals(opPolicyRestart, factPolicies.get(0));
207
208         // upgrade operational policy with valid controller name
209
210         ToscaPolicy opPolicyRestartV2 =
211             getExamplesPolicy("policies/vCPE.policy.operational.input.tosca.json", "operational.restart");
212         opPolicyRestartV2.setVersion("2.0.0");
213         opPolicyRestartV2.getProperties().put("controllerName", "lifecycle");
214         update.setPoliciesToBeDeployed(List.of(policyNativeController, policyNativeArtifact, opPolicyRestartV2));
215         update.setPoliciesToBeUndeployed(List.of(opPolicyRestart.getIdentifier()));
216         assertTrue(fsm.update(update));
217
218         assertEquals(3, fsm.getPoliciesMap().size());
219         assertEquals(policyNativeController, fsm.getPoliciesMap().get(policyNativeController.getIdentifier()));
220         assertEquals(policyNativeArtifact, fsm.getPoliciesMap().get(policyNativeArtifact.getIdentifier()));
221         assertEquals(opPolicyRestartV2, fsm.getPoliciesMap().get(opPolicyRestartV2.getIdentifier()));
222         assertNull(fsm.getPoliciesMap().get(opPolicyRestart.getIdentifier()));
223
224         factPolicies = controllerSupport.getFacts(ToscaPolicy.class);
225         assertEquals(1, factPolicies.size());
226         assertEquals(opPolicyRestartV2, factPolicies.get(0));
227
228         update.setPoliciesToBeDeployed(List.of());
229         update.setPoliciesToBeUndeployed(List.of(opPolicyRestartV2.getIdentifier()));
230         assertTrue(fsm.update(update));
231
232         assertEquals(2, fsm.getPoliciesMap().size());
233         assertEquals(policyNativeController, fsm.getPoliciesMap().get(policyNativeController.getIdentifier()));
234         assertEquals(policyNativeArtifact, fsm.getPoliciesMap().get(policyNativeArtifact.getIdentifier()));
235         assertNull(fsm.getPoliciesMap().get(opPolicyRestartV2.getIdentifier()));
236         assertNull(fsm.getPoliciesMap().get(opPolicyRestart.getIdentifier()));
237
238         factPolicies = controllerSupport.getFacts(ToscaPolicy.class);
239         assertEquals(0, factPolicies.size());
240         assertTrue(controllerSupport.getController().getDrools().isBrained());
241
242         update.setPoliciesToBeDeployed(List.of());
243         update.setPoliciesToBeUndeployed(List.of(policyNativeArtifact.getIdentifier(),
244                 opPolicyRestartV2.getIdentifier()));
245         assertTrue(fsm.update(update));
246         assertFalse(controllerSupport.getController().getDrools().isBrained());
247         assertEquals(1, fsm.getPoliciesMap().size());
248         assertEquals(policyNativeController, fsm.getPoliciesMap().get(policyNativeController.getIdentifier()));
249         assertNull(fsm.getPoliciesMap().get(policyNativeArtifact.getIdentifier()));
250         assertNull(fsm.getPoliciesMap().get(opPolicyRestartV2.getIdentifier()));
251         assertNull(fsm.getPoliciesMap().get(opPolicyRestart.getIdentifier()));
252
253         ToscaPolicy policyNativeFooController =
254                 getPolicyFromFile(FOO_NATIVE_DROOLS_POLICY_JSON, FOO_NATIVE_DROOLS_CONTROLLER_POLICY_NAME);
255         update.setPoliciesToBeUndeployed(List.of());
256         update.setPoliciesToBeDeployed(List.of(policyNativeFooController));
257         assertTrue(fsm.update(update));
258         assertEquals(2, fsm.getPoliciesMap().size());
259         assertEquals(policyNativeController, fsm.getPoliciesMap().get(policyNativeController.getIdentifier()));
260         assertEquals(policyNativeFooController, fsm.getPoliciesMap().get(policyNativeFooController.getIdentifier()));
261
262         update.setPoliciesToBeDeployed(List.of());
263         update.setPoliciesToBeUndeployed(List.of(policyNativeController.getIdentifier(),
264                 policyNativeFooController.getIdentifier()));
265         assertTrue(fsm.update(update));
266         assertThatIllegalArgumentException().isThrownBy(() -> controllerSupport.getController().getDrools());
267         assertNull(fsm.getPoliciesMap().get(policyNativeController.getIdentifier()));
268         assertNull(fsm.getPoliciesMap().get(policyNativeArtifact.getIdentifier()));
269         assertNull(fsm.getPoliciesMap().get(opPolicyRestartV2.getIdentifier()));
270         assertNull(fsm.getPoliciesMap().get(opPolicyRestart.getIdentifier()));
271
272         fsm.shutdown();
273     }
274 }