Removing deprecated DMAAP library
[policy/drools-pdp.git] / feature-lifecycle / src / test / java / org / onap / policy / drools / lifecycle / LifecycleFsmUpdateTest.java
1 /*
2  * ============LICENSE_START=======================================================
3  * Copyright (C) 2021-2022 AT&T Intellectual Property. All rights reserved.
4  * Modifications Copyright (C) 2021, 2023-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
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.jupiter.api.Assertions.assertEquals;
26 import static org.junit.jupiter.api.Assertions.assertFalse;
27 import static org.junit.jupiter.api.Assertions.assertTrue;
28
29 import com.google.common.base.Strings;
30 import java.io.IOException;
31 import java.nio.file.Files;
32 import java.nio.file.Paths;
33 import java.util.Collections;
34 import java.util.HashSet;
35 import java.util.List;
36 import java.util.Map;
37 import java.util.Properties;
38 import java.util.concurrent.ScheduledExecutorService;
39 import java.util.stream.Collectors;
40 import org.junit.jupiter.api.AfterAll;
41 import org.junit.jupiter.api.BeforeAll;
42 import org.junit.jupiter.api.BeforeEach;
43 import org.junit.jupiter.api.Test;
44 import org.onap.policy.common.endpoints.event.comm.TopicEndpointManager;
45 import org.onap.policy.common.endpoints.event.comm.bus.NoopTopicFactories;
46 import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties;
47 import org.onap.policy.common.utils.coder.CoderException;
48 import org.onap.policy.common.utils.coder.StandardCoder;
49 import org.onap.policy.common.utils.logging.LoggerUtils;
50 import org.onap.policy.common.utils.resources.ResourceUtils;
51 import org.onap.policy.common.utils.time.PseudoScheduledExecutorService;
52 import org.onap.policy.common.utils.time.TestTimeMulti;
53 import org.onap.policy.drools.domain.models.artifact.NativeArtifactPolicy;
54 import org.onap.policy.drools.domain.models.controller.ControllerPolicy;
55 import org.onap.policy.drools.persistence.SystemPersistenceConstants;
56 import org.onap.policy.drools.server.restful.TestConstants;
57 import org.onap.policy.drools.system.PolicyControllerConstants;
58 import org.onap.policy.drools.system.PolicyEngineConstants;
59 import org.onap.policy.models.pdp.concepts.PdpStateChange;
60 import org.onap.policy.models.pdp.concepts.PdpUpdate;
61 import org.onap.policy.models.pdp.enums.PdpState;
62 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
63 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
64 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
65
66 /**
67  * Lifecycle FSM Updates Test.
68  */
69 public class LifecycleFsmUpdateTest {
70
71     private static final String EXAMPLE_NATIVE_CONTROLLER_POLICY_NAME = "example.controller";
72     private static final String EXAMPLE_NATIVE_CONTROLLER_POLICY_JSON =
73         "src/test/resources/tosca-policy-native-controller-example.json";
74
75     private static final String EXAMPLE_NATIVE_ARTIFACT_POLICY_NAME = "example.artifact";
76     private static final String EXAMPLE_NATIVE_ARTIFACT_POLICY_JSON =
77         "src/test/resources/tosca-policy-native-artifact-example.json";
78
79     private static final String EXAMPLE_OTHER_UNVAL_POLICY_NAME = "other-unvalidated";
80     private static final String EXAMPLE_OTHER_UNVAL_POLICY_JSON =
81         "src/test/resources/tosca-policy-other-unvalidated.json";
82
83     private static final String EXAMPLE_OTHER_VAL_POLICY_NAME = "other-validated";
84     private static final String EXAMPLE_OTHER_VAL_POLICY_JSON = "src/test/resources/tosca-policy-other-validated.json";
85
86     private static final String FOO_NATIVE_CONTROLLER_POLICY_NAME = "foo.controller";
87     private static final String FOO_NATIVE_CONTROLLER_POLICY_JSON =
88         "src/test/resources/tosca-policy-native-controller-foo.json";
89
90     private static final String FOO_NATIVE_ARTIFACT_POLICY_NAME = "foo.artifact";
91     private static final String FOO_NATIVE_ARTIFACT_POLICY_JSON =
92         "src/test/resources/tosca-policy-native-artifact-foo.json";
93
94     private static final String VCPE_OP_POLICY_NAME = "operational.restart";
95     private static final String VCPE_OPERATIONAL_DROOLS_POLICY_JSON =
96         "policies/vCPE.policy.operational.input.tosca.json";
97
98     private static final String VFW_OP_POLICY_NAME = "operational.modifyconfig";
99     private static final String VFW_OPERATIONAL_DROOLS_POLICY_JSON =
100         "policies/vFirewall.policy.operational.input.tosca.json";
101
102     private static final StandardCoder coder = new StandardCoder();
103
104     protected static LifecycleFsm savedFsm;
105     protected LifecycleFsm fsm;
106
107     private ToscaPolicy opPolicy;
108     private ToscaPolicy op2Policy;
109     private ToscaPolicy valPolicy;
110     private ToscaPolicy unvalPolicy;
111     private ToscaPolicy controllerPolicy;
112     private ToscaPolicy controller2Policy;
113     private ToscaPolicy artifactPolicy;
114     private ToscaPolicy artifact2Policy;
115
116     /**
117      * Set up.
118      */
119     @BeforeAll
120     public static void setUp() throws IOException {
121         LoggerUtils.setLevel(LoggerUtils.ROOT_LOGGER, "INFO");
122         LoggerUtils.setLevel("org.onap.policy.common.endpoints", "WARN");
123         LoggerUtils.setLevel("org.onap.policy.drools", "INFO");
124
125         SystemPersistenceConstants.getManager().setConfigurationDir("target/test-classes");
126
127         // @formatter:off
128         ControllerSupport.installArtifact(
129                 Paths.get(ControllerSupport.JUNIT_KMODULE_PATH).toFile(),
130                 Paths.get(ControllerSupport.JUNIT_KMODULE_POM_PATH).toFile(),
131                 ControllerSupport.JUNIT_KJAR_DRL_PATH,
132                 List.of(Paths.get(ControllerSupport.JUNIT_KMODULE_DRL_PATH).toFile()));
133
134         ControllerSupport.installArtifact(
135                 Paths.get("src/test/resources/echo.kmodule").toFile(),
136                 Paths.get("src/test/resources/echo.pom").toFile(),
137                 "src/main/resources/kbecho/org/onap/policy/drools/test/",
138                 List.of(Paths.get("src/test/resources/echo.drl").toFile()));
139         // @formatter:on
140
141         Properties noopTopicProperties = new Properties();
142         noopTopicProperties.put(PolicyEndPointProperties.PROPERTY_NOOP_SOURCE_TOPICS, TestConstants.DCAE_TOPIC);
143         noopTopicProperties.put(PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS, TestConstants.APPC_CL_TOPIC);
144         TopicEndpointManager.getManager().addTopics(noopTopicProperties);
145
146         savedFsm = LifecycleFeature.fsm;
147     }
148
149     /**
150      * Tear Down.
151      */
152     @AfterAll
153     public static void tearDown() throws NoSuchFieldException, IllegalAccessException {
154         PolicyControllerConstants.getFactory().destroy();
155
156         NoopTopicFactories.getSourceFactory().destroy();
157         NoopTopicFactories.getSinkFactory().destroy();
158         try {
159             Files.deleteIfExists(Paths.get(SystemPersistenceConstants.getManager().getConfigurationPath().toString(),
160                 "lifecycle-controller.properties.bak"));
161             Files.deleteIfExists(Paths.get(SystemPersistenceConstants.getManager().getConfigurationPath().toString(),
162                 "foo-controller.properties.bak"));
163         } catch (IOException ignored) { // NOSONAR
164             // checkstyle
165         }
166
167         ControllerSupport.setStaticField(LifecycleFeature.class, "fsm", savedFsm);
168     }
169
170     /**
171      * Test initialization.
172      */
173     @BeforeEach
174     public void init() throws CoderException, IOException, NoSuchFieldException, IllegalAccessException {
175         fsm = new LifecycleFsm() {
176             @Override
177             protected ScheduledExecutorService makeExecutor() { // NOSONAR
178                 return new PseudoScheduledExecutorService(new TestTimeMulti());
179             }
180         };
181         ControllerSupport.setStaticField(LifecycleFeature.class, "fsm", fsm);
182
183         fsm.setStatusTimerSeconds(15);
184         assertTrue(fsm.start());
185
186         PdpStateChange change = new PdpStateChange();
187         change.setPdpGroup("A");
188         change.setPdpSubgroup("a");
189         change.setState(PdpState.ACTIVE);
190         change.setName(fsm.getPdpName());
191
192         fsm.setSubGroup("a");
193         fsm.source.offer(new StandardCoder().encode(change));
194
195         assertEquals(0, fsm.getPoliciesMap().size());
196         assertEquals("ACTIVE", fsm.state().toString());
197         assertEquals(2, fsm.getPolicyTypesMap().size());
198
199         opPolicy = getExamplesPolicy(VFW_OPERATIONAL_DROOLS_POLICY_JSON, VFW_OP_POLICY_NAME);
200         op2Policy = getExamplesPolicy(VCPE_OPERATIONAL_DROOLS_POLICY_JSON, VCPE_OP_POLICY_NAME);
201         controllerPolicy =
202             getPolicyFromFile(EXAMPLE_NATIVE_CONTROLLER_POLICY_JSON, EXAMPLE_NATIVE_CONTROLLER_POLICY_NAME);
203         controller2Policy = getPolicyFromFile(FOO_NATIVE_CONTROLLER_POLICY_JSON, FOO_NATIVE_CONTROLLER_POLICY_NAME);
204         artifactPolicy = getPolicyFromFile(EXAMPLE_NATIVE_ARTIFACT_POLICY_JSON, EXAMPLE_NATIVE_ARTIFACT_POLICY_NAME);
205         artifact2Policy = getExamplesPolicy(FOO_NATIVE_ARTIFACT_POLICY_JSON, FOO_NATIVE_ARTIFACT_POLICY_NAME);
206         valPolicy = getPolicyFromFile(EXAMPLE_OTHER_VAL_POLICY_JSON, EXAMPLE_OTHER_VAL_POLICY_NAME);
207         unvalPolicy = getPolicyFromFile(EXAMPLE_OTHER_UNVAL_POLICY_JSON, EXAMPLE_OTHER_UNVAL_POLICY_NAME);
208     }
209
210     @Test
211     void testUpdate() throws CoderException {
212         verifyInitState();
213
214         // native controller policy - deploy
215         // Delta: +controllerPolicy
216         deltaUpdate(List.of(controllerPolicy), List.of(), List.of(controllerPolicy));
217
218         // no policies - undeploy
219         // Delta: -controllerPolicy
220         deltaUpdate(List.of(), List.of(controllerPolicy), List.of());
221
222         // native controller + artifact policy (out of order) - deploy
223         // Delta: +artifactPolicy, +controllerPolicy
224         deltaUpdate(List.of(artifactPolicy, controllerPolicy), List.of(),
225             List.of(artifactPolicy, controllerPolicy));
226
227         // attempt to deploy opPolicy but invalid controller
228         // Delta: +opPolicy
229         assertFalse(fsm.update(getPdpUpdate(List.of(opPolicy), List.of())));
230         assertEquals(1, PolicyControllerConstants.getFactory().inventory().size());
231         assertFalse(fsm.getActivePolicies().contains(opPolicy));
232         verifyExists(false, "lifecycle", List.of(opPolicy));
233         verifyDeploy(List.of(artifactPolicy, controllerPolicy));
234
235         // Delta: +opPolicy
236         opPolicy.getProperties().remove("controllerName");
237         deltaUpdate(List.of(opPolicy), List.of(), List.of(opPolicy, artifactPolicy, controllerPolicy));
238         verifyExists(true, "lifecycle", List.of(opPolicy));
239
240         // Delta: -opPolicy
241         deltaUpdate(List.of(), List.of(opPolicy), List.of(controllerPolicy, artifactPolicy));
242         assertFalse(PolicyControllerConstants.getFactory().get("lifecycle").getDrools().exists(opPolicy));
243
244         // Delta: -artifactPolicy
245         deltaUpdate(List.of(), List.of(artifactPolicy), List.of(controllerPolicy));
246         assertFalse(PolicyControllerConstants.getFactory().get("lifecycle").getDrools().isBrained());
247
248         // Delta: -controllerPolicy
249         deltaUpdate(List.of(), List.of(controllerPolicy), List.of());
250         assertThatIllegalArgumentException().isThrownBy(() -> PolicyControllerConstants.getFactory().get("lifecycle"));
251
252         // Delta: +controllerPolicy, +artifactPolicy, and +opPolicy
253         deltaUpdate(List.of(opPolicy, artifactPolicy, controllerPolicy), List.of(),
254             List.of(opPolicy, artifactPolicy, controllerPolicy));
255         verifyExists(true, "lifecycle", List.of(opPolicy));
256
257         // Delta: -artifactPolicy
258         assertTrue(fsm.update(getPdpUpdate(List.of(), List.of(artifactPolicy))));
259         assertEquals(1, PolicyControllerConstants.getFactory().inventory().size());
260         assertFalse(PolicyControllerConstants.getFactory().get("lifecycle").getDrools().isBrained());
261
262         // Delta: +artifactPolicy
263         // from deltas, all delta updates should be successfully applied
264         deltaUpdate(List.of(artifactPolicy), List.of(), List.of(opPolicy, artifactPolicy, controllerPolicy));
265         verifyExists(true, "lifecycle", List.of(opPolicy));
266
267         // Delta: -controllerPolicy
268         // from deltas, all delta updates should be successfully applied
269         assertTrue(fsm.update(getPdpUpdate(List.of(), List.of(controllerPolicy))));
270         assertEquals(0, PolicyControllerConstants.getFactory().inventory().size());
271
272         // Delta: +controllerPolicy
273         // from deltas, all delta updates should be successfully applied
274         deltaUpdate(List.of(controllerPolicy), List.of(), List.of(opPolicy, artifactPolicy, controllerPolicy));
275         verifyExists(true, "lifecycle", List.of(opPolicy));
276
277         // Delta: +op2Policy, +controller2Policy
278         // from deltas, all delta updates should be successfully applied
279         op2Policy.getProperties().put("controllerName", "lifecycle");
280         deltaUpdate(List.of(op2Policy, controller2Policy), List.of(),
281             List.of(opPolicy, artifactPolicy, controllerPolicy, op2Policy, controller2Policy));
282         verifyExists(true, "lifecycle", List.of(opPolicy, op2Policy));
283         assertFalse(PolicyControllerConstants.getFactory().get("foo").getDrools().isBrained());
284
285         // same operation with duplicates - idempotent operation
286         deltaUpdate(List.of(op2Policy, controller2Policy, opPolicy), List.of(valPolicy, unvalPolicy),
287             List.of(opPolicy, artifactPolicy, controllerPolicy, op2Policy, controller2Policy));
288         verifyExists(true, "lifecycle", List.of(opPolicy, op2Policy));
289         assertFalse(PolicyControllerConstants.getFactory().get("foo").getDrools().isBrained());
290
291         // Delta: +artifact2policy, +valPolicy, +unvalPolicy
292         // from deltas, all delta updates should be successfully applied
293         deltaUpdate(List.of(valPolicy, unvalPolicy, artifact2Policy), List.of(), List.of(opPolicy, artifactPolicy,
294             controllerPolicy, op2Policy, controller2Policy, valPolicy, unvalPolicy, artifact2Policy));
295         verifyExists(true, "lifecycle", List.of(opPolicy, op2Policy, valPolicy, unvalPolicy));
296         verifyExists(true, "foo", List.of(valPolicy, unvalPolicy));
297         verifyExists(false, "foo", List.of(opPolicy, op2Policy));
298
299         // Delta: -artifact2Policy, -unvalPolicy
300         // from deltas, all delta updates should be successfully applied, and unvalPolicy disabled
301         deltaUpdate(List.of(), List.of(artifact2Policy, unvalPolicy),
302             List.of(opPolicy, artifactPolicy, controllerPolicy, op2Policy, controller2Policy, valPolicy));
303         verifyExists(true, "lifecycle", List.of(opPolicy, op2Policy, valPolicy));
304         verifyExists(false, "lifecycle", List.of(unvalPolicy));
305         assertFalse(PolicyControllerConstants.getFactory().get("foo").getDrools().isBrained());
306
307         // Delta: +artifact2Policy
308         // from deltas, all delta updates should be successfully applied, opPolicy, op2Policy and unvalPolicy
309         // should be re-applied.
310         assertTrue(fsm.update(getPdpUpdate(List.of(artifact2Policy), List.of())));
311         deltaUpdate(List.of(artifact2Policy), List.of(), List.of(opPolicy, artifactPolicy, controllerPolicy, op2Policy,
312             controller2Policy, valPolicy, artifact2Policy));
313         verifyExists(true, "lifecycle", List.of(opPolicy, op2Policy, valPolicy));
314         verifyExists(false, "lifecycle", List.of(unvalPolicy));
315         verifyExists(true, "foo", List.of(valPolicy));
316         verifyExists(false, "foo", List.of(opPolicy, op2Policy, unvalPolicy));
317
318         // Delta: -controllerPolicy, -artifactPolicy, +unvalPolicy
319         // from deltas, all delta updates should be successful
320         assertTrue(fsm.update(getPdpUpdate(List.of(unvalPolicy), List.of(controllerPolicy, artifactPolicy))));
321         assertThatIllegalArgumentException().isThrownBy(() -> PolicyControllerConstants.getFactory().get("lifecycle"));
322         verifyExists(true, "foo", List.of(valPolicy, unvalPolicy));
323         verifyExists(false, "foo", List.of(opPolicy, op2Policy));
324         // since -controllerPolicy delta => the existing artifact2Policy, opPolicy, op2Policy become disabled as no
325         // policy type is readily available to host them until there is a host.
326         verifyActivePoliciesWithDisables(
327             List.of(opPolicy, op2Policy, controller2Policy, valPolicy, artifact2Policy, unvalPolicy),
328             List.of(opPolicy.getIdentifier(), op2Policy.getIdentifier()));
329
330         // Delta: -opPolicy, -op2Policy, -controller2Policy, -valPolicy, -artifact2Policy, -unvalPolicy
331         // from deltas, -opPolicy and -op2Policy undeploys will fail since there is no controller with that
332         // policy type supported
333         assertFalse(fsm.update(getPdpUpdate(List.of(),
334             List.of(opPolicy, op2Policy, controller2Policy, valPolicy, artifact2Policy, unvalPolicy))));
335         assertThatIllegalArgumentException().isThrownBy(() -> PolicyControllerConstants.getFactory().get("lifecycle"));
336         assertThatIllegalArgumentException().isThrownBy(() -> PolicyControllerConstants.getFactory().get("foo"));
337         assertEquals(0, PolicyControllerConstants.getFactory().inventory().size());
338         verifyDeploy(List.of());
339
340         fsm.shutdown();
341     }
342
343     private void verifyInitState() {
344         assertEquals(0, fsm.getPoliciesMap().size());
345         assertEquals("ACTIVE", fsm.state().toString());
346         assertEquals(0, PolicyControllerConstants.getFactory().inventory().size());
347     }
348
349     protected PdpUpdate getPdpUpdate(List<ToscaPolicy> policiesToDeploy, List<ToscaPolicy> policiesToUndeploy) {
350         PdpUpdate update = new PdpUpdate();
351         update.setName(PolicyEngineConstants.getManager().getPdpName());
352         update.setPdpGroup("A");
353         update.setPdpSubgroup("a");
354         update.setPoliciesToBeDeployed(policiesToDeploy);
355         update.setPoliciesToBeUndeployed(fsm.getPolicyIds(policiesToUndeploy));
356         return update;
357     }
358
359     protected void deltaUpdate(List<ToscaPolicy> deploy, List<ToscaPolicy> undeploy, List<ToscaPolicy> active)
360         throws CoderException {
361         assertTrue(fsm.update(getPdpUpdate(deploy, undeploy)));
362         verifyDeploy(active);
363     }
364
365     private void verifyDeploy(List<ToscaPolicy> active) throws CoderException {
366         verifyActivePolicies(active);
367     }
368
369     protected void verifyExists(boolean exists, String controller, List<ToscaPolicy> policies) {
370         assertTrue(PolicyControllerConstants.getFactory().get(controller).getDrools().isBrained());
371         for (ToscaPolicy policy : policies) {
372             assertEquals(exists, PolicyControllerConstants.getFactory().get(controller).getDrools().exists(policy),
373                 "ID: " + controller + ":" + policy.getIdentifier());
374         }
375     }
376
377     protected void verifyActivePolicies(List<ToscaPolicy> testPolicies) throws CoderException {
378         verifyActivePoliciesWithDisables(testPolicies, Collections.emptyList());
379     }
380
381     protected void verifyActivePoliciesWithDisables(List<ToscaPolicy> testPolicies,
382                                                     List<ToscaConceptIdentifier> nativeDisables) throws CoderException {
383         // verify that each policy is tracked in the active lists
384
385         for (ToscaPolicy policy : testPolicies) {
386             assertTrue(fsm.getActivePolicies().contains(policy), policy.getIdentifier().toString());
387             if (!nativeDisables.contains(policy.getIdentifier())) {
388                 assertTrue(fsm.getPolicyTypesMap().containsKey(policy.getTypeIdentifier()),
389                     policy.getIdentifier().toString());
390             }
391         }
392         assertEquals(testPolicies.size(), fsm.getActivePolicies().size());
393
394         Map<String, List<ToscaPolicy>> testPoliciesMap = fsm.groupPoliciesByPolicyType(testPolicies);
395         Map<String, List<ToscaPolicy>> activePolicyMap = fsm.groupPoliciesByPolicyType(fsm.getActivePolicies());
396         assertEquals(new HashSet<>(activePolicyMap.keySet()), new HashSet<>(testPoliciesMap.keySet()));
397         for (String key : fsm.groupPoliciesByPolicyType(fsm.getActivePolicies()).keySet()) {
398             assertEquals(new HashSet<>(activePolicyMap.get(key)), new HashSet<>(testPoliciesMap.get(key)));
399         }
400
401         // verify that a controller exists for each controller policy
402         assertEquals(fsm.getNativeControllerPolicies(testPoliciesMap).size(),
403             PolicyControllerConstants.getFactory().inventory().size());
404
405         // verify that a brained controller with same application coordinates exist for
406         // each native artifact policy
407
408         verifyNativeArtifactPolicies(fsm.getNativeArtifactPolicies(testPoliciesMap));
409
410         // verify non-native policies are attached to the right set of brained controllers
411
412         for (ToscaPolicy policy : fsm.getNonNativePolicies(testPoliciesMap)) {
413             verifyNonNativePolicy(policy, nativeDisables);
414         }
415     }
416
417     protected void verifyNativeArtifactPolicies(List<ToscaPolicy> policies) throws CoderException {
418         // check that a brained controller exists for each native artifact policy
419         for (ToscaPolicy policy : policies) {
420             NativeArtifactPolicy artifactPolicy = fsm.getDomainMaker().convertTo(policy, NativeArtifactPolicy.class);
421             String controllerName = artifactPolicy.getProperties().getController().getName();
422             assertTrue(PolicyControllerConstants.getFactory().get(controllerName).getDrools().isBrained());
423             assertEquals(artifactPolicy.getProperties().getRulesArtifact().getGroupId(),
424                 PolicyControllerConstants.getFactory().get(controllerName).getDrools().getGroupId());
425             assertEquals(artifactPolicy.getProperties().getRulesArtifact().getArtifactId(),
426                 PolicyControllerConstants.getFactory().get(controllerName).getDrools().getArtifactId());
427             assertEquals(artifactPolicy.getProperties().getRulesArtifact().getVersion(),
428                 PolicyControllerConstants.getFactory().get(controllerName).getDrools().getVersion());
429         }
430     }
431
432     protected void verifyNonNativePolicy(ToscaPolicy testPolicy, List<ToscaConceptIdentifier> nativeDisables)
433         throws CoderException {
434         List<ToscaPolicy> nativeArtifactPolicies =
435             fsm.getNativeArtifactPolicies(fsm.groupPoliciesByPolicyType(fsm.getActivePolicies()));
436
437         List<ToscaPolicy> nativeControllerPolicies =
438             fsm.getNativeControllerPolicies(fsm.groupPoliciesByPolicyType(fsm.getActivePolicies()));
439
440         String controllerName = (String) testPolicy.getProperties().get("controllerName");
441
442         if (Strings.isNullOrEmpty(controllerName)) {
443             // this non-native policy applies to all controllers that are brained
444
445             // verify the policy is present as a fact in all brained controllers
446             // and there is a controller policy for each controllerName
447
448             for (ToscaPolicy nativePolicy : nativeArtifactPolicies) {
449                 NativeArtifactPolicy artifactPolicy =
450                     fsm.getDomainMaker().convertTo(nativePolicy, NativeArtifactPolicy.class);
451                 String artifactControllerName = artifactPolicy.getProperties().getController().getName();
452
453                 // brained controller check
454                 assertTrue(PolicyControllerConstants.getFactory().get(artifactControllerName).getDrools().isBrained(),
455                     artifactControllerName + ":" + testPolicy.getIdentifier());
456
457                 // non-native tosca policy as a fact in drools
458                 if (PolicyControllerConstants.getFactory().get(artifactControllerName).getPolicyTypes()
459                     .contains(testPolicy.getTypeIdentifier())) {
460                     assertTrue(PolicyControllerConstants.getFactory()
461                         .get(artifactControllerName).getDrools().exists(testPolicy),
462                         artifactControllerName + ":" + testPolicy.getIdentifier());
463                 } else {
464                     assertFalse(PolicyControllerConstants.getFactory()
465                         .get(artifactControllerName).getDrools().exists(testPolicy),
466                         artifactControllerName + ":" + testPolicy.getIdentifier());
467                 }
468
469                 // there should always be a controller policy for each artifact policy
470                 assertEquals(1, getNativeControllerPolicies(nativeControllerPolicies, artifactControllerName).size());
471             }
472
473             return;
474         }
475
476         // this non-native policy applies only to the specified native controller
477         // which could be brained or brainless
478
479         // there should always be a controller policy
480
481         if (nativeDisables.contains(testPolicy.getIdentifier())) {
482             // skip evaluating next section
483             return;
484         }
485
486         assertEquals(1, getNativeControllerPolicies(nativeControllerPolicies, controllerName).size());
487
488         // verify the policy is present as a fact if there is matching artifact policy
489
490         List<NativeArtifactPolicy> candidateNativeArtifactPolicies =
491             getNativeArtifactPolicies(nativeArtifactPolicies, controllerName);
492
493         if (candidateNativeArtifactPolicies.size() == 1) {
494             assertTrue(PolicyControllerConstants.getFactory().get(controllerName).getDrools().isBrained(),
495                 controllerName + ":" + testPolicy.getIdentifier());
496             assertTrue(PolicyControllerConstants.getFactory().get(controllerName).getDrools().exists(testPolicy),
497                 controllerName + ":" + testPolicy.getIdentifier());
498
499             // verify that the other brained controllers don't have this non-native policy
500
501             // @formatter:off
502             for (NativeArtifactPolicy nativePolicy :
503                     getNativeArtifactPoliciesBut(nativeArtifactPolicies, controllerName)) {
504                 assertTrue(PolicyControllerConstants.getFactory()
505                                    .get(nativePolicy.getProperties().getController().getName())
506                                    .getDrools().isBrained());
507                 assertFalse(PolicyControllerConstants.getFactory()
508                     .get(nativePolicy.getProperties().getController().getName()).getDrools().exists(testPolicy),
509                     controllerName + ":" + testPolicy.getIdentifier());
510             }
511             // @formatter:on
512
513             return;
514         }
515
516         // at this point the only valid possibility is that there is no native artifact policies
517
518         assertTrue(candidateNativeArtifactPolicies.isEmpty(),
519             "There is more than 1 native artifact policy for " + controllerName);
520     }
521
522     protected List<NativeArtifactPolicy> getNativeArtifactPoliciesBut(List<ToscaPolicy> nativePolicies,
523                                                                       String controllerName) {
524         return nativePolicies.stream().map(nativePolicy -> {
525             try {
526                 return fsm.getDomainMaker().convertTo(nativePolicy, NativeArtifactPolicy.class);
527             } catch (CoderException ex) {
528                 throw new RuntimeException(nativePolicy.getIdentifier().toString(), ex);
529             }
530         }).filter(nativeArtifactPolicy -> !controllerName
531             .equals(nativeArtifactPolicy.getProperties().getController().getName())).collect(Collectors.toList());
532     }
533
534     protected List<NativeArtifactPolicy> getNativeArtifactPolicies(List<ToscaPolicy> nativePolicies,
535                                                                    String controllerName) {
536         return nativePolicies.stream().map(nativePolicy -> {
537             try {
538                 return fsm.getDomainMaker().convertTo(nativePolicy, NativeArtifactPolicy.class);
539             } catch (CoderException ex) {
540                 throw new RuntimeException(nativePolicy.getIdentifier().toString(), ex);
541             }
542         }).filter(nativeArtifactPolicy -> controllerName
543             .equals(nativeArtifactPolicy.getProperties().getController().getName())).collect(Collectors.toList());
544     }
545
546     protected List<ControllerPolicy> getNativeControllerPolicies(List<ToscaPolicy> nativePolicies,
547                                                                  String controllerName) {
548         return nativePolicies.stream().map(controllerPolicy -> {
549             try {
550                 return fsm.getDomainMaker().convertTo(controllerPolicy, ControllerPolicy.class);
551             } catch (CoderException ex) {
552                 throw new RuntimeException(controllerPolicy.getIdentifier().toString(), ex);
553             }
554         }).filter(controllerPolicy -> controllerName.equals(controllerPolicy.getProperties().getControllerName()))
555                 .collect(Collectors.toList());
556     }
557
558     protected ToscaPolicy getPolicyFromFile(String filePath, String policyName) throws CoderException, IOException {
559         String policyJson = Files.readString(Paths.get(filePath));
560         ToscaServiceTemplate serviceTemplate = coder.decode(policyJson, ToscaServiceTemplate.class);
561         return serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyName);
562     }
563
564     protected ToscaPolicy getExamplesPolicy(String resourcePath, String policyName) throws CoderException {
565         String policyJson = ResourceUtils.getResourceAsString(resourcePath);
566         ToscaServiceTemplate serviceTemplate = new StandardCoder().decode(policyJson, ToscaServiceTemplate.class);
567         return serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyName);
568     }
569
570 }