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