2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021 Nordix Foundation
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 * SPDX-License-Identifier: Apache-2.0
17 * ============LICENSE_END=========================================================
20 package org.openecomp.sdc.be.components.impl;
22 import static org.assertj.core.api.Assertions.assertThat;
23 import static org.junit.jupiter.api.Assertions.assertTrue;
24 import static org.junit.jupiter.api.Assertions.fail;
25 import static org.mockito.ArgumentMatchers.any;
26 import static org.mockito.Mockito.when;
28 import fj.data.Either;
29 import java.util.ArrayList;
30 import java.util.Arrays;
31 import java.util.Collections;
32 import java.util.HashMap;
33 import java.util.List;
35 import java.util.Optional;
36 import java.util.UUID;
37 import org.junit.jupiter.api.BeforeEach;
38 import org.junit.jupiter.api.Test;
39 import org.junit.jupiter.api.extension.ExtendWith;
40 import org.mockito.InjectMocks;
41 import org.mockito.Mock;
42 import org.mockito.MockitoAnnotations;
43 import org.mockito.junit.jupiter.MockitoExtension;
44 import org.openecomp.sdc.be.components.impl.exceptions.BusinessLogicException;
45 import org.openecomp.sdc.be.components.validation.ComponentValidations;
46 import org.openecomp.sdc.be.components.validation.UserValidations;
47 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphDao;
48 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphGenericDao;
49 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
50 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
51 import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
52 import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
53 import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition;
54 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
55 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
56 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
57 import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
58 import org.openecomp.sdc.be.impl.ComponentsUtils;
59 import org.openecomp.sdc.be.model.ArtifactTypeDefinition;
60 import org.openecomp.sdc.be.model.Component;
61 import org.openecomp.sdc.be.model.ComponentInstance;
62 import org.openecomp.sdc.be.model.ComponentInstanceInterface;
63 import org.openecomp.sdc.be.model.ComponentParametersView;
64 import org.openecomp.sdc.be.model.DataTypeDefinition;
65 import org.openecomp.sdc.be.model.InterfaceDefinition;
66 import org.openecomp.sdc.be.model.PropertyConstraint;
67 import org.openecomp.sdc.be.model.PropertyDefinition;
68 import org.openecomp.sdc.be.model.Service;
69 import org.openecomp.sdc.be.model.cache.ApplicationDataTypeCache;
70 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
71 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
72 import org.openecomp.sdc.be.model.operations.impl.GraphLockOperation;
73 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
74 import org.openecomp.sdc.be.model.tosca.constraints.ValidValuesConstraint;
75 import org.openecomp.sdc.common.datastructure.Wrapper;
76 import org.openecomp.sdc.exception.ResponseFormat;
78 @ExtendWith(MockitoExtension.class)
79 class ComponentInterfaceOperationBusinessLogicTest extends BaseBusinessLogicMock {
82 private ComponentInterfaceOperationBusinessLogic componentInterfaceOperationBusinessLogic;
85 private ToscaOperationFacade toscaOperationFacade;
87 private GraphLockOperation graphLockOperation;
89 private JanusGraphDao janusGraphDao;
91 private JanusGraphGenericDao janusGraphGenericDao;
93 private ComponentsUtils componentsUtils;
95 private UserValidations userValidations;
97 private ComponentValidations componentValidations;
99 private PropertyBusinessLogic propertyBusinessLogic;
101 private ApplicationDataTypeCache applicationDataTypeCache;
103 private ArtifactTypeBusinessLogic artifactTypeBusinessLogic;
105 private Component component;
106 private ComponentInstance componentInstance;
107 private ComponentParametersView componentFilter;
111 MockitoAnnotations.openMocks(this);
112 componentInterfaceOperationBusinessLogic =
113 new ComponentInterfaceOperationBusinessLogic(elementDao, groupOperation, groupInstanceOperation,
114 groupTypeOperation, interfaceOperation, interfaceLifecycleTypeOperation, artifactToscaOperation,
115 componentValidations, propertyBusinessLogic, artifactTypeBusinessLogic);
116 componentInterfaceOperationBusinessLogic.setToscaOperationFacade(toscaOperationFacade);
117 componentInterfaceOperationBusinessLogic.setGraphLockOperation(graphLockOperation);
118 componentInterfaceOperationBusinessLogic.setComponentsUtils(componentsUtils);
119 componentInterfaceOperationBusinessLogic.setUserValidations(userValidations);
120 componentInterfaceOperationBusinessLogic.setJanusGraphGenericDao(janusGraphGenericDao);
121 componentInterfaceOperationBusinessLogic.setJanusGraphDao(janusGraphDao);
122 componentInterfaceOperationBusinessLogic.setApplicationDataTypeCache(applicationDataTypeCache);
127 void updateComponentInstanceInterfaceOperationTest() throws BusinessLogicException {
128 final String componentId = component.getUniqueId();
129 final String componentInstanceId = componentInstance.getUniqueId();
130 final InterfaceDefinition interfaceDefinition = new InterfaceDefinition();
131 interfaceDefinition.setUniqueId(UUID.randomUUID().toString());
132 interfaceDefinition.setType("tosca.interfaces.node.lifecycle.Standard");
133 final Map<String, OperationDataDefinition> operations = new HashMap<>();
134 final OperationDataDefinition operationDataDefinition = new OperationDataDefinition();
135 operationDataDefinition.setUniqueId(UUID.randomUUID().toString());
136 final ArtifactDataDefinition artifactDataDefinition = new ArtifactDataDefinition();
137 artifactDataDefinition.setArtifactName("EO Implementation info");
138 operationDataDefinition.setImplementation(artifactDataDefinition);
139 operations.put("configure", operationDataDefinition);
140 interfaceDefinition.setOperations(operations );
142 final ComponentInstanceInterface componentInstanceInterface =
143 new ComponentInstanceInterface("interfaceId", interfaceDefinition);
144 Map<String, List<ComponentInstanceInterface>> componentInstancesInterfacesMap = new HashMap<>();
145 componentInstancesInterfacesMap.put(componentInstanceId, Collections.singletonList(componentInstanceInterface));
146 component.setComponentInstancesInterfaces(componentInstancesInterfacesMap);
147 componentInstance.setInterfaces(
148 (Map<String, Object>) new HashMap<>().put(componentInstanceId, interfaceDefinition));
149 component.setComponentInstances(Collections.singletonList(componentInstance));
151 when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(component));
152 when(componentValidations.getComponentInstance(component, componentInstanceId))
153 .thenReturn(Optional.of(componentInstance));
154 when(graphLockOperation.lockComponent(componentId, NodeTypeEnum.Service))
155 .thenReturn(StorageOperationStatus.OK);
156 when(toscaOperationFacade.updateComponentInstanceInterfaces(component, componentInstanceId))
157 .thenReturn(StorageOperationStatus.OK);
158 when(toscaOperationFacade
159 .updateComponentInstanceMetadataOfTopologyTemplate(any(Service.class), any(ComponentParametersView.class)))
160 .thenReturn(Either.left(component));
161 when(janusGraphDao.commit()).thenReturn(JanusGraphOperationStatus.OK);
162 when(graphLockOperation.unlockComponent(componentId, NodeTypeEnum.Service))
163 .thenReturn(StorageOperationStatus.OK);
164 when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(new HashMap<>()));
166 final Optional<ComponentInstance> result = componentInterfaceOperationBusinessLogic
167 .updateComponentInstanceInterfaceOperation(componentId, componentInstanceId, interfaceDefinition,
168 ComponentTypeEnum.SERVICE, new Wrapper<>(), true);
169 assertThat(result).isPresent();
173 void valueForInputFailsConstraintsValidation() throws BusinessLogicException {
174 final String inputType = "myType";
175 final String componentId = component.getUniqueId();
176 final String componentInstanceId = componentInstance.getUniqueId();
177 final InterfaceDefinition interfaceDefinition = new InterfaceDefinition();
178 interfaceDefinition.setUniqueId(UUID.randomUUID().toString());
179 interfaceDefinition.setType("tosca.interfaces.node.lifecycle.Standard");
180 final Map<String, OperationDataDefinition> operations = new HashMap<>();
181 final OperationDataDefinition operationDataDefinition = new OperationDataDefinition();
182 operationDataDefinition.setUniqueId(UUID.randomUUID().toString());
183 final ArtifactDataDefinition artifactDataDefinition = new ArtifactDataDefinition();
184 final ListDataDefinition<OperationInputDefinition> inputsDefinitionListData = new ListDataDefinition<>();
185 OperationInputDefinition input1 = new OperationInputDefinition();
186 input1.setName("input_1");
187 input1.setType(inputType);
188 input1.setValue("{\"input_range\": \"invalid\"}");
189 inputsDefinitionListData.add(input1);
190 artifactDataDefinition.setArtifactName("EO Implementation info");
191 operationDataDefinition.setImplementation(artifactDataDefinition);
192 operationDataDefinition.setInputs(inputsDefinitionListData);
193 operations.put("configure", operationDataDefinition);
194 interfaceDefinition.setOperations(operations );
196 DataTypeDefinition myType = new DataTypeDefinition();
197 myType.setName(inputType);
198 PropertyDefinition input_range = new PropertyDefinition();
199 input_range.setName("input_range");
200 input_range.setType("string");
201 PropertyConstraint constraint1 = new ValidValuesConstraint(Arrays.asList("value1", "value2", "value3"));
202 input_range.setConstraints(List.of(constraint1));
203 myType.setProperties(List.of(input_range));
204 Map<String, DataTypeDefinition> dataTypes = Collections.singletonMap(myType.getName(), myType);
205 Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
207 final ComponentInstanceInterface componentInstanceInterface =
208 new ComponentInstanceInterface("interfaceId", interfaceDefinition);
209 Map<String, List<ComponentInstanceInterface>> componentInstancesInterfacesMap = new HashMap<>();
210 componentInstancesInterfacesMap.put(componentInstanceId, Collections.singletonList(componentInstanceInterface));
211 component.setComponentInstancesInterfaces(componentInstancesInterfacesMap);
212 componentInstance.setInterfaces(
213 (Map<String, Object>) new HashMap<>().put(componentInstanceId, interfaceDefinition));
214 component.setComponentInstances(Collections.singletonList(componentInstance));
216 when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(component));
217 when(componentValidations.getComponentInstance(component, componentInstanceId))
218 .thenReturn(Optional.of(componentInstance));
219 when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(dataTypes));
221 final Optional<ComponentInstance> result = componentInterfaceOperationBusinessLogic
222 .updateComponentInstanceInterfaceOperation(componentId, componentInstanceId, interfaceDefinition,
223 ComponentTypeEnum.SERVICE, errorWrapper, false);
224 assertThat(result).isNotPresent();
225 assertTrue(errorWrapper.getInnerElement().getStatus() == 400);
226 assertTrue(errorWrapper.getInnerElement().getRequestError().getRequestError().getServiceException().getText()
227 .contains("Error: Invalid property values provided"));
231 void valueForInputSucceedsConstraintsValidation() throws BusinessLogicException {
232 final String inputType = "myType";
233 final String componentId = component.getUniqueId();
234 final String componentInstanceId = componentInstance.getUniqueId();
235 final InterfaceDefinition interfaceDefinition = new InterfaceDefinition();
236 interfaceDefinition.setUniqueId(UUID.randomUUID().toString());
237 interfaceDefinition.setType("tosca.interfaces.node.lifecycle.Standard");
238 final Map<String, OperationDataDefinition> operations = new HashMap<>();
239 final OperationDataDefinition operationDataDefinition = new OperationDataDefinition();
240 operationDataDefinition.setUniqueId(UUID.randomUUID().toString());
241 final ArtifactDataDefinition artifactDataDefinition = new ArtifactDataDefinition();
242 final ListDataDefinition<OperationInputDefinition> inputsDefinitionListData = new ListDataDefinition<>();
243 OperationInputDefinition input1 = new OperationInputDefinition();
244 input1.setName("input_1");
245 input1.setType(inputType);
246 input1.setValue("{\"input_range\": \"value1\"}");
247 inputsDefinitionListData.add(input1);
248 artifactDataDefinition.setArtifactName("EO Implementation info");
249 operationDataDefinition.setImplementation(artifactDataDefinition);
250 operationDataDefinition.setInputs(inputsDefinitionListData);
251 operations.put("configure", operationDataDefinition);
252 interfaceDefinition.setOperations(operations );
254 DataTypeDefinition myType = new DataTypeDefinition();
255 myType.setName(inputType);
256 PropertyDefinition input_range = new PropertyDefinition();
257 input_range.setName("input_range");
258 input_range.setType("string");
259 PropertyConstraint constraint1 = new ValidValuesConstraint(Arrays.asList("value1", "value2", "value3"));
260 input_range.setConstraints(List.of(constraint1));
261 myType.setProperties(List.of(input_range));
262 Map<String, DataTypeDefinition> dataTypes = Collections.singletonMap(myType.getName(), myType);
263 Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
265 final ComponentInstanceInterface componentInstanceInterface =
266 new ComponentInstanceInterface("interfaceId", interfaceDefinition);
267 Map<String, List<ComponentInstanceInterface>> componentInstancesInterfacesMap = new HashMap<>();
268 componentInstancesInterfacesMap.put(componentInstanceId, Collections.singletonList(componentInstanceInterface));
269 component.setComponentInstancesInterfaces(componentInstancesInterfacesMap);
270 componentInstance.setInterfaces(
271 (Map<String, Object>) new HashMap<>().put(componentInstanceId, interfaceDefinition));
272 component.setComponentInstances(Collections.singletonList(componentInstance));
274 when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(component));
275 when(componentValidations.getComponentInstance(component, componentInstanceId))
276 .thenReturn(Optional.of(componentInstance));
277 when(toscaOperationFacade.updateComponentInstanceInterfaces(component, componentInstanceId))
278 .thenReturn(StorageOperationStatus.OK);
279 when(toscaOperationFacade
280 .updateComponentInstanceMetadataOfTopologyTemplate(any(Service.class), any(ComponentParametersView.class)))
281 .thenReturn(Either.left(component));
282 when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(dataTypes));
284 final Optional<ComponentInstance> result = componentInterfaceOperationBusinessLogic
285 .updateComponentInstanceInterfaceOperation(componentId, componentInstanceId, interfaceDefinition,
286 ComponentTypeEnum.SERVICE, errorWrapper, false);
287 assertThat(result).isPresent();
291 void valueForArtifactInputFailsConstraintsValidation() throws BusinessLogicException {
292 final String inputType = "myType";
293 final String artifactType = "artifactType";
294 final String componentId = component.getUniqueId();
295 final String componentInstanceId = componentInstance.getUniqueId();
296 final InterfaceDefinition interfaceDefinition = new InterfaceDefinition();
297 interfaceDefinition.setUniqueId(UUID.randomUUID().toString());
298 interfaceDefinition.setType("tosca.interfaces.node.lifecycle.Standard");
299 final Map<String, OperationDataDefinition> operations = new HashMap<>();
300 final OperationDataDefinition operationDataDefinition = new OperationDataDefinition();
301 operationDataDefinition.setUniqueId(UUID.randomUUID().toString());
302 final ArtifactDataDefinition artifactDataDefinition = new ArtifactDataDefinition();
304 artifactDataDefinition.setArtifactName("EO Implementation info");
305 artifactDataDefinition.setArtifactType(artifactType);
306 PropertyDataDefinition propertyDataDefinition = new PropertyDataDefinition();
307 propertyDataDefinition.setName("propertyWithRestrictedValues");
308 propertyDataDefinition.setType(inputType);
309 propertyDataDefinition.setValue("{\"propertyWithRestrictedValues\": \"invalid\"}");
310 artifactDataDefinition.addProperty(propertyDataDefinition);
312 operationDataDefinition.setImplementation(artifactDataDefinition);
313 operations.put("configure", operationDataDefinition);
314 interfaceDefinition.setOperations(operations );
316 final DataTypeDefinition myType = new DataTypeDefinition();
317 final ArtifactTypeDefinition artifactTypeDefinitionFromCache = new ArtifactTypeDefinition();
318 artifactTypeDefinitionFromCache.setName(UniqueIdBuilder.buildArtifactTypeUid(null, artifactType));
319 myType.setName(inputType);
320 PropertyDefinition propertyWithRestrictedValues = new PropertyDefinition();
321 propertyWithRestrictedValues.setName("propertyWithRestrictedValues");
322 propertyWithRestrictedValues.setType("string");
323 PropertyConstraint constraint1 = new ValidValuesConstraint(Arrays.asList("value1", "value2", "value3"));
324 propertyWithRestrictedValues.setConstraints(List.of(constraint1));
325 artifactTypeDefinitionFromCache.setProperties(List.of(propertyWithRestrictedValues));
326 myType.setProperties(List.of(propertyWithRestrictedValues));
327 Map<String, DataTypeDefinition> dataTypes = Collections.singletonMap(myType.getName(), myType);
328 Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
330 final ComponentInstanceInterface componentInstanceInterface =
331 new ComponentInstanceInterface("interfaceId", interfaceDefinition);
332 Map<String, List<ComponentInstanceInterface>> componentInstancesInterfacesMap = new HashMap<>();
333 componentInstancesInterfacesMap.put(componentInstanceId, Collections.singletonList(componentInstanceInterface));
334 component.setComponentInstancesInterfaces(componentInstancesInterfacesMap);
335 componentInstance.setInterfaces(
336 (Map<String, Object>) new HashMap<>().put(componentInstanceId, interfaceDefinition));
337 component.setComponentInstances(Collections.singletonList(componentInstance));
339 when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(component));
340 when(componentValidations.getComponentInstance(component, componentInstanceId))
341 .thenReturn(Optional.of(componentInstance));
342 when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(dataTypes));
343 when(artifactTypeBusinessLogic.getArtifactTypeByUid(UniqueIdBuilder.buildArtifactTypeUid(
344 null, artifactType))).thenReturn(artifactTypeDefinitionFromCache);
346 final Optional<ComponentInstance> result = componentInterfaceOperationBusinessLogic
347 .updateComponentInstanceInterfaceOperation(componentId, componentInstanceId, interfaceDefinition,
348 ComponentTypeEnum.SERVICE, errorWrapper, false);
349 assertThat(result).isNotPresent();
350 assertTrue(errorWrapper.getInnerElement().getStatus() == 400);
351 assertTrue(errorWrapper.getInnerElement().getRequestError().getRequestError().getServiceException().getText()
352 .contains("Error: Invalid property values provided"));
356 void valueForArtifactInputSucceedsConstraintsValidation() throws BusinessLogicException {
357 final String inputType = "myType";
358 final String artifactType = "artifactType";
359 final String componentId = component.getUniqueId();
360 final String componentInstanceId = componentInstance.getUniqueId();
361 final InterfaceDefinition interfaceDefinition = new InterfaceDefinition();
362 interfaceDefinition.setUniqueId(UUID.randomUUID().toString());
363 interfaceDefinition.setType("tosca.interfaces.node.lifecycle.Standard");
364 final Map<String, OperationDataDefinition> operations = new HashMap<>();
365 final OperationDataDefinition operationDataDefinition = new OperationDataDefinition();
366 operationDataDefinition.setUniqueId(UUID.randomUUID().toString());
367 final ArtifactDataDefinition artifactDataDefinition = new ArtifactDataDefinition();
369 artifactDataDefinition.setArtifactName("EO Implementation info");
370 artifactDataDefinition.setArtifactType(artifactType);
371 PropertyDataDefinition propertyDataDefinition = new PropertyDataDefinition();
372 propertyDataDefinition.setName("input_range");
373 propertyDataDefinition.setType(inputType);
374 propertyDataDefinition.setValue("{\"input_range\": \"value2\"}");
375 artifactDataDefinition.addProperty(propertyDataDefinition);
377 operationDataDefinition.setImplementation(artifactDataDefinition);
378 operations.put("configure", operationDataDefinition);
379 interfaceDefinition.setOperations(operations );
381 DataTypeDefinition myType = new DataTypeDefinition();
382 final ArtifactTypeDefinition artifactTypeDefinitionFromCache = new ArtifactTypeDefinition();
383 artifactTypeDefinitionFromCache.setName(UniqueIdBuilder.buildArtifactTypeUid(null, artifactType));
384 myType.setName(inputType);
385 PropertyDefinition input_range = new PropertyDefinition();
386 input_range.setName("input_range");
387 input_range.setType("string");
388 PropertyConstraint constraint1 = new ValidValuesConstraint(Arrays.asList("value1", "value2", "value3"));
389 input_range.setConstraints(List.of(constraint1));
390 artifactTypeDefinitionFromCache.setProperties(List.of(input_range));
391 myType.setProperties(List.of(input_range));
392 Map<String, DataTypeDefinition> dataTypes = Collections.singletonMap(myType.getName(), myType);
393 Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
395 final ComponentInstanceInterface componentInstanceInterface =
396 new ComponentInstanceInterface("interfaceId", interfaceDefinition);
397 Map<String, List<ComponentInstanceInterface>> componentInstancesInterfacesMap = new HashMap<>();
398 componentInstancesInterfacesMap.put(componentInstanceId, Collections.singletonList(componentInstanceInterface));
399 component.setComponentInstancesInterfaces(componentInstancesInterfacesMap);
400 componentInstance.setInterfaces(
401 (Map<String, Object>) new HashMap<>().put(componentInstanceId, interfaceDefinition));
402 component.setComponentInstances(Collections.singletonList(componentInstance));
404 when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(component));
405 when(componentValidations.getComponentInstance(component, componentInstanceId))
406 .thenReturn(Optional.of(componentInstance));
407 when(toscaOperationFacade.updateComponentInstanceInterfaces(component, componentInstanceId))
408 .thenReturn(StorageOperationStatus.OK);
409 when(toscaOperationFacade
410 .updateComponentInstanceMetadataOfTopologyTemplate(any(Service.class), any(ComponentParametersView.class)))
411 .thenReturn(Either.left(component));
412 when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(dataTypes));
413 when(artifactTypeBusinessLogic.getArtifactTypeByUid(UniqueIdBuilder.buildArtifactTypeUid(
414 null, artifactType))).thenReturn(artifactTypeDefinitionFromCache);
416 final Optional<ComponentInstance> result = componentInterfaceOperationBusinessLogic
417 .updateComponentInstanceInterfaceOperation(componentId, componentInstanceId, interfaceDefinition,
418 ComponentTypeEnum.SERVICE, errorWrapper, false);
419 assertThat(result).isPresent();
423 void createComponentInstanceInterfaceOperationTest() throws BusinessLogicException {
424 final String componentId = component.getUniqueId();
425 final String componentInstanceId = componentInstance.getUniqueId();
426 final InterfaceDefinition interfaceDefinition = new InterfaceDefinition();
427 interfaceDefinition.setUniqueId(UUID.randomUUID().toString());
428 interfaceDefinition.setType("tosca.interfaces.node.lifecycle.Standard");
429 final Map<String, OperationDataDefinition> operations = new HashMap<>();
430 final OperationDataDefinition operationDataDefinition = new OperationDataDefinition();
431 operationDataDefinition.setUniqueId(UUID.randomUUID().toString());
432 final ArtifactDataDefinition artifactDataDefinition = new ArtifactDataDefinition();
433 artifactDataDefinition.setArtifactName("EO Implementation info");
434 operationDataDefinition.setImplementation(artifactDataDefinition);
435 operations.put("configure", operationDataDefinition);
436 interfaceDefinition.setOperations(operations );
438 Map<String, List<ComponentInstanceInterface>> componentInstancesInterfacesMap = new HashMap<>();
439 componentInstancesInterfacesMap.put(componentInstanceId, new ArrayList<>());
440 componentInstance.setInterfaces(
441 (Map<String, Object>) new HashMap<>().put(componentInstanceId, interfaceDefinition));
442 component.setComponentInstances(Collections.singletonList(componentInstance));
444 when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(component));
445 when(componentValidations.getComponentInstance(component, componentInstanceId))
446 .thenReturn(Optional.of(componentInstance));
447 when(graphLockOperation.lockComponent(componentId, NodeTypeEnum.Service))
448 .thenReturn(StorageOperationStatus.OK);
449 when(toscaOperationFacade.updateComponentInstanceInterfaces(component, componentInstanceId))
450 .thenReturn(StorageOperationStatus.OK);
451 when(janusGraphDao.commit()).thenReturn(JanusGraphOperationStatus.OK);
452 when(graphLockOperation.unlockComponent(componentId, NodeTypeEnum.Service))
453 .thenReturn(StorageOperationStatus.OK);
455 final Optional<ComponentInstance> result = componentInterfaceOperationBusinessLogic
456 .createComponentInstanceInterfaceOperation(componentId, componentInstanceId, interfaceDefinition,
457 ComponentTypeEnum.SERVICE, new Wrapper<>(), true);
458 assertThat(result).isPresent();
462 void createComponentInstanceInterfaceOperationTestUpdateFail() throws BusinessLogicException {
463 final String componentId = component.getUniqueId();
464 final String componentInstanceId = componentInstance.getUniqueId();
465 final InterfaceDefinition interfaceDefinition = new InterfaceDefinition();
466 interfaceDefinition.setUniqueId(UUID.randomUUID().toString());
467 interfaceDefinition.setType("tosca.interfaces.node.lifecycle.Standard");
468 final Map<String, OperationDataDefinition> operations = new HashMap<>();
469 final OperationDataDefinition operationDataDefinition = new OperationDataDefinition();
470 operationDataDefinition.setUniqueId(UUID.randomUUID().toString());
471 final ArtifactDataDefinition artifactDataDefinition = new ArtifactDataDefinition();
472 artifactDataDefinition.setArtifactName("EO Implementation info");
473 operationDataDefinition.setImplementation(artifactDataDefinition);
474 operations.put("configure", operationDataDefinition);
475 interfaceDefinition.setOperations(operations );
477 Map<String, List<ComponentInstanceInterface>> componentInstancesInterfacesMap = new HashMap<>();
478 componentInstancesInterfacesMap.put(componentInstanceId, new ArrayList<>());
479 componentInstance.setInterfaces(
480 (Map<String, Object>) new HashMap<>().put(componentInstanceId, interfaceDefinition));
481 component.setComponentInstances(Collections.singletonList(componentInstance));
483 when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(component));
484 when(componentValidations.getComponentInstance(component, componentInstanceId))
485 .thenReturn(Optional.of(componentInstance));
486 when(graphLockOperation.lockComponent(componentId, NodeTypeEnum.Service))
487 .thenReturn(StorageOperationStatus.OK);
488 when(toscaOperationFacade.updateComponentInstanceInterfaces(component, componentInstanceId))
489 .thenReturn(StorageOperationStatus.GENERAL_ERROR);
490 when(janusGraphDao.rollback()).thenReturn(JanusGraphOperationStatus.OK);
491 when(graphLockOperation.unlockComponent(componentId, NodeTypeEnum.Service))
492 .thenReturn(StorageOperationStatus.OK);
494 final Optional<ComponentInstance> result = componentInterfaceOperationBusinessLogic
495 .createComponentInstanceInterfaceOperation(componentId, componentInstanceId, interfaceDefinition,
496 ComponentTypeEnum.SERVICE, new Wrapper<>(), true);
497 assertThat(result).isEmpty();
501 void createComponentInstanceInterfaceOperationTestNoInstances() throws BusinessLogicException {
502 final String componentId = component.getUniqueId();
503 final String componentInstanceId = componentInstance.getUniqueId();
504 final InterfaceDefinition interfaceDefinition = new InterfaceDefinition();
505 interfaceDefinition.setUniqueId(UUID.randomUUID().toString());
506 interfaceDefinition.setType("tosca.interfaces.node.lifecycle.Standard");
508 component.setComponentInstances(Collections.singletonList(componentInstance));
510 when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(component));
512 final Optional<ComponentInstance> result = componentInterfaceOperationBusinessLogic
513 .createComponentInstanceInterfaceOperation(componentId, componentInstanceId, interfaceDefinition,
514 ComponentTypeEnum.SERVICE, new Wrapper<>(), true);
515 assertThat(result).isEmpty();
519 void createComponentInstanceInterfaceOperationTestNoOperations() throws BusinessLogicException {
520 final String componentId = component.getUniqueId();
521 final String componentInstanceId = componentInstance.getUniqueId();
522 final InterfaceDefinition interfaceDefinition = new InterfaceDefinition();
523 interfaceDefinition.setUniqueId(UUID.randomUUID().toString());
524 interfaceDefinition.setType("tosca.interfaces.node.lifecycle.Standard");
526 Map<String, List<ComponentInstanceInterface>> componentInstancesInterfacesMap = new HashMap<>();
527 componentInstancesInterfacesMap.put(componentInstanceId, new ArrayList<>());
528 componentInstance.setInterfaces(
529 (Map<String, Object>) new HashMap<>().put(componentInstanceId, interfaceDefinition));
530 component.setComponentInstances(Collections.singletonList(componentInstance));
532 when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(component));
533 when(componentValidations.getComponentInstance(component, componentInstanceId))
534 .thenReturn(Optional.of(componentInstance));
536 final Optional<ComponentInstance> result = componentInterfaceOperationBusinessLogic
537 .createComponentInstanceInterfaceOperation(componentId, componentInstanceId, interfaceDefinition,
538 ComponentTypeEnum.SERVICE, new Wrapper<>(), true);
539 assertThat(result).isEmpty();
542 private void initComponentData() {
544 component = new Service();
545 component.setName("MyTestService");
546 component.setUniqueId("dac65869-dfb4-40d2-aa20-084324659ec1");
548 componentInstance = new ComponentInstance();
549 componentInstance.setUniqueId("dac65869-dfb4-40d2-aa20-084324659ec1.resource0");
550 componentInstance.setOriginType(OriginTypeEnum.VFC);
551 componentInstance.setName("My VFC Instance");
553 componentFilter = new ComponentParametersView();
554 componentFilter.disableAll();
555 componentFilter.setIgnoreUsers(false);
556 componentFilter.setIgnoreComponentInstances(false);
557 componentFilter.setIgnoreInterfaces(false);
558 componentFilter.setIgnoreComponentInstancesInterfaces(false);
560 } catch (final Exception e) {
561 fail(e.getMessage());