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.*;
44 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
45 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
46 import org.openecomp.sdc.common.api.ConfigurationSource;
47 import org.openecomp.sdc.common.impl.ExternalConfiguration;
48 import org.openecomp.sdc.common.impl.FSConfigurationSource;
50 import java.util.Arrays;
51 import java.util.Collections;
52 import java.util.List;
54 import static java.util.Collections.emptyMap;
55 import static java.util.Collections.singletonList;
56 import static org.assertj.core.api.Assertions.assertThat;
57 import static org.mockito.ArgumentMatchers.any;
58 import static org.mockito.ArgumentMatchers.anyList;
59 import static org.mockito.ArgumentMatchers.eq;
60 import static org.mockito.Mockito.*;
62 @RunWith(MockitoJUnitRunner.class)
63 public class ComponentInstanceCapabilitiesMergeBLTest {
65 private static final String INSTANCE1 = "inst1";
66 private static final String INSTANCE2 = "inst2";
68 private ComponentCapabilitiesPropertiesMergeBL testInstance;
69 private ComponentsUtils componentsUtils;
71 private SimpleCapabilityResolver capabilityResolver;
73 private ToscaOperationFacade toscaOperationFacade;
75 private DataDefinitionsValuesMergingBusinessLogic dataDefinitionsValuesMergingBusinessLogic;
77 private ArgumentCaptor<List<ComponentInstanceProperty>> prevCapPropertiesCaptor;
79 private ArgumentCaptor<List<ComponentInstanceProperty>> currCapPropertiesCaptor;
81 private ArgumentCaptor<ComponentParametersView> getCurrResourceFilterCapture;
83 private CapabilityDefinition oldCap;
84 private CapabilityDefinition oldCap2;
85 private CapabilityDefinition newCap;
86 private CapabilityDefinition newCap2;
88 private ComponentParametersView getCapabilitiesPropsFilter;
90 protected static ConfigurationManager configurationManager = null;
93 public void setUp() throws Exception {
94 oldCap = new CapabilityDefinitionBuilder()
95 .setOwnerId(INSTANCE1)
96 .setOwnerName(INSTANCE1)
100 .addProperty(new ComponentInstancePropertyBuilder().setName("prop1").build())
101 .addProperty(new ComponentInstancePropertyBuilder().setName("prop2").build())
104 oldCap2 = new CapabilityDefinitionBuilder()
105 .setOwnerId(INSTANCE2)
106 .setOwnerName(INSTANCE2)
110 .addProperty(new ComponentInstancePropertyBuilder().setName("prop1").build())
113 newCap = new CapabilityDefinitionBuilder()
114 .setOwnerId(INSTANCE1)
115 .setOwnerName(INSTANCE1)
119 .addProperty(new ComponentInstancePropertyBuilder().setName("prop1").build())
122 newCap2 = new CapabilityDefinitionBuilder()
123 .setOwnerId(INSTANCE2)
124 .setOwnerName(INSTANCE2)
128 .addProperty(new ComponentInstancePropertyBuilder().setName("prop2").build())
129 .addProperty(new ComponentInstancePropertyBuilder().setName("prop3").build())
132 getCapabilitiesPropsFilter = new ComponentParametersView();
133 getCapabilitiesPropsFilter.disableAll();
134 getCapabilitiesPropsFilter.setIgnoreComponentInstances(false);
135 getCapabilitiesPropsFilter.setIgnoreCapabilities(false);
136 getCapabilitiesPropsFilter.setIgnoreCapabiltyProperties(false);
138 ExternalConfiguration.setAppName("catalog-be");
139 String appConfigDir = "src/test/resources/config/catalog-be";
140 ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(), appConfigDir);
141 ConfigurationManager configurationManager = new ConfigurationManager(configurationSource);
142 componentsUtils = new ComponentsUtils(Mockito.mock(AuditingManager.class));
143 testInstance = new ComponentCapabilitiesPropertiesMergeBL(dataDefinitionsValuesMergingBusinessLogic, toscaOperationFacade, componentsUtils, capabilityResolver);
147 public void mergeCapabilityProperties_singleCapability() {
148 ComponentInstance prevInst1 = new ComponentInstanceBuilder().addCapability(oldCap).setName(oldCap.getOwnerName()).build();
149 ComponentInstance newInst1 = new ComponentInstanceBuilder().addCapability(newCap).setName(newCap.getOwnerName()).build();
150 Resource prevResource = new ResourceBuilder().addComponentInstance(prevInst1).build();
151 Resource newResource = new ResourceBuilder().addComponentInstance(newInst1).build();
152 when(toscaOperationFacade.getToscaElement(eq(newResource.getUniqueId()), getCurrResourceFilterCapture.capture())).thenReturn(Either.left(newResource));
153 when(capabilityResolver.resolvePrevCapIdToNewCapability(prevInst1, newInst1)).thenReturn(ImmutableMap.of(oldCap, newCap));
154 when(toscaOperationFacade.updateComponentCalculatedCapabilitiesProperties(newResource)).thenReturn(StorageOperationStatus.OK);
156 ActionStatus actionStatus = testInstance.mergeComponents(prevResource, newResource);
158 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
159 verify(dataDefinitionsValuesMergingBusinessLogic).mergeInstanceDataDefinitions(prevCapPropertiesCaptor.capture(), currCapPropertiesCaptor.capture());
160 assertThat(prevCapPropertiesCaptor.getValue()).extracting("name").containsExactly("prop1", "prop2");
161 assertThat(currCapPropertiesCaptor.getValue()).extracting("name").containsExactly("prop1");
162 assertThat(getCurrResourceFilterCapture.getValue()).isEqualToComparingFieldByField(getCapabilitiesPropsFilter);
166 public void mergeCapabilityProperties_failToGetResourceWithPropsCapabilities() {
167 Resource currResource = new ResourceBuilder().setUniqueId("rid").build();
168 when(toscaOperationFacade.getToscaElement(eq(currResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
169 ActionStatus actionStatus = testInstance.mergeComponents(new Resource(), currResource);
170 assertThat(actionStatus).isEqualTo(ActionStatus.RESOURCE_NOT_FOUND);
174 public void mergeCapabilityProperties_multipleCapabilitiesToMerge() {
175 ComponentInstance prevInst1 = new ComponentInstanceBuilder().addCapability(oldCap).setName(oldCap.getOwnerName()).build();
176 ComponentInstance prevInst2 = new ComponentInstanceBuilder().addCapability(oldCap2).setName(oldCap2.getOwnerName()).build();
178 ComponentInstance currInst1 = new ComponentInstanceBuilder().addCapability(newCap).setName(newCap.getOwnerName()).build();
179 ComponentInstance currInst2 = new ComponentInstanceBuilder().addCapability(newCap2).setName(newCap2.getOwnerName()).build();
181 Resource currResource = new ResourceBuilder().addComponentInstance(currInst1).addComponentInstance(currInst2).build();
182 Resource prevResource = new ResourceBuilder().addComponentInstance(prevInst1).addComponentInstance(prevInst2).build();
183 when(toscaOperationFacade.getToscaElement(eq(currResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.left(currResource));
184 when(capabilityResolver.resolvePrevCapIdToNewCapability(prevInst1, currInst1)).thenReturn(ImmutableMap.of(oldCap, newCap));
185 when(capabilityResolver.resolvePrevCapIdToNewCapability(prevInst2, currInst2)).thenReturn(ImmutableMap.of(oldCap2, newCap2));
186 when(toscaOperationFacade.updateComponentCalculatedCapabilitiesProperties(currResource)).thenReturn(StorageOperationStatus.OK);
187 ActionStatus actionStatus = testInstance.mergeComponents(prevResource, currResource);
188 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
189 verify(dataDefinitionsValuesMergingBusinessLogic, times(2)).mergeInstanceDataDefinitions(anyList(), anyList());
193 public void mergeCapabilityProperties_noNewCapabilitiesResolved() {
194 ComponentInstance prevInst1 = new ComponentInstanceBuilder().addCapability(oldCap).setName(oldCap.getOwnerName()).build();
195 ComponentInstance newInst1 = new ComponentInstanceBuilder().setName(oldCap.getOwnerName()).build();
196 Resource prevResource = new ResourceBuilder().addComponentInstance(prevInst1).build();
197 Resource newResource = new ResourceBuilder().addComponentInstance(newInst1).build();
198 when(toscaOperationFacade.getToscaElement(eq(newResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.left(newResource));
199 when(capabilityResolver.resolvePrevCapIdToNewCapability(prevInst1, newInst1)).thenReturn(emptyMap());
200 when(toscaOperationFacade.updateComponentCalculatedCapabilitiesProperties(newResource)).thenReturn(StorageOperationStatus.OK);
201 ActionStatus actionStatus = testInstance.mergeComponents(prevResource, newResource);
202 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
203 verifyZeroInteractions(dataDefinitionsValuesMergingBusinessLogic);
207 public void mergeCapabilityProperties_noPrevCapabilitiesToMerge() {
208 Resource newResource = new Resource();
209 Resource prevResource = new Resource();
210 when(toscaOperationFacade.getToscaElement(eq(newResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.left(newResource));
211 verifyNoMoreInteractions(toscaOperationFacade);
212 ActionStatus actionStatus = testInstance.mergeComponents(prevResource, newResource);
213 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
214 verifyZeroInteractions(dataDefinitionsValuesMergingBusinessLogic);
218 public void mergeCapabilityProperties_failedToUpdateComponent() {
219 ComponentInstance inst1 = new ComponentInstanceBuilder().addCapability(oldCap).setName(oldCap.getOwnerName()).build();
220 Resource newResource = new Resource();
221 Resource prevResource = new ResourceBuilder().addComponentInstance(inst1).build();
222 when(toscaOperationFacade.getToscaElement(eq(newResource.getUniqueId()), any(ComponentParametersView.class))).thenReturn(Either.left(newResource));
223 when(toscaOperationFacade.updateComponentCalculatedCapabilitiesProperties(newResource)).thenReturn(StorageOperationStatus.GENERAL_ERROR);
224 ActionStatus actionStatus = testInstance.mergeComponents(prevResource, newResource);
225 assertThat(actionStatus).isEqualTo(ActionStatus.GENERAL_ERROR);
228 ////////////////////////////
230 public void mergeInstanceCapabilityProperties_singleCap() {
231 List<CapabilityDefinition> previousInstanceCapabilities = Collections.singletonList(oldCap);
232 ComponentInstance inst1 = new ComponentInstanceBuilder().addCapability(newCap).setId(newCap.getOwnerId()).build();
233 Resource container = new ResourceBuilder().addComponentInstance(inst1).build();
234 Resource origInstanceNode = new Resource();
235 when(toscaOperationFacade.updateComponentInstanceCapabilityProperties(container, newCap.getOwnerId())).thenReturn(StorageOperationStatus.OK);
236 when(capabilityResolver.resolvePrevCapToNewCapability(container, origInstanceNode, INSTANCE1, previousInstanceCapabilities)).thenReturn(ImmutableMap.of(oldCap, newCap));
237 ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(container, origInstanceNode, INSTANCE1, previousInstanceCapabilities);
238 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
239 verify(dataDefinitionsValuesMergingBusinessLogic).mergeInstanceDataDefinitions(prevCapPropertiesCaptor.capture(), currCapPropertiesCaptor.capture());
241 assertThat(prevCapPropertiesCaptor.getValue()).extracting("name").containsExactly("prop1", "prop2");
242 assertThat(currCapPropertiesCaptor.getValue()).extracting("name").containsExactly("prop1");
246 public void mergeInstanceCapabilityProperties() {
247 List<CapabilityDefinition> previousInstanceCapabilities = Arrays.asList(oldCap, oldCap2);
248 ComponentInstance inst1 = new ComponentInstanceBuilder().addCapability(newCap).addCapability(newCap2).setId(newCap.getOwnerId()).build();
249 Resource container = new ResourceBuilder().addComponentInstance(inst1).build();
250 Resource origInstanceNode = new Resource();
251 when(capabilityResolver.resolvePrevCapToNewCapability(container, origInstanceNode, INSTANCE1, previousInstanceCapabilities)).thenReturn(ImmutableMap.of(oldCap, newCap, oldCap2, newCap2));
252 when(toscaOperationFacade.updateComponentInstanceCapabilityProperties(container, INSTANCE1)).thenReturn(StorageOperationStatus.OK);
253 ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(container, origInstanceNode, INSTANCE1, previousInstanceCapabilities);
254 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
255 verify(dataDefinitionsValuesMergingBusinessLogic, times(2)).mergeInstanceDataDefinitions(anyList(), anyList());
259 public void mergeInstanceCapabilityProperties_emptyCapabilitiesList() {
260 ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(new Resource(), new Resource(), "instanceId", Collections.emptyList());
261 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
262 verifyZeroInteractions(toscaOperationFacade, dataDefinitionsValuesMergingBusinessLogic, capabilityResolver);
266 public void mergeInstanceCapabilityProperties_failedToUpdateComponent() {
267 Resource container = new Resource();
268 Resource resource = new Resource();
269 List<CapabilityDefinition> capList = singletonList(oldCap);
270 when(capabilityResolver.resolvePrevCapToNewCapability(container, resource, INSTANCE1, capList)).thenReturn(ImmutableMap.of(oldCap, newCap));
271 when(toscaOperationFacade.updateComponentInstanceCapabilityProperties(container, INSTANCE1)).thenReturn(StorageOperationStatus.GENERAL_ERROR);
272 ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(container, resource, INSTANCE1, capList);
273 assertThat(actionStatus).isEqualTo(ActionStatus.GENERAL_ERROR);
277 public void mergeInstanceCapabilityProperties_noNewCapabilitiesFound() {
278 Resource container = new Resource();
279 Resource resource = new Resource();
280 List<CapabilityDefinition> prevCapabilities = singletonList(oldCap);
281 when(capabilityResolver.resolvePrevCapToNewCapability(container, resource, INSTANCE1, prevCapabilities)).thenReturn(emptyMap());
282 when(toscaOperationFacade.updateComponentInstanceCapabilityProperties(container, INSTANCE1)).thenReturn(StorageOperationStatus.OK);
283 ActionStatus actionStatus = testInstance.mergeComponentInstanceCapabilities(container, resource, INSTANCE1, prevCapabilities);
284 assertThat(actionStatus).isEqualTo(ActionStatus.OK);
285 verifyZeroInteractions(dataDefinitionsValuesMergingBusinessLogic);