2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.be.components.merge.instance;
23 import com.google.common.collect.ImmutableMap;
24 import fj.data.Either;
25 import org.junit.Before;
26 import org.junit.Test;
27 import org.junit.runner.RunWith;
28 import org.mockito.ArgumentCaptor;
29 import org.mockito.Captor;
30 import org.mockito.Mock;
31 import org.mockito.Mockito;
32 import org.mockito.junit.MockitoJUnitRunner;
33 import org.openecomp.sdc.be.auditing.impl.AuditingManager;
34 import org.openecomp.sdc.be.components.merge.capability.SimpleCapabilityResolver;
35 import org.openecomp.sdc.be.components.merge.property.DataDefinitionsValuesMergingBusinessLogic;
36 import org.openecomp.sdc.be.components.utils.CapabilityDefinitionBuilder;
37 import org.openecomp.sdc.be.components.utils.ComponentInstanceBuilder;
38 import org.openecomp.sdc.be.components.utils.ComponentInstancePropertyBuilder;
39 import org.openecomp.sdc.be.components.utils.ResourceBuilder;
40 import org.openecomp.sdc.be.config.ConfigurationManager;
41 import org.openecomp.sdc.be.dao.api.ActionStatus;
42 import org.openecomp.sdc.be.impl.ComponentsUtils;
43 import org.openecomp.sdc.be.model.CapabilityDefinition;
44 import org.openecomp.sdc.be.model.ComponentInstance;
45 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
46 import org.openecomp.sdc.be.model.ComponentParametersView;
47 import org.openecomp.sdc.be.model.Resource;
48 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
49 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
50 import org.openecomp.sdc.common.api.ConfigurationSource;
51 import org.openecomp.sdc.common.impl.ExternalConfiguration;
52 import org.openecomp.sdc.common.impl.FSConfigurationSource;
54 import java.util.Arrays;
55 import java.util.Collections;
56 import java.util.List;
58 import static java.util.Collections.emptyMap;
59 import static java.util.Collections.singletonList;
60 import static org.assertj.core.api.Assertions.assertThat;
61 import static org.mockito.ArgumentMatchers.any;
62 import static org.mockito.ArgumentMatchers.anyList;
63 import static org.mockito.ArgumentMatchers.eq;
64 import static org.mockito.Mockito.times;
65 import static org.mockito.Mockito.verify;
66 import static org.mockito.Mockito.verifyNoMoreInteractions;
67 import static org.mockito.Mockito.verifyNoInteractions;
68 import static org.mockito.Mockito.when;
70 @RunWith(MockitoJUnitRunner.class)
71 public class ComponentInstanceCapabilitiesMergeBLTest {
73 private static final String INSTANCE1 = "inst1";
74 private static final String INSTANCE2 = "inst2";
76 private ComponentCapabilitiesPropertiesMergeBL testInstance;
77 private ComponentsUtils componentsUtils;
79 private SimpleCapabilityResolver capabilityResolver;
81 private ToscaOperationFacade toscaOperationFacade;
83 private DataDefinitionsValuesMergingBusinessLogic dataDefinitionsValuesMergingBusinessLogic;
85 private ArgumentCaptor<List<ComponentInstanceProperty>> prevCapPropertiesCaptor;
87 private ArgumentCaptor<List<ComponentInstanceProperty>> currCapPropertiesCaptor;
89 private ArgumentCaptor<ComponentParametersView> getCurrResourceFilterCapture;
91 private CapabilityDefinition oldCap;
92 private CapabilityDefinition oldCap2;
93 private CapabilityDefinition newCap;
94 private CapabilityDefinition newCap2;
96 private ComponentParametersView getCapabilitiesPropsFilter;
98 protected static ConfigurationManager configurationManager = null;
101 public void setUp() throws Exception {
102 oldCap = new CapabilityDefinitionBuilder()
103 .setOwnerId(INSTANCE1)
104 .setOwnerName(INSTANCE1)
108 .addProperty(new ComponentInstancePropertyBuilder().setName("prop1").build())
109 .addProperty(new ComponentInstancePropertyBuilder().setName("prop2").build())
112 oldCap2 = new CapabilityDefinitionBuilder()
113 .setOwnerId(INSTANCE2)
114 .setOwnerName(INSTANCE2)
118 .addProperty(new ComponentInstancePropertyBuilder().setName("prop1").build())
121 newCap = new CapabilityDefinitionBuilder()
122 .setOwnerId(INSTANCE1)
123 .setOwnerName(INSTANCE1)
127 .addProperty(new ComponentInstancePropertyBuilder().setName("prop1").build())
130 newCap2 = new CapabilityDefinitionBuilder()
131 .setOwnerId(INSTANCE2)
132 .setOwnerName(INSTANCE2)
136 .addProperty(new ComponentInstancePropertyBuilder().setName("prop2").build())
137 .addProperty(new ComponentInstancePropertyBuilder().setName("prop3").build())
140 getCapabilitiesPropsFilter = new ComponentParametersView();
141 getCapabilitiesPropsFilter.disableAll();
142 getCapabilitiesPropsFilter.setIgnoreComponentInstances(false);
143 getCapabilitiesPropsFilter.setIgnoreCapabilities(false);
144 getCapabilitiesPropsFilter.setIgnoreCapabiltyProperties(false);
145 getCapabilitiesPropsFilter.setIgnoreGroups(false);
147 ExternalConfiguration.setAppName("catalog-be");
148 String appConfigDir = "src/test/resources/config/catalog-be";
149 ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(), appConfigDir);
150 ConfigurationManager configurationManager = new ConfigurationManager(configurationSource);
151 componentsUtils = new ComponentsUtils(Mockito.mock(AuditingManager.class));
152 testInstance = new ComponentCapabilitiesPropertiesMergeBL(dataDefinitionsValuesMergingBusinessLogic, toscaOperationFacade, componentsUtils, capabilityResolver);
156 public void mergeCapabilityProperties_singleCapability() {
157 ComponentInstance prevInst1 = new ComponentInstanceBuilder().addCapability(oldCap).setName(oldCap.getOwnerName()).build();
158 ComponentInstance newInst1 = new ComponentInstanceBuilder().addCapability(newCap).setName(newCap.getOwnerName()).build();
159 Resource prevResource = new ResourceBuilder().addComponentInstance(prevInst1).build();
160 Resource newResource = new ResourceBuilder().addComponentInstance(newInst1).build();
161 when(toscaOperationFacade.getToscaElement(eq(newResource.getUniqueId()), getCurrResourceFilterCapture.capture())).thenReturn(Either.left(newResource));
162 when(capabilityResolver.resolvePrevCapIdToNewCapability(prevInst1, newInst1)).thenReturn(ImmutableMap.of(oldCap, newCap));
163 when(toscaOperationFacade.updateComponentCalculatedCapabilitiesProperties(newResource)).thenReturn(StorageOperationStatus.OK);
165 ActionStatus actionStatus = testInstance.mergeComponents(prevResource, newResource);
167 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
168 verify(dataDefinitionsValuesMergingBusinessLogic).mergeInstanceDataDefinitions(prevCapPropertiesCaptor.capture(), currCapPropertiesCaptor.capture());
169 assertThat(prevCapPropertiesCaptor.getValue()).extracting("name").containsExactly("prop1", "prop2");
170 assertThat(currCapPropertiesCaptor.getValue()).extracting("name").containsExactly("prop1");
171 assertThat(getCurrResourceFilterCapture.getValue()).isEqualToComparingFieldByField(getCapabilitiesPropsFilter);
175 public void mergeCapabilityProperties_failToGetResourceWithPropsCapabilities() {
176 Resource currResource = new ResourceBuilder().setUniqueId("rid").build();
177 when(toscaOperationFacade.getToscaElement(eq(currResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
178 ActionStatus actionStatus = testInstance.mergeComponents(new Resource(), currResource);
179 assertThat(actionStatus).isEqualTo(ActionStatus.RESOURCE_NOT_FOUND);
183 public void mergeCapabilityProperties_multipleCapabilitiesToMerge() {
184 ComponentInstance prevInst1 = new ComponentInstanceBuilder().addCapability(oldCap).setName(oldCap.getOwnerName()).build();
185 ComponentInstance prevInst2 = new ComponentInstanceBuilder().addCapability(oldCap2).setName(oldCap2.getOwnerName()).build();
187 ComponentInstance currInst1 = new ComponentInstanceBuilder().addCapability(newCap).setName(newCap.getOwnerName()).build();
188 ComponentInstance currInst2 = new ComponentInstanceBuilder().addCapability(newCap2).setName(newCap2.getOwnerName()).build();
190 Resource currResource = new ResourceBuilder().addComponentInstance(currInst1).addComponentInstance(currInst2).build();
191 Resource prevResource = new ResourceBuilder().addComponentInstance(prevInst1).addComponentInstance(prevInst2).build();
192 when(toscaOperationFacade.getToscaElement(eq(currResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.left(currResource));
193 when(capabilityResolver.resolvePrevCapIdToNewCapability(prevInst1, currInst1)).thenReturn(ImmutableMap.of(oldCap, newCap));
194 when(capabilityResolver.resolvePrevCapIdToNewCapability(prevInst2, currInst2)).thenReturn(ImmutableMap.of(oldCap2, newCap2));
195 when(toscaOperationFacade.updateComponentCalculatedCapabilitiesProperties(currResource)).thenReturn(StorageOperationStatus.OK);
196 ActionStatus actionStatus = testInstance.mergeComponents(prevResource, currResource);
197 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
198 verify(dataDefinitionsValuesMergingBusinessLogic, times(2)).mergeInstanceDataDefinitions(anyList(), anyList());
202 public void mergeCapabilityProperties_noNewCapabilitiesResolved() {
203 ComponentInstance prevInst1 = new ComponentInstanceBuilder().addCapability(oldCap).setName(oldCap.getOwnerName()).build();
204 ComponentInstance newInst1 = new ComponentInstanceBuilder().setName(oldCap.getOwnerName()).build();
205 Resource prevResource = new ResourceBuilder().addComponentInstance(prevInst1).build();
206 Resource newResource = new ResourceBuilder().addComponentInstance(newInst1).build();
207 when(toscaOperationFacade.getToscaElement(eq(newResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.left(newResource));
208 when(capabilityResolver.resolvePrevCapIdToNewCapability(prevInst1, newInst1)).thenReturn(emptyMap());
209 when(toscaOperationFacade.updateComponentCalculatedCapabilitiesProperties(newResource)).thenReturn(StorageOperationStatus.OK);
210 ActionStatus actionStatus = testInstance.mergeComponents(prevResource, newResource);
211 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
212 verifyNoInteractions(dataDefinitionsValuesMergingBusinessLogic);
216 public void mergeCapabilityProperties_noPrevCapabilitiesToMerge() {
217 Resource newResource = new Resource();
218 Resource prevResource = new Resource();
219 when(toscaOperationFacade.getToscaElement(eq(newResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.left(newResource));
220 verifyNoMoreInteractions(toscaOperationFacade);
221 ActionStatus actionStatus = testInstance.mergeComponents(prevResource, newResource);
222 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
223 verifyNoInteractions(dataDefinitionsValuesMergingBusinessLogic);
227 public void mergeCapabilityProperties_failedToUpdateComponent() {
228 ComponentInstance inst1 = new ComponentInstanceBuilder().addCapability(oldCap).setName(oldCap.getOwnerName()).build();
229 Resource newResource = new Resource();
230 Resource prevResource = new ResourceBuilder().addComponentInstance(inst1).build();
231 when(toscaOperationFacade.getToscaElement(eq(newResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.left(newResource));
232 when(toscaOperationFacade.updateComponentCalculatedCapabilitiesProperties(newResource)).thenReturn(StorageOperationStatus.GENERAL_ERROR);
233 ActionStatus actionStatus = testInstance.mergeComponents(prevResource, newResource);
234 assertThat(actionStatus).isEqualTo(ActionStatus.GENERAL_ERROR);
237 ////////////////////////////
239 public void mergeInstanceCapabilityProperties_singleCap() {
240 List<CapabilityDefinition> previousInstanceCapabilities = Collections.singletonList(oldCap);
241 ComponentInstance inst1 = new ComponentInstanceBuilder().addCapability(newCap).setId(newCap.getOwnerId()).build();
242 Resource container = new ResourceBuilder().addComponentInstance(inst1).build();
243 Resource origInstanceNode = new Resource();
244 when(toscaOperationFacade.updateComponentInstanceCapabilityProperties(container, newCap.getOwnerId())).thenReturn(StorageOperationStatus.OK);
245 when(capabilityResolver.resolvePrevCapToNewCapability(container, origInstanceNode, INSTANCE1, previousInstanceCapabilities)).thenReturn(ImmutableMap.of(oldCap, newCap));
246 ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(container, origInstanceNode, INSTANCE1, previousInstanceCapabilities);
247 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
248 verify(dataDefinitionsValuesMergingBusinessLogic).mergeInstanceDataDefinitions(prevCapPropertiesCaptor.capture(), currCapPropertiesCaptor.capture());
250 assertThat(prevCapPropertiesCaptor.getValue()).extracting("name").containsExactly("prop1", "prop2");
251 assertThat(currCapPropertiesCaptor.getValue()).extracting("name").containsExactly("prop1");
255 public void mergeInstanceCapabilityProperties() {
256 List<CapabilityDefinition> previousInstanceCapabilities = Arrays.asList(oldCap, oldCap2);
257 ComponentInstance inst1 = new ComponentInstanceBuilder().addCapability(newCap).addCapability(newCap2).setId(newCap.getOwnerId()).build();
258 Resource container = new ResourceBuilder().addComponentInstance(inst1).build();
259 Resource origInstanceNode = new Resource();
260 when(capabilityResolver.resolvePrevCapToNewCapability(container, origInstanceNode, INSTANCE1, previousInstanceCapabilities)).thenReturn(ImmutableMap.of(oldCap, newCap, oldCap2, newCap2));
261 when(toscaOperationFacade.updateComponentInstanceCapabilityProperties(container, INSTANCE1)).thenReturn(StorageOperationStatus.OK);
262 ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(container, origInstanceNode, INSTANCE1, previousInstanceCapabilities);
263 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
264 verify(dataDefinitionsValuesMergingBusinessLogic, times(2)).mergeInstanceDataDefinitions(anyList(), anyList());
268 public void mergeInstanceCapabilityProperties_emptyCapabilitiesList() {
269 ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(new Resource(), new Resource(), "instanceId", Collections.emptyList());
270 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
271 verifyNoInteractions(toscaOperationFacade, dataDefinitionsValuesMergingBusinessLogic, capabilityResolver);
275 public void mergeInstanceCapabilityProperties_failedToUpdateComponent() {
276 Resource container = new Resource();
277 Resource resource = new Resource();
278 List<CapabilityDefinition> capList = singletonList(oldCap);
279 when(capabilityResolver.resolvePrevCapToNewCapability(container, resource, INSTANCE1, capList)).thenReturn(ImmutableMap.of(oldCap, newCap));
280 when(toscaOperationFacade.updateComponentInstanceCapabilityProperties(container, INSTANCE1)).thenReturn(StorageOperationStatus.GENERAL_ERROR);
281 ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(container, resource, INSTANCE1, capList);
282 assertThat(actionStatus).isEqualTo(ActionStatus.GENERAL_ERROR);
286 public void mergeInstanceCapabilityProperties_noNewCapabilitiesFound() {
287 Resource container = new Resource();
288 Resource resource = new Resource();
289 List<CapabilityDefinition> prevCapabilities = singletonList(oldCap);
290 when(capabilityResolver.resolvePrevCapToNewCapability(container, resource, INSTANCE1, prevCapabilities)).thenReturn(emptyMap());
291 when(toscaOperationFacade.updateComponentInstanceCapabilityProperties(container, INSTANCE1)).thenReturn(StorageOperationStatus.OK);
292 ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(container, resource, INSTANCE1, prevCapabilities);
293 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
294 verifyNoInteractions(dataDefinitionsValuesMergingBusinessLogic);