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.components.ResourceMetadataDataDefinition;
97 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
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 private static final 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, oldResource);
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) {
906 List<ArtifactDefinition> artifactsToUpload = new ArrayList<>(extractedArtifacts);
907 List<ArtifactDefinition> artifactsToUpdate = new ArrayList<>();
908 List<ArtifactDefinition> artifactsToDelete = new ArrayList<>();
909 processExistingNodeTypeArtifacts(extractedArtifacts, artifactsToUpload, artifactsToUpdate,
910 artifactsToDelete, collectExistingArtifacts(curNodeType));
911 return putFoundArtifacts(artifactsToUpload, artifactsToUpdate, artifactsToDelete);
912 } catch (Exception e) {
913 log.debug("Exception occurred when findNodeTypeArtifactsToHandle, error is:{}", e.getMessage(), e);
914 throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR);
918 private EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>> putFoundArtifacts(
919 List<ArtifactDefinition> artifactsToUpload, List<ArtifactDefinition> artifactsToUpdate,
920 List<ArtifactDefinition> artifactsToDelete) {
921 EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle = null;
922 if (!artifactsToUpload.isEmpty() || !artifactsToUpdate.isEmpty() || !artifactsToDelete.isEmpty()) {
923 nodeTypeArtifactsToHandle = new EnumMap<>(ArtifactOperationEnum.class);
924 if (!artifactsToUpload.isEmpty()) {
925 nodeTypeArtifactsToHandle.put(ArtifactOperationEnum.CREATE, artifactsToUpload);
927 if (!artifactsToUpdate.isEmpty()) {
928 nodeTypeArtifactsToHandle.put(ArtifactOperationEnum.UPDATE, artifactsToUpdate);
930 if (!artifactsToDelete.isEmpty()) {
931 nodeTypeArtifactsToHandle.put(ArtifactOperationEnum.DELETE, artifactsToDelete);
934 return nodeTypeArtifactsToHandle;
937 private void processExistingNodeTypeArtifacts(List<ArtifactDefinition> extractedArtifacts,
938 List<ArtifactDefinition> artifactsToUpload, List<ArtifactDefinition> artifactsToUpdate,
939 List<ArtifactDefinition> artifactsToDelete, Map<String, ArtifactDefinition> existingArtifacts) {
940 if (!existingArtifacts.isEmpty()) {
941 extractedArtifacts.stream()
942 .forEach(a -> processNodeTypeArtifact(artifactsToUpload, artifactsToUpdate, existingArtifacts, a));
943 artifactsToDelete.addAll(existingArtifacts.values());
947 private void processNodeTypeArtifact(List<ArtifactDefinition> artifactsToUpload,
948 List<ArtifactDefinition> artifactsToUpdate, Map<String, ArtifactDefinition> existingArtifacts,
949 ArtifactDefinition currNewArtifact) {
950 Optional<ArtifactDefinition> foundArtifact = existingArtifacts.values()
952 .filter(a -> a.getArtifactName()
953 .equals(currNewArtifact.getArtifactName()))
955 if (foundArtifact.isPresent()) {
956 if (foundArtifact.get()
958 .equals(currNewArtifact.getArtifactType())) {
959 updateFoundArtifact(artifactsToUpdate, currNewArtifact, foundArtifact.get());
960 existingArtifacts.remove(foundArtifact.get()
961 .getArtifactLabel());
962 artifactsToUpload.remove(currNewArtifact);
964 log.debug("Can't upload two artifact with the same name {}.", currNewArtifact.getArtifactName());
965 throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_ALREADY_EXIST_IN_DIFFERENT_TYPE_IN_CSAR,
966 currNewArtifact.getArtifactName(), currNewArtifact.getArtifactType(), foundArtifact.get()
972 private void updateFoundArtifact(List<ArtifactDefinition> artifactsToUpdate, ArtifactDefinition currNewArtifact,
973 ArtifactDefinition foundArtifact) {
974 if (!foundArtifact.getArtifactChecksum()
975 .equals(currNewArtifact.getArtifactChecksum())) {
976 foundArtifact.setPayload(currNewArtifact.getPayloadData());
977 foundArtifact.setPayloadData(Base64.encodeBase64String(currNewArtifact.getPayloadData()));
978 foundArtifact.setArtifactChecksum(
979 GeneralUtility.calculateMD5Base64EncodedByByteArray(currNewArtifact.getPayloadData()));
980 artifactsToUpdate.add(foundArtifact);
984 private Map<String, ArtifactDefinition> collectExistingArtifacts(Resource curNodeType) {
985 Map<String, ArtifactDefinition> existingArtifacts = new HashMap<>();
986 if (curNodeType == null) {
987 return existingArtifacts;
989 if (MapUtils.isNotEmpty(curNodeType.getDeploymentArtifacts())) {
990 existingArtifacts.putAll(curNodeType.getDeploymentArtifacts());
992 if (MapUtils.isNotEmpty(curNodeType.getArtifacts())) {
993 existingArtifacts.putAll(curNodeType.getArtifacts()
996 .filter(e -> e.getValue()
997 .getArtifactGroupType() == ArtifactGroupTypeEnum.INFORMATIONAL)
998 .collect(toMap(Map.Entry::getKey, Map.Entry::getValue)));
1000 return existingArtifacts;
1004 * Changes resource life cycle state to checked out
1008 * @param inTransaction
1011 private Either<Resource, ResponseFormat> checkoutResource(Resource resource, User user, boolean inTransaction) {
1012 Either<Resource, ResponseFormat> checkoutResourceRes;
1014 if (!resource.getComponentMetadataDefinition()
1015 .getMetadataDataDefinition()
1017 .equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
1019 "************* Going to change life cycle state of resource {} to not certified checked out. ",
1020 resource.getName());
1021 Either<? extends Component, ResponseFormat> checkoutRes = lifecycleBusinessLogic.changeComponentState(
1022 resource.getComponentType(), resource.getUniqueId(), user, LifeCycleTransitionEnum.CHECKOUT,
1023 new LifecycleChangeInfoWithAction(CERTIFICATION_ON_IMPORT,
1024 LifecycleChanceActionEnum.CREATE_FROM_CSAR),
1025 inTransaction, true);
1026 if (checkoutRes.isRight()) {
1027 log.debug("Could not change state of component {} with uid {} to checked out. Status is {}. ",
1028 resource.getComponentType()
1030 resource.getUniqueId(), checkoutRes.right()
1033 checkoutResourceRes = Either.right(checkoutRes.right()
1036 checkoutResourceRes = Either.left((Resource) checkoutRes.left()
1040 checkoutResourceRes = Either.left(resource);
1042 } catch (Exception e) {
1043 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
1044 checkoutResourceRes = Either.right(responseFormat);
1045 log.debug("Exception occurred when checkoutResource {} , error is:{}", resource.getName(), e.getMessage(),
1048 return checkoutResourceRes;
1052 * Handles Artifacts of NodeType
1054 * @param nodeTypeResource
1055 * @param nodeTypeArtifactsToHandle
1057 * @param inTransaction
1060 public Either<List<ArtifactDefinition>, ResponseFormat> handleNodeTypeArtifacts(Resource nodeTypeResource,
1061 Map<ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle,
1062 List<ArtifactDefinition> createdArtifacts, User user, boolean inTransaction, boolean ignoreLifecycleState) {
1063 List<ArtifactDefinition> handleNodeTypeArtifactsRequestRes;
1064 Either<List<ArtifactDefinition>, ResponseFormat> handleNodeTypeArtifactsRes = null;
1065 Either<Resource, ResponseFormat> changeStateResponse;
1067 changeStateResponse = checkoutResource(nodeTypeResource, user, inTransaction);
1068 if (changeStateResponse.isRight()) {
1069 return Either.right(changeStateResponse.right()
1072 nodeTypeResource = changeStateResponse.left()
1075 List<ArtifactDefinition> handledNodeTypeArtifacts = new ArrayList<>();
1076 log.debug("************* Going to handle artifacts of node type resource {}. ", nodeTypeResource.getName());
1077 for (Entry<ArtifactOperationEnum, List<ArtifactDefinition>> curOperationEntry : nodeTypeArtifactsToHandle
1079 ArtifactOperationEnum curOperation = curOperationEntry.getKey();
1080 List<ArtifactDefinition> curArtifactsToHandle = curOperationEntry.getValue();
1081 if (curArtifactsToHandle != null && !curArtifactsToHandle.isEmpty()) {
1082 log.debug("************* Going to {} artifact to vfc {}", curOperation.name(),
1083 nodeTypeResource.getName());
1084 handleNodeTypeArtifactsRequestRes = artifactsBusinessLogic
1085 .handleArtifactsRequestForInnerVfcComponent(curArtifactsToHandle, nodeTypeResource, user,
1086 createdArtifacts, new ArtifactOperationInfo(false,
1087 ignoreLifecycleState, curOperation),
1088 false, inTransaction);
1089 if (ArtifactOperationEnum.isCreateOrLink(curOperation)) {
1090 createdArtifacts.addAll(handleNodeTypeArtifactsRequestRes);
1092 handledNodeTypeArtifacts.addAll(handleNodeTypeArtifactsRequestRes);
1095 if (handleNodeTypeArtifactsRes == null) {
1096 handleNodeTypeArtifactsRes = Either.left(handledNodeTypeArtifacts);
1098 } catch (Exception e) {
1099 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
1100 handleNodeTypeArtifactsRes = Either.right(responseFormat);
1101 log.debug("Exception occurred when handleVfcArtifacts, error is:{}", e.getMessage(), e);
1103 return handleNodeTypeArtifactsRes;
1106 private Map<String, ImmutablePair<String, String>> extractVfcToscaNames(final Map<String, NodeTypeInfo> nodeTypesInfo,
1107 final String vfResourceName,
1108 final CsarInfo csarInfo) {
1109 final Map<String, ImmutablePair<String, String>> vfcToscaNames = new HashMap<>();
1111 final Map<String, Object> nodes = extractAllNodes(nodeTypesInfo, csarInfo);
1112 if (!nodes.isEmpty()) {
1113 final Iterator<Entry<String, Object>> nodesNameEntry = nodes.entrySet().iterator();
1114 while (nodesNameEntry.hasNext()) {
1115 final Entry<String, Object> nodeType = nodesNameEntry.next();
1116 final ImmutablePair<String, String> toscaResourceName = buildNestedToscaResourceName(
1117 ResourceTypeEnum.VFC.name(), vfResourceName, nodeType.getKey());
1118 vfcToscaNames.put(nodeType.getKey(), toscaResourceName);
1121 for (final NodeTypeInfo cvfc : nodeTypesInfo.values()) {
1122 vfcToscaNames.put(cvfc.getType(), buildNestedToscaResourceName(ResourceTypeEnum.CVFC.name(),
1123 vfResourceName, cvfc.getType()));
1125 return vfcToscaNames;
1128 private Map<String, Object> extractAllNodes(Map<String, NodeTypeInfo> nodeTypesInfo, CsarInfo csarInfo) {
1129 Map<String, Object> nodes = new HashMap<>();
1130 for (NodeTypeInfo nodeTypeInfo : nodeTypesInfo.values()) {
1131 extractNodeTypes(nodes, nodeTypeInfo.getMappedToscaTemplate());
1133 extractNodeTypes(nodes, csarInfo.getMappedToscaMainTemplate());
1137 private void extractNodeTypes(Map<String, Object> nodes, Map<String, Object> mappedToscaTemplate) {
1138 Either<Map<String, Object>, ResultStatusEnum> eitherNodeTypes = ImportUtils
1139 .findFirstToscaMapElement(mappedToscaTemplate, TypeUtils.ToscaTagNamesEnum.NODE_TYPES);
1140 if (eitherNodeTypes.isLeft()) {
1141 nodes.putAll(eitherNodeTypes.left()
1146 public Resource createResourceFromCsar(Resource resource, User user, Map<String, byte[]> csarUIPayload,
1148 log.trace("************* created successfully from YAML, resource TOSCA ");
1149 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RESOURCE_FROM_YAML,StatusCode.STARTED,"Starting to create Resource From Csar by user {}", user.getUserId() );
1150 CsarInfo csarInfo = csarBusinessLogic.getCsarInfo(resource, null, user, csarUIPayload, csarUUID);
1151 Map<String, NodeTypeInfo> nodeTypesInfo = csarInfo.extractNodeTypesInfo();
1152 Either<Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>>, ResponseFormat> findNodeTypesArtifactsToHandleRes = findNodeTypesArtifactsToHandle(
1153 nodeTypesInfo, csarInfo, resource);
1154 if (findNodeTypesArtifactsToHandleRes.isRight()) {
1155 log.debug("failed to find node types for update with artifacts during import csar {}. ",
1156 csarInfo.getCsarUUID());
1157 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RESOURCE_FROM_YAML,resource.getComponentMetadataForSupportLog(),
1158 StatusCode.ERROR,"error: {}",findNodeTypesArtifactsToHandleRes.right().value());
1159 throw new ByResponseFormatComponentException(findNodeTypesArtifactsToHandleRes.right().value());
1161 Resource vfResource = createResourceFromYaml(resource, csarInfo.getMainTemplateContent(),
1162 csarInfo.getMainTemplateName(), nodeTypesInfo, csarInfo, findNodeTypesArtifactsToHandleRes.left()
1165 log.trace("*************VF Resource created successfully from YAML, resource TOSCA name: {}",
1166 vfResource.getToscaResourceName());
1167 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RESOURCE_FROM_YAML,StatusCode.COMPLETE,"Ended create Resource From Csar by user {}", user.getUserId() );
1171 private Resource validateResourceBeforeCreate(Resource resource, User user, boolean inTransaction) {
1172 log.trace("validating resource before create");
1173 user.copyData(validateUser(user, CREATE_RESOURCE, resource, AuditingActionEnum.CREATE_RESOURCE, false));
1174 // validate user role
1175 validateUserRole(user, resource, new ArrayList<>(), AuditingActionEnum.CREATE_RESOURCE, null);
1176 // VF / PNF "derivedFrom" should be null (or ignored)
1177 if (ModelConverter.isAtomicComponent(resource)) {
1178 validateDerivedFromNotEmpty(user, resource, AuditingActionEnum.CREATE_RESOURCE);
1180 return validateResourceBeforeCreate(resource, user, AuditingActionEnum.CREATE_RESOURCE, inTransaction, null);
1184 // resource, yamlFileContents, yamlFileName, nodeTypesInfo,csarInfo,
1185 // nodeTypesArtifactsToCreate, true, false, null
1186 private Resource createResourceFromYaml(Resource resource, String topologyTemplateYaml, String yamlName,
1187 Map<String, NodeTypeInfo> nodeTypesInfo, CsarInfo csarInfo,
1188 Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToCreate,
1189 boolean shouldLock, boolean inTransaction, String nodeName) {
1191 List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
1192 Resource createdResource;
1194 ParsedToscaYamlInfo parsedToscaYamlInfo = csarBusinessLogic.getParsedToscaYamlInfo(topologyTemplateYaml, yamlName, nodeTypesInfo, csarInfo, nodeName, resource);
1195 if (MapUtils.isEmpty(parsedToscaYamlInfo.getInstances()) && resource.getResourceType() != ResourceTypeEnum.PNF) {
1196 throw new ByActionStatusComponentException(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
1198 log.debug("#createResourceFromYaml - Going to create resource {} and RIs ", resource.getName());
1199 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RESOURCE_FROM_YAML,resource.getComponentMetadataForSupportLog(),
1200 StatusCode.STARTED,"");
1201 createdResource = createResourceAndRIsFromYaml(yamlName, resource, parsedToscaYamlInfo,
1202 AuditingActionEnum.IMPORT_RESOURCE, false, createdArtifacts, topologyTemplateYaml, nodeTypesInfo,
1203 csarInfo, nodeTypesArtifactsToCreate, shouldLock, inTransaction, nodeName);
1204 log.debug("#createResourceFromYaml - The resource {} has been created ", resource.getName());
1205 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RESOURCE_FROM_YAML,resource.getComponentMetadataForSupportLog(),
1206 StatusCode.COMPLETE,"The resource has been created: {}",resource.getName());
1207 } catch (ComponentException e) {
1208 ResponseFormat responseFormat = e.getResponseFormat() == null
1209 ? componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams()) : e.getResponseFormat();
1210 componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), resource,
1211 AuditingActionEnum.IMPORT_RESOURCE);
1213 } catch (StorageException e) {
1214 ResponseFormat responseFormat = componentsUtils
1215 .getResponseFormat(componentsUtils.convertFromStorageResponse(e.getStorageOperationStatus()));
1216 componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), resource,
1217 AuditingActionEnum.IMPORT_RESOURCE);
1220 return createdResource;
1224 public Map<String, Resource> createResourcesFromYamlNodeTypesList(String yamlName, Resource resource,
1225 Map<String, Object> mappedToscaTemplate, boolean needLock,
1226 Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle,
1227 List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, Map<String, NodeTypeInfo> nodeTypesInfo,
1228 CsarInfo csarInfo) {
1230 Either<String, ResultStatusEnum> toscaVersion = findFirstToscaStringElement(mappedToscaTemplate,
1231 TypeUtils.ToscaTagNamesEnum.TOSCA_VERSION);
1232 if (toscaVersion.isRight()) {
1233 throw new ByActionStatusComponentException(ActionStatus.INVALID_TOSCA_TEMPLATE);
1235 Map<String, Object> mapToConvert = new HashMap<>();
1236 mapToConvert.put(TypeUtils.ToscaTagNamesEnum.TOSCA_VERSION.getElementName(), toscaVersion.left()
1238 Map<String, Object> nodeTypes = getNodeTypesFromTemplate(mappedToscaTemplate);
1239 createNodeTypes(yamlName, resource, needLock, nodeTypesArtifactsToHandle, nodeTypesNewCreatedArtifacts,
1240 nodeTypesInfo, csarInfo, mapToConvert, nodeTypes);
1241 return csarInfo.getCreatedNodes();
1244 private Map<String, Object> getNodeTypesFromTemplate(Map<String, Object> mappedToscaTemplate) {
1245 return ImportUtils.findFirstToscaMapElement(mappedToscaTemplate, TypeUtils.ToscaTagNamesEnum.NODE_TYPES)
1247 .orValue(HashMap::new);
1250 private void createNodeTypes(String yamlName, Resource resource, boolean needLock,
1251 Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle,
1252 List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, Map<String, NodeTypeInfo> nodeTypesInfo,
1253 CsarInfo csarInfo, Map<String, Object> mapToConvert, Map<String, Object> nodeTypes) {
1254 Iterator<Entry<String, Object>> nodesNameValueIter = nodeTypes.entrySet()
1256 Resource vfcCreated = null;
1257 while (nodesNameValueIter.hasNext()) {
1258 Entry<String, Object> nodeType = nodesNameValueIter.next();
1259 Map<ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle = nodeTypesArtifactsToHandle == null
1260 || nodeTypesArtifactsToHandle.isEmpty() ? null : nodeTypesArtifactsToHandle.get(nodeType.getKey());
1262 if (nodeTypesInfo.containsKey(nodeType.getKey())) {
1263 log.trace("************* Going to handle nested vfc {}", nodeType.getKey());
1264 vfcCreated = handleNestedVfc(resource, nodeTypesArtifactsToHandle, nodeTypesNewCreatedArtifacts,
1265 nodeTypesInfo, csarInfo, nodeType.getKey());
1266 log.trace("************* Finished to handle nested vfc {}", nodeType.getKey());
1267 } else if (csarInfo.getCreatedNodesToscaResourceNames() != null
1268 && !csarInfo.getCreatedNodesToscaResourceNames()
1269 .containsKey(nodeType.getKey())) {
1270 log.trace("************* Going to create node {}", nodeType.getKey());
1271 ImmutablePair<Resource, ActionStatus> resourceCreated = createNodeTypeResourceFromYaml(yamlName,
1272 nodeType, csarInfo.getModifier(), mapToConvert, resource, needLock, nodeTypeArtifactsToHandle,
1273 nodeTypesNewCreatedArtifacts, true, csarInfo, true);
1274 log.debug("************* Finished to create node {}", nodeType.getKey());
1276 vfcCreated = resourceCreated.getLeft();
1277 csarInfo.getCreatedNodesToscaResourceNames()
1278 .put(nodeType.getKey(), vfcCreated.getToscaResourceName());
1280 if (vfcCreated != null) {
1281 csarInfo.getCreatedNodes()
1282 .put(nodeType.getKey(), vfcCreated);
1284 mapToConvert.remove(TypeUtils.ToscaTagNamesEnum.NODE_TYPES.getElementName());
1288 private Resource handleNestedVfc(Resource resource,
1289 Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodesArtifactsToHandle,
1290 List<ArtifactDefinition> createdArtifacts, Map<String, NodeTypeInfo> nodesInfo, CsarInfo csarInfo,
1293 String yamlName = nodesInfo.get(nodeName)
1294 .getTemplateFileName();
1295 Map<String, Object> nestedVfcJsonMap = nodesInfo.get(nodeName)
1296 .getMappedToscaTemplate();
1298 log.debug("************* Going to create node types from yaml {}", yamlName);
1299 createResourcesFromYamlNodeTypesList(yamlName, resource, nestedVfcJsonMap, false, nodesArtifactsToHandle,
1300 createdArtifacts, Collections.emptyMap(), csarInfo);
1301 log.debug("************* Finished to create node types from yaml {}", yamlName);
1303 if (nestedVfcJsonMap.containsKey(TypeUtils.ToscaTagNamesEnum.TOPOLOGY_TEMPLATE.getElementName())) {
1304 log.debug("************* Going to handle complex VFC from yaml {}", yamlName);
1305 resource = handleComplexVfc(resource, nodesArtifactsToHandle, createdArtifacts, nodesInfo, csarInfo,
1306 nodeName, yamlName);
1311 private Resource handleComplexVfc(final Resource resource,
1312 final Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>>
1313 nodesArtifactsToHandle,
1314 final List<ArtifactDefinition>
1315 createdArtifacts, Map<String, NodeTypeInfo> nodesInfo, CsarInfo csarInfo,
1316 final String nodeName, final String yamlName) {
1318 Resource oldComplexVfc = null;
1319 Resource newComplexVfc = buildValidComplexVfc(resource, csarInfo, nodeName, nodesInfo);
1320 Either<Resource, StorageOperationStatus> oldComplexVfcRes = toscaOperationFacade
1321 .getFullLatestComponentByToscaResourceName(newComplexVfc.getToscaResourceName());
1322 if (oldComplexVfcRes.isRight() && oldComplexVfcRes.right().value() == StorageOperationStatus.NOT_FOUND) {
1323 oldComplexVfcRes = toscaOperationFacade.getFullLatestComponentByToscaResourceName(
1324 buildNestedToscaResourceName(ResourceTypeEnum.CVFC.name(), csarInfo.getVfResourceName(), nodeName).getRight());
1326 if (oldComplexVfcRes.isRight() && oldComplexVfcRes.right().value() != StorageOperationStatus.NOT_FOUND) {
1327 log.debug("Failed to fetch previous complex VFC by tosca resource name {}. Status is {}. ",
1328 newComplexVfc.getToscaResourceName(), oldComplexVfcRes.right().value());
1329 throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR);
1330 } else if (oldComplexVfcRes.isLeft()) {
1331 log.debug(VALIDATE_DERIVED_BEFORE_UPDATE);
1332 final Either<Boolean, ResponseFormat> eitherValidation = validateNestedDerivedFromDuringUpdate(
1333 oldComplexVfcRes.left().value(),
1334 newComplexVfc, ValidationUtils.hasBeenCertified(oldComplexVfcRes.left().value().getVersion()));
1335 if (eitherValidation.isLeft()) {
1336 oldComplexVfc = oldComplexVfcRes.left().value();
1339 newComplexVfc = handleComplexVfc(nodesArtifactsToHandle, createdArtifacts, nodesInfo, csarInfo, nodeName,
1340 yamlName, oldComplexVfc, newComplexVfc);
1341 csarInfo.getCreatedNodesToscaResourceNames().put(nodeName, newComplexVfc.getToscaResourceName());
1342 final LifecycleChangeInfoWithAction lifecycleChangeInfo = new LifecycleChangeInfoWithAction(CERTIFICATION_ON_IMPORT,
1343 LifecycleChanceActionEnum.CREATE_FROM_CSAR);
1344 log.debug("Going to certify cvfc {}. ", newComplexVfc.getName());
1345 final Resource result = propagateStateToCertified(csarInfo.getModifier(), newComplexVfc,
1346 lifecycleChangeInfo, true, false, true);
1347 csarInfo.getCreatedNodes().put(nodeName, result);
1348 csarInfo.removeNodeFromQueue();
1352 private Resource handleComplexVfc(
1353 Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodesArtifactsToHandle,
1354 List<ArtifactDefinition> createdArtifacts, Map<String, NodeTypeInfo> nodesInfo, CsarInfo csarInfo,
1355 String nodeName, String yamlName, Resource oldComplexVfc, Resource newComplexVfc) {
1357 Resource handleComplexVfcRes;
1358 Map<String, Object> mappedToscaTemplate = nodesInfo.get(nodeName)
1359 .getMappedToscaTemplate();
1360 String yamlContent = new String(csarInfo.getCsar()
1362 Map<String, NodeTypeInfo> newNodeTypesInfo = nodesInfo.entrySet()
1364 .collect(toMap(Entry::getKey, e -> e.getValue()
1365 .getUnmarkedCopy()));
1366 CsarInfo.markNestedVfc(mappedToscaTemplate, newNodeTypesInfo);
1367 if (oldComplexVfc == null) {
1368 handleComplexVfcRes = createResourceFromYaml(newComplexVfc, yamlContent, yamlName, newNodeTypesInfo,
1369 csarInfo, nodesArtifactsToHandle, false, true, nodeName);
1371 handleComplexVfcRes = updateResourceFromYaml(oldComplexVfc, newComplexVfc,
1372 AuditingActionEnum.UPDATE_RESOURCE_METADATA, createdArtifacts, yamlContent, yamlName, csarInfo,
1373 newNodeTypesInfo, nodesArtifactsToHandle, nodeName, true);
1375 return handleComplexVfcRes;
1378 private Resource buildValidComplexVfc(Resource resource, CsarInfo csarInfo, String nodeName,
1379 Map<String, NodeTypeInfo> nodesInfo) {
1381 Resource complexVfc = buildComplexVfcMetadata(resource, csarInfo, nodeName, nodesInfo);
1382 log.debug("************* Going to validate complex VFC from yaml {}", complexVfc.getName());
1383 csarInfo.addNodeToQueue(nodeName);
1384 return validateResourceBeforeCreate(complexVfc, csarInfo.getModifier(), AuditingActionEnum.IMPORT_RESOURCE,
1388 private String getNodeTypeActualName(final String nodeTypefullName, final String nodeTypeNamePrefix) {
1390 final String nameWithouNamespacePrefix = nodeTypefullName.substring(nodeTypeNamePrefix.length());
1391 final String[] findTypes = nameWithouNamespacePrefix.split("\\.");
1393 if(findTypes.length > 1){
1394 final String resourceType = findTypes[0];
1395 return nameWithouNamespacePrefix.substring(resourceType.length());
1397 return nameWithouNamespacePrefix;
1400 private ImmutablePair<Resource, ActionStatus> createNodeTypeResourceFromYaml(final String yamlName,
1401 final Entry<String, Object> nodeNameValue,
1403 final Map<String, Object> mapToConvert,
1404 final Resource resourceVf,
1405 final boolean needLock,
1406 final Map<ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle,
1407 final List<ArtifactDefinition> nodeTypesNewCreatedArtifacts,
1408 final boolean forceCertificationAllowed,
1409 final CsarInfo csarInfo,
1410 final boolean isNested) {
1412 final UploadResourceInfo resourceMetaData = fillResourceMetadata(
1413 yamlName, resourceVf, nodeNameValue.getKey(), user);
1415 final String singleVfcYaml = buildNodeTypeYaml(nodeNameValue, mapToConvert, resourceMetaData.getResourceType(), csarInfo);
1416 user = validateUser(user, "CheckIn Resource", resourceVf, AuditingActionEnum.CHECKIN_RESOURCE, true);
1417 return createResourceFromNodeType(singleVfcYaml, resourceMetaData, user, true, needLock,
1418 nodeTypeArtifactsToHandle, nodeTypesNewCreatedArtifacts, forceCertificationAllowed, csarInfo,
1419 nodeNameValue.getKey(), isNested);
1422 private String buildNodeTypeYaml(final Entry<String, Object> nodeNameValue,
1423 final Map<String, Object> mapToConvert,
1424 final String nodeResourceType,
1425 final CsarInfo csarInfo) {
1426 // We need to create a Yaml from each node_types in order to create
1427 // resource from each node type using import normative flow.
1428 final DumperOptions options = new DumperOptions();
1429 options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
1430 final Yaml yaml = new Yaml(options);
1432 final Map<String, Object> node = new HashMap<>();
1433 node.put(buildNestedToscaResourceName(nodeResourceType, csarInfo.getVfResourceName(), nodeNameValue.getKey())
1434 .getLeft(), nodeNameValue.getValue());
1435 mapToConvert.put(TypeUtils.ToscaTagNamesEnum.NODE_TYPES.getElementName(), node);
1437 return yaml.dumpAsMap(mapToConvert);
1440 public Boolean validateResourceCreationFromNodeType(Resource resource, User creator) {
1441 validateDerivedFromNotEmpty(creator, resource, AuditingActionEnum.CREATE_RESOURCE);
1445 public ImmutablePair<Resource, ActionStatus> createResourceFromNodeType(String nodeTypeYaml,
1446 UploadResourceInfo resourceMetaData, User creator, boolean isInTransaction, boolean needLock,
1447 Map<ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle,
1448 List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, boolean forceCertificationAllowed, CsarInfo csarInfo,
1449 String nodeName, boolean isNested) {
1451 LifecycleChangeInfoWithAction lifecycleChangeInfo = new LifecycleChangeInfoWithAction(CERTIFICATION_ON_IMPORT,
1452 LifecycleChanceActionEnum.CREATE_FROM_CSAR);
1453 Function<Resource, Boolean> validator = resource -> validateResourceCreationFromNodeType(
1455 return resourceImportManager.importCertifiedResource(nodeTypeYaml, resourceMetaData, creator, validator,
1456 lifecycleChangeInfo, isInTransaction, true, needLock, nodeTypeArtifactsToHandle,
1457 nodeTypesNewCreatedArtifacts, forceCertificationAllowed, csarInfo, nodeName, isNested);
1461 * Validates if a given node type name has a valid prefix.
1463 * @param nodeName node name from definition file
1464 * @param definedResourceNamespaceList is a list of all node type name prefix allowed
1465 * @return a valid node type name prefix if it`s found
1467 public Optional<String> validateNodeTypeNamePrefix(final String nodeName,
1468 final List<String> definedResourceNamespaceList) {
1469 for (final String validNamespace : definedResourceNamespaceList) {
1470 if (nodeName.startsWith(validNamespace)) {
1471 return Optional.of(validNamespace);
1474 return Optional.empty();
1477 private List<String> getDefinedNodeTypeNamespaceList() {
1478 return ConfigurationManager.getConfigurationManager().getConfiguration().getDefinedResourceNamespace();
1481 private UploadResourceInfo fillResourceMetadata(final String yamlName, final Resource resourceVf,
1482 final String nodeName, final User user) {
1484 final UploadResourceInfo resourceMetaData = new UploadResourceInfo();
1486 final String nodeTypeNamePrefix = getNodeTypeNamePrefix(nodeName);
1487 log.debug("Node type Name prefix {}", nodeTypeNamePrefix);
1489 if (!nodeName.startsWith(nodeTypeNamePrefix)) {
1490 log.debug("invalid nodeName:{} does not start with {}.", nodeName, getDefinedNodeTypeNamespaceList());
1491 throw new ByActionStatusComponentException(ActionStatus.INVALID_NODE_TEMPLATE, yamlName,
1492 resourceMetaData.getName(), nodeName);
1495 final String actualName = this.getNodeTypeActualName(nodeName, nodeTypeNamePrefix);
1496 final String namePrefix = nodeName.replace(actualName, "");
1497 String resourceType = namePrefix.substring(nodeTypeNamePrefix.length());
1498 log.debug("initial namePrefix:{} resourceType {}. nodeName {} , actualName {} prefix {}", namePrefix,
1499 resourceType, nodeName, actualName, nodeTypeNamePrefix);
1501 // if we import from csar, the node_type name can be
1502 // org.openecomp.resource.abstract.node_name - in this case we always
1504 if (resourceType.equals(Constants.ABSTRACT)) {
1505 resourceType = ResourceTypeEnum.VFC.name().toLowerCase();
1508 if (!ResourceTypeEnum.containsIgnoreCase(resourceType)) {
1509 resourceType = ResourceTypeEnum.VFC.name().toLowerCase();
1513 if (!ResourceTypeEnum.containsName(resourceType.toUpperCase())) {
1514 log.debug("invalid resourceType:{} the type is not one of the valide types:{}.",
1515 resourceType.toUpperCase(), ResourceTypeEnum.values());
1516 throw new ByActionStatusComponentException(ActionStatus.INVALID_NODE_TEMPLATE, yamlName,
1517 resourceMetaData.getName(), nodeName);
1521 resourceMetaData.setName(new StringBuilder(resourceVf.getSystemName()).append(actualName).toString());
1523 // Setting type from name
1524 final String type = resourceType.toUpperCase();
1525 resourceMetaData.setResourceType(type);
1527 resourceMetaData.setDescription(ImportUtils.Constants.INNER_VFC_DESCRIPTION);
1528 resourceMetaData.setIcon(ImportUtils.Constants.DEFAULT_ICON);
1529 resourceMetaData.setContactId(user.getUserId());
1530 resourceMetaData.setVendorName(resourceVf.getVendorName());
1531 resourceMetaData.setVendorRelease(resourceVf.getVendorRelease());
1534 final List<String> tags = new ArrayList<>();
1535 tags.add(resourceMetaData.getName());
1536 resourceMetaData.setTags(tags);
1539 final CategoryDefinition category = new CategoryDefinition();
1540 category.setName(ImportUtils.Constants.ABSTRACT_CATEGORY_NAME);
1541 final SubCategoryDefinition subCategory = new SubCategoryDefinition();
1542 subCategory.setName(ImportUtils.Constants.ABSTRACT_SUBCATEGORY);
1543 category.addSubCategory(subCategory);
1544 final List<CategoryDefinition> categories = new ArrayList<>();
1545 categories.add(category);
1546 resourceMetaData.setCategories(categories);
1548 return resourceMetaData;
1551 private Resource buildComplexVfcMetadata(final Resource resourceVf,
1552 final CsarInfo csarInfo,
1553 final String nodeName,
1554 final Map<String, NodeTypeInfo> nodesInfo) {
1555 final Resource cvfc = new Resource();
1556 final NodeTypeInfo nodeTypeInfo = nodesInfo.get(nodeName);
1557 cvfc.setName(buildCvfcName(csarInfo.getVfResourceName(), nodeName));
1558 cvfc.setNormalizedName(ValidationUtils.normaliseComponentName(cvfc.getName()));
1559 cvfc.setSystemName(ValidationUtils.convertToSystemName(cvfc.getName()));
1560 cvfc.setResourceType(ResourceTypeEnum.CVFC);
1561 cvfc.setAbstract(true);
1562 cvfc.setDerivedFrom(nodeTypeInfo.getDerivedFrom());
1563 cvfc.setDescription(ImportUtils.Constants.CVFC_DESCRIPTION);
1564 cvfc.setIcon(ImportUtils.Constants.DEFAULT_ICON);
1565 cvfc.setContactId(csarInfo.getModifier()
1567 cvfc.setCreatorUserId(csarInfo.getModifier()
1569 cvfc.setVendorName(resourceVf.getVendorName());
1570 cvfc.setVendorRelease(resourceVf.getVendorRelease());
1571 cvfc.setResourceVendorModelNumber(resourceVf.getResourceVendorModelNumber());
1572 cvfc.setToscaResourceName(buildNestedToscaResourceName(
1573 ResourceTypeEnum.CVFC.name(), csarInfo.getVfResourceName(), nodeName).getLeft());
1574 cvfc.setInvariantUUID(UniqueIdBuilder.buildInvariantUUID());
1576 final List<String> tags = new ArrayList<>();
1577 tags.add(cvfc.getName());
1580 final CategoryDefinition category = new CategoryDefinition();
1581 category.setName(ImportUtils.Constants.ABSTRACT_CATEGORY_NAME);
1582 SubCategoryDefinition subCategory = new SubCategoryDefinition();
1583 subCategory.setName(ImportUtils.Constants.ABSTRACT_SUBCATEGORY);
1584 category.addSubCategory(subCategory);
1585 final List<CategoryDefinition> categories = new ArrayList<>();
1586 categories.add(category);
1587 cvfc.setCategories(categories);
1589 cvfc.setVersion(ImportUtils.Constants.FIRST_NON_CERTIFIED_VERSION);
1590 cvfc.setLifecycleState(ImportUtils.Constants.NORMATIVE_TYPE_LIFE_CYCLE_NOT_CERTIFIED_CHECKOUT);
1591 cvfc.setHighestVersion(ImportUtils.Constants.NORMATIVE_TYPE_HIGHEST_VERSION);
1596 private String buildCvfcName(final String resourceVfName, final String nodeName) {
1598 String nameWithouNamespacePrefix =
1599 nodeName.substring(Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX.length());
1600 String[] findTypes = nameWithouNamespacePrefix.split("\\.");
1601 String resourceType = findTypes[0];
1602 String resourceName = resourceVfName + "-" + nameWithouNamespacePrefix.substring(resourceType.length() + 1);
1603 return addCvfcSuffixToResourceName(resourceName);
1606 private Resource createResourceAndRIsFromYaml(final String yamlName,
1608 final ParsedToscaYamlInfo parsedToscaYamlInfo,
1609 final AuditingActionEnum actionEnum,
1610 final boolean isNormative,
1611 final List<ArtifactDefinition> createdArtifacts,
1612 final String topologyTemplateYaml,
1613 final Map<String, NodeTypeInfo> nodeTypesInfo,
1614 final CsarInfo csarInfo,
1615 final Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToCreate,
1616 final boolean shouldLock,
1617 final boolean inTransaction,
1618 final String nodeName) {
1620 final List<ArtifactDefinition> nodeTypesNewCreatedArtifacts = new ArrayList<>();
1623 final Either<Boolean, ResponseFormat> lockResult = lockComponentByName(resource.getSystemName(), resource,
1625 if (lockResult.isRight()) {
1626 rollback(inTransaction, resource, createdArtifacts, nodeTypesNewCreatedArtifacts);
1627 throw new ByResponseFormatComponentException(lockResult.right().value());
1629 log.debug("name is locked {} status = {}", resource.getSystemName(), lockResult);
1632 log.trace("************* createResourceFromYaml before full create resource {}", yamlName);
1633 loggerSupportability.log(LoggerSupportabilityActions.CREATE_INPUTS,resource.getComponentMetadataForSupportLog(), StatusCode.STARTED,"Starting to add inputs from yaml: {}",yamlName);
1634 final Resource genericResource = fetchAndSetDerivedFromGenericType(resource);
1635 resource = createResourceTransaction(resource, csarInfo.getModifier(), isNormative);
1636 log.trace("************* createResourceFromYaml after full create resource {}", yamlName);
1637 log.trace("************* Going to add inputs from yaml {}", yamlName);
1638 if (resource.shouldGenerateInputs())
1639 generateAndAddInputsFromGenericTypeProperties(resource, genericResource);
1641 final Map<String, InputDefinition> inputs = parsedToscaYamlInfo.getInputs();
1642 resource = createInputsOnResource(resource, inputs);
1643 log.trace("************* Finish to add inputs from yaml {}", yamlName);
1644 loggerSupportability.log(LoggerSupportabilityActions.CREATE_INPUTS,
1645 resource.getComponentMetadataForSupportLog(),
1646 StatusCode.COMPLETE,"Finish to add inputs from yaml: {}",yamlName);
1647 if (resource.getResourceType() == ResourceTypeEnum.PNF) {
1648 log.trace("************* Adding generic properties to PNF");
1649 resource = (Resource) propertyBusinessLogic.copyPropertyToComponent(resource,
1650 genericResource.getProperties());
1651 log.trace("************* Adding software information to PNF");
1652 softwareInformationBusinessLogic.setSoftwareInformation(resource, csarInfo);
1653 log.trace("************* Removing non-mano software information file from PNF");
1654 if (csarInfo.getSoftwareInformationPath().isPresent() &&
1655 !softwareInformationBusinessLogic.removeSoftwareInformationFile(csarInfo)) {
1656 log.warn(EcompLoggerErrorCode.BUSINESS_PROCESS_ERROR , ResourceBusinessLogic.class.getName(),
1657 "catalog-be", "Could not remove the software information file.");
1661 final Map<String, UploadComponentInstanceInfo> uploadComponentInstanceInfoMap = parsedToscaYamlInfo
1663 log.trace("************* Going to create nodes, RI's and Relations from yaml {}", yamlName);
1664 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RESOURCE_FROM_YAML,resource.getComponentMetadataForSupportLog(), StatusCode.STARTED,"Start create nodes, RI and Relations from yaml: {}",yamlName);
1665 resource = createRIAndRelationsFromYaml(yamlName, resource, uploadComponentInstanceInfoMap,
1666 topologyTemplateYaml, nodeTypesNewCreatedArtifacts, nodeTypesInfo, csarInfo, nodeTypesArtifactsToCreate,
1668 log.trace("************* Finished to create nodes, RI and Relation from yaml {}", yamlName);
1669 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,
1670 resource.getComponentMetadataForSupportLog(),
1671 StatusCode.COMPLETE,"Finished to create nodes, RI and Relation from yaml: {}",yamlName);
1672 // validate update vf module group names
1673 final Either<Map<String, GroupDefinition>, ResponseFormat> validateUpdateVfGroupNamesRes = groupBusinessLogic
1674 .validateUpdateVfGroupNames(parsedToscaYamlInfo.getGroups(), resource.getSystemName());
1675 if (validateUpdateVfGroupNamesRes.isRight()) {
1676 rollback(inTransaction, resource, createdArtifacts, nodeTypesNewCreatedArtifacts);
1677 throw new ByResponseFormatComponentException(validateUpdateVfGroupNamesRes.right().value());
1679 // add groups to resource
1680 final Map<String, GroupDefinition> groups;
1681 log.trace("************* Going to add groups from yaml {}", yamlName);
1682 loggerSupportability.log(LoggerSupportabilityActions.CREATE_GROUPS,resource.getComponentMetadataForSupportLog(),
1683 StatusCode.STARTED,"Start to add groups from yaml: {}",yamlName);
1684 if (!validateUpdateVfGroupNamesRes.left().value().isEmpty()) {
1685 groups = validateUpdateVfGroupNamesRes.left().value();
1687 groups = parsedToscaYamlInfo.getGroups();
1690 final Either<Resource, ResponseFormat> createGroupsOnResource = createGroupsOnResource(resource, groups);
1691 if (createGroupsOnResource.isRight()) {
1692 rollback(inTransaction, resource, createdArtifacts, nodeTypesNewCreatedArtifacts);
1693 loggerSupportability.log(LoggerSupportabilityActions.CREATE_GROUPS,
1694 resource.getComponentMetadataForSupportLog(),
1695 StatusCode.ERROR,"ERROR while adding groups from yaml: {}",yamlName);
1696 throw new ByResponseFormatComponentException(createGroupsOnResource.right().value());
1698 resource = createGroupsOnResource.left().value();
1699 log.trace("************* Finished to add groups from yaml {}", yamlName);
1700 loggerSupportability.log(LoggerSupportabilityActions.CREATE_GROUPS,
1701 resource.getComponentMetadataForSupportLog(),
1702 StatusCode.COMPLETE,"Finished to add groups from yaml: {}", yamlName);
1703 log.trace("************* Going to add artifacts from yaml {}", yamlName);
1704 loggerSupportability.log(LoggerSupportabilityActions.CREATE_ARTIFACTS,
1705 resource.getComponentMetadataForSupportLog(),
1706 StatusCode.STARTED,"Started to add artifacts from yaml: {}",yamlName);
1708 log.trace("************* Starting to add policies from yaml {}", yamlName);
1709 Map<String, PolicyDefinition> policies = parsedToscaYamlInfo.getPolicies();
1710 if (MapUtils.isNotEmpty(policies)) {
1711 resource = createPoliciesOnResource(resource, policies);
1713 log.trace("************* Finished to add policies from yaml {}", yamlName);
1715 final NodeTypeInfoToUpdateArtifacts nodeTypeInfoToUpdateArtifacts =
1716 new NodeTypeInfoToUpdateArtifacts(nodeName, nodeTypesArtifactsToCreate);
1718 final Either<Resource, ResponseFormat> createArtifactsEither = createOrUpdateArtifacts(
1719 ArtifactOperationEnum.CREATE, createdArtifacts, yamlName, csarInfo, resource,
1720 nodeTypeInfoToUpdateArtifacts, inTransaction, shouldLock);
1721 if (createArtifactsEither.isRight()) {
1722 rollback(inTransaction, resource, createdArtifacts, nodeTypesNewCreatedArtifacts);
1723 loggerSupportability.log(LoggerSupportabilityActions.CREATE_ARTIFACTS,
1724 resource.getComponentMetadataForSupportLog(), StatusCode.ERROR,"error happened {}",
1725 createArtifactsEither.right().value());
1726 throw new ByResponseFormatComponentException(createArtifactsEither.right().value());
1728 loggerSupportability.log(LoggerSupportabilityActions.CREATE_ARTIFACTS,
1729 resource.getComponentMetadataForSupportLog(),
1730 StatusCode.COMPLETE,"Finished to add artifacts from yaml: "+resource.getToscaResourceName());
1731 final ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.CREATED);
1732 componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), resource, actionEnum);
1733 ASDCKpiApi.countCreatedResourcesKPI();
1736 } catch (final ComponentException | StorageException e) {
1737 rollback(inTransaction, resource, createdArtifacts, nodeTypesNewCreatedArtifacts);
1739 } catch (final ToscaOperationException e) {
1740 log.error("An error has occurred during resource and resource instance creation", e);
1741 rollback(inTransaction, resource, createdArtifacts, nodeTypesNewCreatedArtifacts);
1742 log.error(EcompLoggerErrorCode.BUSINESS_PROCESS_ERROR, ResourceBusinessLogic.class.getName(),
1743 "catalog-be", e.getMessage());
1744 throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR);
1745 } catch (final BusinessLogicException e) {
1746 log.error("An error has occurred during resource and resource instance creation", e);
1747 rollback(inTransaction, resource, createdArtifacts, nodeTypesNewCreatedArtifacts);
1748 throw new ByResponseFormatComponentException(e.getResponseFormat());
1750 if (!inTransaction) {
1751 janusGraphDao.commit();
1754 graphLockOperation.unlockComponentByName(resource.getSystemName(), resource.getUniqueId(),
1755 NodeTypeEnum.Resource);
1760 private void rollback(boolean inTransaction, Resource resource, List<ArtifactDefinition> createdArtifacts,
1761 List<ArtifactDefinition> nodeTypesNewCreatedArtifacts) {
1762 if (!inTransaction) {
1763 janusGraphDao.rollback();
1765 if (isNotEmpty(createdArtifacts) && isNotEmpty(nodeTypesNewCreatedArtifacts)) {
1766 createdArtifacts.addAll(nodeTypesNewCreatedArtifacts);
1767 log.debug("Found {} newly created artifacts to deleted, the component name: {}", createdArtifacts.size(),
1768 resource.getName());
1772 private Resource getResourceWithGroups(String resourceId) {
1774 ComponentParametersView filter = new ComponentParametersView();
1775 filter.setIgnoreGroups(false);
1776 Either<Resource, StorageOperationStatus> updatedResource = toscaOperationFacade.getToscaElement(resourceId,
1778 if (updatedResource.isRight()) {
1779 rollbackWithException(componentsUtils.convertFromStorageResponse(updatedResource.right()
1780 .value()), resourceId);
1782 return updatedResource.left()
1786 private Either<Resource, ResponseFormat> createGroupsOnResource(Resource resource,
1787 Map<String, GroupDefinition> groups) {
1788 if (groups != null && !groups.isEmpty()) {
1789 List<GroupDefinition> groupsAsList = updateGroupsMembersUsingResource(groups, resource);
1790 handleGroupsProperties(resource, groups);
1791 fillGroupsFinalFields(groupsAsList);
1792 Either<List<GroupDefinition>, ResponseFormat> createGroups = groupBusinessLogic.createGroups(resource,
1793 groupsAsList, true);
1794 if (createGroups.isRight()) {
1795 return Either.right(createGroups.right()
1799 return Either.left(resource);
1802 private void handleGroupsProperties(Resource resource, Map<String, GroupDefinition> groups) {
1803 List<InputDefinition> inputs = resource.getInputs();
1804 if (MapUtils.isNotEmpty(groups)) {
1807 .filter(g -> isNotEmpty(g.getProperties()))
1808 .flatMap(g -> g.getProperties()
1810 .forEach(p -> handleGetInputs(p, inputs));
1814 private Resource createPoliciesOnResource(Resource resource, Map<String, PolicyDefinition> policies) {
1815 policyBusinessLogic.createPoliciesFromParsedCsar(resource, policies);
1819 private void handleGetInputs(PropertyDataDefinition property, List<InputDefinition> inputs) {
1820 if (isNotEmpty(property.getGetInputValues())) {
1821 if (inputs == null || inputs.isEmpty()) {
1822 log.debug("Failed to add property {} to group. Inputs list is empty ", property);
1823 rollbackWithException(ActionStatus.INPUTS_NOT_FOUND, property.getGetInputValues()
1825 .map(GetInputValueDataDefinition::getInputName)
1829 ListIterator<GetInputValueDataDefinition> getInputValuesIter = property.getGetInputValues()
1831 while (getInputValuesIter.hasNext()) {
1832 GetInputValueDataDefinition getInput = getInputValuesIter.next();
1833 Either<InputDefinition, RuntimeException> inputEither = findInputByName(inputs, getInput);
1834 if (inputEither.isRight()) {
1835 throw inputEither.right().value();
1837 InputDefinition input = inputEither.left().value();
1838 getInput.setInputId(input.getUniqueId());
1839 if (getInput.getGetInputIndex() != null) {
1840 GetInputValueDataDefinition getInputIndex = getInput.getGetInputIndex();
1841 Either<InputDefinition, RuntimeException> newInputEither = findInputByName(inputs,
1843 if (newInputEither.isRight()) {
1844 throw newInputEither.right().value();
1846 InputDefinition newInput = newInputEither.left().value();
1847 getInputIndex.setInputId(newInput.getUniqueId());
1849 getInputValuesIter.add(getInputIndex);
1856 static <T> Either<T, RuntimeException> rollbackWithEither(
1857 final JanusGraphDao janusGraphDao,
1858 final ActionStatus actionStatus,
1859 final String... params) {
1860 if (janusGraphDao != null)
1861 janusGraphDao.rollback();
1862 return Either.right(new ByActionStatusComponentException(actionStatus, params));
1865 <T> Either<T, RuntimeException> rollbackWithEither(
1866 final ActionStatus actionStatus,
1867 final String... params) {
1868 return rollbackWithEither(janusGraphDao, actionStatus, params);
1871 private Either<InputDefinition, RuntimeException> findInputByName(List<InputDefinition> inputs, GetInputValueDataDefinition getInput) {
1873 final String inputName = getInput != null ? getInput.getInputName() : "";
1875 if(inputs == null || inputs.isEmpty()) {
1876 log.debug("#findInputByName - Inputs list is empty");
1877 return rollbackWithEither(ActionStatus.INPUTS_NOT_FOUND, inputName);
1879 Optional<InputDefinition> inputOpt = inputs.stream()
1880 .filter(p -> p.getName().equals(inputName))
1882 if (!inputOpt.isPresent()) {
1883 log.debug("#findInputByName - Failed to find the input {} ", inputName);
1884 return rollbackWithEither(ActionStatus.INPUTS_NOT_FOUND, inputName);
1886 return Either.left(inputOpt.get());
1891 private void fillGroupsFinalFields(List<GroupDefinition> groupsAsList) {
1892 groupsAsList.forEach(groupDefinition -> {
1893 groupDefinition.setInvariantName(groupDefinition.getName());
1894 groupDefinition.setCreatedFrom(CreatedFrom.CSAR);
1898 private Resource updateGroupsOnResource(Resource resource, Map<String, GroupDefinition> groups) {
1899 if (isEmpty(groups)) {
1902 return updateOrCreateGroups(resource, groups);
1905 private Resource updateOrCreateGroups(Resource resource, Map<String, GroupDefinition> groups) {
1906 List<GroupDefinition> groupsFromResource = resource.getGroups();
1907 List<GroupDefinition> groupsAsList = updateGroupsMembersUsingResource(groups, resource);
1908 List<GroupDefinition> groupsToUpdate = new ArrayList<>();
1909 List<GroupDefinition> groupsToDelete = new ArrayList<>();
1910 List<GroupDefinition> groupsToCreate = new ArrayList<>();
1911 if (isNotEmpty(groupsFromResource)) {
1912 addGroupsToCreateOrUpdate(groupsFromResource, groupsAsList, groupsToUpdate, groupsToCreate);
1913 addGroupsToDelete(groupsFromResource, groupsAsList, groupsToDelete);
1915 groupsToCreate.addAll(groupsAsList);
1917 if (isNotEmpty(groupsToCreate)) {
1918 fillGroupsFinalFields(groupsToCreate);
1919 if (isNotEmpty(groupsFromResource)) {
1920 groupBusinessLogic.addGroups(resource, groupsToCreate, true)
1922 .on(this::throwComponentException);
1924 groupBusinessLogic.createGroups(resource, groupsToCreate, true)
1926 .on(this::throwComponentException);
1929 if (isNotEmpty(groupsToDelete)) {
1930 groupBusinessLogic.deleteGroups(resource, groupsToDelete)
1932 .on(this::throwComponentException);
1934 if (isNotEmpty(groupsToUpdate)) {
1935 groupBusinessLogic.updateGroups(resource, groupsToUpdate, true)
1937 .on(this::throwComponentException);
1943 private void addGroupsToDelete(List<GroupDefinition> groupsFromResource, List<GroupDefinition> groupsAsList,
1944 List<GroupDefinition> groupsToDelete) {
1945 for (GroupDefinition group : groupsFromResource) {
1946 Optional<GroupDefinition> op = groupsAsList.stream()
1947 .filter(p -> p.getInvariantName()
1948 .equalsIgnoreCase(group.getInvariantName()))
1950 if (!op.isPresent() && (group.getArtifacts() == null || group.getArtifacts()
1952 groupsToDelete.add(group);
1957 private void addGroupsToCreateOrUpdate(List<GroupDefinition> groupsFromResource, List<GroupDefinition> groupsAsList,
1958 List<GroupDefinition> groupsToUpdate, List<GroupDefinition> groupsToCreate) {
1959 for (GroupDefinition group : groupsAsList) {
1960 Optional<GroupDefinition> op = groupsFromResource.stream()
1961 .filter(p -> p.getInvariantName()
1962 .equalsIgnoreCase(group.getInvariantName()))
1964 if (op.isPresent()) {
1965 GroupDefinition groupToUpdate = op.get();
1966 groupToUpdate.setMembers(group.getMembers());
1967 groupToUpdate.setCapabilities(group.getCapabilities());
1968 groupToUpdate.setProperties(group.getProperties());
1969 groupsToUpdate.add(groupToUpdate);
1971 groupsToCreate.add(group);
1976 private Resource createInputsOnResource(Resource resource, Map<String, InputDefinition> inputs) {
1977 List<InputDefinition> resourceProperties = resource.getInputs();
1978 if (MapUtils.isNotEmpty(inputs) || isNotEmpty(resourceProperties)) {
1980 Either<List<InputDefinition>, ResponseFormat> createInputs = inputsBusinessLogic.createInputsInGraph(inputs,
1982 if (createInputs.isRight()) {
1983 loggerSupportability.log(LoggerSupportabilityActions.CREATE_INPUTS,resource.getComponentMetadataForSupportLog(),
1984 StatusCode.ERROR,"failed to add inputs from yaml: {}",createInputs.right()
1986 throw new ByResponseFormatComponentException(createInputs.right()
1989 resource.setInputs(createInputs.left().value());
1994 private List<GroupDefinition> updateGroupsMembersUsingResource(Map<String, GroupDefinition> groups,
1995 Resource component) {
1997 List<GroupDefinition> result = new ArrayList<>();
1998 List<ComponentInstance> componentInstances = component.getComponentInstances();
2000 if (groups != null) {
2001 Either<Boolean, ResponseFormat> validateCyclicGroupsDependencies = validateCyclicGroupsDependencies(groups);
2002 if (validateCyclicGroupsDependencies.isRight()) {
2003 throw new ByResponseFormatComponentException(validateCyclicGroupsDependencies.right().value());
2005 for (Entry<String, GroupDefinition> entry : groups.entrySet()) {
2006 String groupName = entry.getKey();
2007 GroupDefinition groupDefinition = entry.getValue();
2008 GroupDefinition updatedGroupDefinition = new GroupDefinition(groupDefinition);
2009 updatedGroupDefinition.setMembers(null);
2010 Map<String, String> members = groupDefinition.getMembers();
2011 if (members != null) {
2012 updateGroupMembers(groups, updatedGroupDefinition, component, componentInstances, groupName,
2015 result.add(updatedGroupDefinition);
2021 private void updateGroupMembers(Map<String, GroupDefinition> groups, GroupDefinition updatedGroupDefinition,
2022 Resource component, List<ComponentInstance> componentInstances, String groupName,
2023 Map<String, String> members) {
2024 Set<String> compInstancesNames = members.keySet();
2026 if (CollectionUtils.isEmpty(componentInstances)) {
2027 String membersAstString = compInstancesNames.stream()
2028 .collect(joining(","));
2030 "The members: {}, in group: {}, cannot be found in component {}. There are no component instances.",
2031 membersAstString, groupName, component.getNormalizedName());
2032 throw new ByActionStatusComponentException(
2033 ActionStatus.GROUP_INVALID_COMPONENT_INSTANCE, membersAstString,
2034 groupName, component.getNormalizedName(), getComponentTypeForResponse(component));
2036 // Find all component instances with the member names
2037 Map<String, String> memberNames = componentInstances.stream()
2038 .collect(toMap(ComponentInstance::getName, ComponentInstance::getUniqueId));
2039 memberNames.putAll(groups.keySet()
2041 .collect(toMap(g -> g, g -> "")));
2042 Map<String, String> relevantInstances = memberNames.entrySet()
2044 .filter(n -> compInstancesNames.contains(n.getKey()))
2045 .collect(toMap(Entry::getKey, Entry::getValue));
2047 if (relevantInstances == null || relevantInstances.size() != compInstancesNames.size()) {
2049 List<String> foundMembers = new ArrayList<>();
2050 if (relevantInstances != null) {
2051 foundMembers = relevantInstances.keySet()
2055 compInstancesNames.removeAll(foundMembers);
2056 String membersAstString = compInstancesNames.stream()
2057 .collect(joining(","));
2058 log.debug("The members: {}, in group: {}, cannot be found in component: {}", membersAstString, groupName,
2059 component.getNormalizedName());
2060 throw new ByActionStatusComponentException(
2061 ActionStatus.GROUP_INVALID_COMPONENT_INSTANCE, membersAstString,
2062 groupName, component.getNormalizedName(), getComponentTypeForResponse(component));
2064 updatedGroupDefinition.setMembers(relevantInstances);
2068 * This Method validates that there is no cyclic group dependencies. meaning
2069 * group A as member in group B which is member in group A
2074 private Either<Boolean, ResponseFormat> validateCyclicGroupsDependencies(Map<String, GroupDefinition> allGroups) {
2076 Either<Boolean, ResponseFormat> result = Either.left(true);
2078 Iterator<Entry<String, GroupDefinition>> allGroupsItr = allGroups.entrySet()
2080 while (allGroupsItr.hasNext() && result.isLeft()) {
2081 Entry<String, GroupDefinition> groupAEntry = allGroupsItr.next();
2082 // Fetches a group member A
2083 String groupAName = groupAEntry.getKey();
2084 // Finds all group members in group A
2085 Set<String> allGroupAMembersNames = new HashSet<>();
2086 fillAllGroupMemebersRecursivly(groupAEntry.getKey(), allGroups, allGroupAMembersNames);
2087 // If A is a group member of itself found cyclic dependency
2088 if (allGroupAMembersNames.contains(groupAName)) {
2089 ResponseFormat responseFormat = componentsUtils
2090 .getResponseFormat(ActionStatus.GROUP_HAS_CYCLIC_DEPENDENCY, groupAName);
2091 result = Either.right(responseFormat);
2094 } catch (Exception e) {
2095 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
2096 result = Either.right(responseFormat);
2097 log.debug("Exception occurred when validateCyclicGroupsDependencies, error is:{}", e.getMessage(), e);
2103 * This Method fills recursively the set groupMembers with all the members
2104 * of the given group which are also of type group.
2108 * @param allGroupMembers
2111 private void fillAllGroupMemebersRecursivly(String groupName, Map<String, GroupDefinition> allGroups,
2112 Set<String> allGroupMembers) {
2114 // Found Cyclic dependency
2115 if (isfillGroupMemebersRecursivlyStopCondition(groupName, allGroups, allGroupMembers)) {
2118 GroupDefinition groupDefinition = allGroups.get(groupName);
2119 // All Members Of Current Group Resource Instances & Other Groups
2120 Set<String> currGroupMembers = groupDefinition.getMembers()
2122 // Filtered Members Of Current Group containing only members which
2124 List<String> currGroupFilteredMembers = currGroupMembers.stream()
2126 // Keep Only Elements of type group and not Resource Instances
2127 filter(allGroups::containsKey)
2129 // Add Filtered Elements to main Set
2130 peek(allGroupMembers::add)
2135 // Recursively call the method for all the filtered group members
2136 for (String innerGroupName : currGroupFilteredMembers) {
2137 fillAllGroupMemebersRecursivly(innerGroupName, allGroups, allGroupMembers);
2142 private boolean isfillGroupMemebersRecursivlyStopCondition(String groupName, Map<String, GroupDefinition> allGroups,
2143 Set<String> allGroupMembers) {
2145 boolean stop = false;
2146 // In Case Not Group Stop
2147 if (!allGroups.containsKey(groupName)) {
2150 // In Case Group Has no members stop
2152 GroupDefinition groupDefinition = allGroups.get(groupName);
2153 stop = isEmpty(groupDefinition.getMembers());
2156 // In Case all group members already contained stop
2158 final Set<String> allMembers = allGroups.get(groupName)
2161 Set<String> membersOfTypeGroup = allMembers.stream()
2163 // Filter In Only Group members
2164 filter(allGroups::containsKey)
2168 stop = allGroupMembers.containsAll(membersOfTypeGroup);
2173 private Resource createRIAndRelationsFromYaml(String yamlName, Resource resource,
2174 Map<String, UploadComponentInstanceInfo> uploadComponentInstanceInfoMap, String topologyTemplateYaml,
2175 List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, Map<String, NodeTypeInfo> nodeTypesInfo,
2177 Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToCreate,
2180 log.debug("************* Going to create all nodes {}", yamlName);
2181 handleNodeTypes(yamlName, resource, topologyTemplateYaml, false, nodeTypesArtifactsToCreate,
2182 nodeTypesNewCreatedArtifacts, nodeTypesInfo, csarInfo, nodeName);
2183 log.debug("************* Finished to create all nodes {}", yamlName);
2184 log.debug("************* Going to create all resource instances {}", yamlName);
2185 Map<String, Resource> existingNodeTypesByResourceNames = new HashMap<>();
2186 resource = createResourceInstances(yamlName, resource, null, uploadComponentInstanceInfoMap,
2187 csarInfo.getCreatedNodes(), existingNodeTypesByResourceNames);
2188 log.debug("************* Finished to create all resource instances {}", yamlName);
2189 log.debug("************* Going to create all relations {}", yamlName);
2190 resource = createResourceInstancesRelations(csarInfo.getModifier(), yamlName, resource, null, uploadComponentInstanceInfoMap, existingNodeTypesByResourceNames);
2191 log.debug("************* Finished to create all relations {}", yamlName);
2192 log.debug("************* Going to create positions {}", yamlName);
2193 compositionBusinessLogic.setPositionsForComponentInstances(resource, csarInfo.getModifier()
2195 log.debug("************* Finished to set positions {}", yamlName);
2199 private void handleAndAddExtractedVfcsArtifacts(List<ArtifactDefinition> vfcArtifacts,
2200 List<ArtifactDefinition> artifactsToAdd) {
2201 List<String> vfcArtifactNames = vfcArtifacts.stream()
2202 .map(ArtifactDataDefinition::getArtifactName)
2204 artifactsToAdd.stream()
2206 if (!vfcArtifactNames.contains(a.getArtifactName())) {
2207 vfcArtifacts.add(a);
2209 log.debug("Can't upload two artifact with the same name {}. ", a.getArtifactName());
2215 @SuppressWarnings("unchecked")
2216 private void handleNodeTypes(String yamlName, Resource resource, String topologyTemplateYaml, boolean needLock,
2217 Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle,
2218 List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, Map<String, NodeTypeInfo> nodeTypesInfo,
2219 CsarInfo csarInfo, String nodeName) {
2221 for (Entry<String, NodeTypeInfo> nodeTypeEntry : nodeTypesInfo.entrySet()) {
2222 if (nodeTypeEntry.getValue()
2225 handleNestedVfc(resource, nodeTypesArtifactsToHandle, nodeTypesNewCreatedArtifacts, nodeTypesInfo,
2226 csarInfo, nodeTypeEntry.getKey());
2227 log.trace("************* finished to create node {}", nodeTypeEntry.getKey());
2230 Map<String, Object> mappedToscaTemplate = null;
2231 if (StringUtils.isNotEmpty(nodeName) && isNotEmpty(nodeTypesInfo) && nodeTypesInfo.containsKey(nodeName)) {
2232 mappedToscaTemplate = nodeTypesInfo.get(nodeName)
2233 .getMappedToscaTemplate();
2235 if (isEmpty(mappedToscaTemplate)) {
2236 mappedToscaTemplate = (Map<String, Object>) new Yaml().load(topologyTemplateYaml);
2238 createResourcesFromYamlNodeTypesList(yamlName, resource, mappedToscaTemplate, needLock,
2239 nodeTypesArtifactsToHandle, nodeTypesNewCreatedArtifacts, nodeTypesInfo, csarInfo);
2240 } catch (ComponentException e) {
2241 ResponseFormat responseFormat = e.getResponseFormat() != null ? e.getResponseFormat()
2242 : componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams());
2243 componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), resource,
2244 AuditingActionEnum.IMPORT_RESOURCE);
2246 } catch (StorageException e) {
2247 ResponseFormat responseFormat = componentsUtils
2248 .getResponseFormat(componentsUtils.convertFromStorageResponse(e.getStorageOperationStatus()));
2249 componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), resource,
2250 AuditingActionEnum.IMPORT_RESOURCE);
2255 private Either<Resource, ResponseFormat> handleVfCsarArtifacts(Resource resource, CsarInfo csarInfo,
2256 List<ArtifactDefinition> createdArtifacts, ArtifactOperationInfo artifactOperation, boolean shouldLock,
2257 boolean inTransaction) {
2259 if (csarInfo.getCsar() != null) {
2260 String vendorLicenseModelId = null;
2261 String vfLicenseModelId = null;
2263 if (artifactOperation.isUpdate()) {
2264 Map<String, ArtifactDefinition> deploymentArtifactsMap = resource.getDeploymentArtifacts();
2265 if (deploymentArtifactsMap != null && !deploymentArtifactsMap.isEmpty()) {
2266 for (Entry<String, ArtifactDefinition> artifactEntry : deploymentArtifactsMap.entrySet()) {
2267 if (artifactEntry.getValue()
2269 .equalsIgnoreCase(Constants.VENDOR_LICENSE_MODEL)) {
2270 vendorLicenseModelId = artifactEntry.getValue()
2273 if (artifactEntry.getValue()
2275 .equalsIgnoreCase(Constants.VF_LICENSE_MODEL)) {
2276 vfLicenseModelId = artifactEntry.getValue()
2283 // Specific Behavior for license artifacts
2284 createOrUpdateSingleNonMetaArtifact(resource, csarInfo,
2285 CsarUtils.ARTIFACTS_PATH + Constants.VENDOR_LICENSE_MODEL, Constants.VENDOR_LICENSE_MODEL,
2286 ArtifactTypeEnum.VENDOR_LICENSE.getType(), ArtifactGroupTypeEnum.DEPLOYMENT,
2287 Constants.VENDOR_LICENSE_LABEL, Constants.VENDOR_LICENSE_DISPLAY_NAME,
2288 Constants.VENDOR_LICENSE_DESCRIPTION, vendorLicenseModelId, artifactOperation, null, true,
2289 shouldLock, inTransaction);
2290 createOrUpdateSingleNonMetaArtifact(resource, csarInfo,
2291 CsarUtils.ARTIFACTS_PATH + Constants.VF_LICENSE_MODEL, Constants.VF_LICENSE_MODEL,
2292 ArtifactTypeEnum.VF_LICENSE.getType(), ArtifactGroupTypeEnum.DEPLOYMENT, Constants.VF_LICENSE_LABEL,
2293 Constants.VF_LICENSE_DISPLAY_NAME, Constants.VF_LICENSE_DESCRIPTION, vfLicenseModelId,
2294 artifactOperation, null, true, shouldLock, inTransaction);
2296 Either<Resource, ResponseFormat> eitherCreateResult = createOrUpdateNonMetaArtifacts(csarInfo, resource,
2297 createdArtifacts, shouldLock, inTransaction, artifactOperation);
2298 if (eitherCreateResult.isRight()) {
2299 return Either.right(eitherCreateResult.right()
2303 Either<ImmutablePair<String, String>, ResponseFormat> artifacsMetaCsarStatus = CsarValidationUtils
2304 .getArtifactsMeta(csarInfo.getCsar(), csarInfo.getCsarUUID(), componentsUtils);
2306 if (artifacsMetaCsarStatus.isLeft()) {
2307 String artifactsFileName = artifacsMetaCsarStatus.left()
2310 String artifactsContents = artifacsMetaCsarStatus.left()
2313 Either<Resource, ResponseFormat> createArtifactsFromCsar;
2314 if (artifactOperation.isCreateOrLink()) {
2315 createArtifactsFromCsar = csarArtifactsAndGroupsBusinessLogic.createResourceArtifactsFromCsar(
2316 csarInfo, resource, artifactsContents, artifactsFileName, createdArtifacts);
2318 Either<Component, ResponseFormat> result = csarArtifactsAndGroupsBusinessLogic.updateResourceArtifactsFromCsar(
2319 csarInfo, resource, artifactsContents, artifactsFileName, createdArtifacts, shouldLock,
2321 if ((result.left().value() instanceof Resource) && result.isLeft()) {
2322 Resource service1 = (Resource) result.left().value();
2323 createArtifactsFromCsar = Either.left(service1);
2325 createArtifactsFromCsar = Either.right(result.right().value());
2329 if (createArtifactsFromCsar.isRight()) {
2330 log.debug("Couldn't create artifacts from artifacts.meta");
2331 return Either.right(createArtifactsFromCsar.right()
2335 return Either.left(createArtifactsFromCsar.left()
2339 return csarArtifactsAndGroupsBusinessLogic.deleteVFModules(resource, csarInfo, shouldLock,
2344 return Either.left(resource);
2347 private Either<Boolean, ResponseFormat> createOrUpdateSingleNonMetaArtifact(Resource resource, CsarInfo csarInfo,
2348 String artifactPath, String artifactFileName, String artifactType, ArtifactGroupTypeEnum artifactGroupType,
2349 String artifactLabel, String artifactDisplayName, String artifactDescription, String artifactId,
2350 ArtifactOperationInfo operation, List<ArtifactDefinition> createdArtifacts, boolean isFromCsar,
2351 boolean shouldLock, boolean inTransaction) {
2352 byte[] artifactFileBytes = null;
2354 if (csarInfo.getCsar()
2355 .containsKey(artifactPath)) {
2356 artifactFileBytes = csarInfo.getCsar()
2359 Either<Boolean, ResponseFormat> result = Either.left(true);
2360 if (operation.isUpdate() || operation.isDelete()) {
2361 if (isArtifactDeletionRequired(artifactId, artifactFileBytes, isFromCsar)) {
2362 Either<ArtifactDefinition, ResponseFormat> handleDelete = artifactsBusinessLogic
2363 .handleDelete(resource.getUniqueId(), artifactId, csarInfo.getModifier(),
2364 resource, shouldLock,
2366 if (handleDelete.isRight()) {
2367 result = Either.right(handleDelete.right()
2370 ArtifactDefinition value = handleDelete.left().value();
2371 String updatedArtifactId = value.getUniqueId();
2372 if (artifactGroupType == ArtifactGroupTypeEnum.DEPLOYMENT) {
2373 resource.getDeploymentArtifacts().remove(updatedArtifactId);
2375 resource.getArtifacts().remove(updatedArtifactId);
2381 if (StringUtils.isEmpty(artifactId) && artifactFileBytes != null) {
2382 operation = new ArtifactOperationInfo(false, false,
2383 ArtifactOperationEnum.CREATE);
2387 if (artifactFileBytes != null) {
2388 Map<String, Object> vendorLicenseModelJson = ArtifactUtils.buildJsonForUpdateArtifact(artifactId,
2389 artifactFileName, artifactType, artifactGroupType, artifactLabel, artifactDisplayName,
2390 artifactDescription, artifactFileBytes, null, isFromCsar);
2391 Either<Either<ArtifactDefinition, Operation>, ResponseFormat> eitherNonMetaArtifacts = csarArtifactsAndGroupsBusinessLogic
2392 .createOrUpdateCsarArtifactFromJson(resource, csarInfo.getModifier(), vendorLicenseModelJson,
2394 addNonMetaCreatedArtifactsToSupportRollback(operation, createdArtifacts, eitherNonMetaArtifacts);
2395 if (eitherNonMetaArtifacts.isRight()) {
2396 BeEcompErrorManager.getInstance()
2397 .logInternalFlowError("UploadLicenseArtifact", "Failed to upload license artifact: "
2398 + artifactFileName + "With csar uuid: " + csarInfo.getCsarUUID(),
2399 ErrorSeverity.WARNING);
2400 return Either.right(eitherNonMetaArtifacts.right()
2403 ArtifactDefinition artifactDefinition = eitherNonMetaArtifacts.left().value().left().value();
2404 createOrUpdateResourceWithUpdatedArtifact(artifactDefinition,resource, artifactGroupType);
2410 private void createOrUpdateResourceWithUpdatedArtifact(ArtifactDefinition artifact, Resource resource, ArtifactGroupTypeEnum groupTypeEnum) {
2411 if (groupTypeEnum == ArtifactGroupTypeEnum.DEPLOYMENT) {
2412 resource.getDeploymentArtifacts().put(artifact.getArtifactLabel(), artifact);
2414 resource.getArtifacts().put(artifact.getArtifactLabel(), artifact);
2418 private boolean isArtifactDeletionRequired(String artifactId, byte[] artifactFileBytes, boolean isFromCsar) {
2419 return !StringUtils.isEmpty(artifactId) && artifactFileBytes == null && isFromCsar;
2422 private void addNonMetaCreatedArtifactsToSupportRollback(ArtifactOperationInfo operation,
2423 List<ArtifactDefinition> createdArtifacts,
2424 Either<Either<ArtifactDefinition, Operation>, ResponseFormat> eitherNonMetaArtifacts) {
2425 if (operation.isCreateOrLink() && createdArtifacts != null
2426 && eitherNonMetaArtifacts.isLeft()) {
2427 Either<ArtifactDefinition, Operation> eitherResult = eitherNonMetaArtifacts.left()
2429 if (eitherResult.isLeft()) {
2430 createdArtifacts.add(eitherResult.left()
2436 private Either<Resource, ResponseFormat> createOrUpdateNonMetaArtifacts(CsarInfo csarInfo, Resource resource,
2437 List<ArtifactDefinition> createdArtifacts, boolean shouldLock, boolean inTransaction,
2438 ArtifactOperationInfo artifactOperation) {
2440 Either<Resource, ResponseFormat> resStatus = null;
2441 Map<String, Set<List<String>>> collectedWarningMessages = new HashMap<>();
2444 Either<List<NonMetaArtifactInfo>, String> artifactPathAndNameList = getValidArtifactNames(csarInfo,
2445 collectedWarningMessages);
2446 if (artifactPathAndNameList.isRight()) {
2447 return Either.right(getComponentsUtils().getResponseFormatByArtifactId(
2448 ActionStatus.ARTIFACT_NAME_INVALID, artifactPathAndNameList.right()
2451 EnumMap<ArtifactOperationEnum, List<NonMetaArtifactInfo>> vfCsarArtifactsToHandle = null;
2453 if (artifactOperation.isCreateOrLink()) {
2454 vfCsarArtifactsToHandle = new EnumMap<>(ArtifactOperationEnum.class);
2455 vfCsarArtifactsToHandle.put(artifactOperation.getArtifactOperationEnum(), artifactPathAndNameList.left()
2458 Either<EnumMap<ArtifactOperationEnum, List<NonMetaArtifactInfo>>, ResponseFormat> findVfCsarArtifactsToHandleRes = findVfCsarArtifactsToHandle(
2459 resource, artifactPathAndNameList.left()
2461 csarInfo.getModifier());
2463 if (findVfCsarArtifactsToHandleRes.isRight()) {
2464 resStatus = Either.right(findVfCsarArtifactsToHandleRes.right()
2467 if (resStatus == null) {
2468 vfCsarArtifactsToHandle = findVfCsarArtifactsToHandleRes.left()
2472 if (resStatus == null && vfCsarArtifactsToHandle != null) {
2473 resStatus = processCsarArtifacts(csarInfo, resource, createdArtifacts, shouldLock, inTransaction,
2474 resStatus, vfCsarArtifactsToHandle);
2476 if (resStatus == null) {
2477 resStatus = Either.left(resource);
2479 } catch (Exception e) {
2480 resStatus = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
2481 log.debug("Exception occurred in createNonMetaArtifacts, message:{}", e.getMessage(), e);
2483 CsarUtils.handleWarningMessages(collectedWarningMessages);
2488 private Either<Resource, ResponseFormat> processCsarArtifacts(CsarInfo csarInfo, Resource resource,
2489 List<ArtifactDefinition> createdArtifacts, boolean shouldLock, boolean inTransaction,
2490 Either<Resource, ResponseFormat> resStatus,
2491 EnumMap<ArtifactOperationEnum, List<NonMetaArtifactInfo>> vfCsarArtifactsToHandle) {
2492 for (Entry<ArtifactOperationEnum, List<NonMetaArtifactInfo>> currArtifactOperationPair : vfCsarArtifactsToHandle
2495 Optional<ResponseFormat> optionalCreateInDBError =
2496 // Stream of artifacts to be created
2497 currArtifactOperationPair.getValue()
2499 // create each artifact
2500 .map(e -> createOrUpdateSingleNonMetaArtifact(resource, csarInfo, e.getPath(),
2501 e.getArtifactName(), e.getArtifactType(),
2502 e.getArtifactGroupType(), e.getArtifactLabel(), e.getDisplayName(),
2503 CsarUtils.ARTIFACT_CREATED_FROM_CSAR, e.getArtifactUniqueId(),
2504 new ArtifactOperationInfo(false, false,
2505 currArtifactOperationPair.getKey()),
2506 createdArtifacts, e.isFromCsar(), shouldLock, inTransaction))
2507 // filter in only error
2508 .filter(Either::isRight)
2510 // Convert the error from either to
2515 // Check if an error occurred
2517 // Error found on artifact Creation
2518 if (optionalCreateInDBError.isPresent()) {
2519 resStatus = Either.right(optionalCreateInDBError.get());
2526 private Either<List<NonMetaArtifactInfo>, String> getValidArtifactNames(CsarInfo csarInfo,
2527 Map<String, Set<List<String>>> collectedWarningMessages) {
2528 List<NonMetaArtifactInfo> artifactPathAndNameList =
2529 // Stream of file paths contained in csar
2533 // Filter in only VF artifact path location
2534 .filter(e -> Pattern.compile(VF_NODE_TYPE_ARTIFACTS_PATH_PATTERN)
2535 .matcher(e.getKey())
2537 // Validate and add warnings
2538 .map(e -> CsarUtils.validateNonMetaArtifact(e.getKey(), e.getValue(), collectedWarningMessages))
2539 // Filter in Non Warnings
2540 .filter(Either::isLeft)
2541 // Convert from Either to NonMetaArtifactInfo
2546 Pattern englishNumbersAndUnderScoresOnly = Pattern.compile(CsarUtils.VALID_ENGLISH_ARTIFACT_NAME);
2547 for (NonMetaArtifactInfo nonMetaArtifactInfo : artifactPathAndNameList) {
2548 if (!englishNumbersAndUnderScoresOnly.matcher(nonMetaArtifactInfo.getDisplayName())
2550 return Either.right(nonMetaArtifactInfo.getArtifactName());
2553 return Either.left(artifactPathAndNameList);
2556 private Either<EnumMap<ArtifactOperationEnum, List<NonMetaArtifactInfo>>, ResponseFormat> findVfCsarArtifactsToHandle(
2557 Resource resource, List<NonMetaArtifactInfo> artifactPathAndNameList, User user) {
2559 List<ArtifactDefinition> existingArtifacts = new ArrayList<>();
2560 // collect all Deployment and Informational artifacts of VF
2561 if (resource.getDeploymentArtifacts() != null && !resource.getDeploymentArtifacts()
2563 existingArtifacts.addAll(resource.getDeploymentArtifacts()
2566 if (resource.getArtifacts() != null && !resource.getArtifacts()
2568 existingArtifacts.addAll(resource.getArtifacts()
2571 existingArtifacts = existingArtifacts.stream()
2572 // filter MANDATORY artifacts, LICENSE artifacts and artifacts
2573 // was created from HEAT.meta
2574 .filter(this::isNonMetaArtifact)
2577 List<String> artifactsToIgnore = new ArrayList<>();
2578 // collect IDs of Artifacts of VF which belongs to any group
2579 if (resource.getGroups() != null) {
2580 resource.getGroups()
2583 if (g.getArtifacts() != null && !g.getArtifacts()
2585 artifactsToIgnore.addAll(g.getArtifacts());
2589 existingArtifacts = existingArtifacts.stream()
2590 // filter artifacts which belongs to any group
2591 .filter(a -> !artifactsToIgnore.contains(a.getUniqueId()))
2593 return organizeVfCsarArtifactsByArtifactOperation(artifactPathAndNameList, existingArtifacts, resource, user);
2596 private boolean isNonMetaArtifact(ArtifactDefinition artifact) {
2597 boolean result = true;
2598 if (artifact.getMandatory() || artifact.getArtifactName() == null || !isValidArtifactType(artifact)) {
2604 private boolean isValidArtifactType(ArtifactDefinition artifact) {
2605 boolean result = true;
2606 if (artifact.getArtifactType() == null
2607 || ArtifactTypeEnum.parse(artifact.getArtifactType()) == ArtifactTypeEnum.VENDOR_LICENSE
2608 || ArtifactTypeEnum.parse(artifact.getArtifactType()) == ArtifactTypeEnum.VF_LICENSE) {
2614 private Resource createResourceInstancesRelations(User user, String yamlName, Resource resource, Resource oldResource,
2615 Map<String, UploadComponentInstanceInfo> uploadResInstancesMap, Map<String, Resource> existingNodeTypesByResourceNames) {
2616 log.debug("#createResourceInstancesRelations - Going to create relations ");
2617 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,resource.getComponentMetadataForSupportLog(), StatusCode.STARTED,"Start to create relations");
2618 List<ComponentInstance> componentInstancesList = resource.getComponentInstances();
2619 if (isEmpty(uploadResInstancesMap) || CollectionUtils.isEmpty(componentInstancesList) &&
2620 resource.getResourceType() != ResourceTypeEnum.PNF) { // PNF can have no resource instances {
2622 "#createResourceInstancesRelations - No instances found in the resource {} is empty, yaml template file name {}, ",
2623 resource.getUniqueId(), yamlName);
2624 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,resource.getComponentMetadataForSupportLog(), StatusCode.ERROR,"No instances found in the resource: {}, is empty, yaml template file name: {}",resource.getName(),yamlName);
2625 BeEcompErrorManager.getInstance()
2626 .logInternalDataError("createResourceInstancesRelations",
2627 "No instances found in a resource or nn yaml template. ", ErrorSeverity.ERROR);
2628 throw new ByActionStatusComponentException(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
2630 Map<String, List<ComponentInstanceProperty>> instProperties = new HashMap<>();
2631 Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilities = new HashMap<>();
2632 Map<ComponentInstance, Map<String, List<RequirementDefinition>>> instRequirements = new HashMap<>();
2633 Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts = new HashMap<>();
2634 Map<String, Map<String, ArtifactDefinition>> instArtifacts = new HashMap<>();
2635 Map<String, List<AttributeDefinition>> instAttributes = new HashMap<>();
2636 List<RequirementCapabilityRelDef> relations = new ArrayList<>();
2637 Map<String, List<ComponentInstanceInput>> instInputs = new HashMap<>();
2639 log.debug("#createResourceInstancesRelations - Before get all datatypes. ");
2640 Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes = dataTypeCache.getAll();
2641 if (allDataTypes.isRight()) {
2642 JanusGraphOperationStatus status = allDataTypes.right()
2644 BeEcompErrorManager.getInstance()
2645 .logInternalFlowError("UpdatePropertyValueOnComponentInstance",
2646 "Failed to update property value on instance. Status is " + status, ErrorSeverity.ERROR);
2647 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,resource.getComponentMetadataForSupportLog(),
2648 StatusCode.ERROR,"ERROR while update property value on instance. Status is: "+status);
2649 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(
2650 DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status)), yamlName);
2653 Resource finalResource = resource;
2654 uploadResInstancesMap.values()
2655 .forEach(i -> processComponentInstance(yamlName, finalResource, componentInstancesList, allDataTypes,
2656 instProperties, instCapabilities, instRequirements, instDeploymentArtifacts, instArtifacts,
2657 instAttributes, existingNodeTypesByResourceNames, instInputs, i));
2658 resource.getComponentInstances()
2660 .filter(i -> !i.isCreatedFromCsar())
2661 .forEach(i -> processUiComponentInstance(oldResource, i, instCapabilities, instRequirements,
2662 instDeploymentArtifacts, instArtifacts, instProperties, instInputs, instAttributes));
2664 associateComponentInstancePropertiesToComponent(yamlName, resource, instProperties);
2665 associateComponentInstanceInputsToComponent(yamlName, resource, instInputs);
2666 associateDeploymentArtifactsToInstances(user, yamlName, resource, instDeploymentArtifacts);
2667 associateArtifactsToInstances(yamlName, resource, instArtifacts);
2668 associateOrAddCalculatedCapReq(yamlName, resource, instCapabilities, instRequirements);
2669 associateInstAttributeToComponentToInstances(yamlName, resource, instAttributes);
2670 addRelationsToRI(yamlName, resource, uploadResInstancesMap, componentInstancesList, relations);
2671 associateResourceInstances(yamlName, resource, relations);
2672 handleSubstitutionMappings(resource, uploadResInstancesMap);
2673 log.debug("************* in create relations, getResource start");
2674 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,resource.getComponentMetadataForSupportLog(), StatusCode.COMPLETE,"create relations");
2675 Either<Resource, StorageOperationStatus> eitherGetResource = toscaOperationFacade
2676 .getToscaFullElement(resource.getUniqueId());
2677 log.debug("************* in create relations, getResource end");
2678 if (eitherGetResource.isRight()) {
2679 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,resource.getComponentMetadataForSupportLog(),
2680 StatusCode.ERROR,"ERROR while create relations");
2681 throw new ByResponseFormatComponentException(componentsUtils
2682 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(eitherGetResource.right()
2683 .value()), resource));
2685 return eitherGetResource.left()
2689 private void processUiComponentInstance(Resource oldResource, ComponentInstance instance,
2690 Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilities,
2691 Map<ComponentInstance, Map<String, List<RequirementDefinition>>> instRequirements,
2692 Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts,
2693 Map<String, Map<String, ArtifactDefinition>> instArtifacts, Map<String,
2694 List<ComponentInstanceProperty>> instProperties, Map<String,
2695 List<ComponentInstanceInput>> instInputs,
2696 Map<String, List<AttributeDefinition>> instAttributes) {
2697 Optional<ComponentInstance> foundInstance = findInstance(oldResource, instance);
2698 if (foundInstance.isPresent()) {
2699 if (MapUtils.isNotEmpty(foundInstance.get().getCapabilities())) {
2700 instCapabilities.put(instance, foundInstance.get().getCapabilities());
2702 if (MapUtils.isNotEmpty(foundInstance.get().getRequirements())) {
2703 instRequirements.put(instance, foundInstance.get().getRequirements());
2705 if (MapUtils.isNotEmpty(foundInstance.get().getDeploymentArtifacts())) {
2706 instDeploymentArtifacts.put(instance.getUniqueId(), foundInstance.get().getDeploymentArtifacts());
2708 if(MapUtils.isNotEmpty(foundInstance.get().getArtifacts())){
2709 instArtifacts.put(instance.getUniqueId(), foundInstance.get().getArtifacts());
2711 if (MapUtils.isNotEmpty(oldResource.getComponentInstancesProperties()) &&
2713 .isNotEmpty(oldResource.getComponentInstancesProperties().get(foundInstance.get().getUniqueId()))) {
2714 instProperties.put(instance.getUniqueId(),
2715 oldResource.getComponentInstancesProperties().get(foundInstance.get().getUniqueId()));
2717 if (MapUtils.isNotEmpty(oldResource.getComponentInstancesInputs()) &&
2719 .isNotEmpty(oldResource.getComponentInstancesInputs().get(foundInstance.get().getUniqueId()))) {
2720 instInputs.put(instance.getUniqueId(),
2721 oldResource.getComponentInstancesInputs().get(foundInstance.get().getUniqueId()));
2723 if(MapUtils.isNotEmpty(oldResource.getComponentInstancesAttributes()) &&
2724 CollectionUtils.isNotEmpty(oldResource.getComponentInstancesAttributes().get(foundInstance.get().getUniqueId()))){
2725 instAttributes.put(instance.getUniqueId(), oldResource.getComponentInstancesAttributes().get(foundInstance.get().getUniqueId()).stream().map(AttributeDefinition::new).collect(toList()));
2730 private Optional<ComponentInstance> findInstance(Resource oldResource, ComponentInstance instance) {
2731 if(oldResource != null && CollectionUtils.isNotEmpty(oldResource.getComponentInstances())) {
2732 return oldResource.getComponentInstances().stream().filter(i -> i.getName().equals(instance.getName())).findFirst();
2734 return Optional.empty();
2737 private void associateResourceInstances(String yamlName, Resource resource,
2738 List<RequirementCapabilityRelDef> relations) {
2739 Either<List<RequirementCapabilityRelDef>, StorageOperationStatus> relationsEither = toscaOperationFacade.associateResourceInstances(resource, resource.getUniqueId(), relations);
2741 if (relationsEither.isRight() && relationsEither.right().value() != StorageOperationStatus.NOT_FOUND) {
2742 StorageOperationStatus status = relationsEither.right().value();
2743 log.debug("failed to associate instances of resource {} status is {}", resource.getUniqueId(),
2745 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(status), yamlName);
2747 setResourceInstanceRelationsOnComponent(resource, relationsEither.left().value());
2751 private void associateInstAttributeToComponentToInstances(String yamlName, Resource resource,
2752 Map<String, List<AttributeDefinition>> instAttributes) {
2753 StorageOperationStatus addArtToInst;
2754 addArtToInst = toscaOperationFacade.associateInstAttributeToComponentToInstances(instAttributes,
2756 if (addArtToInst != StorageOperationStatus.OK && addArtToInst != StorageOperationStatus.NOT_FOUND) {
2757 log.debug("failed to associate attributes of resource {} status is {}", resource.getUniqueId(),
2759 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(addArtToInst),
2764 private void associateOrAddCalculatedCapReq(String yamlName, Resource resource,
2765 Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilities,
2766 Map<ComponentInstance, Map<String, List<RequirementDefinition>>> instRequirements) {
2767 StorageOperationStatus addArtToInst;
2768 addArtToInst = toscaOperationFacade.associateOrAddCalculatedCapReq(instCapabilities, instRequirements,
2770 if (addArtToInst != StorageOperationStatus.OK && addArtToInst != StorageOperationStatus.NOT_FOUND) {
2771 log.debug("failed to associate cap and req of resource {} status is {}", resource.getUniqueId(),
2773 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(addArtToInst), yamlName);
2777 private void associateArtifactsToInstances(String yamlName, Resource resource,
2778 Map<String, Map<String, ArtifactDefinition>> instArtifacts) {
2779 StorageOperationStatus addArtToInst;
2781 addArtToInst = toscaOperationFacade.associateArtifactsToInstances(instArtifacts, resource);
2782 if (addArtToInst != StorageOperationStatus.OK && addArtToInst != StorageOperationStatus.NOT_FOUND) {
2783 log.debug("failed to associate artifact of resource {} status is {}", resource.getUniqueId(), addArtToInst);
2784 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(addArtToInst), yamlName);
2788 private void associateDeploymentArtifactsToInstances(User user, String yamlName, Resource resource,
2789 Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts) {
2790 StorageOperationStatus addArtToInst = toscaOperationFacade
2791 .associateDeploymentArtifactsToInstances(instDeploymentArtifacts, resource, user);
2792 if (addArtToInst != StorageOperationStatus.OK && addArtToInst != StorageOperationStatus.NOT_FOUND) {
2793 log.debug("failed to associate artifact of resource {} status is {}", resource.getUniqueId(), addArtToInst);
2794 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(addArtToInst), yamlName);
2798 private void associateComponentInstanceInputsToComponent(String yamlName, Resource resource,
2799 Map<String, List<ComponentInstanceInput>> instInputs) {
2800 if (MapUtils.isNotEmpty(instInputs)) {
2801 Either<Map<String, List<ComponentInstanceInput>>, StorageOperationStatus> addInputToInst = toscaOperationFacade
2802 .associateComponentInstanceInputsToComponent(instInputs, resource.getUniqueId());
2803 if (addInputToInst.isRight()) {
2805 StorageOperationStatus addInputToInstError = addInputToInst.right().value();
2806 log.debug("failed to associate inputs value of resource {} status is {}", resource.getUniqueId(),
2807 addInputToInstError);
2808 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(addInputToInstError), yamlName);
2810 setComponentInstanceInputsOnComponent(resource, instInputs);
2814 private void setComponentInstanceInputsOnComponent(Resource resource, Map<String, List<ComponentInstanceInput>> instInputs) {
2815 Map<String, List<ComponentInstanceInput>> componentInstancesInputs = resource.getComponentInstancesInputs();
2816 if (componentInstancesInputs == null)
2817 componentInstancesInputs = new HashMap<>();
2818 componentInstancesInputs.putAll(instInputs);
2819 resource.setComponentInstancesInputs(componentInstancesInputs);
2822 private void associateComponentInstancePropertiesToComponent(String yamlName, Resource resource,
2823 Map<String, List<ComponentInstanceProperty>> instProperties) {
2824 Either<Map<String, List<ComponentInstanceProperty>>, StorageOperationStatus> addPropToInst = toscaOperationFacade
2825 .associateComponentInstancePropertiesToComponent(instProperties, resource.getUniqueId());
2826 if (addPropToInst.isRight()) {
2827 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,resource.getComponentMetadataForSupportLog(),
2828 StatusCode.ERROR,"ERROR while associate compnent insatnce properties of resource: {} status is: {}",resource.getName(),addPropToInst.right().value());
2829 StorageOperationStatus storageOperationStatus = addPropToInst.right().value();
2830 log.debug("failed to associate properties of resource {} status is {}", resource.getUniqueId(),
2831 storageOperationStatus);
2832 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(storageOperationStatus), yamlName);
2834 setComponentInstancePropertiesOnComponent(resource, instProperties);
2837 private void setComponentInstancePropertiesOnComponent(Resource resource, Map<String, List<ComponentInstanceProperty>> instProperties) {
2838 Map<String, List<ComponentInstanceProperty>> componentInstanceProps = resource.getComponentInstancesProperties();
2839 if (componentInstanceProps == null )
2840 componentInstanceProps = new HashMap<>();
2841 componentInstanceProps.putAll(instProperties);
2842 resource.setComponentInstancesProperties(componentInstanceProps);
2845 private void handleSubstitutionMappings(Resource resource,
2846 Map<String, UploadComponentInstanceInfo> uploadResInstancesMap) {
2847 if (resource.getResourceType() == ResourceTypeEnum.CVFC) {
2848 Either<Resource, StorageOperationStatus> getResourceRes =
2849 updateCalculatedCapReqWithSubstitutionMappings(resource, uploadResInstancesMap);
2850 if (getResourceRes.isRight()) {
2851 ResponseFormat responseFormat = componentsUtils
2852 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(getResourceRes.right()
2853 .value()), resource);
2854 throw new ByResponseFormatComponentException(responseFormat);
2859 private void addRelationsToRI(String yamlName, Resource resource,
2860 Map<String, UploadComponentInstanceInfo> uploadResInstancesMap,
2861 List<ComponentInstance> componentInstancesList, List<RequirementCapabilityRelDef> relations) {
2862 for (Entry<String, UploadComponentInstanceInfo> entry : uploadResInstancesMap.entrySet()) {
2863 UploadComponentInstanceInfo uploadComponentInstanceInfo = entry.getValue();
2864 ComponentInstance currentCompInstance = null;
2865 for (ComponentInstance compInstance : componentInstancesList) {
2867 if (compInstance.getName()
2868 .equals(uploadComponentInstanceInfo.getName())) {
2869 currentCompInstance = compInstance;
2874 if (currentCompInstance == null) {
2875 log.debug(COMPONENT_INSTANCE_WITH_NAME_IN_RESOURCE, uploadComponentInstanceInfo.getName(),
2876 resource.getUniqueId());
2877 BeEcompErrorManager.getInstance()
2878 .logInternalDataError(
2879 COMPONENT_INSTANCE_WITH_NAME + uploadComponentInstanceInfo.getName() + IN_RESOURCE,
2880 resource.getUniqueId(), ErrorSeverity.ERROR);
2881 throw new ByActionStatusComponentException(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
2884 ResponseFormat addRelationToRiRes = addRelationToRI(yamlName, resource, entry.getValue(), relations);
2885 if (addRelationToRiRes.getStatus() != 200) {
2886 throw new ByResponseFormatComponentException(addRelationToRiRes);
2892 private void setResourceInstanceRelationsOnComponent(Resource resource, List<RequirementCapabilityRelDef> relations) {
2893 if (resource.getComponentInstancesRelations() != null) {
2894 resource.getComponentInstancesRelations().addAll(relations);
2896 resource.setComponentInstancesRelations(relations);
2900 private void processComponentInstance(String yamlName, Resource resource,
2901 List<ComponentInstance> componentInstancesList,
2902 Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes,
2903 Map<String, List<ComponentInstanceProperty>> instProperties,
2904 Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilties,
2905 Map<ComponentInstance, Map<String, List<RequirementDefinition>>> instRequirements,
2906 Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts,
2907 Map<String, Map<String, ArtifactDefinition>> instArtifacts,
2908 Map<String, List<AttributeDefinition>> instAttributes,
2909 Map<String, Resource> originCompMap,
2910 Map<String, List<ComponentInstanceInput>> instInputs,
2911 UploadComponentInstanceInfo uploadComponentInstanceInfo) {
2912 Optional<ComponentInstance> currentCompInstanceOpt = componentInstancesList.stream()
2913 .filter(i -> i.getName()
2914 .equals(uploadComponentInstanceInfo.getName()))
2916 if (!currentCompInstanceOpt.isPresent()) {
2917 log.debug(COMPONENT_INSTANCE_WITH_NAME_IN_RESOURCE, uploadComponentInstanceInfo.getName(),
2918 resource.getUniqueId());
2919 BeEcompErrorManager.getInstance()
2920 .logInternalDataError(
2921 COMPONENT_INSTANCE_WITH_NAME + uploadComponentInstanceInfo.getName() + IN_RESOURCE,
2922 resource.getUniqueId(), ErrorSeverity.ERROR);
2923 throw new ByActionStatusComponentException(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
2925 ComponentInstance currentCompInstance = currentCompInstanceOpt.get();
2926 String resourceInstanceId = currentCompInstance.getUniqueId();
2927 Resource originResource = getOriginResource(originCompMap, currentCompInstance);
2928 if (isNotEmpty(originResource.getRequirements())) {
2929 instRequirements.put(currentCompInstance, originResource.getRequirements());
2931 if (isNotEmpty(originResource.getCapabilities())) {
2932 processComponentInstanceCapabilities(allDataTypes, instCapabilties, uploadComponentInstanceInfo,
2933 currentCompInstance, originResource);
2935 if (originResource.getDeploymentArtifacts() != null && !originResource.getDeploymentArtifacts()
2937 instDeploymentArtifacts.put(resourceInstanceId, originResource.getDeploymentArtifacts());
2939 if (originResource.getArtifacts() != null && !originResource.getArtifacts().isEmpty()) {
2940 instArtifacts.put(resourceInstanceId, originResource.getArtifacts());
2942 if (originResource.getAttributes() != null && !originResource.getAttributes().isEmpty()) {
2943 instAttributes.put(resourceInstanceId, originResource.getAttributes());
2945 if (originResource.getResourceType() != ResourceTypeEnum.CVFC) {
2946 ResponseFormat addPropertiesValueToRiRes = addPropertyValuesToRi(uploadComponentInstanceInfo, resource,
2947 originResource, currentCompInstance, instProperties, allDataTypes.left()
2949 if (addPropertiesValueToRiRes.getStatus() != 200) {
2950 throw new ByResponseFormatComponentException(addPropertiesValueToRiRes);
2953 addInputsValuesToRi(uploadComponentInstanceInfo, resource, originResource, currentCompInstance, instInputs,
2959 private Resource getOriginResource(Map<String, Resource> originCompMap, ComponentInstance currentCompInstance) {
2960 Resource originResource;
2961 if (!originCompMap.containsKey(currentCompInstance.getComponentUid())) {
2962 Either<Resource, StorageOperationStatus> getOriginResourceRes = toscaOperationFacade
2963 .getToscaFullElement(currentCompInstance.getComponentUid());
2964 if (getOriginResourceRes.isRight()) {
2965 log.debug("failed to fetch resource with uniqueId {} and tosca component name {} status is {}",
2966 currentCompInstance.getComponentUid(), currentCompInstance.getToscaComponentName(),
2967 getOriginResourceRes);
2968 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(getOriginResourceRes.right()
2969 .value()), currentCompInstance.getComponentUid());
2971 originResource = getOriginResourceRes.left()
2973 originCompMap.put(originResource.getUniqueId(), originResource);
2975 originResource = originCompMap.get(currentCompInstance.getComponentUid());
2977 return originResource;
2980 private void processComponentInstanceCapabilities(
2981 Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes,
2982 Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilties,
2983 UploadComponentInstanceInfo uploadComponentInstanceInfo, ComponentInstance currentCompInstance,
2984 Resource originResource) {
2985 Map<String, List<CapabilityDefinition>> originCapabilities;
2986 if (isNotEmpty(uploadComponentInstanceInfo.getCapabilities())) {
2987 originCapabilities = new HashMap<>();
2988 Map<String, Map<String, UploadPropInfo>> newPropertiesMap = new HashMap<>();
2989 originResource.getCapabilities()
2990 .forEach((k, v) -> addCapabilities(originCapabilities, k, v));
2991 uploadComponentInstanceInfo.getCapabilities()
2993 .forEach(l -> addCapabilitiesProperties(newPropertiesMap, l));
2994 updateCapabilityPropertiesValues(allDataTypes, originCapabilities, newPropertiesMap);
2996 originCapabilities = originResource.getCapabilities();
2998 instCapabilties.put(currentCompInstance, originCapabilities);
3001 private void updateCapabilityPropertiesValues(
3002 Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes,
3003 Map<String, List<CapabilityDefinition>> originCapabilities,
3004 Map<String, Map<String, UploadPropInfo>> newPropertiesMap) {
3005 originCapabilities.values()
3007 .flatMap(Collection::stream)
3008 .filter(c -> newPropertiesMap.containsKey(c.getName()))
3009 .forEach(c -> updatePropertyValues(c.getProperties(), newPropertiesMap.get(c.getName()),
3014 private void addCapabilitiesProperties(Map<String, Map<String, UploadPropInfo>> newPropertiesMap,
3015 List<UploadCapInfo> capabilities) {
3016 for (UploadCapInfo capability : capabilities) {
3017 if (isNotEmpty(capability.getProperties())) {
3018 newPropertiesMap.put(capability.getName(), capability.getProperties()
3020 .collect(toMap(UploadInfo::getName, p -> p)));
3025 private void addCapabilities(Map<String, List<CapabilityDefinition>> originCapabilities, String type,
3026 List<CapabilityDefinition> capabilities) {
3027 List<CapabilityDefinition> list = capabilities.stream()
3028 .map(CapabilityDefinition::new)
3030 originCapabilities.put(type, list);
3033 private void updatePropertyValues(List<ComponentInstanceProperty> properties,
3034 Map<String, UploadPropInfo> newProperties, Map<String, DataTypeDefinition> allDataTypes) {
3035 properties.forEach(p -> updatePropertyValue(p, newProperties.get(p.getName()), allDataTypes));
3038 private String updatePropertyValue(ComponentInstanceProperty property, UploadPropInfo propertyInfo,
3039 Map<String, DataTypeDefinition> allDataTypes) {
3040 String value = null;
3041 List<GetInputValueDataDefinition> getInputs = null;
3042 boolean isValidate = true;
3043 if (null != propertyInfo && propertyInfo.getValue() != null) {
3044 getInputs = propertyInfo.getGet_input();
3045 isValidate = getInputs == null || getInputs.isEmpty();
3047 value = getPropertyJsonStringValue(propertyInfo.getValue(), property.getType());
3049 value = getPropertyJsonStringValue(propertyInfo.getValue(),
3050 TypeUtils.ToscaTagNamesEnum.GET_INPUT.getElementName());
3053 property.setValue(value);
3054 return validatePropValueBeforeCreate(property, value, isValidate, allDataTypes);
3057 private Either<Resource, StorageOperationStatus> updateCalculatedCapReqWithSubstitutionMappings(Resource resource,
3058 Map<String, UploadComponentInstanceInfo> uploadResInstancesMap) {
3059 Either<Resource, StorageOperationStatus> updateRes = null;
3060 Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> updatedInstCapabilities = new HashMap<>();
3061 Map<ComponentInstance, Map<String, List<RequirementDefinition>>> updatedInstRequirements = new HashMap<>();
3062 StorageOperationStatus status = toscaOperationFacade
3063 .deleteAllCalculatedCapabilitiesRequirements(resource.getUniqueId());
3064 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
3066 "Failed to delete all calculated capabilities and requirements of resource {} upon update. Status is {}",
3067 resource.getUniqueId(), status);
3068 updateRes = Either.right(status);
3070 if (updateRes == null) {
3071 fillUpdatedInstCapabilitiesRequirements(resource.getComponentInstances(), uploadResInstancesMap,
3072 updatedInstCapabilities, updatedInstRequirements);
3073 status = toscaOperationFacade.associateOrAddCalculatedCapReq(updatedInstCapabilities,
3074 updatedInstRequirements, resource);
3075 if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
3077 "Failed to associate capabilities and requirementss of resource {}, updated according to a substitution mapping. Status is {}",
3078 resource.getUniqueId(), status);
3079 updateRes = Either.right(status);
3082 if (updateRes == null) {
3083 updateRes = Either.left(resource);
3088 private void fillUpdatedInstCapabilitiesRequirements(List<ComponentInstance> componentInstances,
3089 Map<String, UploadComponentInstanceInfo> uploadResInstancesMap,
3090 Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> updatedInstCapabilities,
3091 Map<ComponentInstance, Map<String, List<RequirementDefinition>>> updatedInstRequirements) {
3093 componentInstances.stream()
3095 fillUpdatedInstCapabilities(updatedInstCapabilities, i, uploadResInstancesMap.get(i.getName())
3096 .getCapabilitiesNamesToUpdate());
3097 fillUpdatedInstRequirements(updatedInstRequirements, i, uploadResInstancesMap.get(i.getName())
3098 .getRequirementsNamesToUpdate());
3102 private void fillUpdatedInstRequirements(
3103 Map<ComponentInstance, Map<String, List<RequirementDefinition>>> updatedInstRequirements,
3104 ComponentInstance instance, Map<String, String> requirementsNamesToUpdate) {
3105 Map<String, List<RequirementDefinition>> updatedRequirements = new HashMap<>();
3106 Set<String> updatedReqNames = new HashSet<>();
3107 if (isNotEmpty(requirementsNamesToUpdate)) {
3108 for (Map.Entry<String, List<RequirementDefinition>> requirements : instance.getRequirements()
3110 updatedRequirements.put(requirements.getKey(), requirements.getValue()
3112 .filter(r -> requirementsNamesToUpdate.containsKey(r.getName())
3113 && !updatedReqNames.contains(requirementsNamesToUpdate.get(r.getName())))
3115 r.setParentName(r.getName());
3116 r.setName(requirementsNamesToUpdate.get(r.getName()));
3117 updatedReqNames.add(r.getName());
3120 .collect(toList()));
3123 if (isNotEmpty(updatedRequirements)) {
3124 updatedInstRequirements.put(instance, updatedRequirements);
3128 private void fillUpdatedInstCapabilities(
3129 Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> updatedInstCapabilties,
3130 ComponentInstance instance, Map<String, String> capabilitiesNamesToUpdate) {
3131 Map<String, List<CapabilityDefinition>> updatedCapabilities = new HashMap<>();
3132 Set<String> updatedCapNames = new HashSet<>();
3133 if (isNotEmpty(capabilitiesNamesToUpdate)) {
3134 for (Map.Entry<String, List<CapabilityDefinition>> requirements : instance.getCapabilities()
3136 updatedCapabilities.put(requirements.getKey(), requirements.getValue()
3138 .filter(c -> capabilitiesNamesToUpdate.containsKey(c.getName())
3139 && !updatedCapNames.contains(capabilitiesNamesToUpdate.get(c.getName())))
3141 c.setParentName(c.getName());
3142 c.setName(capabilitiesNamesToUpdate.get(c.getName()));
3143 updatedCapNames.add(c.getName());
3146 .collect(toList()));
3149 if (isNotEmpty(updatedCapabilities)) {
3150 updatedInstCapabilties.put(instance, updatedCapabilities);
3154 private ResponseFormat addRelationToRI(String yamlName, Resource resource,
3155 UploadComponentInstanceInfo nodesInfoValue, List<RequirementCapabilityRelDef> relations) {
3156 List<ComponentInstance> componentInstancesList = resource.getComponentInstances();
3158 ComponentInstance currentCompInstance = null;
3160 for (ComponentInstance compInstance : componentInstancesList) {
3162 if (compInstance.getName()
3163 .equals(nodesInfoValue.getName())) {
3164 currentCompInstance = compInstance;
3170 if (currentCompInstance == null) {
3171 log.debug(COMPONENT_INSTANCE_WITH_NAME_IN_RESOURCE, nodesInfoValue.getName(), resource.getUniqueId());
3172 BeEcompErrorManager.getInstance()
3173 .logInternalDataError(COMPONENT_INSTANCE_WITH_NAME + nodesInfoValue.getName() + IN_RESOURCE,
3174 resource.getUniqueId(), ErrorSeverity.ERROR);
3175 return componentsUtils.getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
3177 String resourceInstanceId = currentCompInstance.getUniqueId();
3179 Map<String, List<UploadReqInfo>> regMap = nodesInfoValue.getRequirements();
3181 if (regMap != null) {
3182 Iterator<Entry<String, List<UploadReqInfo>>> nodesRegValue = regMap.entrySet()
3185 while (nodesRegValue.hasNext()) {
3186 Entry<String, List<UploadReqInfo>> nodesRegInfoEntry = nodesRegValue.next();
3188 List<UploadReqInfo> uploadRegInfoList = nodesRegInfoEntry.getValue();
3189 for (UploadReqInfo uploadRegInfo : uploadRegInfoList) {
3190 log.debug("Going to create relation {}", uploadRegInfo.getName());
3191 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,resource.getComponentMetadataForSupportLog(), StatusCode.STARTED,"Started to create relations on instance: {}",uploadRegInfo.getName());
3192 String regName = uploadRegInfo.getName();
3193 RequirementCapabilityRelDef regCapRelDef = new RequirementCapabilityRelDef();
3194 regCapRelDef.setFromNode(resourceInstanceId);
3195 log.debug("try to find available requirement {} ", regName);
3196 Either<RequirementDefinition, ResponseFormat> eitherReqStatus = findAviableRequiremen(regName,
3197 yamlName, nodesInfoValue, currentCompInstance, uploadRegInfo.getCapabilityName());
3198 if (eitherReqStatus.isRight()) {
3199 log.debug("failed to find available requirement {} status is {}", regName,
3200 eitherReqStatus.right()
3202 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,resource.getComponentMetadataForSupportLog(), StatusCode.ERROR,"ERROR while search available requirement {} status is: {}",regName,eitherReqStatus.right().value());
3203 return eitherReqStatus.right()
3207 RequirementDefinition validReq = eitherReqStatus.left()
3209 List<CapabilityRequirementRelationship> reqAndRelationshipPairList = regCapRelDef
3210 .getRelationships();
3211 if (reqAndRelationshipPairList == null) {
3212 reqAndRelationshipPairList = new ArrayList<>();
3214 RelationshipInfo reqAndRelationshipPair = new RelationshipInfo();
3215 reqAndRelationshipPair.setRequirement(regName);
3216 reqAndRelationshipPair.setRequirementOwnerId(validReq.getOwnerId());
3217 reqAndRelationshipPair.setRequirementUid(validReq.getUniqueId());
3218 RelationshipImpl relationship = new RelationshipImpl();
3219 relationship.setType(validReq.getCapability());
3220 reqAndRelationshipPair.setRelationships(relationship);
3222 ComponentInstance currentCapCompInstance = null;
3223 for (ComponentInstance compInstance : componentInstancesList) {
3224 if (compInstance.getName()
3225 .equals(uploadRegInfo.getNode())) {
3226 currentCapCompInstance = compInstance;
3231 if (currentCapCompInstance == null) {
3232 log.debug("The component instance with name {} not found on resource {} ",
3233 uploadRegInfo.getNode(), resource.getUniqueId());
3234 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RELATIONS,resource.getComponentMetadataForSupportLog(), StatusCode.ERROR,"ERROR component instance with name: {} not found on resource: {}",uploadRegInfo.getNode(),resource.getUniqueId());
3235 BeEcompErrorManager.getInstance()
3236 .logInternalDataError(
3237 COMPONENT_INSTANCE_WITH_NAME + uploadRegInfo.getNode() + IN_RESOURCE,
3238 resource.getUniqueId(), ErrorSeverity.ERROR);
3239 return componentsUtils.getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
3241 regCapRelDef.setToNode(currentCapCompInstance.getUniqueId());
3242 log.debug("try to find aviable Capability req name is {} ", validReq.getName());
3243 CapabilityDefinition aviableCapForRel = findAvailableCapabilityByTypeOrName(validReq,
3244 currentCapCompInstance, uploadRegInfo);
3246 if (aviableCapForRel == null) {
3247 log.debug("aviable capability was not found. req name is {} component instance is {}",
3248 validReq.getName(), currentCapCompInstance.getUniqueId());
3249 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());
3250 BeEcompErrorManager.getInstance()
3251 .logInternalDataError(
3252 "aviable capability was not found. req name is " + validReq.getName()
3253 + " component instance is " + currentCapCompInstance.getUniqueId(),
3254 resource.getUniqueId(), ErrorSeverity.ERROR);
3255 return componentsUtils.getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
3257 reqAndRelationshipPair.setCapability(aviableCapForRel.getName());
3258 reqAndRelationshipPair.setCapabilityUid(aviableCapForRel.getUniqueId());
3259 reqAndRelationshipPair.setCapabilityOwnerId(aviableCapForRel.getOwnerId());
3261 CapabilityRequirementRelationship capReqRel = new CapabilityRequirementRelationship();
3262 capReqRel.setRelation(reqAndRelationshipPair);
3263 reqAndRelationshipPairList.add(capReqRel);
3264 regCapRelDef.setRelationships(reqAndRelationshipPairList);
3265 relations.add(regCapRelDef);
3268 } else if (resource.getResourceType() != ResourceTypeEnum.CVFC) {
3269 return componentsUtils.getResponseFormat(ActionStatus.OK, yamlName);
3271 return componentsUtils.getResponseFormat(ActionStatus.OK);
3274 private void addInputsValuesToRi(UploadComponentInstanceInfo uploadComponentInstanceInfo, Resource resource,
3275 Resource originResource, ComponentInstance currentCompInstance,
3276 Map<String, List<ComponentInstanceInput>> instInputs, Map<String, DataTypeDefinition> allDataTypes) {
3277 Map<String, List<UploadPropInfo>> propMap = uploadComponentInstanceInfo.getProperties();
3278 if (MapUtils.isNotEmpty(propMap)) {
3279 Map<String, InputDefinition> currPropertiesMap = new HashMap<>();
3280 List<ComponentInstanceInput> instPropList = new ArrayList<>();
3282 if (CollectionUtils.isEmpty(originResource.getInputs())) {
3283 log.debug("failed to find properties ");
3284 loggerSupportability.log(LoggerSupportabilityActions.CREATE_INPUTS,resource.getComponentMetadataForSupportLog(),StatusCode.ERROR,"ERROR while try to find properties");
3285 throw new ByActionStatusComponentException(ActionStatus.PROPERTY_NOT_FOUND);
3287 originResource.getInputs()
3288 .forEach(p -> addInput(currPropertiesMap, p));
3289 for (List<UploadPropInfo> propertyList : propMap.values()) {
3290 processProperty(resource, currentCompInstance, allDataTypes, currPropertiesMap, instPropList,
3293 currPropertiesMap.values()
3294 .forEach(p -> instPropList.add(new ComponentInstanceInput(p)));
3295 instInputs.put(currentCompInstance.getUniqueId(), instPropList);
3299 private void processProperty(Resource resource, ComponentInstance currentCompInstance,
3300 Map<String, DataTypeDefinition> allDataTypes, Map<String, InputDefinition> currPropertiesMap,
3301 List<ComponentInstanceInput> instPropList, List<UploadPropInfo> propertyList) {
3302 UploadPropInfo propertyInfo = propertyList.get(0);
3303 String propName = propertyInfo.getName();
3304 if (!currPropertiesMap.containsKey(propName)) {
3305 loggerSupportability.log(LoggerSupportabilityActions.PROPERTY,resource.getComponentMetadataForSupportLog(),
3306 StatusCode.ERROR,"ERROR failed to find property: {}",propName);
3307 log.debug("failed to find property {} ", propName);
3308 throw new ByActionStatusComponentException(ActionStatus.PROPERTY_NOT_FOUND, propName);
3310 InputDefinition curPropertyDef = currPropertiesMap.get(propName);
3311 ComponentInstanceInput property = null;
3313 String value = null;
3314 List<GetInputValueDataDefinition> getInputs = null;
3315 boolean isValidate = true;
3316 if (propertyInfo.getValue() != null) {
3317 getInputs = propertyInfo.getGet_input();
3318 isValidate = getInputs == null || getInputs.isEmpty();
3320 value = getPropertyJsonStringValue(propertyInfo.getValue(), curPropertyDef.getType());
3322 value = getPropertyJsonStringValue(propertyInfo.getValue(),
3323 TypeUtils.ToscaTagNamesEnum.GET_INPUT.getElementName());
3326 property = new ComponentInstanceInput(curPropertyDef, value, null);
3328 String validPropertyVAlue = validatePropValueBeforeCreate(property, value, isValidate, allDataTypes);
3330 property.setValue(validPropertyVAlue);
3332 if (isNotEmpty(getInputs)) {
3333 List<GetInputValueDataDefinition> getInputValues = new ArrayList<>();
3334 for (GetInputValueDataDefinition getInput : getInputs) {
3335 List<InputDefinition> inputs = resource.getInputs();
3336 if (CollectionUtils.isEmpty(inputs)) {
3337 loggerSupportability.log(LoggerSupportabilityActions.PROPERTY,resource.getComponentMetadataForSupportLog(),
3338 StatusCode.ERROR,"ERROR Failed to add property: "+propName+" to resource instance: {}. Inputs list is empty ",currentCompInstance.getUniqueId());
3339 log.debug("Failed to add property {} to resource instance {}. Inputs list is empty ", property,
3340 currentCompInstance.getUniqueId());
3341 throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
3344 Optional<InputDefinition> optional = inputs.stream()
3345 .filter(p -> p.getName()
3346 .equals(getInput.getInputName()))
3348 if (!optional.isPresent()) {
3349 loggerSupportability.log(LoggerSupportabilityActions.PROPERTY,resource.getComponentMetadataForSupportLog(),
3350 StatusCode.ERROR,"ERROR Failed to find input: "+getInput.getInputName());
3351 log.debug("Failed to find input {} ", getInput.getInputName());
3352 // @@TODO error message
3353 throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
3355 InputDefinition input = optional.get();
3356 getInput.setInputId(input.getUniqueId());
3357 getInputValues.add(getInput);
3359 GetInputValueDataDefinition getInputIndex = getInput.getGetInputIndex();
3360 processGetInput(getInputValues, inputs, getInputIndex);
3362 property.setGetInputValues(getInputValues);
3364 instPropList.add(property);
3365 // delete overriden property
3366 currPropertiesMap.remove(property.getName());
3369 private void processGetInput(List<GetInputValueDataDefinition> getInputValues, List<InputDefinition> inputs,
3370 GetInputValueDataDefinition getInputIndex) {
3371 Optional<InputDefinition> optional;
3372 if (getInputIndex != null) {
3373 optional = inputs.stream()
3374 .filter(p -> p.getName()
3375 .equals(getInputIndex.getInputName()))
3377 if (!optional.isPresent()) {
3378 log.debug("Failed to find input {} ", getInputIndex.getInputName());
3379 // @@TODO error message
3380 throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
3382 InputDefinition inputIndex = optional.get();
3383 getInputIndex.setInputId(inputIndex.getUniqueId());
3384 getInputValues.add(getInputIndex);
3388 private void addInput(Map<String, InputDefinition> currPropertiesMap, InputDefinition prop) {
3389 String propName = prop.getName();
3390 if (!currPropertiesMap.containsKey(propName)) {
3391 currPropertiesMap.put(propName, prop);
3395 private ResponseFormat addPropertyValuesToRi(UploadComponentInstanceInfo uploadComponentInstanceInfo,
3396 Resource resource, Resource originResource, ComponentInstance currentCompInstance,
3397 Map<String, List<ComponentInstanceProperty>> instProperties, Map<String, DataTypeDefinition> allDataTypes) {
3399 Map<String, List<UploadPropInfo>> propMap = uploadComponentInstanceInfo.getProperties();
3400 Map<String, PropertyDefinition> currPropertiesMap = new HashMap<>();
3402 List<PropertyDefinition> listFromMap = originResource.getProperties();
3403 if ((propMap != null && !propMap.isEmpty()) && (listFromMap == null || listFromMap.isEmpty())) {
3404 loggerSupportability.log(LoggerSupportabilityActions.PROPERTY,resource.getComponentMetadataForSupportLog(),
3405 StatusCode.ERROR,"ERROR Failed to find properties");
3406 log.debug("failed to find properties");
3407 return componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NOT_FOUND);
3409 if (listFromMap == null || listFromMap.isEmpty()) {
3410 return componentsUtils.getResponseFormat(ActionStatus.OK);
3412 for (PropertyDefinition prop : listFromMap) {
3413 String propName = prop.getName();
3414 if (!currPropertiesMap.containsKey(propName)) {
3415 currPropertiesMap.put(propName, prop);
3418 List<ComponentInstanceProperty> instPropList = new ArrayList<>();
3419 if (propMap != null && propMap.size() > 0) {
3420 for (List<UploadPropInfo> propertyList : propMap.values()) {
3422 UploadPropInfo propertyInfo = propertyList.get(0);
3423 String propName = propertyInfo.getName();
3424 if (!currPropertiesMap.containsKey(propName)) {
3425 log.debug("failed to find property {} ", propName);
3426 loggerSupportability.log(LoggerSupportabilityActions.PROPERTY,resource.getComponentMetadataForSupportLog(), StatusCode.ERROR,"ERROR Failed to find property: {}",propName);
3427 return componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NOT_FOUND, propName);
3429 PropertyDefinition curPropertyDef = currPropertiesMap.get(propName);
3430 ComponentInstanceProperty property = null;
3432 String value = null;
3433 List<GetInputValueDataDefinition> getInputs = null;
3434 boolean isValidate = true;
3435 if (propertyInfo.getValue() != null) {
3436 getInputs = propertyInfo.getGet_input();
3437 isValidate = getInputs == null || getInputs.isEmpty();
3439 value = getPropertyJsonStringValue(propertyInfo.getValue(), curPropertyDef.getType());
3441 value = getPropertyJsonStringValue(propertyInfo.getValue(),
3442 TypeUtils.ToscaTagNamesEnum.GET_INPUT.getElementName());
3445 property = new ComponentInstanceProperty(curPropertyDef, value, null);
3447 String validatePropValue = validatePropValueBeforeCreate(property, value, isValidate, allDataTypes);
3448 property.setValue(validatePropValue);
3450 if (getInputs != null && !getInputs.isEmpty()) {
3451 List<GetInputValueDataDefinition> getInputValues = new ArrayList<>();
3452 for (GetInputValueDataDefinition getInput : getInputs) {
3453 List<InputDefinition> inputs = resource.getInputs();
3454 if (inputs == null || inputs.isEmpty()) {
3455 log.debug("Failed to add property {} to instance. Inputs list is empty ", property);
3456 loggerSupportability.log(LoggerSupportabilityActions.PROPERTY,resource.getComponentMetadataForSupportLog(), StatusCode.ERROR,"Failed to add property: {} to instance. Inputs list is empty",propName);
3457 rollbackWithException(ActionStatus.INPUTS_NOT_FOUND, property.getGetInputValues()
3459 .map(GetInputValueDataDefinition::getInputName)
3463 Either<InputDefinition, RuntimeException> inputEither = findInputByName(inputs, getInput);
3464 if (inputEither.isRight()) {
3465 throw inputEither.right().value();
3467 InputDefinition input = inputEither.left().value();
3468 getInput.setInputId(input.getUniqueId());
3469 getInputValues.add(getInput);
3471 GetInputValueDataDefinition getInputIndex = getInput.getGetInputIndex();
3472 if (getInputIndex != null) {
3473 Either<InputDefinition, RuntimeException> newInputEither = findInputByName(inputs,
3475 if (inputEither.isRight()) {
3476 throw newInputEither.right().value();
3478 InputDefinition newInput = newInputEither.left().value();
3479 getInputIndex.setInputId(newInput.getUniqueId());
3481 getInputValues.add(getInputIndex);
3486 property.setGetInputValues(getInputValues);
3488 instPropList.add(property);
3489 // delete overriden property
3490 currPropertiesMap.remove(property.getName());
3493 // add rest of properties
3494 if (!currPropertiesMap.isEmpty()) {
3495 for (PropertyDefinition value : currPropertiesMap.values()) {
3496 instPropList.add(new ComponentInstanceProperty(value));
3499 instProperties.put(currentCompInstance.getUniqueId(), instPropList);
3500 return componentsUtils.getResponseFormat(ActionStatus.OK);
3503 // US740820 Relate RIs according to capability name
3504 private CapabilityDefinition findAvailableCapabilityByTypeOrName(RequirementDefinition validReq,
3505 ComponentInstance currentCapCompInstance, UploadReqInfo uploadReqInfo) {
3506 if (null == uploadReqInfo.getCapabilityName() || validReq.getCapability()
3507 .equals(uploadReqInfo.getCapabilityName())) {// get
3511 return findAvailableCapability(validReq, currentCapCompInstance);
3513 return findAvailableCapability(validReq, currentCapCompInstance, uploadReqInfo);
3516 private CapabilityDefinition findAvailableCapability(RequirementDefinition validReq,
3517 ComponentInstance currentCapCompInstance, UploadReqInfo uploadReqInfo) {
3518 CapabilityDefinition cap = null;
3519 Map<String, List<CapabilityDefinition>> capMap = currentCapCompInstance.getCapabilities();
3520 if (!capMap.containsKey(validReq.getCapability())) {
3523 Optional<CapabilityDefinition> capByName = capMap.get(validReq.getCapability())
3525 .filter(p -> p.getName()
3526 .equals(uploadReqInfo.getCapabilityName()))
3528 if (!capByName.isPresent()) {
3531 cap = capByName.get();
3533 if (isBoundedByOccurrences(cap)) {
3534 String leftOccurrences = cap.getLeftOccurrences();
3535 int left = Integer.parseInt(leftOccurrences);
3538 cap.setLeftOccurrences(String.valueOf(left));
3546 private CapabilityDefinition findAvailableCapability(RequirementDefinition validReq, ComponentInstance instance) {
3547 Map<String, List<CapabilityDefinition>> capMap = instance.getCapabilities();
3548 if (capMap.containsKey(validReq.getCapability())) {
3549 List<CapabilityDefinition> capList = capMap.get(validReq.getCapability());
3551 for (CapabilityDefinition cap : capList) {
3552 if (isBoundedByOccurrences(cap)) {
3553 String leftOccurrences = cap.getLeftOccurrences() != null ? cap.getLeftOccurrences()
3554 : cap.getMaxOccurrences();
3555 int left = Integer.parseInt(leftOccurrences);
3558 cap.setLeftOccurrences(String.valueOf(left));
3569 private boolean isBoundedByOccurrences(CapabilityDefinition cap) {
3570 return cap.getMaxOccurrences() != null && !cap.getMaxOccurrences()
3571 .equals(CapabilityDataDefinition.MAX_OCCURRENCES);
3574 private Either<RequirementDefinition, ResponseFormat> findAviableRequiremen(String regName, String yamlName,
3575 UploadComponentInstanceInfo uploadComponentInstanceInfo, ComponentInstance currentCompInstance,
3577 Map<String, List<RequirementDefinition>> comInstRegDefMap = currentCompInstance.getRequirements();
3578 List<RequirementDefinition> list = comInstRegDefMap.get(capName);
3579 RequirementDefinition validRegDef = null;
3581 for (Entry<String, List<RequirementDefinition>> entry : comInstRegDefMap.entrySet()) {
3582 for (RequirementDefinition reqDef : entry.getValue()) {
3583 if (reqDef.getName()
3585 if (reqDef.getMaxOccurrences() != null && !reqDef.getMaxOccurrences()
3586 .equals(RequirementDataDefinition.MAX_OCCURRENCES)) {
3587 String leftOccurrences = reqDef.getLeftOccurrences();
3588 if (leftOccurrences == null) {
3589 leftOccurrences = reqDef.getMaxOccurrences();
3591 int left = Integer.parseInt(leftOccurrences);
3594 reqDef.setLeftOccurrences(String.valueOf(left));
3595 validRegDef = reqDef;
3601 validRegDef = reqDef;
3607 if (validRegDef != null) {
3612 for (RequirementDefinition reqDef : list) {
3613 if (reqDef.getName()
3615 if (reqDef.getMaxOccurrences() != null && !reqDef.getMaxOccurrences()
3616 .equals(RequirementDataDefinition.MAX_OCCURRENCES)) {
3617 String leftOccurrences = reqDef.getLeftOccurrences();
3618 if (leftOccurrences == null) {
3619 leftOccurrences = reqDef.getMaxOccurrences();
3621 int left = Integer.parseInt(leftOccurrences);
3624 reqDef.setLeftOccurrences(String.valueOf(left));
3625 validRegDef = reqDef;
3631 validRegDef = reqDef;
3637 if (validRegDef == null) {
3638 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_NODE_TEMPLATE,
3639 yamlName, uploadComponentInstanceInfo.getName(), uploadComponentInstanceInfo.getType());
3640 return Either.right(responseFormat);
3642 return Either.left(validRegDef);
3645 private Resource createResourceInstances(String yamlName, Resource resource, Resource oldResource,
3646 Map<String, UploadComponentInstanceInfo> uploadResInstancesMap, Map<String, Resource> nodeNamespaceMap, Map<String, Resource> existingNodeTypesByResourceNames) {
3648 Either<Resource, ResponseFormat> eitherResource;
3649 log.debug("createResourceInstances is {} - going to create resource instanse from CSAR", yamlName);
3650 if (isEmpty(uploadResInstancesMap) && resource.getResourceType() != ResourceTypeEnum.PNF) { // PNF can have no resource instances
3651 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE);
3652 throw new ByResponseFormatComponentException(responseFormat);
3654 if (MapUtils.isNotEmpty(nodeNamespaceMap)) {
3655 nodeNamespaceMap.forEach((k, v) -> existingNodeTypesByResourceNames.put(v.getToscaResourceName(), v));
3657 Map<ComponentInstance, Resource> resourcesInstancesMap = new HashMap<>();
3658 uploadResInstancesMap.values()
3659 .forEach(i -> createAndAddResourceInstance(i, yamlName, resource, nodeNamespaceMap,
3660 existingNodeTypesByResourceNames, resourcesInstancesMap));
3661 if (oldResource != null && oldResource.getResourceType() != ResourceTypeEnum.CVFC && oldResource.getComponentInstances() != null) {
3662 Map<String, Resource> existingNodeTypesByUids = existingNodeTypesByResourceNames.values()
3664 .collect(toMap(Resource::getUniqueId, r -> r));
3665 oldResource.getComponentInstances()
3667 .filter(i -> !i.isCreatedFromCsar())
3668 .forEach(uiInst -> resourcesInstancesMap.put(uiInst,
3669 getOriginResource(existingNodeTypesByUids, uiInst)));
3672 if (isNotEmpty(resourcesInstancesMap)) {
3674 toscaOperationFacade.associateComponentInstancesToComponent(resource,
3675 resourcesInstancesMap, false, oldResource != null);
3676 } catch (StorageException exp) {
3677 if (exp.getStorageOperationStatus() != null && exp.getStorageOperationStatus() != StorageOperationStatus.OK) {
3678 log.debug("Failed to add component instances to container component {}", resource.getName());
3679 ResponseFormat responseFormat = componentsUtils
3680 .getResponseFormat(componentsUtils.convertFromStorageResponse(exp.getStorageOperationStatus()));
3681 eitherResource = Either.right(responseFormat);
3682 throw new ByResponseFormatComponentException(eitherResource.right().value());
3686 if (CollectionUtils.isEmpty(resource.getComponentInstances()) &&
3687 resource.getResourceType() != ResourceTypeEnum.PNF) { // PNF can have no resource instances
3688 log.debug("Error when create resource instance from csar. ComponentInstances list empty");
3689 BeEcompErrorManager.getInstance()
3690 .logBeDaoSystemError(
3691 "Error when create resource instance from csar. ComponentInstances list empty");
3692 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE));
3697 private void createAndAddResourceInstance(UploadComponentInstanceInfo uploadComponentInstanceInfo, String yamlName,
3698 Resource resource, Map<String, Resource> nodeNamespaceMap, Map<String, Resource> existingnodeTypeMap,
3699 Map<ComponentInstance, Resource> resourcesInstancesMap) {
3700 Either<Resource, ResponseFormat> eitherResource;
3701 log.debug("*************Going to create resource instances {}", yamlName);
3702 // updating type if the type is node type name - we need to take the
3704 log.debug("*************Going to create resource instances {}", uploadComponentInstanceInfo.getName());
3705 if (nodeNamespaceMap.containsKey(uploadComponentInstanceInfo.getType())) {
3706 uploadComponentInstanceInfo.setType(nodeNamespaceMap.get(uploadComponentInstanceInfo.getType())
3707 .getToscaResourceName());
3709 Resource refResource = validateResourceInstanceBeforeCreate(yamlName, uploadComponentInstanceInfo,
3710 existingnodeTypeMap, resource);
3712 ComponentInstance componentInstance = new ComponentInstance();
3713 componentInstance.setComponentUid(refResource.getUniqueId());
3714 Collection<String> directives = uploadComponentInstanceInfo.getDirectives();
3715 if(directives != null && !directives.isEmpty()) {
3716 componentInstance.setDirectives(new ArrayList<>(directives));
3718 UploadNodeFilterInfo uploadNodeFilterInfo = uploadComponentInstanceInfo.getUploadNodeFilterInfo();
3719 if (uploadNodeFilterInfo != null){
3720 componentInstance.setNodeFilter(new CINodeFilterUtils().getNodeFilterDataDefinition(uploadNodeFilterInfo,
3721 componentInstance.getUniqueId()));
3723 ComponentTypeEnum containerComponentType = resource.getComponentType();
3724 NodeTypeEnum containerNodeType = containerComponentType.getNodeType();
3725 if (containerNodeType == NodeTypeEnum.Resource && isNotEmpty(uploadComponentInstanceInfo.getCapabilities())
3726 && isNotEmpty(refResource.getCapabilities())) {
3727 setCapabilityNamesTypes(refResource.getCapabilities(), uploadComponentInstanceInfo.getCapabilities());
3728 Map<String, List<CapabilityDefinition>> validComponentInstanceCapabilities = getValidComponentInstanceCapabilities(
3729 refResource.getUniqueId(), refResource.getCapabilities(),
3730 uploadComponentInstanceInfo.getCapabilities());
3731 componentInstance.setCapabilities(validComponentInstanceCapabilities);
3734 if (isNotEmpty(uploadComponentInstanceInfo.getArtifacts())) {
3735 Map<String, Map<String, UploadArtifactInfo>> artifacts = uploadComponentInstanceInfo.getArtifacts();
3736 Map<String, ToscaArtifactDataDefinition> toscaArtifacts = new HashMap<>();
3737 Map<String, Map<String, UploadArtifactInfo>> arts = artifacts.entrySet().stream()
3738 .filter(e -> e.getKey().contains(TypeUtils.ToscaTagNamesEnum.ARTIFACTS.getElementName()))
3739 .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()));
3740 Map<String, UploadArtifactInfo> artifact = arts.get(TypeUtils.ToscaTagNamesEnum.ARTIFACTS.getElementName());
3741 for (Map.Entry<String, UploadArtifactInfo> entry : artifact.entrySet()) {
3742 ToscaArtifactDataDefinition to = new ToscaArtifactDataDefinition();
3743 to.setFile(entry.getValue().getFile());
3744 to.setType(entry.getValue().getType());
3745 toscaArtifacts.put(entry.getKey(), to);
3747 componentInstance.setToscaArtifacts(toscaArtifacts);
3750 if (!existingnodeTypeMap.containsKey(uploadComponentInstanceInfo.getType())) {
3751 log.debug("createResourceInstances - not found lates version for resource instance with name {} and type ",
3752 uploadComponentInstanceInfo.getName(), uploadComponentInstanceInfo.getType());
3753 throw new ByActionStatusComponentException(ActionStatus.INVALID_NODE_TEMPLATE,
3754 yamlName, uploadComponentInstanceInfo.getName(), uploadComponentInstanceInfo.getType());
3756 Resource origResource = existingnodeTypeMap.get(uploadComponentInstanceInfo.getType());
3757 componentInstance.setName(uploadComponentInstanceInfo.getName());
3758 componentInstance.setIcon(origResource.getIcon());
3759 componentInstance.setCreatedFrom(CreatedFrom.CSAR);
3760 resourcesInstancesMap.put(componentInstance, origResource);
3763 private ComponentParametersView getComponentWithInstancesFilter() {
3764 ComponentParametersView parametersView = new ComponentParametersView();
3765 parametersView.disableAll();
3766 parametersView.setIgnoreComponentInstances(false);
3767 parametersView.setIgnoreInputs(false);
3768 // inputs are read when creating
3769 // property values on instances
3770 parametersView.setIgnoreUsers(false);
3771 return parametersView;
3774 private void setCapabilityNamesTypes(Map<String, List<CapabilityDefinition>> originCapabilities,
3775 Map<String, List<UploadCapInfo>> uploadedCapabilities) {
3776 for (Entry<String, List<UploadCapInfo>> currEntry : uploadedCapabilities.entrySet()) {
3777 if (originCapabilities.containsKey(currEntry.getKey())) {
3778 currEntry.getValue()
3780 .forEach(cap -> cap.setType(currEntry.getKey()));
3783 for (Map.Entry<String, List<CapabilityDefinition>> capabilities : originCapabilities.entrySet()) {
3784 capabilities.getValue()
3787 if (uploadedCapabilities.containsKey(cap.getName())) {
3788 uploadedCapabilities.get(cap.getName())
3791 c.setName(cap.getName());
3792 c.setType(cap.getType());
3799 private Resource validateResourceInstanceBeforeCreate(String yamlName,
3800 UploadComponentInstanceInfo uploadComponentInstanceInfo, Map<String, Resource> nodeNamespaceMap, Resource resource) {
3803 "validateResourceInstanceBeforeCreate - going to validate resource instance with name {} and type {} before create",
3804 uploadComponentInstanceInfo.getName(), uploadComponentInstanceInfo.getType());
3805 Resource refResource;
3806 if (nodeNamespaceMap.containsKey(uploadComponentInstanceInfo.getType())) {
3807 refResource = nodeNamespaceMap.get(uploadComponentInstanceInfo.getType());
3809 Either<Resource, StorageOperationStatus> findResourceEither = toscaOperationFacade
3810 .getByToscaResourceNameMatchingVendorRelease(uploadComponentInstanceInfo.getType(),
3811 ((ResourceMetadataDataDefinition)resource.getComponentMetadataDefinition().getMetadataDataDefinition()).getVendorRelease());
3812 if (findResourceEither.isRight()) {
3814 "validateResourceInstanceBeforeCreate - not found latest version for resource instance with name {} and type {}",
3815 uploadComponentInstanceInfo.getName(), uploadComponentInstanceInfo.getType());
3816 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(findResourceEither.right().value()));
3818 refResource = findResourceEither.left().value();
3819 nodeNamespaceMap.put(refResource.getToscaResourceName(), refResource);
3821 String componentState = refResource.getComponentMetadataDefinition()
3822 .getMetadataDataDefinition()
3824 if (componentState.equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
3826 "validateResourceInstanceBeforeCreate - component instance of component {} can not be created because the component is in an illegal state {}.",
3827 refResource.getName(), componentState);
3828 throw new ByActionStatusComponentException(ActionStatus.ILLEGAL_COMPONENT_STATE,
3829 refResource.getComponentType().getValue(),refResource.getName(), componentState);
3832 if (!ModelConverter.isAtomicComponent(refResource) && refResource.getResourceType() != ResourceTypeEnum.CVFC) {
3833 log.debug("validateResourceInstanceBeforeCreate - ref resource type is ", refResource.getResourceType());
3834 throw new ByActionStatusComponentException(ActionStatus.INVALID_NODE_TEMPLATE,
3835 yamlName, uploadComponentInstanceInfo.getName(), uploadComponentInstanceInfo.getType());
3840 public Resource propagateStateToCertified(User user, Resource resource,
3841 LifecycleChangeInfoWithAction lifecycleChangeInfo, boolean inTransaction, boolean needLock,
3842 boolean forceCertificationAllowed) {
3844 boolean failed = false;
3846 if (resource.getLifecycleState() != LifecycleStateEnum.CERTIFIED && forceCertificationAllowed
3847 && lifecycleBusinessLogic.isFirstCertification(resource.getVersion())) {
3848 nodeForceCertification(resource, user, lifecycleChangeInfo, inTransaction, needLock);
3850 if (resource.getLifecycleState() == LifecycleStateEnum.CERTIFIED) {
3851 Either<ArtifactDefinition, Operation> eitherPopulated = populateToscaArtifacts(
3852 resource, user, false, inTransaction, needLock, false);
3855 return nodeFullCertification(resource.getUniqueId(), user, lifecycleChangeInfo, inTransaction, needLock);
3856 } catch (ComponentException e) {
3858 log.debug("The exception has occurred upon certification of resource {}. ", resource.getName(), e);
3862 BeEcompErrorManager.getInstance()
3863 .logBeSystemError("Change LifecycleState - Certify");
3864 if (!inTransaction) {
3865 janusGraphDao.rollback();
3867 } else if (!inTransaction) {
3868 janusGraphDao.commit();
3873 private Resource nodeFullCertification(String uniqueId, User user,
3874 LifecycleChangeInfoWithAction lifecycleChangeInfo, boolean inTransaction, boolean needLock) {
3875 Either<Resource, ResponseFormat> resourceResponse = lifecycleBusinessLogic.changeState(uniqueId, user, LifeCycleTransitionEnum.CERTIFY, lifecycleChangeInfo,
3876 inTransaction, needLock);
3877 if(resourceResponse.isRight()){
3878 throw new ByResponseFormatComponentException(resourceResponse.right().value());
3880 return resourceResponse.left().value();
3883 private Resource nodeForceCertification(Resource resource, User user,
3884 LifecycleChangeInfoWithAction lifecycleChangeInfo, boolean inTransaction, boolean needLock) {
3885 return lifecycleBusinessLogic.forceResourceCertification(resource, user, lifecycleChangeInfo, inTransaction,
3889 public ImmutablePair<Resource, ActionStatus> createOrUpdateResourceByImport(final Resource resource,
3891 final boolean isNormative,
3892 final boolean isInTransaction,
3893 final boolean needLock,
3894 final CsarInfo csarInfo,
3895 final String nodeName,
3896 final boolean isNested) {
3898 ImmutablePair<Resource, ActionStatus> result = null;
3899 // check if resource already exists (search by tosca name = type)
3900 final boolean isNestedResource = isNestedResourceUpdate(csarInfo, nodeName);
3901 final Either<Resource, StorageOperationStatus> latestByToscaName = toscaOperationFacade
3902 .getLatestByToscaResourceName(resource.getToscaResourceName());
3904 if (latestByToscaName.isLeft()) {
3905 Resource foundResource = latestByToscaName.left().value();
3906 // we don't allow updating names of top level types
3907 if (!isNestedResource && !StringUtils.equals(resource.getName(), foundResource.getName())) {
3908 BeEcompErrorManager.getInstance().logBeComponentMissingError("Create / Update resource by import",
3909 ComponentTypeEnum.RESOURCE.getValue(), resource.getName());
3910 log.debug("resource already exist new name={} old name={} same type={}", resource.getName(),
3911 foundResource.getName(), resource.getToscaResourceName());
3912 final ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESOURCE_ALREADY_EXISTS);
3913 componentsUtils.auditResource(responseFormat, user, resource, AuditingActionEnum.IMPORT_RESOURCE);
3914 throwComponentException(responseFormat);
3916 result = updateExistingResourceByImport(resource, foundResource, user, isNormative, needLock, isNested);
3917 } else if (isNotFound(latestByToscaName)) {
3918 if (isNestedResource) {
3919 result = createOrUpdateNestedResource(resource, user, isNormative, isInTransaction, needLock, csarInfo,
3920 isNested, nodeName);
3922 result = createResourceByImport(resource, user, isNormative, isInTransaction, csarInfo);
3925 StorageOperationStatus status = latestByToscaName.right().value();
3926 log.debug("failed to get latest version of resource {}. status={}", resource.getName(), status);
3927 ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(componentsUtils
3928 .convertFromStorageResponse(latestByToscaName.right().value()), resource);
3929 componentsUtils.auditResource(responseFormat, user, resource, AuditingActionEnum.IMPORT_RESOURCE);
3930 throwComponentException(responseFormat);
3935 private boolean isNestedResourceUpdate(CsarInfo csarInfo, String nodeName) {
3936 return csarInfo != null && csarInfo.isUpdate() && nodeName != null;
3939 private ImmutablePair<Resource, ActionStatus> createOrUpdateNestedResource(final Resource resource,
3941 final boolean isNormative,
3942 final boolean isInTransaction,
3943 final boolean needLock,
3944 final CsarInfo csarInfo,
3945 final boolean isNested,
3946 final String nodeName) {
3947 final Either<Component, StorageOperationStatus> latestByToscaName = toscaOperationFacade
3948 .getLatestByToscaResourceName(buildNestedToscaResourceName(resource.getResourceType()
3949 .name(), csarInfo.getVfResourceName(), nodeName).getRight());
3950 if (latestByToscaName.isLeft()) {
3951 final Resource nestedResource = (Resource) latestByToscaName.left().value();
3952 log.debug(VALIDATE_DERIVED_BEFORE_UPDATE);
3953 final Either<Boolean, ResponseFormat> eitherValidation = validateNestedDerivedFromDuringUpdate(nestedResource,
3954 resource, ValidationUtils.hasBeenCertified(nestedResource.getVersion()));
3955 if (eitherValidation.isRight()) {
3956 return createResourceByImport(resource, user, isNormative, isInTransaction, csarInfo);
3958 return updateExistingResourceByImport(resource, nestedResource, user, isNormative, needLock, isNested);
3960 return createResourceByImport(resource, user, isNormative, isInTransaction, csarInfo);
3964 private boolean isNotFound(Either<Resource, StorageOperationStatus> getResourceEither) {
3965 return getResourceEither.isRight() && getResourceEither.right()
3966 .value() == StorageOperationStatus.NOT_FOUND;
3969 private ImmutablePair<Resource, ActionStatus> createResourceByImport(Resource resource, User user,
3970 boolean isNormative, boolean isInTransaction, CsarInfo csarInfo) {
3971 log.debug("resource with name {} does not exist. create new resource", resource.getName());
3972 validateResourceBeforeCreate(resource, user, AuditingActionEnum.IMPORT_RESOURCE, isInTransaction, csarInfo);
3973 final Resource createResourceByDao = createResourceByDao(resource, user, AuditingActionEnum.IMPORT_RESOURCE, isNormative,
3975 Resource createdResource = updateCatalog(createResourceByDao, ChangeTypeEnum.LIFECYCLE).left().map(r -> (Resource)r).left().value();
3976 ImmutablePair<Resource, ActionStatus> resourcePair = new ImmutablePair<>(createdResource, ActionStatus.CREATED);
3977 ASDCKpiApi.countImportResourcesKPI();
3978 return resourcePair;
3981 public boolean isResourceExist(String resourceName) {
3982 Either<Resource, StorageOperationStatus> latestByName = toscaOperationFacade.getLatestByName(resourceName);
3983 return latestByName.isLeft();
3986 private ImmutablePair<Resource, ActionStatus> updateExistingResourceByImport(Resource newResource,
3987 Resource oldResource, User user, boolean inTransaction, boolean needLock, boolean isNested) {
3988 String lockedResourceId = oldResource.getUniqueId();
3989 log.debug("found resource: name={}, id={}, version={}, state={}", oldResource.getName(), lockedResourceId,
3990 oldResource.getVersion(), oldResource.getLifecycleState());
3991 ImmutablePair<Resource, ActionStatus> resourcePair = null;
3993 lockComponent(lockedResourceId, oldResource, needLock, "Update Resource by Import");
3994 oldResource = prepareResourceForUpdate(oldResource, newResource, user, inTransaction, false);
3995 mergeOldResourceMetadataWithNew(oldResource, newResource);
3997 validateResourceFieldsBeforeUpdate(oldResource, newResource, inTransaction, isNested);
3998 validateCapabilityTypesCreate(user, getCapabilityTypeOperation(), newResource, AuditingActionEnum.IMPORT_RESOURCE, inTransaction);
3999 // contact info normalization
4000 newResource.setContactId(newResource.getContactId().toLowerCase());
4001 PropertyConstraintsUtils.validatePropertiesConstraints(newResource, oldResource);
4002 // non-updatable fields
4003 newResource.setCreatorUserId(user.getUserId());
4004 newResource.setCreatorFullName(user.getFullName());
4005 newResource.setLastUpdaterUserId(user.getUserId());
4006 newResource.setLastUpdaterFullName(user.getFullName());
4007 newResource.setUniqueId(oldResource.getUniqueId());
4008 newResource.setVersion(oldResource.getVersion());
4009 newResource.setInvariantUUID(oldResource.getInvariantUUID());
4010 newResource.setLifecycleState(oldResource.getLifecycleState());
4011 newResource.setUUID(oldResource.getUUID());
4012 newResource.setNormalizedName(oldResource.getNormalizedName());
4013 newResource.setSystemName(oldResource.getSystemName());
4014 if (oldResource.getCsarUUID() != null) {
4015 newResource.setCsarUUID(oldResource.getCsarUUID());
4017 if (oldResource.getImportedToscaChecksum() != null) {
4018 newResource.setImportedToscaChecksum(oldResource.getImportedToscaChecksum());
4020 newResource.setAbstract(oldResource.isAbstract());
4022 if (CollectionUtils.isEmpty(newResource.getDerivedFrom())){
4023 newResource.setDerivedFrom(oldResource.getDerivedFrom());
4025 if (CollectionUtils.isEmpty(newResource.getDataTypes())){
4026 newResource.setDataTypes(oldResource.getDataTypes());
4028 if (StringUtils.isEmpty(newResource.getDerivedFromGenericType())){
4029 newResource.setDerivedFromGenericType(oldResource.getDerivedFromGenericType());
4031 if (StringUtils.isEmpty(newResource.getDerivedFromGenericVersion())){
4032 newResource.setDerivedFromGenericVersion(oldResource.getDerivedFromGenericVersion());
4035 // created without tosca artifacts - add the placeholders
4036 if (MapUtils.isEmpty(newResource.getToscaArtifacts())){
4037 setToscaArtifactsPlaceHolders(newResource, user);
4040 if (MapUtils.isEmpty(newResource.getInterfaces())){
4041 newResource.setInterfaces(oldResource.getInterfaces());
4043 if (CollectionUtils.isEmpty(newResource.getAttributes())) {
4044 newResource.setAttributes(oldResource.getAttributes());
4047 if (CollectionUtils.isEmpty(newResource.getProperties())) {
4048 newResource.setProperties(oldResource.getProperties());
4051 Either<Resource, StorageOperationStatus> overrideResource = toscaOperationFacade.overrideComponent(newResource, oldResource);
4053 if (overrideResource.isRight()) {
4054 ResponseFormat responseFormat = componentsUtils
4055 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(overrideResource.right()
4056 .value()), newResource);
4057 componentsUtils.auditResource(responseFormat, user, newResource, AuditingActionEnum.IMPORT_RESOURCE);
4059 throwComponentException(responseFormat);
4061 updateCatalog(overrideResource.left()
4062 .value(), ChangeTypeEnum.LIFECYCLE);
4064 log.debug("Resource updated successfully!!!");
4065 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
4066 componentsUtils.auditResource(responseFormat, user, newResource, AuditingActionEnum.IMPORT_RESOURCE,
4067 ResourceVersionInfo.newBuilder()
4068 .state(oldResource.getLifecycleState()
4070 .version(oldResource.getVersion())
4073 resourcePair = new ImmutablePair<>(overrideResource.left()
4074 .value(), ActionStatus.OK);
4075 return resourcePair;
4077 if (resourcePair == null) {
4078 BeEcompErrorManager.getInstance()
4079 .logBeSystemError("Change LifecycleState - Certify");
4080 janusGraphDao.rollback();
4081 } else if (!inTransaction) {
4082 janusGraphDao.commit();
4085 log.debug("unlock resource {}", lockedResourceId);
4086 graphLockOperation.unlockComponent(lockedResourceId, NodeTypeEnum.Resource);
4093 * Merge old resource with new. Keep old category and vendor name without
4096 * @param oldResource
4097 * @param newResource
4099 private void mergeOldResourceMetadataWithNew(Resource oldResource, Resource newResource) {
4101 // keep old category and vendor name without change
4102 // merge the rest of the resource metadata
4103 if (newResource.getTags() == null || newResource.getTags().isEmpty()) {
4104 newResource.setTags(oldResource.getTags());
4107 if (newResource.getDescription() == null) {
4108 newResource.setDescription(oldResource.getDescription());
4111 if (newResource.getVendorRelease() == null) {
4112 newResource.setVendorRelease(oldResource.getVendorRelease());
4115 if (newResource.getResourceVendorModelNumber() == null) {
4116 newResource.setResourceVendorModelNumber(oldResource.getResourceVendorModelNumber());
4119 if (newResource.getContactId() == null) {
4120 newResource.setContactId(oldResource.getContactId());
4123 newResource.setCategories(oldResource.getCategories());
4124 if (newResource.getVendorName() == null) {
4125 newResource.setVendorName(oldResource.getVendorName());
4127 List<GroupDefinition>oldForUpdate = oldResource.getGroups();
4128 if(CollectionUtils.isNotEmpty(oldForUpdate)){
4129 List<GroupDefinition>groupForUpdate = oldForUpdate.stream().map(group -> new GroupDefinition(group)).collect(Collectors.toList());
4131 groupForUpdate.stream().filter(group -> group.isVspOriginated())
4132 .forEach(group -> group.setName(group.getInvariantName()));
4134 newResource.setGroups(groupForUpdate);
4138 if(newResource.getResourceType().isAtomicType() && !newResource.getName().equals("Root")&& newResource.getResourceType() != ResourceTypeEnum.CVFC) {
4139 ResourceTypeEnum updatedResourceType = newResource.getResourceType();
4140 Component derivedFromResource = getParentComponent(newResource);
4141 if (derivedFromResource.getComponentType() == ComponentTypeEnum.RESOURCE) {
4142 Resource parentResource = (Resource) derivedFromResource;
4143 if (!(parentResource.isAbstract() && (ResourceTypeEnum.VFC == parentResource.getResourceType() || ResourceTypeEnum.ABSTRACT == parentResource.getResourceType())) &&
4144 parentResource.getResourceType() != updatedResourceType && oldResource.getResourceType() != updatedResourceType) {
4145 BeEcompErrorManager.getInstance()
4146 .logInternalDataError("mergeOldResourceMetadataWithNew", "resource type of the resource does not match to derived from resource type",
4147 ErrorSeverity.ERROR);
4148 log.debug("#mergeOldResourceMetadataWithNew - resource type {} of the resource {} does not match to derived from resource type {}",
4149 newResource.getResourceType(), newResource.getToscaResourceName(), parentResource.getResourceType());
4150 throw new ByActionStatusComponentException(ActionStatus.INVALID_RESOURCE_TYPE);
4157 private Component getParentComponent(Resource newResource) {
4158 String toscaResourceNameDerivedFrom = newResource.getDerivedFrom().get(0);
4159 Either<Component, StorageOperationStatus> latestByToscaResourceName = toscaOperationFacade.getLatestByToscaResourceName(toscaResourceNameDerivedFrom);
4160 if(latestByToscaResourceName.isRight()){
4161 BeEcompErrorManager.getInstance()
4162 .logInternalDataError("mergeOldResourceMetadataWithNew", "derived from resource not found", ErrorSeverity.ERROR);
4163 log.debug("#mergeOldResourceMetadataWithNew - derived from resource {} not found", toscaResourceNameDerivedFrom);
4164 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_NOT_FOUND, toscaResourceNameDerivedFrom);
4166 return latestByToscaResourceName.left().value();
4169 private Resource prepareResourceForUpdate(Resource oldResource, Resource newResource, User user,
4170 boolean inTransaction, boolean needLock) {
4172 if (!ComponentValidationUtils.canWorkOnResource(oldResource, user.getUserId())) {
4174 return lifecycleBusinessLogic.changeState(oldResource.getUniqueId(), user, LifeCycleTransitionEnum.CHECKOUT,
4175 new LifecycleChangeInfoWithAction("update by import"), inTransaction, needLock)
4177 .on(response -> failOnChangeState(response, user, oldResource, newResource));
4182 private Resource failOnChangeState(ResponseFormat response, User user, Resource oldResource, Resource newResource) {
4183 log.info("resource {} cannot be updated. reason={}", oldResource.getUniqueId(), response.getFormattedMessage());
4184 componentsUtils.auditResource(response, user, newResource, AuditingActionEnum.IMPORT_RESOURCE,
4185 ResourceVersionInfo.newBuilder()
4186 .state(oldResource.getLifecycleState()
4188 .version(oldResource.getVersion())
4190 throw new ByResponseFormatComponentException(response);
4193 public Resource validateResourceBeforeCreate(Resource resource, User user, AuditingActionEnum actionEnum,
4194 boolean inTransaction, CsarInfo csarInfo) {
4196 validateResourceFieldsBeforeCreate(user, resource, actionEnum, inTransaction);
4197 validateCapabilityTypesCreate(user, getCapabilityTypeOperation(), resource, actionEnum, inTransaction);
4198 validateLifecycleTypesCreate(user, resource, actionEnum);
4199 validateResourceType(user, resource, actionEnum);
4200 resource.setCreatorUserId(user.getUserId());
4201 resource.setCreatorFullName(user.getFirstName() + " " + user.getLastName());
4202 resource.setContactId(resource.getContactId()
4204 if (StringUtils.isEmpty(resource.getToscaResourceName()) && !ModelConverter.isAtomicComponent(resource)) {
4205 String resourceSystemName;
4206 if (csarInfo != null && StringUtils.isNotEmpty(csarInfo.getVfResourceName())) {
4207 resourceSystemName = ValidationUtils.convertToSystemName(csarInfo.getVfResourceName());
4209 resourceSystemName = resource.getSystemName();
4211 resource.setToscaResourceName(CommonBeUtils
4212 .generateToscaResourceName(resource.getResourceType().name().toLowerCase(), resourceSystemName));
4215 // Generate invariant UUID - must be here and not in operation since it
4216 // should stay constant during clone
4218 String invariantUUID = UniqueIdBuilder.buildInvariantUUID();
4219 resource.setInvariantUUID(invariantUUID);
4224 private Either<Boolean, ResponseFormat> validateResourceType(User user, Resource resource,
4225 AuditingActionEnum actionEnum) {
4226 Either<Boolean, ResponseFormat> eitherResult = Either.left(true);
4227 if (resource.getResourceType() == null) {
4228 log.debug("Invalid resource type for resource");
4229 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT);
4230 eitherResult = Either.right(errorResponse);
4231 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
4233 return eitherResult;
4236 private Either<Boolean, ResponseFormat> validateLifecycleTypesCreate(User user, Resource resource,
4237 AuditingActionEnum actionEnum) {
4238 Either<Boolean, ResponseFormat> eitherResult = Either.left(true);
4239 if (resource.getInterfaces() != null && resource.getInterfaces()
4241 log.debug("validate interface lifecycle Types Exist");
4242 Iterator<InterfaceDefinition> intItr = resource.getInterfaces()
4245 while (intItr.hasNext() && eitherResult.isLeft()) {
4246 InterfaceDefinition interfaceDefinition = intItr.next();
4247 String intType = interfaceDefinition.getUniqueId();
4248 Either<InterfaceDefinition, StorageOperationStatus> eitherCapTypeFound = interfaceTypeOperation
4249 .getInterface(intType);
4250 if (eitherCapTypeFound.isRight()) {
4251 if (eitherCapTypeFound.right()
4252 .value() == StorageOperationStatus.NOT_FOUND) {
4253 BeEcompErrorManager.getInstance()
4254 .logBeGraphObjectMissingError("Create Resource - validateLifecycleTypesCreate",
4255 "Interface", intType);
4256 log.debug("Lifecycle Type: {} is required by resource: {} but does not exist in the DB",
4257 intType, resource.getName());
4258 BeEcompErrorManager.getInstance()
4259 .logBeDaoSystemError("Create Resource - validateLifecycleTypesCreate");
4260 log.debug("request to data model failed with error: {}", eitherCapTypeFound.right()
4265 ResponseFormat errorResponse = componentsUtils
4266 .getResponseFormat(ActionStatus.MISSING_LIFECYCLE_TYPE, intType);
4267 eitherResult = Either.right(errorResponse);
4268 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
4273 return eitherResult;
4276 private Either<Boolean, ResponseFormat> validateCapabilityTypesCreate(User user,
4277 ICapabilityTypeOperation capabilityTypeOperation, Resource resource, AuditingActionEnum actionEnum,
4278 boolean inTransaction) {
4280 Either<Boolean, ResponseFormat> eitherResult = Either.left(true);
4281 if (resource.getCapabilities() != null && resource.getCapabilities()
4283 log.debug("validate capability Types Exist - capabilities section");
4285 for (Entry<String, List<CapabilityDefinition>> typeEntry : resource.getCapabilities()
4288 eitherResult = validateCapabilityTypeExists(user, capabilityTypeOperation, resource, actionEnum,
4289 eitherResult, typeEntry, inTransaction);
4290 if (eitherResult.isRight()) {
4291 return Either.right(eitherResult.right()
4297 if (resource.getRequirements() != null && resource.getRequirements()
4299 log.debug("validate capability Types Exist - requirements section");
4300 for (String type : resource.getRequirements()
4302 eitherResult = validateCapabilityTypeExists(user, capabilityTypeOperation, resource,
4303 resource.getRequirements()
4305 actionEnum, eitherResult, type, inTransaction);
4306 if (eitherResult.isRight()) {
4307 return Either.right(eitherResult.right()
4313 return eitherResult;
4316 // @param typeObject- the object to which the validation is done
4317 private Either<Boolean, ResponseFormat> validateCapabilityTypeExists(User user,
4318 ICapabilityTypeOperation capabilityTypeOperation, Resource resource, List<?> validationObjects,
4319 AuditingActionEnum actionEnum, Either<Boolean, ResponseFormat> eitherResult, String type,
4320 boolean inTransaction) {
4321 Either<CapabilityTypeDefinition, StorageOperationStatus> eitherCapTypeFound = capabilityTypeOperation
4322 .getCapabilityType(type, inTransaction);
4323 if (eitherCapTypeFound.isRight()) {
4324 if (eitherCapTypeFound.right()
4325 .value() == StorageOperationStatus.NOT_FOUND) {
4326 BeEcompErrorManager.getInstance()
4327 .logBeGraphObjectMissingError(CREATE_RESOURCE_VALIDATE_CAPABILITY_TYPES, "Capability Type",
4329 log.debug("Capability Type: {} is required by resource: {} but does not exist in the DB", type,
4330 resource.getName());
4331 BeEcompErrorManager.getInstance()
4332 .logBeDaoSystemError(CREATE_RESOURCE_VALIDATE_CAPABILITY_TYPES);
4334 log.debug("Trying to get capability type {} failed with error: {}", type, eitherCapTypeFound.right()
4337 ResponseFormat errorResponse = null;
4339 errorResponse = componentsUtils.getResponseFormat(ActionStatus.MISSING_CAPABILITY_TYPE, type);
4341 errorResponse = componentsUtils.getResponseFormatByElement(ActionStatus.MISSING_CAPABILITY_TYPE,
4344 eitherResult = Either.right(errorResponse);
4345 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
4347 return eitherResult;
4350 private Either<Boolean, ResponseFormat> validateCapabilityTypeExists(User user,
4351 ICapabilityTypeOperation capabilityTypeOperation, Resource resource, AuditingActionEnum actionEnum,
4352 Either<Boolean, ResponseFormat> eitherResult, Entry<String, List<CapabilityDefinition>> typeEntry,
4353 boolean inTransaction) {
4354 Either<CapabilityTypeDefinition, StorageOperationStatus> eitherCapTypeFound = capabilityTypeOperation
4355 .getCapabilityType(typeEntry.getKey(), inTransaction);
4356 if (eitherCapTypeFound.isRight()) {
4357 if (eitherCapTypeFound.right().value() == StorageOperationStatus.NOT_FOUND) {
4358 BeEcompErrorManager.getInstance()
4359 .logBeGraphObjectMissingError(CREATE_RESOURCE_VALIDATE_CAPABILITY_TYPES, "Capability Type",
4360 typeEntry.getKey());
4361 log.debug("Capability Type: {} is required by resource: {} but does not exist in the DB",
4362 typeEntry.getKey(), resource.getName());
4363 BeEcompErrorManager.getInstance().logBeDaoSystemError(CREATE_RESOURCE_VALIDATE_CAPABILITY_TYPES);
4365 log.debug("Trying to get capability type {} failed with error: {}", typeEntry.getKey(),
4366 eitherCapTypeFound.right().value().name());
4367 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.MISSING_CAPABILITY_TYPE,
4368 typeEntry.getKey());
4369 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
4370 return Either.right(errorResponse);
4372 CapabilityTypeDefinition capabilityTypeDefinition = eitherCapTypeFound.left().value();
4373 if (capabilityTypeDefinition.getProperties() != null) {
4374 for (CapabilityDefinition capDef : typeEntry.getValue()) {
4375 List<ComponentInstanceProperty> properties = capDef.getProperties();
4376 List<ComponentInstanceProperty> changedProperties = new ArrayList<>();
4377 if (properties == null || properties.isEmpty()) {
4378 for (Entry<String, PropertyDefinition> prop : capabilityTypeDefinition.getProperties().entrySet()) {
4379 ComponentInstanceProperty newProp = new ComponentInstanceProperty(prop.getValue());
4380 changedProperties.add(newProp);
4383 List<ComponentInstanceProperty> propsToAdd = new ArrayList<>();
4384 for (Entry<String, PropertyDefinition> prop : capabilityTypeDefinition.getProperties().entrySet()) {
4385 PropertyDefinition propFromDef = prop.getValue();
4386 boolean propFound = false;
4387 for (ComponentInstanceProperty cip : properties) {
4388 if (propFromDef.getName().equals(cip.getName())) {
4389 //merge property value and property description only, ignore other fields
4390 if(cip.getDescription() != null && !cip.getDescription().equals(propFromDef.getDescription())){
4391 propFromDef.setDescription(cip.getDescription());
4393 propertyDataValueMergeBusinessLogic.mergePropertyValue(propFromDef, cip, new ArrayList<>());
4394 if(cip.getValue() != null){
4395 propFromDef.setValue(cip.getValue());
4397 propsToAdd.add(new ComponentInstanceProperty(propFromDef));
4399 properties.remove(cip);
4404 propsToAdd.add(new ComponentInstanceProperty(propFromDef));
4407 if (!propsToAdd.isEmpty()) {
4408 changedProperties.addAll(propsToAdd);
4411 capDef.setProperties(changedProperties);
4414 return eitherResult;
4417 public Resource createResourceByDao(Resource resource, User user, AuditingActionEnum actionEnum,
4418 boolean isNormative, boolean inTransaction) {
4421 // lock new resource name in order to avoid creation resource with same
4423 Resource createdResource = null;
4424 if (!inTransaction) {
4425 Either<Boolean, ResponseFormat> lockResult = lockComponentByName(resource.getSystemName(), resource,
4427 if (lockResult.isRight()) {
4428 ResponseFormat responseFormat = lockResult.right().value();
4429 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
4430 throw new ByResponseFormatComponentException(responseFormat);
4433 log.debug("name is locked {} status = {}", resource.getSystemName(), lockResult);
4436 if (resource.deriveFromGeneric()) {
4437 handleResourceGenericType(resource);
4439 createdResource = createResourceTransaction(resource, user, isNormative);
4440 componentsUtils.auditResource(componentsUtils.getResponseFormat(ActionStatus.CREATED), user,
4441 createdResource, actionEnum);
4442 ASDCKpiApi.countCreatedResourcesKPI();
4443 } catch (ComponentException e) {
4444 ResponseFormat responseFormat = e.getResponseFormat() == null
4445 ? componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams()) : e.getResponseFormat();
4446 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
4448 } catch (StorageException e) {
4449 ResponseFormat responseFormat = componentsUtils
4450 .getResponseFormat(componentsUtils.convertFromStorageResponse(e.getStorageOperationStatus()));
4451 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
4454 if (!inTransaction) {
4455 graphLockOperation.unlockComponentByName(resource.getSystemName(), resource.getUniqueId(),
4456 NodeTypeEnum.Resource);
4459 return createdResource;
4462 private Resource createResourceTransaction(Resource resource, User user, boolean isNormative) {
4463 // validate resource name uniqueness
4464 log.debug("validate resource name");
4465 Either<Boolean, StorageOperationStatus> eitherValidation = toscaOperationFacade.validateComponentNameExists(
4466 resource.getName(), resource.getResourceType(), resource.getComponentType());
4467 if (eitherValidation.isRight()) {
4468 loggerSupportability.log(LoggerSupportabilityActions.VALIDATE_NAME,resource.getComponentMetadataForSupportLog(),
4469 StatusCode.ERROR,"ERROR while validate component name {} Status is: {}",resource.getName(),eitherValidation.right().value());
4470 log.debug("Failed to validate component name {}. Status is {}. ", resource.getName(),
4471 eitherValidation.right()
4473 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(eitherValidation.right()
4476 if (eitherValidation.left()
4478 log.debug("resource with name: {}, already exists", resource.getName());
4479 loggerSupportability.log(LoggerSupportabilityActions.CREATE_RESOURCE_FROM_YAML,resource.getComponentMetadataForSupportLog(),
4480 StatusCode.ERROR,"resource with name: {} already exists",resource.getName());
4481 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_NAME_ALREADY_EXIST,
4482 ComponentTypeEnum.RESOURCE.getValue(), resource.getName());
4485 log.debug("send resource {} to dao for create", resource.getName());
4487 createArtifactsPlaceHolderData(resource, user);
4490 log.debug("enrich resource with creator, version and state");
4491 resource.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
4492 resource.setVersion(INITIAL_VERSION);
4493 resource.setHighestVersion(true);
4494 if (resource.getResourceType() != null && resource.getResourceType() != ResourceTypeEnum.CVFC) {
4495 resource.setAbstract(false);
4498 return toscaOperationFacade.createToscaComponent(resource)
4500 .on(r -> throwComponentExceptionByResource(r, resource));
4503 private Resource throwComponentExceptionByResource(StorageOperationStatus status, Resource resource) {
4504 ResponseFormat responseFormat = componentsUtils
4505 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(status), resource);
4506 throw new ByResponseFormatComponentException(responseFormat);
4509 private void createArtifactsPlaceHolderData(Resource resource, User user) {
4510 // create mandatory artifacts
4512 // TODO it must be removed after that artifact uniqueId creation will be
4513 // moved to ArtifactOperation
4515 setInformationalArtifactsPlaceHolder(resource, user);
4516 setDeploymentArtifactsPlaceHolder(resource, user);
4517 setToscaArtifactsPlaceHolders(resource, user);
4520 @SuppressWarnings("unchecked")
4522 public void setDeploymentArtifactsPlaceHolder(Component component, User user) {
4523 Resource resource = (Resource) component;
4524 Map<String, ArtifactDefinition> artifactMap = resource.getDeploymentArtifacts();
4525 if (artifactMap == null) {
4526 artifactMap = new HashMap<>();
4528 Map<String, Object> deploymentResourceArtifacts = ConfigurationManager.getConfigurationManager()
4530 .getDeploymentResourceArtifacts();
4531 if (deploymentResourceArtifacts != null) {
4532 Map<String, ArtifactDefinition> finalArtifactMap = artifactMap;
4533 deploymentResourceArtifacts
4534 .forEach((k, v) -> processDeploymentResourceArtifacts(user, resource, finalArtifactMap, k, v));
4536 resource.setDeploymentArtifacts(artifactMap);
4539 private void processDeploymentResourceArtifacts(User user, Resource resource,
4540 Map<String, ArtifactDefinition> artifactMap, String k, Object v) {
4541 Map<String, Object> artifactDetails = (Map<String, Object>) v;
4542 Object object = artifactDetails.get(PLACE_HOLDER_RESOURCE_TYPES);
4543 if (object != null) {
4544 List<String> artifactTypes = (List<String>) object;
4545 if (!artifactTypes.contains(resource.getResourceType()
4550 log.info("resource types for artifact placeholder {} were not defined. default is all resources", k);
4552 if (artifactsBusinessLogic != null) {
4553 ArtifactDefinition artifactDefinition = artifactsBusinessLogic.createArtifactPlaceHolderInfo(
4554 resource.getUniqueId(), k, (Map<String, Object>) v, user, ArtifactGroupTypeEnum.DEPLOYMENT);
4555 if (artifactDefinition != null && !artifactMap.containsKey(artifactDefinition.getArtifactLabel())) {
4556 artifactMap.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
4561 @SuppressWarnings("unchecked")
4562 private void setInformationalArtifactsPlaceHolder(Resource resource, User user) {
4563 Map<String, ArtifactDefinition> artifactMap = resource.getArtifacts();
4564 if (artifactMap == null) {
4565 artifactMap = new HashMap<>();
4567 String resourceUniqueId = resource.getUniqueId();
4568 List<String> exludeResourceCategory = ConfigurationManager.getConfigurationManager()
4570 .getExcludeResourceCategory();
4571 List<String> exludeResourceType = ConfigurationManager.getConfigurationManager()
4573 .getExcludeResourceType();
4574 Map<String, Object> informationalResourceArtifacts = ConfigurationManager.getConfigurationManager()
4576 .getInformationalResourceArtifacts();
4577 List<CategoryDefinition> categories = resource.getCategories();
4578 boolean isCreateArtifact = true;
4579 if (exludeResourceCategory != null) {
4580 String category = categories.get(0)
4582 isCreateArtifact = exludeResourceCategory.stream()
4583 .noneMatch(e -> e.equalsIgnoreCase(category));
4585 if (isCreateArtifact && exludeResourceType != null) {
4586 String resourceType = resource.getResourceType()
4588 isCreateArtifact = exludeResourceType.stream()
4589 .noneMatch(e -> e.equalsIgnoreCase(resourceType));
4591 if (informationalResourceArtifacts != null && isCreateArtifact) {
4592 Set<String> keys = informationalResourceArtifacts.keySet();
4593 for (String informationalResourceArtifactName : keys) {
4594 Map<String, Object> artifactInfoMap = (Map<String, Object>) informationalResourceArtifacts
4595 .get(informationalResourceArtifactName);
4596 ArtifactDefinition artifactDefinition = artifactsBusinessLogic.createArtifactPlaceHolderInfo(
4597 resourceUniqueId, informationalResourceArtifactName, artifactInfoMap, user,
4598 ArtifactGroupTypeEnum.INFORMATIONAL);
4599 artifactMap.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
4603 resource.setArtifacts(artifactMap);
4613 public ResponseFormat deleteResource(String resourceId, User user) {
4614 ResponseFormat responseFormat;
4615 validateUserExists(user);
4617 Either<Resource, StorageOperationStatus> resourceStatus = toscaOperationFacade.getToscaElement(resourceId);
4618 if (resourceStatus.isRight()) {
4619 log.debug("failed to get resource {}", resourceId);
4620 return componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(resourceStatus.right()
4624 Resource resource = resourceStatus.left()
4627 StorageOperationStatus result = StorageOperationStatus.OK;
4628 lockComponent(resourceId, resource, "Mark resource to delete");
4631 result = markComponentToDelete(resource);
4632 if (result == StorageOperationStatus.OK) {
4633 responseFormat = componentsUtils.getResponseFormat(ActionStatus.NO_CONTENT);
4635 ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(result);
4636 responseFormat = componentsUtils.getResponseFormatByResource(actionStatus, resource.getName());
4638 return responseFormat;
4641 if (result == null || result != StorageOperationStatus.OK) {
4642 janusGraphDao.rollback();
4644 janusGraphDao.commit();
4646 graphLockOperation.unlockComponent(resourceId, NodeTypeEnum.Resource);
4651 public ResponseFormat deleteResourceByNameAndVersion(String resourceName, String version, User user) {
4652 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.NO_CONTENT);
4653 validateUserExists(user);
4654 Resource resource = null;
4655 StorageOperationStatus result = StorageOperationStatus.OK;
4656 boolean failed = false;
4659 Either<Resource, StorageOperationStatus> resourceStatus = toscaOperationFacade
4660 .getComponentByNameAndVersion(ComponentTypeEnum.RESOURCE, resourceName, version);
4661 if (resourceStatus.isRight()) {
4662 log.debug("failed to get resource {} version {}", resourceName, version);
4663 return componentsUtils
4664 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(resourceStatus.right()
4665 .value()), resourceName);
4668 resource = resourceStatus.left()
4672 janusGraphDao.commit();
4674 if (resource != null) {
4675 lockComponent(resource.getUniqueId(), resource, DELETE_RESOURCE);
4677 result = markComponentToDelete(resource);
4678 if (result != StorageOperationStatus.OK) {
4679 ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(result);
4680 responseFormat = componentsUtils.getResponseFormatByResource(actionStatus, resource.getName());
4681 return responseFormat;
4683 }catch (ComponentException e){
4687 if (failed || result == null || result != StorageOperationStatus.OK) {
4688 janusGraphDao.rollback();
4690 janusGraphDao.commit();
4692 graphLockOperation.unlockComponent(resource.getUniqueId(), NodeTypeEnum.Resource);
4695 return responseFormat;
4698 public Either<Resource, ResponseFormat> getResource(String resourceId, User user) {
4701 validateUserExists(user);
4704 Either<Resource, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(resourceId);
4705 if (storageStatus.isRight()) {
4706 log.debug("failed to get resource by id {}", resourceId);
4707 return Either.right(componentsUtils
4708 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(storageStatus.right()
4709 .value()), resourceId));
4711 if (!(storageStatus.left()
4712 .value() instanceof Resource)) {
4713 return Either.right(componentsUtils.getResponseFormatByResource(
4714 componentsUtils.convertFromStorageResponse(StorageOperationStatus.NOT_FOUND), resourceId));
4716 return Either.left(storageStatus.left()
4721 public Either<Resource, ResponseFormat> getResourceByNameAndVersion(String resourceName, String resourceVersion,
4724 validateUserExists(userId);
4726 Either<Resource, StorageOperationStatus> getResource = toscaOperationFacade
4727 .getComponentByNameAndVersion(ComponentTypeEnum.RESOURCE, resourceName, resourceVersion);
4728 if (getResource.isRight()) {
4729 log.debug("failed to get resource by name {} and version {}", resourceName, resourceVersion);
4730 return Either.right(componentsUtils
4731 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(getResource.right()
4732 .value()), resourceName));
4734 return Either.left(getResource.left()
4739 * updateResourceMetadata
4742 * - modifier data (userId)
4743 * @param inTransaction
4745 * @param resourceIdToUpdate
4746 * - the resource identifier
4747 * @param newResource
4748 * @return Either<Resource , responseFormat>
4750 public Resource updateResourceMetadata(String resourceIdToUpdate, Resource newResource, Resource currentResource,
4751 User user, boolean inTransaction) {
4753 validateUserExists(user.getUserId());
4755 log.debug("Get resource with id {}", resourceIdToUpdate);
4756 boolean needToUnlock = false;
4759 if (currentResource == null) {
4760 Either<Resource, StorageOperationStatus> storageStatus = toscaOperationFacade
4761 .getToscaElement(resourceIdToUpdate);
4762 if (storageStatus.isRight()) {
4763 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormatByResource(
4764 componentsUtils.convertFromStorageResponse(storageStatus.right()
4769 currentResource = storageStatus.left()
4772 // verify that resource is checked-out and the user is the last
4774 if (!ComponentValidationUtils.canWorkOnResource(currentResource, user.getUserId())) {
4775 throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
4779 StorageOperationStatus lockResult = graphLockOperation.lockComponent(resourceIdToUpdate,
4780 NodeTypeEnum.Resource);
4781 if (lockResult != StorageOperationStatus.OK) {
4782 BeEcompErrorManager.getInstance()
4783 .logBeFailedLockObjectError("Upload Artifact - lock ", NodeTypeEnum.Resource.getName(),
4784 resourceIdToUpdate);
4785 log.debug("Failed to lock resource: {}, error - {}", resourceIdToUpdate, lockResult);
4786 ResponseFormat responseFormat = componentsUtils
4787 .getResponseFormat(componentsUtils.convertFromStorageResponse(lockResult));
4788 throw new ByResponseFormatComponentException(responseFormat);
4791 needToUnlock = true;
4793 // critical section starts here
4794 // convert json to object
4796 // Update and updated resource must have a non-empty "derivedFrom"
4798 // This code is not called from import resources, because of root
4799 // VF "derivedFrom" should be null (or ignored)
4800 if (ModelConverter.isAtomicComponent(currentResource)) {
4801 validateDerivedFromNotEmpty(null, newResource, null);
4802 validateDerivedFromNotEmpty(null, currentResource, null);
4804 newResource.setDerivedFrom(null);
4807 Either<Resource, ResponseFormat> dataModelResponse = updateResourceMetadata(resourceIdToUpdate, newResource,
4808 user, currentResource, false, true);
4809 if (dataModelResponse.isRight()) {
4810 log.debug("failed to update resource metadata!!!");
4811 throw new ByResponseFormatComponentException(dataModelResponse.right().value());
4814 log.debug("Resource metadata updated successfully!!!");
4815 return dataModelResponse.left()
4818 } catch (ComponentException | StorageException e) {
4819 rollback(inTransaction, newResource, null, null);
4822 if (!inTransaction) {
4823 janusGraphDao.commit();
4826 graphLockOperation.unlockComponent(resourceIdToUpdate, NodeTypeEnum.Resource);
4831 private Either<Resource, ResponseFormat> updateResourceMetadata(String resourceIdToUpdate, Resource newResource,
4832 User user, Resource currentResource, boolean shouldLock, boolean inTransaction) {
4833 updateVfModuleGroupsNames(currentResource, newResource);
4834 validateResourceFieldsBeforeUpdate(currentResource, newResource, inTransaction, false);
4835 // Setting last updater and uniqueId
4836 newResource.setContactId(newResource.getContactId()
4838 newResource.setLastUpdaterUserId(user.getUserId());
4839 newResource.setUniqueId(resourceIdToUpdate);
4840 // Cannot set highest version through UI
4841 newResource.setHighestVersion(currentResource.isHighestVersion());
4842 newResource.setCreationDate(currentResource.getCreationDate());
4844 Either<Boolean, ResponseFormat> processUpdateOfDerivedFrom = processUpdateOfDerivedFrom(currentResource,
4845 newResource, user.getUserId(), inTransaction);
4847 if (processUpdateOfDerivedFrom.isRight()) {
4848 log.debug("Couldn't update derived from for resource {}", resourceIdToUpdate);
4849 return Either.right(processUpdateOfDerivedFrom.right()
4853 log.debug("send resource {} to dao for update", newResource.getUniqueId());
4854 if (isNotEmpty(newResource.getGroups())) {
4855 for (GroupDefinition group : newResource.getGroups()) {
4856 if (DEFAULT_GROUP_VF_MODULE.equals(group.getType())) {
4857 groupBusinessLogic.validateAndUpdateGroupMetadata(newResource.getComponentMetadataDefinition()
4858 .getMetadataDataDefinition()
4859 .getUniqueId(), user, newResource.getComponentType(), group, true, false);
4863 Either<Resource, StorageOperationStatus> dataModelResponse = toscaOperationFacade
4864 .updateToscaElement(newResource);
4866 if (dataModelResponse.isRight()) {
4867 ResponseFormat responseFormat = componentsUtils
4868 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(dataModelResponse.right()
4869 .value()), newResource);
4870 return Either.right(responseFormat);
4871 } else if (dataModelResponse.left()
4873 log.debug("No response from updateResource");
4874 return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
4876 return Either.left(dataModelResponse.left()
4880 private void updateVfModuleGroupsNames(Resource currentResource, Resource newResource) {
4881 if (currentResource.getGroups() != null && !currentResource.getName()
4882 .equals(newResource.getName())) {
4883 List<GroupDefinition> updatedGroups = currentResource.getGroups()
4885 .map(group -> getUpdatedGroup(group, currentResource.getName(), newResource.getName()))
4887 newResource.setGroups(updatedGroups);
4891 private GroupDefinition getUpdatedGroup(GroupDefinition currGroup, String replacePattern, String with) {
4892 GroupDefinition updatedGroup = new GroupDefinition(currGroup);
4893 if (updatedGroup.isSamePrefix(replacePattern) && updatedGroup.getType()
4894 .equals(DEFAULT_GROUP_VF_MODULE)) {
4895 String prefix = updatedGroup.getName()
4896 .substring(0, replacePattern.length());
4897 String newGroupName = updatedGroup.getName()
4898 .replaceFirst(prefix, with);
4899 updatedGroup.setName(newGroupName);
4901 return updatedGroup;
4905 * validateResourceFieldsBeforeCreate
4908 * - modifier data (userId)
4910 private void validateResourceFieldsBeforeCreate(User user, Resource resource,
4911 AuditingActionEnum actionEnum, boolean inTransaction) {
4912 componentValidator.validate(user, resource, actionEnum);
4913 // validate category
4914 log.debug("validate category");
4915 validateCategory(user, resource, actionEnum, inTransaction);
4916 // validate vendor name & release & model number
4917 log.debug("validate vendor name");
4918 validateVendorName(user, resource, actionEnum);
4919 log.debug("validate vendor release");
4920 validateVendorReleaseName(user, resource, actionEnum);
4921 log.debug("validate resource vendor model number");
4922 validateResourceVendorModelNumber(user, resource, actionEnum);
4924 log.debug("validate cost");
4925 validateCost(resource);
4926 // validate licenseType
4927 log.debug("validate licenseType");
4928 validateLicenseType(user, resource, actionEnum);
4929 // validate template (derived from)
4930 log.debug("validate derived from");
4931 if (!ModelConverter.isAtomicComponent(resource) && resource.getResourceType() != ResourceTypeEnum.CVFC) {
4932 resource.setDerivedFrom(null);
4934 validateDerivedFromExist(user, resource, actionEnum);
4935 // warn about non-updatable fields
4936 checkComponentFieldsForOverrideAttempt(resource);
4937 String currentCreatorFullName = resource.getCreatorFullName();
4938 if (currentCreatorFullName != null) {
4939 log.debug("Resource Creator fullname is automatically set and cannot be updated");
4942 String currentLastUpdaterFullName = resource.getLastUpdaterFullName();
4943 if (currentLastUpdaterFullName != null) {
4944 log.debug("Resource LastUpdater fullname is automatically set and cannot be updated");
4947 Long currentLastUpdateDate = resource.getLastUpdateDate();
4948 if (currentLastUpdateDate != null) {
4949 log.debug("Resource last update date is automatically set and cannot be updated");
4952 Boolean currentAbstract = resource.isAbstract();
4953 if (currentAbstract != null) {
4954 log.debug("Resource abstract is automatically set and cannot be updated");
4959 * validateResourceFieldsBeforeUpdate
4961 * @param currentResource
4962 * - Resource object to validate
4965 private void validateResourceFieldsBeforeUpdate(Resource currentResource, Resource updateInfoResource,
4966 boolean inTransaction, boolean isNested) {
4967 validateFields(currentResource, updateInfoResource, inTransaction, isNested);
4968 warnNonEditableFields(currentResource, updateInfoResource);
4971 private void warnNonEditableFields(Resource currentResource, Resource updateInfoResource) {
4972 String currentResourceVersion = currentResource.getVersion();
4973 String updatedResourceVersion = updateInfoResource.getVersion();
4975 if ((updatedResourceVersion != null) && (!updatedResourceVersion.equals(currentResourceVersion))) {
4976 log.debug("Resource version is automatically set and cannot be updated");
4979 String currentCreatorUserId = currentResource.getCreatorUserId();
4980 String updatedCreatorUserId = updateInfoResource.getCreatorUserId();
4982 if ((updatedCreatorUserId != null) && (!updatedCreatorUserId.equals(currentCreatorUserId))) {
4983 log.debug("Resource Creator UserId is automatically set and cannot be updated");
4986 String currentCreatorFullName = currentResource.getCreatorFullName();
4987 String updatedCreatorFullName = updateInfoResource.getCreatorFullName();
4989 if ((updatedCreatorFullName != null) && (!updatedCreatorFullName.equals(currentCreatorFullName))) {
4990 log.debug("Resource Creator fullname is automatically set and cannot be updated");
4993 String currentLastUpdaterUserId = currentResource.getLastUpdaterUserId();
4994 String updatedLastUpdaterUserId = updateInfoResource.getLastUpdaterUserId();
4996 if ((updatedLastUpdaterUserId != null) && (!updatedLastUpdaterUserId.equals(currentLastUpdaterUserId))) {
4997 log.debug("Resource LastUpdater userId is automatically set and cannot be updated");
5000 String currentLastUpdaterFullName = currentResource.getLastUpdaterFullName();
5001 String updatedLastUpdaterFullName = updateInfoResource.getLastUpdaterFullName();
5003 if ((updatedLastUpdaterFullName != null) && (!updatedLastUpdaterFullName.equals(currentLastUpdaterFullName))) {
5004 log.debug("Resource LastUpdater fullname is automatically set and cannot be updated");
5006 Long currentCreationDate = currentResource.getCreationDate();
5007 Long updatedCreationDate = updateInfoResource.getCreationDate();
5009 if ((updatedCreationDate != null) && (!updatedCreationDate.equals(currentCreationDate))) {
5010 log.debug("Resource Creation date is automatically set and cannot be updated");
5013 Long currentLastUpdateDate = currentResource.getLastUpdateDate();
5014 Long updatedLastUpdateDate = updateInfoResource.getLastUpdateDate();
5016 if ((updatedLastUpdateDate != null) && (!updatedLastUpdateDate.equals(currentLastUpdateDate))) {
5017 log.debug("Resource last update date is automatically set and cannot be updated");
5020 LifecycleStateEnum currentLifecycleState = currentResource.getLifecycleState();
5021 LifecycleStateEnum updatedLifecycleState = updateInfoResource.getLifecycleState();
5023 if ((updatedLifecycleState != null) && (!updatedLifecycleState.equals(currentLifecycleState))) {
5024 log.debug("Resource lifecycle state date is automatically set and cannot be updated");
5027 Boolean currentAbstract = currentResource.isAbstract();
5028 Boolean updatedAbstract = updateInfoResource.isAbstract();
5030 if ((updatedAbstract != null) && (!updatedAbstract.equals(currentAbstract))) {
5031 log.debug("Resource abstract is automatically set and cannot be updated");
5034 Boolean currentHighestVersion = currentResource.isHighestVersion();
5035 Boolean updatedHighestVersion = updateInfoResource.isHighestVersion();
5037 if ((updatedHighestVersion != null) && (!updatedHighestVersion.equals(currentHighestVersion))) {
5038 log.debug("Resource highest version is automatically set and cannot be updated");
5041 String currentUuid = currentResource.getUUID();
5042 String updatedUuid = updateInfoResource.getUUID();
5044 if ((updatedUuid != null) && (!updatedUuid.equals(currentUuid))) {
5045 log.debug("Resource UUID is automatically set and cannot be updated");
5048 log.debug("Resource Type cannot be updated");
5049 String currentInvariantUuid = currentResource.getInvariantUUID();
5050 String updatedInvariantUuid = updateInfoResource.getInvariantUUID();
5052 if ((updatedInvariantUuid != null) && (!updatedInvariantUuid.equals(currentInvariantUuid))) {
5053 log.debug("Resource invariant UUID is automatically set and cannot be updated");
5054 updateInfoResource.setInvariantUUID(currentInvariantUuid);
5058 private void validateFields(Resource currentResource, Resource updateInfoResource, boolean inTransaction,
5060 boolean hasBeenCertified = ValidationUtils.hasBeenCertified(currentResource.getVersion());
5061 log.debug("validate resource name before update");
5062 validateResourceName(currentResource, updateInfoResource, hasBeenCertified, isNested);
5063 log.debug("validate description before update");
5064 componentDescriptionValidator.validateAndCorrectField(null, updateInfoResource, null);
5065 log.debug("validate icon before update");
5066 validateIcon(currentResource, updateInfoResource, hasBeenCertified);
5067 log.debug("validate tags before update");
5068 componentTagsValidator.validateAndCorrectField(null, updateInfoResource, null);
5069 log.debug("validate vendor name before update");
5070 validateVendorName(null, updateInfoResource, null);
5071 log.debug("validate resource vendor model number before update");
5072 validateResourceVendorModelNumber(currentResource, updateInfoResource);
5073 log.debug("validate vendor release before update");
5074 validateVendorReleaseName(null, updateInfoResource, null);
5075 log.debug("validate contact info before update");
5076 componentContactIdValidator.validateAndCorrectField(null, updateInfoResource, null);
5077 log.debug(VALIDATE_DERIVED_BEFORE_UPDATE);
5078 validateDerivedFromDuringUpdate(currentResource, updateInfoResource, hasBeenCertified);
5079 log.debug("validate category before update");
5080 validateCategory(currentResource, updateInfoResource, hasBeenCertified, inTransaction);
5083 private boolean isResourceNameEquals(Resource currentResource, Resource updateInfoResource) {
5084 String resourceNameUpdated = updateInfoResource.getName();
5085 String resourceNameCurrent = currentResource.getName();
5086 if (resourceNameCurrent.equals(resourceNameUpdated)) {
5089 // In case of CVFC type we should support the case of old VF with CVFC
5090 // instances that were created without the "Cvfc" suffix
5091 return currentResource.getResourceType() == ResourceTypeEnum.CVFC
5092 && resourceNameUpdated.equals(addCvfcSuffixToResourceName(resourceNameCurrent));
5095 private String addCvfcSuffixToResourceName(String resourceName) {
5096 return resourceName + "Cvfc";
5099 private void validateResourceName(Resource currentResource, Resource updateInfoResource, boolean hasBeenCertified,
5101 String resourceNameUpdated = updateInfoResource.getName();
5102 if (!isResourceNameEquals(currentResource, updateInfoResource)) {
5103 if (isNested || !hasBeenCertified) {
5104 componentNameValidator.validateAndCorrectField(null, updateInfoResource, null);
5105 validateResourceNameUniqueness(updateInfoResource);
5106 currentResource.setName(resourceNameUpdated);
5107 currentResource.setNormalizedName(ValidationUtils.normaliseComponentName(resourceNameUpdated));
5108 currentResource.setSystemName(ValidationUtils.convertToSystemName(resourceNameUpdated));
5111 log.info("Resource name: {}, cannot be updated once the resource has been certified once.",
5112 resourceNameUpdated);
5113 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_NAME_CANNOT_BE_CHANGED);
5118 private void validateIcon(Resource currentResource, Resource updateInfoResource, boolean hasBeenCertified) {
5119 String iconUpdated = updateInfoResource.getIcon();
5120 String iconCurrent = currentResource.getIcon();
5121 if (!iconCurrent.equals(iconUpdated)) {
5122 if (!hasBeenCertified) {
5123 componentIconValidator.validateAndCorrectField(null, updateInfoResource, null);
5125 log.info("Icon {} cannot be updated once the resource has been certified once.", iconUpdated);
5126 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_ICON_CANNOT_BE_CHANGED);
5131 private void validateResourceVendorModelNumber(Resource currentResource, Resource updateInfoResource) {
5132 String updatedResourceVendorModelNumber = updateInfoResource.getResourceVendorModelNumber();
5133 String currentResourceVendorModelNumber = currentResource.getResourceVendorModelNumber();
5134 if (!currentResourceVendorModelNumber.equals(updatedResourceVendorModelNumber)) {
5135 validateResourceVendorModelNumber(null, updateInfoResource, null);
5139 private Either<Boolean, ResponseFormat> validateCategory(Resource currentResource, Resource updateInfoResource,
5140 boolean hasBeenCertified, boolean inTransaction) {
5141 validateCategory(null, updateInfoResource, null, inTransaction);
5142 if (hasBeenCertified) {
5143 CategoryDefinition currentCategory = currentResource.getCategories()
5145 SubCategoryDefinition currentSubCategory = currentCategory.getSubcategories()
5147 CategoryDefinition updateCategory = updateInfoResource.getCategories()
5149 SubCategoryDefinition updtaeSubCategory = updateCategory.getSubcategories()
5151 if (!currentCategory.getName()
5152 .equals(updateCategory.getName())
5153 || !currentSubCategory.getName()
5154 .equals(updtaeSubCategory.getName())) {
5155 log.info("Category {} cannot be updated once the resource has been certified once.",
5156 currentResource.getCategories());
5157 ResponseFormat errorResponse = componentsUtils
5158 .getResponseFormat(ActionStatus.RESOURCE_CATEGORY_CANNOT_BE_CHANGED);
5159 return Either.right(errorResponse);
5162 return Either.left(true);
5165 private Either<Boolean, ResponseFormat> validateDerivedFromDuringUpdate(Resource currentResource,
5166 Resource updateInfoResource, boolean hasBeenCertified) {
5168 List<String> currentDerivedFrom = currentResource.getDerivedFrom();
5169 List<String> updatedDerivedFrom = updateInfoResource.getDerivedFrom();
5170 if (currentDerivedFrom == null || currentDerivedFrom.isEmpty() || updatedDerivedFrom == null
5171 || updatedDerivedFrom.isEmpty()) {
5172 log.trace("Update normative types");
5173 return Either.left(true);
5176 String derivedFromCurrent = currentDerivedFrom.get(0);
5177 String derivedFromUpdated = updatedDerivedFrom.get(0);
5179 if (!derivedFromCurrent.equals(derivedFromUpdated)) {
5180 if (!hasBeenCertified) {
5181 validateDerivedFromExist(null, updateInfoResource, null);
5183 Either<Boolean, ResponseFormat> validateDerivedFromExtending = validateDerivedFromExtending(null,
5184 currentResource, updateInfoResource, null);
5186 if (validateDerivedFromExtending.isRight() || !validateDerivedFromExtending.left()
5188 log.debug("Derived from cannot be updated if it doesnt inherits directly or extends inheritance");
5189 return validateDerivedFromExtending;
5193 // For derived from, we must know whether it was actually changed,
5194 // otherwise we must do no action.
5195 // Due to changes it inflicts on data model (remove artifacts,
5196 // properties...), it's not like a flat field which can be
5197 // overwritten if not changed.
5198 // So we must indicate that derived from is not changed
5199 updateInfoResource.setDerivedFrom(null);
5201 return Either.left(true);
5204 private Either<Boolean, ResponseFormat> validateNestedDerivedFromDuringUpdate(Resource currentResource,
5205 Resource updateInfoResource, boolean hasBeenCertified) {
5207 List<String> currentDerivedFrom = currentResource.getDerivedFrom();
5208 List<String> updatedDerivedFrom = updateInfoResource.getDerivedFrom();
5209 if (currentDerivedFrom == null || currentDerivedFrom.isEmpty() || updatedDerivedFrom == null
5210 || updatedDerivedFrom.isEmpty()) {
5211 log.trace("Update normative types");
5212 return Either.left(true);
5215 String derivedFromCurrent = currentDerivedFrom.get(0);
5216 String derivedFromUpdated = updatedDerivedFrom.get(0);
5218 if (!derivedFromCurrent.equals(derivedFromUpdated)) {
5219 if (!hasBeenCertified) {
5220 validateDerivedFromExist(null, updateInfoResource, null);
5222 Either<Boolean, ResponseFormat> validateDerivedFromExtending = validateDerivedFromExtending(null,
5223 currentResource, updateInfoResource, null);
5225 if (validateDerivedFromExtending.isRight() || !validateDerivedFromExtending.left()
5227 log.debug("Derived from cannot be updated if it doesnt inherits directly or extends inheritance");
5228 return validateDerivedFromExtending;
5232 return Either.left(true);
5235 private void validateDerivedFromExist(User user, Resource resource, AuditingActionEnum actionEnum) {
5236 if (resource.getDerivedFrom() == null || resource.getDerivedFrom()
5240 String templateName = resource.getDerivedFrom()
5242 Either<Boolean, StorageOperationStatus> dataModelResponse = toscaOperationFacade
5243 .validateToscaResourceNameExists(templateName);
5244 if (dataModelResponse.isRight()) {
5245 StorageOperationStatus storageStatus = dataModelResponse.right()
5247 BeEcompErrorManager.getInstance()
5248 .logBeDaoSystemError("Create Resource - validateDerivedFromExist");
5249 log.debug("request to data model failed with error: {}", storageStatus);
5250 ResponseFormat responseFormat = componentsUtils
5251 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(storageStatus), resource);
5252 log.trace("audit before sending response");
5253 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
5254 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(storageStatus));
5255 } else if (!dataModelResponse.left()
5257 log.info("resource template with name: {}, does not exists", templateName);
5258 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.PARENT_RESOURCE_NOT_FOUND);
5259 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
5260 throw new ByActionStatusComponentException(ActionStatus.PARENT_RESOURCE_NOT_FOUND);
5264 // Tal G for extending inheritance US815447
5265 private Either<Boolean, ResponseFormat> validateDerivedFromExtending(User user, Resource currentResource,
5266 Resource updateInfoResource, AuditingActionEnum actionEnum) {
5267 String currentTemplateName = currentResource.getDerivedFrom()
5269 String updatedTemplateName = updateInfoResource.getDerivedFrom()
5272 Either<Boolean, StorageOperationStatus> dataModelResponse = toscaOperationFacade
5273 .validateToscaResourceNameExtends(currentTemplateName, updatedTemplateName);
5274 if (dataModelResponse.isRight()) {
5275 StorageOperationStatus storageStatus = dataModelResponse.right()
5277 BeEcompErrorManager.getInstance()
5278 .logBeDaoSystemError("Create/Update Resource - validateDerivingFromExtendingType");
5279 ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(
5280 componentsUtils.convertFromStorageResponse(storageStatus), currentResource);
5281 log.trace("audit before sending response");
5282 componentsUtils.auditResource(responseFormat, user, currentResource, actionEnum);
5283 return Either.right(responseFormat);
5286 if (!dataModelResponse.left()
5288 log.info("resource template with name {} does not inherit as original {}", updatedTemplateName,
5289 currentTemplateName);
5290 ResponseFormat responseFormat = componentsUtils
5291 .getResponseFormat(ActionStatus.PARENT_RESOURCE_DOES_NOT_EXTEND);
5292 componentsUtils.auditResource(responseFormat, user, currentResource, actionEnum);
5294 return Either.right(responseFormat);
5297 return Either.left(true);
5300 public void validateDerivedFromNotEmpty(User user, Resource resource, AuditingActionEnum actionEnum) {
5301 log.debug("validate resource derivedFrom field");
5302 if ((resource.getDerivedFrom() == null) || (resource.getDerivedFrom()
5304 || (resource.getDerivedFrom()
5306 || (resource.getDerivedFrom()
5310 log.info("derived from (template) field is missing for the resource");
5311 ResponseFormat responseFormat = componentsUtils
5312 .getResponseFormat(ActionStatus.MISSING_DERIVED_FROM_TEMPLATE);
5313 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
5315 throw new ByActionStatusComponentException(ActionStatus.MISSING_DERIVED_FROM_TEMPLATE);
5319 private void validateResourceNameUniqueness(Resource resource) {
5321 Either<Boolean, StorageOperationStatus> resourceOperationResponse = toscaOperationFacade
5322 .validateComponentNameExists(resource.getName(), resource.getResourceType(),
5323 resource.getComponentType());
5324 if (resourceOperationResponse.isLeft() && resourceOperationResponse.left()
5326 log.debug("resource with name: {}, already exists", resource.getName());
5327 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_NAME_ALREADY_EXIST,
5328 ComponentTypeEnum.RESOURCE.getValue(), resource.getName());
5329 } else if (resourceOperationResponse.isRight()) {
5330 log.debug("error while validateResourceNameExists for resource: {}", resource.getName());
5331 throw new StorageException(resourceOperationResponse.right()
5336 private void validateCategory(User user, Resource resource, AuditingActionEnum actionEnum, boolean inTransaction) {
5338 List<CategoryDefinition> categories = resource.getCategories();
5339 if (CollectionUtils.isEmpty(categories)) {
5340 log.debug(CATEGORY_IS_EMPTY);
5341 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_MISSING_CATEGORY,
5342 ComponentTypeEnum.RESOURCE.getValue());
5343 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
5344 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_MISSING_CATEGORY,
5345 ComponentTypeEnum.RESOURCE.getValue());
5347 if (categories.size() > 1) {
5348 log.debug("Must be only one category for resource");
5349 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_TOO_MUCH_CATEGORIES,
5350 ComponentTypeEnum.RESOURCE.getValue());
5352 CategoryDefinition category = categories.get(0);
5353 List<SubCategoryDefinition> subcategories = category.getSubcategories();
5354 if (CollectionUtils.isEmpty(subcategories)) {
5355 log.debug("Missinig subcategory for resource");
5356 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_MISSING_SUBCATEGORY);
5358 if (subcategories.size() > 1) {
5359 log.debug("Must be only one sub category for resource");
5360 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_TOO_MUCH_SUBCATEGORIES);
5363 SubCategoryDefinition subcategory = subcategories.get(0);
5365 if (!ValidationUtils.validateStringNotEmpty(category.getName())) {
5366 log.debug(CATEGORY_IS_EMPTY);
5367 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_MISSING_CATEGORY,
5368 ComponentTypeEnum.RESOURCE.getValue());
5369 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
5370 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_MISSING_CATEGORY,
5371 ComponentTypeEnum.RESOURCE.getValue());
5373 if (!ValidationUtils.validateStringNotEmpty(subcategory.getName())) {
5374 log.debug(CATEGORY_IS_EMPTY);
5375 ResponseFormat responseFormat = componentsUtils.getResponseFormat(
5376 ActionStatus.COMPONENT_MISSING_SUBCATEGORY, ComponentTypeEnum.RESOURCE.getValue());
5377 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
5378 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_MISSING_SUBCATEGORY,
5379 ComponentTypeEnum.RESOURCE.getValue());
5382 validateCategoryListed(category, subcategory, user, resource, actionEnum, inTransaction);
5385 private void validateCategoryListed(CategoryDefinition category, SubCategoryDefinition subcategory, User user,
5386 Resource resource, AuditingActionEnum actionEnum, boolean inTransaction) {
5387 ResponseFormat responseFormat;
5388 if (category != null && subcategory != null) {
5389 log.debug("validating resource category {} against valid categories list", category);
5390 Either<List<CategoryDefinition>, ActionStatus> categories = elementDao
5391 .getAllCategories(NodeTypeEnum.ResourceNewCategory, inTransaction);
5392 if (categories.isRight()) {
5393 log.debug("failed to retrieve resource categories from JanusGraph");
5394 responseFormat = componentsUtils.getResponseFormat(categories.right()
5396 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
5397 throw new ByActionStatusComponentException(categories.right()
5400 List<CategoryDefinition> categoryList = categories.left()
5402 Optional<CategoryDefinition> foundCategory = categoryList.stream()
5403 .filter(cat -> cat.getName()
5404 .equals(category.getName()))
5406 if (!foundCategory.isPresent()) {
5407 log.debug("Category {} is not part of resource category group. Resource category valid values are {}",
5408 category, categoryList);
5409 failOnInvalidCategory(user, resource, actionEnum);
5411 Optional<SubCategoryDefinition> foundSubcategory = foundCategory.get()
5414 .filter(subcat -> subcat.getName()
5415 .equals(subcategory.getName()))
5417 if (!foundSubcategory.isPresent()) {
5419 "SubCategory {} is not part of resource category group. Resource subcategory valid values are {}",
5420 subcategory, foundCategory.get()
5421 .getSubcategories());
5422 failOnInvalidCategory(user, resource, actionEnum);
5427 private void failOnInvalidCategory(User user, Resource resource, AuditingActionEnum actionEnum) {
5428 ResponseFormat responseFormat;
5429 responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INVALID_CATEGORY,
5430 ComponentTypeEnum.RESOURCE.getValue());
5431 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
5432 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INVALID_CATEGORY, ComponentTypeEnum.RESOURCE.getValue());
5435 public void validateVendorReleaseName(User user, Resource resource, AuditingActionEnum actionEnum) {
5436 String vendorRelease = resource.getVendorRelease();
5437 log.debug("validate vendor relese name");
5438 if (!ValidationUtils.validateStringNotEmpty(vendorRelease)) {
5439 log.info("vendor relese name is missing.");
5440 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.MISSING_VENDOR_RELEASE);
5441 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
5442 throw new ByActionStatusComponentException(ActionStatus.MISSING_VENDOR_RELEASE);
5445 validateVendorReleaseName(vendorRelease, user, resource, actionEnum);
5448 public void validateVendorReleaseName(String vendorRelease, User user, Resource resource,
5449 AuditingActionEnum actionEnum) {
5450 if (vendorRelease != null) {
5451 if (!ValidationUtils.validateVendorReleaseLength(vendorRelease)) {
5452 log.info("vendor release exceds limit.");
5453 ResponseFormat errorResponse = componentsUtils.getResponseFormat(
5454 ActionStatus.VENDOR_RELEASE_EXCEEDS_LIMIT, "" + ValidationUtils.VENDOR_RELEASE_MAX_LENGTH);
5455 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
5456 throw new ByActionStatusComponentException(ActionStatus.VENDOR_RELEASE_EXCEEDS_LIMIT,
5457 "" + ValidationUtils.VENDOR_RELEASE_MAX_LENGTH);
5460 if (!ValidationUtils.validateVendorRelease(vendorRelease)) {
5461 log.info("vendor release is not valid.");
5462 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.INVALID_VENDOR_RELEASE);
5463 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
5464 throw new ByActionStatusComponentException(ActionStatus.INVALID_VENDOR_RELEASE, vendorRelease);
5469 private void validateVendorName(User user, Resource resource,
5470 AuditingActionEnum actionEnum) {
5471 String vendorName = resource.getVendorName();
5472 if (!ValidationUtils.validateStringNotEmpty(vendorName)) {
5473 log.info("vendor name is missing.");
5474 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.MISSING_VENDOR_NAME);
5475 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
5476 throw new ByActionStatusComponentException(ActionStatus.MISSING_VENDOR_NAME);
5478 validateVendorName(vendorName, user, resource, actionEnum);
5481 private void validateVendorName(String vendorName, User user, Resource resource,
5482 AuditingActionEnum actionEnum) {
5483 if (vendorName != null) {
5484 if (!ValidationUtils.validateVendorNameLength(vendorName)) {
5485 log.info("vendor name exceds limit.");
5486 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.VENDOR_NAME_EXCEEDS_LIMIT,
5487 "" + ValidationUtils.VENDOR_NAME_MAX_LENGTH);
5488 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
5489 throw new ByActionStatusComponentException(ActionStatus.VENDOR_NAME_EXCEEDS_LIMIT,
5490 "" + ValidationUtils.VENDOR_NAME_MAX_LENGTH);
5493 if (!ValidationUtils.validateVendorName(vendorName)) {
5494 log.info("vendor name is not valid.");
5495 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.INVALID_VENDOR_NAME);
5496 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
5497 throw new ByActionStatusComponentException(ActionStatus.INVALID_VENDOR_NAME, vendorName);
5502 private void validateResourceVendorModelNumber(User user, Resource resource, AuditingActionEnum actionEnum) {
5503 String resourceVendorModelNumber = resource.getResourceVendorModelNumber();
5504 if (StringUtils.isNotEmpty(resourceVendorModelNumber)) {
5505 if (!ValidationUtils.validateResourceVendorModelNumberLength(resourceVendorModelNumber)) {
5506 log.info("resource vendor model number exceeds limit.");
5507 ResponseFormat errorResponse = componentsUtils.getResponseFormat(
5508 ActionStatus.RESOURCE_VENDOR_MODEL_NUMBER_EXCEEDS_LIMIT,
5509 "" + ValidationUtils.RESOURCE_VENDOR_MODEL_NUMBER_MAX_LENGTH);
5510 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
5511 throw new ByActionStatusComponentException(ActionStatus.RESOURCE_VENDOR_MODEL_NUMBER_EXCEEDS_LIMIT,
5512 "" + ValidationUtils.RESOURCE_VENDOR_MODEL_NUMBER_MAX_LENGTH);
5514 // resource vendor model number is currently validated as vendor
5516 if (!ValidationUtils.validateVendorName(resourceVendorModelNumber)) {
5517 log.info("resource vendor model number is not valid.");
5518 ResponseFormat errorResponse = componentsUtils
5519 .getResponseFormat(ActionStatus.INVALID_RESOURCE_VENDOR_MODEL_NUMBER);
5520 componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
5521 throw new ByActionStatusComponentException(ActionStatus.INVALID_RESOURCE_VENDOR_MODEL_NUMBER);
5527 private void validateCost(Resource resource) {
5528 String cost = resource.getCost();
5530 if (!ValidationUtils.validateCost(cost)) {
5531 log.debug("resource cost is invalid.");
5532 throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
5537 private void validateLicenseType(User user, Resource resource,
5538 AuditingActionEnum actionEnum) {
5539 log.debug("validate licenseType");
5540 String licenseType = resource.getLicenseType();
5541 if (licenseType != null) {
5542 List<String> licenseTypes = ConfigurationManager.getConfigurationManager().getConfiguration()
5544 if (!licenseTypes.contains(licenseType)) {
5545 log.debug("License type {} isn't configured", licenseType);
5546 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT);
5547 if (actionEnum != null) {
5548 // In update case, no audit is required
5549 componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
5551 throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
5556 private Either<Boolean, ResponseFormat> processUpdateOfDerivedFrom(Resource currentResource,
5557 Resource updatedResource, String userId, boolean inTransaction) {
5558 if (updatedResource.getDerivedFrom() != null) {
5559 log.debug("Starting derived from update for resource {}", updatedResource.getUniqueId());
5560 log.debug("1. Removing interface artifacts from graph");
5561 // Remove all interface artifacts of resource
5562 String resourceId = updatedResource.getUniqueId();
5563 Map<String, InterfaceDefinition> interfaces = currentResource.getInterfaces();
5565 if (interfaces != null) {
5566 Collection<InterfaceDefinition> values = interfaces.values();
5567 for (InterfaceDefinition interfaceDefinition : values) {
5568 String interfaceType = interfaceTypeOperation.getShortInterfaceName(interfaceDefinition);
5570 log.trace("Starting interface artifacts removal for interface type {}", interfaceType);
5571 Map<String, Operation> operations = interfaceDefinition.getOperationsMap();
5572 if (operations != null) {
5573 for (Entry<String, Operation> operationEntry : operations.entrySet()) {
5574 Operation operation = operationEntry.getValue();
5575 ArtifactDefinition implementation = operation.getImplementationArtifact();
5576 if (implementation != null) {
5577 String uniqueId = implementation.getUniqueId();
5578 log.debug("Removing interface artifact definition {}, operation {}, interfaceType {}",
5579 uniqueId, operationEntry.getKey(), interfaceType);
5580 // only thing that transacts and locks here
5581 Either<ArtifactDefinition, ResponseFormat> deleteArtifactByInterface =
5582 artifactsBusinessLogic.deleteArtifactByInterface(resourceId, userId, uniqueId, true);
5583 if (deleteArtifactByInterface.isRight()) {
5584 log.debug("Couldn't remove artifact definition with id {}", uniqueId);
5585 if (!inTransaction) {
5586 janusGraphDao.rollback();
5588 return Either.right(deleteArtifactByInterface.right()
5592 log.trace("No implementation found for operation {} - nothing to delete",
5593 operationEntry.getKey());
5597 log.trace("No operations found for interface type {}", interfaceType);
5601 log.debug("2. Removing properties");
5602 Either<Map<String, PropertyDefinition>, StorageOperationStatus> findPropertiesOfNode = propertyOperation
5603 .deleteAllPropertiesAssociatedToNode(NodeTypeEnum.Resource, resourceId);
5605 if (findPropertiesOfNode.isRight() && findPropertiesOfNode.right().value() != StorageOperationStatus.OK) {
5606 log.debug("Failed to remove all properties of resource");
5607 if (!inTransaction) {
5608 janusGraphDao.rollback();
5610 return Either.right(componentsUtils
5611 .getResponseFormat(componentsUtils.convertFromStorageResponse(findPropertiesOfNode.right()
5616 log.debug("Derived from wasn't changed during update");
5619 if (inTransaction) {
5620 return Either.left(true);
5622 janusGraphDao.commit();
5623 return Either.left(true);
5627 /**** Auditing *******************/
5629 protected static IElementOperation getElementDao(Class<IElementOperation> class1, ServletContext context) {
5630 WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context
5631 .getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
5633 WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
5635 return webApplicationContext.getBean(class1);
5638 public ICapabilityTypeOperation getCapabilityTypeOperation() {
5639 return capabilityTypeOperation;
5643 public void setCapabilityTypeOperation(ICapabilityTypeOperation capabilityTypeOperation) {
5644 this.capabilityTypeOperation = capabilityTypeOperation;
5647 public Boolean validatePropertiesDefaultValues(Resource resource) {
5648 log.debug("validate resource properties default values");
5649 List<PropertyDefinition> properties = resource.getProperties();
5650 if (properties != null) {
5651 iterateOverProperties(properties);
5656 public void iterateOverProperties(List<PropertyDefinition> properties) {
5658 String innerType = null;
5659 for (PropertyDefinition property : properties) {
5660 if (!propertyOperation.isPropertyTypeValid(property)) {
5661 log.info("Invalid type for property {}", property);
5662 throw new ByActionStatusComponentException(ActionStatus.INVALID_PROPERTY_TYPE,
5663 property.getType(), property.getName());
5666 Map<String, DataTypeDefinition> allDataTypes = getAllDataTypes(applicationDataTypeCache);
5667 type = property.getType();
5669 if (type.equals(ToscaPropertyType.LIST.getType()) || type.equals(ToscaPropertyType.MAP.getType())) {
5670 ResponseFormat responseFormat = validateMapOrListPropertyType(property, innerType, allDataTypes);
5671 if (responseFormat != null) {
5675 validateDefaultPropertyValue(property, allDataTypes, type, innerType);
5679 private void validateDefaultPropertyValue(PropertyDefinition property,
5680 Map<String, DataTypeDefinition> allDataTypes, String type, String innerType) {
5681 if (!propertyOperation.isPropertyDefaultValueValid(property, allDataTypes)) {
5682 log.info("Invalid default value for property {}", property);
5683 ResponseFormat responseFormat;
5684 if (type.equals(ToscaPropertyType.LIST.getType()) || type.equals(ToscaPropertyType.MAP.getType())) {
5685 throw new ByActionStatusComponentException(ActionStatus.INVALID_COMPLEX_DEFAULT_VALUE,
5686 property.getName(), type, innerType, property.getDefaultValue());
5688 throw new ByActionStatusComponentException(ActionStatus.INVALID_DEFAULT_VALUE,
5689 property.getName(), type, property.getDefaultValue());
5693 private ResponseFormat validateMapOrListPropertyType(PropertyDefinition property, String innerType,
5694 Map<String, DataTypeDefinition> allDataTypes) {
5695 ResponseFormat responseFormat = null;
5696 ImmutablePair<String, Boolean> propertyInnerTypeValid = propertyOperation.isPropertyInnerTypeValid(property,
5698 innerType = propertyInnerTypeValid.getLeft();
5699 if (!propertyInnerTypeValid.getRight()
5701 log.info("Invalid inner type for property {}", property);
5702 responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_PROPERTY_INNER_TYPE, innerType,
5703 property.getName());
5705 return responseFormat;
5709 public Either<List<String>, ResponseFormat> deleteMarkedComponents() {
5710 return deleteMarkedComponents(ComponentTypeEnum.RESOURCE);
5714 public ComponentInstanceBusinessLogic getComponentInstanceBL() {
5715 return componentInstanceBusinessLogic;
5718 private String getComponentTypeForResponse(Component component) {
5719 String componentTypeForResponse = "SERVICE";
5720 if (component instanceof Resource) {
5721 componentTypeForResponse = ((Resource) component).getResourceType()
5724 return componentTypeForResponse;
5727 public Either<Resource, ResponseFormat> getLatestResourceFromCsarUuid(String csarUuid, User user) {
5730 validateUserExists(user);
5732 // get resource from csar uuid
5733 Either<Resource, StorageOperationStatus> either = toscaOperationFacade
5734 .getLatestComponentByCsarOrName(ComponentTypeEnum.RESOURCE, csarUuid, "");
5735 if (either.isRight()) {
5736 ResponseFormat resp = componentsUtils.getResponseFormat(ActionStatus.RESOURCE_FROM_CSAR_NOT_FOUND,
5738 return Either.right(resp);
5741 return Either.left(either.left()
5746 public Either<List<ComponentInstance>, ResponseFormat> getComponentInstancesFilteredByPropertiesAndInputs(
5747 String componentId, String userId) {
5751 private Map<String, List<CapabilityDefinition>> getValidComponentInstanceCapabilities(String resourceId,
5752 Map<String, List<CapabilityDefinition>> defaultCapabilities,
5753 Map<String, List<UploadCapInfo>> uploadedCapabilities) {
5755 Map<String, List<CapabilityDefinition>> validCapabilitiesMap = new HashMap<>();
5756 uploadedCapabilities.forEach((k, v) -> addValidComponentInstanceCapabilities(k, v, resourceId,
5757 defaultCapabilities, validCapabilitiesMap));
5758 return validCapabilitiesMap;
5761 private void addValidComponentInstanceCapabilities(String key, List<UploadCapInfo> capabilities, String resourceId,
5762 Map<String, List<CapabilityDefinition>> defaultCapabilities,
5763 Map<String, List<CapabilityDefinition>> validCapabilitiesMap) {
5764 String capabilityType = capabilities.get(0)
5766 if (defaultCapabilities.containsKey(capabilityType)) {
5767 CapabilityDefinition defaultCapability = getCapability(resourceId, defaultCapabilities, capabilityType);
5768 validateCapabilityProperties(capabilities, resourceId, defaultCapability);
5769 List<CapabilityDefinition> validCapabilityList = new ArrayList<>();
5770 validCapabilityList.add(defaultCapability);
5771 validCapabilitiesMap.put(key, validCapabilityList);
5773 throw new ByActionStatusComponentException(ActionStatus.MISSING_CAPABILITY_TYPE, capabilityType);
5777 private void validateCapabilityProperties(List<UploadCapInfo> capabilities, String resourceId,
5778 CapabilityDefinition defaultCapability) {
5779 if (CollectionUtils.isEmpty(defaultCapability.getProperties()) && isNotEmpty(capabilities.get(0)
5780 .getProperties())) {
5781 log.debug("Failed to validate capability {} of component {}. Property list is empty. ",
5782 defaultCapability.getName(), resourceId);
5783 log.debug("Failed to update capability property values. Property list of fetched capability {} is empty. ",
5784 defaultCapability.getName());
5785 throw new ByActionStatusComponentException(ActionStatus.PROPERTY_NOT_FOUND, resourceId);
5786 } else if (isNotEmpty(capabilities.get(0)
5787 .getProperties())) {
5788 validateUniquenessUpdateUploadedComponentInstanceCapability(defaultCapability, capabilities.get(0));
5792 private CapabilityDefinition getCapability(String resourceId,
5793 Map<String, List<CapabilityDefinition>> defaultCapabilities, String capabilityType) {
5794 CapabilityDefinition defaultCapability;
5795 if (isNotEmpty(defaultCapabilities.get(capabilityType)
5797 .getProperties())) {
5798 defaultCapability = defaultCapabilities.get(capabilityType)
5801 Either<Component, StorageOperationStatus> getFullComponentRes = toscaOperationFacade
5802 .getToscaFullElement(resourceId);
5803 if (getFullComponentRes.isRight()) {
5804 log.debug("Failed to get full component {}. Status is {}. ", resourceId, getFullComponentRes.right()
5806 throw new ByActionStatusComponentException(ActionStatus.COMPONENT_NOT_FOUND, resourceId);
5808 defaultCapability = getFullComponentRes.left()
5811 .get(capabilityType)
5814 return defaultCapability;
5817 private void validateUniquenessUpdateUploadedComponentInstanceCapability(CapabilityDefinition defaultCapability,
5818 UploadCapInfo uploadedCapability) {
5819 List<ComponentInstanceProperty> validProperties = new ArrayList<>();
5820 Map<String, PropertyDefinition> defaultProperties = defaultCapability.getProperties()
5822 .collect(toMap(PropertyDefinition::getName, Function.identity()));
5823 List<UploadPropInfo> uploadedProperties = uploadedCapability.getProperties();
5824 for (UploadPropInfo property : uploadedProperties) {
5825 String propertyName = property.getName()
5827 String propertyType = property.getType();
5828 ComponentInstanceProperty validProperty;
5829 if (defaultProperties.containsKey(propertyName)
5830 && propertTypeEqualsTo(defaultProperties, propertyName, propertyType)) {
5831 throw new ByActionStatusComponentException(ActionStatus.PROPERTY_NAME_ALREADY_EXISTS, propertyName);
5833 validProperty = new ComponentInstanceProperty();
5834 validProperty.setName(propertyName);
5835 if (property.getValue() != null) {
5836 validProperty.setValue(property.getValue()
5839 validProperty.setDescription(property.getDescription());
5840 validProperty.setPassword(property.isPassword());
5841 validProperties.add(validProperty);
5843 defaultCapability.setProperties(validProperties);
5846 private boolean propertTypeEqualsTo(Map<String, PropertyDefinition> defaultProperties, String propertyName,
5847 String propertyType) {
5848 return propertyType != null && !defaultProperties.get(propertyName)
5850 .equals(propertyType);
5853 private Either<EnumMap<ArtifactOperationEnum, List<NonMetaArtifactInfo>>, ResponseFormat> organizeVfCsarArtifactsByArtifactOperation(
5854 List<NonMetaArtifactInfo> artifactPathAndNameList, List<ArtifactDefinition> existingArtifactsToHandle,
5855 Resource resource, User user) {
5857 EnumMap<ArtifactOperationEnum, List<NonMetaArtifactInfo>> nodeTypeArtifactsToHandle = new EnumMap<>(
5858 ArtifactOperationEnum.class);
5859 Wrapper<ResponseFormat> responseWrapper = new Wrapper<>();
5860 Either<EnumMap<ArtifactOperationEnum, List<NonMetaArtifactInfo>>, ResponseFormat> nodeTypeArtifactsToHandleRes = Either
5861 .left(nodeTypeArtifactsToHandle);
5863 // add all found Csar artifacts to list to upload
5864 List<NonMetaArtifactInfo> artifactsToUpload = new ArrayList<>(artifactPathAndNameList);
5865 List<NonMetaArtifactInfo> artifactsToUpdate = new ArrayList<>();
5866 List<NonMetaArtifactInfo> artifactsToDelete = new ArrayList<>();
5867 for (NonMetaArtifactInfo currNewArtifact : artifactPathAndNameList) {
5868 ArtifactDefinition foundArtifact;
5870 if (!existingArtifactsToHandle.isEmpty()) {
5871 foundArtifact = existingArtifactsToHandle.stream()
5872 .filter(a -> a.getArtifactName()
5873 .equals(currNewArtifact.getArtifactName()))
5876 if (foundArtifact != null) {
5877 if (foundArtifact.getArtifactType().equals(currNewArtifact.getArtifactType())) {
5878 if (!foundArtifact.getArtifactChecksum()
5879 .equals(currNewArtifact.getArtifactChecksum())) {
5880 currNewArtifact.setArtifactUniqueId(foundArtifact.getUniqueId());
5881 // if current artifact already exists, but has
5882 // different content, add him to the list to
5884 artifactsToUpdate.add(currNewArtifact);
5886 // remove found artifact from the list of existing
5887 // artifacts to handle, because it was already
5889 existingArtifactsToHandle.remove(foundArtifact);
5890 // and remove found artifact from the list to
5891 // upload, because it should either be updated or be
5893 artifactsToUpload.remove(currNewArtifact);
5895 log.debug("Can't upload two artifact with the same name {}.",
5896 currNewArtifact.getArtifactName());
5897 ResponseFormat responseFormat = ResponseFormatManager.getInstance()
5898 .getResponseFormat(ActionStatus.ARTIFACT_ALREADY_EXIST_IN_DIFFERENT_TYPE_IN_CSAR,
5899 currNewArtifact.getArtifactName(), currNewArtifact.getArtifactType(),
5900 foundArtifact.getArtifactType());
5901 AuditingActionEnum auditingAction = artifactsBusinessLogic
5902 .detectAuditingType(new ArtifactOperationInfo(false, false,
5903 ArtifactOperationEnum.CREATE), foundArtifact.getArtifactChecksum());
5904 artifactsBusinessLogic.handleAuditing(auditingAction, resource, resource.getUniqueId(),
5905 user, null, null, foundArtifact.getUniqueId(), responseFormat,
5906 resource.getComponentType(), null);
5907 responseWrapper.setInnerElement(responseFormat);
5913 if (responseWrapper.isEmpty()) {
5914 for (ArtifactDefinition currArtifact : existingArtifactsToHandle) {
5915 if (currArtifact.getIsFromCsar()) {
5916 artifactsToDelete.add(new NonMetaArtifactInfo(currArtifact.getArtifactName(), null,
5917 currArtifact.getArtifactType(),
5918 currArtifact.getArtifactGroupType(), null, currArtifact.getUniqueId(),
5919 currArtifact.getIsFromCsar()));
5921 artifactsToUpdate.add(new NonMetaArtifactInfo(currArtifact.getArtifactName(), null,
5922 currArtifact.getArtifactType(),
5923 currArtifact.getArtifactGroupType(), null, currArtifact.getUniqueId(),
5924 currArtifact.getIsFromCsar()));
5929 if (responseWrapper.isEmpty()) {
5930 if (!artifactsToUpload.isEmpty()) {
5931 nodeTypeArtifactsToHandle.put(ArtifactOperationEnum.CREATE, artifactsToUpload);
5933 if (!artifactsToUpdate.isEmpty()) {
5934 nodeTypeArtifactsToHandle.put(ArtifactOperationEnum.UPDATE, artifactsToUpdate);
5936 if (!artifactsToDelete.isEmpty()) {
5937 nodeTypeArtifactsToHandle.put(ArtifactOperationEnum.DELETE, artifactsToDelete);
5940 if (!responseWrapper.isEmpty()) {
5941 nodeTypeArtifactsToHandleRes = Either.right(responseWrapper.getInnerElement());
5943 } catch (Exception e) {
5944 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
5945 responseWrapper.setInnerElement(responseFormat);
5946 log.debug("Exception occurred when findNodeTypeArtifactsToHandle, error is:{}", e.getMessage(), e);
5948 return nodeTypeArtifactsToHandleRes;
5951 ImmutablePair<String, String> buildNestedToscaResourceName(final String nodeResourceType,
5952 final String vfResourceName,
5953 final String nodeTypeFullName) {
5955 String actualVfName;
5956 if (ResourceTypeEnum.CVFC.name()
5957 .equals(nodeResourceType)) {
5958 actualVfName = vfResourceName + ResourceTypeEnum.CVFC.name();
5959 actualType = ResourceTypeEnum.VFC.name();
5961 actualVfName = vfResourceName;
5962 actualType = nodeResourceType;
5964 String nameWithouNamespacePrefix;
5966 final String nodeTypeNamePrefix = getNodeTypeNamePrefix(nodeTypeFullName);
5967 log.debug("####### buildNestedToscaResourceName nodeResourceType {}, vfResourceName {}, "
5968 + "nodeTypeFullName {}, actualType {}, vfResourceName {} ", nodeResourceType, vfResourceName,
5969 nodeTypeFullName, actualType, vfResourceName);
5970 final StringBuilder toscaResourceName = new StringBuilder(nodeTypeNamePrefix);
5972 if (!nodeTypeFullName.contains(nodeTypeNamePrefix)) {
5973 nameWithouNamespacePrefix = nodeTypeFullName;
5975 nameWithouNamespacePrefix = nodeTypeFullName.substring(nodeTypeNamePrefix.length());
5977 final String[] findTypes = nameWithouNamespacePrefix.split("\\.");
5979 if (nodeResourceType.equalsIgnoreCase(findTypes[0])){
5980 actualName = nameWithouNamespacePrefix.substring(nodeResourceType.length());
5982 actualName = "." + nameWithouNamespacePrefix;
5985 if (actualName.startsWith(Constants.ABSTRACT)) {
5986 toscaResourceName.append(nodeResourceType.toLowerCase()).append('.')
5987 .append(ValidationUtils.convertToSystemName(actualVfName));
5989 toscaResourceName.append(actualType.toLowerCase()).append('.')
5990 .append(ValidationUtils.convertToSystemName(actualVfName)).append('.').append(Constants.ABSTRACT);
5992 final StringBuilder previousToscaResourceName = new StringBuilder(toscaResourceName);
5993 final String[] actualNames = actualName.split("\\.");
5994 if (actualNames.length < 3) {
5995 return new ImmutablePair<>(toscaResourceName.append(actualName.toLowerCase()).toString(),
5996 previousToscaResourceName.append(actualName).toString());
5998 return new ImmutablePair<>(toscaResourceName.append(actualName.toLowerCase()).toString(),
5999 previousToscaResourceName.append(actualName.substring(actualNames[1].length() + 1)
6000 .toLowerCase()).toString());
6001 } catch (final Exception e) {
6002 log.debug("Exception occured when buildNestedToscaResourceName, error is:{}", e.getMessage(), e);
6003 throw new ByActionStatusComponentException(ActionStatus.INVALID_TOSCA_TEMPLATE, vfResourceName);
6008 * Extracts a Node Type Name prefix from the given Node Type Name.
6010 * @param fullName Node Type Name
6011 * @return Node Type Name Prefix
6013 private String getNodeTypeNamePrefix(final String fullName) {
6014 String tempPrefix = Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX;
6015 final List<String> definedNodeTypeNamespaceList = getDefinedNodeTypeNamespaceList();
6016 log.debug("************* getPrefiX fullName {} FROM {}", fullName, definedNodeTypeNamespaceList);
6017 final Optional<String> validNameSpace = validateNodeTypeNamePrefix(fullName, definedNodeTypeNamespaceList);
6018 if (validNameSpace.isPresent()) {
6019 tempPrefix = validNameSpace.get();
6021 log.debug("************* getNodeTypeNamePrefix return fullName {} ", tempPrefix);
6026 public Either<UiComponentDataTransfer, ResponseFormat> getUiComponentDataTransferByComponentId(String resourceId,
6027 List<String> dataParamsToReturn) {
6029 ComponentParametersView paramsToRetuen = new ComponentParametersView(dataParamsToReturn);
6030 Either<Resource, StorageOperationStatus> resourceResultEither =
6031 toscaOperationFacade.getToscaElement(resourceId,
6034 if (resourceResultEither.isRight()) {
6035 if (resourceResultEither.right().value() == StorageOperationStatus.NOT_FOUND) {
6036 log.debug("Failed to found resource with id {} ", resourceId);
6038 .right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_NOT_FOUND, resourceId));
6041 log.debug("failed to get resource by id {} with filters {}", resourceId, dataParamsToReturn);
6042 return Either.right(componentsUtils
6043 .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(resourceResultEither.right()
6047 Resource resource = resourceResultEither.left().value();
6048 if (dataParamsToReturn.contains(ComponentFieldsEnum.INPUTS.getValue())) {
6049 ListUtils.emptyIfNull(resource.getInputs())
6050 .forEach(input -> input.setConstraints(setInputConstraint(input)));
6053 UiComponentDataTransfer dataTransfer = uiComponentDataConverter.getUiDataTransferFromResourceByParams(resource,
6054 dataParamsToReturn);
6055 return Either.left(dataTransfer);
6059 public Either<Component, ActionStatus> shouldUpgradeToLatestDerived(Component clonedComponent) {
6060 Resource resource = (Resource) clonedComponent;
6061 if (ModelConverter.isAtomicComponent(resource.getResourceType())) {
6062 Either<Component, StorageOperationStatus> shouldUpgradeToLatestDerived = toscaOperationFacade
6063 .shouldUpgradeToLatestDerived(resource);
6064 if (shouldUpgradeToLatestDerived.isRight()) {
6065 return Either.right(componentsUtils.convertFromStorageResponse(shouldUpgradeToLatestDerived.right()
6068 return Either.left(shouldUpgradeToLatestDerived.left()
6071 return super.shouldUpgradeToLatestDerived(clonedComponent);