2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 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.impl;
23 import static java.util.stream.Collectors.joining;
24 import static java.util.stream.Collectors.toList;
25 import static java.util.stream.Collectors.toMap;
26 import static java.util.stream.Collectors.toSet;
27 import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
28 import static org.apache.commons.collections.MapUtils.isEmpty;
29 import static org.apache.commons.collections.MapUtils.isNotEmpty;
30 import static org.openecomp.sdc.be.components.impl.ImportUtils.findFirstToscaStringElement;
31 import static org.openecomp.sdc.be.components.impl.ImportUtils.getPropertyJsonStringValue;
32 import static org.openecomp.sdc.be.tosca.CsarUtils.VF_NODE_TYPE_ARTIFACTS_PATH_PATTERN;
33 import static org.openecomp.sdc.common.api.Constants.DEFAULT_GROUP_VF_MODULE;
35 import com.google.common.annotations.VisibleForTesting;
36 import fj.data.Either;
37 import java.util.ArrayList;
38 import java.util.Collection;
39 import java.util.Collections;
40 import java.util.EnumMap;
41 import java.util.HashMap;
42 import java.util.HashSet;
43 import java.util.Iterator;
44 import java.util.List;
45 import java.util.ListIterator;
47 import java.util.Map.Entry;
48 import java.util.Optional;
50 import java.util.function.Function;
51 import java.util.regex.Pattern;
52 import java.util.stream.Collectors;
53 import javax.servlet.ServletContext;
54 import org.apache.commons.codec.binary.Base64;
55 import org.apache.commons.collections.CollectionUtils;
56 import org.apache.commons.collections.MapUtils;
57 import org.apache.commons.collections4.ListUtils;
58 import org.apache.commons.lang.StringUtils;
59 import org.apache.commons.lang3.tuple.ImmutablePair;
60 import org.openecomp.sdc.be.catalog.enums.ChangeTypeEnum;
61 import org.openecomp.sdc.be.components.csar.CsarArtifactsAndGroupsBusinessLogic;
62 import org.openecomp.sdc.be.components.csar.CsarBusinessLogic;
63 import org.openecomp.sdc.be.components.csar.CsarInfo;
64 import org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic.ArtifactOperationEnum;
65 import org.openecomp.sdc.be.components.impl.artifact.ArtifactOperationInfo;
66 import org.openecomp.sdc.be.components.impl.ImportUtils.ResultStatusEnum;
67 import org.openecomp.sdc.be.components.impl.exceptions.BusinessLogicException;
68 import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
69 import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponentException;
70 import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
71 import org.openecomp.sdc.be.components.impl.utils.CINodeFilterUtils;
72 import org.openecomp.sdc.be.components.lifecycle.LifecycleBusinessLogic;
73 import org.openecomp.sdc.be.components.lifecycle.LifecycleChangeInfoWithAction;
74 import org.openecomp.sdc.be.components.lifecycle.LifecycleChangeInfoWithAction.LifecycleChanceActionEnum;
75 import org.openecomp.sdc.be.components.merge.TopologyComparator;
76 import org.openecomp.sdc.be.components.merge.property.PropertyDataValueMergeBusinessLogic;
77 import org.openecomp.sdc.be.components.merge.resource.ResourceDataMergeBusinessLogic;
78 import org.openecomp.sdc.be.components.merge.utils.MergeInstanceUtils;
79 import org.openecomp.sdc.be.components.property.PropertyConstraintsUtils;
80 import org.openecomp.sdc.be.components.validation.component.ComponentContactIdValidator;
81 import org.openecomp.sdc.be.components.validation.component.ComponentDescriptionValidator;
82 import org.openecomp.sdc.be.components.validation.component.ComponentIconValidator;
83 import org.openecomp.sdc.be.components.validation.component.ComponentNameValidator;
84 import org.openecomp.sdc.be.components.validation.component.ComponentProjectCodeValidator;
85 import org.openecomp.sdc.be.components.validation.component.ComponentTagsValidator;
86 import org.openecomp.sdc.be.components.validation.component.ComponentValidator;
87 import org.openecomp.sdc.be.config.BeEcompErrorManager;
88 import org.openecomp.sdc.be.config.BeEcompErrorManager.ErrorSeverity;
89 import org.openecomp.sdc.be.config.ConfigurationManager;
90 import org.openecomp.sdc.be.dao.api.ActionStatus;
91 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
92 import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao;
93 import org.openecomp.sdc.be.datamodel.api.HighestFilterEnum;
94 import org.openecomp.sdc.be.datamodel.utils.ArtifactUtils;
95 import org.openecomp.sdc.be.datamodel.utils.UiComponentDataConverter;
96 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
97 import org.openecomp.sdc.be.datatypes.elements.AttributeDataDefinition;
98 import org.openecomp.sdc.be.datatypes.elements.CapabilityDataDefinition;
99 import org.openecomp.sdc.be.datatypes.elements.GetInputValueDataDefinition;
100 import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
101 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
102 import org.openecomp.sdc.be.datatypes.elements.RequirementDataDefinition;
103 import org.openecomp.sdc.be.datatypes.elements.ToscaArtifactDataDefinition;
104 import org.openecomp.sdc.be.datatypes.enums.ComponentFieldsEnum;
105 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
106 import org.openecomp.sdc.be.datatypes.enums.CreatedFrom;
107 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
108 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
109 import org.openecomp.sdc.be.impl.ComponentsUtils;
110 import org.openecomp.sdc.be.impl.WebAppContextWrapper;
111 import org.openecomp.sdc.be.info.NodeTypeInfoToUpdateArtifacts;
112 import org.openecomp.sdc.be.model.ArtifactDefinition;
113 import org.openecomp.sdc.be.model.AttributeDefinition;
114 import org.openecomp.sdc.be.model.CapabilityDefinition;
115 import org.openecomp.sdc.be.model.CapabilityRequirementRelationship;
116 import org.openecomp.sdc.be.model.CapabilityTypeDefinition;
117 import org.openecomp.sdc.be.model.Component;
118 import org.openecomp.sdc.be.model.ComponentInstance;
119 import org.openecomp.sdc.be.model.ComponentInstanceInput;
120 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
121 import org.openecomp.sdc.be.model.ComponentParametersView;
122 import org.openecomp.sdc.be.model.DataTypeDefinition;
123 import org.openecomp.sdc.be.model.GroupDefinition;
124 import org.openecomp.sdc.be.model.InputDefinition;
125 import org.openecomp.sdc.be.model.InterfaceDefinition;
126 import org.openecomp.sdc.be.model.LifeCycleTransitionEnum;
127 import org.openecomp.sdc.be.model.LifecycleStateEnum;
128 import org.openecomp.sdc.be.model.NodeTypeInfo;
129 import org.openecomp.sdc.be.model.Operation;
130 import org.openecomp.sdc.be.model.ParsedToscaYamlInfo;
131 import org.openecomp.sdc.be.model.PolicyDefinition;
132 import org.openecomp.sdc.be.model.PropertyDefinition;
133 import org.openecomp.sdc.be.model.RelationshipImpl;
134 import org.openecomp.sdc.be.model.RelationshipInfo;
135 import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
136 import org.openecomp.sdc.be.model.RequirementDefinition;
137 import org.openecomp.sdc.be.model.Resource;
138 import org.openecomp.sdc.be.model.UploadArtifactInfo;
139 import org.openecomp.sdc.be.model.UploadCapInfo;
140 import org.openecomp.sdc.be.model.UploadComponentInstanceInfo;
141 import org.openecomp.sdc.be.model.UploadInfo;
142 import org.openecomp.sdc.be.model.UploadNodeFilterInfo;
143 import org.openecomp.sdc.be.model.UploadPropInfo;
144 import org.openecomp.sdc.be.model.UploadReqInfo;
145 import org.openecomp.sdc.be.model.UploadResourceInfo;
146 import org.openecomp.sdc.be.model.User;
147 import org.openecomp.sdc.be.model.cache.ApplicationDataTypeCache;
148 import org.openecomp.sdc.be.model.category.CategoryDefinition;
149 import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
150 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
151 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
152 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.exception.ToscaOperationException;
153 import org.openecomp.sdc.be.model.jsonjanusgraph.utils.ModelConverter;
154 import org.openecomp.sdc.be.model.operations.StorageException;
155 import org.openecomp.sdc.be.model.operations.api.ICapabilityTypeOperation;
156 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
157 import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation;
158 import org.openecomp.sdc.be.model.operations.api.IGroupOperation;
159 import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation;
160 import org.openecomp.sdc.be.model.operations.api.IInterfaceLifecycleOperation;
161 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
162 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
163 import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
164 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
165 import org.openecomp.sdc.be.model.operations.utils.ComponentValidationUtils;
166 import org.openecomp.sdc.be.model.tosca.ToscaPropertyType;
167 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
168 import org.openecomp.sdc.be.resources.data.auditing.model.ResourceVersionInfo;
169 import org.openecomp.sdc.be.tosca.CsarUtils;
170 import org.openecomp.sdc.be.tosca.CsarUtils.NonMetaArtifactInfo;
171 import org.openecomp.sdc.be.ui.model.UiComponentDataTransfer;
172 import org.openecomp.sdc.be.user.UserBusinessLogic;
173 import org.openecomp.sdc.be.utils.CommonBeUtils;
174 import org.openecomp.sdc.be.utils.TypeUtils;
175 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
176 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
177 import org.openecomp.sdc.common.api.Constants;
178 import org.openecomp.sdc.common.datastructure.Wrapper;
179 import org.openecomp.sdc.common.kpi.api.ASDCKpiApi;
180 import org.openecomp.sdc.common.log.elements.LoggerSupportability;
181 import org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode;
182 import org.openecomp.sdc.common.log.enums.LoggerSupportabilityActions;
183 import org.openecomp.sdc.common.log.enums.StatusCode;
184 import org.openecomp.sdc.common.log.wrappers.Logger;
185 import org.openecomp.sdc.common.util.GeneralUtility;
186 import org.openecomp.sdc.common.util.ValidationUtils;
187 import org.openecomp.sdc.exception.ResponseFormat;
188 import org.springframework.beans.factory.annotation.Autowired;
189 import org.springframework.context.annotation.Lazy;
190 import org.springframework.web.context.WebApplicationContext;
191 import org.yaml.snakeyaml.DumperOptions;
192 import org.yaml.snakeyaml.Yaml;
194 @org.springframework.stereotype.Component("resourceBusinessLogic")
195 public class ResourceBusinessLogic extends ComponentBusinessLogic {
197 private static final String DELETE_RESOURCE = "Delete Resource";
198 private static final String IN_RESOURCE = " in resource {} ";
199 private static final String PLACE_HOLDER_RESOURCE_TYPES = "validForResourceTypes";
200 public static final String INITIAL_VERSION = "0.1";
201 private static final Logger log = Logger.getLogger(ResourceBusinessLogic.class);
202 private static final String CERTIFICATION_ON_IMPORT = "certification on import";
203 private static final String CREATE_RESOURCE = "Create Resource";
204 private static final String VALIDATE_DERIVED_BEFORE_UPDATE = "validate derived before update";
205 private static final String CATEGORY_IS_EMPTY = "Resource category is empty";
206 private static final String CREATE_RESOURCE_VALIDATE_CAPABILITY_TYPES = "Create Resource - validateCapabilityTypesCreate";
207 private static final String COMPONENT_INSTANCE_WITH_NAME = "component instance with name ";
208 private static final String COMPONENT_INSTANCE_WITH_NAME_IN_RESOURCE = "component instance with name {} in resource {} ";
209 public LoggerSupportability loggerSupportability=LoggerSupportability.getLogger(ResourceBusinessLogic.class.getName());
212 private IInterfaceLifecycleOperation interfaceTypeOperation;
213 private LifecycleBusinessLogic lifecycleBusinessLogic;
215 private final ComponentInstanceBusinessLogic componentInstanceBusinessLogic;
216 private final ResourceImportManager resourceImportManager;
217 private final InputsBusinessLogic inputsBusinessLogic;
218 private final CompositionBusinessLogic compositionBusinessLogic;
219 private final ResourceDataMergeBusinessLogic resourceDataMergeBusinessLogic;
220 private final CsarArtifactsAndGroupsBusinessLogic csarArtifactsAndGroupsBusinessLogic;
221 private final MergeInstanceUtils mergeInstanceUtils;
222 private final UiComponentDataConverter uiComponentDataConverter;
223 private final CsarBusinessLogic csarBusinessLogic;
224 private final PropertyBusinessLogic propertyBusinessLogic;
225 private final PolicyBusinessLogic policyBusinessLogic;
228 public ResourceBusinessLogic(IElementOperation elementDao,
229 IGroupOperation groupOperation,
230 IGroupInstanceOperation groupInstanceOperation,
231 IGroupTypeOperation groupTypeOperation,
232 GroupBusinessLogic groupBusinessLogic,
233 InterfaceOperation interfaceOperation,
234 InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
235 ArtifactsBusinessLogic artifactsBusinessLogic,
236 ComponentInstanceBusinessLogic componentInstanceBusinessLogic, @Lazy ResourceImportManager resourceImportManager,
237 InputsBusinessLogic inputsBusinessLogic, CompositionBusinessLogic compositionBusinessLogic,
238 ResourceDataMergeBusinessLogic resourceDataMergeBusinessLogic,
239 CsarArtifactsAndGroupsBusinessLogic csarArtifactsAndGroupsBusinessLogic, MergeInstanceUtils mergeInstanceUtils,
240 UiComponentDataConverter uiComponentDataConverter, CsarBusinessLogic csarBusinessLogic,
241 ArtifactsOperations artifactToscaOperation, PropertyBusinessLogic propertyBusinessLogic,
242 ComponentContactIdValidator componentContactIdValidator,
243 ComponentNameValidator componentNameValidator, ComponentTagsValidator componentTagsValidator,
244 ComponentValidator componentValidator,
245 ComponentIconValidator componentIconValidator,
246 ComponentProjectCodeValidator componentProjectCodeValidator,
247 ComponentDescriptionValidator componentDescriptionValidator, PolicyBusinessLogic policyBusinessLogic) {
248 super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, groupBusinessLogic,
249 interfaceOperation, interfaceLifecycleTypeOperation, artifactsBusinessLogic, artifactToscaOperation,
250 componentContactIdValidator, componentNameValidator, componentTagsValidator, componentValidator,
251 componentIconValidator, componentProjectCodeValidator, componentDescriptionValidator);
252 this.componentInstanceBusinessLogic = componentInstanceBusinessLogic;
253 this.resourceImportManager = resourceImportManager;
254 this.inputsBusinessLogic = inputsBusinessLogic;
255 this.compositionBusinessLogic = compositionBusinessLogic;
256 this.resourceDataMergeBusinessLogic = resourceDataMergeBusinessLogic;
257 this.csarArtifactsAndGroupsBusinessLogic = csarArtifactsAndGroupsBusinessLogic;
258 this.mergeInstanceUtils = mergeInstanceUtils;
259 this.uiComponentDataConverter = uiComponentDataConverter;
260 this.csarBusinessLogic = csarBusinessLogic;
261 this.propertyBusinessLogic = propertyBusinessLogic;
262 this.policyBusinessLogic = policyBusinessLogic;
266 private ICapabilityTypeOperation capabilityTypeOperation;
269 private TopologyComparator topologyComparator;
272 private ComponentValidator componentValidator;
275 private PropertyDataValueMergeBusinessLogic propertyDataValueMergeBusinessLogic;
278 private SoftwareInformationBusinessLogic softwareInformationBusinessLogic;
280 public LifecycleBusinessLogic getLifecycleBusinessLogic() {
281 return lifecycleBusinessLogic;
285 public void setLifecycleManager(LifecycleBusinessLogic lifecycleBusinessLogic) {
286 this.lifecycleBusinessLogic = lifecycleBusinessLogic;
290 protected void setComponentValidator(ComponentValidator componentValidator) {
291 this.componentValidator = componentValidator;
294 public IElementOperation getElementDao() {
298 public void setElementDao(IElementOperation elementDao) {
299 this.elementDao = elementDao;
302 public UserBusinessLogic getUserAdmin() {
303 return this.userAdmin;
307 public void setUserAdmin(UserBusinessLogic userAdmin) {
308 this.userAdmin = userAdmin;
311 public ComponentsUtils getComponentsUtils() {
312 return this.componentsUtils;
316 public void setComponentsUtils(ComponentsUtils componentsUtils) {
317 this.componentsUtils = componentsUtils;
320 public ArtifactsBusinessLogic getArtifactsManager() {
321 return artifactsBusinessLogic;
324 public void setArtifactsManager(ArtifactsBusinessLogic artifactsManager) {
325 this.artifactsBusinessLogic = artifactsManager;
328 public ApplicationDataTypeCache getApplicationDataTypeCache() {
329 return applicationDataTypeCache;
333 public void setApplicationDataTypeCache(ApplicationDataTypeCache applicationDataTypeCache) {
334 this.applicationDataTypeCache = applicationDataTypeCache;
338 public void setInterfaceTypeOperation(IInterfaceLifecycleOperation interfaceTypeOperation) {
339 this.interfaceTypeOperation = interfaceTypeOperation;
343 * the method returns a list of all the resources that are certified, the
344 * returned resources are only abstract or only none abstract according to
352 public List<Resource> getAllCertifiedResources(boolean getAbstract, HighestFilterEnum highestFilter,
354 User user = validateUserExists(userId);
355 Boolean isHighest = null;
356 switch (highestFilter) {
362 case NON_HIGHEST_ONLY:
368 Either<List<Resource>, StorageOperationStatus> getResponse = toscaOperationFacade
369 .getAllCertifiedResources(getAbstract, isHighest);
371 if (getResponse.isRight()) {
372 throw new StorageException(getResponse.right()
376 return getResponse.left()
380 public Either<Map<String, Boolean>, ResponseFormat> validateResourceNameExists(String resourceName,
381 ResourceTypeEnum resourceTypeEnum, String userId) {
383 validateUserExists(userId);
385 Either<Boolean, StorageOperationStatus> dataModelResponse = toscaOperationFacade
386 .validateComponentNameUniqueness(resourceName, resourceTypeEnum, ComponentTypeEnum.RESOURCE);
388 janusGraphDao.commit();
390 if (dataModelResponse.isLeft()) {
391 Map<String, Boolean> result = new HashMap<>();
392 result.put("isValid", dataModelResponse.left()
394 log.debug("validation was successfully performed.");
395 return Either.left(result);
398 ResponseFormat responseFormat = componentsUtils
399 .getResponseFormat(componentsUtils.convertFromStorageResponse(dataModelResponse.right()
402 return Either.right(responseFormat);
405 public Resource createResource(Resource resource, AuditingActionEnum auditingAction, User user,
406 Map<String, byte[]> csarUIPayload, String payloadName) {
407 validateResourceBeforeCreate(resource, user, false);
408 String csarUUID = payloadName == null ? resource.getCsarUUID() : payloadName;
409 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RESOURCE,resource.getComponentMetadataForSupportLog(), StatusCode.STARTED,"Starting to create resource from CSAR by user {} ", user.getUserId());
410 if (StringUtils.isNotEmpty(csarUUID)) {
411 csarBusinessLogic.validateCsarBeforeCreate(resource, auditingAction, user, csarUUID);
412 log.debug("CsarUUID is {} - going to create resource from CSAR", csarUUID);
414 Resource createResourceFromCsar = createResourceFromCsar(resource, user, csarUIPayload, csarUUID);
415 return updateCatalog(createResourceFromCsar, ChangeTypeEnum.LIFECYCLE).left()
416 .map(r -> (Resource) r)
421 final Resource createResourceByDao = createResourceByDao(resource, user, auditingAction, false, false);
422 return updateCatalog(createResourceByDao, ChangeTypeEnum.LIFECYCLE).left()
423 .map(r -> (Resource) r)
428 public Resource validateAndUpdateResourceFromCsar(Resource resource, User user, Map<String, byte[]> csarUIPayload,
429 String payloadName, String resourceUniqueId) {
430 String csarUUID = payloadName;
431 String csarVersion = null;
432 Resource updatedResource = null;
433 if (payloadName == null) {
434 csarUUID = resource.getCsarUUID();
435 csarVersion = resource.getCsarVersion();
437 if (csarUUID != null && !csarUUID.isEmpty()) {
438 Resource oldResource = getResourceByUniqueId(resourceUniqueId);
439 validateCsarUuidMatching(oldResource, resource, csarUUID, resourceUniqueId, user);
440 validateCsarIsNotAlreadyUsed(oldResource, resource, csarUUID, user);
441 if (oldResource != null && ValidationUtils.hasBeenCertified(oldResource.getVersion())) {
442 overrideImmutableMetadata(oldResource, resource);
444 validateResourceBeforeCreate(resource, user, false);
445 String oldCsarVersion = oldResource != null ? oldResource.getCsarVersion() : null;
446 log.debug("CsarUUID is {} - going to update resource with UniqueId {} from CSAR", csarUUID,
448 // (on boarding flow): If the update includes same csarUUID and
449 // same csarVersion as already in the VF - no need to import the
450 // csar (do only metadata changes if there are).
451 if (csarVersion != null && oldCsarVersion != null && oldCsarVersion.equals(csarVersion)) {
452 updatedResource = updateResourceMetadata(resourceUniqueId, resource, oldResource, user, false);
454 updatedResource = updateResourceFromCsar(oldResource, resource, user,
455 AuditingActionEnum.UPDATE_RESOURCE_METADATA, false, csarUIPayload, csarUUID);
458 log.debug("Failed to update resource {}, csarUUID or payload name is missing", resource.getSystemName());
459 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.MISSING_CSAR_UUID,
461 componentsUtils.auditResource(errorResponse, user, resource, AuditingActionEnum.CREATE_RESOURCE);
462 throw new ByActionStatusComponentException(ActionStatus.MISSING_CSAR_UUID, resource.getName());
464 return updatedResource;
467 private void validateCsarIsNotAlreadyUsed(Resource oldResource, Resource resource, String csarUUID, User user) {
468 // (on boarding flow): If the update includes a csarUUID: verify this
469 // csarUUID is not in use by another VF, If it is - use same error as
471 // "Error: The VSP with UUID %1 was already imported for VF %2. Please
472 // select another or update the existing VF." %1 - csarUUID, %2 - VF
474 Either<Resource, StorageOperationStatus> resourceLinkedToCsarRes = toscaOperationFacade
475 .getLatestComponentByCsarOrName(ComponentTypeEnum.RESOURCE, csarUUID, resource.getSystemName());
476 if (resourceLinkedToCsarRes.isRight()) {
477 if (StorageOperationStatus.NOT_FOUND != resourceLinkedToCsarRes.right().value()) {
478 log.debug("Failed to find previous resource by CSAR {} and system name {}", csarUUID,
479 resource.getSystemName());
480 throw new StorageException(resourceLinkedToCsarRes.right()
483 } else if (!resourceLinkedToCsarRes.left()
486 .equals(oldResource.getUniqueId())
487 && !resourceLinkedToCsarRes.left()
490 .equals(oldResource.getName())) {
491 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.VSP_ALREADY_EXISTS, csarUUID,
492 resourceLinkedToCsarRes.left()
495 componentsUtils.auditResource(errorResponse, user, resource, AuditingActionEnum.UPDATE_RESOURCE_METADATA);
496 throw new ByActionStatusComponentException(ActionStatus.VSP_ALREADY_EXISTS, csarUUID, resourceLinkedToCsarRes.left()
502 private void validateCsarUuidMatching(Resource resource, Resource oldResource, String csarUUID,
503 String resourceUniqueId, User user) {
504 // (on boarding flow): If the update includes csarUUID which is
505 // different from the csarUUID of the VF - fail with
506 // error: "Error: Resource %1 cannot be updated using since it is linked
507 // to a different VSP" %1 - VF name
508 String oldCsarUUID = oldResource.getCsarUUID();
509 if (oldCsarUUID != null && !oldCsarUUID.isEmpty() && !csarUUID.equals(oldCsarUUID)) {
511 "Failed to update resource with UniqueId {} using Csar {}, since the resource is linked to a different VSP {}",
512 resourceUniqueId, csarUUID, oldCsarUUID);
513 ResponseFormat errorResponse = componentsUtils.getResponseFormat(
514 ActionStatus.RESOURCE_LINKED_TO_DIFFERENT_VSP, resource.getName(), csarUUID, oldCsarUUID);
515 componentsUtils.auditResource(errorResponse, user, resource, AuditingActionEnum.UPDATE_RESOURCE_METADATA);
516 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_LINKED_TO_DIFFERENT_VSP, resource.getName(), csarUUID,
521 private Resource getResourceByUniqueId(String resourceUniqueId) {
522 Either<Resource, StorageOperationStatus> oldResourceRes = toscaOperationFacade
523 .getToscaFullElement(resourceUniqueId);
524 if (oldResourceRes.isRight()) {
525 log.debug("Failed to find previous resource by UniqueId {}, status: {}", resourceUniqueId,
526 oldResourceRes.right()
528 throw new StorageException(oldResourceRes.right()
531 return oldResourceRes.left()
535 private void overrideImmutableMetadata(Resource oldResource, Resource resource) {
536 resource.setName(oldResource.getName());
537 resource.setIcon(oldResource.getIcon());
538 resource.setTags(oldResource.getTags());
539 resource.setCategories(oldResource.getCategories());
540 resource.setDerivedFrom(oldResource.getDerivedFrom());
543 private Resource updateResourceFromCsar(Resource oldResource, Resource newResource, User user,
544 AuditingActionEnum updateResource, boolean inTransaction, Map<String, byte[]> csarUIPayload,
546 Resource updatedResource = null;
547 validateLifecycleState(oldResource, user);
548 String lockedResourceId = oldResource.getUniqueId();
549 List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
550 CsarInfo csarInfo = csarBusinessLogic.getCsarInfo(newResource, oldResource, user, csarUIPayload, csarUUID);
551 lockComponent(lockedResourceId, oldResource, "update Resource From Csar");
553 Map<String, NodeTypeInfo> nodeTypesInfo = csarInfo.extractNodeTypesInfo();
555 Either<Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>>, ResponseFormat> findNodeTypesArtifactsToHandleRes = findNodeTypesArtifactsToHandle(
556 nodeTypesInfo, csarInfo, oldResource);
557 if (findNodeTypesArtifactsToHandleRes.isRight()) {
558 log.debug("failed to find node types for update with artifacts during import csar {}. ",
559 csarInfo.getCsarUUID());
560 throw new ByResponseFormatComponentException(findNodeTypesArtifactsToHandleRes.right()
563 Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = findNodeTypesArtifactsToHandleRes
567 updatedResource = updateResourceFromYaml(oldResource, newResource, updateResource, createdArtifacts,
568 csarInfo.getMainTemplateName(), csarInfo.getMainTemplateContent(), csarInfo, nodeTypesInfo,
569 nodeTypesArtifactsToHandle, null, false);
571 } catch (ComponentException | StorageException e) {
572 rollback(inTransaction, newResource, createdArtifacts, null);
576 janusGraphDao.commit();
577 log.debug("unlock resource {}", lockedResourceId);
578 graphLockOperation.unlockComponent(lockedResourceId, NodeTypeEnum.Resource);
580 return updatedResource;
584 private void validateLifecycleState(Resource oldResource, User user) {
585 if (LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT == oldResource.getLifecycleState()
586 && !oldResource.getLastUpdaterUserId()
587 .equals(user.getUserId())) {
589 "#validateLifecycleState - Current user is not last updater, last updater userId: {}, current user userId: {}",
590 oldResource.getLastUpdaterUserId(), user.getUserId());
591 throw new ByActionStatusComponentException(ActionStatus.RESTRICTED_OPERATION);
595 private Resource updateResourceFromYaml(Resource oldResource, Resource newResource, AuditingActionEnum actionEnum,
596 List<ArtifactDefinition> createdArtifacts, String yamlFileName, String yamlFileContent, CsarInfo csarInfo,
597 Map<String, NodeTypeInfo> nodeTypesInfo,
598 Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle,
599 String nodeName, boolean isNested) {
600 boolean inTransaction = true;
601 boolean shouldLock = false;
602 Resource preparedResource = null;
603 ParsedToscaYamlInfo uploadComponentInstanceInfoMap;
605 uploadComponentInstanceInfoMap = csarBusinessLogic.getParsedToscaYamlInfo(yamlFileContent, yamlFileName,
606 nodeTypesInfo, csarInfo, nodeName);
607 Map<String, UploadComponentInstanceInfo> instances = uploadComponentInstanceInfoMap.getInstances();
608 if (MapUtils.isEmpty(instances) && newResource.getResourceType() != ResourceTypeEnum.PNF) {
609 throw new ByActionStatusComponentException(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlFileName);
611 preparedResource = updateExistingResourceByImport(newResource, oldResource, csarInfo.getModifier(),
612 inTransaction, shouldLock, isNested).left;
613 log.trace("YAML topology file found in CSAR, file name: {}, contents: {}", yamlFileName, yamlFileContent);
614 handleResourceGenericType(preparedResource);
615 handleNodeTypes(yamlFileName, preparedResource, yamlFileContent, shouldLock, nodeTypesArtifactsToHandle,
616 createdArtifacts, nodeTypesInfo, csarInfo, nodeName);
617 preparedResource = createInputsOnResource(preparedResource, uploadComponentInstanceInfoMap.getInputs());
618 Map<String, Resource> existingNodeTypesByResourceNames = new HashMap<>();
619 preparedResource = createResourceInstances(yamlFileName, preparedResource, oldResource, instances, csarInfo.getCreatedNodes(), existingNodeTypesByResourceNames);
620 preparedResource = createResourceInstancesRelations(csarInfo.getModifier(), yamlFileName, preparedResource, oldResource, instances, existingNodeTypesByResourceNames);
621 } catch (ComponentException e) {
622 ResponseFormat responseFormat = e.getResponseFormat() == null
623 ? componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams()) : e.getResponseFormat();
624 log.debug("#updateResourceFromYaml - failed to update newResource from yaml {} .The error is {}", yamlFileName,
626 componentsUtils.auditResource(responseFormat, csarInfo.getModifier(),
627 preparedResource == null ? oldResource : preparedResource, actionEnum);
629 } catch (StorageException e) {
630 ResponseFormat responseFormat = componentsUtils
631 .getResponseFormat(componentsUtils.convertFromStorageResponse(e.getStorageOperationStatus()));
632 log.debug("#updateResourceFromYaml - failed to update newResource from yaml {} .The error is {}", yamlFileName,
634 componentsUtils.auditResource(responseFormat, csarInfo.getModifier(),
635 preparedResource == null ? oldResource : preparedResource, actionEnum);
638 Either<Map<String, GroupDefinition>, ResponseFormat> validateUpdateVfGroupNamesRes = groupBusinessLogic
639 .validateUpdateVfGroupNames(uploadComponentInstanceInfoMap.getGroups(),
640 preparedResource.getSystemName());
641 if (validateUpdateVfGroupNamesRes.isRight()) {
643 throw new ByResponseFormatComponentException(validateUpdateVfGroupNamesRes.right()
646 // add groups to newResource
647 Map<String, GroupDefinition> groups;
649 if (!validateUpdateVfGroupNamesRes.left()
652 groups = validateUpdateVfGroupNamesRes.left()
655 groups = uploadComponentInstanceInfoMap.getGroups();
657 handleGroupsProperties(preparedResource, groups);
658 Either<Boolean, ActionStatus> isTopologyChanged = topologyComparator.isTopologyChanged(oldResource, preparedResource);
660 preparedResource = updateGroupsOnResource(preparedResource, groups);
662 NodeTypeInfoToUpdateArtifacts nodeTypeInfoToUpdateArtifacts = new NodeTypeInfoToUpdateArtifacts(nodeName,
663 nodeTypesArtifactsToHandle);
665 Either<Resource, ResponseFormat> updateArtifactsEither = createOrUpdateArtifacts(ArtifactOperationEnum.UPDATE,
666 createdArtifacts, yamlFileName, csarInfo, preparedResource, nodeTypeInfoToUpdateArtifacts,
667 inTransaction, shouldLock);
668 if (updateArtifactsEither.isRight()) {
669 log.debug("failed to update artifacts {}", updateArtifactsEither.right()
671 throw new ByResponseFormatComponentException(updateArtifactsEither.right()
674 preparedResource = getResourceWithGroups(updateArtifactsEither.left()
678 updateGroupsName(oldResource, preparedResource, isTopologyChanged.left().value());
679 updateResourceInstancesNames(oldResource, csarInfo, preparedResource, isTopologyChanged.left().value());
681 final String preparedResourceId = preparedResource != null ? preparedResource.getUniqueId() : "";
682 preparedResource = getResourceWithGroups(preparedResourceId);
684 updateVolumeGroup(preparedResource);
686 ActionStatus mergingPropsAndInputsStatus = resourceDataMergeBusinessLogic.mergeResourceEntities(oldResource, preparedResource);
687 if (mergingPropsAndInputsStatus != ActionStatus.OK) {
688 ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(mergingPropsAndInputsStatus,
690 throw new ByResponseFormatComponentException(responseFormat);
692 compositionBusinessLogic.setPositionsForComponentInstances(preparedResource, csarInfo.getModifier()
694 return preparedResource;
697 protected void updateVolumeGroup(Resource preparedResource) {
698 List<GroupDefinition> groups = preparedResource.safeGetGroups();
699 for (GroupDefinition group : groups) {
700 Map<String, ArtifactDefinition> createdNewArtifacts = preparedResource.getDeploymentArtifacts();
701 if (DEFAULT_GROUP_VF_MODULE.equals(group.getType())) {
702 List<PropertyDataDefinition> volumePropList = group.getProperties().stream().filter(p -> "volume_group".equals(p.getName())).collect(Collectors.toList());
703 if (!volumePropList.isEmpty()) {
704 PropertyDataDefinition volumeProp = volumePropList.get(0);
705 if (volumeProp != null) {
706 boolean isVolumeGroup = isVolumeGroup(group.getArtifacts(), new ArrayList<>(createdNewArtifacts.values()));
708 if (!volumePropList.get(0).getValue().equals(String.valueOf(isVolumeGroup))) {
709 volumeProp.setValue(String.valueOf(isVolumeGroup));
710 volumeProp.setDefaultValue(String.valueOf(isVolumeGroup));
718 private void updateGroupsName(Resource oldResource, Resource preparedResource, boolean isTopologyChanged) {
719 if (oldResource == null || preparedResource == null) {
720 log.debug("Failed to update groups name : oldResource or preparedResource is null");
721 } else if (CollectionUtils.isNotEmpty(oldResource.getGroups())
722 && CollectionUtils.isNotEmpty(preparedResource.getGroups())) {
723 Map<String, String> oldGroups = oldResource.getGroups()
725 .collect(toMap(GroupDataDefinition::getInvariantName, GroupDataDefinition::getName));
727 List<GroupDefinition> updatedGroups = preparedResource.getGroups()
729 .filter(group -> oldGroups.containsKey(group.getInvariantName()) && !group.getName()
730 .equals(oldGroups.get(group.getInvariantName())))
733 if (CollectionUtils.isNotEmpty(updatedGroups)) {
734 if (isTopologyChanged) {
735 updatedGroups.stream().filter(group -> !group.isVspOriginated())
736 .forEach(group -> group.setName(oldGroups.get(group.getInvariantName())));
738 updatedGroups.forEach(group -> group.setName(oldGroups.get(group.getInvariantName())));
740 groupBusinessLogic.updateGroups(preparedResource, updatedGroups, false);
745 private void updateResourceInstancesNames(Resource oldResource, CsarInfo csarInfo, Resource preparedResource,
746 boolean isTopologyChanged) {
747 if (oldResource == null || preparedResource == null) {
748 log.debug("Failed to update resource instances names : oldResource or preparedResource is null");
750 if (CollectionUtils.isNotEmpty(oldResource.getComponentInstances())) {
751 Map<String, String> oldInstances = oldResource.getComponentInstances()
753 .collect(toMap(ComponentInstance::getInvariantName, ComponentInstance::getName));
754 List<ComponentInstance> updatedInstances = preparedResource.getComponentInstances()
756 .filter(i -> oldInstances.containsKey(i.getInvariantName()) && !i.getName()
757 .equals(oldInstances.get(i.getInvariantName())))
759 if (CollectionUtils.isNotEmpty(updatedInstances)) {
760 if (isTopologyChanged) {
761 updatedInstances.stream().filter(i -> !i.isCreatedFromCsar())
762 .forEach(i -> i.setName(oldInstances.get(i.getInvariantName())));
764 updatedInstances.forEach(i -> i.setName(oldInstances.get(i.getInvariantName())));
769 componentInstanceBusinessLogic.updateComponentInstance(ComponentTypeEnum.RESOURCE_PARAM_NAME,
770 null, preparedResource.getUniqueId(), csarInfo.getModifier()
772 preparedResource.getComponentInstances(), false);
776 private Either<Resource, ResponseFormat> createOrUpdateArtifacts(ArtifactOperationEnum operation,
777 List<ArtifactDefinition> createdArtifacts, String yamlFileName, CsarInfo csarInfo,
778 Resource preparedResource, NodeTypeInfoToUpdateArtifacts nodeTypeInfoToUpdateArtifacts,
779 boolean inTransaction, boolean shouldLock) {
781 String nodeName = nodeTypeInfoToUpdateArtifacts.getNodeName();
782 Resource resource = preparedResource;
784 Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = nodeTypeInfoToUpdateArtifacts
785 .getNodeTypesArtifactsToHandle();
786 if (preparedResource.getResourceType() == ResourceTypeEnum.CVFC) {
787 if (nodeName != null && nodeTypesArtifactsToHandle.get(nodeName) != null
788 && !nodeTypesArtifactsToHandle.get(nodeName)
790 Either<List<ArtifactDefinition>, ResponseFormat> handleNodeTypeArtifactsRes = handleNodeTypeArtifacts(
791 preparedResource, nodeTypesArtifactsToHandle.get(nodeName), createdArtifacts,
792 csarInfo.getModifier(), inTransaction, true);
793 if (handleNodeTypeArtifactsRes.isRight()) {
794 return Either.right(handleNodeTypeArtifactsRes.right()
799 Either<Resource, ResponseFormat> createdCsarArtifactsEither = handleVfCsarArtifacts(preparedResource,
800 csarInfo, createdArtifacts,
801 new ArtifactOperationInfo(false, false, operation), shouldLock,
803 log.trace("************* Finished to add artifacts from yaml {}", yamlFileName);
804 if (createdCsarArtifactsEither.isRight()) {
805 return createdCsarArtifactsEither;
808 resource = createdCsarArtifactsEither.left()
811 return Either.left(resource);
814 private Resource handleResourceGenericType(Resource resource) {
815 Resource genericResource = fetchAndSetDerivedFromGenericType(resource);
816 if (resource.shouldGenerateInputs()) {
817 generateAndAddInputsFromGenericTypeProperties(resource, genericResource);
819 return genericResource;
822 private Either<Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>>, ResponseFormat> findNodeTypesArtifactsToHandle(
823 final Map<String, NodeTypeInfo> nodeTypesInfo, final CsarInfo csarInfo, final Resource oldResource) {
825 final Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = new HashMap<>();
826 Either<Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>>, ResponseFormat>
827 nodeTypesArtifactsToHandleRes = Either.left(nodeTypesArtifactsToHandle);
830 final Map<String, List<ArtifactDefinition>> extractedVfcsArtifacts = CsarUtils
831 .extractVfcsArtifactsFromCsar(csarInfo.getCsar());
832 final Map<String, ImmutablePair<String, String>> extractedVfcToscaNames = extractVfcToscaNames(
833 nodeTypesInfo, oldResource.getName(), csarInfo);
834 log.debug("Going to fetch node types for resource with name {} during import csar with UUID {}. ",
835 oldResource.getName(), csarInfo.getCsarUUID());
836 extractedVfcToscaNames.forEach((namespace, vfcToscaNames) -> findAddNodeTypeArtifactsToHandle(csarInfo,
837 nodeTypesArtifactsToHandle, oldResource, extractedVfcsArtifacts, namespace, vfcToscaNames));
838 } catch (Exception e) {
839 final ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
840 nodeTypesArtifactsToHandleRes = Either.right(responseFormat);
841 log.debug("Exception occurred when findNodeTypesUpdatedArtifacts, error is:{}", e.getMessage(), e);
843 return nodeTypesArtifactsToHandleRes;
846 private void findAddNodeTypeArtifactsToHandle(CsarInfo csarInfo,
847 Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle,
848 Resource resource, Map<String, List<ArtifactDefinition>> extractedVfcsArtifacts, String namespace,
849 ImmutablePair<String, String> vfcToscaNames) {
851 EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>> curNodeTypeArtifactsToHandle = null;
852 log.debug("Going to fetch node type with tosca name {}. ", vfcToscaNames.getLeft());
853 Resource curNodeType = findVfcResource(csarInfo, resource, vfcToscaNames.getLeft(), vfcToscaNames.getRight(),
855 if (!isEmpty(extractedVfcsArtifacts)) {
856 List<ArtifactDefinition> currArtifacts = new ArrayList<>();
857 if (extractedVfcsArtifacts.containsKey(namespace)) {
858 handleAndAddExtractedVfcsArtifacts(currArtifacts, extractedVfcsArtifacts.get(namespace));
860 curNodeTypeArtifactsToHandle = findNodeTypeArtifactsToHandle(curNodeType, currArtifacts);
861 } else if (curNodeType != null) {
862 // delete all artifacts if have not received artifacts from
864 curNodeTypeArtifactsToHandle = new EnumMap<>(ArtifactOperationEnum.class);
865 List<ArtifactDefinition> artifactsToDelete = new ArrayList<>();
866 // delete all informational artifacts
867 artifactsToDelete.addAll(curNodeType.getArtifacts()
870 .filter(a -> a.getArtifactGroupType() == ArtifactGroupTypeEnum.INFORMATIONAL)
872 // delete all deployment artifacts
873 artifactsToDelete.addAll(curNodeType.getDeploymentArtifacts()
875 if (!artifactsToDelete.isEmpty()) {
876 curNodeTypeArtifactsToHandle.put(ArtifactOperationEnum.DELETE, artifactsToDelete);
879 if (isNotEmpty(curNodeTypeArtifactsToHandle)) {
880 nodeTypesArtifactsToHandle.put(namespace, curNodeTypeArtifactsToHandle);
884 private Resource findVfcResource(CsarInfo csarInfo, Resource resource, String currVfcToscaName,
885 String previousVfcToscaName, StorageOperationStatus status) {
886 if (status != null && status != StorageOperationStatus.NOT_FOUND) {
887 log.debug("Error occurred during fetching node type with tosca name {}, error: {}", currVfcToscaName,
889 ResponseFormat responseFormat = componentsUtils
890 .getResponseFormat(componentsUtils.convertFromStorageResponse(status), csarInfo.getCsarUUID());
891 componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), resource,
892 AuditingActionEnum.CREATE_RESOURCE);
893 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(status), csarInfo.getCsarUUID());
894 } else if (StringUtils.isNotEmpty(currVfcToscaName)) {
895 return (Resource) toscaOperationFacade.getLatestByToscaResourceName(currVfcToscaName)
897 .on(st -> findVfcResource(csarInfo, resource, previousVfcToscaName, null, st));
902 private EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>> findNodeTypeArtifactsToHandle(Resource curNodeType,
903 List<ArtifactDefinition> extractedArtifacts) {
905 EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle = null;
907 List<ArtifactDefinition> artifactsToUpload = new ArrayList<>(extractedArtifacts);
908 List<ArtifactDefinition> artifactsToUpdate = new ArrayList<>();
909 List<ArtifactDefinition> artifactsToDelete = new ArrayList<>();
910 processExistingNodeTypeArtifacts(extractedArtifacts, artifactsToUpload, artifactsToUpdate,
911 artifactsToDelete, collectExistingArtifacts(curNodeType));
912 nodeTypeArtifactsToHandle = putFoundArtifacts(artifactsToUpload, artifactsToUpdate, artifactsToDelete);
913 } catch (Exception e) {
914 log.debug("Exception occurred when findNodeTypeArtifactsToHandle, error is:{}", e.getMessage(), e);
915 throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR);
917 return nodeTypeArtifactsToHandle;
920 private EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>> putFoundArtifacts(
921 List<ArtifactDefinition> artifactsToUpload, List<ArtifactDefinition> artifactsToUpdate,
922 List<ArtifactDefinition> artifactsToDelete) {
923 EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle = null;
924 if (!artifactsToUpload.isEmpty() || !artifactsToUpdate.isEmpty() || !artifactsToDelete.isEmpty()) {
925 nodeTypeArtifactsToHandle = new EnumMap<>(ArtifactOperationEnum.class);
926 if (!artifactsToUpload.isEmpty()) {
927 nodeTypeArtifactsToHandle.put(ArtifactOperationEnum.CREATE, artifactsToUpload);
929 if (!artifactsToUpdate.isEmpty()) {
930 nodeTypeArtifactsToHandle.put(ArtifactOperationEnum.UPDATE, artifactsToUpdate);
932 if (!artifactsToDelete.isEmpty()) {
933 nodeTypeArtifactsToHandle.put(ArtifactOperationEnum.DELETE, artifactsToDelete);
936 return nodeTypeArtifactsToHandle;
939 private void processExistingNodeTypeArtifacts(List<ArtifactDefinition> extractedArtifacts,
940 List<ArtifactDefinition> artifactsToUpload, List<ArtifactDefinition> artifactsToUpdate,
941 List<ArtifactDefinition> artifactsToDelete, Map<String, ArtifactDefinition> existingArtifacts) {
942 if (!existingArtifacts.isEmpty()) {
943 extractedArtifacts.stream()
944 .forEach(a -> processNodeTypeArtifact(artifactsToUpload, artifactsToUpdate, existingArtifacts, a));
945 artifactsToDelete.addAll(existingArtifacts.values());
949 private void processNodeTypeArtifact(List<ArtifactDefinition> artifactsToUpload,
950 List<ArtifactDefinition> artifactsToUpdate, Map<String, ArtifactDefinition> existingArtifacts,
951 ArtifactDefinition currNewArtifact) {
952 Optional<ArtifactDefinition> foundArtifact = existingArtifacts.values()
954 .filter(a -> a.getArtifactName()
955 .equals(currNewArtifact.getArtifactName()))
957 if (foundArtifact.isPresent()) {
958 if (foundArtifact.get()
960 .equals(currNewArtifact.getArtifactType())) {
961 updateFoundArtifact(artifactsToUpdate, currNewArtifact, foundArtifact.get());
962 existingArtifacts.remove(foundArtifact.get()
963 .getArtifactLabel());
964 artifactsToUpload.remove(currNewArtifact);
966 log.debug("Can't upload two artifact with the same name {}.", currNewArtifact.getArtifactName());
967 throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_ALREADY_EXIST_IN_DIFFERENT_TYPE_IN_CSAR,
968 currNewArtifact.getArtifactName(), currNewArtifact.getArtifactType(), foundArtifact.get()
974 private void updateFoundArtifact(List<ArtifactDefinition> artifactsToUpdate, ArtifactDefinition currNewArtifact,
975 ArtifactDefinition foundArtifact) {
976 if (!foundArtifact.getArtifactChecksum()
977 .equals(currNewArtifact.getArtifactChecksum())) {
978 foundArtifact.setPayload(currNewArtifact.getPayloadData());
979 foundArtifact.setPayloadData(Base64.encodeBase64String(currNewArtifact.getPayloadData()));
980 foundArtifact.setArtifactChecksum(
981 GeneralUtility.calculateMD5Base64EncodedByByteArray(currNewArtifact.getPayloadData()));
982 artifactsToUpdate.add(foundArtifact);
986 private Map<String, ArtifactDefinition> collectExistingArtifacts(Resource curNodeType) {
987 Map<String, ArtifactDefinition> existingArtifacts = new HashMap<>();
988 if (curNodeType == null) {
989 return existingArtifacts;
991 if (MapUtils.isNotEmpty(curNodeType.getDeploymentArtifacts())) {
992 existingArtifacts.putAll(curNodeType.getDeploymentArtifacts());
994 if (MapUtils.isNotEmpty(curNodeType.getArtifacts())) {
995 existingArtifacts.putAll(curNodeType.getArtifacts()
998 .filter(e -> e.getValue()
999 .getArtifactGroupType() == ArtifactGroupTypeEnum.INFORMATIONAL)
1000 .collect(toMap(Map.Entry::getKey, Map.Entry::getValue)));
1002 return existingArtifacts;
1006 * Changes resource life cycle state to checked out
1010 * @param inTransaction
1013 private Either<Resource, ResponseFormat> checkoutResource(Resource resource, User user, boolean inTransaction) {
1014 Either<Resource, ResponseFormat> checkoutResourceRes;
1016 if (!resource.getComponentMetadataDefinition()
1017 .getMetadataDataDefinition()
1019 .equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
1021 "************* Going to change life cycle state of resource {} to not certified checked out. ",
1022 resource.getName());
1023 Either<? extends Component, ResponseFormat> checkoutRes = lifecycleBusinessLogic.changeComponentState(
1024 resource.getComponentType(), resource.getUniqueId(), user, LifeCycleTransitionEnum.CHECKOUT,
1025 new LifecycleChangeInfoWithAction(CERTIFICATION_ON_IMPORT,
1026 LifecycleChanceActionEnum.CREATE_FROM_CSAR),
1027 inTransaction, true);
1028 if (checkoutRes.isRight()) {
1029 log.debug("Could not change state of component {} with uid {} to checked out. Status is {}. ",
1030 resource.getComponentType()
1032 resource.getUniqueId(), checkoutRes.right()
1035 checkoutResourceRes = Either.right(checkoutRes.right()
1038 checkoutResourceRes = Either.left((Resource) checkoutRes.left()
1042 checkoutResourceRes = Either.left(resource);
1044 } catch (Exception e) {
1045 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
1046 checkoutResourceRes = Either.right(responseFormat);
1047 log.debug("Exception occurred when checkoutResource {} , error is:{}", resource.getName(), e.getMessage(),
1050 return checkoutResourceRes;
1054 * Handles Artifacts of NodeType
1056 * @param nodeTypeResource
1057 * @param nodeTypeArtifactsToHandle
1059 * @param inTransaction
1062 public Either<List<ArtifactDefinition>, ResponseFormat> handleNodeTypeArtifacts(Resource nodeTypeResource,
1063 Map<ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle,
1064 List<ArtifactDefinition> createdArtifacts, User user, boolean inTransaction, boolean ignoreLifecycleState) {
1065 List<ArtifactDefinition> handleNodeTypeArtifactsRequestRes;
1066 Either<List<ArtifactDefinition>, ResponseFormat> handleNodeTypeArtifactsRes = null;
1067 Either<Resource, ResponseFormat> changeStateResponse;
1069 changeStateResponse = checkoutResource(nodeTypeResource, user, inTransaction);
1070 if (changeStateResponse.isRight()) {
1071 return Either.right(changeStateResponse.right()
1074 nodeTypeResource = changeStateResponse.left()
1077 List<ArtifactDefinition> handledNodeTypeArtifacts = new ArrayList<>();
1078 log.debug("************* Going to handle artifacts of node type resource {}. ", nodeTypeResource.getName());
1079 for (Entry<ArtifactOperationEnum, List<ArtifactDefinition>> curOperationEntry : nodeTypeArtifactsToHandle
1081 ArtifactOperationEnum curOperation = curOperationEntry.getKey();
1082 List<ArtifactDefinition> curArtifactsToHandle = curOperationEntry.getValue();
1083 if (curArtifactsToHandle != null && !curArtifactsToHandle.isEmpty()) {
1084 log.debug("************* Going to {} artifact to vfc {}", curOperation.name(),
1085 nodeTypeResource.getName());
1086 handleNodeTypeArtifactsRequestRes = artifactsBusinessLogic
1087 .handleArtifactsRequestForInnerVfcComponent(curArtifactsToHandle, nodeTypeResource, user,
1088 createdArtifacts, new ArtifactOperationInfo(false,
1089 ignoreLifecycleState, curOperation),
1090 false, inTransaction);
1091 if (ArtifactOperationEnum.isCreateOrLink(curOperation)) {
1092 createdArtifacts.addAll(handleNodeTypeArtifactsRequestRes);
1094 handledNodeTypeArtifacts.addAll(handleNodeTypeArtifactsRequestRes);
1097 if (handleNodeTypeArtifactsRes == null) {
1098 handleNodeTypeArtifactsRes = Either.left(handledNodeTypeArtifacts);
1100 } catch (Exception e) {
1101 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
1102 handleNodeTypeArtifactsRes = Either.right(responseFormat);
1103 log.debug("Exception occurred when handleVfcArtifacts, error is:{}", e.getMessage(), e);
1105 return handleNodeTypeArtifactsRes;
1108 private Map<String, ImmutablePair<String, String>> extractVfcToscaNames(final Map<String, NodeTypeInfo> nodeTypesInfo,
1109 final String vfResourceName,
1110 final CsarInfo csarInfo) {
1111 final Map<String, ImmutablePair<String, String>> vfcToscaNames = new HashMap<>();
1113 final Map<String, Object> nodes = extractAllNodes(nodeTypesInfo, csarInfo);
1114 if (!nodes.isEmpty()) {
1115 final Iterator<Entry<String, Object>> nodesNameEntry = nodes.entrySet().iterator();
1116 while (nodesNameEntry.hasNext()) {
1117 final Entry<String, Object> nodeType = nodesNameEntry.next();
1118 final ImmutablePair<String, String> toscaResourceName = buildNestedToscaResourceName(
1119 ResourceTypeEnum.VFC.name(), vfResourceName, nodeType.getKey());
1120 vfcToscaNames.put(nodeType.getKey(), toscaResourceName);
1123 for (final NodeTypeInfo cvfc : nodeTypesInfo.values()) {
1124 vfcToscaNames.put(cvfc.getType(), buildNestedToscaResourceName(ResourceTypeEnum.CVFC.name(),
1125 vfResourceName, cvfc.getType()));
1127 return vfcToscaNames;
1130 private Map<String, Object> extractAllNodes(Map<String, NodeTypeInfo> nodeTypesInfo, CsarInfo csarInfo) {
1131 Map<String, Object> nodes = new HashMap<>();
1132 for (NodeTypeInfo nodeTypeInfo : nodeTypesInfo.values()) {
1133 extractNodeTypes(nodes, nodeTypeInfo.getMappedToscaTemplate());
1135 extractNodeTypes(nodes, csarInfo.getMappedToscaMainTemplate());
1139 private void extractNodeTypes(Map<String, Object> nodes, Map<String, Object> mappedToscaTemplate) {
1140 Either<Map<String, Object>, ResultStatusEnum> eitherNodeTypes = ImportUtils
1141 .findFirstToscaMapElement(mappedToscaTemplate, TypeUtils.ToscaTagNamesEnum.NODE_TYPES);
1142 if (eitherNodeTypes.isLeft()) {
1143 nodes.putAll(eitherNodeTypes.left()
1148 public Resource createResourceFromCsar(Resource resource, User user, Map<String, byte[]> csarUIPayload,
1150 log.trace("************* created successfully from YAML, resource TOSCA ");
1151 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RESOURCE_FROM_YAML,StatusCode.STARTED,"Starting to create Resource From Csar by user {}", user.getUserId() );
1152 CsarInfo csarInfo = csarBusinessLogic.getCsarInfo(resource, null, user, csarUIPayload, csarUUID);
1153 Map<String, NodeTypeInfo> nodeTypesInfo = csarInfo.extractNodeTypesInfo();
1154 Either<Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>>, ResponseFormat> findNodeTypesArtifactsToHandleRes = findNodeTypesArtifactsToHandle(
1155 nodeTypesInfo, csarInfo, resource);
1156 if (findNodeTypesArtifactsToHandleRes.isRight()) {
1157 log.debug("failed to find node types for update with artifacts during import csar {}. ",
1158 csarInfo.getCsarUUID());
1159 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RESOURCE_FROM_YAML,resource.getComponentMetadataForSupportLog(),
1160 StatusCode.ERROR,"error: {}",findNodeTypesArtifactsToHandleRes.right().value());
1161 throw new ByResponseFormatComponentException(findNodeTypesArtifactsToHandleRes.right().value());
1163 Resource vfResource = createResourceFromYaml(resource, csarInfo.getMainTemplateContent(),
1164 csarInfo.getMainTemplateName(), nodeTypesInfo, csarInfo, findNodeTypesArtifactsToHandleRes.left()
1167 log.trace("*************VF Resource created successfully from YAML, resource TOSCA name: {}",
1168 vfResource.getToscaResourceName());
1169 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RESOURCE_FROM_YAML,StatusCode.COMPLETE,"Ended create Resource From Csar by user {}", user.getUserId() );
1173 private Resource validateResourceBeforeCreate(Resource resource, User user, boolean inTransaction) {
1174 log.trace("validating resource before create");
1175 user.copyData(validateUser(user, CREATE_RESOURCE, resource, AuditingActionEnum.CREATE_RESOURCE, false));
1176 // validate user role
1177 validateUserRole(user, resource, new ArrayList<>(), AuditingActionEnum.CREATE_RESOURCE, null);
1178 // VF / PNF "derivedFrom" should be null (or ignored)
1179 if (ModelConverter.isAtomicComponent(resource)) {
1180 validateDerivedFromNotEmpty(user, resource, AuditingActionEnum.CREATE_RESOURCE);
1182 return validateResourceBeforeCreate(resource, user, AuditingActionEnum.CREATE_RESOURCE, inTransaction, null);
1186 // resource, yamlFileContents, yamlFileName, nodeTypesInfo,csarInfo,
1187 // nodeTypesArtifactsToCreate, true, false, null
1188 private Resource createResourceFromYaml(Resource resource, String topologyTemplateYaml, String yamlName,
1189 Map<String, NodeTypeInfo> nodeTypesInfo, CsarInfo csarInfo,
1190 Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToCreate,
1191 boolean shouldLock, boolean inTransaction, String nodeName) {
1193 List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
1194 Resource createdResource;
1196 ParsedToscaYamlInfo parsedToscaYamlInfo = csarBusinessLogic.getParsedToscaYamlInfo(topologyTemplateYaml, yamlName, nodeTypesInfo, csarInfo, nodeName);
1197 if (MapUtils.isEmpty(parsedToscaYamlInfo.getInstances()) && resource.getResourceType() != ResourceTypeEnum.PNF) {
1198 throw new ByActionStatusComponentException(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
1200 log.debug("#createResourceFromYaml - Going to create resource {} and RIs ", resource.getName());
1201 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RESOURCE_FROM_YAML,resource.getComponentMetadataForSupportLog(),
1202 StatusCode.STARTED,"");
1203 createdResource = createResourceAndRIsFromYaml(yamlName, resource, parsedToscaYamlInfo,
1204 AuditingActionEnum.IMPORT_RESOURCE, false, createdArtifacts, topologyTemplateYaml, nodeTypesInfo,
1205 csarInfo, nodeTypesArtifactsToCreate, shouldLock, inTransaction, nodeName);
1206 log.debug("#createResourceFromYaml - The resource {} has been created ", resource.getName());
1207 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RESOURCE_FROM_YAML,resource.getComponentMetadataForSupportLog(),
1208 StatusCode.COMPLETE,"The resource has been created: {}",resource.getName());
1209 } catch (ComponentException e) {
1210 ResponseFormat responseFormat = e.getResponseFormat() == null
1211 ? componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams()) : e.getResponseFormat();
1212 componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), resource,
1213 AuditingActionEnum.IMPORT_RESOURCE);
1215 } catch (StorageException e) {
1216 ResponseFormat responseFormat = componentsUtils
1217 .getResponseFormat(componentsUtils.convertFromStorageResponse(e.getStorageOperationStatus()));
1218 componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), resource,
1219 AuditingActionEnum.IMPORT_RESOURCE);
1222 return createdResource;
1226 public Map<String, Resource> createResourcesFromYamlNodeTypesList(String yamlName, Resource resource,
1227 Map<String, Object> mappedToscaTemplate, boolean needLock,
1228 Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle,
1229 List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, Map<String, NodeTypeInfo> nodeTypesInfo,
1230 CsarInfo csarInfo) {
1232 Either<String, ResultStatusEnum> toscaVersion = findFirstToscaStringElement(mappedToscaTemplate,
1233 TypeUtils.ToscaTagNamesEnum.TOSCA_VERSION);
1234 if (toscaVersion.isRight()) {
1235 throw new ByActionStatusComponentException(ActionStatus.INVALID_TOSCA_TEMPLATE);
1237 Map<String, Object> mapToConvert = new HashMap<>();
1238 mapToConvert.put(TypeUtils.ToscaTagNamesEnum.TOSCA_VERSION.getElementName(), toscaVersion.left()
1240 Map<String, Object> nodeTypes = getNodeTypesFromTemplate(mappedToscaTemplate);
1241 createNodeTypes(yamlName, resource, needLock, nodeTypesArtifactsToHandle, nodeTypesNewCreatedArtifacts,
1242 nodeTypesInfo, csarInfo, mapToConvert, nodeTypes);
1243 return csarInfo.getCreatedNodes();
1246 private Map<String, Object> getNodeTypesFromTemplate(Map<String, Object> mappedToscaTemplate) {
1247 return ImportUtils.findFirstToscaMapElement(mappedToscaTemplate, TypeUtils.ToscaTagNamesEnum.NODE_TYPES)
1249 .orValue(HashMap::new);
1252 private void createNodeTypes(String yamlName, Resource resource, boolean needLock,
1253 Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle,
1254 List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, Map<String, NodeTypeInfo> nodeTypesInfo,
1255 CsarInfo csarInfo, Map<String, Object> mapToConvert, Map<String, Object> nodeTypes) {
1256 Iterator<Entry<String, Object>> nodesNameValueIter = nodeTypes.entrySet()
1258 Resource vfcCreated = null;
1259 while (nodesNameValueIter.hasNext()) {
1260 Entry<String, Object> nodeType = nodesNameValueIter.next();
1261 Map<ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle = nodeTypesArtifactsToHandle == null
1262 || nodeTypesArtifactsToHandle.isEmpty() ? null : nodeTypesArtifactsToHandle.get(nodeType.getKey());
1264 if (nodeTypesInfo.containsKey(nodeType.getKey())) {
1265 log.trace("************* Going to handle nested vfc {}", nodeType.getKey());
1266 vfcCreated = handleNestedVfc(resource, nodeTypesArtifactsToHandle, nodeTypesNewCreatedArtifacts,
1267 nodeTypesInfo, csarInfo, nodeType.getKey());
1268 log.trace("************* Finished to handle nested vfc {}", nodeType.getKey());
1269 } else if (csarInfo.getCreatedNodesToscaResourceNames() != null
1270 && !csarInfo.getCreatedNodesToscaResourceNames()
1271 .containsKey(nodeType.getKey())) {
1272 log.trace("************* Going to create node {}", nodeType.getKey());
1273 ImmutablePair<Resource, ActionStatus> resourceCreated = createNodeTypeResourceFromYaml(yamlName,
1274 nodeType, csarInfo.getModifier(), mapToConvert, resource, needLock, nodeTypeArtifactsToHandle,
1275 nodeTypesNewCreatedArtifacts, true, csarInfo, true);
1276 log.debug("************* Finished to create node {}", nodeType.getKey());
1278 vfcCreated = resourceCreated.getLeft();
1279 csarInfo.getCreatedNodesToscaResourceNames()
1280 .put(nodeType.getKey(), vfcCreated.getToscaResourceName());
1282 if (vfcCreated != null) {
1283 csarInfo.getCreatedNodes()
1284 .put(nodeType.getKey(), vfcCreated);
1286 mapToConvert.remove(TypeUtils.ToscaTagNamesEnum.NODE_TYPES.getElementName());
1290 private Resource handleNestedVfc(Resource resource,
1291 Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodesArtifactsToHandle,
1292 List<ArtifactDefinition> createdArtifacts, Map<String, NodeTypeInfo> nodesInfo, CsarInfo csarInfo,
1295 String yamlName = nodesInfo.get(nodeName)
1296 .getTemplateFileName();
1297 Map<String, Object> nestedVfcJsonMap = nodesInfo.get(nodeName)
1298 .getMappedToscaTemplate();
1300 log.debug("************* Going to create node types from yaml {}", yamlName);
1301 createResourcesFromYamlNodeTypesList(yamlName, resource, nestedVfcJsonMap, false, nodesArtifactsToHandle,
1302 createdArtifacts, Collections.emptyMap(), csarInfo);
1303 log.debug("************* Finished to create node types from yaml {}", yamlName);
1305 if (nestedVfcJsonMap.containsKey(TypeUtils.ToscaTagNamesEnum.TOPOLOGY_TEMPLATE.getElementName())) {
1306 log.debug("************* Going to handle complex VFC from yaml {}", yamlName);
1307 resource = handleComplexVfc(resource, nodesArtifactsToHandle, createdArtifacts, nodesInfo, csarInfo,
1308 nodeName, yamlName);
1313 private Resource handleComplexVfc(final Resource resource,
1314 final Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>>
1315 nodesArtifactsToHandle,
1316 final List<ArtifactDefinition>
1317 createdArtifacts, Map<String, NodeTypeInfo> nodesInfo, CsarInfo csarInfo,
1318 final String nodeName, final String yamlName) {
1320 Resource oldComplexVfc = null;
1321 Resource newComplexVfc = buildValidComplexVfc(resource, csarInfo, nodeName, nodesInfo);
1322 Either<Resource, StorageOperationStatus> oldComplexVfcRes = toscaOperationFacade
1323 .getFullLatestComponentByToscaResourceName(newComplexVfc.getToscaResourceName());
1324 if (oldComplexVfcRes.isRight() && oldComplexVfcRes.right().value() == StorageOperationStatus.NOT_FOUND) {
1325 oldComplexVfcRes = toscaOperationFacade.getFullLatestComponentByToscaResourceName(
1326 buildNestedToscaResourceName(ResourceTypeEnum.CVFC.name(), csarInfo.getVfResourceName(), nodeName).getRight());
1328 if (oldComplexVfcRes.isRight() && oldComplexVfcRes.right().value() != StorageOperationStatus.NOT_FOUND) {
1329 log.debug("Failed to fetch previous complex VFC by tosca resource name {}. Status is {}. ",
1330 newComplexVfc.getToscaResourceName(), oldComplexVfcRes.right().value());
1331 throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR);
1332 } else if (oldComplexVfcRes.isLeft()) {
1333 log.debug(VALIDATE_DERIVED_BEFORE_UPDATE);
1334 final Either<Boolean, ResponseFormat> eitherValidation = validateNestedDerivedFromDuringUpdate(
1335 oldComplexVfcRes.left().value(),
1336 newComplexVfc, ValidationUtils.hasBeenCertified(oldComplexVfcRes.left().value().getVersion()));
1337 if (eitherValidation.isLeft()) {
1338 oldComplexVfc = oldComplexVfcRes.left().value();
1341 newComplexVfc = handleComplexVfc(nodesArtifactsToHandle, createdArtifacts, nodesInfo, csarInfo, nodeName,
1342 yamlName, oldComplexVfc, newComplexVfc);
1343 csarInfo.getCreatedNodesToscaResourceNames().put(nodeName, newComplexVfc.getToscaResourceName());
1344 final LifecycleChangeInfoWithAction lifecycleChangeInfo = new LifecycleChangeInfoWithAction(CERTIFICATION_ON_IMPORT,
1345 LifecycleChanceActionEnum.CREATE_FROM_CSAR);
1346 log.debug("Going to certify cvfc {}. ", newComplexVfc.getName());
1347 final Resource result = propagateStateToCertified(csarInfo.getModifier(), newComplexVfc,
1348 lifecycleChangeInfo, true, false, true);
1349 csarInfo.getCreatedNodes().put(nodeName, result);
1350 csarInfo.removeNodeFromQueue();
1354 private Resource handleComplexVfc(
1355 Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodesArtifactsToHandle,
1356 List<ArtifactDefinition> createdArtifacts, Map<String, NodeTypeInfo> nodesInfo, CsarInfo csarInfo,
1357 String nodeName, String yamlName, Resource oldComplexVfc, Resource newComplexVfc) {
1359 Resource handleComplexVfcRes;
1360 Map<String, Object> mappedToscaTemplate = nodesInfo.get(nodeName)
1361 .getMappedToscaTemplate();
1362 String yamlContent = new String(csarInfo.getCsar()
1364 Map<String, NodeTypeInfo> newNodeTypesInfo = nodesInfo.entrySet()
1366 .collect(toMap(Entry::getKey, e -> e.getValue()
1367 .getUnmarkedCopy()));
1368 CsarInfo.markNestedVfc(mappedToscaTemplate, newNodeTypesInfo);
1369 if (oldComplexVfc == null) {
1370 handleComplexVfcRes = createResourceFromYaml(newComplexVfc, yamlContent, yamlName, newNodeTypesInfo,
1371 csarInfo, nodesArtifactsToHandle, false, true, nodeName);
1373 handleComplexVfcRes = updateResourceFromYaml(oldComplexVfc, newComplexVfc,
1374 AuditingActionEnum.UPDATE_RESOURCE_METADATA, createdArtifacts, yamlContent, yamlName, csarInfo,
1375 newNodeTypesInfo, nodesArtifactsToHandle, nodeName, true);
1377 return handleComplexVfcRes;
1380 private Resource buildValidComplexVfc(Resource resource, CsarInfo csarInfo, String nodeName,
1381 Map<String, NodeTypeInfo> nodesInfo) {
1383 Resource complexVfc = buildComplexVfcMetadata(resource, csarInfo, nodeName, nodesInfo);
1384 log.debug("************* Going to validate complex VFC from yaml {}", complexVfc.getName());
1385 csarInfo.addNodeToQueue(nodeName);
1386 return validateResourceBeforeCreate(complexVfc, csarInfo.getModifier(), AuditingActionEnum.IMPORT_RESOURCE,
1390 private String getNodeTypeActualName(final String nodeTypefullName, final String nodeTypeNamePrefix) {
1392 final String nameWithouNamespacePrefix = nodeTypefullName.substring(nodeTypeNamePrefix.length());
1393 final String[] findTypes = nameWithouNamespacePrefix.split("\\.");
1395 if(findTypes.length > 1){
1396 final String resourceType = findTypes[0];
1397 return nameWithouNamespacePrefix.substring(resourceType.length());
1399 return nameWithouNamespacePrefix;
1402 private ImmutablePair<Resource, ActionStatus> createNodeTypeResourceFromYaml(final String yamlName,
1403 final Entry<String, Object> nodeNameValue,
1405 final Map<String, Object> mapToConvert,
1406 final Resource resourceVf,
1407 final boolean needLock,
1408 final Map<ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle,
1409 final List<ArtifactDefinition> nodeTypesNewCreatedArtifacts,
1410 final boolean forceCertificationAllowed,
1411 final CsarInfo csarInfo,
1412 final boolean isNested) {
1414 final UploadResourceInfo resourceMetaData = fillResourceMetadata(
1415 yamlName, resourceVf, nodeNameValue.getKey(), user);
1417 final String singleVfcYaml = buildNodeTypeYaml(nodeNameValue, mapToConvert, resourceMetaData.getResourceType(), csarInfo);
1418 user = validateUser(user, "CheckIn Resource", resourceVf, AuditingActionEnum.CHECKIN_RESOURCE, true);
1419 return createResourceFromNodeType(singleVfcYaml, resourceMetaData, user, true, needLock,
1420 nodeTypeArtifactsToHandle, nodeTypesNewCreatedArtifacts, forceCertificationAllowed, csarInfo,
1421 nodeNameValue.getKey(), isNested);
1424 private String buildNodeTypeYaml(final Entry<String, Object> nodeNameValue,
1425 final Map<String, Object> mapToConvert,
1426 final String nodeResourceType,
1427 final CsarInfo csarInfo) {
1428 // We need to create a Yaml from each node_types in order to create
1429 // resource from each node type using import normative flow.
1430 final DumperOptions options = new DumperOptions();
1431 options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
1432 final Yaml yaml = new Yaml(options);
1434 final Map<String, Object> node = new HashMap<>();
1435 node.put(buildNestedToscaResourceName(nodeResourceType, csarInfo.getVfResourceName(), nodeNameValue.getKey())
1436 .getLeft(), nodeNameValue.getValue());
1437 mapToConvert.put(TypeUtils.ToscaTagNamesEnum.NODE_TYPES.getElementName(), node);
1439 return yaml.dumpAsMap(mapToConvert);
1442 public Boolean validateResourceCreationFromNodeType(Resource resource, User creator) {
1443 validateDerivedFromNotEmpty(creator, resource, AuditingActionEnum.CREATE_RESOURCE);
1447 public ImmutablePair<Resource, ActionStatus> createResourceFromNodeType(String nodeTypeYaml,
1448 UploadResourceInfo resourceMetaData, User creator, boolean isInTransaction, boolean needLock,
1449 Map<ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle,
1450 List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, boolean forceCertificationAllowed, CsarInfo csarInfo,
1451 String nodeName, boolean isNested) {
1453 LifecycleChangeInfoWithAction lifecycleChangeInfo = new LifecycleChangeInfoWithAction(CERTIFICATION_ON_IMPORT,
1454 LifecycleChanceActionEnum.CREATE_FROM_CSAR);
1455 Function<Resource, Boolean> validator = resource -> validateResourceCreationFromNodeType(
1457 return resourceImportManager.importCertifiedResource(nodeTypeYaml, resourceMetaData, creator, validator,
1458 lifecycleChangeInfo, isInTransaction, true, needLock, nodeTypeArtifactsToHandle,
1459 nodeTypesNewCreatedArtifacts, forceCertificationAllowed, csarInfo, nodeName, isNested);
1463 * Validates if a given node type name has a valid prefix.
1465 * @param nodeName node name from definition file
1466 * @param definedResourceNamespaceList is a list of all node type name prefix allowed
1467 * @return a valid node type name prefix if it`s found
1469 public Optional<String> validateNodeTypeNamePrefix(final String nodeName,
1470 final List<String> definedResourceNamespaceList) {
1471 for (final String validNamespace : definedResourceNamespaceList) {
1472 if (nodeName.startsWith(validNamespace)) {
1473 return Optional.of(validNamespace);
1476 return Optional.empty();
1479 private List<String> getDefinedNodeTypeNamespaceList() {
1480 return ConfigurationManager.getConfigurationManager().getConfiguration().getDefinedResourceNamespace();
1483 private UploadResourceInfo fillResourceMetadata(final String yamlName, final Resource resourceVf,
1484 final String nodeName, final User user) {
1486 final UploadResourceInfo resourceMetaData = new UploadResourceInfo();
1488 final String nodeTypeNamePrefix = getNodeTypeNamePrefix(nodeName);
1489 log.debug("Node type Name prefix {}", nodeTypeNamePrefix);
1491 if (!nodeName.startsWith(nodeTypeNamePrefix)) {
1492 log.debug("invalid nodeName:{} does not start with {}.", nodeName, getDefinedNodeTypeNamespaceList());
1493 throw new ByActionStatusComponentException(ActionStatus.INVALID_NODE_TEMPLATE, yamlName,
1494 resourceMetaData.getName(), nodeName);
1497 final String actualName = this.getNodeTypeActualName(nodeName, nodeTypeNamePrefix);
1498 final String namePrefix = nodeName.replace(actualName, "");
1499 String resourceType = namePrefix.substring(nodeTypeNamePrefix.length());
1500 log.debug("initial namePrefix:{} resourceType {}. nodeName {} , actualName {} prefix {}", namePrefix,
1501 resourceType, nodeName, actualName, nodeTypeNamePrefix);
1503 // if we import from csar, the node_type name can be
1504 // org.openecomp.resource.abstract.node_name - in this case we always
1506 if (resourceType.equals(Constants.ABSTRACT)) {
1507 resourceType = ResourceTypeEnum.VFC.name().toLowerCase();
1510 if (!ResourceTypeEnum.containsIgnoreCase(resourceType)) {
1511 resourceType = ResourceTypeEnum.VFC.name().toLowerCase();
1515 if (!ResourceTypeEnum.containsName(resourceType.toUpperCase())) {
1516 log.debug("invalid resourceType:{} the type is not one of the valide types:{}.",
1517 resourceType.toUpperCase(), ResourceTypeEnum.values());
1518 throw new ByActionStatusComponentException(ActionStatus.INVALID_NODE_TEMPLATE, yamlName,
1519 resourceMetaData.getName(), nodeName);
1523 resourceMetaData.setName(new StringBuilder(resourceVf.getSystemName()).append(actualName).toString());
1525 // Setting type from name
1526 final String type = resourceType.toUpperCase();
1527 resourceMetaData.setResourceType(type);
1529 resourceMetaData.setDescription(ImportUtils.Constants.INNER_VFC_DESCRIPTION);
1530 resourceMetaData.setIcon(ImportUtils.Constants.DEFAULT_ICON);
1531 resourceMetaData.setContactId(user.getUserId());
1532 resourceMetaData.setVendorName(resourceVf.getVendorName());
1533 resourceMetaData.setVendorRelease(resourceVf.getVendorRelease());
1536 final List<String> tags = new ArrayList<>();
1537 tags.add(resourceMetaData.getName());
1538 resourceMetaData.setTags(tags);
1541 final CategoryDefinition category = new CategoryDefinition();
1542 category.setName(ImportUtils.Constants.ABSTRACT_CATEGORY_NAME);
1543 final SubCategoryDefinition subCategory = new SubCategoryDefinition();
1544 subCategory.setName(ImportUtils.Constants.ABSTRACT_SUBCATEGORY);
1545 category.addSubCategory(subCategory);
1546 final List<CategoryDefinition> categories = new ArrayList<>();
1547 categories.add(category);
1548 resourceMetaData.setCategories(categories);
1550 return resourceMetaData;
1553 private Resource buildComplexVfcMetadata(final Resource resourceVf,
1554 final CsarInfo csarInfo,
1555 final String nodeName,
1556 final Map<String, NodeTypeInfo> nodesInfo) {
1557 final Resource cvfc = new Resource();
1558 final NodeTypeInfo nodeTypeInfo = nodesInfo.get(nodeName);
1559 cvfc.setName(buildCvfcName(csarInfo.getVfResourceName(), nodeName));
1560 cvfc.setNormalizedName(ValidationUtils.normaliseComponentName(cvfc.getName()));
1561 cvfc.setSystemName(ValidationUtils.convertToSystemName(cvfc.getName()));
1562 cvfc.setResourceType(ResourceTypeEnum.CVFC);
1563 cvfc.setAbstract(true);
1564 cvfc.setDerivedFrom(nodeTypeInfo.getDerivedFrom());
1565 cvfc.setDescription(ImportUtils.Constants.CVFC_DESCRIPTION);
1566 cvfc.setIcon(ImportUtils.Constants.DEFAULT_ICON);
1567 cvfc.setContactId(csarInfo.getModifier()
1569 cvfc.setCreatorUserId(csarInfo.getModifier()
1571 cvfc.setVendorName(resourceVf.getVendorName());
1572 cvfc.setVendorRelease(resourceVf.getVendorRelease());
1573 cvfc.setResourceVendorModelNumber(resourceVf.getResourceVendorModelNumber());
1574 cvfc.setToscaResourceName(buildNestedToscaResourceName(
1575 ResourceTypeEnum.CVFC.name(), csarInfo.getVfResourceName(), nodeName).getLeft());
1576 cvfc.setInvariantUUID(UniqueIdBuilder.buildInvariantUUID());
1578 final List<String> tags = new ArrayList<>();
1579 tags.add(cvfc.getName());
1582 final CategoryDefinition category = new CategoryDefinition();
1583 category.setName(ImportUtils.Constants.ABSTRACT_CATEGORY_NAME);
1584 SubCategoryDefinition subCategory = new SubCategoryDefinition();
1585 subCategory.setName(ImportUtils.Constants.ABSTRACT_SUBCATEGORY);
1586 category.addSubCategory(subCategory);
1587 final List<CategoryDefinition> categories = new ArrayList<>();
1588 categories.add(category);
1589 cvfc.setCategories(categories);
1591 cvfc.setVersion(ImportUtils.Constants.FIRST_NON_CERTIFIED_VERSION);
1592 cvfc.setLifecycleState(ImportUtils.Constants.NORMATIVE_TYPE_LIFE_CYCLE_NOT_CERTIFIED_CHECKOUT);
1593 cvfc.setHighestVersion(ImportUtils.Constants.NORMATIVE_TYPE_HIGHEST_VERSION);
1598 private String buildCvfcName(final String resourceVfName, final String nodeName) {
1600 String nameWithouNamespacePrefix =
1601 nodeName.substring(Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX.length());
1602 String[] findTypes = nameWithouNamespacePrefix.split("\\.");
1603 String resourceType = findTypes[0];
1604 String resourceName = resourceVfName + "-" + nameWithouNamespacePrefix.substring(resourceType.length() + 1);
1605 return addCvfcSuffixToResourceName(resourceName);
1608 private Resource createResourceAndRIsFromYaml(final String yamlName,
1610 final ParsedToscaYamlInfo parsedToscaYamlInfo,
1611 final AuditingActionEnum actionEnum,
1612 final boolean isNormative,
1613 final List<ArtifactDefinition> createdArtifacts,
1614 final String topologyTemplateYaml,
1615 final Map<String, NodeTypeInfo> nodeTypesInfo,
1616 final CsarInfo csarInfo,
1617 final Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToCreate,
1618 final boolean shouldLock,
1619 final boolean inTransaction,
1620 final String nodeName) {
1622 final List<ArtifactDefinition> nodeTypesNewCreatedArtifacts = new ArrayList<>();
1625 final Either<Boolean, ResponseFormat> lockResult = lockComponentByName(resource.getSystemName(), resource,
1627 if (lockResult.isRight()) {
1628 rollback(inTransaction, resource, createdArtifacts, nodeTypesNewCreatedArtifacts);
1629 throw new ByResponseFormatComponentException(lockResult.right().value());
1631 log.debug("name is locked {} status = {}", resource.getSystemName(), lockResult);
1634 log.trace("************* createResourceFromYaml before full create resource {}", yamlName);
1635 loggerSupportability.log(LoggerSupportabilityActions.CREATE_INPUTS,resource.getComponentMetadataForSupportLog(), StatusCode.STARTED,"Starting to add inputs from yaml: {}",yamlName);
1636 final Resource genericResource = fetchAndSetDerivedFromGenericType(resource);
1637 resource = createResourceTransaction(resource, csarInfo.getModifier(), isNormative);
1638 log.trace("************* createResourceFromYaml after full create resource {}", yamlName);
1639 log.trace("************* Going to add inputs from yaml {}", yamlName);
1640 if (resource.shouldGenerateInputs())
1641 generateAndAddInputsFromGenericTypeProperties(resource, genericResource);
1643 final Map<String, InputDefinition> inputs = parsedToscaYamlInfo.getInputs();
1644 resource = createInputsOnResource(resource, inputs);
1645 log.trace("************* Finish to add inputs from yaml {}", yamlName);
1646 loggerSupportability.log(LoggerSupportabilityActions.CREATE_INPUTS,
1647 resource.getComponentMetadataForSupportLog(),
1648 StatusCode.COMPLETE,"Finish to add inputs from yaml: {}",yamlName);
1649 if (resource.getResourceType() == ResourceTypeEnum.PNF) {
1650 log.trace("************* Adding generic properties to PNF");
1651 resource = (Resource) propertyBusinessLogic.copyPropertyToComponent(resource,
1652 genericResource.getProperties());
1653 log.trace("************* Adding software information to PNF");
1654 softwareInformationBusinessLogic.setSoftwareInformation(resource, csarInfo);
1655 log.trace("************* Removing non-mano software information file from PNF");
1656 if (csarInfo.getSoftwareInformationPath().isPresent() &&
1657 !softwareInformationBusinessLogic.removeSoftwareInformationFile(csarInfo)) {
1658 log.warn(EcompLoggerErrorCode.BUSINESS_PROCESS_ERROR , ResourceBusinessLogic.class.getName(),
1659 "catalog-be", "Could not remove the software information file.");
1663 final Map<String, UploadComponentInstanceInfo> uploadComponentInstanceInfoMap = parsedToscaYamlInfo
1665 log.trace("************* Going to create nodes, RI's and Relations from yaml {}", yamlName);
1666 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RESOURCE_FROM_YAML,resource.getComponentMetadataForSupportLog(), StatusCode.STARTED,"Start create nodes, RI and Relations from yaml: {}",yamlName);
1667 resource = createRIAndRelationsFromYaml(yamlName, resource, uploadComponentInstanceInfoMap,
1668 topologyTemplateYaml, nodeTypesNewCreatedArtifacts, nodeTypesInfo, csarInfo, nodeTypesArtifactsToCreate,
1670 log.trace("************* Finished to create nodes, RI and Relation from yaml {}", yamlName);
1671 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,
1672 resource.getComponentMetadataForSupportLog(),
1673 StatusCode.COMPLETE,"Finished to create nodes, RI and Relation from yaml: {}",yamlName);
1674 // validate update vf module group names
1675 final Either<Map<String, GroupDefinition>, ResponseFormat> validateUpdateVfGroupNamesRes = groupBusinessLogic
1676 .validateUpdateVfGroupNames(parsedToscaYamlInfo.getGroups(), resource.getSystemName());
1677 if (validateUpdateVfGroupNamesRes.isRight()) {
1678 rollback(inTransaction, resource, createdArtifacts, nodeTypesNewCreatedArtifacts);
1679 throw new ByResponseFormatComponentException(validateUpdateVfGroupNamesRes.right().value());
1681 // add groups to resource
1682 final Map<String, GroupDefinition> groups;
1683 log.trace("************* Going to add groups from yaml {}", yamlName);
1684 loggerSupportability.log(LoggerSupportabilityActions.CREATE_GROUPS,resource.getComponentMetadataForSupportLog(),
1685 StatusCode.STARTED,"Start to add groups from yaml: {}",yamlName);
1686 if (!validateUpdateVfGroupNamesRes.left().value().isEmpty()) {
1687 groups = validateUpdateVfGroupNamesRes.left().value();
1689 groups = parsedToscaYamlInfo.getGroups();
1692 final Either<Resource, ResponseFormat> createGroupsOnResource = createGroupsOnResource(resource, groups);
1693 if (createGroupsOnResource.isRight()) {
1694 rollback(inTransaction, resource, createdArtifacts, nodeTypesNewCreatedArtifacts);
1695 loggerSupportability.log(LoggerSupportabilityActions.CREATE_GROUPS,
1696 resource.getComponentMetadataForSupportLog(),
1697 StatusCode.ERROR,"ERROR while adding groups from yaml: {}",yamlName);
1698 throw new ByResponseFormatComponentException(createGroupsOnResource.right().value());
1700 resource = createGroupsOnResource.left().value();
1701 log.trace("************* Finished to add groups from yaml {}", yamlName);
1702 loggerSupportability.log(LoggerSupportabilityActions.CREATE_GROUPS,
1703 resource.getComponentMetadataForSupportLog(),
1704 StatusCode.COMPLETE,"Finished to add groups from yaml: {}", yamlName);
1705 log.trace("************* Going to add artifacts from yaml {}", yamlName);
1706 loggerSupportability.log(LoggerSupportabilityActions.CREATE_ARTIFACTS,
1707 resource.getComponentMetadataForSupportLog(),
1708 StatusCode.STARTED,"Started to add artifacts from yaml: {}",yamlName);
1710 log.trace("************* Starting to add policies from yaml {}", yamlName);
1711 Map<String, PolicyDefinition> policies = parsedToscaYamlInfo.getPolicies();
1712 if (MapUtils.isNotEmpty(policies)) {
1713 resource = createPoliciesOnResource(resource, policies);
1715 log.trace("************* Finished to add policies from yaml {}", yamlName);
1717 final NodeTypeInfoToUpdateArtifacts nodeTypeInfoToUpdateArtifacts =
1718 new NodeTypeInfoToUpdateArtifacts(nodeName, nodeTypesArtifactsToCreate);
1720 final Either<Resource, ResponseFormat> createArtifactsEither = createOrUpdateArtifacts(
1721 ArtifactOperationEnum.CREATE, createdArtifacts, yamlName, csarInfo, resource,
1722 nodeTypeInfoToUpdateArtifacts, inTransaction, shouldLock);
1723 if (createArtifactsEither.isRight()) {
1724 rollback(inTransaction, resource, createdArtifacts, nodeTypesNewCreatedArtifacts);
1725 loggerSupportability.log(LoggerSupportabilityActions.CREATE_ARTIFACTS,
1726 resource.getComponentMetadataForSupportLog(), StatusCode.ERROR,"error happened {}",
1727 createArtifactsEither.right().value());
1728 throw new ByResponseFormatComponentException(createArtifactsEither.right().value());
1730 loggerSupportability.log(LoggerSupportabilityActions.CREATE_ARTIFACTS,
1731 resource.getComponentMetadataForSupportLog(),
1732 StatusCode.COMPLETE,"Finished to add artifacts from yaml: "+resource.getToscaResourceName());
1733 final ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.CREATED);
1734 componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), resource, actionEnum);
1735 ASDCKpiApi.countCreatedResourcesKPI();
1738 } catch (final ComponentException | StorageException e) {
1739 rollback(inTransaction, resource, createdArtifacts, nodeTypesNewCreatedArtifacts);
1741 } catch (final ToscaOperationException e) {
1742 log.error("An error has occurred during resource and resource instance creation", e);
1743 rollback(inTransaction, resource, createdArtifacts, nodeTypesNewCreatedArtifacts);
1744 log.error(EcompLoggerErrorCode.BUSINESS_PROCESS_ERROR, ResourceBusinessLogic.class.getName(),
1745 "catalog-be", e.getMessage());
1746 throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR);
1747 } catch (final BusinessLogicException e) {
1748 log.error("An error has occurred during resource and resource instance creation", e);
1749 rollback(inTransaction, resource, createdArtifacts, nodeTypesNewCreatedArtifacts);
1750 throw new ByResponseFormatComponentException(e.getResponseFormat());
1752 if (!inTransaction) {
1753 janusGraphDao.commit();
1756 graphLockOperation.unlockComponentByName(resource.getSystemName(), resource.getUniqueId(),
1757 NodeTypeEnum.Resource);
1762 private void rollback(boolean inTransaction, Resource resource, List<ArtifactDefinition> createdArtifacts,
1763 List<ArtifactDefinition> nodeTypesNewCreatedArtifacts) {
1764 if (!inTransaction) {
1765 janusGraphDao.rollback();
1767 if (isNotEmpty(createdArtifacts) && isNotEmpty(nodeTypesNewCreatedArtifacts)) {
1768 createdArtifacts.addAll(nodeTypesNewCreatedArtifacts);
1769 log.debug("Found {} newly created artifacts to deleted, the component name: {}", createdArtifacts.size(),
1770 resource.getName());
1774 private Resource getResourceWithGroups(String resourceId) {
1776 ComponentParametersView filter = new ComponentParametersView();
1777 filter.setIgnoreGroups(false);
1778 Either<Resource, StorageOperationStatus> updatedResource = toscaOperationFacade.getToscaElement(resourceId,
1780 if (updatedResource.isRight()) {
1781 rollbackWithException(componentsUtils.convertFromStorageResponse(updatedResource.right()
1782 .value()), resourceId);
1784 return updatedResource.left()
1788 private Either<Resource, ResponseFormat> createGroupsOnResource(Resource resource,
1789 Map<String, GroupDefinition> groups) {
1790 if (groups != null && !groups.isEmpty()) {
1791 List<GroupDefinition> groupsAsList = updateGroupsMembersUsingResource(groups, resource);
1792 handleGroupsProperties(resource, groups);
1793 fillGroupsFinalFields(groupsAsList);
1794 Either<List<GroupDefinition>, ResponseFormat> createGroups = groupBusinessLogic.createGroups(resource,
1795 groupsAsList, true);
1796 if (createGroups.isRight()) {
1797 return Either.right(createGroups.right()
1801 return Either.left(resource);
1804 private void handleGroupsProperties(Resource resource, Map<String, GroupDefinition> groups) {
1805 List<InputDefinition> inputs = resource.getInputs();
1806 if (MapUtils.isNotEmpty(groups)) {
1809 .filter(g -> isNotEmpty(g.getProperties()))
1810 .flatMap(g -> g.getProperties()
1812 .forEach(p -> handleGetInputs(p, inputs));
1816 private Resource createPoliciesOnResource(Resource resource, Map<String, PolicyDefinition> policies) {
1817 policyBusinessLogic.createPoliciesFromParsedCsar(resource, policies);
1821 private void handleGetInputs(PropertyDataDefinition property, List<InputDefinition> inputs) {
1822 if (isNotEmpty(property.getGetInputValues())) {
1823 if (inputs == null || inputs.isEmpty()) {
1824 log.debug("Failed to add property {} to group. Inputs list is empty ", property);
1825 rollbackWithException(ActionStatus.INPUTS_NOT_FOUND, property.getGetInputValues()
1827 .map(GetInputValueDataDefinition::getInputName)
1831 ListIterator<GetInputValueDataDefinition> getInputValuesIter = property.getGetInputValues()
1833 while (getInputValuesIter.hasNext()) {
1834 GetInputValueDataDefinition getInput = getInputValuesIter.next();
1835 Either<InputDefinition, RuntimeException> inputEither = findInputByName(inputs, getInput);
1836 if (inputEither.isRight()) {
1837 throw inputEither.right().value();
1839 InputDefinition input = inputEither.left().value();
1840 getInput.setInputId(input.getUniqueId());
1841 if (getInput.getGetInputIndex() != null) {
1842 GetInputValueDataDefinition getInputIndex = getInput.getGetInputIndex();
1843 Either<InputDefinition, RuntimeException> newInputEither = findInputByName(inputs,
1845 if (newInputEither.isRight()) {
1846 throw newInputEither.right().value();
1848 InputDefinition newInput = newInputEither.left().value();
1849 getInputIndex.setInputId(newInput.getUniqueId());
1851 getInputValuesIter.add(getInputIndex);
1858 static <T> Either<T, RuntimeException> rollbackWithEither(
1859 final JanusGraphDao janusGraphDao,
1860 final ActionStatus actionStatus,
1861 final String... params) {
1862 if (janusGraphDao != null)
1863 janusGraphDao.rollback();
1864 return Either.right(new ByActionStatusComponentException(actionStatus, params));
1867 <T> Either<T, RuntimeException> rollbackWithEither(
1868 final ActionStatus actionStatus,
1869 final String... params) {
1870 return rollbackWithEither(janusGraphDao, actionStatus, params);
1873 private Either<InputDefinition, RuntimeException> findInputByName(List<InputDefinition> inputs, GetInputValueDataDefinition getInput) {
1875 final String inputName = getInput != null ? getInput.getInputName() : "";
1877 if(inputs == null || inputs.isEmpty()) {
1878 log.debug("#findInputByName - Inputs list is empty");
1879 return rollbackWithEither(ActionStatus.INPUTS_NOT_FOUND, inputName);
1881 Optional<InputDefinition> inputOpt = inputs.stream()
1882 .filter(p -> p.getName().equals(inputName))
1884 if (!inputOpt.isPresent()) {
1885 log.debug("#findInputByName - Failed to find the input {} ", inputName);
1886 return rollbackWithEither(ActionStatus.INPUTS_NOT_FOUND, inputName);
1888 return Either.left(inputOpt.get());
1893 private void fillGroupsFinalFields(List<GroupDefinition> groupsAsList) {
1894 groupsAsList.forEach(groupDefinition -> {
1895 groupDefinition.setInvariantName(groupDefinition.getName());
1896 groupDefinition.setCreatedFrom(CreatedFrom.CSAR);
1900 private Resource updateGroupsOnResource(Resource resource, Map<String, GroupDefinition> groups) {
1901 if (isEmpty(groups)) {
1904 return updateOrCreateGroups(resource, groups);
1907 private Resource updateOrCreateGroups(Resource resource, Map<String, GroupDefinition> groups) {
1908 List<GroupDefinition> groupsFromResource = resource.getGroups();
1909 List<GroupDefinition> groupsAsList = updateGroupsMembersUsingResource(groups, resource);
1910 List<GroupDefinition> groupsToUpdate = new ArrayList<>();
1911 List<GroupDefinition> groupsToDelete = new ArrayList<>();
1912 List<GroupDefinition> groupsToCreate = new ArrayList<>();
1913 if (isNotEmpty(groupsFromResource)) {
1914 addGroupsToCreateOrUpdate(groupsFromResource, groupsAsList, groupsToUpdate, groupsToCreate);
1915 addGroupsToDelete(groupsFromResource, groupsAsList, groupsToDelete);
1917 groupsToCreate.addAll(groupsAsList);
1919 if (isNotEmpty(groupsToCreate)) {
1920 fillGroupsFinalFields(groupsToCreate);
1921 if (isNotEmpty(groupsFromResource)) {
1922 groupBusinessLogic.addGroups(resource, groupsToCreate, true)
1924 .on(this::throwComponentException);
1926 groupBusinessLogic.createGroups(resource, groupsToCreate, true)
1928 .on(this::throwComponentException);
1931 if (isNotEmpty(groupsToDelete)) {
1932 groupBusinessLogic.deleteGroups(resource, groupsToDelete)
1934 .on(this::throwComponentException);
1936 if (isNotEmpty(groupsToUpdate)) {
1937 groupBusinessLogic.updateGroups(resource, groupsToUpdate, true)
1939 .on(this::throwComponentException);
1945 private void addGroupsToDelete(List<GroupDefinition> groupsFromResource, List<GroupDefinition> groupsAsList,
1946 List<GroupDefinition> groupsToDelete) {
1947 for (GroupDefinition group : groupsFromResource) {
1948 Optional<GroupDefinition> op = groupsAsList.stream()
1949 .filter(p -> p.getInvariantName()
1950 .equalsIgnoreCase(group.getInvariantName()))
1952 if (!op.isPresent() && (group.getArtifacts() == null || group.getArtifacts()
1954 groupsToDelete.add(group);
1959 private void addGroupsToCreateOrUpdate(List<GroupDefinition> groupsFromResource, List<GroupDefinition> groupsAsList,
1960 List<GroupDefinition> groupsToUpdate, List<GroupDefinition> groupsToCreate) {
1961 for (GroupDefinition group : groupsAsList) {
1962 Optional<GroupDefinition> op = groupsFromResource.stream()
1963 .filter(p -> p.getInvariantName()
1964 .equalsIgnoreCase(group.getInvariantName()))
1966 if (op.isPresent()) {
1967 GroupDefinition groupToUpdate = op.get();
1968 groupToUpdate.setMembers(group.getMembers());
1969 groupToUpdate.setCapabilities(group.getCapabilities());
1970 groupToUpdate.setProperties(group.getProperties());
1971 groupsToUpdate.add(groupToUpdate);
1973 groupsToCreate.add(group);
1978 private Resource createInputsOnResource(Resource resource, Map<String, InputDefinition> inputs) {
1979 List<InputDefinition> resourceProperties = resource.getInputs();
1980 if (MapUtils.isNotEmpty(inputs) || isNotEmpty(resourceProperties)) {
1982 Either<List<InputDefinition>, ResponseFormat> createInputs = inputsBusinessLogic.createInputsInGraph(inputs,
1984 if (createInputs.isRight()) {
1985 loggerSupportability.log(LoggerSupportabilityActions.CREATE_INPUTS,resource.getComponentMetadataForSupportLog(),
1986 StatusCode.ERROR,"failed to add inputs from yaml: {}",createInputs.right()
1988 throw new ByResponseFormatComponentException(createInputs.right()
1991 resource.setInputs(createInputs.left().value());
1996 private List<GroupDefinition> updateGroupsMembersUsingResource(Map<String, GroupDefinition> groups,
1997 Resource component) {
1999 List<GroupDefinition> result = new ArrayList<>();
2000 List<ComponentInstance> componentInstances = component.getComponentInstances();
2002 if (groups != null) {
2003 Either<Boolean, ResponseFormat> validateCyclicGroupsDependencies = validateCyclicGroupsDependencies(groups);
2004 if (validateCyclicGroupsDependencies.isRight()) {
2005 throw new ByResponseFormatComponentException(validateCyclicGroupsDependencies.right().value());
2007 for (Entry<String, GroupDefinition> entry : groups.entrySet()) {
2008 String groupName = entry.getKey();
2009 GroupDefinition groupDefinition = entry.getValue();
2010 GroupDefinition updatedGroupDefinition = new GroupDefinition(groupDefinition);
2011 updatedGroupDefinition.setMembers(null);
2012 Map<String, String> members = groupDefinition.getMembers();
2013 if (members != null) {
2014 updateGroupMembers(groups, updatedGroupDefinition, component, componentInstances, groupName,
2017 result.add(updatedGroupDefinition);
2023 private void updateGroupMembers(Map<String, GroupDefinition> groups, GroupDefinition updatedGroupDefinition,
2024 Resource component, List<ComponentInstance> componentInstances, String groupName,
2025 Map<String, String> members) {
2026 Set<String> compInstancesNames = members.keySet();
2028 if (CollectionUtils.isEmpty(componentInstances)) {
2029 String membersAstString = compInstancesNames.stream()
2030 .collect(joining(","));
2032 "The members: {}, in group: {}, cannot be found in component {}. There are no component instances.",
2033 membersAstString, groupName, component.getNormalizedName());
2034 throw new ByActionStatusComponentException(
2035 ActionStatus.GROUP_INVALID_COMPONENT_INSTANCE, membersAstString,
2036 groupName, component.getNormalizedName(), getComponentTypeForResponse(component));
2038 // Find all component instances with the member names
2039 Map<String, String> memberNames = componentInstances.stream()
2040 .collect(toMap(ComponentInstance::getName, ComponentInstance::getUniqueId));
2041 memberNames.putAll(groups.keySet()
2043 .collect(toMap(g -> g, g -> "")));
2044 Map<String, String> relevantInstances = memberNames.entrySet()
2046 .filter(n -> compInstancesNames.contains(n.getKey()))
2047 .collect(toMap(Entry::getKey, Entry::getValue));
2049 if (relevantInstances == null || relevantInstances.size() != compInstancesNames.size()) {
2051 List<String> foundMembers = new ArrayList<>();
2052 if (relevantInstances != null) {
2053 foundMembers = relevantInstances.keySet()
2057 compInstancesNames.removeAll(foundMembers);
2058 String membersAstString = compInstancesNames.stream()
2059 .collect(joining(","));
2060 log.debug("The members: {}, in group: {}, cannot be found in component: {}", membersAstString, groupName,
2061 component.getNormalizedName());
2062 throw new ByActionStatusComponentException(
2063 ActionStatus.GROUP_INVALID_COMPONENT_INSTANCE, membersAstString,
2064 groupName, component.getNormalizedName(), getComponentTypeForResponse(component));
2066 updatedGroupDefinition.setMembers(relevantInstances);
2070 * This Method validates that there is no cyclic group dependencies. meaning
2071 * group A as member in group B which is member in group A
2076 private Either<Boolean, ResponseFormat> validateCyclicGroupsDependencies(Map<String, GroupDefinition> allGroups) {
2078 Either<Boolean, ResponseFormat> result = Either.left(true);
2080 Iterator<Entry<String, GroupDefinition>> allGroupsItr = allGroups.entrySet()
2082 while (allGroupsItr.hasNext() && result.isLeft()) {
2083 Entry<String, GroupDefinition> groupAEntry = allGroupsItr.next();
2084 // Fetches a group member A
2085 String groupAName = groupAEntry.getKey();
2086 // Finds all group members in group A
2087 Set<String> allGroupAMembersNames = new HashSet<>();
2088 fillAllGroupMemebersRecursivly(groupAEntry.getKey(), allGroups, allGroupAMembersNames);
2089 // If A is a group member of itself found cyclic dependency
2090 if (allGroupAMembersNames.contains(groupAName)) {
2091 ResponseFormat responseFormat = componentsUtils
2092 .getResponseFormat(ActionStatus.GROUP_HAS_CYCLIC_DEPENDENCY, groupAName);
2093 result = Either.right(responseFormat);
2096 } catch (Exception e) {
2097 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
2098 result = Either.right(responseFormat);
2099 log.debug("Exception occurred when validateCyclicGroupsDependencies, error is:{}", e.getMessage(), e);
2105 * This Method fills recursively the set groupMembers with all the members
2106 * of the given group which are also of type group.
2110 * @param allGroupMembers
2113 private void fillAllGroupMemebersRecursivly(String groupName, Map<String, GroupDefinition> allGroups,
2114 Set<String> allGroupMembers) {
2116 // Found Cyclic dependency
2117 if (isfillGroupMemebersRecursivlyStopCondition(groupName, allGroups, allGroupMembers)) {
2120 GroupDefinition groupDefinition = allGroups.get(groupName);
2121 // All Members Of Current Group Resource Instances & Other Groups
2122 Set<String> currGroupMembers = groupDefinition.getMembers()
2124 // Filtered Members Of Current Group containing only members which
2126 List<String> currGroupFilteredMembers = currGroupMembers.stream()
2128 // Keep Only Elements of type group and not Resource Instances
2129 filter(allGroups::containsKey)
2131 // Add Filtered Elements to main Set
2132 peek(allGroupMembers::add)
2137 // Recursively call the method for all the filtered group members
2138 for (String innerGroupName : currGroupFilteredMembers) {
2139 fillAllGroupMemebersRecursivly(innerGroupName, allGroups, allGroupMembers);
2144 private boolean isfillGroupMemebersRecursivlyStopCondition(String groupName, Map<String, GroupDefinition> allGroups,
2145 Set<String> allGroupMembers) {
2147 boolean stop = false;
2148 // In Case Not Group Stop
2149 if (!allGroups.containsKey(groupName)) {
2152 // In Case Group Has no members stop
2154 GroupDefinition groupDefinition = allGroups.get(groupName);
2155 stop = isEmpty(groupDefinition.getMembers());
2158 // In Case all group members already contained stop
2160 final Set<String> allMembers = allGroups.get(groupName)
2163 Set<String> membersOfTypeGroup = allMembers.stream()
2165 // Filter In Only Group members
2166 filter(allGroups::containsKey)
2170 stop = allGroupMembers.containsAll(membersOfTypeGroup);
2175 private Resource createRIAndRelationsFromYaml(String yamlName, Resource resource,
2176 Map<String, UploadComponentInstanceInfo> uploadComponentInstanceInfoMap, String topologyTemplateYaml,
2177 List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, Map<String, NodeTypeInfo> nodeTypesInfo,
2179 Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToCreate,
2182 log.debug("************* Going to create all nodes {}", yamlName);
2183 handleNodeTypes(yamlName, resource, topologyTemplateYaml, false, nodeTypesArtifactsToCreate,
2184 nodeTypesNewCreatedArtifacts, nodeTypesInfo, csarInfo, nodeName);
2185 log.debug("************* Finished to create all nodes {}", yamlName);
2186 log.debug("************* Going to create all resource instances {}", yamlName);
2187 Map<String, Resource> existingNodeTypesByResourceNames = new HashMap<>();
2188 resource = createResourceInstances(yamlName, resource, null, uploadComponentInstanceInfoMap,
2189 csarInfo.getCreatedNodes(), existingNodeTypesByResourceNames);
2190 log.debug("************* Finished to create all resource instances {}", yamlName);
2191 log.debug("************* Going to create all relations {}", yamlName);
2192 resource = createResourceInstancesRelations(csarInfo.getModifier(), yamlName, resource, null, uploadComponentInstanceInfoMap, existingNodeTypesByResourceNames);
2193 log.debug("************* Finished to create all relations {}", yamlName);
2194 log.debug("************* Going to create positions {}", yamlName);
2195 compositionBusinessLogic.setPositionsForComponentInstances(resource, csarInfo.getModifier()
2197 log.debug("************* Finished to set positions {}", yamlName);
2201 private void handleAndAddExtractedVfcsArtifacts(List<ArtifactDefinition> vfcArtifacts,
2202 List<ArtifactDefinition> artifactsToAdd) {
2203 List<String> vfcArtifactNames = vfcArtifacts.stream()
2204 .map(ArtifactDataDefinition::getArtifactName)
2206 artifactsToAdd.stream()
2208 if (!vfcArtifactNames.contains(a.getArtifactName())) {
2209 vfcArtifacts.add(a);
2211 log.debug("Can't upload two artifact with the same name {}. ", a.getArtifactName());
2217 @SuppressWarnings("unchecked")
2218 private void handleNodeTypes(String yamlName, Resource resource, String topologyTemplateYaml, boolean needLock,
2219 Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle,
2220 List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, Map<String, NodeTypeInfo> nodeTypesInfo,
2221 CsarInfo csarInfo, String nodeName) {
2223 for (Entry<String, NodeTypeInfo> nodeTypeEntry : nodeTypesInfo.entrySet()) {
2224 if (nodeTypeEntry.getValue()
2227 handleNestedVfc(resource, nodeTypesArtifactsToHandle, nodeTypesNewCreatedArtifacts, nodeTypesInfo,
2228 csarInfo, nodeTypeEntry.getKey());
2229 log.trace("************* finished to create node {}", nodeTypeEntry.getKey());
2232 Map<String, Object> mappedToscaTemplate = null;
2233 if (StringUtils.isNotEmpty(nodeName) && isNotEmpty(nodeTypesInfo) && nodeTypesInfo.containsKey(nodeName)) {
2234 mappedToscaTemplate = nodeTypesInfo.get(nodeName)
2235 .getMappedToscaTemplate();
2237 if (isEmpty(mappedToscaTemplate)) {
2238 mappedToscaTemplate = (Map<String, Object>) new Yaml().load(topologyTemplateYaml);
2240 createResourcesFromYamlNodeTypesList(yamlName, resource, mappedToscaTemplate, needLock,
2241 nodeTypesArtifactsToHandle, nodeTypesNewCreatedArtifacts, nodeTypesInfo, csarInfo);
2242 } catch (ComponentException e) {
2243 ResponseFormat responseFormat = e.getResponseFormat() != null ? e.getResponseFormat()
2244 : componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams());
2245 componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), resource,
2246 AuditingActionEnum.IMPORT_RESOURCE);
2248 } catch (StorageException e) {
2249 ResponseFormat responseFormat = componentsUtils
2250 .getResponseFormat(componentsUtils.convertFromStorageResponse(e.getStorageOperationStatus()));
2251 componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), resource,
2252 AuditingActionEnum.IMPORT_RESOURCE);
2257 private Either<Resource, ResponseFormat> handleVfCsarArtifacts(Resource resource, CsarInfo csarInfo,
2258 List<ArtifactDefinition> createdArtifacts, ArtifactOperationInfo artifactOperation, boolean shouldLock,
2259 boolean inTransaction) {
2261 if (csarInfo.getCsar() != null) {
2262 String vendorLicenseModelId = null;
2263 String vfLicenseModelId = null;
2265 if (artifactOperation.isUpdate()) {
2266 Map<String, ArtifactDefinition> deploymentArtifactsMap = resource.getDeploymentArtifacts();
2267 if (deploymentArtifactsMap != null && !deploymentArtifactsMap.isEmpty()) {
2268 for (Entry<String, ArtifactDefinition> artifactEntry : deploymentArtifactsMap.entrySet()) {
2269 if (artifactEntry.getValue()
2271 .equalsIgnoreCase(Constants.VENDOR_LICENSE_MODEL)) {
2272 vendorLicenseModelId = artifactEntry.getValue()
2275 if (artifactEntry.getValue()
2277 .equalsIgnoreCase(Constants.VF_LICENSE_MODEL)) {
2278 vfLicenseModelId = artifactEntry.getValue()
2285 // Specific Behavior for license artifacts
2286 createOrUpdateSingleNonMetaArtifact(resource, csarInfo,
2287 CsarUtils.ARTIFACTS_PATH + Constants.VENDOR_LICENSE_MODEL, Constants.VENDOR_LICENSE_MODEL,
2288 ArtifactTypeEnum.VENDOR_LICENSE.getType(), ArtifactGroupTypeEnum.DEPLOYMENT,
2289 Constants.VENDOR_LICENSE_LABEL, Constants.VENDOR_LICENSE_DISPLAY_NAME,
2290 Constants.VENDOR_LICENSE_DESCRIPTION, vendorLicenseModelId, artifactOperation, null, true,
2291 shouldLock, inTransaction);
2292 createOrUpdateSingleNonMetaArtifact(resource, csarInfo,
2293 CsarUtils.ARTIFACTS_PATH + Constants.VF_LICENSE_MODEL, Constants.VF_LICENSE_MODEL,
2294 ArtifactTypeEnum.VF_LICENSE.getType(), ArtifactGroupTypeEnum.DEPLOYMENT, Constants.VF_LICENSE_LABEL,
2295 Constants.VF_LICENSE_DISPLAY_NAME, Constants.VF_LICENSE_DESCRIPTION, vfLicenseModelId,
2296 artifactOperation, null, true, shouldLock, inTransaction);
2298 Either<Resource, ResponseFormat> eitherCreateResult = createOrUpdateNonMetaArtifacts(csarInfo, resource,
2299 createdArtifacts, shouldLock, inTransaction, artifactOperation);
2300 if (eitherCreateResult.isRight()) {
2301 return Either.right(eitherCreateResult.right()
2305 Either<ImmutablePair<String, String>, ResponseFormat> artifacsMetaCsarStatus = CsarValidationUtils
2306 .getArtifactsMeta(csarInfo.getCsar(), csarInfo.getCsarUUID(), componentsUtils);
2308 if (artifacsMetaCsarStatus.isLeft()) {
2309 String artifactsFileName = artifacsMetaCsarStatus.left()
2312 String artifactsContents = artifacsMetaCsarStatus.left()
2315 Either<Resource, ResponseFormat> createArtifactsFromCsar;
2316 if (artifactOperation.isCreateOrLink()) {
2317 createArtifactsFromCsar = csarArtifactsAndGroupsBusinessLogic.createResourceArtifactsFromCsar(
2318 csarInfo, resource, artifactsContents, artifactsFileName, createdArtifacts);
2320 createArtifactsFromCsar = csarArtifactsAndGroupsBusinessLogic.updateResourceArtifactsFromCsar(
2321 csarInfo, resource, artifactsContents, artifactsFileName, createdArtifacts, shouldLock,
2325 if (createArtifactsFromCsar.isRight()) {
2326 log.debug("Couldn't create artifacts from artifacts.meta");
2327 return Either.right(createArtifactsFromCsar.right()
2331 return Either.left(createArtifactsFromCsar.left()
2335 return csarArtifactsAndGroupsBusinessLogic.deleteVFModules(resource, csarInfo, shouldLock,
2340 return Either.left(resource);
2343 private Either<Boolean, ResponseFormat> createOrUpdateSingleNonMetaArtifact(Resource resource, CsarInfo csarInfo,
2344 String artifactPath, String artifactFileName, String artifactType, ArtifactGroupTypeEnum artifactGroupType,
2345 String artifactLabel, String artifactDisplayName, String artifactDescription, String artifactId,
2346 ArtifactOperationInfo operation, List<ArtifactDefinition> createdArtifacts, boolean isFromCsar,
2347 boolean shouldLock, boolean inTransaction) {
2348 byte[] artifactFileBytes = null;
2350 if (csarInfo.getCsar()
2351 .containsKey(artifactPath)) {
2352 artifactFileBytes = csarInfo.getCsar()
2355 Either<Boolean, ResponseFormat> result = Either.left(true);
2356 if (operation.isUpdate() || operation.isDelete()) {
2357 if (isArtifactDeletionRequired(artifactId, artifactFileBytes, isFromCsar)) {
2358 Either<ArtifactDefinition, ResponseFormat> handleDelete = artifactsBusinessLogic
2359 .handleDelete(resource.getUniqueId(), artifactId, csarInfo.getModifier(),
2360 resource, shouldLock,
2362 if (handleDelete.isRight()) {
2363 result = Either.right(handleDelete.right()
2366 ArtifactDefinition value = handleDelete.left().value();
2367 String updatedArtifactId = value.getUniqueId();
2368 if (artifactGroupType == ArtifactGroupTypeEnum.DEPLOYMENT) {
2369 resource.getDeploymentArtifacts().remove(updatedArtifactId);
2371 resource.getArtifacts().remove(updatedArtifactId);
2377 if (StringUtils.isEmpty(artifactId) && artifactFileBytes != null) {
2378 operation = new ArtifactOperationInfo(false, false,
2379 ArtifactOperationEnum.CREATE);
2383 if (artifactFileBytes != null) {
2384 Map<String, Object> vendorLicenseModelJson = ArtifactUtils.buildJsonForUpdateArtifact(artifactId,
2385 artifactFileName, artifactType, artifactGroupType, artifactLabel, artifactDisplayName,
2386 artifactDescription, artifactFileBytes, null, isFromCsar);
2387 Either<Either<ArtifactDefinition, Operation>, ResponseFormat> eitherNonMetaArtifacts = csarArtifactsAndGroupsBusinessLogic
2388 .createOrUpdateCsarArtifactFromJson(resource, csarInfo.getModifier(), vendorLicenseModelJson,
2390 addNonMetaCreatedArtifactsToSupportRollback(operation, createdArtifacts, eitherNonMetaArtifacts);
2391 if (eitherNonMetaArtifacts.isRight()) {
2392 BeEcompErrorManager.getInstance()
2393 .logInternalFlowError("UploadLicenseArtifact", "Failed to upload license artifact: "
2394 + artifactFileName + "With csar uuid: " + csarInfo.getCsarUUID(),
2395 ErrorSeverity.WARNING);
2396 return Either.right(eitherNonMetaArtifacts.right()
2399 ArtifactDefinition artifactDefinition = eitherNonMetaArtifacts.left().value().left().value();
2400 createOrUpdateResourceWithUpdatedArtifact(artifactDefinition,resource, artifactGroupType);
2406 private void createOrUpdateResourceWithUpdatedArtifact(ArtifactDefinition artifact, Resource resource, ArtifactGroupTypeEnum groupTypeEnum) {
2407 if (groupTypeEnum == ArtifactGroupTypeEnum.DEPLOYMENT) {
2408 resource.getDeploymentArtifacts().put(artifact.getArtifactLabel(), artifact);
2410 resource.getArtifacts().put(artifact.getArtifactLabel(), artifact);
2414 private boolean isArtifactDeletionRequired(String artifactId, byte[] artifactFileBytes, boolean isFromCsar) {
2415 return !StringUtils.isEmpty(artifactId) && artifactFileBytes == null && isFromCsar;
2418 private void addNonMetaCreatedArtifactsToSupportRollback(ArtifactOperationInfo operation,
2419 List<ArtifactDefinition> createdArtifacts,
2420 Either<Either<ArtifactDefinition, Operation>, ResponseFormat> eitherNonMetaArtifacts) {
2421 if (operation.isCreateOrLink() && createdArtifacts != null
2422 && eitherNonMetaArtifacts.isLeft()) {
2423 Either<ArtifactDefinition, Operation> eitherResult = eitherNonMetaArtifacts.left()
2425 if (eitherResult.isLeft()) {
2426 createdArtifacts.add(eitherResult.left()
2432 private Either<Resource, ResponseFormat> createOrUpdateNonMetaArtifacts(CsarInfo csarInfo, Resource resource,
2433 List<ArtifactDefinition> createdArtifacts, boolean shouldLock, boolean inTransaction,
2434 ArtifactOperationInfo artifactOperation) {
2436 Either<Resource, ResponseFormat> resStatus = null;
2437 Map<String, Set<List<String>>> collectedWarningMessages = new HashMap<>();
2440 Either<List<NonMetaArtifactInfo>, String> artifactPathAndNameList = getValidArtifactNames(csarInfo,
2441 collectedWarningMessages);
2442 if (artifactPathAndNameList.isRight()) {
2443 return Either.right(getComponentsUtils().getResponseFormatByArtifactId(
2444 ActionStatus.ARTIFACT_NAME_INVALID, artifactPathAndNameList.right()
2447 EnumMap<ArtifactOperationEnum, List<NonMetaArtifactInfo>> vfCsarArtifactsToHandle = null;
2449 if (artifactOperation.isCreateOrLink()) {
2450 vfCsarArtifactsToHandle = new EnumMap<>(ArtifactOperationEnum.class);
2451 vfCsarArtifactsToHandle.put(artifactOperation.getArtifactOperationEnum(), artifactPathAndNameList.left()
2454 Either<EnumMap<ArtifactOperationEnum, List<NonMetaArtifactInfo>>, ResponseFormat> findVfCsarArtifactsToHandleRes = findVfCsarArtifactsToHandle(
2455 resource, artifactPathAndNameList.left()
2457 csarInfo.getModifier());
2459 if (findVfCsarArtifactsToHandleRes.isRight()) {
2460 resStatus = Either.right(findVfCsarArtifactsToHandleRes.right()
2463 if (resStatus == null) {
2464 vfCsarArtifactsToHandle = findVfCsarArtifactsToHandleRes.left()
2468 if (resStatus == null && vfCsarArtifactsToHandle != null) {
2469 resStatus = processCsarArtifacts(csarInfo, resource, createdArtifacts, shouldLock, inTransaction,
2470 resStatus, vfCsarArtifactsToHandle);
2472 if (resStatus == null) {
2473 resStatus = Either.left(resource);
2475 } catch (Exception e) {
2476 resStatus = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
2477 log.debug("Exception occurred in createNonMetaArtifacts, message:{}", e.getMessage(), e);
2479 CsarUtils.handleWarningMessages(collectedWarningMessages);
2484 private Either<Resource, ResponseFormat> processCsarArtifacts(CsarInfo csarInfo, Resource resource,
2485 List<ArtifactDefinition> createdArtifacts, boolean shouldLock, boolean inTransaction,
2486 Either<Resource, ResponseFormat> resStatus,
2487 EnumMap<ArtifactOperationEnum, List<NonMetaArtifactInfo>> vfCsarArtifactsToHandle) {
2488 for (Entry<ArtifactOperationEnum, List<NonMetaArtifactInfo>> currArtifactOperationPair : vfCsarArtifactsToHandle
2491 Optional<ResponseFormat> optionalCreateInDBError =
2492 // Stream of artifacts to be created
2493 currArtifactOperationPair.getValue()
2495 // create each artifact
2496 .map(e -> createOrUpdateSingleNonMetaArtifact(resource, csarInfo, e.getPath(),
2497 e.getArtifactName(), e.getArtifactType(),
2498 e.getArtifactGroupType(), e.getArtifactLabel(), e.getDisplayName(),
2499 CsarUtils.ARTIFACT_CREATED_FROM_CSAR, e.getArtifactUniqueId(),
2500 new ArtifactOperationInfo(false, false,
2501 currArtifactOperationPair.getKey()),
2502 createdArtifacts, e.isFromCsar(), shouldLock, inTransaction))
2503 // filter in only error
2504 .filter(Either::isRight)
2506 // Convert the error from either to
2511 // Check if an error occurred
2513 // Error found on artifact Creation
2514 if (optionalCreateInDBError.isPresent()) {
2515 resStatus = Either.right(optionalCreateInDBError.get());
2522 private Either<List<NonMetaArtifactInfo>, String> getValidArtifactNames(CsarInfo csarInfo,
2523 Map<String, Set<List<String>>> collectedWarningMessages) {
2524 List<NonMetaArtifactInfo> artifactPathAndNameList =
2525 // Stream of file paths contained in csar
2529 // Filter in only VF artifact path location
2530 .filter(e -> Pattern.compile(VF_NODE_TYPE_ARTIFACTS_PATH_PATTERN)
2531 .matcher(e.getKey())
2533 // Validate and add warnings
2534 .map(e -> CsarUtils.validateNonMetaArtifact(e.getKey(), e.getValue(), collectedWarningMessages))
2535 // Filter in Non Warnings
2536 .filter(Either::isLeft)
2537 // Convert from Either to NonMetaArtifactInfo
2542 Pattern englishNumbersAndUnderScoresOnly = Pattern.compile(CsarUtils.VALID_ENGLISH_ARTIFACT_NAME);
2543 for (NonMetaArtifactInfo nonMetaArtifactInfo : artifactPathAndNameList) {
2544 if (!englishNumbersAndUnderScoresOnly.matcher(nonMetaArtifactInfo.getDisplayName())
2546 return Either.right(nonMetaArtifactInfo.getArtifactName());
2549 return Either.left(artifactPathAndNameList);
2552 private Either<EnumMap<ArtifactOperationEnum, List<NonMetaArtifactInfo>>, ResponseFormat> findVfCsarArtifactsToHandle(
2553 Resource resource, List<NonMetaArtifactInfo> artifactPathAndNameList, User user) {
2555 List<ArtifactDefinition> existingArtifacts = new ArrayList<>();
2556 // collect all Deployment and Informational artifacts of VF
2557 if (resource.getDeploymentArtifacts() != null && !resource.getDeploymentArtifacts()
2559 existingArtifacts.addAll(resource.getDeploymentArtifacts()
2562 if (resource.getArtifacts() != null && !resource.getArtifacts()
2564 existingArtifacts.addAll(resource.getArtifacts()
2567 existingArtifacts = existingArtifacts.stream()
2568 // filter MANDATORY artifacts, LICENSE artifacts and artifacts
2569 // was created from HEAT.meta
2570 .filter(this::isNonMetaArtifact)
2573 List<String> artifactsToIgnore = new ArrayList<>();
2574 // collect IDs of Artifacts of VF which belongs to any group
2575 if (resource.getGroups() != null) {
2576 resource.getGroups()
2579 if (g.getArtifacts() != null && !g.getArtifacts()
2581 artifactsToIgnore.addAll(g.getArtifacts());
2585 existingArtifacts = existingArtifacts.stream()
2586 // filter artifacts which belongs to any group
2587 .filter(a -> !artifactsToIgnore.contains(a.getUniqueId()))
2589 return organizeVfCsarArtifactsByArtifactOperation(artifactPathAndNameList, existingArtifacts, resource, user);
2592 private boolean isNonMetaArtifact(ArtifactDefinition artifact) {
2593 boolean result = true;
2594 if (artifact.getMandatory() || artifact.getArtifactName() == null || !isValidArtifactType(artifact)) {
2600 private boolean isValidArtifactType(ArtifactDefinition artifact) {
2601 boolean result = true;
2602 if (artifact.getArtifactType() == null
2603 || ArtifactTypeEnum.parse(artifact.getArtifactType()) == ArtifactTypeEnum.VENDOR_LICENSE
2604 || ArtifactTypeEnum.parse(artifact.getArtifactType()) == ArtifactTypeEnum.VF_LICENSE) {
2610 private Resource createResourceInstancesRelations(User user, String yamlName, Resource resource, Resource oldResource,
2611 Map<String, UploadComponentInstanceInfo> uploadResInstancesMap, Map<String, Resource> existingNodeTypesByResourceNames) {
2612 log.debug("#createResourceInstancesRelations - Going to create relations ");
2613 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,resource.getComponentMetadataForSupportLog(), StatusCode.STARTED,"Start to create relations");
2614 List<ComponentInstance> componentInstancesList = resource.getComponentInstances();
2615 if (isEmpty(uploadResInstancesMap) || CollectionUtils.isEmpty(componentInstancesList) &&
2616 resource.getResourceType() != ResourceTypeEnum.PNF) { // PNF can have no resource instances {
2618 "#createResourceInstancesRelations - No instances found in the resource {} is empty, yaml template file name {}, ",
2619 resource.getUniqueId(), yamlName);
2620 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,resource.getComponentMetadataForSupportLog(), StatusCode.ERROR,"No instances found in the resource: {}, is empty, yaml template file name: {}",resource.getName(),yamlName);
2621 BeEcompErrorManager.getInstance()
2622 .logInternalDataError("createResourceInstancesRelations",
2623 "No instances found in a resource or nn yaml template. ", ErrorSeverity.ERROR);
2624 throw new ByActionStatusComponentException(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
2626 Map<String, List<ComponentInstanceProperty>> instProperties = new HashMap<>();
2627 Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilities = new HashMap<>();
2628 Map<ComponentInstance, Map<String, List<RequirementDefinition>>> instRequirements = new HashMap<>();
2629 Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts = new HashMap<>();
2630 Map<String, Map<String, ArtifactDefinition>> instArtifacts = new HashMap<>();
2631 Map<String, List<AttributeDataDefinition>> instAttributes = new HashMap<>();
2632 List<RequirementCapabilityRelDef> relations = new ArrayList<>();
2633 Map<String, List<ComponentInstanceInput>> instInputs = new HashMap<>();
2635 log.debug("#createResourceInstancesRelations - Before get all datatypes. ");
2636 Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes = dataTypeCache.getAll();
2637 if (allDataTypes.isRight()) {
2638 JanusGraphOperationStatus status = allDataTypes.right()
2640 BeEcompErrorManager.getInstance()
2641 .logInternalFlowError("UpdatePropertyValueOnComponentInstance",
2642 "Failed to update property value on instance. Status is " + status, ErrorSeverity.ERROR);
2643 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,resource.getComponentMetadataForSupportLog(),
2644 StatusCode.ERROR,"ERROR while update property value on instance. Status is: "+status);
2645 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(
2646 DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status)), yamlName);
2649 Resource finalResource = resource;
2650 uploadResInstancesMap.values()
2651 .forEach(i -> processComponentInstance(yamlName, finalResource, componentInstancesList, allDataTypes,
2652 instProperties, instCapabilities, instRequirements, instDeploymentArtifacts, instArtifacts,
2653 instAttributes, existingNodeTypesByResourceNames, instInputs, i));
2654 resource.getComponentInstances()
2656 .filter(i -> !i.isCreatedFromCsar())
2657 .forEach(i->processUiComponentInstance(oldResource, i, instCapabilities, instRequirements, instDeploymentArtifacts, instArtifacts, instProperties, instInputs, instAttributes));
2659 associateComponentInstancePropertiesToComponent(yamlName, resource, instProperties);
2660 associateComponentInstanceInputsToComponent(yamlName, resource, instInputs);
2661 associateDeploymentArtifactsToInstances(user, yamlName, resource, instDeploymentArtifacts);
2662 associateArtifactsToInstances(yamlName, resource, instArtifacts);
2663 associateOrAddCalculatedCapReq(yamlName, resource, instCapabilities, instRequirements);
2664 associateInstAttributeToComponentToInstances(yamlName, resource, instAttributes);
2665 addRelationsToRI(yamlName, resource, uploadResInstancesMap, componentInstancesList, relations);
2666 associateResourceInstances(yamlName, resource, relations);
2667 handleSubstitutionMappings(resource, uploadResInstancesMap);
2668 log.debug("************* in create relations, getResource start");
2669 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,resource.getComponentMetadataForSupportLog(), StatusCode.COMPLETE,"create relations");
2670 Either<Resource, StorageOperationStatus> eitherGetResource = toscaOperationFacade
2671 .getToscaFullElement(resource.getUniqueId());
2672 log.debug("************* in create relations, getResource end");
2673 if (eitherGetResource.isRight()) {
2674 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,resource.getComponentMetadataForSupportLog(),
2675 StatusCode.ERROR,"ERROR while create relations");
2676 throw new ByResponseFormatComponentException(componentsUtils
2677 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(eitherGetResource.right()
2678 .value()), resource));
2680 return eitherGetResource.left()
2684 private void processUiComponentInstance(Resource oldResource, ComponentInstance instance,
2685 Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilities,
2686 Map<ComponentInstance, Map<String, List<RequirementDefinition>>> instRequirements,
2687 Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts,
2688 Map<String, Map<String, ArtifactDefinition>> instArtifacts, Map<String,
2689 List<ComponentInstanceProperty>> instProperties, Map<String,
2690 List<ComponentInstanceInput>> instInputs,
2691 Map<String, List<AttributeDataDefinition>> instAttributes) {
2692 Optional<ComponentInstance> foundInstance = findInstance(oldResource, instance);
2693 if (foundInstance.isPresent()) {
2694 if (MapUtils.isNotEmpty(foundInstance.get().getCapabilities())) {
2695 instCapabilities.put(instance, foundInstance.get().getCapabilities());
2697 if (MapUtils.isNotEmpty(foundInstance.get().getRequirements())) {
2698 instRequirements.put(instance, foundInstance.get().getRequirements());
2700 if (MapUtils.isNotEmpty(foundInstance.get().getDeploymentArtifacts())) {
2701 instDeploymentArtifacts.put(instance.getUniqueId(), foundInstance.get().getDeploymentArtifacts());
2703 if(MapUtils.isNotEmpty(foundInstance.get().getArtifacts())){
2704 instArtifacts.put(instance.getUniqueId(), foundInstance.get().getArtifacts());
2706 if (MapUtils.isNotEmpty(oldResource.getComponentInstancesProperties()) &&
2708 .isNotEmpty(oldResource.getComponentInstancesProperties().get(foundInstance.get().getUniqueId()))) {
2709 instProperties.put(instance.getUniqueId(),
2710 oldResource.getComponentInstancesProperties().get(foundInstance.get().getUniqueId()));
2712 if (MapUtils.isNotEmpty(oldResource.getComponentInstancesInputs()) &&
2714 .isNotEmpty(oldResource.getComponentInstancesInputs().get(foundInstance.get().getUniqueId()))) {
2715 instInputs.put(instance.getUniqueId(),
2716 oldResource.getComponentInstancesInputs().get(foundInstance.get().getUniqueId()));
2718 if(MapUtils.isNotEmpty(oldResource.getComponentInstancesAttributes()) &&
2719 CollectionUtils.isNotEmpty(oldResource.getComponentInstancesAttributes().get(foundInstance.get().getUniqueId()))){
2720 instAttributes.put(instance.getUniqueId(), oldResource.getComponentInstancesAttributes().get(foundInstance.get().getUniqueId()).stream().map(AttributeDefinition::new).collect(toList()));
2725 private Optional<ComponentInstance> findInstance(Resource oldResource, ComponentInstance instance) {
2726 if(oldResource != null && CollectionUtils.isNotEmpty(oldResource.getComponentInstances())) {
2727 return oldResource.getComponentInstances().stream().filter(i -> i.getName().equals(instance.getName())).findFirst();
2729 return Optional.empty();
2732 private void associateResourceInstances(String yamlName, Resource resource,
2733 List<RequirementCapabilityRelDef> relations) {
2734 Either<List<RequirementCapabilityRelDef>, StorageOperationStatus> relationsEither = toscaOperationFacade.associateResourceInstances(resource, resource.getUniqueId(), relations);
2736 if (relationsEither.isRight() && relationsEither.right().value() != StorageOperationStatus.NOT_FOUND) {
2737 StorageOperationStatus status = relationsEither.right().value();
2738 log.debug("failed to associate instances of resource {} status is {}", resource.getUniqueId(),
2740 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(status), yamlName);
2742 setResourceInstanceRelationsOnComponent(resource, relationsEither.left().value());
2746 private void associateInstAttributeToComponentToInstances(String yamlName, Resource resource,
2747 Map<String, List<AttributeDataDefinition>> instAttributes) {
2748 StorageOperationStatus addArtToInst;
2749 addArtToInst = toscaOperationFacade.associateInstAttributeToComponentToInstances(instAttributes,
2751 if (addArtToInst != StorageOperationStatus.OK && addArtToInst != StorageOperationStatus.NOT_FOUND) {
2752 log.debug("failed to associate attributes of resource {} status is {}", resource.getUniqueId(),
2754 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(addArtToInst),
2759 private void associateOrAddCalculatedCapReq(String yamlName, Resource resource,
2760 Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilities,
2761 Map<ComponentInstance, Map<String, List<RequirementDefinition>>> instRequirements) {
2762 StorageOperationStatus addArtToInst;
2763 addArtToInst = toscaOperationFacade.associateOrAddCalculatedCapReq(instCapabilities, instRequirements,
2765 if (addArtToInst != StorageOperationStatus.OK && addArtToInst != StorageOperationStatus.NOT_FOUND) {
2766 log.debug("failed to associate cap and req of resource {} status is {}", resource.getUniqueId(),
2768 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(addArtToInst), yamlName);
2772 private void associateArtifactsToInstances(String yamlName, Resource resource,
2773 Map<String, Map<String, ArtifactDefinition>> instArtifacts) {
2774 StorageOperationStatus addArtToInst;
2776 addArtToInst = toscaOperationFacade.associateArtifactsToInstances(instArtifacts, resource);
2777 if (addArtToInst != StorageOperationStatus.OK && addArtToInst != StorageOperationStatus.NOT_FOUND) {
2778 log.debug("failed to associate artifact of resource {} status is {}", resource.getUniqueId(), addArtToInst);
2779 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(addArtToInst), yamlName);
2783 private void associateDeploymentArtifactsToInstances(User user, String yamlName, Resource resource,
2784 Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts) {
2785 StorageOperationStatus addArtToInst = toscaOperationFacade
2786 .associateDeploymentArtifactsToInstances(instDeploymentArtifacts, resource, user);
2787 if (addArtToInst != StorageOperationStatus.OK && addArtToInst != StorageOperationStatus.NOT_FOUND) {
2788 log.debug("failed to associate artifact of resource {} status is {}", resource.getUniqueId(), addArtToInst);
2789 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(addArtToInst), yamlName);
2793 private void associateComponentInstanceInputsToComponent(String yamlName, Resource resource,
2794 Map<String, List<ComponentInstanceInput>> instInputs) {
2795 if (MapUtils.isNotEmpty(instInputs)) {
2796 Either<Map<String, List<ComponentInstanceInput>>, StorageOperationStatus> addInputToInst = toscaOperationFacade
2797 .associateComponentInstanceInputsToComponent(instInputs, resource.getUniqueId());
2798 if (addInputToInst.isRight()) {
2800 StorageOperationStatus addInputToInstError = addInputToInst.right().value();
2801 log.debug("failed to associate inputs value of resource {} status is {}", resource.getUniqueId(),
2802 addInputToInstError);
2803 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(addInputToInstError), yamlName);
2805 setComponentInstanceInputsOnComponent(resource, instInputs);
2809 private void setComponentInstanceInputsOnComponent(Resource resource, Map<String, List<ComponentInstanceInput>> instInputs) {
2810 Map<String, List<ComponentInstanceInput>> componentInstancesInputs = resource.getComponentInstancesInputs();
2811 if (componentInstancesInputs == null)
2812 componentInstancesInputs = new HashMap<>();
2813 componentInstancesInputs.putAll(instInputs);
2814 resource.setComponentInstancesInputs(componentInstancesInputs);
2817 private void associateComponentInstancePropertiesToComponent(String yamlName, Resource resource,
2818 Map<String, List<ComponentInstanceProperty>> instProperties) {
2819 Either<Map<String, List<ComponentInstanceProperty>>, StorageOperationStatus> addPropToInst = toscaOperationFacade
2820 .associateComponentInstancePropertiesToComponent(instProperties, resource.getUniqueId());
2821 if (addPropToInst.isRight()) {
2822 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,resource.getComponentMetadataForSupportLog(),
2823 StatusCode.ERROR,"ERROR while associate compnent insatnce properties of resource: {} status is: {}",resource.getName(),addPropToInst.right().value());
2824 StorageOperationStatus storageOperationStatus = addPropToInst.right().value();
2825 log.debug("failed to associate properties of resource {} status is {}", resource.getUniqueId(),
2826 storageOperationStatus);
2827 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(storageOperationStatus), yamlName);
2829 setComponentInstancePropertiesOnComponent(resource, instProperties);
2832 private void setComponentInstancePropertiesOnComponent(Resource resource, Map<String, List<ComponentInstanceProperty>> instProperties) {
2833 Map<String, List<ComponentInstanceProperty>> componentInstanceProps = resource.getComponentInstancesProperties();
2834 if (componentInstanceProps == null )
2835 componentInstanceProps = new HashMap<>();
2836 componentInstanceProps.putAll(instProperties);
2837 resource.setComponentInstancesProperties(componentInstanceProps);
2840 private void handleSubstitutionMappings(Resource resource,
2841 Map<String, UploadComponentInstanceInfo> uploadResInstancesMap) {
2842 if (resource.getResourceType() == ResourceTypeEnum.CVFC) {
2843 Either<Resource, StorageOperationStatus> getResourceRes =
2844 updateCalculatedCapReqWithSubstitutionMappings(resource, uploadResInstancesMap);
2845 if (getResourceRes.isRight()) {
2846 ResponseFormat responseFormat = componentsUtils
2847 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(getResourceRes.right()
2848 .value()), resource);
2849 throw new ByResponseFormatComponentException(responseFormat);
2854 private void addRelationsToRI(String yamlName, Resource resource,
2855 Map<String, UploadComponentInstanceInfo> uploadResInstancesMap,
2856 List<ComponentInstance> componentInstancesList, List<RequirementCapabilityRelDef> relations) {
2857 for (Entry<String, UploadComponentInstanceInfo> entry : uploadResInstancesMap.entrySet()) {
2858 UploadComponentInstanceInfo uploadComponentInstanceInfo = entry.getValue();
2859 ComponentInstance currentCompInstance = null;
2860 for (ComponentInstance compInstance : componentInstancesList) {
2862 if (compInstance.getName()
2863 .equals(uploadComponentInstanceInfo.getName())) {
2864 currentCompInstance = compInstance;
2869 if (currentCompInstance == null) {
2870 log.debug(COMPONENT_INSTANCE_WITH_NAME_IN_RESOURCE, uploadComponentInstanceInfo.getName(),
2871 resource.getUniqueId());
2872 BeEcompErrorManager.getInstance()
2873 .logInternalDataError(
2874 COMPONENT_INSTANCE_WITH_NAME + uploadComponentInstanceInfo.getName() + IN_RESOURCE,
2875 resource.getUniqueId(), ErrorSeverity.ERROR);
2876 throw new ByActionStatusComponentException(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
2879 ResponseFormat addRelationToRiRes = addRelationToRI(yamlName, resource, entry.getValue(), relations);
2880 if (addRelationToRiRes.getStatus() != 200) {
2881 throw new ByResponseFormatComponentException(addRelationToRiRes);
2887 private void setResourceInstanceRelationsOnComponent(Resource resource, List<RequirementCapabilityRelDef> relations) {
2888 if (resource.getComponentInstancesRelations() != null) {
2889 resource.getComponentInstancesRelations().addAll(relations);
2891 resource.setComponentInstancesRelations(relations);
2895 private void processComponentInstance(String yamlName, Resource resource,
2896 List<ComponentInstance> componentInstancesList,
2897 Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes,
2898 Map<String, List<ComponentInstanceProperty>> instProperties,
2899 Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilties,
2900 Map<ComponentInstance, Map<String, List<RequirementDefinition>>> instRequirements,
2901 Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts,
2902 Map<String, Map<String, ArtifactDefinition>> instArtifacts,
2903 Map<String, List<AttributeDataDefinition>> instAttributes,
2904 Map<String, Resource> originCompMap,
2905 Map<String, List<ComponentInstanceInput>> instInputs,
2906 UploadComponentInstanceInfo uploadComponentInstanceInfo) {
2907 Optional<ComponentInstance> currentCompInstanceOpt = componentInstancesList.stream()
2908 .filter(i -> i.getName()
2909 .equals(uploadComponentInstanceInfo.getName()))
2911 if (!currentCompInstanceOpt.isPresent()) {
2912 log.debug(COMPONENT_INSTANCE_WITH_NAME_IN_RESOURCE, uploadComponentInstanceInfo.getName(),
2913 resource.getUniqueId());
2914 BeEcompErrorManager.getInstance()
2915 .logInternalDataError(
2916 COMPONENT_INSTANCE_WITH_NAME + uploadComponentInstanceInfo.getName() + IN_RESOURCE,
2917 resource.getUniqueId(), ErrorSeverity.ERROR);
2918 throw new ByActionStatusComponentException(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
2920 ComponentInstance currentCompInstance = currentCompInstanceOpt.get();
2921 String resourceInstanceId = currentCompInstance.getUniqueId();
2922 Resource originResource = getOriginResource(originCompMap, currentCompInstance);
2923 if (isNotEmpty(originResource.getRequirements())) {
2924 instRequirements.put(currentCompInstance, originResource.getRequirements());
2926 if (isNotEmpty(originResource.getCapabilities())) {
2927 processComponentInstanceCapabilities(allDataTypes, instCapabilties, uploadComponentInstanceInfo,
2928 currentCompInstance, originResource);
2930 if (originResource.getDeploymentArtifacts() != null && !originResource.getDeploymentArtifacts()
2932 instDeploymentArtifacts.put(resourceInstanceId, originResource.getDeploymentArtifacts());
2934 if (originResource.getArtifacts() != null && !originResource.getArtifacts().isEmpty()) {
2935 instArtifacts.put(resourceInstanceId, originResource.getArtifacts());
2937 if (originResource.getAttributes() != null && !originResource.getAttributes().isEmpty()) {
2938 instAttributes.put(resourceInstanceId, originResource.getAttributes());
2940 if (originResource.getResourceType() != ResourceTypeEnum.CVFC) {
2941 ResponseFormat addPropertiesValueToRiRes = addPropertyValuesToRi(uploadComponentInstanceInfo, resource,
2942 originResource, currentCompInstance, instProperties, allDataTypes.left()
2944 if (addPropertiesValueToRiRes.getStatus() != 200) {
2945 throw new ByResponseFormatComponentException(addPropertiesValueToRiRes);
2948 addInputsValuesToRi(uploadComponentInstanceInfo, resource, originResource, currentCompInstance, instInputs,
2954 private Resource getOriginResource(Map<String, Resource> originCompMap, ComponentInstance currentCompInstance) {
2955 Resource originResource;
2956 if (!originCompMap.containsKey(currentCompInstance.getComponentUid())) {
2957 Either<Resource, StorageOperationStatus> getOriginResourceRes = toscaOperationFacade
2958 .getToscaFullElement(currentCompInstance.getComponentUid());
2959 if (getOriginResourceRes.isRight()) {
2960 log.debug("failed to fetch resource with uniqueId {} and tosca component name {} status is {}",
2961 currentCompInstance.getComponentUid(), currentCompInstance.getToscaComponentName(),
2962 getOriginResourceRes);
2963 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(getOriginResourceRes.right()
2964 .value()), currentCompInstance.getComponentUid());
2966 originResource = getOriginResourceRes.left()
2968 originCompMap.put(originResource.getUniqueId(), originResource);
2970 originResource = originCompMap.get(currentCompInstance.getComponentUid());
2972 return originResource;
2975 private void processComponentInstanceCapabilities(
2976 Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes,
2977 Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilties,
2978 UploadComponentInstanceInfo uploadComponentInstanceInfo, ComponentInstance currentCompInstance,
2979 Resource originResource) {
2980 Map<String, List<CapabilityDefinition>> originCapabilities;
2981 if (isNotEmpty(uploadComponentInstanceInfo.getCapabilities())) {
2982 originCapabilities = new HashMap<>();
2983 Map<String, Map<String, UploadPropInfo>> newPropertiesMap = new HashMap<>();
2984 originResource.getCapabilities()
2985 .forEach((k, v) -> addCapabilities(originCapabilities, k, v));
2986 uploadComponentInstanceInfo.getCapabilities()
2988 .forEach(l -> addCapabilitiesProperties(newPropertiesMap, l));
2989 updateCapabilityPropertiesValues(allDataTypes, originCapabilities, newPropertiesMap);
2991 originCapabilities = originResource.getCapabilities();
2993 instCapabilties.put(currentCompInstance, originCapabilities);
2996 private void updateCapabilityPropertiesValues(
2997 Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes,
2998 Map<String, List<CapabilityDefinition>> originCapabilities,
2999 Map<String, Map<String, UploadPropInfo>> newPropertiesMap) {
3000 originCapabilities.values()
3002 .flatMap(Collection::stream)
3003 .filter(c -> newPropertiesMap.containsKey(c.getName()))
3004 .forEach(c -> updatePropertyValues(c.getProperties(), newPropertiesMap.get(c.getName()),
3009 private void addCapabilitiesProperties(Map<String, Map<String, UploadPropInfo>> newPropertiesMap,
3010 List<UploadCapInfo> capabilities) {
3011 for (UploadCapInfo capability : capabilities) {
3012 if (isNotEmpty(capability.getProperties())) {
3013 newPropertiesMap.put(capability.getName(), capability.getProperties()
3015 .collect(toMap(UploadInfo::getName, p -> p)));
3020 private void addCapabilities(Map<String, List<CapabilityDefinition>> originCapabilities, String type,
3021 List<CapabilityDefinition> capabilities) {
3022 List<CapabilityDefinition> list = capabilities.stream()
3023 .map(CapabilityDefinition::new)
3025 originCapabilities.put(type, list);
3028 private void updatePropertyValues(List<ComponentInstanceProperty> properties,
3029 Map<String, UploadPropInfo> newProperties, Map<String, DataTypeDefinition> allDataTypes) {
3030 properties.forEach(p -> updatePropertyValue(p, newProperties.get(p.getName()), allDataTypes));
3033 private String updatePropertyValue(ComponentInstanceProperty property, UploadPropInfo propertyInfo,
3034 Map<String, DataTypeDefinition> allDataTypes) {
3035 String value = null;
3036 List<GetInputValueDataDefinition> getInputs = null;
3037 boolean isValidate = true;
3038 if (null != propertyInfo && propertyInfo.getValue() != null) {
3039 getInputs = propertyInfo.getGet_input();
3040 isValidate = getInputs == null || getInputs.isEmpty();
3042 value = getPropertyJsonStringValue(propertyInfo.getValue(), property.getType());
3044 value = getPropertyJsonStringValue(propertyInfo.getValue(),
3045 TypeUtils.ToscaTagNamesEnum.GET_INPUT.getElementName());
3048 property.setValue(value);
3049 return validatePropValueBeforeCreate(property, value, isValidate, allDataTypes);
3052 private Either<Resource, StorageOperationStatus> updateCalculatedCapReqWithSubstitutionMappings(Resource resource,
3053 Map<String, UploadComponentInstanceInfo> uploadResInstancesMap) {
3054 Either<Resource, StorageOperationStatus> updateRes = null;
3055 Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> updatedInstCapabilities = new HashMap<>();
3056 Map<ComponentInstance, Map<String, List<RequirementDefinition>>> updatedInstRequirements = new HashMap<>();
3057 StorageOperationStatus status = toscaOperationFacade
3058 .deleteAllCalculatedCapabilitiesRequirements(resource.getUniqueId());
3059 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
3061 "Failed to delete all calculated capabilities and requirements of resource {} upon update. Status is {}",
3062 resource.getUniqueId(), status);
3063 updateRes = Either.right(status);
3065 if (updateRes == null) {
3066 fillUpdatedInstCapabilitiesRequirements(resource.getComponentInstances(), uploadResInstancesMap,
3067 updatedInstCapabilities, updatedInstRequirements);
3068 status = toscaOperationFacade.associateOrAddCalculatedCapReq(updatedInstCapabilities,
3069 updatedInstRequirements, resource);
3070 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
3072 "Failed to associate capabilities and requirementss of resource {}, updated according to a substitution mapping. Status is {}",
3073 resource.getUniqueId(), status);
3074 updateRes = Either.right(status);
3077 if (updateRes == null) {
3078 updateRes = Either.left(resource);
3083 private void fillUpdatedInstCapabilitiesRequirements(List<ComponentInstance> componentInstances,
3084 Map<String, UploadComponentInstanceInfo> uploadResInstancesMap,
3085 Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> updatedInstCapabilities,
3086 Map<ComponentInstance, Map<String, List<RequirementDefinition>>> updatedInstRequirements) {
3088 componentInstances.stream()
3090 fillUpdatedInstCapabilities(updatedInstCapabilities, i, uploadResInstancesMap.get(i.getName())
3091 .getCapabilitiesNamesToUpdate());
3092 fillUpdatedInstRequirements(updatedInstRequirements, i, uploadResInstancesMap.get(i.getName())
3093 .getRequirementsNamesToUpdate());
3097 private void fillUpdatedInstRequirements(
3098 Map<ComponentInstance, Map<String, List<RequirementDefinition>>> updatedInstRequirements,
3099 ComponentInstance instance, Map<String, String> requirementsNamesToUpdate) {
3100 Map<String, List<RequirementDefinition>> updatedRequirements = new HashMap<>();
3101 Set<String> updatedReqNames = new HashSet<>();
3102 if (isNotEmpty(requirementsNamesToUpdate)) {
3103 for (Map.Entry<String, List<RequirementDefinition>> requirements : instance.getRequirements()
3105 updatedRequirements.put(requirements.getKey(), requirements.getValue()
3107 .filter(r -> requirementsNamesToUpdate.containsKey(r.getName())
3108 && !updatedReqNames.contains(requirementsNamesToUpdate.get(r.getName())))
3110 r.setParentName(r.getName());
3111 r.setName(requirementsNamesToUpdate.get(r.getName()));
3112 updatedReqNames.add(r.getName());
3115 .collect(toList()));
3118 if (isNotEmpty(updatedRequirements)) {
3119 updatedInstRequirements.put(instance, updatedRequirements);
3123 private void fillUpdatedInstCapabilities(
3124 Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> updatedInstCapabilties,
3125 ComponentInstance instance, Map<String, String> capabilitiesNamesToUpdate) {
3126 Map<String, List<CapabilityDefinition>> updatedCapabilities = new HashMap<>();
3127 Set<String> updatedCapNames = new HashSet<>();
3128 if (isNotEmpty(capabilitiesNamesToUpdate)) {
3129 for (Map.Entry<String, List<CapabilityDefinition>> requirements : instance.getCapabilities()
3131 updatedCapabilities.put(requirements.getKey(), requirements.getValue()
3133 .filter(c -> capabilitiesNamesToUpdate.containsKey(c.getName())
3134 && !updatedCapNames.contains(capabilitiesNamesToUpdate.get(c.getName())))
3136 c.setParentName(c.getName());
3137 c.setName(capabilitiesNamesToUpdate.get(c.getName()));
3138 updatedCapNames.add(c.getName());
3141 .collect(toList()));
3144 if (isNotEmpty(updatedCapabilities)) {
3145 updatedInstCapabilties.put(instance, updatedCapabilities);
3149 private ResponseFormat addRelationToRI(String yamlName, Resource resource,
3150 UploadComponentInstanceInfo nodesInfoValue, List<RequirementCapabilityRelDef> relations) {
3151 List<ComponentInstance> componentInstancesList = resource.getComponentInstances();
3153 ComponentInstance currentCompInstance = null;
3155 for (ComponentInstance compInstance : componentInstancesList) {
3157 if (compInstance.getName()
3158 .equals(nodesInfoValue.getName())) {
3159 currentCompInstance = compInstance;
3165 if (currentCompInstance == null) {
3166 log.debug(COMPONENT_INSTANCE_WITH_NAME_IN_RESOURCE, nodesInfoValue.getName(), resource.getUniqueId());
3167 BeEcompErrorManager.getInstance()
3168 .logInternalDataError(COMPONENT_INSTANCE_WITH_NAME + nodesInfoValue.getName() + IN_RESOURCE,
3169 resource.getUniqueId(), ErrorSeverity.ERROR);
3170 return componentsUtils.getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
3172 String resourceInstanceId = currentCompInstance.getUniqueId();
3174 Map<String, List<UploadReqInfo>> regMap = nodesInfoValue.getRequirements();
3176 if (regMap != null) {
3177 Iterator<Entry<String, List<UploadReqInfo>>> nodesRegValue = regMap.entrySet()
3180 while (nodesRegValue.hasNext()) {
3181 Entry<String, List<UploadReqInfo>> nodesRegInfoEntry = nodesRegValue.next();
3183 List<UploadReqInfo> uploadRegInfoList = nodesRegInfoEntry.getValue();
3184 for (UploadReqInfo uploadRegInfo : uploadRegInfoList) {
3185 log.debug("Going to create relation {}", uploadRegInfo.getName());
3186 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,resource.getComponentMetadataForSupportLog(), StatusCode.STARTED,"Started to create relations on instance: {}",uploadRegInfo.getName());
3187 String regName = uploadRegInfo.getName();
3188 RequirementCapabilityRelDef regCapRelDef = new RequirementCapabilityRelDef();
3189 regCapRelDef.setFromNode(resourceInstanceId);
3190 log.debug("try to find available requirement {} ", regName);
3191 Either<RequirementDefinition, ResponseFormat> eitherReqStatus = findAviableRequiremen(regName,
3192 yamlName, nodesInfoValue, currentCompInstance, uploadRegInfo.getCapabilityName());
3193 if (eitherReqStatus.isRight()) {
3194 log.debug("failed to find available requirement {} status is {}", regName,
3195 eitherReqStatus.right()
3197 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,resource.getComponentMetadataForSupportLog(), StatusCode.ERROR,"ERROR while search available requirement {} status is: {}",regName,eitherReqStatus.right().value());
3198 return eitherReqStatus.right()
3202 RequirementDefinition validReq = eitherReqStatus.left()
3204 List<CapabilityRequirementRelationship> reqAndRelationshipPairList = regCapRelDef
3205 .getRelationships();
3206 if (reqAndRelationshipPairList == null) {
3207 reqAndRelationshipPairList = new ArrayList<>();
3209 RelationshipInfo reqAndRelationshipPair = new RelationshipInfo();
3210 reqAndRelationshipPair.setRequirement(regName);
3211 reqAndRelationshipPair.setRequirementOwnerId(validReq.getOwnerId());
3212 reqAndRelationshipPair.setRequirementUid(validReq.getUniqueId());
3213 RelationshipImpl relationship = new RelationshipImpl();
3214 relationship.setType(validReq.getCapability());
3215 reqAndRelationshipPair.setRelationships(relationship);
3217 ComponentInstance currentCapCompInstance = null;
3218 for (ComponentInstance compInstance : componentInstancesList) {
3219 if (compInstance.getName()
3220 .equals(uploadRegInfo.getNode())) {
3221 currentCapCompInstance = compInstance;
3226 if (currentCapCompInstance == null) {
3227 log.debug("The component instance with name {} not found on resource {} ",
3228 uploadRegInfo.getNode(), resource.getUniqueId());
3229 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,resource.getComponentMetadataForSupportLog(), StatusCode.ERROR,"ERROR component instance with name: {} not found on resource: {}",uploadRegInfo.getNode(),resource.getUniqueId());
3230 BeEcompErrorManager.getInstance()
3231 .logInternalDataError(
3232 COMPONENT_INSTANCE_WITH_NAME + uploadRegInfo.getNode() + IN_RESOURCE,
3233 resource.getUniqueId(), ErrorSeverity.ERROR);
3234 return componentsUtils.getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
3236 regCapRelDef.setToNode(currentCapCompInstance.getUniqueId());
3237 log.debug("try to find aviable Capability req name is {} ", validReq.getName());
3238 CapabilityDefinition aviableCapForRel = findAvailableCapabilityByTypeOrName(validReq,
3239 currentCapCompInstance, uploadRegInfo);
3241 if (aviableCapForRel == null) {
3242 log.debug("aviable capability was not found. req name is {} component instance is {}",
3243 validReq.getName(), currentCapCompInstance.getUniqueId());
3244 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,resource.getComponentMetadataForSupportLog(), StatusCode.ERROR,"ERROR available capability was not found. req name is: {} component instance is: {}",validReq.getName(),currentCapCompInstance.getUniqueId());
3245 BeEcompErrorManager.getInstance()
3246 .logInternalDataError(
3247 "aviable capability was not found. req name is " + validReq.getName()
3248 + " component instance is " + currentCapCompInstance.getUniqueId(),
3249 resource.getUniqueId(), ErrorSeverity.ERROR);
3250 return componentsUtils.getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
3252 reqAndRelationshipPair.setCapability(aviableCapForRel.getName());
3253 reqAndRelationshipPair.setCapabilityUid(aviableCapForRel.getUniqueId());
3254 reqAndRelationshipPair.setCapabilityOwnerId(aviableCapForRel.getOwnerId());
3256 CapabilityRequirementRelationship capReqRel = new CapabilityRequirementRelationship();
3257 capReqRel.setRelation(reqAndRelationshipPair);
3258 reqAndRelationshipPairList.add(capReqRel);
3259 regCapRelDef.setRelationships(reqAndRelationshipPairList);
3260 relations.add(regCapRelDef);
3263 } else if (resource.getResourceType() != ResourceTypeEnum.CVFC) {
3264 return componentsUtils.getResponseFormat(ActionStatus.OK, yamlName);
3266 return componentsUtils.getResponseFormat(ActionStatus.OK);
3269 private void addInputsValuesToRi(UploadComponentInstanceInfo uploadComponentInstanceInfo, Resource resource,
3270 Resource originResource, ComponentInstance currentCompInstance,
3271 Map<String, List<ComponentInstanceInput>> instInputs, Map<String, DataTypeDefinition> allDataTypes) {
3272 Map<String, List<UploadPropInfo>> propMap = uploadComponentInstanceInfo.getProperties();
3273 if (MapUtils.isNotEmpty(propMap)) {
3274 Map<String, InputDefinition> currPropertiesMap = new HashMap<>();
3275 List<ComponentInstanceInput> instPropList = new ArrayList<>();
3277 if (CollectionUtils.isEmpty(originResource.getInputs())) {
3278 log.debug("failed to find properties ");
3279 loggerSupportability.log(LoggerSupportabilityActions.CREATE_INPUTS,resource.getComponentMetadataForSupportLog(),StatusCode.ERROR,"ERROR while try to find properties");
3280 throw new ByActionStatusComponentException(ActionStatus.PROPERTY_NOT_FOUND);
3282 originResource.getInputs()
3283 .forEach(p -> addInput(currPropertiesMap, p));
3284 for (List<UploadPropInfo> propertyList : propMap.values()) {
3285 processProperty(resource, currentCompInstance, allDataTypes, currPropertiesMap, instPropList,
3288 currPropertiesMap.values()
3289 .forEach(p -> instPropList.add(new ComponentInstanceInput(p)));
3290 instInputs.put(currentCompInstance.getUniqueId(), instPropList);
3294 private void processProperty(Resource resource, ComponentInstance currentCompInstance,
3295 Map<String, DataTypeDefinition> allDataTypes, Map<String, InputDefinition> currPropertiesMap,
3296 List<ComponentInstanceInput> instPropList, List<UploadPropInfo> propertyList) {
3297 UploadPropInfo propertyInfo = propertyList.get(0);
3298 String propName = propertyInfo.getName();
3299 if (!currPropertiesMap.containsKey(propName)) {
3300 loggerSupportability.log(LoggerSupportabilityActions.PROPERTY,resource.getComponentMetadataForSupportLog(),
3301 StatusCode.ERROR,"ERROR failed to find property: {}",propName);
3302 log.debug("failed to find property {} ", propName);
3303 throw new ByActionStatusComponentException(ActionStatus.PROPERTY_NOT_FOUND, propName);
3305 InputDefinition curPropertyDef = currPropertiesMap.get(propName);
3306 ComponentInstanceInput property = null;
3308 String value = null;
3309 List<GetInputValueDataDefinition> getInputs = null;
3310 boolean isValidate = true;
3311 if (propertyInfo.getValue() != null) {
3312 getInputs = propertyInfo.getGet_input();
3313 isValidate = getInputs == null || getInputs.isEmpty();
3315 value = getPropertyJsonStringValue(propertyInfo.getValue(), curPropertyDef.getType());
3317 value = getPropertyJsonStringValue(propertyInfo.getValue(),
3318 TypeUtils.ToscaTagNamesEnum.GET_INPUT.getElementName());
3321 String innerType = null;
3322 property = new ComponentInstanceInput(curPropertyDef, value, null);
3324 String validPropertyVAlue = validatePropValueBeforeCreate(property, value, isValidate, allDataTypes);
3326 property.setValue(validPropertyVAlue);
3328 if (isNotEmpty(getInputs)) {
3329 List<GetInputValueDataDefinition> getInputValues = new ArrayList<>();
3330 for (GetInputValueDataDefinition getInput : getInputs) {
3331 List<InputDefinition> inputs = resource.getInputs();
3332 if (CollectionUtils.isEmpty(inputs)) {
3333 loggerSupportability.log(LoggerSupportabilityActions.PROPERTY,resource.getComponentMetadataForSupportLog(),
3334 StatusCode.ERROR,"ERROR Failed to add property: "+propName+" to resource instance: {}. Inputs list is empty ",currentCompInstance.getUniqueId());
3335 log.debug("Failed to add property {} to resource instance {}. Inputs list is empty ", property,
3336 currentCompInstance.getUniqueId());
3337 throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
3340 Optional<InputDefinition> optional = inputs.stream()
3341 .filter(p -> p.getName()
3342 .equals(getInput.getInputName()))
3344 if (!optional.isPresent()) {
3345 loggerSupportability.log(LoggerSupportabilityActions.PROPERTY,resource.getComponentMetadataForSupportLog(),
3346 StatusCode.ERROR,"ERROR Failed to find input: "+getInput.getInputName());
3347 log.debug("Failed to find input {} ", getInput.getInputName());
3348 // @@TODO error message
3349 throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
3351 InputDefinition input = optional.get();
3352 getInput.setInputId(input.getUniqueId());
3353 getInputValues.add(getInput);
3355 GetInputValueDataDefinition getInputIndex = getInput.getGetInputIndex();
3356 processGetInput(getInputValues, inputs, getInputIndex);
3358 property.setGetInputValues(getInputValues);
3360 instPropList.add(property);
3361 // delete overriden property
3362 currPropertiesMap.remove(property.getName());
3365 private void processGetInput(List<GetInputValueDataDefinition> getInputValues, List<InputDefinition> inputs,
3366 GetInputValueDataDefinition getInputIndex) {
3367 Optional<InputDefinition> optional;
3368 if (getInputIndex != null) {
3369 optional = inputs.stream()
3370 .filter(p -> p.getName()
3371 .equals(getInputIndex.getInputName()))
3373 if (!optional.isPresent()) {
3374 log.debug("Failed to find input {} ", getInputIndex.getInputName());
3375 // @@TODO error message
3376 throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
3378 InputDefinition inputIndex = optional.get();
3379 getInputIndex.setInputId(inputIndex.getUniqueId());
3380 getInputValues.add(getInputIndex);
3384 private void addInput(Map<String, InputDefinition> currPropertiesMap, InputDefinition prop) {
3385 String propName = prop.getName();
3386 if (!currPropertiesMap.containsKey(propName)) {
3387 currPropertiesMap.put(propName, prop);
3391 private ResponseFormat addPropertyValuesToRi(UploadComponentInstanceInfo uploadComponentInstanceInfo,
3392 Resource resource, Resource originResource, ComponentInstance currentCompInstance,
3393 Map<String, List<ComponentInstanceProperty>> instProperties, Map<String, DataTypeDefinition> allDataTypes) {
3395 Map<String, List<UploadPropInfo>> propMap = uploadComponentInstanceInfo.getProperties();
3396 Map<String, PropertyDefinition> currPropertiesMap = new HashMap<>();
3398 List<PropertyDefinition> listFromMap = originResource.getProperties();
3399 if ((propMap != null && !propMap.isEmpty()) && (listFromMap == null || listFromMap.isEmpty())) {
3400 loggerSupportability.log(LoggerSupportabilityActions.PROPERTY,resource.getComponentMetadataForSupportLog(),
3401 StatusCode.ERROR,"ERROR Failed to find properties");
3402 log.debug("failed to find properties");
3403 return componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NOT_FOUND);
3405 if (listFromMap == null || listFromMap.isEmpty()) {
3406 return componentsUtils.getResponseFormat(ActionStatus.OK);
3408 for (PropertyDefinition prop : listFromMap) {
3409 String propName = prop.getName();
3410 if (!currPropertiesMap.containsKey(propName)) {
3411 currPropertiesMap.put(propName, prop);
3414 List<ComponentInstanceProperty> instPropList = new ArrayList<>();
3415 if (propMap != null && propMap.size() > 0) {
3416 for (List<UploadPropInfo> propertyList : propMap.values()) {
3418 UploadPropInfo propertyInfo = propertyList.get(0);
3419 String propName = propertyInfo.getName();
3420 if (!currPropertiesMap.containsKey(propName)) {
3421 log.debug("failed to find property {} ", propName);
3422 loggerSupportability.log(LoggerSupportabilityActions.PROPERTY,resource.getComponentMetadataForSupportLog(), StatusCode.ERROR,"ERROR Failed to find property: {}",propName);
3423 return componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NOT_FOUND, propName);
3425 PropertyDefinition curPropertyDef = currPropertiesMap.get(propName);
3426 ComponentInstanceProperty property = null;
3428 String value = null;
3429 List<GetInputValueDataDefinition> getInputs = null;
3430 boolean isValidate = true;
3431 if (propertyInfo.getValue() != null) {
3432 getInputs = propertyInfo.getGet_input();
3433 isValidate = getInputs == null || getInputs.isEmpty();
3435 value = getPropertyJsonStringValue(propertyInfo.getValue(), curPropertyDef.getType());
3437 value = getPropertyJsonStringValue(propertyInfo.getValue(),
3438 TypeUtils.ToscaTagNamesEnum.GET_INPUT.getElementName());
3441 String innerType = null;
3442 property = new ComponentInstanceProperty(curPropertyDef, value, null);
3444 String validatePropValue = validatePropValueBeforeCreate(property, value, isValidate, allDataTypes);
3445 property.setValue(validatePropValue);
3447 if (getInputs != null && !getInputs.isEmpty()) {
3448 List<GetInputValueDataDefinition> getInputValues = new ArrayList<>();
3449 for (GetInputValueDataDefinition getInput : getInputs) {
3450 List<InputDefinition> inputs = resource.getInputs();
3451 if (inputs == null || inputs.isEmpty()) {
3452 log.debug("Failed to add property {} to instance. Inputs list is empty ", property);
3453 loggerSupportability.log(LoggerSupportabilityActions.PROPERTY,resource.getComponentMetadataForSupportLog(), StatusCode.ERROR,"Failed to add property: {} to instance. Inputs list is empty",propName);
3454 rollbackWithException(ActionStatus.INPUTS_NOT_FOUND, property.getGetInputValues()
3456 .map(GetInputValueDataDefinition::getInputName)
3460 Either<InputDefinition, RuntimeException> inputEither = findInputByName(inputs, getInput);
3461 if (inputEither.isRight()) {
3462 throw inputEither.right().value();
3464 InputDefinition input = inputEither.left().value();
3465 getInput.setInputId(input.getUniqueId());
3466 getInputValues.add(getInput);
3468 GetInputValueDataDefinition getInputIndex = getInput.getGetInputIndex();
3469 if (getInputIndex != null) {
3470 Either<InputDefinition, RuntimeException> newInputEither = findInputByName(inputs,
3472 if (inputEither.isRight()) {
3473 throw newInputEither.right().value();
3475 InputDefinition newInput = newInputEither.left().value();
3476 getInputIndex.setInputId(newInput.getUniqueId());
3478 getInputValues.add(getInputIndex);
3483 property.setGetInputValues(getInputValues);
3485 instPropList.add(property);
3486 // delete overriden property
3487 currPropertiesMap.remove(property.getName());
3490 // add rest of properties
3491 if (!currPropertiesMap.isEmpty()) {
3492 for (PropertyDefinition value : currPropertiesMap.values()) {
3493 instPropList.add(new ComponentInstanceProperty(value));
3496 instProperties.put(currentCompInstance.getUniqueId(), instPropList);
3497 return componentsUtils.getResponseFormat(ActionStatus.OK);
3500 // US740820 Relate RIs according to capability name
3501 private CapabilityDefinition findAvailableCapabilityByTypeOrName(RequirementDefinition validReq,
3502 ComponentInstance currentCapCompInstance, UploadReqInfo uploadReqInfo) {
3503 if (null == uploadReqInfo.getCapabilityName() || validReq.getCapability()
3504 .equals(uploadReqInfo.getCapabilityName())) {// get
3508 return findAvailableCapability(validReq, currentCapCompInstance);
3510 return findAvailableCapability(validReq, currentCapCompInstance, uploadReqInfo);
3513 private CapabilityDefinition findAvailableCapability(RequirementDefinition validReq,
3514 ComponentInstance currentCapCompInstance, UploadReqInfo uploadReqInfo) {
3515 CapabilityDefinition cap = null;
3516 Map<String, List<CapabilityDefinition>> capMap = currentCapCompInstance.getCapabilities();
3517 if (!capMap.containsKey(validReq.getCapability())) {
3520 Optional<CapabilityDefinition> capByName = capMap.get(validReq.getCapability())
3522 .filter(p -> p.getName()
3523 .equals(uploadReqInfo.getCapabilityName()))
3525 if (!capByName.isPresent()) {
3528 cap = capByName.get();
3530 if (isBoundedByOccurrences(cap)) {
3531 String leftOccurrences = cap.getLeftOccurrences();
3532 int left = Integer.parseInt(leftOccurrences);
3535 cap.setLeftOccurrences(String.valueOf(left));
3543 private CapabilityDefinition findAvailableCapability(RequirementDefinition validReq, ComponentInstance instance) {
3544 Map<String, List<CapabilityDefinition>> capMap = instance.getCapabilities();
3545 if (capMap.containsKey(validReq.getCapability())) {
3546 List<CapabilityDefinition> capList = capMap.get(validReq.getCapability());
3548 for (CapabilityDefinition cap : capList) {
3549 if (isBoundedByOccurrences(cap)) {
3550 String leftOccurrences = cap.getLeftOccurrences() != null ? cap.getLeftOccurrences()
3551 : cap.getMaxOccurrences();
3552 int left = Integer.parseInt(leftOccurrences);
3555 cap.setLeftOccurrences(String.valueOf(left));
3566 private boolean isBoundedByOccurrences(CapabilityDefinition cap) {
3567 return cap.getMaxOccurrences() != null && !cap.getMaxOccurrences()
3568 .equals(CapabilityDataDefinition.MAX_OCCURRENCES);
3571 private Either<RequirementDefinition, ResponseFormat> findAviableRequiremen(String regName, String yamlName,
3572 UploadComponentInstanceInfo uploadComponentInstanceInfo, ComponentInstance currentCompInstance,
3574 Map<String, List<RequirementDefinition>> comInstRegDefMap = currentCompInstance.getRequirements();
3575 List<RequirementDefinition> list = comInstRegDefMap.get(capName);
3576 RequirementDefinition validRegDef = null;
3578 for (Entry<String, List<RequirementDefinition>> entry : comInstRegDefMap.entrySet()) {
3579 for (RequirementDefinition reqDef : entry.getValue()) {
3580 if (reqDef.getName()
3582 if (reqDef.getMaxOccurrences() != null && !reqDef.getMaxOccurrences()
3583 .equals(RequirementDataDefinition.MAX_OCCURRENCES)) {
3584 String leftOccurrences = reqDef.getLeftOccurrences();
3585 if (leftOccurrences == null) {
3586 leftOccurrences = reqDef.getMaxOccurrences();
3588 int left = Integer.parseInt(leftOccurrences);
3591 reqDef.setLeftOccurrences(String.valueOf(left));
3592 validRegDef = reqDef;
3598 validRegDef = reqDef;
3604 if (validRegDef != null) {
3609 for (RequirementDefinition reqDef : list) {
3610 if (reqDef.getName()
3612 if (reqDef.getMaxOccurrences() != null && !reqDef.getMaxOccurrences()
3613 .equals(RequirementDataDefinition.MAX_OCCURRENCES)) {
3614 String leftOccurrences = reqDef.getLeftOccurrences();
3615 if (leftOccurrences == null) {
3616 leftOccurrences = reqDef.getMaxOccurrences();
3618 int left = Integer.parseInt(leftOccurrences);
3621 reqDef.setLeftOccurrences(String.valueOf(left));
3622 validRegDef = reqDef;
3628 validRegDef = reqDef;
3634 if (validRegDef == null) {
3635 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_NODE_TEMPLATE,
3636 yamlName, uploadComponentInstanceInfo.getName(), uploadComponentInstanceInfo.getType());
3637 return Either.right(responseFormat);
3639 return Either.left(validRegDef);
3642 private Resource createResourceInstances(String yamlName, Resource resource, Resource oldResource,
3643 Map<String, UploadComponentInstanceInfo> uploadResInstancesMap, Map<String, Resource> nodeNamespaceMap, Map<String, Resource> existingNodeTypesByResourceNames) {
3645 Either<Resource, ResponseFormat> eitherResource;
3646 log.debug("createResourceInstances is {} - going to create resource instanse from CSAR", yamlName);
3647 if (isEmpty(uploadResInstancesMap) && resource.getResourceType() != ResourceTypeEnum.PNF) { // PNF can have no resource instances
3648 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE);
3649 throw new ByResponseFormatComponentException(responseFormat);
3651 if (MapUtils.isNotEmpty(nodeNamespaceMap)) {
3652 nodeNamespaceMap.forEach((k, v) -> existingNodeTypesByResourceNames.put(v.getToscaResourceName(), v));
3654 Map<ComponentInstance, Resource> resourcesInstancesMap = new HashMap<>();
3655 uploadResInstancesMap.values()
3656 .forEach(i -> createAndAddResourceInstance(i, yamlName, resource, nodeNamespaceMap,
3657 existingNodeTypesByResourceNames, resourcesInstancesMap));
3658 if (oldResource != null && oldResource.getResourceType() != ResourceTypeEnum.CVFC && oldResource.getComponentInstances() != null) {
3659 Map<String, Resource> existingNodeTypesByUids = existingNodeTypesByResourceNames.values()
3661 .collect(toMap(Resource::getUniqueId, r -> r));
3662 oldResource.getComponentInstances()
3664 .filter(i -> !i.isCreatedFromCsar())
3665 .forEach(uiInst -> resourcesInstancesMap.put(uiInst,
3666 getOriginResource(existingNodeTypesByUids, uiInst)));
3669 if (isNotEmpty(resourcesInstancesMap)) {
3671 toscaOperationFacade.associateComponentInstancesToComponent(resource,
3672 resourcesInstancesMap, false, oldResource != null);
3673 } catch (StorageException exp) {
3674 if (exp.getStorageOperationStatus() != null && exp.getStorageOperationStatus() != StorageOperationStatus.OK) {
3675 log.debug("Failed to add component instances to container component {}", resource.getName());
3676 ResponseFormat responseFormat = componentsUtils
3677 .getResponseFormat(componentsUtils.convertFromStorageResponse(exp.getStorageOperationStatus()));
3678 eitherResource = Either.right(responseFormat);
3679 throw new ByResponseFormatComponentException(eitherResource.right().value());
3683 if (CollectionUtils.isEmpty(resource.getComponentInstances()) &&
3684 resource.getResourceType() != ResourceTypeEnum.PNF) { // PNF can have no resource instances
3685 log.debug("Error when create resource instance from csar. ComponentInstances list empty");
3686 BeEcompErrorManager.getInstance()
3687 .logBeDaoSystemError(
3688 "Error when create resource instance from csar. ComponentInstances list empty");
3689 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE));
3694 private void createAndAddResourceInstance(UploadComponentInstanceInfo uploadComponentInstanceInfo, String yamlName,
3695 Resource resource, Map<String, Resource> nodeNamespaceMap, Map<String, Resource> existingnodeTypeMap,
3696 Map<ComponentInstance, Resource> resourcesInstancesMap) {
3697 Either<Resource, ResponseFormat> eitherResource;
3698 log.debug("*************Going to create resource instances {}", yamlName);
3699 // updating type if the type is node type name - we need to take the
3701 log.debug("*************Going to create resource instances {}", uploadComponentInstanceInfo.getName());
3702 if (nodeNamespaceMap.containsKey(uploadComponentInstanceInfo.getType())) {
3703 uploadComponentInstanceInfo.setType(nodeNamespaceMap.get(uploadComponentInstanceInfo.getType())
3704 .getToscaResourceName());
3706 Resource refResource = validateResourceInstanceBeforeCreate(yamlName, uploadComponentInstanceInfo,
3707 existingnodeTypeMap);
3709 ComponentInstance componentInstance = new ComponentInstance();
3710 componentInstance.setComponentUid(refResource.getUniqueId());
3711 Collection<String> directives = uploadComponentInstanceInfo.getDirectives();
3712 if(directives != null && !directives.isEmpty()) {
3713 componentInstance.setDirectives(new ArrayList<>(directives));
3715 UploadNodeFilterInfo uploadNodeFilterInfo = uploadComponentInstanceInfo.getUploadNodeFilterInfo();
3716 if (uploadNodeFilterInfo != null){
3717 componentInstance.setNodeFilter(new CINodeFilterUtils().getNodeFilterDataDefinition(uploadNodeFilterInfo,
3718 componentInstance.getUniqueId()));
3720 ComponentTypeEnum containerComponentType = resource.getComponentType();
3721 NodeTypeEnum containerNodeType = containerComponentType.getNodeType();
3722 if (containerNodeType == NodeTypeEnum.Resource && isNotEmpty(uploadComponentInstanceInfo.getCapabilities())
3723 && isNotEmpty(refResource.getCapabilities())) {
3724 setCapabilityNamesTypes(refResource.getCapabilities(), uploadComponentInstanceInfo.getCapabilities());
3725 Map<String, List<CapabilityDefinition>> validComponentInstanceCapabilities = getValidComponentInstanceCapabilities(
3726 refResource.getUniqueId(), refResource.getCapabilities(),
3727 uploadComponentInstanceInfo.getCapabilities());
3728 componentInstance.setCapabilities(validComponentInstanceCapabilities);
3731 if (isNotEmpty(uploadComponentInstanceInfo.getArtifacts())) {
3732 Map<String, Map<String, UploadArtifactInfo>> artifacts = uploadComponentInstanceInfo.getArtifacts();
3733 Map<String, ToscaArtifactDataDefinition> toscaArtifacts = new HashMap<>();
3734 Map<String, Map<String, UploadArtifactInfo>> arts = artifacts.entrySet().stream()
3735 .filter(e -> e.getKey().contains(TypeUtils.ToscaTagNamesEnum.ARTIFACTS.getElementName()))
3736 .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()));
3737 Map<String, UploadArtifactInfo> artifact = arts.get(TypeUtils.ToscaTagNamesEnum.ARTIFACTS.getElementName());
3738 for (Map.Entry<String, UploadArtifactInfo> entry : artifact.entrySet()) {
3739 ToscaArtifactDataDefinition to = new ToscaArtifactDataDefinition();
3740 to.setFile(entry.getValue().getFile());
3741 to.setType(entry.getValue().getType());
3742 toscaArtifacts.put(entry.getKey(), to);
3744 componentInstance.setToscaArtifacts(toscaArtifacts);
3747 if (!existingnodeTypeMap.containsKey(uploadComponentInstanceInfo.getType())) {
3748 log.debug("createResourceInstances - not found lates version for resource instance with name {} and type ",
3749 uploadComponentInstanceInfo.getName(), uploadComponentInstanceInfo.getType());
3750 throw new ByActionStatusComponentException(ActionStatus.INVALID_NODE_TEMPLATE,
3751 yamlName, uploadComponentInstanceInfo.getName(), uploadComponentInstanceInfo.getType());
3753 Resource origResource = existingnodeTypeMap.get(uploadComponentInstanceInfo.getType());
3754 componentInstance.setName(uploadComponentInstanceInfo.getName());
3755 componentInstance.setIcon(origResource.getIcon());
3756 componentInstance.setCreatedFrom(CreatedFrom.CSAR);
3757 resourcesInstancesMap.put(componentInstance, origResource);
3760 private ComponentParametersView getComponentWithInstancesFilter() {
3761 ComponentParametersView parametersView = new ComponentParametersView();
3762 parametersView.disableAll();
3763 parametersView.setIgnoreComponentInstances(false);
3764 parametersView.setIgnoreInputs(false);
3765 // inputs are read when creating
3766 // property values on instances
3767 parametersView.setIgnoreUsers(false);
3768 return parametersView;
3771 private void setCapabilityNamesTypes(Map<String, List<CapabilityDefinition>> originCapabilities,
3772 Map<String, List<UploadCapInfo>> uploadedCapabilities) {
3773 for (Entry<String, List<UploadCapInfo>> currEntry : uploadedCapabilities.entrySet()) {
3774 if (originCapabilities.containsKey(currEntry.getKey())) {
3775 currEntry.getValue()
3777 .forEach(cap -> cap.setType(currEntry.getKey()));
3780 for (Map.Entry<String, List<CapabilityDefinition>> capabilities : originCapabilities.entrySet()) {
3781 capabilities.getValue()
3784 if (uploadedCapabilities.containsKey(cap.getName())) {
3785 uploadedCapabilities.get(cap.getName())
3788 c.setName(cap.getName());
3789 c.setType(cap.getType());
3796 private Resource validateResourceInstanceBeforeCreate(String yamlName,
3797 UploadComponentInstanceInfo uploadComponentInstanceInfo, Map<String, Resource> nodeNamespaceMap) {
3800 "validateResourceInstanceBeforeCreate - going to validate resource instance with name {} and type {} before create",
3801 uploadComponentInstanceInfo.getName(), uploadComponentInstanceInfo.getType());
3802 Resource refResource;
3803 if (nodeNamespaceMap.containsKey(uploadComponentInstanceInfo.getType())) {
3804 refResource = nodeNamespaceMap.get(uploadComponentInstanceInfo.getType());
3806 Either<Resource, StorageOperationStatus> findResourceEither = toscaOperationFacade
3807 .getLatestCertifiedNodeTypeByToscaResourceName(uploadComponentInstanceInfo.getType());
3808 if (findResourceEither.isRight()) {
3810 "validateResourceInstanceBeforeCreate - not found lates version for resource instance with name {} and type {}",
3811 uploadComponentInstanceInfo.getName(), uploadComponentInstanceInfo.getType());
3812 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(findResourceEither.right().value()));
3814 refResource = findResourceEither.left().value();
3815 nodeNamespaceMap.put(refResource.getToscaResourceName(), refResource);
3817 String componentState = refResource.getComponentMetadataDefinition()
3818 .getMetadataDataDefinition()
3820 if (componentState.equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
3822 "validateResourceInstanceBeforeCreate - component instance of component {} can not be created because the component is in an illegal state {}.",
3823 refResource.getName(), componentState);
3824 throw new ByActionStatusComponentException(ActionStatus.ILLEGAL_COMPONENT_STATE,
3825 refResource.getComponentType().getValue(),refResource.getName(), componentState);
3828 if (!ModelConverter.isAtomicComponent(refResource) && refResource.getResourceType() != ResourceTypeEnum.CVFC) {
3829 log.debug("validateResourceInstanceBeforeCreate - ref resource type is ", refResource.getResourceType());
3830 throw new ByActionStatusComponentException(ActionStatus.INVALID_NODE_TEMPLATE,
3831 yamlName, uploadComponentInstanceInfo.getName(), uploadComponentInstanceInfo.getType());
3836 public Resource propagateStateToCertified(User user, Resource resource,
3837 LifecycleChangeInfoWithAction lifecycleChangeInfo, boolean inTransaction, boolean needLock,
3838 boolean forceCertificationAllowed) {
3840 boolean failed = false;
3842 if (resource.getLifecycleState() != LifecycleStateEnum.CERTIFIED && forceCertificationAllowed
3843 && lifecycleBusinessLogic.isFirstCertification(resource.getVersion())) {
3844 nodeForceCertification(resource, user, lifecycleChangeInfo, inTransaction, needLock);
3846 if (resource.getLifecycleState() == LifecycleStateEnum.CERTIFIED) {
3847 Either<ArtifactDefinition, Operation> eitherPopulated = populateToscaArtifacts(
3848 resource, user, false, inTransaction, needLock, false);
3851 return nodeFullCertification(resource.getUniqueId(), user, lifecycleChangeInfo, inTransaction, needLock);
3852 } catch (ComponentException e) {
3854 log.debug("The exception has occurred upon certification of resource {}. ", resource.getName(), e);
3858 BeEcompErrorManager.getInstance()
3859 .logBeSystemError("Change LifecycleState - Certify");
3860 if (!inTransaction) {
3861 janusGraphDao.rollback();
3863 } else if (!inTransaction) {
3864 janusGraphDao.commit();
3869 private Resource nodeFullCertification(String uniqueId, User user,
3870 LifecycleChangeInfoWithAction lifecycleChangeInfo, boolean inTransaction, boolean needLock) {
3871 Either<Resource, ResponseFormat> resourceResponse = lifecycleBusinessLogic.changeState(uniqueId, user, LifeCycleTransitionEnum.CERTIFY, lifecycleChangeInfo,
3872 inTransaction, needLock);
3873 if(resourceResponse.isRight()){
3874 throw new ByResponseFormatComponentException(resourceResponse.right().value());
3876 return resourceResponse.left().value();
3879 private Resource nodeForceCertification(Resource resource, User user,
3880 LifecycleChangeInfoWithAction lifecycleChangeInfo, boolean inTransaction, boolean needLock) {
3881 return lifecycleBusinessLogic.forceResourceCertification(resource, user, lifecycleChangeInfo, inTransaction,
3885 public ImmutablePair<Resource, ActionStatus> createOrUpdateResourceByImport(final Resource resource,
3887 final boolean isNormative,
3888 final boolean isInTransaction,
3889 final boolean needLock,
3890 final CsarInfo csarInfo,
3891 final String nodeName,
3892 final boolean isNested) {
3894 ImmutablePair<Resource, ActionStatus> result = null;
3895 // check if resource already exists (search by tosca name = type)
3896 final boolean isNestedResource = isNestedResourceUpdate(csarInfo, nodeName);
3897 final Either<Resource, StorageOperationStatus> latestByToscaName = toscaOperationFacade
3898 .getLatestByToscaResourceName(resource.getToscaResourceName());
3900 if (latestByToscaName.isLeft()) {
3901 Resource foundResource = latestByToscaName.left().value();
3902 // we don't allow updating names of top level types
3903 if (!isNestedResource && !StringUtils.equals(resource.getName(), foundResource.getName())) {
3904 BeEcompErrorManager.getInstance().logBeComponentMissingError("Create / Update resource by import",
3905 ComponentTypeEnum.RESOURCE.getValue(), resource.getName());
3906 log.debug("resource already exist new name={} old name={} same type={}", resource.getName(),
3907 foundResource.getName(), resource.getToscaResourceName());
3908 final ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESOURCE_ALREADY_EXISTS);
3909 componentsUtils.auditResource(responseFormat, user, resource, AuditingActionEnum.IMPORT_RESOURCE);
3910 throwComponentException(responseFormat);
3912 result = updateExistingResourceByImport(resource, foundResource, user, isNormative, needLock, isNested);
3913 } else if (isNotFound(latestByToscaName)) {
3914 if (isNestedResource) {
3915 result = createOrUpdateNestedResource(resource, user, isNormative, isInTransaction, needLock, csarInfo,
3916 isNested, nodeName);
3918 result = createResourceByImport(resource, user, isNormative, isInTransaction, csarInfo);
3921 StorageOperationStatus status = latestByToscaName.right().value();
3922 log.debug("failed to get latest version of resource {}. status={}", resource.getName(), status);
3923 ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(componentsUtils
3924 .convertFromStorageResponse(latestByToscaName.right().value()), resource);
3925 componentsUtils.auditResource(responseFormat, user, resource, AuditingActionEnum.IMPORT_RESOURCE);
3926 throwComponentException(responseFormat);
3931 private boolean isNestedResourceUpdate(CsarInfo csarInfo, String nodeName) {
3932 return csarInfo != null && csarInfo.isUpdate() && nodeName != null;
3935 private ImmutablePair<Resource, ActionStatus> createOrUpdateNestedResource(final Resource resource,
3937 final boolean isNormative,
3938 final boolean isInTransaction,
3939 final boolean needLock,
3940 final CsarInfo csarInfo,
3941 final boolean isNested,
3942 final String nodeName) {
3943 final Either<Component, StorageOperationStatus> latestByToscaName = toscaOperationFacade
3944 .getLatestByToscaResourceName(buildNestedToscaResourceName(resource.getResourceType()
3945 .name(), csarInfo.getVfResourceName(), nodeName).getRight());
3946 if (latestByToscaName.isLeft()) {
3947 final Resource nestedResource = (Resource) latestByToscaName.left().value();
3948 log.debug(VALIDATE_DERIVED_BEFORE_UPDATE);
3949 final Either<Boolean, ResponseFormat> eitherValidation = validateNestedDerivedFromDuringUpdate(nestedResource,
3950 resource, ValidationUtils.hasBeenCertified(nestedResource.getVersion()));
3951 if (eitherValidation.isRight()) {
3952 return createResourceByImport(resource, user, isNormative, isInTransaction, csarInfo);
3954 return updateExistingResourceByImport(resource, nestedResource, user, isNormative, needLock, isNested);
3956 return createResourceByImport(resource, user, isNormative, isInTransaction, csarInfo);
3960 private boolean isNotFound(Either<Resource, StorageOperationStatus> getResourceEither) {
3961 return getResourceEither.isRight() && getResourceEither.right()
3962 .value() == StorageOperationStatus.NOT_FOUND;
3965 private ImmutablePair<Resource, ActionStatus> createResourceByImport(Resource resource, User user,
3966 boolean isNormative, boolean isInTransaction, CsarInfo csarInfo) {
3967 log.debug("resource with name {} does not exist. create new resource", resource.getName());
3968 validateResourceBeforeCreate(resource, user, AuditingActionEnum.IMPORT_RESOURCE, isInTransaction, csarInfo);
3969 final Resource createResourceByDao = createResourceByDao(resource, user, AuditingActionEnum.IMPORT_RESOURCE, isNormative,
3971 Resource createdResource = updateCatalog(createResourceByDao, ChangeTypeEnum.LIFECYCLE).left().map(r -> (Resource)r).left().value();
3972 ImmutablePair<Resource, ActionStatus> resourcePair = new ImmutablePair<>(createdResource, ActionStatus.CREATED);
3973 ASDCKpiApi.countImportResourcesKPI();
3974 return resourcePair;
3977 public boolean isResourceExist(String resourceName) {
3978 Either<Resource, StorageOperationStatus> latestByName = toscaOperationFacade.getLatestByName(resourceName);
3979 return latestByName.isLeft();
3982 private ImmutablePair<Resource, ActionStatus> updateExistingResourceByImport(Resource newResource,
3983 Resource oldResource, User user, boolean inTransaction, boolean needLock, boolean isNested) {
3984 String lockedResourceId = oldResource.getUniqueId();
3985 log.debug("found resource: name={}, id={}, version={}, state={}", oldResource.getName(), lockedResourceId,
3986 oldResource.getVersion(), oldResource.getLifecycleState());
3987 ImmutablePair<Resource, ActionStatus> resourcePair = null;
3989 lockComponent(lockedResourceId, oldResource, needLock, "Update Resource by Import");
3990 oldResource = prepareResourceForUpdate(oldResource, newResource, user, inTransaction, false);
3991 mergeOldResourceMetadataWithNew(oldResource, newResource);
3993 validateResourceFieldsBeforeUpdate(oldResource, newResource, inTransaction, isNested);
3994 validateCapabilityTypesCreate(user, getCapabilityTypeOperation(), newResource, AuditingActionEnum.IMPORT_RESOURCE, inTransaction);
3995 // contact info normalization
3996 newResource.setContactId(newResource.getContactId().toLowerCase());
3997 PropertyConstraintsUtils.validatePropertiesConstraints(newResource, oldResource);
3998 // non-updatable fields
3999 newResource.setCreatorUserId(user.getUserId());
4000 newResource.setCreatorFullName(user.getFullName());
4001 newResource.setLastUpdaterUserId(user.getUserId());
4002 newResource.setLastUpdaterFullName(user.getFullName());
4003 newResource.setUniqueId(oldResource.getUniqueId());
4004 newResource.setVersion(oldResource.getVersion());
4005 newResource.setInvariantUUID(oldResource.getInvariantUUID());
4006 newResource.setLifecycleState(oldResource.getLifecycleState());
4007 newResource.setUUID(oldResource.getUUID());
4008 newResource.setNormalizedName(oldResource.getNormalizedName());
4009 newResource.setSystemName(oldResource.getSystemName());
4010 if (oldResource.getCsarUUID() != null) {
4011 newResource.setCsarUUID(oldResource.getCsarUUID());
4013 if (oldResource.getImportedToscaChecksum() != null) {
4014 newResource.setImportedToscaChecksum(oldResource.getImportedToscaChecksum());
4016 newResource.setAbstract(oldResource.isAbstract());
4018 if (CollectionUtils.isEmpty(newResource.getDerivedFrom())) {
4019 newResource.setDerivedFrom(oldResource.getDerivedFrom());
4021 if (StringUtils.isEmpty(newResource.getDerivedFromGenericType())) {
4022 newResource.setDerivedFromGenericType(oldResource.getDerivedFromGenericType());
4024 if (StringUtils.isEmpty(newResource.getDerivedFromGenericVersion())) {
4025 newResource.setDerivedFromGenericVersion(oldResource.getDerivedFromGenericVersion());
4028 // created without tosca artifacts - add the placeholders
4029 if (MapUtils.isEmpty(newResource.getToscaArtifacts())) {
4030 setToscaArtifactsPlaceHolders(newResource, user);
4033 if (MapUtils.isEmpty(newResource.getInterfaces())) {
4034 newResource.setInterfaces(oldResource.getInterfaces());
4036 if (CollectionUtils.isEmpty(newResource.getAttributes())) {
4037 newResource.setAttributes(oldResource.getAttributes());
4040 if (CollectionUtils.isEmpty(newResource.getProperties())) {
4041 newResource.setProperties(oldResource.getProperties());
4044 Either<Resource, StorageOperationStatus> overrideResource = toscaOperationFacade.overrideComponent(newResource, oldResource);
4046 if (overrideResource.isRight()) {
4047 ResponseFormat responseFormat = componentsUtils
4048 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(overrideResource.right()
4049 .value()), newResource);
4050 componentsUtils.auditResource(responseFormat, user, newResource, AuditingActionEnum.IMPORT_RESOURCE);
4052 throwComponentException(responseFormat);
4054 updateCatalog(overrideResource.left()
4055 .value(), ChangeTypeEnum.LIFECYCLE);
4057 log.debug("Resource updated successfully!!!");
4058 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
4059 componentsUtils.auditResource(responseFormat, user, newResource, AuditingActionEnum.IMPORT_RESOURCE,
4060 ResourceVersionInfo.newBuilder()
4061 .state(oldResource.getLifecycleState()
4063 .version(oldResource.getVersion())
4066 resourcePair = new ImmutablePair<>(overrideResource.left()
4067 .value(), ActionStatus.OK);
4068 return resourcePair;
4070 if (resourcePair == null) {
4071 BeEcompErrorManager.getInstance()
4072 .logBeSystemError("Change LifecycleState - Certify");
4073 janusGraphDao.rollback();
4074 } else if (!inTransaction) {
4075 janusGraphDao.commit();
4078 log.debug("unlock resource {}", lockedResourceId);
4079 graphLockOperation.unlockComponent(lockedResourceId, NodeTypeEnum.Resource);
4086 * Merge old resource with new. Keep old category and vendor name without
4089 * @param oldResource
4090 * @param newResource
4092 private void mergeOldResourceMetadataWithNew(Resource oldResource, Resource newResource) {
4094 // keep old category and vendor name without change
4095 // merge the rest of the resource metadata
4096 if (newResource.getTags() == null || newResource.getTags().isEmpty()) {
4097 newResource.setTags(oldResource.getTags());
4100 if (newResource.getDescription() == null) {
4101 newResource.setDescription(oldResource.getDescription());
4104 if (newResource.getVendorRelease() == null) {
4105 newResource.setVendorRelease(oldResource.getVendorRelease());
4108 if (newResource.getResourceVendorModelNumber() == null) {
4109 newResource.setResourceVendorModelNumber(oldResource.getResourceVendorModelNumber());
4112 if (newResource.getContactId() == null) {
4113 newResource.setContactId(oldResource.getContactId());
4116 newResource.setCategories(oldResource.getCategories());
4117 if (newResource.getVendorName() == null) {
4118 newResource.setVendorName(oldResource.getVendorName());
4120 List<GroupDefinition>oldForUpdate = oldResource.getGroups();
4121 if(CollectionUtils.isNotEmpty(oldForUpdate)){
4122 List<GroupDefinition>groupForUpdate = oldForUpdate.stream().map(group -> new GroupDefinition(group)).collect(Collectors.toList());
4124 groupForUpdate.stream().filter(group -> group.isVspOriginated())
4125 .forEach(group -> group.setName(group.getInvariantName()));
4127 newResource.setGroups(groupForUpdate);
4131 if(newResource.getResourceType().isAtomicType() && !newResource.getName().equals("Root")&& newResource.getResourceType() != ResourceTypeEnum.CVFC) {
4132 ResourceTypeEnum updatedResourceType = newResource.getResourceType();
4133 Component derivedFromResource = getParentComponent(newResource);
4134 if (derivedFromResource.getComponentType() == ComponentTypeEnum.RESOURCE) {
4135 Resource parentResource = (Resource) derivedFromResource;
4136 if (!(parentResource.isAbstract() && (ResourceTypeEnum.VFC == parentResource.getResourceType() || ResourceTypeEnum.ABSTRACT == parentResource.getResourceType())) &&
4137 parentResource.getResourceType() != updatedResourceType) {
4138 BeEcompErrorManager.getInstance()
4139 .logInternalDataError("mergeOldResourceMetadataWithNew", "resource type of the resource does not match to derived from resource type",
4140 ErrorSeverity.ERROR);
4141 log.debug("#mergeOldResourceMetadataWithNew - resource type {} of the resource {} does not match to derived from resource type {}",
4142 newResource.getResourceType(), newResource.getToscaResourceName(), parentResource.getResourceType());
4143 throw new ByActionStatusComponentException(ActionStatus.INVALID_RESOURCE_TYPE);
4150 private Component getParentComponent(Resource newResource) {
4151 String toscaResourceNameDerivedFrom = newResource.getDerivedFrom().get(0);
4152 Either<Component, StorageOperationStatus> latestByToscaResourceName = toscaOperationFacade.getLatestByToscaResourceName(toscaResourceNameDerivedFrom);
4153 if(latestByToscaResourceName.isRight()){
4154 BeEcompErrorManager.getInstance()
4155 .logInternalDataError("mergeOldResourceMetadataWithNew", "derived from resource not found", ErrorSeverity.ERROR);
4156 log.debug("#mergeOldResourceMetadataWithNew - derived from resource {} not found", toscaResourceNameDerivedFrom);
4157 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_NOT_FOUND, toscaResourceNameDerivedFrom);
4159 return latestByToscaResourceName.left().value();
4162 private Resource prepareResourceForUpdate(Resource oldResource, Resource newResource, User user,
4163 boolean inTransaction, boolean needLock) {
4165 if (!ComponentValidationUtils.canWorkOnResource(oldResource, user.getUserId())) {
4167 return lifecycleBusinessLogic.changeState(oldResource.getUniqueId(), user, LifeCycleTransitionEnum.CHECKOUT,
4168 new LifecycleChangeInfoWithAction("update by import"), inTransaction, needLock)
4170 .on(response -> failOnChangeState(response, user, oldResource, newResource));
4175 private Resource failOnChangeState(ResponseFormat response, User user, Resource oldResource, Resource newResource) {
4176 log.info("resource {} cannot be updated. reason={}", oldResource.getUniqueId(), response.getFormattedMessage());
4177 componentsUtils.auditResource(response, user, newResource, AuditingActionEnum.IMPORT_RESOURCE,
4178 ResourceVersionInfo.newBuilder()
4179 .state(oldResource.getLifecycleState()
4181 .version(oldResource.getVersion())
4183 throw new ByResponseFormatComponentException(response);
4186 public Resource validateResourceBeforeCreate(Resource resource, User user, AuditingActionEnum actionEnum,
4187 boolean inTransaction, CsarInfo csarInfo) {
4189 validateResourceFieldsBeforeCreate(user, resource, actionEnum, inTransaction);
4190 validateCapabilityTypesCreate(user, getCapabilityTypeOperation(), resource, actionEnum, inTransaction);
4191 validateLifecycleTypesCreate(user, resource, actionEnum);
4192 validateResourceType(user, resource, actionEnum);
4193 resource.setCreatorUserId(user.getUserId());
4194 resource.setCreatorFullName(user.getFirstName() + " " + user.getLastName());
4195 resource.setContactId(resource.getContactId()
4197 if (StringUtils.isEmpty(resource.getToscaResourceName()) && !ModelConverter.isAtomicComponent(resource)) {
4198 String resourceSystemName;
4199 if (csarInfo != null && StringUtils.isNotEmpty(csarInfo.getVfResourceName())) {
4200 resourceSystemName = ValidationUtils.convertToSystemName(csarInfo.getVfResourceName());
4202 resourceSystemName = resource.getSystemName();
4204 resource.setToscaResourceName(CommonBeUtils
4205 .generateToscaResourceName(resource.getResourceType().name().toLowerCase(), resourceSystemName));
4208 // Generate invariant UUID - must be here and not in operation since it
4209 // should stay constant during clone
4211 String invariantUUID = UniqueIdBuilder.buildInvariantUUID();
4212 resource.setInvariantUUID(invariantUUID);
4217 private Either<Boolean, ResponseFormat> validateResourceType(User user, Resource resource,
4218 AuditingActionEnum actionEnum) {
4219 Either<Boolean, ResponseFormat> eitherResult = Either.left(true);
4220 if (resource.getResourceType() == null) {
4221 log.debug("Invalid resource type for resource");
4222 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT);
4223 eitherResult = Either.right(errorResponse);
4224 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
4226 return eitherResult;
4229 private Either<Boolean, ResponseFormat> validateLifecycleTypesCreate(User user, Resource resource,
4230 AuditingActionEnum actionEnum) {
4231 Either<Boolean, ResponseFormat> eitherResult = Either.left(true);
4232 if (resource.getInterfaces() != null && resource.getInterfaces()
4234 log.debug("validate interface lifecycle Types Exist");
4235 Iterator<InterfaceDefinition> intItr = resource.getInterfaces()
4238 while (intItr.hasNext() && eitherResult.isLeft()) {
4239 InterfaceDefinition interfaceDefinition = intItr.next();
4240 String intType = interfaceDefinition.getUniqueId();
4241 Either<InterfaceDefinition, StorageOperationStatus> eitherCapTypeFound = interfaceTypeOperation
4242 .getInterface(intType);
4243 if (eitherCapTypeFound.isRight()) {
4244 if (eitherCapTypeFound.right()
4245 .value() == StorageOperationStatus.NOT_FOUND) {
4246 BeEcompErrorManager.getInstance()
4247 .logBeGraphObjectMissingError("Create Resource - validateLifecycleTypesCreate",
4248 "Interface", intType);
4249 log.debug("Lifecycle Type: {} is required by resource: {} but does not exist in the DB",
4250 intType, resource.getName());
4251 BeEcompErrorManager.getInstance()
4252 .logBeDaoSystemError("Create Resource - validateLifecycleTypesCreate");
4253 log.debug("request to data model failed with error: {}", eitherCapTypeFound.right()
4258 ResponseFormat errorResponse = componentsUtils
4259 .getResponseFormat(ActionStatus.MISSING_LIFECYCLE_TYPE, intType);
4260 eitherResult = Either.right(errorResponse);
4261 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
4266 return eitherResult;
4269 private Either<Boolean, ResponseFormat> validateCapabilityTypesCreate(User user,
4270 ICapabilityTypeOperation capabilityTypeOperation, Resource resource, AuditingActionEnum actionEnum,
4271 boolean inTransaction) {
4273 Either<Boolean, ResponseFormat> eitherResult = Either.left(true);
4274 if (resource.getCapabilities() != null && resource.getCapabilities()
4276 log.debug("validate capability Types Exist - capabilities section");
4278 for (Entry<String, List<CapabilityDefinition>> typeEntry : resource.getCapabilities()
4281 eitherResult = validateCapabilityTypeExists(user, capabilityTypeOperation, resource, actionEnum,
4282 eitherResult, typeEntry, inTransaction);
4283 if (eitherResult.isRight()) {
4284 return Either.right(eitherResult.right()
4290 if (resource.getRequirements() != null && resource.getRequirements()
4292 log.debug("validate capability Types Exist - requirements section");
4293 for (String type : resource.getRequirements()
4295 eitherResult = validateCapabilityTypeExists(user, capabilityTypeOperation, resource,
4296 resource.getRequirements()
4298 actionEnum, eitherResult, type, inTransaction);
4299 if (eitherResult.isRight()) {
4300 return Either.right(eitherResult.right()
4306 return eitherResult;
4309 // @param typeObject- the object to which the validation is done
4310 private Either<Boolean, ResponseFormat> validateCapabilityTypeExists(User user,
4311 ICapabilityTypeOperation capabilityTypeOperation, Resource resource, List<?> validationObjects,
4312 AuditingActionEnum actionEnum, Either<Boolean, ResponseFormat> eitherResult, String type,
4313 boolean inTransaction) {
4314 Either<CapabilityTypeDefinition, StorageOperationStatus> eitherCapTypeFound = capabilityTypeOperation
4315 .getCapabilityType(type, inTransaction);
4316 if (eitherCapTypeFound.isRight()) {
4317 if (eitherCapTypeFound.right()
4318 .value() == StorageOperationStatus.NOT_FOUND) {
4319 BeEcompErrorManager.getInstance()
4320 .logBeGraphObjectMissingError(CREATE_RESOURCE_VALIDATE_CAPABILITY_TYPES, "Capability Type",
4322 log.debug("Capability Type: {} is required by resource: {} but does not exist in the DB", type,
4323 resource.getName());
4324 BeEcompErrorManager.getInstance()
4325 .logBeDaoSystemError(CREATE_RESOURCE_VALIDATE_CAPABILITY_TYPES);
4327 log.debug("Trying to get capability type {} failed with error: {}", type, eitherCapTypeFound.right()
4330 ResponseFormat errorResponse = null;
4332 errorResponse = componentsUtils.getResponseFormat(ActionStatus.MISSING_CAPABILITY_TYPE, type);
4334 errorResponse = componentsUtils.getResponseFormatByElement(ActionStatus.MISSING_CAPABILITY_TYPE,
4337 eitherResult = Either.right(errorResponse);
4338 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
4340 return eitherResult;
4343 private Either<Boolean, ResponseFormat> validateCapabilityTypeExists(User user,
4344 ICapabilityTypeOperation capabilityTypeOperation, Resource resource, AuditingActionEnum actionEnum,
4345 Either<Boolean, ResponseFormat> eitherResult, Entry<String, List<CapabilityDefinition>> typeEntry,
4346 boolean inTransaction) {
4347 Either<CapabilityTypeDefinition, StorageOperationStatus> eitherCapTypeFound = capabilityTypeOperation
4348 .getCapabilityType(typeEntry.getKey(), inTransaction);
4349 if (eitherCapTypeFound.isRight()) {
4350 if (eitherCapTypeFound.right().value() == StorageOperationStatus.NOT_FOUND) {
4351 BeEcompErrorManager.getInstance()
4352 .logBeGraphObjectMissingError(CREATE_RESOURCE_VALIDATE_CAPABILITY_TYPES, "Capability Type",
4353 typeEntry.getKey());
4354 log.debug("Capability Type: {} is required by resource: {} but does not exist in the DB",
4355 typeEntry.getKey(), resource.getName());
4356 BeEcompErrorManager.getInstance().logBeDaoSystemError(CREATE_RESOURCE_VALIDATE_CAPABILITY_TYPES);
4358 log.debug("Trying to get capability type {} failed with error: {}", typeEntry.getKey(),
4359 eitherCapTypeFound.right().value().name());
4360 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.MISSING_CAPABILITY_TYPE,
4361 typeEntry.getKey());
4362 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
4363 return Either.right(errorResponse);
4365 CapabilityTypeDefinition capabilityTypeDefinition = eitherCapTypeFound.left().value();
4366 if (capabilityTypeDefinition.getProperties() != null) {
4367 for (CapabilityDefinition capDef : typeEntry.getValue()) {
4368 List<ComponentInstanceProperty> properties = capDef.getProperties();
4369 List<ComponentInstanceProperty> changedProperties = new ArrayList<>();
4370 if (properties == null || properties.isEmpty()) {
4371 for (Entry<String, PropertyDefinition> prop : capabilityTypeDefinition.getProperties().entrySet()) {
4372 ComponentInstanceProperty newProp = new ComponentInstanceProperty(prop.getValue());
4373 changedProperties.add(newProp);
4376 List<ComponentInstanceProperty> propsToAdd = new ArrayList<>();
4377 for (Entry<String, PropertyDefinition> prop : capabilityTypeDefinition.getProperties().entrySet()) {
4378 PropertyDefinition propFromDef = prop.getValue();
4379 boolean propFound = false;
4380 for (ComponentInstanceProperty cip : properties) {
4381 if (propFromDef.getName().equals(cip.getName())) {
4382 //merge property value and property description only, ignore other fields
4383 if(cip.getDescription() != null && !cip.getDescription().equals(propFromDef.getDescription())){
4384 propFromDef.setDescription(cip.getDescription());
4386 propertyDataValueMergeBusinessLogic.mergePropertyValue(propFromDef, cip, new ArrayList<>());
4387 if(cip.getValue() != null){
4388 propFromDef.setValue(cip.getValue());
4390 propsToAdd.add(new ComponentInstanceProperty(propFromDef));
4392 properties.remove(cip);
4397 propsToAdd.add(new ComponentInstanceProperty(propFromDef));
4400 if (!propsToAdd.isEmpty()) {
4401 changedProperties.addAll(propsToAdd);
4404 capDef.setProperties(changedProperties);
4407 return eitherResult;
4410 public Resource createResourceByDao(Resource resource, User user, AuditingActionEnum actionEnum,
4411 boolean isNormative, boolean inTransaction) {
4414 // lock new resource name in order to avoid creation resource with same
4416 Resource createdResource = null;
4417 if (!inTransaction) {
4418 Either<Boolean, ResponseFormat> lockResult = lockComponentByName(resource.getSystemName(), resource,
4420 if (lockResult.isRight()) {
4421 ResponseFormat responseFormat = lockResult.right().value();
4422 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
4423 throw new ByResponseFormatComponentException(responseFormat);
4426 log.debug("name is locked {} status = {}", resource.getSystemName(), lockResult);
4429 if (resource.deriveFromGeneric()) {
4430 handleResourceGenericType(resource);
4432 createdResource = createResourceTransaction(resource, user, isNormative);
4433 componentsUtils.auditResource(componentsUtils.getResponseFormat(ActionStatus.CREATED), user,
4434 createdResource, actionEnum);
4435 ASDCKpiApi.countCreatedResourcesKPI();
4436 } catch (ComponentException e) {
4437 ResponseFormat responseFormat = e.getResponseFormat() == null
4438 ? componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams()) : e.getResponseFormat();
4439 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
4441 } catch (StorageException e) {
4442 ResponseFormat responseFormat = componentsUtils
4443 .getResponseFormat(componentsUtils.convertFromStorageResponse(e.getStorageOperationStatus()));
4444 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
4447 if (!inTransaction) {
4448 graphLockOperation.unlockComponentByName(resource.getSystemName(), resource.getUniqueId(),
4449 NodeTypeEnum.Resource);
4452 return createdResource;
4455 private Resource createResourceTransaction(Resource resource, User user, boolean isNormative) {
4456 // validate resource name uniqueness
4457 log.debug("validate resource name");
4458 Either<Boolean, StorageOperationStatus> eitherValidation = toscaOperationFacade.validateComponentNameExists(
4459 resource.getName(), resource.getResourceType(), resource.getComponentType());
4460 if (eitherValidation.isRight()) {
4461 loggerSupportability.log(LoggerSupportabilityActions.VALIDATE_NAME,resource.getComponentMetadataForSupportLog(),
4462 StatusCode.ERROR,"ERROR while validate component name {} Status is: {}",resource.getName(),eitherValidation.right().value());
4463 log.debug("Failed to validate component name {}. Status is {}. ", resource.getName(),
4464 eitherValidation.right()
4466 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(eitherValidation.right()
4469 if (eitherValidation.left()
4471 log.debug("resource with name: {}, already exists", resource.getName());
4472 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RESOURCE_FROM_YAML,resource.getComponentMetadataForSupportLog(),
4473 StatusCode.ERROR,"resource with name: {} already exists",resource.getName());
4474 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_NAME_ALREADY_EXIST,
4475 ComponentTypeEnum.RESOURCE.getValue(), resource.getName());
4478 log.debug("send resource {} to dao for create", resource.getName());
4480 createArtifactsPlaceHolderData(resource, user);
4483 log.debug("enrich resource with creator, version and state");
4484 resource.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
4485 resource.setVersion(INITIAL_VERSION);
4486 resource.setHighestVersion(true);
4487 if (resource.getResourceType() != null && resource.getResourceType() != ResourceTypeEnum.CVFC) {
4488 resource.setAbstract(false);
4491 return toscaOperationFacade.createToscaComponent(resource)
4493 .on(r -> throwComponentExceptionByResource(r, resource));
4496 private Resource throwComponentExceptionByResource(StorageOperationStatus status, Resource resource) {
4497 ResponseFormat responseFormat = componentsUtils
4498 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(status), resource);
4499 throw new ByResponseFormatComponentException(responseFormat);
4502 private void createArtifactsPlaceHolderData(Resource resource, User user) {
4503 // create mandatory artifacts
4505 // TODO it must be removed after that artifact uniqueId creation will be
4506 // moved to ArtifactOperation
4508 setInformationalArtifactsPlaceHolder(resource, user);
4509 setDeploymentArtifactsPlaceHolder(resource, user);
4510 setToscaArtifactsPlaceHolders(resource, user);
4513 @SuppressWarnings("unchecked")
4515 public void setDeploymentArtifactsPlaceHolder(Component component, User user) {
4516 Resource resource = (Resource) component;
4517 Map<String, ArtifactDefinition> artifactMap = resource.getDeploymentArtifacts();
4518 if (artifactMap == null) {
4519 artifactMap = new HashMap<>();
4521 Map<String, Object> deploymentResourceArtifacts = ConfigurationManager.getConfigurationManager()
4523 .getDeploymentResourceArtifacts();
4524 if (deploymentResourceArtifacts != null) {
4525 Map<String, ArtifactDefinition> finalArtifactMap = artifactMap;
4526 deploymentResourceArtifacts
4527 .forEach((k, v) -> processDeploymentResourceArtifacts(user, resource, finalArtifactMap, k, v));
4529 resource.setDeploymentArtifacts(artifactMap);
4532 private void processDeploymentResourceArtifacts(User user, Resource resource,
4533 Map<String, ArtifactDefinition> artifactMap, String k, Object v) {
4534 boolean shouldCreateArtifact = true;
4535 Map<String, Object> artifactDetails = (Map<String, Object>) v;
4536 Object object = artifactDetails.get(PLACE_HOLDER_RESOURCE_TYPES);
4537 if (object != null) {
4538 List<String> artifactTypes = (List<String>) object;
4539 if (!artifactTypes.contains(resource.getResourceType()
4541 shouldCreateArtifact = false;
4545 log.info("resource types for artifact placeholder {} were not defined. default is all resources", k);
4547 if (shouldCreateArtifact) {
4548 if (artifactsBusinessLogic != null) {
4549 ArtifactDefinition artifactDefinition = artifactsBusinessLogic.createArtifactPlaceHolderInfo(
4550 resource.getUniqueId(), k, (Map<String, Object>) v, user, ArtifactGroupTypeEnum.DEPLOYMENT);
4551 if (artifactDefinition != null && !artifactMap.containsKey(artifactDefinition.getArtifactLabel())) {
4552 artifactMap.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
4558 @SuppressWarnings("unchecked")
4559 private void setInformationalArtifactsPlaceHolder(Resource resource, User user) {
4560 Map<String, ArtifactDefinition> artifactMap = resource.getArtifacts();
4561 if (artifactMap == null) {
4562 artifactMap = new HashMap<>();
4564 String resourceUniqueId = resource.getUniqueId();
4565 List<String> exludeResourceCategory = ConfigurationManager.getConfigurationManager()
4567 .getExcludeResourceCategory();
4568 List<String> exludeResourceType = ConfigurationManager.getConfigurationManager()
4570 .getExcludeResourceType();
4571 Map<String, Object> informationalResourceArtifacts = ConfigurationManager.getConfigurationManager()
4573 .getInformationalResourceArtifacts();
4574 List<CategoryDefinition> categories = resource.getCategories();
4575 boolean isCreateArtifact = true;
4576 if (exludeResourceCategory != null) {
4577 String category = categories.get(0)
4579 isCreateArtifact = exludeResourceCategory.stream()
4580 .noneMatch(e -> e.equalsIgnoreCase(category));
4582 if (isCreateArtifact && exludeResourceType != null) {
4583 String resourceType = resource.getResourceType()
4585 isCreateArtifact = exludeResourceType.stream()
4586 .noneMatch(e -> e.equalsIgnoreCase(resourceType));
4588 if (informationalResourceArtifacts != null && isCreateArtifact) {
4589 Set<String> keys = informationalResourceArtifacts.keySet();
4590 for (String informationalResourceArtifactName : keys) {
4591 Map<String, Object> artifactInfoMap = (Map<String, Object>) informationalResourceArtifacts
4592 .get(informationalResourceArtifactName);
4593 ArtifactDefinition artifactDefinition = artifactsBusinessLogic.createArtifactPlaceHolderInfo(
4594 resourceUniqueId, informationalResourceArtifactName, artifactInfoMap, user,
4595 ArtifactGroupTypeEnum.INFORMATIONAL);
4596 artifactMap.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
4600 resource.setArtifacts(artifactMap);
4610 public ResponseFormat deleteResource(String resourceId, User user) {
4611 ResponseFormat responseFormat;
4612 validateUserExists(user);
4614 Either<Resource, StorageOperationStatus> resourceStatus = toscaOperationFacade.getToscaElement(resourceId);
4615 if (resourceStatus.isRight()) {
4616 log.debug("failed to get resource {}", resourceId);
4617 return componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(resourceStatus.right()
4621 Resource resource = resourceStatus.left()
4624 StorageOperationStatus result = StorageOperationStatus.OK;
4625 lockComponent(resourceId, resource, "Mark resource to delete");
4628 result = markComponentToDelete(resource);
4629 if (result == StorageOperationStatus.OK) {
4630 responseFormat = componentsUtils.getResponseFormat(ActionStatus.NO_CONTENT);
4632 ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(result);
4633 responseFormat = componentsUtils.getResponseFormatByResource(actionStatus, resource.getName());
4635 return responseFormat;
4638 if (result == null || result != StorageOperationStatus.OK) {
4639 janusGraphDao.rollback();
4641 janusGraphDao.commit();
4643 graphLockOperation.unlockComponent(resourceId, NodeTypeEnum.Resource);
4648 public ResponseFormat deleteResourceByNameAndVersion(String resourceName, String version, User user) {
4649 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.NO_CONTENT);
4650 validateUserExists(user);
4651 Resource resource = null;
4652 StorageOperationStatus result = StorageOperationStatus.OK;
4653 boolean failed = false;
4656 Either<Resource, StorageOperationStatus> resourceStatus = toscaOperationFacade
4657 .getComponentByNameAndVersion(ComponentTypeEnum.RESOURCE, resourceName, version);
4658 if (resourceStatus.isRight()) {
4659 log.debug("failed to get resource {} version {}", resourceName, version);
4660 return componentsUtils
4661 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(resourceStatus.right()
4662 .value()), resourceName);
4665 resource = resourceStatus.left()
4669 janusGraphDao.commit();
4671 if (resource != null) {
4672 lockComponent(resource.getUniqueId(), resource, DELETE_RESOURCE);
4674 result = markComponentToDelete(resource);
4675 if (result != StorageOperationStatus.OK) {
4676 ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(result);
4677 responseFormat = componentsUtils.getResponseFormatByResource(actionStatus, resource.getName());
4678 return responseFormat;
4680 }catch (ComponentException e){
4684 if (failed || result == null || result != StorageOperationStatus.OK) {
4685 janusGraphDao.rollback();
4687 janusGraphDao.commit();
4689 graphLockOperation.unlockComponent(resource.getUniqueId(), NodeTypeEnum.Resource);
4692 return responseFormat;
4695 public Either<Resource, ResponseFormat> getResource(String resourceId, User user) {
4698 validateUserExists(user);
4701 Either<Resource, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(resourceId);
4702 if (storageStatus.isRight()) {
4703 log.debug("failed to get resource by id {}", resourceId);
4704 return Either.right(componentsUtils
4705 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(storageStatus.right()
4706 .value()), resourceId));
4708 if (!(storageStatus.left()
4709 .value() instanceof Resource)) {
4710 return Either.right(componentsUtils.getResponseFormatByResource(
4711 componentsUtils.convertFromStorageResponse(StorageOperationStatus.NOT_FOUND), resourceId));
4713 return Either.left(storageStatus.left()
4718 public Either<Resource, ResponseFormat> getResourceByNameAndVersion(String resourceName, String resourceVersion,
4721 validateUserExists(userId);
4723 Either<Resource, StorageOperationStatus> getResource = toscaOperationFacade
4724 .getComponentByNameAndVersion(ComponentTypeEnum.RESOURCE, resourceName, resourceVersion);
4725 if (getResource.isRight()) {
4726 log.debug("failed to get resource by name {} and version {}", resourceName, resourceVersion);
4727 return Either.right(componentsUtils
4728 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(getResource.right()
4729 .value()), resourceName));
4731 return Either.left(getResource.left()
4736 * updateResourceMetadata
4739 * - modifier data (userId)
4740 * @param inTransaction
4742 * @param resourceIdToUpdate
4743 * - the resource identifier
4744 * @param newResource
4745 * @return Either<Resource , responseFormat>
4747 public Resource updateResourceMetadata(String resourceIdToUpdate, Resource newResource, Resource currentResource,
4748 User user, boolean inTransaction) {
4750 validateUserExists(user.getUserId());
4752 log.debug("Get resource with id {}", resourceIdToUpdate);
4753 boolean needToUnlock = false;
4756 if (currentResource == null) {
4757 Either<Resource, StorageOperationStatus> storageStatus = toscaOperationFacade
4758 .getToscaElement(resourceIdToUpdate);
4759 if (storageStatus.isRight()) {
4760 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormatByResource(
4761 componentsUtils.convertFromStorageResponse(storageStatus.right()
4766 currentResource = storageStatus.left()
4769 // verify that resource is checked-out and the user is the last
4771 if (!ComponentValidationUtils.canWorkOnResource(currentResource, user.getUserId())) {
4772 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
4776 StorageOperationStatus lockResult = graphLockOperation.lockComponent(resourceIdToUpdate,
4777 NodeTypeEnum.Resource);
4778 if (lockResult != StorageOperationStatus.OK) {
4779 BeEcompErrorManager.getInstance()
4780 .logBeFailedLockObjectError("Upload Artifact - lock ", NodeTypeEnum.Resource.getName(),
4781 resourceIdToUpdate);
4782 log.debug("Failed to lock resource: {}, error - {}", resourceIdToUpdate, lockResult);
4783 ResponseFormat responseFormat = componentsUtils
4784 .getResponseFormat(componentsUtils.convertFromStorageResponse(lockResult));
4785 throw new ByResponseFormatComponentException(responseFormat);
4788 needToUnlock = true;
4790 // critical section starts here
4791 // convert json to object
4793 // Update and updated resource must have a non-empty "derivedFrom"
4795 // This code is not called from import resources, because of root
4796 // VF "derivedFrom" should be null (or ignored)
4797 if (ModelConverter.isAtomicComponent(currentResource)) {
4798 validateDerivedFromNotEmpty(null, newResource, null);
4799 validateDerivedFromNotEmpty(null, currentResource, null);
4801 newResource.setDerivedFrom(null);
4804 Either<Resource, ResponseFormat> dataModelResponse = updateResourceMetadata(resourceIdToUpdate, newResource,
4805 user, currentResource, false, true);
4806 if (dataModelResponse.isRight()) {
4807 log.debug("failed to update resource metadata!!!");
4808 throw new ByResponseFormatComponentException(dataModelResponse.right().value());
4811 log.debug("Resource metadata updated successfully!!!");
4812 return dataModelResponse.left()
4815 } catch (ComponentException | StorageException e) {
4816 rollback(inTransaction, newResource, null, null);
4819 if (!inTransaction) {
4820 janusGraphDao.commit();
4823 graphLockOperation.unlockComponent(resourceIdToUpdate, NodeTypeEnum.Resource);
4828 private Either<Resource, ResponseFormat> updateResourceMetadata(String resourceIdToUpdate, Resource newResource,
4829 User user, Resource currentResource, boolean shouldLock, boolean inTransaction) {
4830 updateVfModuleGroupsNames(currentResource, newResource);
4831 validateResourceFieldsBeforeUpdate(currentResource, newResource, inTransaction, false);
4832 // Setting last updater and uniqueId
4833 newResource.setContactId(newResource.getContactId()
4835 newResource.setLastUpdaterUserId(user.getUserId());
4836 newResource.setUniqueId(resourceIdToUpdate);
4837 // Cannot set highest version through UI
4838 newResource.setHighestVersion(currentResource.isHighestVersion());
4839 newResource.setCreationDate(currentResource.getCreationDate());
4841 Either<Boolean, ResponseFormat> processUpdateOfDerivedFrom = processUpdateOfDerivedFrom(currentResource,
4842 newResource, user.getUserId(), inTransaction);
4844 if (processUpdateOfDerivedFrom.isRight()) {
4845 log.debug("Couldn't update derived from for resource {}", resourceIdToUpdate);
4846 return Either.right(processUpdateOfDerivedFrom.right()
4850 log.debug("send resource {} to dao for update", newResource.getUniqueId());
4851 if (isNotEmpty(newResource.getGroups())) {
4852 for (GroupDefinition group : newResource.getGroups()) {
4853 if (DEFAULT_GROUP_VF_MODULE.equals(group.getType())) {
4854 groupBusinessLogic.validateAndUpdateGroupMetadata(newResource.getComponentMetadataDefinition()
4855 .getMetadataDataDefinition()
4856 .getUniqueId(), user, newResource.getComponentType(), group, true, false);
4860 Either<Resource, StorageOperationStatus> dataModelResponse = toscaOperationFacade
4861 .updateToscaElement(newResource);
4863 if (dataModelResponse.isRight()) {
4864 ResponseFormat responseFormat = componentsUtils
4865 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(dataModelResponse.right()
4866 .value()), newResource);
4867 return Either.right(responseFormat);
4868 } else if (dataModelResponse.left()
4870 log.debug("No response from updateResource");
4871 return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
4873 return Either.left(dataModelResponse.left()
4877 private void updateVfModuleGroupsNames(Resource currentResource, Resource newResource) {
4878 if (currentResource.getGroups() != null && !currentResource.getName()
4879 .equals(newResource.getName())) {
4880 List<GroupDefinition> updatedGroups = currentResource.getGroups()
4882 .map(group -> getUpdatedGroup(group, currentResource.getName(), newResource.getName()))
4884 newResource.setGroups(updatedGroups);
4888 private GroupDefinition getUpdatedGroup(GroupDefinition currGroup, String replacePattern, String with) {
4889 GroupDefinition updatedGroup = new GroupDefinition(currGroup);
4890 if (updatedGroup.isSamePrefix(replacePattern) && updatedGroup.getType()
4891 .equals(DEFAULT_GROUP_VF_MODULE)) {
4892 String prefix = updatedGroup.getName()
4893 .substring(0, replacePattern.length());
4894 String newGroupName = updatedGroup.getName()
4895 .replaceFirst(prefix, with);
4896 updatedGroup.setName(newGroupName);
4898 return updatedGroup;
4902 * validateResourceFieldsBeforeCreate
4905 * - modifier data (userId)
4907 private void validateResourceFieldsBeforeCreate(User user, Resource resource,
4908 AuditingActionEnum actionEnum, boolean inTransaction) {
4909 componentValidator.validate(user, resource, actionEnum);
4910 // validate category
4911 log.debug("validate category");
4912 validateCategory(user, resource, actionEnum, inTransaction);
4913 // validate vendor name & release & model number
4914 log.debug("validate vendor name");
4915 validateVendorName(user, resource, actionEnum);
4916 log.debug("validate vendor release");
4917 validateVendorReleaseName(user, resource, actionEnum);
4918 log.debug("validate resource vendor model number");
4919 validateResourceVendorModelNumber(user, resource, actionEnum);
4921 log.debug("validate cost");
4922 validateCost(resource);
4923 // validate licenseType
4924 log.debug("validate licenseType");
4925 validateLicenseType(user, resource, actionEnum);
4926 // validate template (derived from)
4927 log.debug("validate derived from");
4928 if (!ModelConverter.isAtomicComponent(resource) && resource.getResourceType() != ResourceTypeEnum.CVFC) {
4929 resource.setDerivedFrom(null);
4931 validateDerivedFromExist(user, resource, actionEnum);
4932 // warn about non-updatable fields
4933 checkComponentFieldsForOverrideAttempt(resource);
4934 String currentCreatorFullName = resource.getCreatorFullName();
4935 if (currentCreatorFullName != null) {
4936 log.debug("Resource Creator fullname is automatically set and cannot be updated");
4939 String currentLastUpdaterFullName = resource.getLastUpdaterFullName();
4940 if (currentLastUpdaterFullName != null) {
4941 log.debug("Resource LastUpdater fullname is automatically set and cannot be updated");
4944 Long currentLastUpdateDate = resource.getLastUpdateDate();
4945 if (currentLastUpdateDate != null) {
4946 log.debug("Resource last update date is automatically set and cannot be updated");
4949 Boolean currentAbstract = resource.isAbstract();
4950 if (currentAbstract != null) {
4951 log.debug("Resource abstract is automatically set and cannot be updated");
4956 * validateResourceFieldsBeforeUpdate
4958 * @param currentResource
4959 * - Resource object to validate
4962 private void validateResourceFieldsBeforeUpdate(Resource currentResource, Resource updateInfoResource,
4963 boolean inTransaction, boolean isNested) {
4964 validateFields(currentResource, updateInfoResource, inTransaction, isNested);
4965 warnNonEditableFields(currentResource, updateInfoResource);
4968 private void warnNonEditableFields(Resource currentResource, Resource updateInfoResource) {
4969 String currentResourceVersion = currentResource.getVersion();
4970 String updatedResourceVersion = updateInfoResource.getVersion();
4972 if ((updatedResourceVersion != null) && (!updatedResourceVersion.equals(currentResourceVersion))) {
4973 log.debug("Resource version is automatically set and cannot be updated");
4976 String currentCreatorUserId = currentResource.getCreatorUserId();
4977 String updatedCreatorUserId = updateInfoResource.getCreatorUserId();
4979 if ((updatedCreatorUserId != null) && (!updatedCreatorUserId.equals(currentCreatorUserId))) {
4980 log.debug("Resource Creator UserId is automatically set and cannot be updated");
4983 String currentCreatorFullName = currentResource.getCreatorFullName();
4984 String updatedCreatorFullName = updateInfoResource.getCreatorFullName();
4986 if ((updatedCreatorFullName != null) && (!updatedCreatorFullName.equals(currentCreatorFullName))) {
4987 log.debug("Resource Creator fullname is automatically set and cannot be updated");
4990 String currentLastUpdaterUserId = currentResource.getLastUpdaterUserId();
4991 String updatedLastUpdaterUserId = updateInfoResource.getLastUpdaterUserId();
4993 if ((updatedLastUpdaterUserId != null) && (!updatedLastUpdaterUserId.equals(currentLastUpdaterUserId))) {
4994 log.debug("Resource LastUpdater userId is automatically set and cannot be updated");
4997 String currentLastUpdaterFullName = currentResource.getLastUpdaterFullName();
4998 String updatedLastUpdaterFullName = updateInfoResource.getLastUpdaterFullName();
5000 if ((updatedLastUpdaterFullName != null) && (!updatedLastUpdaterFullName.equals(currentLastUpdaterFullName))) {
5001 log.debug("Resource LastUpdater fullname is automatically set and cannot be updated");
5003 Long currentCreationDate = currentResource.getCreationDate();
5004 Long updatedCreationDate = updateInfoResource.getCreationDate();
5006 if ((updatedCreationDate != null) && (!updatedCreationDate.equals(currentCreationDate))) {
5007 log.debug("Resource Creation date is automatically set and cannot be updated");
5010 Long currentLastUpdateDate = currentResource.getLastUpdateDate();
5011 Long updatedLastUpdateDate = updateInfoResource.getLastUpdateDate();
5013 if ((updatedLastUpdateDate != null) && (!updatedLastUpdateDate.equals(currentLastUpdateDate))) {
5014 log.debug("Resource last update date is automatically set and cannot be updated");
5017 LifecycleStateEnum currentLifecycleState = currentResource.getLifecycleState();
5018 LifecycleStateEnum updatedLifecycleState = updateInfoResource.getLifecycleState();
5020 if ((updatedLifecycleState != null) && (!updatedLifecycleState.equals(currentLifecycleState))) {
5021 log.debug("Resource lifecycle state date is automatically set and cannot be updated");
5024 Boolean currentAbstract = currentResource.isAbstract();
5025 Boolean updatedAbstract = updateInfoResource.isAbstract();
5027 if ((updatedAbstract != null) && (!updatedAbstract.equals(currentAbstract))) {
5028 log.debug("Resource abstract is automatically set and cannot be updated");
5031 Boolean currentHighestVersion = currentResource.isHighestVersion();
5032 Boolean updatedHighestVersion = updateInfoResource.isHighestVersion();
5034 if ((updatedHighestVersion != null) && (!updatedHighestVersion.equals(currentHighestVersion))) {
5035 log.debug("Resource highest version is automatically set and cannot be updated");
5038 String currentUuid = currentResource.getUUID();
5039 String updatedUuid = updateInfoResource.getUUID();
5041 if ((updatedUuid != null) && (!updatedUuid.equals(currentUuid))) {
5042 log.debug("Resource UUID is automatically set and cannot be updated");
5045 log.debug("Resource Type cannot be updated");
5046 String currentInvariantUuid = currentResource.getInvariantUUID();
5047 String updatedInvariantUuid = updateInfoResource.getInvariantUUID();
5049 if ((updatedInvariantUuid != null) && (!updatedInvariantUuid.equals(currentInvariantUuid))) {
5050 log.debug("Resource invariant UUID is automatically set and cannot be updated");
5051 updateInfoResource.setInvariantUUID(currentInvariantUuid);
5055 private void validateFields(Resource currentResource, Resource updateInfoResource, boolean inTransaction,
5057 boolean hasBeenCertified = ValidationUtils.hasBeenCertified(currentResource.getVersion());
5058 log.debug("validate resource name before update");
5059 validateResourceName(currentResource, updateInfoResource, hasBeenCertified, isNested);
5060 log.debug("validate description before update");
5061 componentDescriptionValidator.validateAndCorrectField(null, updateInfoResource, null);
5062 log.debug("validate icon before update");
5063 validateIcon(currentResource, updateInfoResource, hasBeenCertified);
5064 log.debug("validate tags before update");
5065 componentTagsValidator.validateAndCorrectField(null, updateInfoResource, null);
5066 log.debug("validate vendor name before update");
5067 validateVendorName(null, updateInfoResource, null);
5068 log.debug("validate resource vendor model number before update");
5069 validateResourceVendorModelNumber(currentResource, updateInfoResource);
5070 log.debug("validate vendor release before update");
5071 validateVendorReleaseName(null, updateInfoResource, null);
5072 log.debug("validate contact info before update");
5073 componentContactIdValidator.validateAndCorrectField(null, updateInfoResource, null);
5074 log.debug(VALIDATE_DERIVED_BEFORE_UPDATE);
5075 validateDerivedFromDuringUpdate(currentResource, updateInfoResource, hasBeenCertified);
5076 log.debug("validate category before update");
5077 validateCategory(currentResource, updateInfoResource, hasBeenCertified, inTransaction);
5080 private boolean isResourceNameEquals(Resource currentResource, Resource updateInfoResource) {
5081 String resourceNameUpdated = updateInfoResource.getName();
5082 String resourceNameCurrent = currentResource.getName();
5083 if (resourceNameCurrent.equals(resourceNameUpdated)) {
5086 // In case of CVFC type we should support the case of old VF with CVFC
5087 // instances that were created without the "Cvfc" suffix
5088 return currentResource.getResourceType() == ResourceTypeEnum.CVFC
5089 && resourceNameUpdated.equals(addCvfcSuffixToResourceName(resourceNameCurrent));
5092 private String addCvfcSuffixToResourceName(String resourceName) {
5093 return resourceName + "Cvfc";
5096 private void validateResourceName(Resource currentResource, Resource updateInfoResource, boolean hasBeenCertified,
5098 String resourceNameUpdated = updateInfoResource.getName();
5099 if (!isResourceNameEquals(currentResource, updateInfoResource)) {
5100 if (isNested || !hasBeenCertified) {
5101 componentNameValidator.validateAndCorrectField(null, updateInfoResource, null);
5102 validateResourceNameUniqueness(updateInfoResource);
5103 currentResource.setName(resourceNameUpdated);
5104 currentResource.setNormalizedName(ValidationUtils.normaliseComponentName(resourceNameUpdated));
5105 currentResource.setSystemName(ValidationUtils.convertToSystemName(resourceNameUpdated));
5108 log.info("Resource name: {}, cannot be updated once the resource has been certified once.",
5109 resourceNameUpdated);
5110 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_NAME_CANNOT_BE_CHANGED);
5115 private void validateIcon(Resource currentResource, Resource updateInfoResource, boolean hasBeenCertified) {
5116 String iconUpdated = updateInfoResource.getIcon();
5117 String iconCurrent = currentResource.getIcon();
5118 if (!iconCurrent.equals(iconUpdated)) {
5119 if (!hasBeenCertified) {
5120 componentIconValidator.validateAndCorrectField(null, updateInfoResource, null);
5122 log.info("Icon {} cannot be updated once the resource has been certified once.", iconUpdated);
5123 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_ICON_CANNOT_BE_CHANGED);
5128 private void validateResourceVendorModelNumber(Resource currentResource, Resource updateInfoResource) {
5129 String updatedResourceVendorModelNumber = updateInfoResource.getResourceVendorModelNumber();
5130 String currentResourceVendorModelNumber = currentResource.getResourceVendorModelNumber();
5131 if (!currentResourceVendorModelNumber.equals(updatedResourceVendorModelNumber)) {
5132 validateResourceVendorModelNumber(null, updateInfoResource, null);
5136 private Either<Boolean, ResponseFormat> validateCategory(Resource currentResource, Resource updateInfoResource,
5137 boolean hasBeenCertified, boolean inTransaction) {
5138 validateCategory(null, updateInfoResource, null, inTransaction);
5139 if (hasBeenCertified) {
5140 CategoryDefinition currentCategory = currentResource.getCategories()
5142 SubCategoryDefinition currentSubCategory = currentCategory.getSubcategories()
5144 CategoryDefinition updateCategory = updateInfoResource.getCategories()
5146 SubCategoryDefinition updtaeSubCategory = updateCategory.getSubcategories()
5148 if (!currentCategory.getName()
5149 .equals(updateCategory.getName())
5150 || !currentSubCategory.getName()
5151 .equals(updtaeSubCategory.getName())) {
5152 log.info("Category {} cannot be updated once the resource has been certified once.",
5153 currentResource.getCategories());
5154 ResponseFormat errorResponse = componentsUtils
5155 .getResponseFormat(ActionStatus.RESOURCE_CATEGORY_CANNOT_BE_CHANGED);
5156 return Either.right(errorResponse);
5159 return Either.left(true);
5162 private Either<Boolean, ResponseFormat> validateDerivedFromDuringUpdate(Resource currentResource,
5163 Resource updateInfoResource, boolean hasBeenCertified) {
5165 List<String> currentDerivedFrom = currentResource.getDerivedFrom();
5166 List<String> updatedDerivedFrom = updateInfoResource.getDerivedFrom();
5167 if (currentDerivedFrom == null || currentDerivedFrom.isEmpty() || updatedDerivedFrom == null
5168 || updatedDerivedFrom.isEmpty()) {
5169 log.trace("Update normative types");
5170 return Either.left(true);
5173 String derivedFromCurrent = currentDerivedFrom.get(0);
5174 String derivedFromUpdated = updatedDerivedFrom.get(0);
5176 if (!derivedFromCurrent.equals(derivedFromUpdated)) {
5177 if (!hasBeenCertified) {
5178 validateDerivedFromExist(null, updateInfoResource, null);
5180 Either<Boolean, ResponseFormat> validateDerivedFromExtending = validateDerivedFromExtending(null,
5181 currentResource, updateInfoResource, null);
5183 if (validateDerivedFromExtending.isRight() || !validateDerivedFromExtending.left()
5185 log.debug("Derived from cannot be updated if it doesnt inherits directly or extends inheritance");
5186 return validateDerivedFromExtending;
5190 // For derived from, we must know whether it was actually changed,
5191 // otherwise we must do no action.
5192 // Due to changes it inflicts on data model (remove artifacts,
5193 // properties...), it's not like a flat field which can be
5194 // overwritten if not changed.
5195 // So we must indicate that derived from is not changed
5196 updateInfoResource.setDerivedFrom(null);
5198 return Either.left(true);
5201 private Either<Boolean, ResponseFormat> validateNestedDerivedFromDuringUpdate(Resource currentResource,
5202 Resource updateInfoResource, boolean hasBeenCertified) {
5204 List<String> currentDerivedFrom = currentResource.getDerivedFrom();
5205 List<String> updatedDerivedFrom = updateInfoResource.getDerivedFrom();
5206 if (currentDerivedFrom == null || currentDerivedFrom.isEmpty() || updatedDerivedFrom == null
5207 || updatedDerivedFrom.isEmpty()) {
5208 log.trace("Update normative types");
5209 return Either.left(true);
5212 String derivedFromCurrent = currentDerivedFrom.get(0);
5213 String derivedFromUpdated = updatedDerivedFrom.get(0);
5215 if (!derivedFromCurrent.equals(derivedFromUpdated)) {
5216 if (!hasBeenCertified) {
5217 validateDerivedFromExist(null, updateInfoResource, null);
5219 Either<Boolean, ResponseFormat> validateDerivedFromExtending = validateDerivedFromExtending(null,
5220 currentResource, updateInfoResource, null);
5222 if (validateDerivedFromExtending.isRight() || !validateDerivedFromExtending.left()
5224 log.debug("Derived from cannot be updated if it doesnt inherits directly or extends inheritance");
5225 return validateDerivedFromExtending;
5229 return Either.left(true);
5232 private void validateDerivedFromExist(User user, Resource resource, AuditingActionEnum actionEnum) {
5233 if (resource.getDerivedFrom() == null || resource.getDerivedFrom()
5237 String templateName = resource.getDerivedFrom()
5239 Either<Boolean, StorageOperationStatus> dataModelResponse = toscaOperationFacade
5240 .validateToscaResourceNameExists(templateName);
5241 if (dataModelResponse.isRight()) {
5242 StorageOperationStatus storageStatus = dataModelResponse.right()
5244 BeEcompErrorManager.getInstance()
5245 .logBeDaoSystemError("Create Resource - validateDerivedFromExist");
5246 log.debug("request to data model failed with error: {}", storageStatus);
5247 ResponseFormat responseFormat = componentsUtils
5248 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(storageStatus), resource);
5249 log.trace("audit before sending response");
5250 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
5251 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(storageStatus));
5252 } else if (!dataModelResponse.left()
5254 log.info("resource template with name: {}, does not exists", templateName);
5255 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.PARENT_RESOURCE_NOT_FOUND);
5256 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
5257 throw new ByActionStatusComponentException(ActionStatus.PARENT_RESOURCE_NOT_FOUND);
5261 // Tal G for extending inheritance US815447
5262 private Either<Boolean, ResponseFormat> validateDerivedFromExtending(User user, Resource currentResource,
5263 Resource updateInfoResource, AuditingActionEnum actionEnum) {
5264 String currentTemplateName = currentResource.getDerivedFrom()
5266 String updatedTemplateName = updateInfoResource.getDerivedFrom()
5269 Either<Boolean, StorageOperationStatus> dataModelResponse = toscaOperationFacade
5270 .validateToscaResourceNameExtends(currentTemplateName, updatedTemplateName);
5271 if (dataModelResponse.isRight()) {
5272 StorageOperationStatus storageStatus = dataModelResponse.right()
5274 BeEcompErrorManager.getInstance()
5275 .logBeDaoSystemError("Create/Update Resource - validateDerivingFromExtendingType");
5276 ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(
5277 componentsUtils.convertFromStorageResponse(storageStatus), currentResource);
5278 log.trace("audit before sending response");
5279 componentsUtils.auditResource(responseFormat, user, currentResource, actionEnum);
5280 return Either.right(responseFormat);
5283 if (!dataModelResponse.left()
5285 log.info("resource template with name {} does not inherit as original {}", updatedTemplateName,
5286 currentTemplateName);
5287 ResponseFormat responseFormat = componentsUtils
5288 .getResponseFormat(ActionStatus.PARENT_RESOURCE_DOES_NOT_EXTEND);
5289 componentsUtils.auditResource(responseFormat, user, currentResource, actionEnum);
5291 return Either.right(responseFormat);
5294 return Either.left(true);
5297 public void validateDerivedFromNotEmpty(User user, Resource resource, AuditingActionEnum actionEnum) {
5298 log.debug("validate resource derivedFrom field");
5299 if ((resource.getDerivedFrom() == null) || (resource.getDerivedFrom()
5301 || (resource.getDerivedFrom()
5303 || (resource.getDerivedFrom()
5307 log.info("derived from (template) field is missing for the resource");
5308 ResponseFormat responseFormat = componentsUtils
5309 .getResponseFormat(ActionStatus.MISSING_DERIVED_FROM_TEMPLATE);
5310 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
5312 throw new ByActionStatusComponentException(ActionStatus.MISSING_DERIVED_FROM_TEMPLATE);
5316 private void validateResourceNameUniqueness(Resource resource) {
5318 Either<Boolean, StorageOperationStatus> resourceOperationResponse = toscaOperationFacade
5319 .validateComponentNameExists(resource.getName(), resource.getResourceType(),
5320 resource.getComponentType());
5321 if (resourceOperationResponse.isLeft() && resourceOperationResponse.left()
5323 log.debug("resource with name: {}, already exists", resource.getName());
5324 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_NAME_ALREADY_EXIST,
5325 ComponentTypeEnum.RESOURCE.getValue(), resource.getName());
5326 } else if (resourceOperationResponse.isRight()) {
5327 log.debug("error while validateResourceNameExists for resource: {}", resource.getName());
5328 throw new StorageException(resourceOperationResponse.right()
5333 private void validateCategory(User user, Resource resource, AuditingActionEnum actionEnum, boolean inTransaction) {
5335 List<CategoryDefinition> categories = resource.getCategories();
5336 if (CollectionUtils.isEmpty(categories)) {
5337 log.debug(CATEGORY_IS_EMPTY);
5338 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_MISSING_CATEGORY,
5339 ComponentTypeEnum.RESOURCE.getValue());
5340 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
5341 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_MISSING_CATEGORY,
5342 ComponentTypeEnum.RESOURCE.getValue());
5344 if (categories.size() > 1) {
5345 log.debug("Must be only one category for resource");
5346 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_TOO_MUCH_CATEGORIES,
5347 ComponentTypeEnum.RESOURCE.getValue());
5349 CategoryDefinition category = categories.get(0);
5350 List<SubCategoryDefinition> subcategories = category.getSubcategories();
5351 if (CollectionUtils.isEmpty(subcategories)) {
5352 log.debug("Missinig subcategory for resource");
5353 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_MISSING_SUBCATEGORY);
5355 if (subcategories.size() > 1) {
5356 log.debug("Must be only one sub category for resource");
5357 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_TOO_MUCH_SUBCATEGORIES);
5360 SubCategoryDefinition subcategory = subcategories.get(0);
5362 if (!ValidationUtils.validateStringNotEmpty(category.getName())) {
5363 log.debug(CATEGORY_IS_EMPTY);
5364 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_MISSING_CATEGORY,
5365 ComponentTypeEnum.RESOURCE.getValue());
5366 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
5367 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_MISSING_CATEGORY,
5368 ComponentTypeEnum.RESOURCE.getValue());
5370 if (!ValidationUtils.validateStringNotEmpty(subcategory.getName())) {
5371 log.debug(CATEGORY_IS_EMPTY);
5372 ResponseFormat responseFormat = componentsUtils.getResponseFormat(
5373 ActionStatus.COMPONENT_MISSING_SUBCATEGORY, ComponentTypeEnum.RESOURCE.getValue());
5374 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
5375 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_MISSING_SUBCATEGORY,
5376 ComponentTypeEnum.RESOURCE.getValue());
5379 validateCategoryListed(category, subcategory, user, resource, actionEnum, inTransaction);
5382 private void validateCategoryListed(CategoryDefinition category, SubCategoryDefinition subcategory, User user,
5383 Resource resource, AuditingActionEnum actionEnum, boolean inTransaction) {
5384 ResponseFormat responseFormat;
5385 if (category != null && subcategory != null) {
5386 log.debug("validating resource category {} against valid categories list", category);
5387 Either<List<CategoryDefinition>, ActionStatus> categories = elementDao
5388 .getAllCategories(NodeTypeEnum.ResourceNewCategory, inTransaction);
5389 if (categories.isRight()) {
5390 log.debug("failed to retrieve resource categories from JanusGraph");
5391 responseFormat = componentsUtils.getResponseFormat(categories.right()
5393 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
5394 throw new ByActionStatusComponentException(categories.right()
5397 List<CategoryDefinition> categoryList = categories.left()
5399 Optional<CategoryDefinition> foundCategory = categoryList.stream()
5400 .filter(cat -> cat.getName()
5401 .equals(category.getName()))
5403 if (!foundCategory.isPresent()) {
5404 log.debug("Category {} is not part of resource category group. Resource category valid values are {}",
5405 category, categoryList);
5406 failOnInvalidCategory(user, resource, actionEnum);
5408 Optional<SubCategoryDefinition> foundSubcategory = foundCategory.get()
5411 .filter(subcat -> subcat.getName()
5412 .equals(subcategory.getName()))
5414 if (!foundSubcategory.isPresent()) {
5416 "SubCategory {} is not part of resource category group. Resource subcategory valid values are {}",
5417 subcategory, foundCategory.get()
5418 .getSubcategories());
5419 failOnInvalidCategory(user, resource, actionEnum);
5424 private void failOnInvalidCategory(User user, Resource resource, AuditingActionEnum actionEnum) {
5425 ResponseFormat responseFormat;
5426 responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INVALID_CATEGORY,
5427 ComponentTypeEnum.RESOURCE.getValue());
5428 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
5429 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INVALID_CATEGORY, ComponentTypeEnum.RESOURCE.getValue());
5432 public void validateVendorReleaseName(User user, Resource resource, AuditingActionEnum actionEnum) {
5433 String vendorRelease = resource.getVendorRelease();
5434 log.debug("validate vendor relese name");
5435 if (!ValidationUtils.validateStringNotEmpty(vendorRelease)) {
5436 log.info("vendor relese name is missing.");
5437 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.MISSING_VENDOR_RELEASE);
5438 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
5439 throw new ByActionStatusComponentException(ActionStatus.MISSING_VENDOR_RELEASE);
5442 validateVendorReleaseName(vendorRelease, user, resource, actionEnum);
5445 public void validateVendorReleaseName(String vendorRelease, User user, Resource resource,
5446 AuditingActionEnum actionEnum) {
5447 if (vendorRelease != null) {
5448 if (!ValidationUtils.validateVendorReleaseLength(vendorRelease)) {
5449 log.info("vendor release exceds limit.");
5450 ResponseFormat errorResponse = componentsUtils.getResponseFormat(
5451 ActionStatus.VENDOR_RELEASE_EXCEEDS_LIMIT, "" + ValidationUtils.VENDOR_RELEASE_MAX_LENGTH);
5452 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
5453 throw new ByActionStatusComponentException(ActionStatus.VENDOR_RELEASE_EXCEEDS_LIMIT,
5454 "" + ValidationUtils.VENDOR_RELEASE_MAX_LENGTH);
5457 if (!ValidationUtils.validateVendorRelease(vendorRelease)) {
5458 log.info("vendor release is not valid.");
5459 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.INVALID_VENDOR_RELEASE);
5460 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
5461 throw new ByActionStatusComponentException(ActionStatus.INVALID_VENDOR_RELEASE, vendorRelease);
5466 private void validateVendorName(User user, Resource resource,
5467 AuditingActionEnum actionEnum) {
5468 String vendorName = resource.getVendorName();
5469 if (!ValidationUtils.validateStringNotEmpty(vendorName)) {
5470 log.info("vendor name is missing.");
5471 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.MISSING_VENDOR_NAME);
5472 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
5473 throw new ByActionStatusComponentException(ActionStatus.MISSING_VENDOR_NAME);
5475 validateVendorName(vendorName, user, resource, actionEnum);
5478 private void validateVendorName(String vendorName, User user, Resource resource,
5479 AuditingActionEnum actionEnum) {
5480 if (vendorName != null) {
5481 if (!ValidationUtils.validateVendorNameLength(vendorName)) {
5482 log.info("vendor name exceds limit.");
5483 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.VENDOR_NAME_EXCEEDS_LIMIT,
5484 "" + ValidationUtils.VENDOR_NAME_MAX_LENGTH);
5485 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
5486 throw new ByActionStatusComponentException(ActionStatus.VENDOR_NAME_EXCEEDS_LIMIT,
5487 "" + ValidationUtils.VENDOR_NAME_MAX_LENGTH);
5490 if (!ValidationUtils.validateVendorName(vendorName)) {
5491 log.info("vendor name is not valid.");
5492 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.INVALID_VENDOR_NAME);
5493 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
5494 throw new ByActionStatusComponentException(ActionStatus.INVALID_VENDOR_NAME, vendorName);
5499 private void validateResourceVendorModelNumber(User user, Resource resource, AuditingActionEnum actionEnum) {
5500 String resourceVendorModelNumber = resource.getResourceVendorModelNumber();
5501 if (StringUtils.isNotEmpty(resourceVendorModelNumber)) {
5502 if (!ValidationUtils.validateResourceVendorModelNumberLength(resourceVendorModelNumber)) {
5503 log.info("resource vendor model number exceeds limit.");
5504 ResponseFormat errorResponse = componentsUtils.getResponseFormat(
5505 ActionStatus.RESOURCE_VENDOR_MODEL_NUMBER_EXCEEDS_LIMIT,
5506 "" + ValidationUtils.RESOURCE_VENDOR_MODEL_NUMBER_MAX_LENGTH);
5507 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
5508 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_VENDOR_MODEL_NUMBER_EXCEEDS_LIMIT,
5509 "" + ValidationUtils.RESOURCE_VENDOR_MODEL_NUMBER_MAX_LENGTH);
5511 // resource vendor model number is currently validated as vendor
5513 if (!ValidationUtils.validateVendorName(resourceVendorModelNumber)) {
5514 log.info("resource vendor model number is not valid.");
5515 ResponseFormat errorResponse = componentsUtils
5516 .getResponseFormat(ActionStatus.INVALID_RESOURCE_VENDOR_MODEL_NUMBER);
5517 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
5518 throw new ByActionStatusComponentException(ActionStatus.INVALID_RESOURCE_VENDOR_MODEL_NUMBER);
5524 private void validateCost(Resource resource) {
5525 String cost = resource.getCost();
5527 if (!ValidationUtils.validateCost(cost)) {
5528 log.debug("resource cost is invalid.");
5529 throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
5534 private void validateLicenseType(User user, Resource resource,
5535 AuditingActionEnum actionEnum) {
5536 log.debug("validate licenseType");
5537 String licenseType = resource.getLicenseType();
5538 if (licenseType != null) {
5539 List<String> licenseTypes = ConfigurationManager.getConfigurationManager().getConfiguration()
5541 if (!licenseTypes.contains(licenseType)) {
5542 log.debug("License type {} isn't configured", licenseType);
5543 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT);
5544 if (actionEnum != null) {
5545 // In update case, no audit is required
5546 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
5548 throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
5553 private Either<Boolean, ResponseFormat> processUpdateOfDerivedFrom(Resource currentResource,
5554 Resource updatedResource, String userId, boolean inTransaction) {
5555 if (updatedResource.getDerivedFrom() != null) {
5556 log.debug("Starting derived from update for resource {}", updatedResource.getUniqueId());
5557 log.debug("1. Removing interface artifacts from graph");
5558 // Remove all interface artifacts of resource
5559 String resourceId = updatedResource.getUniqueId();
5560 Map<String, InterfaceDefinition> interfaces = currentResource.getInterfaces();
5562 if (interfaces != null) {
5563 Collection<InterfaceDefinition> values = interfaces.values();
5564 for (InterfaceDefinition interfaceDefinition : values) {
5565 String interfaceType = interfaceTypeOperation.getShortInterfaceName(interfaceDefinition);
5567 log.trace("Starting interface artifacts removal for interface type {}", interfaceType);
5568 Map<String, Operation> operations = interfaceDefinition.getOperationsMap();
5569 if (operations != null) {
5570 for (Entry<String, Operation> operationEntry : operations.entrySet()) {
5571 Operation operation = operationEntry.getValue();
5572 ArtifactDefinition implementation = operation.getImplementationArtifact();
5573 if (implementation != null) {
5574 String uniqueId = implementation.getUniqueId();
5575 log.debug("Removing interface artifact definition {}, operation {}, interfaceType {}",
5576 uniqueId, operationEntry.getKey(), interfaceType);
5577 // only thing that transacts and locks here
5578 Either<ArtifactDefinition, ResponseFormat> deleteArtifactByInterface =
5579 artifactsBusinessLogic.deleteArtifactByInterface(resourceId, userId, uniqueId, true);
5580 if (deleteArtifactByInterface.isRight()) {
5581 log.debug("Couldn't remove artifact definition with id {}", uniqueId);
5582 if (!inTransaction) {
5583 janusGraphDao.rollback();
5585 return Either.right(deleteArtifactByInterface.right()
5589 log.trace("No implementation found for operation {} - nothing to delete",
5590 operationEntry.getKey());
5594 log.trace("No operations found for interface type {}", interfaceType);
5598 log.debug("2. Removing properties");
5599 Either<Map<String, PropertyDefinition>, StorageOperationStatus> findPropertiesOfNode = propertyOperation
5600 .deleteAllPropertiesAssociatedToNode(NodeTypeEnum.Resource, resourceId);
5602 if (findPropertiesOfNode.isRight() && findPropertiesOfNode.right().value() != StorageOperationStatus.OK) {
5603 log.debug("Failed to remove all properties of resource");
5604 if (!inTransaction) {
5605 janusGraphDao.rollback();
5607 return Either.right(componentsUtils
5608 .getResponseFormat(componentsUtils.convertFromStorageResponse(findPropertiesOfNode.right()
5613 log.debug("Derived from wasn't changed during update");
5616 if (inTransaction) {
5617 return Either.left(true);
5619 janusGraphDao.commit();
5620 return Either.left(true);
5624 /**** Auditing *******************/
5626 protected static IElementOperation getElementDao(Class<IElementOperation> class1, ServletContext context) {
5627 WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context
5628 .getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
5630 WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
5632 return webApplicationContext.getBean(class1);
5635 public ICapabilityTypeOperation getCapabilityTypeOperation() {
5636 return capabilityTypeOperation;
5640 public void setCapabilityTypeOperation(ICapabilityTypeOperation capabilityTypeOperation) {
5641 this.capabilityTypeOperation = capabilityTypeOperation;
5644 public Boolean validatePropertiesDefaultValues(Resource resource) {
5645 log.debug("validate resource properties default values");
5646 List<PropertyDefinition> properties = resource.getProperties();
5647 if (properties != null) {
5648 iterateOverProperties(properties);
5653 public void iterateOverProperties(List<PropertyDefinition> properties) {
5655 String innerType = null;
5656 for (PropertyDefinition property : properties) {
5657 if (!propertyOperation.isPropertyTypeValid(property)) {
5658 log.info("Invalid type for property {}", property);
5659 throw new ByActionStatusComponentException(ActionStatus.INVALID_PROPERTY_TYPE,
5660 property.getType(), property.getName());
5663 Map<String, DataTypeDefinition> allDataTypes = getAllDataTypes(applicationDataTypeCache);
5664 type = property.getType();
5666 if (type.equals(ToscaPropertyType.LIST.getType()) || type.equals(ToscaPropertyType.MAP.getType())) {
5667 ResponseFormat responseFormat = validateMapOrListPropertyType(property, innerType, allDataTypes);
5668 if (responseFormat != null) {
5672 validateDefaultPropertyValue(property, allDataTypes, type, innerType);
5676 private void validateDefaultPropertyValue(PropertyDefinition property,
5677 Map<String, DataTypeDefinition> allDataTypes, String type, String innerType) {
5678 if (!propertyOperation.isPropertyDefaultValueValid(property, allDataTypes)) {
5679 log.info("Invalid default value for property {}", property);
5680 ResponseFormat responseFormat;
5681 if (type.equals(ToscaPropertyType.LIST.getType()) || type.equals(ToscaPropertyType.MAP.getType())) {
5682 throw new ByActionStatusComponentException(ActionStatus.INVALID_COMPLEX_DEFAULT_VALUE,
5683 property.getName(), type, innerType, property.getDefaultValue());
5685 throw new ByActionStatusComponentException(ActionStatus.INVALID_DEFAULT_VALUE,
5686 property.getName(), type, property.getDefaultValue());
5690 private ResponseFormat validateMapOrListPropertyType(PropertyDefinition property, String innerType,
5691 Map<String, DataTypeDefinition> allDataTypes) {
5692 ResponseFormat responseFormat = null;
5693 ImmutablePair<String, Boolean> propertyInnerTypeValid = propertyOperation.isPropertyInnerTypeValid(property,
5695 innerType = propertyInnerTypeValid.getLeft();
5696 if (!propertyInnerTypeValid.getRight()
5698 log.info("Invalid inner type for property {}", property);
5699 responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_PROPERTY_INNER_TYPE, innerType,
5700 property.getName());
5702 return responseFormat;
5706 public Either<List<String>, ResponseFormat> deleteMarkedComponents() {
5707 return deleteMarkedComponents(ComponentTypeEnum.RESOURCE);
5711 public ComponentInstanceBusinessLogic getComponentInstanceBL() {
5712 return componentInstanceBusinessLogic;
5715 private String getComponentTypeForResponse(Component component) {
5716 String componentTypeForResponse = "SERVICE";
5717 if (component instanceof Resource) {
5718 componentTypeForResponse = ((Resource) component).getResourceType()
5721 return componentTypeForResponse;
5724 public Either<Resource, ResponseFormat> getLatestResourceFromCsarUuid(String csarUuid, User user) {
5727 validateUserExists(user);
5729 // get resource from csar uuid
5730 Either<Resource, StorageOperationStatus> either = toscaOperationFacade
5731 .getLatestComponentByCsarOrName(ComponentTypeEnum.RESOURCE, csarUuid, "");
5732 if (either.isRight()) {
5733 ResponseFormat resp = componentsUtils.getResponseFormat(ActionStatus.RESOURCE_FROM_CSAR_NOT_FOUND,
5735 return Either.right(resp);
5738 return Either.left(either.left()
5743 public Either<List<ComponentInstance>, ResponseFormat> getComponentInstancesFilteredByPropertiesAndInputs(
5744 String componentId, String userId) {
5748 private Map<String, List<CapabilityDefinition>> getValidComponentInstanceCapabilities(String resourceId,
5749 Map<String, List<CapabilityDefinition>> defaultCapabilities,
5750 Map<String, List<UploadCapInfo>> uploadedCapabilities) {
5752 Map<String, List<CapabilityDefinition>> validCapabilitiesMap = new HashMap<>();
5753 uploadedCapabilities.forEach((k, v) -> addValidComponentInstanceCapabilities(k, v, resourceId,
5754 defaultCapabilities, validCapabilitiesMap));
5755 return validCapabilitiesMap;
5758 private void addValidComponentInstanceCapabilities(String key, List<UploadCapInfo> capabilities, String resourceId,
5759 Map<String, List<CapabilityDefinition>> defaultCapabilities,
5760 Map<String, List<CapabilityDefinition>> validCapabilitiesMap) {
5761 String capabilityType = capabilities.get(0)
5763 if (defaultCapabilities.containsKey(capabilityType)) {
5764 CapabilityDefinition defaultCapability = getCapability(resourceId, defaultCapabilities, capabilityType);
5765 validateCapabilityProperties(capabilities, resourceId, defaultCapability);
5766 List<CapabilityDefinition> validCapabilityList = new ArrayList<>();
5767 validCapabilityList.add(defaultCapability);
5768 validCapabilitiesMap.put(key, validCapabilityList);
5770 throw new ByActionStatusComponentException(ActionStatus.MISSING_CAPABILITY_TYPE, capabilityType);
5774 private void validateCapabilityProperties(List<UploadCapInfo> capabilities, String resourceId,
5775 CapabilityDefinition defaultCapability) {
5776 if (CollectionUtils.isEmpty(defaultCapability.getProperties()) && isNotEmpty(capabilities.get(0)
5777 .getProperties())) {
5778 log.debug("Failed to validate capability {} of component {}. Property list is empty. ",
5779 defaultCapability.getName(), resourceId);
5780 log.debug("Failed to update capability property values. Property list of fetched capability {} is empty. ",
5781 defaultCapability.getName());
5782 throw new ByActionStatusComponentException(ActionStatus.PROPERTY_NOT_FOUND, resourceId);
5783 } else if (isNotEmpty(capabilities.get(0)
5784 .getProperties())) {
5785 validateUniquenessUpdateUploadedComponentInstanceCapability(defaultCapability, capabilities.get(0));
5789 private CapabilityDefinition getCapability(String resourceId,
5790 Map<String, List<CapabilityDefinition>> defaultCapabilities, String capabilityType) {
5791 CapabilityDefinition defaultCapability;
5792 if (isNotEmpty(defaultCapabilities.get(capabilityType)
5794 .getProperties())) {
5795 defaultCapability = defaultCapabilities.get(capabilityType)
5798 Either<Component, StorageOperationStatus> getFullComponentRes = toscaOperationFacade
5799 .getToscaFullElement(resourceId);
5800 if (getFullComponentRes.isRight()) {
5801 log.debug("Failed to get full component {}. Status is {}. ", resourceId, getFullComponentRes.right()
5803 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_NOT_FOUND, resourceId);
5805 defaultCapability = getFullComponentRes.left()
5808 .get(capabilityType)
5811 return defaultCapability;
5814 private void validateUniquenessUpdateUploadedComponentInstanceCapability(CapabilityDefinition defaultCapability,
5815 UploadCapInfo uploadedCapability) {
5816 List<ComponentInstanceProperty> validProperties = new ArrayList<>();
5817 Map<String, PropertyDefinition> defaultProperties = defaultCapability.getProperties()
5819 .collect(toMap(PropertyDefinition::getName, Function.identity()));
5820 List<UploadPropInfo> uploadedProperties = uploadedCapability.getProperties();
5821 for (UploadPropInfo property : uploadedProperties) {
5822 String propertyName = property.getName()
5824 String propertyType = property.getType();
5825 ComponentInstanceProperty validProperty;
5826 if (defaultProperties.containsKey(propertyName)
5827 && propertTypeEqualsTo(defaultProperties, propertyName, propertyType)) {
5828 throw new ByActionStatusComponentException(ActionStatus.PROPERTY_NAME_ALREADY_EXISTS, propertyName);
5830 validProperty = new ComponentInstanceProperty();
5831 validProperty.setName(propertyName);
5832 if (property.getValue() != null) {
5833 validProperty.setValue(property.getValue()
5836 validProperty.setDescription(property.getDescription());
5837 validProperty.setPassword(property.isPassword());
5838 validProperties.add(validProperty);
5840 defaultCapability.setProperties(validProperties);
5843 private boolean propertTypeEqualsTo(Map<String, PropertyDefinition> defaultProperties, String propertyName,
5844 String propertyType) {
5845 return propertyType != null && !defaultProperties.get(propertyName)
5847 .equals(propertyType);
5850 private Either<EnumMap<ArtifactOperationEnum, List<NonMetaArtifactInfo>>, ResponseFormat> organizeVfCsarArtifactsByArtifactOperation(
5851 List<NonMetaArtifactInfo> artifactPathAndNameList, List<ArtifactDefinition> existingArtifactsToHandle,
5852 Resource resource, User user) {
5854 EnumMap<ArtifactOperationEnum, List<NonMetaArtifactInfo>> nodeTypeArtifactsToHandle = new EnumMap<>(
5855 ArtifactOperationEnum.class);
5856 Wrapper<ResponseFormat> responseWrapper = new Wrapper<>();
5857 Either<EnumMap<ArtifactOperationEnum, List<NonMetaArtifactInfo>>, ResponseFormat> nodeTypeArtifactsToHandleRes = Either
5858 .left(nodeTypeArtifactsToHandle);
5860 // add all found Csar artifacts to list to upload
5861 List<NonMetaArtifactInfo> artifactsToUpload = new ArrayList<>(artifactPathAndNameList);
5862 List<NonMetaArtifactInfo> artifactsToUpdate = new ArrayList<>();
5863 List<NonMetaArtifactInfo> artifactsToDelete = new ArrayList<>();
5864 for (NonMetaArtifactInfo currNewArtifact : artifactPathAndNameList) {
5865 ArtifactDefinition foundArtifact;
5867 if (!existingArtifactsToHandle.isEmpty()) {
5868 foundArtifact = existingArtifactsToHandle.stream()
5869 .filter(a -> a.getArtifactName()
5870 .equals(currNewArtifact.getArtifactName()))
5873 if (foundArtifact != null) {
5874 if (foundArtifact.getArtifactType().equals(currNewArtifact.getArtifactType())) {
5875 if (!foundArtifact.getArtifactChecksum()
5876 .equals(currNewArtifact.getArtifactChecksum())) {
5877 currNewArtifact.setArtifactUniqueId(foundArtifact.getUniqueId());
5878 // if current artifact already exists, but has
5879 // different content, add him to the list to
5881 artifactsToUpdate.add(currNewArtifact);
5883 // remove found artifact from the list of existing
5884 // artifacts to handle, because it was already
5886 existingArtifactsToHandle.remove(foundArtifact);
5887 // and remove found artifact from the list to
5888 // upload, because it should either be updated or be
5890 artifactsToUpload.remove(currNewArtifact);
5892 log.debug("Can't upload two artifact with the same name {}.",
5893 currNewArtifact.getArtifactName());
5894 ResponseFormat responseFormat = ResponseFormatManager.getInstance()
5895 .getResponseFormat(ActionStatus.ARTIFACT_ALREADY_EXIST_IN_DIFFERENT_TYPE_IN_CSAR,
5896 currNewArtifact.getArtifactName(), currNewArtifact.getArtifactType(),
5897 foundArtifact.getArtifactType());
5898 AuditingActionEnum auditingAction = artifactsBusinessLogic
5899 .detectAuditingType(new ArtifactOperationInfo(false, false,
5900 ArtifactOperationEnum.CREATE), foundArtifact.getArtifactChecksum());
5901 artifactsBusinessLogic.handleAuditing(auditingAction, resource, resource.getUniqueId(),
5902 user, null, null, foundArtifact.getUniqueId(), responseFormat,
5903 resource.getComponentType(), null);
5904 responseWrapper.setInnerElement(responseFormat);
5910 if (responseWrapper.isEmpty()) {
5911 for (ArtifactDefinition currArtifact : existingArtifactsToHandle) {
5912 if (currArtifact.getIsFromCsar()) {
5913 artifactsToDelete.add(new NonMetaArtifactInfo(currArtifact.getArtifactName(), null,
5914 currArtifact.getArtifactType(),
5915 currArtifact.getArtifactGroupType(), null, currArtifact.getUniqueId(),
5916 currArtifact.getIsFromCsar()));
5918 artifactsToUpdate.add(new NonMetaArtifactInfo(currArtifact.getArtifactName(), null,
5919 currArtifact.getArtifactType(),
5920 currArtifact.getArtifactGroupType(), null, currArtifact.getUniqueId(),
5921 currArtifact.getIsFromCsar()));
5926 if (responseWrapper.isEmpty()) {
5927 if (!artifactsToUpload.isEmpty()) {
5928 nodeTypeArtifactsToHandle.put(ArtifactOperationEnum.CREATE, artifactsToUpload);
5930 if (!artifactsToUpdate.isEmpty()) {
5931 nodeTypeArtifactsToHandle.put(ArtifactOperationEnum.UPDATE, artifactsToUpdate);
5933 if (!artifactsToDelete.isEmpty()) {
5934 nodeTypeArtifactsToHandle.put(ArtifactOperationEnum.DELETE, artifactsToDelete);
5937 if (!responseWrapper.isEmpty()) {
5938 nodeTypeArtifactsToHandleRes = Either.right(responseWrapper.getInnerElement());
5940 } catch (Exception e) {
5941 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
5942 responseWrapper.setInnerElement(responseFormat);
5943 log.debug("Exception occurred when findNodeTypeArtifactsToHandle, error is:{}", e.getMessage(), e);
5945 return nodeTypeArtifactsToHandleRes;
5948 ImmutablePair<String, String> buildNestedToscaResourceName(final String nodeResourceType,
5949 final String vfResourceName,
5950 final String nodeTypeFullName) {
5952 String actualVfName;
5953 if (ResourceTypeEnum.CVFC.name()
5954 .equals(nodeResourceType)) {
5955 actualVfName = vfResourceName + ResourceTypeEnum.CVFC.name();
5956 actualType = ResourceTypeEnum.VFC.name();
5958 actualVfName = vfResourceName;
5959 actualType = nodeResourceType;
5961 String nameWithouNamespacePrefix;
5963 final String nodeTypeNamePrefix = getNodeTypeNamePrefix(nodeTypeFullName);
5964 log.debug("####### buildNestedToscaResourceName nodeResourceType {}, vfResourceName {}, "
5965 + "nodeTypeFullName {}, actualType {}, vfResourceName {} ", nodeResourceType, vfResourceName,
5966 nodeTypeFullName, actualType, vfResourceName);
5967 final StringBuilder toscaResourceName = new StringBuilder(nodeTypeNamePrefix);
5969 if (!nodeTypeFullName.contains(nodeTypeNamePrefix)) {
5970 nameWithouNamespacePrefix = nodeTypeFullName;
5972 nameWithouNamespacePrefix = nodeTypeFullName.substring(nodeTypeNamePrefix.length());
5974 final String[] findTypes = nameWithouNamespacePrefix.split("\\.");
5976 if (nodeResourceType.equalsIgnoreCase(findTypes[0])){
5977 actualName = nameWithouNamespacePrefix.substring(nodeResourceType.length());
5979 actualName = "." + nameWithouNamespacePrefix;
5982 if (actualName.startsWith(Constants.ABSTRACT)) {
5983 toscaResourceName.append(nodeResourceType.toLowerCase()).append('.')
5984 .append(ValidationUtils.convertToSystemName(actualVfName));
5986 toscaResourceName.append(actualType.toLowerCase()).append('.')
5987 .append(ValidationUtils.convertToSystemName(actualVfName)).append('.').append(Constants.ABSTRACT);
5989 final StringBuilder previousToscaResourceName = new StringBuilder(toscaResourceName);
5990 final String[] actualNames = actualName.split("\\.");
5991 if (actualNames.length < 3) {
5992 return new ImmutablePair<>(toscaResourceName.append(actualName.toLowerCase()).toString(),
5993 previousToscaResourceName.append(actualName).toString());
5995 return new ImmutablePair<>(toscaResourceName.append(actualName.toLowerCase()).toString(),
5996 previousToscaResourceName.append(actualName.substring(actualNames[1].length() + 1)
5997 .toLowerCase()).toString());
5998 } catch (final Exception e) {
5999 log.debug("Exception occured when buildNestedToscaResourceName, error is:{}", e.getMessage(), e);
6000 throw new ByActionStatusComponentException(ActionStatus.INVALID_TOSCA_TEMPLATE, vfResourceName);
6005 * Extracts a Node Type Name prefix from the given Node Type Name.
6007 * @param fullName Node Type Name
6008 * @return Node Type Name Prefix
6010 private String getNodeTypeNamePrefix(final String fullName) {
6011 String tempPrefix = Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX;
6012 final List<String> definedNodeTypeNamespaceList = getDefinedNodeTypeNamespaceList();
6013 log.debug("************* getPrefiX fullName {} FROM {}", fullName, definedNodeTypeNamespaceList);
6014 final Optional<String> validNameSpace = validateNodeTypeNamePrefix(fullName, definedNodeTypeNamespaceList);
6015 if (validNameSpace.isPresent()) {
6016 tempPrefix = validNameSpace.get();
6018 log.debug("************* getNodeTypeNamePrefix return fullName {} ", tempPrefix);
6023 public Either<UiComponentDataTransfer, ResponseFormat> getUiComponentDataTransferByComponentId(String resourceId,
6024 List<String> dataParamsToReturn) {
6026 ComponentParametersView paramsToRetuen = new ComponentParametersView(dataParamsToReturn);
6027 Either<Resource, StorageOperationStatus> resourceResultEither =
6028 toscaOperationFacade.getToscaElement(resourceId,
6031 if (resourceResultEither.isRight()) {
6032 if (resourceResultEither.right().value() == StorageOperationStatus.NOT_FOUND) {
6033 log.debug("Failed to found resource with id {} ", resourceId);
6035 .right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_NOT_FOUND, resourceId));
6038 log.debug("failed to get resource by id {} with filters {}", resourceId, dataParamsToReturn);
6039 return Either.right(componentsUtils
6040 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(resourceResultEither.right()
6044 Resource resource = resourceResultEither.left().value();
6045 if (dataParamsToReturn.contains(ComponentFieldsEnum.INPUTS.getValue())) {
6046 ListUtils.emptyIfNull(resource.getInputs())
6047 .forEach(input -> input.setConstraints(setInputConstraint(input)));
6050 UiComponentDataTransfer dataTransfer = uiComponentDataConverter.getUiDataTransferFromResourceByParams(resource,
6051 dataParamsToReturn);
6052 return Either.left(dataTransfer);
6056 public Either<Component, ActionStatus> shouldUpgradeToLatestDerived(Component clonedComponent) {
6057 Resource resource = (Resource) clonedComponent;
6058 if (ModelConverter.isAtomicComponent(resource.getResourceType())) {
6059 Either<Component, StorageOperationStatus> shouldUpgradeToLatestDerived = toscaOperationFacade
6060 .shouldUpgradeToLatestDerived(resource);
6061 if (shouldUpgradeToLatestDerived.isRight()) {
6062 return Either.right(componentsUtils.convertFromStorageResponse(shouldUpgradeToLatestDerived.right()
6065 return Either.left(shouldUpgradeToLatestDerived.left()
6068 return super.shouldUpgradeToLatestDerived(clonedComponent);