1 package org.openecomp.sdc.be.components.merge.instance;
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;
15 import java.util.Arrays;
16 import java.util.Collections;
17 import java.util.List;
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;
48 import com.google.common.collect.ImmutableMap;
50 import fj.data.Either;
52 @RunWith(MockitoJUnitRunner.class)
53 public class ComponentInstanceCapabilitiesMergeBLTest {
55 private static final String INSTANCE1 = "inst1";
56 private static final String INSTANCE2 = "inst2";
58 private ComponentCapabilitiesPropertiesMergeBL testInstance;
59 private ComponentsUtils componentsUtils;
61 private SimpleCapabilityResolver capabilityResolver;
63 private ToscaOperationFacade toscaOperationFacade;
65 private DataDefinitionsValuesMergingBusinessLogic dataDefinitionsValuesMergingBusinessLogic;
67 private ArgumentCaptor<List<ComponentInstanceProperty>> prevCapPropertiesCaptor;
69 private ArgumentCaptor<List<ComponentInstanceProperty>> currCapPropertiesCaptor;
71 private ArgumentCaptor<ComponentParametersView> getCurrResourceFilterCapture;
73 private CapabilityDefinition oldCap;
74 private CapabilityDefinition oldCap2;
75 private CapabilityDefinition newCap;
76 private CapabilityDefinition newCap2;
78 private ComponentParametersView getCapabilitiesPropsFilter;
80 protected static ConfigurationManager configurationManager = null;
83 public void setUp() throws Exception {
84 oldCap = new CapabilityDefinitionBuilder()
85 .setOwnerId(INSTANCE1)
86 .setOwnerName(INSTANCE1)
90 .addProperty(new ComponentInstancePropertyBuilder().setName("prop1").build())
91 .addProperty(new ComponentInstancePropertyBuilder().setName("prop2").build())
94 oldCap2 = new CapabilityDefinitionBuilder()
95 .setOwnerId(INSTANCE2)
96 .setOwnerName(INSTANCE2)
100 .addProperty(new ComponentInstancePropertyBuilder().setName("prop1").build())
103 newCap = new CapabilityDefinitionBuilder()
104 .setOwnerId(INSTANCE1)
105 .setOwnerName(INSTANCE1)
109 .addProperty(new ComponentInstancePropertyBuilder().setName("prop1").build())
112 newCap2 = new CapabilityDefinitionBuilder()
113 .setOwnerId(INSTANCE2)
114 .setOwnerName(INSTANCE2)
118 .addProperty(new ComponentInstancePropertyBuilder().setName("prop2").build())
119 .addProperty(new ComponentInstancePropertyBuilder().setName("prop3").build())
122 getCapabilitiesPropsFilter = new ComponentParametersView();
123 getCapabilitiesPropsFilter.disableAll();
124 getCapabilitiesPropsFilter.setIgnoreComponentInstances(false);
125 getCapabilitiesPropsFilter.setIgnoreCapabilities(false);
126 getCapabilitiesPropsFilter.setIgnoreCapabiltyProperties(false);
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);
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);
146 ActionStatus actionStatus = testInstance.mergeComponents(prevResource, newResource);
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);
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);
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();
168 ComponentInstance currInst1 = new ComponentInstanceBuilder().addCapability(newCap).setName(newCap.getOwnerName()).build();
169 ComponentInstance currInst2 = new ComponentInstanceBuilder().addCapability(newCap2).setName(newCap2.getOwnerName()).build();
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());
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);
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);
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);
218 ////////////////////////////
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());
231 assertThat(prevCapPropertiesCaptor.getValue()).extracting("name").containsExactly("prop1", "prop2");
232 assertThat(currCapPropertiesCaptor.getValue()).extracting("name").containsExactly("prop1");
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());
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);
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);
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);