2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2021 Nordix Foundation. 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
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.zone-instance.component.ts
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.be.components.impl;
23 import fj.data.Either;
24 import java.util.Arrays;
25 import java.util.HashMap;
26 import java.util.List;
28 import java.util.Optional;
29 import org.apache.commons.collections.CollectionUtils;
30 import org.apache.commons.collections.MapUtils;
31 import org.openecomp.sdc.be.components.impl.exceptions.BusinessLogicException;
32 import org.openecomp.sdc.be.components.validation.ComponentValidations;
33 import org.openecomp.sdc.be.dao.api.ActionStatus;
34 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
35 import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
36 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
37 import org.openecomp.sdc.be.model.Component;
38 import org.openecomp.sdc.be.model.ComponentInstance;
39 import org.openecomp.sdc.be.model.ComponentInstanceInterface;
40 import org.openecomp.sdc.be.model.ComponentParametersView;
41 import org.openecomp.sdc.be.model.InterfaceDefinition;
42 import org.openecomp.sdc.be.model.User;
43 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
44 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
45 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
46 import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation;
47 import org.openecomp.sdc.be.model.operations.api.IGroupOperation;
48 import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation;
49 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
50 import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
51 import org.openecomp.sdc.be.user.Role;
52 import org.openecomp.sdc.common.datastructure.Wrapper;
53 import org.openecomp.sdc.exception.ResponseFormat;
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
56 import org.springframework.beans.factory.annotation.Autowired;
58 @org.springframework.stereotype.Component("componentInterfaceOperationBusinessLogic")
59 public class ComponentInterfaceOperationBusinessLogic extends BaseBusinessLogic {
61 private static final Logger LOGGER = LoggerFactory.getLogger(ComponentInterfaceOperationBusinessLogic.class);
62 private final ComponentValidations componentValidations;
65 public ComponentInterfaceOperationBusinessLogic(final IElementOperation elementDao, final IGroupOperation groupOperation,
66 final IGroupInstanceOperation groupInstanceOperation,
67 final IGroupTypeOperation groupTypeOperation, final InterfaceOperation interfaceOperation,
68 final InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
69 final ArtifactsOperations artifactToscaOperation,
70 final ComponentValidations componentValidations) {
71 super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, interfaceOperation, interfaceLifecycleTypeOperation,
72 artifactToscaOperation);
73 this.componentValidations = componentValidations;
76 public Optional<ComponentInstance> updateComponentInstanceInterfaceOperation(final String componentId, final String componentInstanceId,
77 final InterfaceDefinition interfaceDefinition,
78 final ComponentTypeEnum componentTypeEnum,
79 final Wrapper<ResponseFormat> errorWrapper, final boolean shouldLock)
80 throws BusinessLogicException {
81 final Component component = getComponent(componentId);
82 final Optional<ComponentInstance> componentInstanceOptional = componentValidations.getComponentInstance(component, componentInstanceId);
83 ResponseFormat responseFormat;
84 if (componentInstanceOptional.isEmpty()) {
85 responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
86 LOGGER.debug("Failed to found component instance with id {}, error: {}", componentInstanceId, responseFormat);
87 errorWrapper.setInnerElement(responseFormat);
88 return Optional.empty();
90 Map<String, List<ComponentInstanceInterface>> componentInstancesInterfaceMap = component.getComponentInstancesInterfaces();
91 if (MapUtils.isEmpty(componentInstancesInterfaceMap)) {
92 componentInstancesInterfaceMap = new HashMap<>();
93 component.setComponentInstancesInterfaces(componentInstancesInterfaceMap);
95 final List<ComponentInstanceInterface> componentInstanceInterfaceList = componentInstancesInterfaceMap.get(componentInstanceId);
96 if (CollectionUtils.isEmpty(componentInstanceInterfaceList)) {
97 responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
98 LOGGER.debug("Failed to found component instance with id {}, error: {}", componentInstanceId, responseFormat);
99 errorWrapper.setInnerElement(responseFormat);
100 return Optional.empty();
102 final Optional<OperationDataDefinition> optionalOperationDataDefinition = interfaceDefinition.getOperations().values().stream().findFirst();
103 if (optionalOperationDataDefinition.isEmpty()) {
104 responseFormat = componentsUtils.getResponseFormat(ActionStatus.INTERFACE_OPERATION_NOT_FOUND);
105 LOGGER.debug("Failed to found interface operation on component instance with id {}, error: {}", componentInstanceId, responseFormat);
106 errorWrapper.setInnerElement(responseFormat);
107 return Optional.empty();
109 final OperationDataDefinition updatedOperationDataDefinition = optionalOperationDataDefinition.get();
110 final Optional<ComponentInstanceInterface> optionalComponentInstanceInterface = componentInstanceInterfaceList.stream().filter(
111 ci -> ci.getOperations().values().stream().anyMatch(
112 operationDataDefinition -> operationDataDefinition.getUniqueId().equalsIgnoreCase(updatedOperationDataDefinition.getUniqueId())))
114 if (optionalComponentInstanceInterface.isEmpty()) {
115 responseFormat = componentsUtils.getResponseFormat(ActionStatus.INTERFACE_NOT_FOUND_IN_COMPONENT);
117 .debug("Failed to found ComponentInstanceInterface on component instance with id {}, error: {}", componentInstanceId, responseFormat);
118 errorWrapper.setInnerElement(responseFormat);
119 return Optional.empty();
121 updateOperationDefinitionImplementation(updatedOperationDataDefinition);
122 optionalComponentInstanceInterface.get().getOperations().replace(updatedOperationDataDefinition.getName(), updatedOperationDataDefinition);
123 boolean wasLocked = false;
126 lockComponent(componentId, component, "Update Interface Operation on Component instance");
129 final StorageOperationStatus status = toscaOperationFacade.updateComponentInstanceInterfaces(component, componentInstanceId);
130 if (status != StorageOperationStatus.OK) {
131 janusGraphDao.rollback();
132 responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
133 LOGGER.error("Exception occurred when updating Component Instance Interfaces {}", responseFormat);
134 errorWrapper.setInnerElement(responseFormat);
135 return Optional.empty();
137 final ComponentParametersView componentFilter = new ComponentParametersView();
138 componentFilter.disableAll();
139 componentFilter.setIgnoreUsers(false);
140 componentFilter.setIgnoreComponentInstances(false);
141 componentFilter.setIgnoreInterfaces(false);
142 componentFilter.setIgnoreComponentInstancesInterfaces(false);
143 final Either<Component, StorageOperationStatus> operationStatusEither = toscaOperationFacade
144 .updateComponentInstanceMetadataOfTopologyTemplate(component, componentFilter);
145 if (operationStatusEither.isRight()) {
146 janusGraphDao.rollback();
147 responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
148 LOGGER.error("Exception occurred when updating Component Instance Topology template {}", responseFormat);
149 errorWrapper.setInnerElement(responseFormat);
150 return Optional.empty();
152 janusGraphDao.commit();
153 } catch (final Exception e) {
154 janusGraphDao.rollback();
155 LOGGER.error("Exception occurred when updating Interface Operation on Component Instance: {}", e.getMessage(), e);
156 responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
157 errorWrapper.setInnerElement(responseFormat);
158 throw new BusinessLogicException(responseFormat);
161 unlockComponent(component.getUniqueId(), componentTypeEnum);
164 return componentInstanceOptional;
167 public User validateUser(final String userId) {
168 final User user = userValidations.validateUserExists(userId);
169 userValidations.validateUserRole(user, Arrays.asList(Role.DESIGNER, Role.ADMIN));
173 private void unlockComponent(final String componentUniqueId, final ComponentTypeEnum componentType) {
174 graphLockOperation.unlockComponent(componentUniqueId, componentType.getNodeType());
177 private void updateOperationDefinitionImplementation(final OperationDataDefinition updatedOperationDataDefinition) {
178 final ArtifactDataDefinition artifactInfo = new ArtifactDataDefinition();
179 artifactInfo.setArtifactName(String.format("'%s'", updatedOperationDataDefinition.getImplementation().getArtifactName()));
180 updatedOperationDataDefinition.setImplementation(artifactInfo);