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 java.nio.charset.StandardCharsets;
24 import java.util.ArrayList;
25 import java.util.Arrays;
26 import java.util.Collection;
27 import java.util.Collections;
28 import java.util.EnumMap;
29 import java.util.HashMap;
30 import java.util.List;
32 import java.util.Optional;
34 import java.util.concurrent.Callable;
35 import java.util.function.Function;
36 import java.util.stream.Collectors;
38 import javax.servlet.ServletContext;
39 import javax.servlet.http.HttpServletRequest;
41 import org.apache.commons.collections.CollectionUtils;
42 import org.apache.commons.collections.MapUtils;
43 import org.apache.commons.lang3.tuple.ImmutablePair;
44 import org.openecomp.sdc.be.components.distribution.engine.IDistributionEngine;
45 import org.openecomp.sdc.be.components.distribution.engine.INotificationData;
46 import org.openecomp.sdc.be.components.distribution.engine.VfModuleArtifactPayload;
47 import org.openecomp.sdc.be.components.lifecycle.LifecycleChangeInfoWithAction;
48 import org.openecomp.sdc.be.config.BeEcompErrorManager;
49 import org.openecomp.sdc.be.config.ConfigurationManager;
50 import org.openecomp.sdc.be.dao.api.ActionStatus;
51 import org.openecomp.sdc.be.dao.cassandra.AuditCassandraDao;
52 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
53 import org.openecomp.sdc.be.datamodel.utils.UiComponentDataConverter;
54 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
55 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
56 import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
57 import org.openecomp.sdc.be.impl.WebAppContextWrapper;
58 import org.openecomp.sdc.be.model.ArtifactDefinition;
59 import org.openecomp.sdc.be.model.Component;
60 import org.openecomp.sdc.be.model.ComponentInstance;
61 import org.openecomp.sdc.be.model.ComponentParametersView;
62 import org.openecomp.sdc.be.model.DistributionStatusEnum;
63 import org.openecomp.sdc.be.model.DistributionTransitionEnum;
64 import org.openecomp.sdc.be.model.GroupInstance;
65 import org.openecomp.sdc.be.model.GroupInstanceProperty;
66 import org.openecomp.sdc.be.model.LifecycleStateEnum;
67 import org.openecomp.sdc.be.model.Resource;
68 import org.openecomp.sdc.be.model.Service;
69 import org.openecomp.sdc.be.model.User;
70 import org.openecomp.sdc.be.model.category.CategoryDefinition;
71 import org.openecomp.sdc.be.model.operations.api.ICacheMangerOperation;
72 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
73 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
74 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
75 import org.openecomp.sdc.be.model.operations.utils.ComponentValidationUtils;
76 import org.openecomp.sdc.be.resources.data.ComponentInstanceData;
77 import org.openecomp.sdc.be.resources.data.ComponentMetadataData;
78 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
79 import org.openecomp.sdc.be.resources.data.auditing.AuditingGenericEvent;
80 import org.openecomp.sdc.be.resources.data.auditing.DistributionDeployEvent;
81 import org.openecomp.sdc.be.resources.data.auditing.DistributionNotificationEvent;
82 import org.openecomp.sdc.be.resources.data.auditing.ResourceAdminEvent;
83 import org.openecomp.sdc.be.ui.model.UiComponentDataTransfer;
84 import org.openecomp.sdc.be.user.Role;
85 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
86 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
87 import org.openecomp.sdc.common.api.Constants;
88 import org.openecomp.sdc.common.datastructure.AuditingFieldsKeysEnum;
89 import org.openecomp.sdc.common.datastructure.Wrapper;
90 import org.openecomp.sdc.common.kpi.api.ASDCKpiApi;
91 import org.openecomp.sdc.common.util.GeneralUtility;
92 import org.openecomp.sdc.common.util.ThreadLocalsHolder;
93 import org.openecomp.sdc.common.util.ValidationUtils;
94 import org.openecomp.sdc.exception.ResponseFormat;
95 import org.slf4j.Logger;
96 import org.slf4j.LoggerFactory;
97 import org.springframework.beans.factory.annotation.Autowired;
98 import org.springframework.web.context.WebApplicationContext;
100 import com.google.gson.Gson;
101 import com.google.gson.GsonBuilder;
103 import fj.data.Either;
105 @org.springframework.stereotype.Component("serviceBusinessLogic")
106 public class ServiceBusinessLogic extends ComponentBusinessLogic {
108 private static final String STATUS_SUCCESS_200 = "200";
110 private static final String STATUS_DEPLOYED = "DEPLOYED";
113 private IElementOperation elementDao;
116 private IDistributionEngine distributionEngine;
119 // private AuditingDao auditingDao;
122 private AuditCassandraDao auditCassandraDao;
125 private ServiceComponentInstanceBusinessLogic serviceComponentInstanceBusinessLogic;
128 private GroupBusinessLogic groupBusinessLogic;
131 private ICacheMangerOperation cacheManagerOperation;
133 private static Logger log = LoggerFactory.getLogger(ServiceBusinessLogic.class.getName());
134 private static final String INITIAL_VERSION = "0.1";
136 public ServiceBusinessLogic() {
137 log.debug("ServiceBusinessLogic started");
140 public Either<Service, ResponseFormat> changeServiceDistributionState(String serviceId, String state, LifecycleChangeInfoWithAction commentObj, User user) {
142 Either<User, ResponseFormat> resp = validateUserExists(user.getUserId(), "change Service Distribution State", false);
143 if (resp.isRight()) {
144 return Either.right(resp.right().value());
147 log.debug("check request state");
148 Either<DistributionTransitionEnum, ResponseFormat> validateEnum = validateTransitionEnum(state, user);
149 if (validateEnum.isRight()) {
150 return Either.right(validateEnum.right().value());
152 DistributionTransitionEnum distributionTransition = validateEnum.left().value();
153 AuditingActionEnum auditAction = (distributionTransition == DistributionTransitionEnum.APPROVE ? AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_APPROV : AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_REJECT);
154 Either<String, ResponseFormat> commentResponse = validateComment(commentObj, user, auditAction);
155 if (commentResponse.isRight()) {
156 return Either.right(commentResponse.right().value());
158 String comment = commentResponse.left().value();
160 Either<Service, ResponseFormat> validateService = validateServiceDistributionChange(user, serviceId, auditAction, comment);
161 if (validateService.isRight()) {
162 return Either.right(validateService.right().value());
164 Service service = validateService.left().value();
165 DistributionStatusEnum initState = service.getDistributionStatus();
167 Either<User, ResponseFormat> validateUser = validateUserDistributionChange(user, service, auditAction, comment);
168 if (validateUser.isRight()) {
169 return Either.right(validateUser.right().value());
171 user = validateUser.left().value();
175 * StorageOperationStatus lockResult = graphLockOperation.lockComponent(serviceId, NodeTypeEnum.Service); if (!lockResult.equals(StorageOperationStatus.OK)) { BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.
176 * BeFailedLockObjectError, "ChangeServiceDistributionState"); log.debug("Failed to lock service {} error - {}", serviceId, lockResult); ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR,
177 * service.getVersion(), service.getServiceName());
179 * createAudit(user, auditAction, comment, service, responseFormat); return Either.right(componentsUtils.getResponseFormat(ActionStatus. GENERAL_ERROR)); }
181 Either<Boolean, ResponseFormat> lockResult = lockComponent(serviceId, service, "ChangeServiceDistributionState");
182 if (lockResult.isRight()) {
183 ResponseFormat responseFormat = lockResult.right().value();
184 createAudit(user, auditAction, comment, service, responseFormat);
185 return Either.right(responseFormat);
190 DistributionStatusEnum newState;
191 if (distributionTransition == DistributionTransitionEnum.APPROVE) {
192 newState = DistributionStatusEnum.DISTRIBUTION_APPROVED;
194 newState = DistributionStatusEnum.DISTRIBUTION_REJECTED;
196 Either<Service, StorageOperationStatus> result = toscaOperationFacade.updateDistributionStatus(service, user, newState);
197 if (result.isRight()) {
199 BeEcompErrorManager.getInstance().logBeSystemError("ChangeServiceDistributionState");
200 log.debug("service {} is change destribuation status failed", service.getUniqueId());
201 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR, service.getVersion(), service.getName());
202 createAudit(user, auditAction, comment, service, responseFormat);
203 return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
206 Service updatedService = result.left().value();
207 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
208 EnumMap<AuditingFieldsKeysEnum, Object> auditingFields = new EnumMap<AuditingFieldsKeysEnum, Object>(AuditingFieldsKeysEnum.class);
209 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_DCURR_STATUS, updatedService.getDistributionStatus().name());
210 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_DPREV_STATUS, initState.name());
211 createAudit(user, auditAction, comment, updatedService, responseFormat, auditingFields);
212 return Either.left(result.left().value());
215 graphLockOperation.unlockComponent(serviceId, NodeTypeEnum.Service);
220 public Either<List<Map<String, Object>>, ResponseFormat> getComponentAuditRecords(String componentVersion, String componentUUID, String userId) {
221 Either<User, ResponseFormat> resp = validateUserExists(userId, "get Component Audit Records", false);
222 if (resp.isRight()) {
223 return Either.right(resp.right().value());
225 Either<List<Map<String, Object>>, ActionStatus> result;
229 if (componentVersion.endsWith(".0")) {
230 Either<List<ResourceAdminEvent>, ActionStatus> eitherAuditingForCertified = auditCassandraDao.getByServiceInstanceId(componentUUID);
231 if (eitherAuditingForCertified.isLeft()) {
232 result = Either.left(getAuditingFieldsList(eitherAuditingForCertified.left().value()));
234 result = Either.right(eitherAuditingForCertified.right().value());
237 // Uncertified Version
239 result = getAuditRecordsForUncertifiedComponent(componentUUID, componentVersion);
241 } catch (Exception e) {
242 log.debug("get Audit Records failed with exception {}", e);
243 result = Either.right(ActionStatus.GENERAL_ERROR);
246 if (result.isRight()) {
247 return Either.right(componentsUtils.getResponseFormat(result.right().value()));
249 return Either.left(result.left().value());
254 private Either<List<Map<String, Object>>, ActionStatus> getAuditRecordsForUncertifiedComponent(String componentUUID, String componentVersion) {
256 Either<List<ResourceAdminEvent>, ActionStatus> eitherprevVerAudit = auditCassandraDao.getAuditByServiceIdAndPrevVersion(componentUUID, componentVersion);
258 if (eitherprevVerAudit.isRight()) {
259 return Either.right(eitherprevVerAudit.right().value());
263 Either<List<ResourceAdminEvent>, ActionStatus> eitherCurrVerAudit = auditCassandraDao.getAuditByServiceIdAndCurrVersion(componentUUID, componentVersion);
264 if (eitherCurrVerAudit.isRight()) {
265 return Either.right(eitherCurrVerAudit.right().value());
268 List<Map<String, Object>> prevVerAuditList = getAuditingFieldsList(eitherprevVerAudit.left().value());
269 List<Map<String, Object>> currVerAuditList = getAuditingFieldsList(eitherCurrVerAudit.left().value());
271 List<Map<String, Object>> duplicateElements = new ArrayList<Map<String, Object>>();
272 duplicateElements.addAll(prevVerAuditList);
273 duplicateElements.retainAll(currVerAuditList);
275 List<Map<String, Object>> joinedNonDuplicatedList = new ArrayList<Map<String, Object>>();
276 joinedNonDuplicatedList.addAll(prevVerAuditList);
277 joinedNonDuplicatedList.removeAll(duplicateElements);
278 joinedNonDuplicatedList.addAll(currVerAuditList);
280 return Either.left(joinedNonDuplicatedList);
283 private List<Map<String, Object>> getAuditingFieldsList(List<? extends AuditingGenericEvent> prevVerAuditList) {
285 List<Map<String, Object>> prevVerAudit = new ArrayList<Map<String, Object>>();
286 for (AuditingGenericEvent auditEvent : prevVerAuditList) {
287 auditEvent.fillFields();
288 prevVerAudit.add(auditEvent.getFields());
299 * - modifier data (userId)
300 * @return Either<Service, responseFormat>
302 public Either<Service, ResponseFormat> createService(Service service, User user) {
305 Either<User, ResponseFormat> eitherCreator = validateUser(user, "Create Service", service, AuditingActionEnum.CREATE_RESOURCE, false);
306 if (eitherCreator.isRight()) {
307 return Either.right(eitherCreator.right().value());
309 user = eitherCreator.left().value();
311 // validate user role
312 Either<Boolean, ResponseFormat> validateRes = validateUserRole(user, service, new ArrayList<Role>(), AuditingActionEnum.CREATE_RESOURCE, null);
313 if (validateRes.isRight()) {
314 return Either.right(validateRes.right().value());
316 service.setCreatorUserId(user.getUserId());
318 // warn on overridden fields
319 checkFieldsForOverideAttampt(service);
321 log.debug("enrich service with version and state");
322 service.setState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
323 service.setVersion(INITIAL_VERSION);
324 service.setConformanceLevel(ConfigurationManager.getConfigurationManager().getConfiguration().getToscaConformanceLevel());
325 service.setDistributionStatus(DistributionStatusEnum.DISTRIBUTION_NOT_APPROVED);
327 Either<Service, ResponseFormat> createServiceResponse = validateServiceBeforeCreate(service, user, AuditingActionEnum.CREATE_RESOURCE);
328 if (createServiceResponse.isRight()) {
329 return createServiceResponse;
331 return createServiceByDao(service, AuditingActionEnum.CREATE_RESOURCE, user);
334 private void checkFieldsForOverideAttampt(Service service) {
335 checkComponentFieldsForOverrideAttempt(service);
336 if ((service.getDistributionStatus() != null)) {
337 log.info("Distribution Status cannot be defined by user. This field will be overridden by the application");
341 private Either<Service, ResponseFormat> createServiceByDao(Service service, AuditingActionEnum actionEnum, User user) {
342 log.debug("send service {} to dao for create", service.getComponentMetadataDefinition().getMetadataDataDefinition().getName());
344 Either<Boolean, ResponseFormat> lockResult = lockComponentByName(service.getSystemName(), service, "Create Service");
345 if (lockResult.isRight()) {
346 ResponseFormat responseFormat = lockResult.right().value();
347 componentsUtils.auditComponentAdmin(responseFormat, user, service, "", "", actionEnum, ComponentTypeEnum.SERVICE);
348 return Either.right(responseFormat);
351 log.debug("System name locked is {}, status = {}", service.getSystemName(), lockResult);
355 createMandatoryArtifactsData(service, user);
356 createServiceApiArtifactsData(service, user);
357 setToscaArtifactsPlaceHolders(service, user);
358 Either<Resource, ResponseFormat> genericServiceEither = fetchAndSetDerivedFromGenericType(service);
359 if (genericServiceEither.isRight())
360 return Either.right(genericServiceEither.right().value());
362 generateInputsFromGenericTypeProperties(service, genericServiceEither.left().value());
364 Either<Service, StorageOperationStatus> dataModelResponse = toscaOperationFacade.createToscaComponent(service);
366 // service created successfully!!!
367 if (dataModelResponse.isLeft()) {
368 log.debug("Service created successfully!!!");
369 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.CREATED);
370 componentsUtils.auditComponentAdmin(responseFormat, user, service, "", "", actionEnum, ComponentTypeEnum.SERVICE);
371 ASDCKpiApi.countCreatedServicesKPI();
372 return Either.left(dataModelResponse.left().value());
375 ResponseFormat responseFormat = componentsUtils.getResponseFormatByComponent(componentsUtils.convertFromStorageResponse(dataModelResponse.right().value()), service, ComponentTypeEnum.SERVICE);
376 log.debug("audit before sending response");
377 componentsUtils.auditComponentAdmin(responseFormat, user, service, "", "", actionEnum, ComponentTypeEnum.SERVICE);
378 return Either.right(responseFormat);
381 graphLockOperation.unlockComponentByName(service.getSystemName(), service.getUniqueId(), NodeTypeEnum.Service);
385 @SuppressWarnings("unchecked")
386 private void createServiceApiArtifactsData(Service service, User user) {
387 // create mandatory artifacts
389 // TODO it must be removed after that artifact uniqueId creation will be
390 // moved to ArtifactOperation
391 // String serviceUniqueId =
392 // UniqueIdBuilder.buildServiceUniqueId(service.getComponentMetadataDefinition().getMetadataDataDefinition().getName(),
393 // service.getComponentMetadataDefinition().getMetadataDataDefinition().getVersion());
394 String serviceUniqueId = service.getUniqueId();
395 Map<String, ArtifactDefinition> artifactMap = service.getServiceApiArtifacts();
396 if (artifactMap == null)
397 artifactMap = new HashMap<String, ArtifactDefinition>();
399 Map<String, Object> serviceApiArtifacts = ConfigurationManager.getConfigurationManager().getConfiguration().getServiceApiArtifacts();
400 List<String> exludeServiceCategory = ConfigurationManager.getConfigurationManager().getConfiguration().getExcludeServiceCategory();
402 List<CategoryDefinition> categories = service.getCategories();
403 boolean isCreateArtifact = true;
404 if (categories != null && exludeServiceCategory != null && !exludeServiceCategory.isEmpty()) {
405 for (String exlude : exludeServiceCategory) {
406 if (exlude.equalsIgnoreCase(categories.get(0).getName())) {
407 isCreateArtifact = false;
414 if (serviceApiArtifacts != null && isCreateArtifact) {
415 Set<String> keys = serviceApiArtifacts.keySet();
416 for (String serviceApiArtifactName : keys) {
417 Map<String, Object> artifactInfoMap = (Map<String, Object>) serviceApiArtifacts.get(serviceApiArtifactName);
418 ArtifactDefinition artifactDefinition = createArtifactDefinition(serviceUniqueId, serviceApiArtifactName, artifactInfoMap, user, true);
419 artifactDefinition.setArtifactGroupType(ArtifactGroupTypeEnum.SERVICE_API);
420 artifactMap.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
423 service.setServiceApiArtifacts(artifactMap);
427 private Either<Service, ResponseFormat> validateServiceBeforeCreate(Service service, User user, AuditingActionEnum actionEnum) {
429 Either<Boolean, ResponseFormat> validationResponse = validateServiceFieldsBeforeCreate(user, service, actionEnum);
430 if (validationResponse.isRight()) {
431 return Either.right(validationResponse.right().value());
433 service.setCreatorFullName(user.getFirstName() + " " + user.getLastName());
434 service.setContactId(service.getContactId().toLowerCase());
436 // Generate invariant UUID - must be here and not in operation since it
437 // should stay constant during clone
438 String invariantUUID = UniqueIdBuilder.buildInvariantUUID();
439 service.setInvariantUUID(invariantUUID);
441 return Either.left(service);
444 private Either<Boolean, ResponseFormat> validateServiceFieldsBeforeCreate(User user, Service service, AuditingActionEnum actionEnum) {
445 Either<Boolean, ResponseFormat> componentsFieldsValidation = validateComponentFieldsBeforeCreate(user, service, actionEnum);
446 if (componentsFieldsValidation.isRight()) {
447 return componentsFieldsValidation;
450 log.debug("validate service name uniqueness");
451 Either<Boolean, ResponseFormat> serviceNameUniquenessValidation = validateComponentNameUnique(user, service, actionEnum);
452 if (serviceNameUniquenessValidation.isRight()) {
453 return serviceNameUniquenessValidation;
456 log.debug("validate category");
457 Either<Boolean, ResponseFormat> categoryValidation = validateServiceCategory(user, service, actionEnum);
458 if (categoryValidation.isRight()) {
459 return categoryValidation;
462 // validate project name (ProjectCode) - mandatory in service
463 log.debug("validate projectName");
464 Either<Boolean, ResponseFormat> projectCodeValidation = validateProjectCode(user, service, actionEnum);
465 if (projectCodeValidation.isRight()) {
466 return projectCodeValidation;
469 log.debug("validate service type");
470 Either<Boolean, ResponseFormat> serviceTypeValidation = validateServiceTypeAndCleanup(user, service, actionEnum);
471 if (serviceTypeValidation.isRight()) {
472 return serviceTypeValidation;
475 log.debug("validate service role");
476 Either<Boolean, ResponseFormat> serviceRoleValidation = validateServiceRoleAndCleanup(user, service, actionEnum);
477 if (serviceRoleValidation.isRight()) {
478 return serviceRoleValidation;
481 return Either.left(true);
485 private Either<Boolean, ResponseFormat> validateServiceCategory(User user, Service service, AuditingActionEnum actionEnum) {
486 log.debug("validate Service category");
488 if (service.getCategories() == null || service.getCategories().size() == 0) {
489 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_MISSING_CATEGORY, ComponentTypeEnum.SERVICE.getValue());
490 componentsUtils.auditComponentAdmin(errorResponse, user, service, "", "", actionEnum, ComponentTypeEnum.SERVICE);
491 return Either.right(errorResponse);
494 Either<Boolean, ResponseFormat> validatCategory = validateServiceCategory(service.getCategories());
495 if (validatCategory.isRight()) {
496 ResponseFormat responseFormat = validatCategory.right().value();
497 componentsUtils.auditComponentAdmin(responseFormat, user, service, "", "", actionEnum, ComponentTypeEnum.SERVICE);
498 return Either.right(responseFormat);
501 return Either.left(true);
504 public Either<Map<String, Boolean>, ResponseFormat> validateServiceNameExists(String serviceName, String userId) {
506 Either<User, ResponseFormat> resp = validateUserExists(userId, "validate Service Name Exists", false);
507 if (resp.isRight()) {
508 return Either.right(resp.right().value());
511 Either<Boolean, StorageOperationStatus> dataModelResponse = toscaOperationFacade.validateComponentNameUniqueness(serviceName, null, ComponentTypeEnum.SERVICE);
516 if (dataModelResponse.isLeft()) {
517 Map<String, Boolean> result = new HashMap<>();
518 result.put("isValid", dataModelResponse.left().value());
519 log.debug("validation was successfully performed.");
520 return Either.left(result);
523 ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(dataModelResponse.right().value()));
525 return Either.right(responseFormat);
528 public void setElementDao(IElementOperation elementDao) {
529 this.elementDao = elementDao;
532 public void setCassandraAuditingDao(AuditCassandraDao auditingDao) {
533 this.auditCassandraDao = auditingDao;
537 * public void setUserAdmin(UserAdminBuisinessLogic userAdmin) { this.userAdmin = userAdmin; }
539 * public void setComponentsUtils(ComponentsUtils componentsUtils) { this.componentsUtils = componentsUtils; }
541 * public void setGraphLockOperation(IGraphLockOperation graphLockOperation) { this.graphLockOperation = graphLockOperation; }
544 public ArtifactsBusinessLogic getArtifactBl() {
545 return artifactsBusinessLogic;
548 public void setArtifactBl(ArtifactsBusinessLogic artifactBl) {
549 this.artifactsBusinessLogic = artifactBl;
552 public Either<Service, ResponseFormat> updateServiceMetadata(String serviceId, Service serviceUpdate, User user) {
553 Either<User, ResponseFormat> eitherCreator = validateUser(user, "updateServiceMetadata", serviceUpdate, null, false);
554 if (eitherCreator.isRight()) {
555 return Either.right(eitherCreator.right().value());
557 user = eitherCreator.left().value();
559 // validate user role
560 Either<Boolean, ResponseFormat> validateRes = validateUserRole(user, serviceUpdate, new ArrayList<Role>(), null, null);
561 if (validateRes.isRight()) {
562 return Either.right(validateRes.right().value());
565 Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(serviceId);
566 if (storageStatus.isRight()) {
567 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE), ""));
570 Service currentService = storageStatus.left().value();
572 if (!ComponentValidationUtils.canWorkOnComponent(currentService, user.getUserId())) {
573 log.info("Restricted operation for user: {}, on service: {}", user.getUserId(), currentService.getCreatorUserId());
574 return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
577 Either<Service, ResponseFormat> validationRsponse = validateAndUpdateServiceMetadata(user, currentService, serviceUpdate);
578 if (validationRsponse.isRight()) {
579 log.info("service update metadata: validations field.");
580 return validationRsponse;
582 Service serviceToUpdate = validationRsponse.left().value();
585 Either<Boolean, ResponseFormat> lockResult = lockComponent(serviceId, currentService, "Update Service Metadata");
586 if (lockResult.isRight()) {
587 return Either.right(lockResult.right().value());
590 Either<Service, StorageOperationStatus> updateResponse = toscaOperationFacade.updateToscaElement(serviceToUpdate);
591 if (updateResponse.isRight()) {
593 BeEcompErrorManager.getInstance().logBeSystemError("Update Service Metadata");
594 log.debug("failed to update sevice {}", serviceToUpdate.getUniqueId());
595 return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
598 return Either.left(updateResponse.left().value());
600 graphLockOperation.unlockComponent(serviceId, NodeTypeEnum.Service);
604 private Either<Service, ResponseFormat> validateAndUpdateServiceMetadata(User user, Service currentService, Service serviceUpdate) {
606 boolean hasBeenCertified = ValidationUtils.hasBeenCertified(currentService.getVersion());
607 Either<Boolean, ResponseFormat> response = validateAndUpdateCategory(user, currentService, serviceUpdate, hasBeenCertified, null);
608 if (response.isRight()) {
609 ResponseFormat errorResponse = response.right().value();
610 return Either.right(errorResponse);
613 String creatorUserIdUpdated = serviceUpdate.getCreatorUserId();
614 String creatorUserIdCurrent = currentService.getCreatorUserId();
615 if (creatorUserIdUpdated != null && !creatorUserIdCurrent.equals(creatorUserIdUpdated)) {
616 log.info("update srvice: recived request to update creatorUserId to {} the field is not updatable ignoring.", creatorUserIdUpdated);
619 String creatorFullNameUpdated = serviceUpdate.getCreatorFullName();
620 String creatorFullNameCurrent = currentService.getCreatorFullName();
621 if (creatorFullNameUpdated != null && !creatorFullNameCurrent.equals(creatorFullNameUpdated)) {
622 log.info("update srvice: recived request to update creatorFullName to {} the field is not updatable ignoring.", creatorFullNameUpdated);
625 String lastUpdaterUserIdUpdated = serviceUpdate.getLastUpdaterUserId();
626 String lastUpdaterUserIdCurrent = currentService.getLastUpdaterUserId();
627 if (lastUpdaterUserIdUpdated != null && !lastUpdaterUserIdCurrent.equals(lastUpdaterUserIdUpdated)) {
628 log.info("update srvice: recived request to update lastUpdaterUserId to {} the field is not updatable ignoring.", lastUpdaterUserIdUpdated);
631 String lastUpdaterFullNameUpdated = serviceUpdate.getLastUpdaterFullName();
632 String lastUpdaterFullNameCurrent = currentService.getLastUpdaterFullName();
633 if (lastUpdaterFullNameUpdated != null && !lastUpdaterFullNameCurrent.equals(lastUpdaterFullNameUpdated)) {
634 log.info("update srvice: recived request to update lastUpdaterFullName to {} the field is not updatable ignoring.", lastUpdaterFullNameUpdated);
637 response = validateAndUpdateServiceName(user, currentService, serviceUpdate, hasBeenCertified, null);
638 if (response.isRight()) {
639 ResponseFormat errorResponse = response.right().value();
640 return Either.right(errorResponse);
643 DistributionStatusEnum distributionStatusUpdated = serviceUpdate.getDistributionStatus();
644 DistributionStatusEnum distributionStatusCurrent = currentService.getDistributionStatus();
645 if (distributionStatusUpdated != null && !distributionStatusUpdated.name().equals((distributionStatusCurrent != null ? distributionStatusCurrent.name() : null))) {
646 log.info("update srvice: recived request to update distributionStatus to {} the field is not updatable ignoring.", distributionStatusUpdated);
649 if (serviceUpdate.getProjectCode() != null) {
650 response = validateAndUpdateProjectCode(user, currentService, serviceUpdate, null);
651 if (response.isRight()) {
652 ResponseFormat errorResponse = response.right().value();
653 return Either.right(errorResponse);
657 response = validateAndUpdateIcon(user, currentService, serviceUpdate, hasBeenCertified, null);
658 if (response.isRight()) {
659 ResponseFormat errorResponse = response.right().value();
660 return Either.right(errorResponse);
663 Long creationDateUpdated = serviceUpdate.getCreationDate();
664 Long creationDateCurrent = currentService.getCreationDate();
665 if (creationDateUpdated != null && !creationDateCurrent.equals(creationDateUpdated)) {
666 log.info("update srvice: recived request to update creationDate to {} the field is not updatable ignoring.", creationDateUpdated);
669 String versionUpdated = serviceUpdate.getVersion();
670 String versionCurrent = currentService.getVersion();
671 if (versionUpdated != null && !versionCurrent.equals(versionUpdated)) {
672 log.info("update srvice: recived request to update version to {} the field is not updatable ignoring.", versionUpdated);
675 response = validateAndUpdateDescription(user, currentService, serviceUpdate, hasBeenCertified, null);
676 if (response.isRight()) {
677 ResponseFormat errorResponse = response.right().value();
678 return Either.right(errorResponse);
681 response = validateAndUpdateTags(user, currentService, serviceUpdate, hasBeenCertified, null);
682 if (response.isRight()) {
683 ResponseFormat errorResponse = response.right().value();
684 return Either.right(errorResponse);
687 response = validateAndUpdateContactId(user, currentService, serviceUpdate, null);
688 if (response.isRight()) {
689 ResponseFormat errorResponse = response.right().value();
690 return Either.right(errorResponse);
693 Long lastUpdateDateUpdated = serviceUpdate.getLastUpdateDate();
694 Long lastUpdateDateCurrent = currentService.getLastUpdateDate();
695 if (lastUpdateDateUpdated != null && !lastUpdateDateCurrent.equals(lastUpdateDateUpdated)) {
696 log.info("update srvice: recived request to update lastUpdateDate to {} the field is not updatable ignoring.", lastUpdateDateUpdated);
699 LifecycleStateEnum lifecycleStateUpdated = serviceUpdate.getLifecycleState();
700 LifecycleStateEnum lifecycleStateCurrent = currentService.getLifecycleState();
701 if (lifecycleStateUpdated != null && !lifecycleStateCurrent.name().equals(lifecycleStateUpdated.name())) {
702 log.info("update srvice: recived request to update lifecycleState to {} the field is not updatable ignoring.", lifecycleStateUpdated);
705 Boolean isHighestVersionUpdated = serviceUpdate.isHighestVersion();
706 Boolean isHighestVersionCurrent = currentService.isHighestVersion();
707 if (isHighestVersionUpdated != null && !isHighestVersionCurrent.equals(isHighestVersionUpdated)) {
708 log.info("update srvice: recived request to update isHighestVersion to {} the field is not updatable ignoring.", isHighestVersionUpdated);
711 String uuidUpdated = serviceUpdate.getUUID();
712 String uuidCurrent = currentService.getUUID();
713 if (!uuidCurrent.equals(uuidUpdated)) {
714 log.info("update srvice: recived request to update uuid to {} the field is not updatable ignoring.", uuidUpdated);
717 response = validateAndUpdateServiceType(user, currentService, serviceUpdate, null);
718 if (response.isRight()) {
719 ResponseFormat errorResponse = response.right().value();
720 return Either.right(errorResponse);
723 response = validateAndUpdateServiceRole(user, currentService, serviceUpdate, null);
724 if (response.isRight()) {
725 ResponseFormat errorResponse = response.right().value();
726 return Either.right(errorResponse);
729 String currentInvariantUuid = currentService.getInvariantUUID();
730 String updatedInvariantUuid = serviceUpdate.getInvariantUUID();
732 if ((updatedInvariantUuid != null) && (!updatedInvariantUuid.equals(currentInvariantUuid))) {
733 log.warn("Product invariant UUID is automatically set and cannot be updated");
734 serviceUpdate.setInvariantUUID(currentInvariantUuid);
736 validateAndUpdateEcompNaming(currentService, serviceUpdate);
738 return Either.left(currentService);
742 private void validateAndUpdateEcompNaming(Service currentService, Service serviceUpdate) {
743 Boolean isEcompoGeneratedCurr = currentService.isEcompGeneratedNaming();
744 Boolean isEcompoGeneratedUpdate = serviceUpdate.isEcompGeneratedNaming();
745 if (isEcompoGeneratedUpdate != null && isEcompoGeneratedCurr != isEcompoGeneratedUpdate) {
746 currentService.setEcompGeneratedNaming(isEcompoGeneratedUpdate);
748 String namingPolicyUpd = serviceUpdate.getNamingPolicy();
749 if (!currentService.isEcompGeneratedNaming()) {
750 if (ValidationUtils.validateStringNotEmpty(namingPolicyUpd)) {
751 log.warn("NamingPolicy must be empty for EcompGeneratedNaming=false");
752 currentService.setNamingPolicy("");
754 currentService.setNamingPolicy(namingPolicyUpd);
757 currentService.setNamingPolicy(namingPolicyUpd);
761 private Either<Boolean, ResponseFormat> validateAndUpdateContactId(User user, Service currentService, Service serviceUpdate, AuditingActionEnum audatingAction) {
762 String contactIdUpdated = serviceUpdate.getContactId();
763 String contactIdCurrent = currentService.getContactId();
764 if (!contactIdCurrent.equals(contactIdUpdated)) {
765 Either<Boolean, ResponseFormat> validatContactId = validateContactId(user, serviceUpdate, audatingAction);
766 if (validatContactId.isRight()) {
767 ResponseFormat errorRespons = validatContactId.right().value();
768 return Either.right(errorRespons);
770 currentService.setContactId(contactIdUpdated.toLowerCase());
772 return Either.left(true);
775 private Either<Boolean, ResponseFormat> validateAndUpdateTags(User user, Service currentService, Service serviceUpdate, boolean hasBeenCertified, AuditingActionEnum audatingAction) {
776 List<String> tagsUpdated = serviceUpdate.getTags();
777 List<String> tagsCurrent = currentService.getTags();
778 if (tagsUpdated == null || tagsUpdated.isEmpty()) {
779 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_MISSING_TAGS);
780 componentsUtils.auditComponentAdmin(responseFormat, user, serviceUpdate, "", "", audatingAction, ComponentTypeEnum.SERVICE);
781 return Either.right(responseFormat);
784 if (!(tagsCurrent.containsAll(tagsUpdated) && tagsUpdated.containsAll(tagsCurrent))) {
785 Either<Boolean, ResponseFormat> validatResponse = validateTagsListAndRemoveDuplicates(user, serviceUpdate, audatingAction);
786 if (validatResponse.isRight()) {
787 ResponseFormat errorRespons = validatResponse.right().value();
788 return Either.right(errorRespons);
790 currentService.setTags(tagsUpdated);
792 return Either.left(true);
795 private Either<Boolean, ResponseFormat> validateAndUpdateDescription(User user, Service currentService, Service serviceUpdate, boolean hasBeenCertified, AuditingActionEnum audatingAction) {
796 String descriptionUpdated = serviceUpdate.getDescription();
797 String descriptionCurrent = currentService.getDescription();
798 if (!descriptionCurrent.equals(descriptionUpdated)) {
799 Either<Boolean, ResponseFormat> validateDescriptionResponse = validateDescriptionAndCleanup(user, serviceUpdate, audatingAction);
800 if (validateDescriptionResponse.isRight()) {
801 ResponseFormat errorRespons = validateDescriptionResponse.right().value();
802 return Either.right(errorRespons);
804 currentService.setDescription(serviceUpdate.getDescription());
806 return Either.left(true);
809 private Either<Boolean, ResponseFormat> validateAndUpdateProjectCode(User user, Service currentService, Service serviceUpdate, AuditingActionEnum audatingAction) {
810 String projectCodeUpdated = serviceUpdate.getProjectCode();
811 String projectCodeCurrent = currentService.getProjectCode();
812 if (!projectCodeCurrent.equals(projectCodeUpdated)) {
814 Either<Boolean, ResponseFormat> validatProjectCodeResponse = validateProjectCode(user, serviceUpdate, audatingAction);
815 if (validatProjectCodeResponse.isRight()) {
816 ResponseFormat errorRespons = validatProjectCodeResponse.right().value();
817 return Either.right(errorRespons);
819 currentService.setProjectCode(projectCodeUpdated);
822 return Either.left(true);
825 private Either<Boolean, ResponseFormat> validateAndUpdateIcon(User user, Service currentService, Service serviceUpdate, boolean hasBeenCertified, AuditingActionEnum audatingAction) {
826 String iconUpdated = serviceUpdate.getIcon();
827 String iconCurrent = currentService.getIcon();
828 if (!iconCurrent.equals(iconUpdated)) {
829 if (!hasBeenCertified) {
830 Either<Boolean, ResponseFormat> validatIconResponse = validateIcon(user, serviceUpdate, audatingAction);
831 if (validatIconResponse.isRight()) {
832 ResponseFormat errorRespons = validatIconResponse.right().value();
833 return Either.right(errorRespons);
835 currentService.setIcon(iconUpdated);
837 log.info("icon {} cannot be updated once the service has been certified once.", iconUpdated);
838 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.SERVICE_ICON_CANNOT_BE_CHANGED);
839 return Either.right(errorResponse);
842 return Either.left(true);
845 private Either<Boolean, ResponseFormat> validateAndUpdateServiceName(User user, Service currentService, Service serviceUpdate, boolean hasBeenCertified, AuditingActionEnum auditingAction) {
846 String serviceNameUpdated = serviceUpdate.getName();
847 String serviceNameCurrent = currentService.getName();
848 if (!serviceNameCurrent.equals(serviceNameUpdated)) {
849 if (!hasBeenCertified) {
850 Either<Boolean, ResponseFormat> validatServiceNameResponse = validateComponentName(user, serviceUpdate, auditingAction);
851 if (validatServiceNameResponse.isRight()) {
852 ResponseFormat errorRespons = validatServiceNameResponse.right().value();
853 return Either.right(errorRespons);
856 Either<Boolean, ResponseFormat> serviceNameUniquenessValidation = validateComponentNameUnique(user, serviceUpdate, auditingAction);
857 if (serviceNameUniquenessValidation.isRight()) {
858 return serviceNameUniquenessValidation;
860 currentService.setName(serviceNameUpdated);
861 currentService.getComponentMetadataDefinition().getMetadataDataDefinition().setNormalizedName(ValidationUtils.normaliseComponentName(serviceNameUpdated));
862 currentService.getComponentMetadataDefinition().getMetadataDataDefinition().setSystemName(ValidationUtils.convertToSystemName(serviceNameUpdated));
865 log.info("service name {} cannot be updated once the service has been certified once.", serviceNameUpdated);
866 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.SERVICE_NAME_CANNOT_BE_CHANGED);
867 return Either.right(errorResponse);
870 return Either.left(true);
873 private Either<Boolean, ResponseFormat> validateAndUpdateServiceType(User user, Service currentService, Service updatedService, AuditingActionEnum auditingAction) {
874 String updatedServiceType = updatedService.getServiceType();
875 String currentServiceType = currentService.getServiceType();
876 if (!currentServiceType.equals(updatedServiceType)) {
877 Either<Boolean, ResponseFormat> validateServiceType = validateServiceTypeAndCleanup(user, updatedService , auditingAction);
878 if (validateServiceType.isRight()) {
879 ResponseFormat errorResponse = validateServiceType.right().value();
880 componentsUtils.auditComponentAdmin(errorResponse, user, updatedService, "", "", auditingAction, ComponentTypeEnum.SERVICE);
881 return Either.right(errorResponse);
883 currentService.setServiceType(updatedServiceType);
885 return Either.left(true);
888 protected Either<Boolean, ResponseFormat> validateServiceTypeAndCleanup(User user, Component component, AuditingActionEnum actionEnum) {
889 String serviceType = ((Service)component).getServiceType();
890 if (serviceType != null){
891 serviceType = cleanUpText(serviceType);
892 Either<Boolean, ResponseFormat> validateServiceType = validateServiceType(serviceType);
893 if (validateServiceType.isRight()) {
894 ResponseFormat responseFormat = validateServiceType.right().value();
895 componentsUtils.auditComponentAdmin(responseFormat, user, component, "", "", actionEnum, ComponentTypeEnum.SERVICE);
896 return Either.right(responseFormat);
898 return Either.left(true);
900 return Either.left(false);
905 private Either<Boolean, ResponseFormat> validateServiceType(String serviceType) {
906 if (serviceType.equals("")){
907 return Either.left(true);
909 if (!ValidationUtils.validateServiceTypeLength(serviceType)) {
910 log.info("service type exceeds limit.");
911 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.SERVICE_TYPE_EXCEEDS_LIMIT, "" + ValidationUtils.SERVICE_TYPE_MAX_LENGTH);
912 return Either.right(errorResponse);
915 if (!ValidationUtils.validateIsEnglish(serviceType)) {
916 log.info("service type is not valid.");
917 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.INVALID_SERVICE_TYPE);
918 return Either.right(errorResponse);
920 return Either.left(true);
924 private Either<Boolean, ResponseFormat> validateAndUpdateServiceRole(User user, Service currentService, Service updatedService, AuditingActionEnum auditingAction) {
925 String updatedServiceRole = updatedService.getServiceRole();
926 String currentServiceRole = currentService.getServiceRole();
927 if (!currentServiceRole.equals(updatedServiceRole)) {
928 Either<Boolean, ResponseFormat> validateServiceRole = validateServiceRoleAndCleanup(user, updatedService , auditingAction);
929 if (validateServiceRole.isRight()) {
930 ResponseFormat errorResponse = validateServiceRole.right().value();
931 componentsUtils.auditComponentAdmin(errorResponse, user, updatedService, "", "", auditingAction, ComponentTypeEnum.SERVICE);
932 return Either.right(errorResponse);
934 currentService.setServiceRole(updatedServiceRole);
936 return Either.left(true);
939 protected Either<Boolean, ResponseFormat> validateServiceRoleAndCleanup(User user, Component component, AuditingActionEnum actionEnum) {
940 String serviceRole = ((Service)component).getServiceRole();
941 if (serviceRole != null){
942 serviceRole = cleanUpText(serviceRole);
944 Either<Boolean, ResponseFormat> validateServiceRole = validateServiceRole(serviceRole);
945 if (validateServiceRole.isRight()) {
946 ResponseFormat responseFormat = validateServiceRole.right().value();
947 componentsUtils.auditComponentAdmin(responseFormat, user, component, "", "", actionEnum, ComponentTypeEnum.SERVICE);
948 return Either.right(responseFormat);
950 return Either.left(true);
952 return Either.left(false);
957 private Either<Boolean, ResponseFormat> validateServiceRole(String serviceRole) {
958 if (serviceRole.equals("")){
959 return Either.left(true);
961 if (!ValidationUtils.validateServiceRoleLength(serviceRole)) {
962 log.info("service role exceeds limit.");
963 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.SERVICE_ROLE_EXCEEDS_LIMIT, "" + ValidationUtils.SERVICE_ROLE_MAX_LENGTH);
964 return Either.right(errorResponse);
967 if (!ValidationUtils.validateIsEnglish(serviceRole)) {
968 log.info("service role is not valid.");
969 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.INVALID_SERVICE_ROLE);
970 return Either.right(errorResponse);
972 return Either.left(true);
978 private Either<Boolean, ResponseFormat> validateAndUpdateCategory(User user, Service currentService, Service serviceUpdate, boolean hasBeenCertified, AuditingActionEnum audatingAction) {
979 List<CategoryDefinition> categoryUpdated = serviceUpdate.getCategories();
980 List<CategoryDefinition> categoryCurrent = currentService.getCategories();
981 Either<Boolean, ResponseFormat> validatCategoryResponse = validateServiceCategory(user, serviceUpdate, audatingAction);
982 if (validatCategoryResponse.isRight()) {
983 ResponseFormat errorRespons = validatCategoryResponse.right().value();
984 return Either.right(errorRespons);
986 if (!categoryCurrent.get(0).getName().equals(categoryUpdated.get(0).getName())) {
987 if (!hasBeenCertified) {
988 currentService.setCategories(categoryUpdated);
990 log.info("category {} cannot be updated once the service has been certified once.", categoryUpdated);
991 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.SERVICE_CATEGORY_CANNOT_BE_CHANGED);
992 return Either.right(errorResponse);
995 return Either.left(true);
999 public Either<Boolean, ResponseFormat> validateServiceCategory(List<CategoryDefinition> list) {
1001 if (list.size() > 1) {
1002 log.debug("Must be only one category for service");
1003 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_TOO_MUCH_CATEGORIES, ComponentTypeEnum.SERVICE.getValue());
1004 return Either.right(responseFormat);
1006 CategoryDefinition category = list.get(0);
1007 if (category.getSubcategories() != null) {
1008 log.debug("Subcategories cannot be defined for service");
1009 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.SERVICE_CANNOT_CONTAIN_SUBCATEGORY);
1010 return Either.right(responseFormat);
1012 if (!ValidationUtils.validateStringNotEmpty(category.getName())) {
1013 log.debug("Resource category is empty");
1014 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_MISSING_CATEGORY, ComponentTypeEnum.SERVICE.getValue());
1015 return Either.right(responseFormat);
1018 log.debug("validating service category {} against valid categories list", list);
1019 Either<List<CategoryDefinition>, ActionStatus> categorys = elementDao.getAllServiceCategories();
1020 if (categorys.isRight()) {
1021 log.debug("failed to retrive service categories from Titan");
1022 ResponseFormat responseFormat = componentsUtils.getResponseFormat(categorys.right().value());
1023 return Either.right(responseFormat);
1025 List<CategoryDefinition> categoryList = categorys.left().value();
1026 for (CategoryDefinition value : categoryList) {
1027 if (value.getName().equals(category.getName())) {
1028 return Either.left(true);
1031 log.debug("Category {} is not part of service category group. Service category valid values are {}", list, categoryList);
1032 return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INVALID_CATEGORY, ComponentTypeEnum.SERVICE.getValue()));
1034 return Either.left(false);
1037 public ResponseFormat deleteService(String serviceId, User user) {
1038 ResponseFormat responseFormat;
1039 String ecompErrorContext = "delete service";
1041 Either<User, ResponseFormat> eitherCreator = validateUserExists(user, ecompErrorContext, false);
1042 if (eitherCreator.isRight()) {
1043 return eitherCreator.right().value();
1045 user = eitherCreator.left().value();
1047 Either<Service, StorageOperationStatus> serviceStatus = toscaOperationFacade.getToscaElement(serviceId);
1048 if (serviceStatus.isRight()) {
1049 log.debug("failed to get service {}", serviceId);
1050 return componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(serviceStatus.right().value()), "");
1053 Service service = serviceStatus.left().value();
1055 StorageOperationStatus result = StorageOperationStatus.OK;
1056 Either<Boolean, ResponseFormat> lockResult = lockComponent(service, "Mark service to delete");
1057 if (lockResult.isRight()) {
1058 result = StorageOperationStatus.GENERAL_ERROR;
1059 return componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
1064 result = markComponentToDelete(service);
1065 if (result.equals(StorageOperationStatus.OK)) {
1066 responseFormat = componentsUtils.getResponseFormat(ActionStatus.NO_CONTENT);
1068 ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(result);
1069 responseFormat = componentsUtils.getResponseFormatByResource(actionStatus, service.getName());
1071 return responseFormat;
1074 if (result == null || !result.equals(StorageOperationStatus.OK)) {
1075 log.warn("operation failed. do rollback");
1076 BeEcompErrorManager.getInstance().logBeSystemError("Delete Service");
1077 titanDao.rollback();
1079 log.debug("operation success. do commit");
1082 graphLockOperation.unlockComponent(serviceId, NodeTypeEnum.Service);
1086 public ResponseFormat deleteServiceByNameAndVersion(String serviceName, String version, User user) {
1087 ResponseFormat responseFormat;
1088 String ecompErrorContext = "delete service";
1089 Either<User, ResponseFormat> validateEmptyResult = validateUserNotEmpty(user, ecompErrorContext);
1090 if (validateEmptyResult.isRight()) {
1091 return validateEmptyResult.right().value();
1094 Either<User, ResponseFormat> eitherCreator = validateUserExists(user, ecompErrorContext, false);
1095 if (eitherCreator.isRight()) {
1096 return eitherCreator.right().value();
1098 user = eitherCreator.left().value();
1100 Either<Service, ResponseFormat> getResult = getServiceByNameAndVersion(serviceName, version, user.getUserId());
1101 if (getResult.isRight()) {
1102 return getResult.right().value();
1104 Service service = getResult.left().value();
1106 StorageOperationStatus result = StorageOperationStatus.OK;
1107 Either<Boolean, ResponseFormat> lockResult = lockComponent(service, "Mark service to delete");
1108 if (lockResult.isRight()) {
1109 result = StorageOperationStatus.GENERAL_ERROR;
1110 return componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
1114 result = markComponentToDelete(service);
1115 if (result.equals(StorageOperationStatus.OK)) {
1116 responseFormat = componentsUtils.getResponseFormat(ActionStatus.NO_CONTENT);
1118 ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(result);
1119 responseFormat = componentsUtils.getResponseFormatByResource(actionStatus, service.getName());
1121 return responseFormat;
1124 if (result == null || !result.equals(StorageOperationStatus.OK)) {
1125 log.warn("operation failed. do rollback");
1126 BeEcompErrorManager.getInstance().logBeSystemError("Delete Service");
1127 titanDao.rollback();
1129 log.debug("operation success. do commit");
1132 graphLockOperation.unlockComponent(service.getUniqueId(), NodeTypeEnum.Service);
1136 public Either<Service, ResponseFormat> getService(String serviceId, User user) {
1137 String ecompErrorContext = "Get service";
1138 Either<User, ResponseFormat> validateEmptyResult = validateUserNotEmpty(user, ecompErrorContext);
1139 if (validateEmptyResult.isRight()) {
1140 return Either.right(validateEmptyResult.right().value());
1143 Either<User, ResponseFormat> eitherCreator = validateUserExists(user, ecompErrorContext, false);
1144 if (eitherCreator.isRight()) {
1145 return Either.right(eitherCreator.right().value());
1148 Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(serviceId);
1149 if (storageStatus.isRight()) {
1150 log.debug("failed to get service by id {}", serviceId);
1151 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE), serviceId));
1154 if(!(storageStatus.left().value() instanceof Service)){
1155 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(StorageOperationStatus.NOT_FOUND), serviceId));
1157 Service service = storageStatus.left().value();
1158 return Either.left(service);
1165 public Either<Service, ResponseFormat> getServiceByNameAndVersion(String serviceName, String serviceVersion, String userId) {
1166 Either<User, ResponseFormat> resp = validateUserExists(userId, "get Service By Name And Version", false);
1167 if (resp.isRight()) {
1168 return Either.right(resp.right().value());
1170 Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getComponentByNameAndVersion(ComponentTypeEnum.SERVICE, serviceName, serviceVersion);
1171 if (storageStatus.isRight()) {
1172 log.debug("failed to get service by name {} and version {}", serviceName, serviceVersion);
1173 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE), serviceName));
1175 Service service = storageStatus.left().value();
1176 return Either.left(service);
1179 @SuppressWarnings("unchecked")
1180 private void createMandatoryArtifactsData(Service service, User user) {
1181 // create mandatory artifacts
1183 // TODO it must be removed after that artifact uniqueId creation will be
1184 // moved to ArtifactOperation
1185 // String serviceUniqueId =
1186 // UniqueIdBuilder.buildServiceUniqueId(service.getComponentMetadataDefinition().getMetadataDataDefinition().getName(),
1187 // service.getComponentMetadataDefinition().getMetadataDataDefinition().getVersion());
1188 String serviceUniqueId = service.getUniqueId();
1189 Map<String, ArtifactDefinition> artifactMap = service.getArtifacts();
1190 if (artifactMap == null)
1191 artifactMap = new HashMap<String, ArtifactDefinition>();
1193 Map<String, Object> informationalServiceArtifacts = ConfigurationManager.getConfigurationManager().getConfiguration().getInformationalServiceArtifacts();
1194 List<String> exludeServiceCategory = ConfigurationManager.getConfigurationManager().getConfiguration().getExcludeServiceCategory();
1196 String category = service.getCategories().get(0).getName();
1197 boolean isCreateArtifact = true;
1198 if (category != null && exludeServiceCategory != null && !exludeServiceCategory.isEmpty()) {
1199 for (String exlude : exludeServiceCategory) {
1200 if (exlude.equalsIgnoreCase(category)) {
1201 isCreateArtifact = false;
1208 if (informationalServiceArtifacts != null && isCreateArtifact) {
1209 Set<String> keys = informationalServiceArtifacts.keySet();
1210 for (String informationalServiceArtifactName : keys) {
1211 Map<String, Object> artifactInfoMap = (Map<String, Object>) informationalServiceArtifacts.get(informationalServiceArtifactName);
1212 ArtifactDefinition artifactDefinition = createArtifactDefinition(serviceUniqueId, informationalServiceArtifactName, artifactInfoMap, user, false);
1213 artifactMap.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
1217 service.setArtifacts(artifactMap);
1221 private ArtifactDefinition createArtifactDefinition(String serviceId, String logicalName, Map<String, Object> artifactInfoMap, User user, Boolean isServiceApi) {
1223 ArtifactDefinition artifactInfo = artifactsBusinessLogic.createArtifactPlaceHolderInfo(serviceId, logicalName, artifactInfoMap, user, ArtifactGroupTypeEnum.INFORMATIONAL);
1226 artifactInfo.setMandatory(false);
1227 artifactInfo.setServiceApi(true);
1229 return artifactInfo;
1232 private Either<DistributionTransitionEnum, ResponseFormat> validateTransitionEnum(String distributionTransition, User user) {
1233 DistributionTransitionEnum transitionEnum = null;
1235 transitionEnum = DistributionTransitionEnum.getFromDisplayName(distributionTransition);
1236 if (transitionEnum == null) {
1237 BeEcompErrorManager.getInstance().logBeSystemError("Change Service Distribution");
1238 log.info("state operation is not valid. operations allowed are: {}", DistributionTransitionEnum.valuesAsString());
1239 ResponseFormat error = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
1240 return Either.right(error);
1243 return Either.left(transitionEnum);
1246 private Either<String, ResponseFormat> validateComment(LifecycleChangeInfoWithAction comment, User user, AuditingActionEnum auditAction) {
1247 String data = comment.getUserRemarks();
1249 if (data == null || data.trim().isEmpty()) {
1250 BeEcompErrorManager.getInstance().logBeInvalidJsonInput("Change Service Distribution");
1251 log.debug("user comment cannot be empty or null.");
1252 return Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
1254 data = ValidationUtils.removeNoneUtf8Chars(data);
1255 data = ValidationUtils.removeHtmlTags(data);
1256 data = ValidationUtils.normaliseWhitespace(data);
1257 data = ValidationUtils.stripOctets(data);
1259 if (!ValidationUtils.validateLength(data, ValidationUtils.COMMENT_MAX_LENGTH)) {
1260 BeEcompErrorManager.getInstance().logBeInvalidJsonInput("Change Service Distribution");
1261 log.debug("user comment exceeds limit.");
1262 return Either.right(componentsUtils.getResponseFormat(ActionStatus.EXCEEDS_LIMIT, "comment", String.valueOf(ValidationUtils.COMMENT_MAX_LENGTH)));
1264 if (!ValidationUtils.validateIsEnglish(data)) {
1265 return Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
1267 return Either.left(data);
1270 private Either<Service, ResponseFormat> validateServiceDistributionChange(User user, String serviceId, AuditingActionEnum auditAction, String comment) {
1271 Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(serviceId);
1272 if (storageStatus.isRight()) {
1273 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.SERVICE_NOT_FOUND, serviceId);
1274 createAudit(user, auditAction, comment, responseFormat);
1275 return Either.right(responseFormat);
1277 Service service = storageStatus.left().value();
1279 if (service.getLifecycleState() != LifecycleStateEnum.CERTIFIED) {
1280 log.info("service {} is not available for distribution. Should be in certified state", service.getUniqueId());
1281 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.SERVICE_NOT_AVAILABLE_FOR_DISTRIBUTION, service.getVersion(), service.getName());
1282 createAudit(user, auditAction, comment, service, responseFormat);
1283 return Either.right(responseFormat);
1285 return Either.left(service);
1288 private Either<User, ResponseFormat> validateUserDistributionChange(User user, Service service, AuditingActionEnum auditAction, String comment) {
1289 log.debug("get user from DB");
1292 Either<User, ResponseFormat> eitherCreator = validateUser(user, "Activate Distribution", service, auditAction, false);
1293 if (eitherCreator.isRight()) {
1294 return Either.right(eitherCreator.right().value());
1296 user = eitherCreator.left().value();
1298 // validate user role
1299 List<Role> roles = new ArrayList<>();
1300 roles.add(Role.ADMIN);
1301 roles.add(Role.GOVERNOR);
1302 roles.add(Role.OPS);
1303 Either<Boolean, ResponseFormat> validateRes = validateUserRole(user, service, roles, auditAction, comment);
1304 if (validateRes.isRight()) {
1305 return Either.right(validateRes.right().value());
1307 return Either.left(user);
1310 private void createAudit(User user, AuditingActionEnum auditAction, String comment, ResponseFormat responseFormat) {
1311 EnumMap<AuditingFieldsKeysEnum, Object> auditingFields = new EnumMap<AuditingFieldsKeysEnum, Object>(AuditingFieldsKeysEnum.class);
1313 createAudit(user, auditAction, comment, null, responseFormat, auditingFields);
1316 private void createAudit(User user, AuditingActionEnum auditAction, String comment, Service component, ResponseFormat responseFormat) {
1317 EnumMap<AuditingFieldsKeysEnum, Object> auditingFields = new EnumMap<AuditingFieldsKeysEnum, Object>(AuditingFieldsKeysEnum.class);
1318 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_DCURR_STATUS, component.getDistributionStatus().name());
1319 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_DPREV_STATUS, component.getDistributionStatus().name());
1320 createAudit(user, auditAction, comment, component, component.getLifecycleState().name(), component.getVersion(), responseFormat, auditingFields);
1323 private void createAudit(User user, AuditingActionEnum auditAction, String comment, Service component, ResponseFormat responseFormat, EnumMap<AuditingFieldsKeysEnum, Object> auditingFields) {
1324 log.debug("audit before sending response");
1325 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_COMMENT, comment);
1326 componentsUtils.auditComponent(responseFormat, user, component, null, null, auditAction, ComponentTypeEnum.SERVICE, auditingFields);
1329 private void createAudit(User user, AuditingActionEnum auditAction, String comment, Service component, String prevState, String prevVersion, ResponseFormat responseFormat, EnumMap<AuditingFieldsKeysEnum, Object> auditingFields) {
1330 log.debug("audit before sending response");
1331 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_COMMENT, comment);
1332 componentsUtils.auditComponent(responseFormat, user, component, prevState, prevVersion, auditAction, ComponentTypeEnum.SERVICE, auditingFields);
1335 public Either<Service, ResponseFormat> activateDistribution(String serviceId, String envName, User modifier, HttpServletRequest request) {
1337 Either<User, ResponseFormat> eitherCreator = validateUserExists(modifier.getUserId(), "activate Distribution", false);
1338 if (eitherCreator.isRight()) {
1339 return Either.right(eitherCreator.right().value());
1342 User user = eitherCreator.left().value();
1344 Either<Service, ResponseFormat> result = null;
1345 ResponseFormat response = null;
1346 Service updatedService = null;
1347 String did = ThreadLocalsHolder.getUuid();
1348 EnumMap<AuditingFieldsKeysEnum, Object> auditingFields = new EnumMap<AuditingFieldsKeysEnum, Object>(AuditingFieldsKeysEnum.class);
1349 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_ID, did);
1351 String configuredEnvName = ConfigurationManager.getConfigurationManager().getDistributionEngineConfiguration().getEnvironments().get(0);
1352 if (configuredEnvName != null && false == envName.equals(configuredEnvName)) {
1353 log.trace("Update environment name to be {} instead of {}", configuredEnvName, envName);
1354 envName = configuredEnvName;
1358 ServletContext servletContext = request.getSession().getServletContext();
1359 boolean isDistributionEngineUp = getHealthCheckBL(servletContext).isDistributionEngineUp(); // DE
1360 if (!isDistributionEngineUp) {
1361 BeEcompErrorManager.getInstance().logBeSystemError("Distribution Engine is DOWN");
1362 log.debug("Distribution Engine is DOWN");
1363 response = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
1364 return Either.right(response);
1367 Either<Service, StorageOperationStatus> serviceRes = toscaOperationFacade.getToscaElement(serviceId);
1368 if (serviceRes.isRight()) {
1369 log.debug("failed retrieving service");
1370 response = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(serviceRes.right().value(), ComponentTypeEnum.SERVICE), serviceId);
1371 componentsUtils.auditComponent(response, user, null, null, null, AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_REQUEST, ComponentTypeEnum.SERVICE, auditingFields);
1372 return Either.right(response);
1374 Service service = serviceRes.left().value();
1375 String dcurrStatus = service.getDistributionStatus().name();
1376 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_DPREV_STATUS, dcurrStatus);
1378 Either<INotificationData, StorageOperationStatus> readyForDistribution = distributionEngine.isReadyForDistribution(service, did, envName);
1379 if (readyForDistribution.isLeft()) {
1380 INotificationData notificationData = readyForDistribution.left().value();
1381 StorageOperationStatus notifyServiceResponse = distributionEngine.notifyService(did, service, notificationData, envName, user.getUserId(), user.getFullName());
1382 if (notifyServiceResponse == StorageOperationStatus.OK) {
1383 Either<Service, ResponseFormat> updateStateRes = updateDistributionStatusForActivation(service, user, DistributionStatusEnum.DISTRIBUTED);
1384 if (updateStateRes.isLeft() && updateStateRes.left().value() != null) {
1385 updatedService = updateStateRes.left().value();
1386 dcurrStatus = updatedService.getDistributionStatus().name();
1388 // The response is not relevant
1389 updatedService = service;
1391 ASDCKpiApi.countActivatedDistribution();
1392 response = componentsUtils.getResponseFormat(ActionStatus.OK);
1393 result = Either.left(updatedService);
1395 BeEcompErrorManager.getInstance().logBeSystemError("Activate Distribution - send notification");
1396 log.debug("distributionEngine.notifyService response is: {}", notifyServiceResponse);
1397 response = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
1398 result = Either.right(response);
1401 StorageOperationStatus distEngineValidationResponse = readyForDistribution.right().value();
1402 response = componentsUtils.getResponseFormatByDE(componentsUtils.convertFromStorageResponse(distEngineValidationResponse), service.getName(), envName);
1403 result = Either.right(response);
1405 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_DCURR_STATUS, dcurrStatus);
1406 componentsUtils.auditComponent(response, user, service, null, null, AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_REQUEST, ComponentTypeEnum.SERVICE, auditingFields);
1410 // convert to private after deletion of temp url
1411 public Either<Service, ResponseFormat> updateDistributionStatusForActivation(Service service, User user, DistributionStatusEnum state) {
1413 Either<User, ResponseFormat> resp = validateUserExists(user.getUserId(), "update Distribution Status For Activation", false);
1414 if (resp.isRight()) {
1415 return Either.right(resp.right().value());
1418 String serviceId = service.getUniqueId();
1419 Either<Boolean, ResponseFormat> lockResult = lockComponent(serviceId, service, "updateDistributionStatusForActivation");
1420 if (lockResult.isRight()) {
1421 return Either.right(lockResult.right().value());
1424 Either<Service, StorageOperationStatus> result = toscaOperationFacade.updateDistributionStatus(service, user, state);
1425 if (result.isRight()) {
1426 titanDao.rollback();
1427 BeEcompErrorManager.getInstance().logBeSystemError("updateDistributionStatusForActivation");
1428 log.debug("service {} change distribution status failed", serviceId);
1429 return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
1432 return Either.left(result.left().value());
1434 graphLockOperation.unlockComponent(serviceId, NodeTypeEnum.Service);
1438 public Either<Service, ResponseFormat> markDistributionAsDeployed(String serviceId, String did, User user) {
1440 Either<User, ResponseFormat> resp = validateUserExists(user.getUserId(), "mark Distribution As Deployed", false);
1441 if (resp.isRight()) {
1442 return Either.right(resp.right().value());
1445 log.debug("mark distribution deployed");
1447 AuditingActionEnum auditAction = AuditingActionEnum.DISTRIBUTION_DEPLOY;
1448 Either<Service, StorageOperationStatus> getServiceResponse = toscaOperationFacade.getToscaElement(serviceId);
1449 if (getServiceResponse.isRight()) {
1450 BeEcompErrorManager.getInstance().logBeComponentMissingError("markDistributionAsDeployed", ComponentTypeEnum.SERVICE.getValue(), serviceId);
1451 log.debug("service {} not found", serviceId);
1452 ResponseFormat responseFormat = auditDeployError(did, user, auditAction, null, componentsUtils.convertFromStorageResponse(getServiceResponse.right().value(), ComponentTypeEnum.SERVICE), "");
1454 return Either.right(responseFormat);
1457 Service service = getServiceResponse.left().value();
1459 Either<User, ResponseFormat> validateRoleForDeploy = validateRoleForDeploy(did, user, auditAction, service);
1460 if (validateRoleForDeploy.isRight()) {
1461 return Either.right(validateRoleForDeploy.right().value());
1463 user = validateRoleForDeploy.left().value();
1465 return checkDistributionAndDeploy(did, user, auditAction, service);
1469 public Either<Service, ResponseFormat> generateVfModuleArtifacts(Service service, User modifier, boolean shouldLock) {
1470 Function<ComponentInstance, List<ArtifactGenerator<ArtifactDefinition>>> artifactTaskGeneratorCreator = ri ->
1471 // Only one VF Module Artifact per instance - add it to a list of one
1472 buildArtifactGenList(service, modifier, shouldLock, ri);
1474 return generateDeploymentArtifacts(service, modifier, artifactTaskGeneratorCreator);
1478 private List<ArtifactGenerator<ArtifactDefinition>> buildArtifactGenList(Service service, User modifier, boolean shouldLock, ComponentInstance ri) {
1479 List<ArtifactGenerator<ArtifactDefinition>> asList = new ArrayList<ArtifactGenerator<ArtifactDefinition>>();
1481 if (ri.getOriginType() == OriginTypeEnum.VF) {
1482 asList = Arrays.asList(new VfModuleArtifacGenerator(modifier, ri, service, shouldLock));
1487 private List<GroupInstance> collectGroupsInstanceForCompInstance(ComponentInstance currVF, Wrapper<ResponseFormat> responseWrapper) {
1489 return currVF.getGroupInstances();
1492 private ArtifactDefinition getVfModuleInstArtifactForCompInstance(ComponentInstance currVF, Service service, User modifier, List<GroupInstance> groupsForCurrVF, Wrapper<String> payloadWrapper, Wrapper<ResponseFormat> responseWrapper) {
1493 ArtifactDefinition vfModuleAertifact = null;
1494 if (MapUtils.isNotEmpty(currVF.getDeploymentArtifacts())) {
1495 Optional<ArtifactDefinition> optionalVfModuleArtifact = currVF.getDeploymentArtifacts().values().stream().filter(p -> p.getArtifactType().equals(ArtifactTypeEnum.VF_MODULES_METADATA.name())).findAny();
1496 if (optionalVfModuleArtifact.isPresent()) {
1497 vfModuleAertifact = optionalVfModuleArtifact.get();
1500 if (vfModuleAertifact == null) {
1501 Either<ArtifactDefinition, ResponseFormat> createVfModuleArtifact = createVfModuleArtifact(modifier, currVF, service, payloadWrapper.getInnerElement());
1502 if (createVfModuleArtifact.isLeft()) {
1503 vfModuleAertifact = createVfModuleArtifact.left().value();
1505 responseWrapper.setInnerElement(createVfModuleArtifact.right().value());
1508 return vfModuleAertifact;
1511 private void fillVfModuleInstHeatEnvPayload(List<GroupInstance> groupsForCurrVF, ComponentInstance currVFInstance, Wrapper<String> payloadWrapper) {
1512 // Converts GroupDefinition to VfModuleArtifactPayload which is the
1513 // format used in the payload
1515 // List<VfModuleArtifactPayload> vfModulePayloadForCurrVF = groupsForCurrVF.stream().map(group -> new VfModuleArtifactPayload(group)).collect(Collectors.toList());
1516 List<VfModuleArtifactPayload> vfModulePayloadForCurrVF = new ArrayList<VfModuleArtifactPayload>();
1517 if (groupsForCurrVF != null) {
1518 for (GroupInstance groupInstance : groupsForCurrVF) {
1519 VfModuleArtifactPayload modulePayload = new VfModuleArtifactPayload(groupInstance);
1520 vfModulePayloadForCurrVF.add(modulePayload);
1522 Collections.sort(vfModulePayloadForCurrVF, (art1, art2) -> VfModuleArtifactPayload.compareByGroupName(art1, art2));
1523 // Update Payload With Heat Env
1524 // vfModulePayloadForCurrVF.stream().forEach(e -> addHeatEnvArtifactsToVFModulePayload(e, currVFInstance));
1526 final Gson gson = new GsonBuilder().setPrettyPrinting().create();
1528 String vfModulePayloadString = gson.toJson(vfModulePayloadForCurrVF);
1529 payloadWrapper.setInnerElement(vfModulePayloadString);
1534 private void addHeatEnvArtifactsToVFModulePayload(VfModuleArtifactPayload vfModulePayload, ComponentInstance currVFInstance) {
1535 List<String> originalModuleArtifacts = vfModulePayload.getArtifacts();
1536 if (!MapUtils.isEmpty(currVFInstance.getDeploymentArtifacts()) && !CollectionUtils.isEmpty(originalModuleArtifacts)) {
1538 // EVG : fix now for patch. remove null from list. Need to be fixed later : remove VF HEAT ENV uuid from the list??
1539 List<String> filteredUUIDFromModule = originalModuleArtifacts.stream().filter(uuid -> uuid != null).collect(Collectors.toList());
1541 final Collection<ArtifactDefinition> depInsArtifacts = currVFInstance.getDeploymentArtifacts().values();
1543 List<ArtifactDefinition> heatEnvArtifacts = depInsArtifacts.stream().filter(art -> art.getArtifactType().equals(ArtifactTypeEnum.HEAT_ENV.getType())).collect(Collectors.toList());
1544 // Unique Id Of Artifacts In the vf module
1545 List<String> moduleArtUniqueId = depInsArtifacts.stream().filter(art -> originalModuleArtifacts.contains(art.getArtifactUUID())).map(art -> art.getUniqueId()).collect(Collectors.toList());
1546 // Collect Only Heat Artifatcs that are Generated from artifacts in
1548 List<String> relevantHeatEnvUUID = heatEnvArtifacts.stream().filter(heatEnv -> moduleArtUniqueId.contains(heatEnv.getGeneratedFromId())).map(heatEnv -> heatEnv.getArtifactUUID()).collect(Collectors.toList());
1550 List<String> fullArtifactList = new ArrayList<>();
1551 fullArtifactList.addAll(filteredUUIDFromModule);
1552 fullArtifactList.addAll(relevantHeatEnvUUID);
1554 vfModulePayload.setArtifacts(fullArtifactList);
1558 private Either<ArtifactDefinition, ResponseFormat> generateVfModuleInstanceArtifact(User modifier, ComponentInstance currVFInstance, Service service, boolean shouldLock) {
1559 ArtifactDefinition vfModuleAertifact = null;
1560 Wrapper<ResponseFormat> responseWrapper = new Wrapper<>();
1561 Wrapper<String> payloadWrapper = new Wrapper<>();
1562 List<GroupInstance> groupsForCurrVF = collectGroupsInstanceForCompInstance(currVFInstance, responseWrapper);
1563 if (responseWrapper.isEmpty()) {
1564 fillVfModuleInstHeatEnvPayload(groupsForCurrVF, currVFInstance, payloadWrapper);
1566 if (responseWrapper.isEmpty() && payloadWrapper.getInnerElement() != null) {
1567 vfModuleAertifact = getVfModuleInstArtifactForCompInstance(currVFInstance, service, modifier, groupsForCurrVF, payloadWrapper, responseWrapper);
1569 if (responseWrapper.isEmpty() && vfModuleAertifact != null) {
1570 vfModuleAertifact = fillVfModulePayload(modifier, currVFInstance, vfModuleAertifact, shouldLock, payloadWrapper, responseWrapper, service);
1573 Either<ArtifactDefinition, ResponseFormat> result;
1574 if (responseWrapper.isEmpty()) {
1575 result = Either.left(vfModuleAertifact);
1577 result = Either.right(responseWrapper.getInnerElement());
1583 private ArtifactDefinition fillVfModulePayload(User modifier, ComponentInstance currVF, ArtifactDefinition vfModuleArtifact, boolean shouldLock, Wrapper<String> payloadWrapper, Wrapper<ResponseFormat> responseWrapper, Service service) {
1584 ArtifactDefinition result = null;
1585 // final Either<Resource, StorageOperationStatus> eitherResource = toscaOperationFacade.getToscaElement(currVF.getComponentUid());
1586 // if (eitherResource.isRight()) {
1587 // responseWrapper.setInnerElement(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(eitherResource.right().value())));
1588 // } else if (!payloadWrapper.isEmpty()) {
1589 // Resource resource = eitherResource.left().value();
1590 Either<ArtifactDefinition, ResponseFormat> eitherPayload = artifactsBusinessLogic.generateArtifactPayload(vfModuleArtifact, ComponentTypeEnum.RESOURCE_INSTANCE, service, currVF.getName(), modifier, shouldLock, () -> System.currentTimeMillis(),
1591 () -> Either.left(artifactsBusinessLogic.createEsArtifactData(vfModuleArtifact, payloadWrapper.getInnerElement().getBytes(StandardCharsets.UTF_8))), currVF.getUniqueId());
1592 if (eitherPayload.isLeft()) {
1593 result = eitherPayload.left().value();
1595 responseWrapper.setInnerElement(eitherPayload.right().value());
1598 if (result == null) {
1599 result = vfModuleArtifact;
1605 private Either<ArtifactDefinition, ResponseFormat> createVfModuleArtifact(User modifier, ComponentInstance currVF, Service service, String vfModulePayloadString) {
1607 ArtifactDefinition vfModuleArtifactDefinition = new ArtifactDefinition();
1608 String newCheckSum = null;
1610 vfModuleArtifactDefinition.setDescription("Auto-generated VF Modules information artifact");
1611 vfModuleArtifactDefinition.setArtifactDisplayName("Vf Modules Metadata");
1612 vfModuleArtifactDefinition.setArtifactType(ArtifactTypeEnum.VF_MODULES_METADATA.getType());
1613 vfModuleArtifactDefinition.setArtifactGroupType(ArtifactGroupTypeEnum.DEPLOYMENT);
1614 vfModuleArtifactDefinition.setArtifactLabel("vfModulesMetadata");
1615 vfModuleArtifactDefinition.setTimeout(0);
1616 vfModuleArtifactDefinition.setArtifactName(currVF.getNormalizedName() + "_modules.json");
1617 vfModuleArtifactDefinition.setPayloadData(vfModulePayloadString);
1618 if (vfModulePayloadString != null) {
1619 newCheckSum = GeneralUtility.calculateMD5Base64EncodedByByteArray(vfModulePayloadString.getBytes());
1621 vfModuleArtifactDefinition.setArtifactChecksum(newCheckSum);
1623 Either<ArtifactDefinition, StorageOperationStatus> addArifactToComponent = artifactToscaOperation.addArifactToComponent(vfModuleArtifactDefinition, service.getUniqueId(), NodeTypeEnum.ResourceInstance, true, currVF.getUniqueId());
1625 Either<ArtifactDefinition, ResponseFormat> result;
1626 if (addArifactToComponent.isLeft()) {
1627 result = Either.left(addArifactToComponent.left().value());
1629 result = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(addArifactToComponent.right().value())));
1635 public Either<Service, ResponseFormat> generateHeatEnvArtifacts(Service service, User modifier, boolean shouldLock) {
1637 Function<ComponentInstance, List<ArtifactGenerator<ArtifactDefinition>>> artifactTaskGeneratorCreator = resourceInstance ->
1638 // Get All Deployment Artifacts
1639 service.getComponentInstances().stream().filter(ri -> ri != null && ri == resourceInstance).filter(ri -> ri.getDeploymentArtifacts() != null).flatMap(ri -> ri.getDeploymentArtifacts().values().stream()).
1640 // Filter in Only Heat Env
1641 filter(depArtifact -> ArtifactTypeEnum.HEAT_ENV.getType().equals(depArtifact.getArtifactType())).
1642 // Create ArtifactGenerator from those Artifacts
1643 map(depArtifact -> new HeatEnvArtifactGenerator(depArtifact, service, resourceInstance.getName(), modifier, shouldLock, resourceInstance.getUniqueId())).collect(Collectors.toList());
1645 return generateDeploymentArtifacts(service, modifier, artifactTaskGeneratorCreator);
1649 private <CallVal> Either<Service, ResponseFormat> generateDeploymentArtifacts(Service service, User modifier, Function<ComponentInstance, List<ArtifactGenerator<CallVal>>> artifactTaskGeneratorCreator) {
1651 // Get Flat List of (Callable) ArtifactGenerator for all the RI in the
1653 if (service.getComponentInstances() != null) {
1654 List<ArtifactGenerator<CallVal>> artifactGenList = service.getComponentInstances().stream().flatMap(ri -> artifactTaskGeneratorCreator.apply(ri).stream()).collect(Collectors.toList());
1655 if (artifactGenList != null && !artifactGenList.isEmpty()) {
1656 for (ArtifactGenerator<CallVal> entry : artifactGenList) {
1657 Either<CallVal, ResponseFormat> callRes;
1659 callRes = entry.call();
1660 if (callRes.isRight()) {
1661 log.debug("Failed to generate artifact error : {}", callRes.right().value());
1662 return Either.right(callRes.right().value());
1664 } catch (Exception e) {
1665 log.debug("Failed to generate artifact exception : {}", e);
1666 return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
1671 return Either.left(service);
1674 abstract class ArtifactGenerator<CallVal> implements Callable<Either<CallVal, ResponseFormat>> {
1678 class HeatEnvArtifactGenerator extends ArtifactGenerator<ArtifactDefinition> {
1679 ArtifactDefinition artifactDefinition;
1681 String resourceInstanceName;
1686 HeatEnvArtifactGenerator(ArtifactDefinition artifactDefinition, Service service, String resourceInstanceName, User modifier, boolean shouldLock, String instanceId) {
1687 this.artifactDefinition = artifactDefinition;
1688 this.service = service;
1689 this.resourceInstanceName = resourceInstanceName;
1690 this.modifier = modifier;
1691 this.shouldLock = shouldLock;
1692 this.instanceId = instanceId;
1696 public Either<ArtifactDefinition, ResponseFormat> call() throws Exception {
1697 return artifactsBusinessLogic.generateHeatEnvArtifact(artifactDefinition, ComponentTypeEnum.RESOURCE_INSTANCE, service, resourceInstanceName, modifier, shouldLock, instanceId);
1700 public ArtifactDefinition getArtifactDefinition() {
1701 return artifactDefinition;
1706 class VfModuleArtifacGenerator extends ArtifactGenerator<ArtifactDefinition> {
1708 private ComponentInstance componentInstance;
1709 private Service service;
1713 public Either<ArtifactDefinition, ResponseFormat> call() throws Exception {
1714 return generateVfModuleInstanceArtifact(user, componentInstance, service, shouldLock);// generateVfModuleArtifact(user, componentInstance, service, shouldLock);
1717 private VfModuleArtifacGenerator(User user, ComponentInstance componentInstance, Service service, boolean shouldLock) {
1720 this.componentInstance = componentInstance;
1721 this.service = service;
1722 this.shouldLock = shouldLock;
1727 private synchronized Either<Service, ResponseFormat> checkDistributionAndDeploy(String did, User user, AuditingActionEnum auditAction, Service service) {
1728 boolean isDeployed = isDistributionDeployed(did, service);
1730 return Either.left(service);
1732 Either<Boolean, ResponseFormat> distributionSuccess = checkDistributionSuccess(did, user, auditAction, service);
1733 if (distributionSuccess.isRight()) {
1734 return Either.right(distributionSuccess.right().value());
1737 log.debug("mark distribution {} as deployed - success", did);
1738 componentsUtils.auditServiceDistributionDeployed(auditAction, service.getName(), service.getVersion(), service.getUUID(), did, STATUS_DEPLOYED, "OK", user);
1739 return Either.left(service);
1742 private boolean isDistributionDeployed(String did, Service service) {
1743 Either<List<DistributionDeployEvent>, ActionStatus> alreadyDeployed = auditCassandraDao.getDistributionDeployByStatus(did, AuditingActionEnum.DISTRIBUTION_DEPLOY.getName(), STATUS_DEPLOYED);
1745 boolean isDeployed = false;
1746 if (alreadyDeployed.isLeft() && !alreadyDeployed.left().value().isEmpty()) {
1748 log.debug("distribution {} is already deployed", did);
1754 protected Either<Boolean, ResponseFormat> checkDistributionSuccess(String did, User user, AuditingActionEnum auditAction, Service service) {
1756 log.trace("checkDistributionSuccess");
1757 // get all "DRequest" records for this distribution
1758 // Either<List<ESTimeBasedEvent>, ActionStatus> distRequestsResponse =
1759 // auditingDao.getListOfDistributionByAction(did,
1760 // AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_REQUEST.getName(), "",
1761 // ResourceAdminEvent.class);
1762 Either<List<ResourceAdminEvent>, ActionStatus> distRequestsResponse = auditCassandraDao.getDistributionRequest(did, AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_REQUEST.getName());
1763 if (distRequestsResponse.isRight()) {
1764 ResponseFormat error = auditDeployError(did, user, auditAction, service, distRequestsResponse.right().value());
1765 return Either.right(error);
1768 List<ResourceAdminEvent> distributionRequests = distRequestsResponse.left().value();
1769 if (distributionRequests.isEmpty()) {
1770 BeEcompErrorManager.getInstance().logBeDistributionMissingError("markDistributionAsDeployed", did);
1771 log.info("distribution {} is not found", did);
1772 ResponseFormat error = auditDeployError(did, user, auditAction, service, ActionStatus.DISTRIBUTION_REQUESTED_NOT_FOUND);
1773 return Either.right(error);
1775 boolean isRequestSucceeded = false;
1776 for (ResourceAdminEvent event : distributionRequests) {
1777 String eventStatus = event.getStatus();
1778 if (eventStatus != null && eventStatus.equals(STATUS_SUCCESS_200)) {
1779 isRequestSucceeded = true;
1784 // get all "DNotify" records for this distribution
1785 // Either<List<ESTimeBasedEvent>, ActionStatus>
1786 // distNotificationsResponse =
1787 // auditingDao.getListOfDistributionByAction(did,
1788 // AuditingActionEnum.DISTRIBUTION_NOTIFY.getName(), "",
1789 // DistributionNotificationEvent.class);
1790 Either<List<DistributionNotificationEvent>, ActionStatus> distNotificationsResponse = auditCassandraDao.getDistributionNotify(did, AuditingActionEnum.DISTRIBUTION_NOTIFY.getName());
1791 if (distNotificationsResponse.isRight()) {
1792 ResponseFormat error = auditDeployError(did, user, auditAction, service, distNotificationsResponse.right().value());
1793 return Either.right(error);
1796 List<DistributionNotificationEvent> distributionNotifications = distNotificationsResponse.left().value();
1797 boolean isNotificationsSucceeded = false;
1798 for (DistributionNotificationEvent event : distributionNotifications) {
1799 String eventStatus = event.getStatus();
1800 if (eventStatus != null && eventStatus.equals(STATUS_SUCCESS_200)) {
1801 isNotificationsSucceeded = true;
1806 // if request failed OR there are notifications that failed
1807 if (!(isRequestSucceeded && isNotificationsSucceeded)) {
1809 log.info("distribution {} has failed", did);
1810 ResponseFormat error = componentsUtils.getResponseFormat(ActionStatus.DISTRIBUTION_REQUESTED_FAILED, did);
1811 auditDeployError(did, user, auditAction, service, ActionStatus.DISTRIBUTION_REQUESTED_FAILED, did);
1812 return Either.right(error);
1814 return Either.left(true);
1817 private ResponseFormat auditDeployError(String did, User user, AuditingActionEnum auditAction, Service service, ActionStatus status, String... params) {
1819 ResponseFormat error = componentsUtils.getResponseFormat(status, params);
1820 String message = "";
1821 if (error.getMessageId() != null) {
1822 message = error.getMessageId() + ": ";
1824 message += error.getFormattedMessage();
1826 if (service != null) {
1827 componentsUtils.auditServiceDistributionDeployed(auditAction, service.getName(), service.getVersion(), service.getUUID(), did, error.getStatus().toString(), message, user);
1829 componentsUtils.auditServiceDistributionDeployed(auditAction, "", "", "", did, error.getStatus().toString(), message, user);
1834 private Either<User, ResponseFormat> validateRoleForDeploy(String did, User user, AuditingActionEnum auditAction, Service service) {
1835 Either<User, ActionStatus> eitherCreator = userAdmin.getUser(user.getUserId(), false);
1836 if (eitherCreator.isRight() || eitherCreator.left().value() == null) {
1837 BeEcompErrorManager.getInstance().logBeUserMissingError("Deploy Service", user.getUserId());
1838 log.debug("validateRoleForDeploy method - user is not listed. userId= {}", user.getUserId());
1839 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.USER_NOT_FOUND, user.getUserId());
1840 auditDeployError(did, user, auditAction, service, ActionStatus.USER_NOT_FOUND);
1841 return Either.right(responseFormat);
1843 user = eitherCreator.left().value();
1844 log.debug("validate user role");
1845 List<Role> roles = new ArrayList<>();
1846 roles.add(Role.ADMIN);
1847 roles.add(Role.OPS);
1848 Either<Boolean, ResponseFormat> validateRes = validateUserRole(user, service, roles, auditAction, null);
1849 if (validateRes.isRight()) {
1850 log.info("role {} is not allowed to perform this action", user.getRole());
1851 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
1852 auditDeployError(did, user, auditAction, service, ActionStatus.RESTRICTED_OPERATION);
1853 return Either.right(responseFormat);
1855 return Either.left(user);
1860 public void setDeploymentArtifactsPlaceHolder(Component component, User user) {
1865 public Either<List<String>, ResponseFormat> deleteMarkedComponents() {
1866 return deleteMarkedComponents(ComponentTypeEnum.SERVICE);
1869 private HealthCheckBusinessLogic getHealthCheckBL(ServletContext context) {
1870 WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
1871 WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
1872 HealthCheckBusinessLogic healthCheckBl = webApplicationContext.getBean(HealthCheckBusinessLogic.class);
1873 return healthCheckBl;
1877 public ComponentInstanceBusinessLogic getComponentInstanceBL() {
1878 return serviceComponentInstanceBusinessLogic;
1882 public Either<List<ComponentInstance>, ResponseFormat> getComponentInstancesFilteredByPropertiesAndInputs(String componentId, ComponentTypeEnum componentTypeEnum, String userId, String searchText) {
1884 Either<User, ResponseFormat> resp = validateUserExists(userId, "Get Component Instances", false);
1885 if (resp.isRight()) {
1886 return Either.right(resp.right().value());
1888 Either<Component, StorageOperationStatus> getComponentRes = toscaOperationFacade.getToscaElement(componentId, JsonParseFlagEnum.ParseAll);
1889 if (getComponentRes.isRight()) {
1890 ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(getComponentRes.right().value()));
1891 return Either.right(responseFormat);
1894 List<ComponentInstance> componentInstances = getComponentRes.left().value().getComponentInstances();
1895 // componentInstances = componentInstances.stream().filter(instance -> instance.getOriginType().equals(OriginTypeEnum.VF)).collect(Collectors.toList());
1897 return Either.left(componentInstances);
1900 public ICacheMangerOperation getCacheManagerOperation() {
1901 return cacheManagerOperation;
1904 public void setCacheManagerOperation(ICacheMangerOperation cacheManagerOperation) {
1905 this.cacheManagerOperation = cacheManagerOperation;
1909 * updates group instance with new property values in case of successful update of group instance related component instance will be updated with new modification time and related service will be updated with new last update date
1913 * @param componentInstanceId
1914 * @param groupInstanceId
1915 * @param newProperties
1918 public Either<List<GroupInstanceProperty>, ResponseFormat> updateGroupInstancePropertyValues(User modifier, String serviceId, String componentInstanceId, String groupInstanceId, List<GroupInstanceProperty> newProperties) {
1920 Either<List<GroupInstanceProperty>, ResponseFormat> actionResult = null;
1921 Either<ImmutablePair<Component, User>, ResponseFormat> validateUserAndComponentRes;
1922 Component component = null;
1923 Either<Boolean, ResponseFormat> lockResult = null;
1924 log.debug("Going to update group instance {} of service {} with new property values. ", groupInstanceId, serviceId);
1926 validateUserAndComponentRes = validateUserAndComponent(serviceId, modifier);
1927 if (validateUserAndComponentRes.isRight()) {
1928 log.debug("Cannot update group instance {} of service {} with new property values. Validation failed. ", groupInstanceId, serviceId);
1929 actionResult = Either.right(validateUserAndComponentRes.right().value());
1931 if (actionResult == null) {
1932 component = validateUserAndComponentRes.left().value().getKey();
1933 lockResult = lockComponentByName(component.getSystemName(), component, "Update Group Instance on Service");
1934 if (lockResult.isRight()) {
1935 log.debug("Failed to lock service {}. Response is {}. ", component.getName(), lockResult.right().value().getFormattedMessage());
1936 actionResult = Either.right(lockResult.right().value());
1938 log.debug("The service with system name {} locked. ", component.getSystemName());
1941 if (actionResult == null) {
1942 actionResult = validateAndUpdateGroupInstancePropertyValuesAndContainingParents(component, componentInstanceId, groupInstanceId, newProperties);
1943 if (actionResult.isRight()) {
1944 log.debug("Failed to validate and update group instance {} property values and containing parents. The message is {}. ", groupInstanceId, actionResult.right().value().getFormattedMessage());
1947 } catch (Exception e) {
1948 log.error("Exception occured during update Group Instance property values: {}", e.getMessage(), e);
1949 actionResult = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
1951 if (lockResult != null && lockResult.isLeft() && lockResult.left().value()) {
1952 graphLockOperation.unlockComponentByName(component.getSystemName(), component.getUniqueId(), NodeTypeEnum.Service);
1955 return actionResult;
1958 private Either<List<GroupInstanceProperty>, ResponseFormat> validateAndUpdateGroupInstancePropertyValuesAndContainingParents(Component component, String componentInstanceId, String groupInstanceId, List<GroupInstanceProperty> newProperties) {
1960 Either<List<GroupInstanceProperty>, ResponseFormat> actionResult = null;
1961 Either<ImmutablePair<ComponentInstance, GroupInstance>, ResponseFormat> findGroupInstanceRes;
1962 Either<ImmutablePair<ComponentMetadataData, ComponentInstanceData>, ResponseFormat> updateParentsModificationTimeRes;
1963 ComponentInstance relatedComponentInstance = null;
1964 GroupInstance oldGroupInstance = null;
1965 Either<GroupInstance, ResponseFormat> updateGroupInstanceResult = null;
1966 GroupInstance updatedGroupInstance = null;
1967 boolean inTransaction = true;
1968 boolean shouldCloseTransaction = true;
1969 findGroupInstanceRes = findGroupInstanceOnRelatedComponentInstance(component, componentInstanceId, groupInstanceId);
1970 if (findGroupInstanceRes.isRight()) {
1971 log.debug("Group instance {} not found. ", groupInstanceId);
1972 actionResult = Either.right(findGroupInstanceRes.right().value());
1974 if (actionResult == null) {
1975 oldGroupInstance = findGroupInstanceRes.left().value().getValue();
1976 relatedComponentInstance = findGroupInstanceRes.left().value().getKey();
1977 updateGroupInstanceResult = groupBusinessLogic.validateAndUpdateGroupInstancePropertyValues(component.getUniqueId(), componentInstanceId, oldGroupInstance, newProperties, inTransaction);
1978 if (updateGroupInstanceResult.isRight()) {
1979 log.debug("Failed to update group instance {} property values. ", oldGroupInstance.getName());
1980 actionResult = Either.right(updateGroupInstanceResult.right().value());
1983 if (actionResult == null) {
1984 updatedGroupInstance = updateGroupInstanceResult.left().value();
1985 if (!oldGroupInstance.getModificationTime().equals(updatedGroupInstance.getModificationTime())) {
1986 updateParentsModificationTimeRes = updateParentsModificationTimeAndCustomizationUuid(component, relatedComponentInstance, updatedGroupInstance, inTransaction, shouldCloseTransaction);
1987 if (updateParentsModificationTimeRes.isRight()) {
1988 log.debug("Failed to update modification time. ", oldGroupInstance.getName());
1989 actionResult = Either.right(updateParentsModificationTimeRes.right().value());
1993 if (actionResult == null) {
1994 actionResult = Either.left(updatedGroupInstance.convertToGroupInstancesProperties());
1996 return actionResult;
1999 private Either<ImmutablePair<ComponentMetadataData, ComponentInstanceData>, ResponseFormat> updateParentsModificationTimeAndCustomizationUuid(Component component, ComponentInstance relatedComponentInstance, GroupInstance updatedGroupInstance,
2000 boolean inTranscation, boolean shouldCloseTransaction) {
2002 Either<ImmutablePair<ComponentMetadataData, ComponentInstanceData>, ResponseFormat> actionResult;
2003 Either<ComponentMetadataData, StorageOperationStatus> serviceMetadataUpdateResult;
2004 Either<ComponentInstanceData, ResponseFormat> updateComponentInstanceRes = serviceComponentInstanceBusinessLogic.updateComponentInstanceModificationTimeAndCustomizationUuid(relatedComponentInstance, NodeTypeEnum.ResourceInstance,
2005 updatedGroupInstance.getModificationTime(), inTranscation);
2006 if (updateComponentInstanceRes.isRight()) {
2007 log.debug("Failed to update component instance {} after update of group instance {}. ", relatedComponentInstance.getName(), updatedGroupInstance.getName());
2008 actionResult = Either.right(updateComponentInstanceRes.right().value());
2010 serviceMetadataUpdateResult = toscaOperationFacade.updateComponentLastUpdateDateOnGraph(component, updatedGroupInstance.getModificationTime());
2011 if (serviceMetadataUpdateResult.isRight()) {
2012 log.debug("Failed to update service {} after update of component instance {} with new property values of group instance {}. ", component.getName(), relatedComponentInstance.getName(), updatedGroupInstance.getName());
2013 actionResult = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(serviceMetadataUpdateResult.right().value())));
2015 actionResult = Either.left(new ImmutablePair<>(serviceMetadataUpdateResult.left().value(), updateComponentInstanceRes.left().value()));
2018 return actionResult;
2021 private Either<ImmutablePair<Component, User>, ResponseFormat> validateUserAndComponent(String serviceId, User modifier) {
2023 Either<ImmutablePair<Component, User>, ResponseFormat> result = null;
2024 Either<Component, ResponseFormat> validateComponentExistsRes = null;
2025 User currUser = null;
2026 Component component = null;
2027 Either<User, ResponseFormat> validationUserResult = validateUserIgnoreAudit(modifier, "updateGroupInstancePropertyValues");
2028 if (validationUserResult.isRight()) {
2029 log.debug("Failed to validate user with userId for update service {}. ", modifier.getUserId(), serviceId);
2030 result = Either.right(validationUserResult.right().value());
2032 if (result == null) {
2033 currUser = validationUserResult.left().value();
2034 validateComponentExistsRes = validateComponentExists(serviceId, ComponentTypeEnum.SERVICE, null);
2035 if (validateComponentExistsRes.isRight()) {
2036 log.debug("Failed to validate service existing {}. ", serviceId);
2037 result = Either.right(validateComponentExistsRes.right().value());
2040 if (result == null) {
2041 component = validateComponentExistsRes.left().value();
2042 if (!ComponentValidationUtils.canWorkOnComponent(component, currUser.getUserId())) {
2043 log.info("Restricted operation for user: {}, on service: {}", currUser.getUserId(), component.getCreatorUserId());
2044 return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
2047 if (result == null) {
2048 result = Either.left(new ImmutablePair<>(component, currUser));
2053 private Either<ImmutablePair<ComponentInstance, GroupInstance>, ResponseFormat> findGroupInstanceOnRelatedComponentInstance(Component component, String componentInstanceId, String groupInstanceId) {
2055 Either<ImmutablePair<ComponentInstance, GroupInstance>, ResponseFormat> actionResult = null;
2056 GroupInstance groupInstance = null;
2057 ComponentInstance foundComponentInstance = findRelatedComponentInstance(component, componentInstanceId);
2058 if (foundComponentInstance == null) {
2059 log.debug("Component instance {} not found on service {}. ", componentInstanceId, component.getName());
2060 actionResult = Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstanceId, "resource instance", "service", component.getName()));
2061 } else if (!CollectionUtils.isEmpty(foundComponentInstance.getGroupInstances())) {
2062 groupInstance = foundComponentInstance.getGroupInstances().stream().filter(gi -> gi.getUniqueId().equals(groupInstanceId)).findFirst().orElse(null);
2063 if (groupInstance == null) {
2064 log.debug("Group instance {} not found on component instance {}. ", groupInstanceId, foundComponentInstance.getName());
2065 actionResult = Either.right(componentsUtils.getResponseFormat(ActionStatus.GROUP_INSTANCE_NOT_FOUND_ON_COMPONENT_INSTANCE, groupInstanceId, foundComponentInstance.getName()));
2068 if (actionResult == null) {
2069 actionResult = Either.left(new ImmutablePair<>(foundComponentInstance, groupInstance));
2071 return actionResult;
2074 private ComponentInstance findRelatedComponentInstance(Component component, String componentInstanceId) {
2075 ComponentInstance componentInstance = null;
2076 if (!CollectionUtils.isEmpty(component.getComponentInstances())) {
2077 componentInstance = component.getComponentInstances().stream().filter(ci -> ci.getUniqueId().equals(componentInstanceId)).findFirst().orElse(null);
2079 return componentInstance;
2082 private Either<User, ResponseFormat> validateUserIgnoreAudit(User modifier, String ecompErrorContext) {
2083 Either<User, ResponseFormat> result = validateUser(modifier, ecompErrorContext, null, null, false);
2084 if (result.isLeft()) {
2085 List<Role> roles = new ArrayList<>();
2086 roles.add(Role.ADMIN);
2087 roles.add(Role.DESIGNER);
2088 Either<Boolean, ResponseFormat> validationRoleRes = validateUserRole(result.left().value(), roles);
2089 if (validationRoleRes.isRight()) {
2090 result = Either.right(validationRoleRes.right().value());
2096 public Either<UiComponentDataTransfer, ResponseFormat> getUiComponentDataTransferByComponentId(String serviceId, List<String> dataParamsToReturn) {
2098 ComponentParametersView paramsToRetuen = new ComponentParametersView(dataParamsToReturn);
2099 Either<Service, StorageOperationStatus> serviceResultEither = toscaOperationFacade.getToscaElement(serviceId, paramsToRetuen);
2101 if (serviceResultEither.isRight()) {
2102 if(serviceResultEither.right().value().equals(StorageOperationStatus.NOT_FOUND)) {
2103 log.debug("Failed to found service with id {} ", serviceId);
2104 Either.right(componentsUtils.getResponseFormat(ActionStatus.SERVICE_NOT_FOUND, serviceId));
2107 log.debug("failed to get service by id {} with filters {}", serviceId, dataParamsToReturn.toString());
2108 return Either.right(componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(serviceResultEither.right().value()), ""));
2111 Service service = serviceResultEither.left().value();
2112 UiComponentDataTransfer dataTransfer = UiComponentDataConverter.getUiDataTransferFromServiceByParams(service, dataParamsToReturn);
2113 return Either.left(dataTransfer);