re base code
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / be / components / impl / instance / PolicyTargetsUpdateOperationTest.java
1 package org.openecomp.sdc.be.components.impl.instance;
2
3 import org.junit.Before;
4 import org.junit.Test;
5 import org.junit.runner.RunWith;
6 import org.mockito.ArgumentCaptor;
7 import org.mockito.Captor;
8 import org.mockito.Mock;
9 import org.mockito.junit.MockitoJUnitRunner;
10 import org.openecomp.sdc.be.components.impl.policy.PolicyTargetsUpdateHandler;
11 import org.openecomp.sdc.be.components.impl.policy.PolicyTargetsUpdater;
12 import org.openecomp.sdc.be.components.utils.ComponentInstanceBuilder;
13 import org.openecomp.sdc.be.components.utils.PolicyDefinitionBuilder;
14 import org.openecomp.sdc.be.components.utils.ResourceBuilder;
15 import org.openecomp.sdc.be.dao.api.ActionStatus;
16 import org.openecomp.sdc.be.model.Component;
17 import org.openecomp.sdc.be.model.ComponentInstance;
18 import org.openecomp.sdc.be.model.PolicyDefinition;
19 import org.openecomp.sdc.be.model.Resource;
20 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
21 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
22
23 import java.util.List;
24 import java.util.stream.Stream;
25
26 import static org.assertj.core.api.Assertions.assertThat;
27 import static org.mockito.ArgumentMatchers.anyList;
28 import static org.mockito.ArgumentMatchers.eq;
29 import static org.mockito.Mockito.verifyZeroInteractions;
30 import static org.mockito.Mockito.when;
31 import static org.openecomp.sdc.be.components.impl.utils.TestGenerationUtils.getComponentsUtils;
32
33 @RunWith(MockitoJUnitRunner.class)
34 public class PolicyTargetsUpdateOperationTest {
35
36     private static final String CONTAINER_ID = "containerId";
37
38     private PolicyTargetsUpdateOperation policyTargetsUpdateOperation;
39     @Mock
40     private ToscaOperationFacade toscaOperationFacade;
41
42     @Captor
43     private ArgumentCaptor<List<PolicyDefinition>> updatedPoliciesCaptor;
44     private PolicyDefinition policyWithInstanceTarget1, policyWithInstanceTarget2, policyWithInstanceTarget3;
45     private Resource container;
46
47     @Before
48     public void setUp() throws Exception {
49         policyWithInstanceTarget1 = createPolicyWithCmptInstAsTargets("policy1", "inst1", "inst2");
50         policyWithInstanceTarget2 = createPolicyWithCmptInstAsTargets("policy2", "inst1", "inst2", "inst3");
51         policyWithInstanceTarget3 = createPolicyWithCmptInstAsTargets("policy3", "inst1", "inst3");
52         container = new ResourceBuilder()
53                 .addPolicy(policyWithInstanceTarget1)
54                 .addPolicy(policyWithInstanceTarget2)
55                 .addPolicy(policyWithInstanceTarget3)
56                 .setUniqueId(CONTAINER_ID)
57                 .build();
58         PolicyTargetsUpdateHandler policyTargetsUpdateHandler = new PolicyTargetsUpdateHandler(toscaOperationFacade, getComponentsUtils(), new PolicyTargetsUpdater());
59         policyTargetsUpdateOperation = new PolicyTargetsUpdateOperation(policyTargetsUpdateHandler);
60     }
61
62     @Test
63     public void onChangeVersion_whenNoPolicies_returnActionOk() {
64         Component container = new Resource();
65         ComponentInstance prevVersion = new ComponentInstanceBuilder().setId("prevVersion").build();
66         ComponentInstance newVersion = new ComponentInstanceBuilder().setId("newVersion").build();
67         ActionStatus operationStatus = policyTargetsUpdateOperation.onChangeVersion(container, prevVersion, newVersion);
68         assertThat(operationStatus).isEqualTo(ActionStatus.OK);
69         verifyZeroInteractions(toscaOperationFacade);
70     }
71
72     @Test
73     public void onChangeVersion_whenNoCmptInstancePolicies_returnOk() {
74         PolicyDefinition policy = PolicyDefinitionBuilder.create().addGroupTarget("someGroup").build();
75         Component container = new ResourceBuilder().addPolicy(policy).build();
76         ComponentInstance prevVersion = new ComponentInstanceBuilder().setId("prevVersion").build();
77         ComponentInstance newVersion = new ComponentInstanceBuilder().setId("newVersion").build();
78         ActionStatus operationStatus = policyTargetsUpdateOperation.onChangeVersion(container, prevVersion, newVersion);
79         assertThat(operationStatus).isEqualTo(ActionStatus.OK);
80         verifyZeroInteractions(toscaOperationFacade);
81     }
82
83     @Test
84     public void onChangeVersion_whenNoPoliciesWithPrevInstanceAsTarget_returnActionOk() {
85         ComponentInstance prevVersion = new ComponentInstanceBuilder().setId("prevVersion").build();
86         ComponentInstance newVersion = new ComponentInstanceBuilder().setId("newVersion").build();
87         ActionStatus operationStatus = policyTargetsUpdateOperation.onChangeVersion(container, prevVersion, newVersion);
88         assertThat(operationStatus).isEqualTo(ActionStatus.OK);
89         verifyZeroInteractions(toscaOperationFacade);
90     }
91
92     @Test
93     public void onChangeVersion_replacePrevCmptInstanceIdWithNewInstanceIdAndUpdatePolicies() {
94         ComponentInstance prevVersion = new ComponentInstanceBuilder().setId("inst2").build();
95         ComponentInstance newVersion = new ComponentInstanceBuilder().setId("inst2New").build();
96         when(toscaOperationFacade.updatePoliciesOfComponent(eq(CONTAINER_ID), updatedPoliciesCaptor.capture())).thenReturn(StorageOperationStatus.OK);
97         ActionStatus updatePoliciesRes = policyTargetsUpdateOperation.onChangeVersion(container, prevVersion, newVersion);
98         assertThat(updatePoliciesRes).isEqualTo(ActionStatus.OK);
99         List<PolicyDefinition> updatedPolicies = updatedPoliciesCaptor.getValue();
100         verifyUpdatedPolicies(updatedPolicies, policyWithInstanceTarget1, policyWithInstanceTarget2);//policy3 does not have "inst2" as target, no update needed
101         verifyUpdatedPolicyTargets(policyWithInstanceTarget1, "inst1", "inst2New");
102         verifyUpdatedPolicyTargets(policyWithInstanceTarget2, "inst1", "inst2New", "inst3");
103     }
104
105     @Test
106     public void onChangeVersion_whenUpdateOfPoliciesFails_propagateTheFailure() {
107         ComponentInstance prevVersion = new ComponentInstanceBuilder().setId("inst2").build();
108         ComponentInstance newVersion = new ComponentInstanceBuilder().setId("inst2New").build();
109         when(toscaOperationFacade.updatePoliciesOfComponent(eq(CONTAINER_ID), anyList())).thenReturn(StorageOperationStatus.GENERAL_ERROR);
110         ActionStatus updatePoliciesRes = policyTargetsUpdateOperation.onChangeVersion(container, prevVersion, newVersion);
111         assertThat(updatePoliciesRes).isEqualTo(ActionStatus.GENERAL_ERROR);
112     }
113
114     @Test
115     public void onDeleteInstance_whenNoPolicies_returnActionOk() {
116         Component container = new Resource();
117         ActionStatus operationStatus = policyTargetsUpdateOperation.onDelete(container, "instToDel");
118         assertThat(operationStatus).isEqualTo(ActionStatus.OK);
119         verifyZeroInteractions(toscaOperationFacade);
120     }
121
122     @Test
123     public void onDeleteInstance_whenNoCmptInstancePolicies_returnOk() {
124         PolicyDefinition policy = PolicyDefinitionBuilder.create().addGroupTarget("someGroup").build();
125         Component container = new ResourceBuilder().addPolicy(policy).build();
126         ActionStatus operationStatus = policyTargetsUpdateOperation.onDelete(container, "instToDel");
127         assertThat(operationStatus).isEqualTo(ActionStatus.OK);
128         verifyZeroInteractions(toscaOperationFacade);
129     }
130
131     @Test
132     public void onDeleteInstance_whenNoPoliciesWithInstanceAsTarget_returnActionOk() {
133         ActionStatus operationStatus = policyTargetsUpdateOperation.onDelete(container, "instToDel");
134         assertThat(operationStatus).isEqualTo(ActionStatus.OK);
135         verifyZeroInteractions(toscaOperationFacade);
136     }
137
138     @Test
139     public void onDeleteInstance_removeDeletedTargetFromPolicies() {
140         when(toscaOperationFacade.updatePoliciesOfComponent(eq(CONTAINER_ID), updatedPoliciesCaptor.capture())).thenReturn(StorageOperationStatus.OK);
141         ActionStatus operationStatus = policyTargetsUpdateOperation.onDelete(container, "inst2");
142         assertThat(operationStatus).isEqualTo(ActionStatus.OK);
143         List<PolicyDefinition> updatedPolicies = updatedPoliciesCaptor.getValue();
144         verifyUpdatedPolicies(updatedPolicies, policyWithInstanceTarget1, policyWithInstanceTarget2);
145         verifyUpdatedPolicyTargets(policyWithInstanceTarget1, "inst1");
146         verifyUpdatedPolicyTargets(policyWithInstanceTarget2, "inst1", "inst3");
147     }
148
149     @Test
150     public void onDeleteInstance_whenFailingToUpdatePolicies_propagateTheError() {
151         when(toscaOperationFacade.updatePoliciesOfComponent(eq(CONTAINER_ID), anyList())).thenReturn(StorageOperationStatus.GENERAL_ERROR);
152         ActionStatus operationStatus = policyTargetsUpdateOperation.onDelete(container, "inst2");
153         assertThat(operationStatus).isEqualTo(ActionStatus.GENERAL_ERROR);
154     }
155
156     private void verifyUpdatedPolicyTargets(PolicyDefinition updatedPolicy, String ... expectedCmptInstanceTargetIds) {
157         assertThat(updatedPolicy.resolveComponentInstanceTargets())
158                 .containsExactlyInAnyOrder(expectedCmptInstanceTargetIds);
159     }
160
161     private void verifyUpdatedPolicies(List<PolicyDefinition> updatedPolicies, PolicyDefinition ... expectedUpdatedPolicies) {
162         assertThat(updatedPolicies)
163                 .usingElementComparatorOnFields("targets")
164                 .containsExactlyInAnyOrder(expectedUpdatedPolicies);
165     }
166
167     private PolicyDefinition createPolicyWithCmptInstAsTargets(String uniqueId, String ... instId) {
168         PolicyDefinitionBuilder policyDefinitionBuilder = PolicyDefinitionBuilder.create();
169         Stream.of(instId).forEach(policyDefinitionBuilder::addComponentInstanceTarget);
170         return policyDefinitionBuilder.setUniqueId(uniqueId).build();
171     }
172
173 }