adf19011db5d662fc96557efcab3f22ee5f2602f
[sdc.git] /
1 package org.openecomp.sdc.be.components.merge.instance;
2
3 import static java.util.Collections.emptyMap;
4 import static java.util.Collections.singletonList;
5 import static org.assertj.core.api.Assertions.assertThat;
6 import static org.mockito.ArgumentMatchers.any;
7 import static org.mockito.ArgumentMatchers.anyList;
8 import static org.mockito.ArgumentMatchers.eq;
9 import static org.mockito.Mockito.times;
10 import static org.mockito.Mockito.verify;
11 import static org.mockito.Mockito.verifyNoMoreInteractions;
12 import static org.mockito.Mockito.verifyZeroInteractions;
13 import static org.mockito.Mockito.when;
14
15 import java.util.Arrays;
16 import java.util.Collections;
17 import java.util.List;
18
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.junit.runner.RunWith;
22 import org.mockito.ArgumentCaptor;
23 import org.mockito.Captor;
24 import org.mockito.Mock;
25 import org.mockito.Mockito;
26 import org.mockito.junit.MockitoJUnitRunner;
27 import org.openecomp.sdc.be.auditing.impl.AuditingManager;
28 import org.openecomp.sdc.be.components.merge.capability.SimpleCapabilityResolver;
29 import org.openecomp.sdc.be.components.merge.property.DataDefinitionsValuesMergingBusinessLogic;
30 import org.openecomp.sdc.be.components.utils.CapabilityDefinitionBuilder;
31 import org.openecomp.sdc.be.components.utils.ComponentInstanceBuilder;
32 import org.openecomp.sdc.be.components.utils.ComponentInstancePropertyBuilder;
33 import org.openecomp.sdc.be.components.utils.ResourceBuilder;
34 import org.openecomp.sdc.be.config.ConfigurationManager;
35 import org.openecomp.sdc.be.dao.api.ActionStatus;
36 import org.openecomp.sdc.be.impl.ComponentsUtils;
37 import org.openecomp.sdc.be.model.CapabilityDefinition;
38 import org.openecomp.sdc.be.model.ComponentInstance;
39 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
40 import org.openecomp.sdc.be.model.ComponentParametersView;
41 import org.openecomp.sdc.be.model.Resource;
42 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
43 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
44 import org.openecomp.sdc.common.api.ConfigurationSource;
45 import org.openecomp.sdc.common.impl.ExternalConfiguration;
46 import org.openecomp.sdc.common.impl.FSConfigurationSource;
47
48 import com.google.common.collect.ImmutableMap;
49
50 import fj.data.Either;
51
52 @RunWith(MockitoJUnitRunner.class)
53 public class ComponentInstanceCapabilitiesMergeBLTest {
54
55     private static final String INSTANCE1 = "inst1";
56     private static final String INSTANCE2 = "inst2";
57
58     private ComponentCapabilitiesPropertiesMergeBL testInstance;
59     private ComponentsUtils componentsUtils;
60     @Mock
61     private SimpleCapabilityResolver capabilityResolver;
62     @Mock
63     private ToscaOperationFacade toscaOperationFacade;
64     @Mock
65     private DataDefinitionsValuesMergingBusinessLogic dataDefinitionsValuesMergingBusinessLogic;
66     @Captor
67     private ArgumentCaptor<List<ComponentInstanceProperty>> prevCapPropertiesCaptor;
68     @Captor
69     private ArgumentCaptor<List<ComponentInstanceProperty>> currCapPropertiesCaptor;
70     @Captor
71     private ArgumentCaptor<ComponentParametersView> getCurrResourceFilterCapture;
72
73     private CapabilityDefinition oldCap;
74     private CapabilityDefinition oldCap2;
75     private CapabilityDefinition newCap;
76     private CapabilityDefinition newCap2;
77
78     private ComponentParametersView getCapabilitiesPropsFilter;
79
80     protected static ConfigurationManager configurationManager = null;
81
82     @Before
83     public void setUp() throws Exception {
84         oldCap = new CapabilityDefinitionBuilder()
85                 .setOwnerId(INSTANCE1)
86                 .setOwnerName(INSTANCE1)
87                 .setId("cap1")
88                 .setType("type1")
89                 .setName("cap1")
90                 .addProperty(new ComponentInstancePropertyBuilder().setName("prop1").build())
91                 .addProperty(new ComponentInstancePropertyBuilder().setName("prop2").build())
92                 .build();
93
94         oldCap2 = new CapabilityDefinitionBuilder()
95                 .setOwnerId(INSTANCE2)
96                 .setOwnerName(INSTANCE2)
97                 .setId("cap2")
98                 .setType("type1")
99                 .setName("cap2")
100                 .addProperty(new ComponentInstancePropertyBuilder().setName("prop1").build())
101                 .build();
102
103         newCap = new CapabilityDefinitionBuilder()
104                 .setOwnerId(INSTANCE1)
105                 .setOwnerName(INSTANCE1)
106                 .setId("cap1")
107                 .setType("type1")
108                 .setName("cap1")
109                 .addProperty(new ComponentInstancePropertyBuilder().setName("prop1").build())
110                 .build();
111
112         newCap2 = new CapabilityDefinitionBuilder()
113                 .setOwnerId(INSTANCE2)
114                 .setOwnerName(INSTANCE2)
115                 .setId("cap2")
116                 .setType("type1")
117                 .setName("cap2")
118                 .addProperty(new ComponentInstancePropertyBuilder().setName("prop2").build())
119                 .addProperty(new ComponentInstancePropertyBuilder().setName("prop3").build())
120                 .build();
121
122         getCapabilitiesPropsFilter = new ComponentParametersView();
123         getCapabilitiesPropsFilter.disableAll();
124         getCapabilitiesPropsFilter.setIgnoreComponentInstances(false);
125         getCapabilitiesPropsFilter.setIgnoreCapabilities(false);
126         getCapabilitiesPropsFilter.setIgnoreCapabiltyProperties(false);
127
128         ExternalConfiguration.setAppName("catalog-be");
129         String appConfigDir = "src/test/resources/config/catalog-be";
130         ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(), appConfigDir);
131         ConfigurationManager configurationManager = new ConfigurationManager(configurationSource);
132         componentsUtils = new ComponentsUtils(Mockito.mock(AuditingManager.class));
133         testInstance = new ComponentCapabilitiesPropertiesMergeBL(dataDefinitionsValuesMergingBusinessLogic, toscaOperationFacade, componentsUtils, capabilityResolver);
134     }
135
136     @Test
137     public void mergeCapabilityProperties_singleCapability() {
138         ComponentInstance prevInst1 = new ComponentInstanceBuilder().addCapability(oldCap).setName(oldCap.getOwnerName()).build();
139         ComponentInstance newInst1 = new ComponentInstanceBuilder().addCapability(newCap).setName(newCap.getOwnerName()).build();
140         Resource prevResource = new ResourceBuilder().addComponentInstance(prevInst1).build();
141         Resource newResource = new ResourceBuilder().addComponentInstance(newInst1).build();
142         when(toscaOperationFacade.getToscaElement(eq(newResource.getUniqueId()), getCurrResourceFilterCapture.capture())).thenReturn(Either.left(newResource));
143         when(capabilityResolver.resolvePrevCapIdToNewCapability(prevInst1, newInst1)).thenReturn(ImmutableMap.of(oldCap, newCap));
144         when(toscaOperationFacade.updateComponentCalculatedCapabilitiesProperties(newResource)).thenReturn(StorageOperationStatus.OK);
145
146         ActionStatus actionStatus = testInstance.mergeComponents(prevResource, newResource);
147
148         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
149         verify(dataDefinitionsValuesMergingBusinessLogic).mergeInstanceDataDefinitions(prevCapPropertiesCaptor.capture(), currCapPropertiesCaptor.capture());
150         assertThat(prevCapPropertiesCaptor.getValue()).extracting("name").containsExactly("prop1", "prop2");
151         assertThat(currCapPropertiesCaptor.getValue()).extracting("name").containsExactly("prop1");
152         assertThat(getCurrResourceFilterCapture.getValue()).isEqualToComparingFieldByField(getCapabilitiesPropsFilter);
153     }
154
155     @Test
156     public void mergeCapabilityProperties_failToGetResourceWithPropsCapabilities() {
157         Resource currResource = new ResourceBuilder().setUniqueId("rid").build();
158         when(toscaOperationFacade.getToscaElement(eq(currResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
159         ActionStatus actionStatus = testInstance.mergeComponents(new Resource(), currResource);
160         assertThat(actionStatus).isEqualTo(ActionStatus.RESOURCE_NOT_FOUND);
161     }
162
163     @Test
164     public void mergeCapabilityProperties_multipleCapabilitiesToMerge() {
165         ComponentInstance prevInst1 = new ComponentInstanceBuilder().addCapability(oldCap).setName(oldCap.getOwnerName()).build();
166         ComponentInstance prevInst2 = new ComponentInstanceBuilder().addCapability(oldCap2).setName(oldCap2.getOwnerName()).build();
167
168         ComponentInstance currInst1 = new ComponentInstanceBuilder().addCapability(newCap).setName(newCap.getOwnerName()).build();
169         ComponentInstance currInst2 = new ComponentInstanceBuilder().addCapability(newCap2).setName(newCap2.getOwnerName()).build();
170
171         Resource currResource = new ResourceBuilder().addComponentInstance(currInst1).addComponentInstance(currInst2).build();
172         Resource prevResource = new ResourceBuilder().addComponentInstance(prevInst1).addComponentInstance(prevInst2).build();
173         when(toscaOperationFacade.getToscaElement(eq(currResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.left(currResource));
174         when(capabilityResolver.resolvePrevCapIdToNewCapability(prevInst1, currInst1)).thenReturn(ImmutableMap.of(oldCap, newCap));
175         when(capabilityResolver.resolvePrevCapIdToNewCapability(prevInst2, currInst2)).thenReturn(ImmutableMap.of(oldCap2, newCap2));
176         when(toscaOperationFacade.updateComponentCalculatedCapabilitiesProperties(currResource)).thenReturn(StorageOperationStatus.OK);
177         ActionStatus actionStatus = testInstance.mergeComponents(prevResource, currResource);
178         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
179         verify(dataDefinitionsValuesMergingBusinessLogic, times(2)).mergeInstanceDataDefinitions(anyList(), anyList());
180     }
181
182     @Test
183     public void mergeCapabilityProperties_noNewCapabilitiesResolved() {
184         ComponentInstance prevInst1 = new ComponentInstanceBuilder().addCapability(oldCap).setName(oldCap.getOwnerName()).build();
185         ComponentInstance newInst1 = new ComponentInstanceBuilder().setName(oldCap.getOwnerName()).build();
186         Resource prevResource = new ResourceBuilder().addComponentInstance(prevInst1).build();
187         Resource newResource = new ResourceBuilder().addComponentInstance(newInst1).build();
188         when(toscaOperationFacade.getToscaElement(eq(newResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.left(newResource));
189         when(capabilityResolver.resolvePrevCapIdToNewCapability(prevInst1, newInst1)).thenReturn(emptyMap());
190         when(toscaOperationFacade.updateComponentCalculatedCapabilitiesProperties(newResource)).thenReturn(StorageOperationStatus.OK);
191         ActionStatus actionStatus = testInstance.mergeComponents(prevResource, newResource);
192         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
193         verifyZeroInteractions(dataDefinitionsValuesMergingBusinessLogic);
194     }
195
196     @Test
197     public void mergeCapabilityProperties_noPrevCapabilitiesToMerge() {
198         Resource newResource = new Resource();
199         Resource prevResource = new Resource();
200         when(toscaOperationFacade.getToscaElement(eq(newResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.left(newResource));
201         verifyNoMoreInteractions(toscaOperationFacade);
202         ActionStatus actionStatus = testInstance.mergeComponents(prevResource, newResource);
203         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
204         verifyZeroInteractions(dataDefinitionsValuesMergingBusinessLogic);
205     }
206
207     @Test
208     public void mergeCapabilityProperties_failedToUpdateComponent() {
209         ComponentInstance inst1 = new ComponentInstanceBuilder().addCapability(oldCap).setName(oldCap.getOwnerName()).build();
210         Resource newResource = new Resource();
211         Resource prevResource = new ResourceBuilder().addComponentInstance(inst1).build();
212         when(toscaOperationFacade.getToscaElement(eq(newResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.left(newResource));
213         when(toscaOperationFacade.updateComponentCalculatedCapabilitiesProperties(newResource)).thenReturn(StorageOperationStatus.GENERAL_ERROR);
214         ActionStatus actionStatus = testInstance.mergeComponents(prevResource, newResource);
215         assertThat(actionStatus).isEqualTo(ActionStatus.GENERAL_ERROR);
216     }
217
218     ////////////////////////////
219     @Test
220     public void mergeInstanceCapabilityProperties_singleCap() {
221         List<CapabilityDefinition> previousInstanceCapabilities = Collections.singletonList(oldCap);
222         ComponentInstance inst1 = new ComponentInstanceBuilder().addCapability(newCap).setId(newCap.getOwnerId()).build();
223         Resource container = new ResourceBuilder().addComponentInstance(inst1).build();
224         Resource origInstanceNode = new Resource();
225         when(toscaOperationFacade.updateComponentInstanceCapabilityProperties(container, newCap.getOwnerId())).thenReturn(StorageOperationStatus.OK);
226         when(capabilityResolver.resolvePrevCapToNewCapability(container, origInstanceNode, INSTANCE1, previousInstanceCapabilities)).thenReturn(ImmutableMap.of(oldCap, newCap));
227         ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(container, origInstanceNode, INSTANCE1, previousInstanceCapabilities);
228         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
229         verify(dataDefinitionsValuesMergingBusinessLogic).mergeInstanceDataDefinitions(prevCapPropertiesCaptor.capture(), currCapPropertiesCaptor.capture());
230
231         assertThat(prevCapPropertiesCaptor.getValue()).extracting("name").containsExactly("prop1", "prop2");
232         assertThat(currCapPropertiesCaptor.getValue()).extracting("name").containsExactly("prop1");
233     }
234
235     @Test
236     public void mergeInstanceCapabilityProperties() {
237         List<CapabilityDefinition> previousInstanceCapabilities = Arrays.asList(oldCap, oldCap2);
238         ComponentInstance inst1 = new ComponentInstanceBuilder().addCapability(newCap).addCapability(newCap2).setId(newCap.getOwnerId()).build();
239         Resource container = new ResourceBuilder().addComponentInstance(inst1).build();
240         Resource origInstanceNode = new Resource();
241         when(capabilityResolver.resolvePrevCapToNewCapability(container, origInstanceNode, INSTANCE1, previousInstanceCapabilities)).thenReturn(ImmutableMap.of(oldCap, newCap, oldCap2, newCap2));
242         when(toscaOperationFacade.updateComponentInstanceCapabilityProperties(container, INSTANCE1)).thenReturn(StorageOperationStatus.OK);
243         ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(container, origInstanceNode, INSTANCE1, previousInstanceCapabilities);
244         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
245         verify(dataDefinitionsValuesMergingBusinessLogic, times(2)).mergeInstanceDataDefinitions(anyList(), anyList());
246     }
247
248     @Test
249     public void mergeInstanceCapabilityProperties_emptyCapabilitiesList() {
250         ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(new Resource(), new Resource(),  "instanceId", Collections.emptyList());
251         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
252         verifyZeroInteractions(toscaOperationFacade, dataDefinitionsValuesMergingBusinessLogic, capabilityResolver);
253     }
254
255     @Test
256     public void mergeInstanceCapabilityProperties_failedToUpdateComponent() {
257         Resource container = new Resource();
258         Resource resource = new Resource();
259         List<CapabilityDefinition> capList = singletonList(oldCap);
260         when(capabilityResolver.resolvePrevCapToNewCapability(container, resource, INSTANCE1, capList)).thenReturn(ImmutableMap.of(oldCap, newCap));
261         when(toscaOperationFacade.updateComponentInstanceCapabilityProperties(container, INSTANCE1)).thenReturn(StorageOperationStatus.GENERAL_ERROR);
262         ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(container, resource, INSTANCE1, capList);
263         assertThat(actionStatus).isEqualTo(ActionStatus.GENERAL_ERROR);
264     }
265
266     @Test
267     public void mergeInstanceCapabilityProperties_noNewCapabilitiesFound() {
268         Resource container = new Resource();
269         Resource resource = new Resource();
270         List<CapabilityDefinition> prevCapabilities = singletonList(oldCap);
271         when(capabilityResolver.resolvePrevCapToNewCapability(container, resource, INSTANCE1, prevCapabilities)).thenReturn(emptyMap());
272         when(toscaOperationFacade.updateComponentInstanceCapabilityProperties(container, INSTANCE1)).thenReturn(StorageOperationStatus.OK);
273         ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(container, resource, INSTANCE1, prevCapabilities);
274         assertThat(actionStatus).isEqualTo(ActionStatus.OK);
275         verifyZeroInteractions(dataDefinitionsValuesMergingBusinessLogic);
276     }
277 }