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
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.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;
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;
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;
67 * Lifecycle FSM Updates Test.
69 public class LifecycleFsmUpdateTest {
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";
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";
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";
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";
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";
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";
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";
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";
102 private static final StandardCoder coder = new StandardCoder();
104 protected static LifecycleFsm savedFsm;
105 protected LifecycleFsm fsm;
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;
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");
125 SystemPersistenceConstants.getManager().setConfigurationDir("target/test-classes");
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()));
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()));
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);
146 savedFsm = LifecycleFeature.fsm;
153 public static void tearDown() throws NoSuchFieldException, IllegalAccessException {
154 PolicyControllerConstants.getFactory().destroy();
156 NoopTopicFactories.getSourceFactory().destroy();
157 NoopTopicFactories.getSinkFactory().destroy();
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
167 ControllerSupport.setStaticField(LifecycleFeature.class, "fsm", savedFsm);
171 * Test initialization.
174 public void init() throws CoderException, IOException, NoSuchFieldException, IllegalAccessException {
175 fsm = new LifecycleFsm() {
177 protected ScheduledExecutorService makeExecutor() { // NOSONAR
178 return new PseudoScheduledExecutorService(new TestTimeMulti());
181 ControllerSupport.setStaticField(LifecycleFeature.class, "fsm", fsm);
183 fsm.setStatusTimerSeconds(15);
184 assertTrue(fsm.start());
186 PdpStateChange change = new PdpStateChange();
187 change.setPdpGroup("A");
188 change.setPdpSubgroup("a");
189 change.setState(PdpState.ACTIVE);
190 change.setName(fsm.getPdpName());
192 fsm.setSubGroup("a");
193 fsm.source.offer(new StandardCoder().encode(change));
195 assertEquals(0, fsm.getPoliciesMap().size());
196 assertEquals("ACTIVE", fsm.state().toString());
197 assertEquals(2, fsm.getPolicyTypesMap().size());
199 opPolicy = getExamplesPolicy(VFW_OPERATIONAL_DROOLS_POLICY_JSON, VFW_OP_POLICY_NAME);
200 op2Policy = getExamplesPolicy(VCPE_OPERATIONAL_DROOLS_POLICY_JSON, VCPE_OP_POLICY_NAME);
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);
211 void testUpdate() throws CoderException {
214 // native controller policy - deploy
215 // Delta: +controllerPolicy
216 deltaUpdate(List.of(controllerPolicy), List.of(), List.of(controllerPolicy));
218 // no policies - undeploy
219 // Delta: -controllerPolicy
220 deltaUpdate(List.of(), List.of(controllerPolicy), List.of());
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));
227 // attempt to deploy opPolicy but invalid controller
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));
236 opPolicy.getProperties().remove("controllerName");
237 deltaUpdate(List.of(opPolicy), List.of(), List.of(opPolicy, artifactPolicy, controllerPolicy));
238 verifyExists(true, "lifecycle", List.of(opPolicy));
241 deltaUpdate(List.of(), List.of(opPolicy), List.of(controllerPolicy, artifactPolicy));
242 assertFalse(PolicyControllerConstants.getFactory().get("lifecycle").getDrools().exists(opPolicy));
244 // Delta: -artifactPolicy
245 deltaUpdate(List.of(), List.of(artifactPolicy), List.of(controllerPolicy));
246 assertFalse(PolicyControllerConstants.getFactory().get("lifecycle").getDrools().isBrained());
248 // Delta: -controllerPolicy
249 deltaUpdate(List.of(), List.of(controllerPolicy), List.of());
250 assertThatIllegalArgumentException().isThrownBy(() -> PolicyControllerConstants.getFactory().get("lifecycle"));
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));
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());
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));
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());
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));
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());
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());
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));
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());
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));
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()));
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());
343 private void verifyInitState() {
344 assertEquals(0, fsm.getPoliciesMap().size());
345 assertEquals("ACTIVE", fsm.state().toString());
346 assertEquals(0, PolicyControllerConstants.getFactory().inventory().size());
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));
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);
365 private void verifyDeploy(List<ToscaPolicy> active) throws CoderException {
366 verifyActivePolicies(active);
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());
377 protected void verifyActivePolicies(List<ToscaPolicy> testPolicies) throws CoderException {
378 verifyActivePoliciesWithDisables(testPolicies, Collections.emptyList());
381 protected void verifyActivePoliciesWithDisables(List<ToscaPolicy> testPolicies,
382 List<ToscaConceptIdentifier> nativeDisables) throws CoderException {
383 // verify that each policy is tracked in the active lists
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());
392 assertEquals(testPolicies.size(), fsm.getActivePolicies().size());
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)));
401 // verify that a controller exists for each controller policy
402 assertEquals(fsm.getNativeControllerPolicies(testPoliciesMap).size(),
403 PolicyControllerConstants.getFactory().inventory().size());
405 // verify that a brained controller with same application coordinates exist for
406 // each native artifact policy
408 verifyNativeArtifactPolicies(fsm.getNativeArtifactPolicies(testPoliciesMap));
410 // verify non-native policies are attached to the right set of brained controllers
412 for (ToscaPolicy policy : fsm.getNonNativePolicies(testPoliciesMap)) {
413 verifyNonNativePolicy(policy, nativeDisables);
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());
432 protected void verifyNonNativePolicy(ToscaPolicy testPolicy, List<ToscaConceptIdentifier> nativeDisables)
433 throws CoderException {
434 List<ToscaPolicy> nativeArtifactPolicies =
435 fsm.getNativeArtifactPolicies(fsm.groupPoliciesByPolicyType(fsm.getActivePolicies()));
437 List<ToscaPolicy> nativeControllerPolicies =
438 fsm.getNativeControllerPolicies(fsm.groupPoliciesByPolicyType(fsm.getActivePolicies()));
440 String controllerName = (String) testPolicy.getProperties().get("controllerName");
442 if (Strings.isNullOrEmpty(controllerName)) {
443 // this non-native policy applies to all controllers that are brained
445 // verify the policy is present as a fact in all brained controllers
446 // and there is a controller policy for each controllerName
448 for (ToscaPolicy nativePolicy : nativeArtifactPolicies) {
449 NativeArtifactPolicy artifactPolicy =
450 fsm.getDomainMaker().convertTo(nativePolicy, NativeArtifactPolicy.class);
451 String artifactControllerName = artifactPolicy.getProperties().getController().getName();
453 // brained controller check
454 assertTrue(PolicyControllerConstants.getFactory().get(artifactControllerName).getDrools().isBrained(),
455 artifactControllerName + ":" + testPolicy.getIdentifier());
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());
464 assertFalse(PolicyControllerConstants.getFactory()
465 .get(artifactControllerName).getDrools().exists(testPolicy),
466 artifactControllerName + ":" + testPolicy.getIdentifier());
469 // there should always be a controller policy for each artifact policy
470 assertEquals(1, getNativeControllerPolicies(nativeControllerPolicies, artifactControllerName).size());
476 // this non-native policy applies only to the specified native controller
477 // which could be brained or brainless
479 // there should always be a controller policy
481 if (nativeDisables.contains(testPolicy.getIdentifier())) {
482 // skip evaluating next section
486 assertEquals(1, getNativeControllerPolicies(nativeControllerPolicies, controllerName).size());
488 // verify the policy is present as a fact if there is matching artifact policy
490 List<NativeArtifactPolicy> candidateNativeArtifactPolicies =
491 getNativeArtifactPolicies(nativeArtifactPolicies, controllerName);
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());
499 // verify that the other brained controllers don't have this non-native policy
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());
516 // at this point the only valid possibility is that there is no native artifact policies
518 assertTrue(candidateNativeArtifactPolicies.isEmpty(),
519 "There is more than 1 native artifact policy for " + controllerName);
522 protected List<NativeArtifactPolicy> getNativeArtifactPoliciesBut(List<ToscaPolicy> nativePolicies,
523 String controllerName) {
524 return nativePolicies.stream().map(nativePolicy -> {
526 return fsm.getDomainMaker().convertTo(nativePolicy, NativeArtifactPolicy.class);
527 } catch (CoderException ex) {
528 throw new RuntimeException(nativePolicy.getIdentifier().toString(), ex);
530 }).filter(nativeArtifactPolicy -> !controllerName
531 .equals(nativeArtifactPolicy.getProperties().getController().getName())).collect(Collectors.toList());
534 protected List<NativeArtifactPolicy> getNativeArtifactPolicies(List<ToscaPolicy> nativePolicies,
535 String controllerName) {
536 return nativePolicies.stream().map(nativePolicy -> {
538 return fsm.getDomainMaker().convertTo(nativePolicy, NativeArtifactPolicy.class);
539 } catch (CoderException ex) {
540 throw new RuntimeException(nativePolicy.getIdentifier().toString(), ex);
542 }).filter(nativeArtifactPolicy -> controllerName
543 .equals(nativeArtifactPolicy.getProperties().getController().getName())).collect(Collectors.toList());
546 protected List<ControllerPolicy> getNativeControllerPolicies(List<ToscaPolicy> nativePolicies,
547 String controllerName) {
548 return nativePolicies.stream().map(controllerPolicy -> {
550 return fsm.getDomainMaker().convertTo(controllerPolicy, ControllerPolicy.class);
551 } catch (CoderException ex) {
552 throw new RuntimeException(controllerPolicy.getIdentifier().toString(), ex);
554 }).filter(controllerPolicy -> controllerName.equals(controllerPolicy.getProperties().getControllerName()))
555 .collect(Collectors.toList());
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);
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);