Sync Integ to Master
[sdc.git] / catalog-model / src / test / java / org / openecomp / sdc / be / model / jsontitan / operations / ToscaOperationFacadePoliciesTest.java
1 package org.openecomp.sdc.be.model.jsontitan.operations;
2
3 import fj.data.Either;
4 import org.junit.After;
5 import org.junit.Before;
6 import org.junit.BeforeClass;
7 import org.junit.Test;
8 import org.junit.runner.RunWith;
9 import org.openecomp.sdc.be.dao.config.TitanSpringConfig;
10 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
11 import org.openecomp.sdc.be.dao.jsongraph.TitanDao;
12 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
13 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
14 import org.openecomp.sdc.be.datatypes.elements.PolicyTargetType;
15 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
16 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
17 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
18 import org.openecomp.sdc.be.model.Component;
19 import org.openecomp.sdc.be.model.ComponentParametersView;
20 import org.openecomp.sdc.be.model.ModelTestBase;
21 import org.openecomp.sdc.be.model.PolicyDefinition;
22 import org.openecomp.sdc.be.model.config.ModelOperationsSpringConfig;
23 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
24 import org.springframework.beans.factory.annotation.Autowired;
25 import org.springframework.test.context.ContextConfiguration;
26 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
27
28 import java.util.ArrayList;
29 import java.util.HashMap;
30 import java.util.List;
31 import java.util.Map;
32 import java.util.stream.Collectors;
33
34 import static java.util.Arrays.asList;
35 import static java.util.Collections.singletonList;
36 import static org.assertj.core.api.Assertions.assertThat;
37 import static org.junit.Assert.assertTrue;
38
39 @RunWith(SpringJUnit4ClassRunner.class)
40 @ContextConfiguration(classes = {TitanSpringConfig.class, ModelOperationsSpringConfig.class})
41 public class ToscaOperationFacadePoliciesTest extends ModelTestBase {
42
43     private static final String CONTAINER_ID = "containerId";
44     private static final String CONTAINER_NAME = "containerName";
45     @Autowired
46     private ToscaOperationFacade toscaOperationFacade;
47     @Autowired
48     private TitanDao titanDao;
49
50     private PolicyDefinition policy1, policy2;
51
52     @BeforeClass
53     public static void setupBeforeClass() {
54         ModelTestBase.init();
55     }
56
57     @Before
58     public void setUp() throws Exception {
59         policy1 = createPolicyDefinition("type1");
60         policy2 = createPolicyDefinition("type2");
61         createContainerVertexInDB();
62         createPoliciesOnGraph(policy1, policy2);
63     }
64
65     private void createPoliciesOnGraph(PolicyDefinition ... policies) {
66         for (int i = 0; i < policies.length; i++) {
67             PolicyDefinition policy = policies[i];
68             Either<PolicyDefinition, StorageOperationStatus> createdPolicy = toscaOperationFacade.associatePolicyToComponent(CONTAINER_ID, policy, i);
69             assertTrue(createdPolicy.isLeft());
70         }
71     }
72
73     @After
74     public void tearDown() {
75         titanDao.rollback();
76     }
77
78     @Test
79     public void updatePoliciesTargetsOfComponent_updateSinglePolicy() {
80         List<String> updatedTargetIds = asList("instance1new", "instance2");
81         PolicyDefinition originalPolicy2 = clonePolicyWithTargets(policy2);
82         updatePolicyTypeTargetsIds(policy1, PolicyTargetType.COMPONENT_INSTANCES, updatedTargetIds);
83         updatePolicyTypeTargetsIds(policy2, PolicyTargetType.COMPONENT_INSTANCES, updatedTargetIds);
84
85         StorageOperationStatus storageOperationStatus = toscaOperationFacade.updatePoliciesOfComponent(CONTAINER_ID, singletonList(policy1));
86         assertThat(storageOperationStatus).isEqualTo(StorageOperationStatus.OK);
87         Component updatedComponent = fetchComponentFromDB();
88         verifyPolicyTargets(updatedComponent.getPolicyById(policy1.getUniqueId()), policy1);
89         verifyPolicyTargets(updatedComponent.getPolicyById(policy2.getUniqueId()), originalPolicy2);
90     }
91
92     @Test
93     public void updatePoliciesTargetsOfComponent_updateMultiplePolicies() {
94         List<String> updatedTargetIds = asList("instance1new", "instance2");
95         updatePolicyTypeTargetsIds(policy1, PolicyTargetType.COMPONENT_INSTANCES, updatedTargetIds);
96         updatePolicyTypeTargetsIds(policy2, PolicyTargetType.COMPONENT_INSTANCES, updatedTargetIds);
97         StorageOperationStatus storageOperationStatus = toscaOperationFacade.updatePoliciesOfComponent(CONTAINER_ID, asList(policy1, policy2));
98         assertThat(storageOperationStatus).isEqualTo(StorageOperationStatus.OK);
99         Component updatedComponent = fetchComponentFromDB();
100         verifyPolicyTargets(updatedComponent.getPolicyById(policy1.getUniqueId()), policy1);
101         verifyPolicyTargets(updatedComponent.getPolicyById(policy2.getUniqueId()), policy2);
102     }
103
104     private PolicyDefinition clonePolicyWithTargets(PolicyDefinition policy) {
105         PolicyDefinition originalPolicy = new PolicyDefinition(policy);
106         Map<PolicyTargetType, List<String>> clonedTargetMap = policy.getTargets().entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> new ArrayList<>(entry.getValue())));
107         originalPolicy.setTargets(clonedTargetMap);
108         return originalPolicy;
109     }
110
111     private void verifyPolicyTargets(PolicyDefinition updatedPolicy, PolicyDefinition expectedPolicy) {
112         assertThat(updatedPolicy.getTargets())
113                 .isEqualTo(expectedPolicy.getTargets());
114     }
115
116     private void updatePolicyTypeTargetsIds(PolicyDefinition policy, PolicyTargetType targetType, List<String> updatedTargetIds) {
117         policy.getTargets().put(targetType, updatedTargetIds);
118     }
119
120     private Component fetchComponentFromDB() {
121         ComponentParametersView componentParametersView = new ComponentParametersView();
122         componentParametersView.disableAll();
123         componentParametersView.setIgnorePolicies(false);
124         return toscaOperationFacade.getToscaElement(CONTAINER_ID, componentParametersView).left().value();
125     }
126
127     private void createContainerVertexInDB() {
128         GraphVertex resource = new GraphVertex(VertexTypeEnum.TOPOLOGY_TEMPLATE);
129         resource.addMetadataProperty(GraphPropertyEnum.UNIQUE_ID, CONTAINER_ID);
130         resource.addMetadataProperty(GraphPropertyEnum.NAME, CONTAINER_NAME);
131         resource.setJsonMetadataField(JsonPresentationFields.NAME, CONTAINER_NAME);
132         resource.setJsonMetadataField(JsonPresentationFields.COMPONENT_TYPE, ComponentTypeEnum.RESOURCE.name());
133         Either<GraphVertex, TitanOperationStatus> container = titanDao.createVertex(resource);
134         assertTrue(container.isLeft());
135     }
136
137     private PolicyDefinition createPolicyDefinition(String type) {
138         PolicyDefinition policy = new PolicyDefinition();
139         policy.setPolicyTypeName(type);
140         policy.setTargets(new HashMap<>());
141         policy.getTargets().put(PolicyTargetType.COMPONENT_INSTANCES, asList("instance1", "instance2"));
142         return policy;
143     }
144 }