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());
1147 user = eitherCreator.left().value();
1149 Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(serviceId);
1150 if (storageStatus.isRight()) {
1151 log.debug("failed to get service by id {}", serviceId);
1152 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE), serviceId));
1154 // Service service =
1155 // createServiceApiArtifactLIst(storageStatus.left().value());
1156 Service service = storageStatus.left().value();
1157 return Either.left(service);
1160 public Either<Service, ResponseFormat> getServiceByNameAndVersion(String serviceName, String serviceVersion, String userId) {
1161 Either<User, ResponseFormat> resp = validateUserExists(userId, "get Service By Name And Version", false);
1162 if (resp.isRight()) {
1163 return Either.right(resp.right().value());
1165 Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getComponentByNameAndVersion(ComponentTypeEnum.SERVICE, serviceName, serviceVersion);
1166 if (storageStatus.isRight()) {
1167 log.debug("failed to get service by name {} and version {}", serviceName, serviceVersion);
1168 return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE), serviceName));
1170 Service service = storageStatus.left().value();
1171 return Either.left(service);
1174 @SuppressWarnings("unchecked")
1175 private void createMandatoryArtifactsData(Service service, User user) {
1176 // create mandatory artifacts
1178 // TODO it must be removed after that artifact uniqueId creation will be
1179 // moved to ArtifactOperation
1180 // String serviceUniqueId =
1181 // UniqueIdBuilder.buildServiceUniqueId(service.getComponentMetadataDefinition().getMetadataDataDefinition().getName(),
1182 // service.getComponentMetadataDefinition().getMetadataDataDefinition().getVersion());
1183 String serviceUniqueId = service.getUniqueId();
1184 Map<String, ArtifactDefinition> artifactMap = service.getArtifacts();
1185 if (artifactMap == null)
1186 artifactMap = new HashMap<String, ArtifactDefinition>();
1188 Map<String, Object> informationalServiceArtifacts = ConfigurationManager.getConfigurationManager().getConfiguration().getInformationalServiceArtifacts();
1189 List<String> exludeServiceCategory = ConfigurationManager.getConfigurationManager().getConfiguration().getExcludeServiceCategory();
1191 String category = service.getCategories().get(0).getName();
1192 boolean isCreateArtifact = true;
1193 if (category != null && exludeServiceCategory != null && !exludeServiceCategory.isEmpty()) {
1194 for (String exlude : exludeServiceCategory) {
1195 if (exlude.equalsIgnoreCase(category)) {
1196 isCreateArtifact = false;
1203 if (informationalServiceArtifacts != null && isCreateArtifact) {
1204 Set<String> keys = informationalServiceArtifacts.keySet();
1205 for (String informationalServiceArtifactName : keys) {
1206 Map<String, Object> artifactInfoMap = (Map<String, Object>) informationalServiceArtifacts.get(informationalServiceArtifactName);
1207 ArtifactDefinition artifactDefinition = createArtifactDefinition(serviceUniqueId, informationalServiceArtifactName, artifactInfoMap, user, false);
1208 artifactMap.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
1212 service.setArtifacts(artifactMap);
1216 private ArtifactDefinition createArtifactDefinition(String serviceId, String logicalName, Map<String, Object> artifactInfoMap, User user, Boolean isServiceApi) {
1218 ArtifactDefinition artifactInfo = artifactsBusinessLogic.createArtifactPlaceHolderInfo(serviceId, logicalName, artifactInfoMap, user, ArtifactGroupTypeEnum.INFORMATIONAL);
1221 artifactInfo.setMandatory(false);
1222 artifactInfo.setServiceApi(true);
1224 return artifactInfo;
1227 private Either<DistributionTransitionEnum, ResponseFormat> validateTransitionEnum(String distributionTransition, User user) {
1228 DistributionTransitionEnum transitionEnum = null;
1230 transitionEnum = DistributionTransitionEnum.getFromDisplayName(distributionTransition);
1231 if (transitionEnum == null) {
1232 BeEcompErrorManager.getInstance().logBeSystemError("Change Service Distribution");
1233 log.info("state operation is not valid. operations allowed are: {}", DistributionTransitionEnum.valuesAsString());
1234 ResponseFormat error = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
1235 return Either.right(error);
1238 return Either.left(transitionEnum);
1241 private Either<String, ResponseFormat> validateComment(LifecycleChangeInfoWithAction comment, User user, AuditingActionEnum auditAction) {
1242 String data = comment.getUserRemarks();
1244 if (data == null || data.trim().isEmpty()) {
1245 BeEcompErrorManager.getInstance().logBeInvalidJsonInput("Change Service Distribution");
1246 log.debug("user comment cannot be empty or null.");
1247 return Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
1249 data = ValidationUtils.removeNoneUtf8Chars(data);
1250 data = ValidationUtils.removeHtmlTags(data);
1251 data = ValidationUtils.normaliseWhitespace(data);
1252 data = ValidationUtils.stripOctets(data);
1254 if (!ValidationUtils.validateLength(data, ValidationUtils.COMMENT_MAX_LENGTH)) {
1255 BeEcompErrorManager.getInstance().logBeInvalidJsonInput("Change Service Distribution");
1256 log.debug("user comment exceeds limit.");
1257 return Either.right(componentsUtils.getResponseFormat(ActionStatus.EXCEEDS_LIMIT, "comment", String.valueOf(ValidationUtils.COMMENT_MAX_LENGTH)));
1259 if (!ValidationUtils.validateIsEnglish(data)) {
1260 return Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
1262 return Either.left(data);
1265 private Either<Service, ResponseFormat> validateServiceDistributionChange(User user, String serviceId, AuditingActionEnum auditAction, String comment) {
1266 Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(serviceId);
1267 if (storageStatus.isRight()) {
1268 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.SERVICE_NOT_FOUND, serviceId);
1269 createAudit(user, auditAction, comment, responseFormat);
1270 return Either.right(responseFormat);
1272 Service service = storageStatus.left().value();
1274 if (service.getLifecycleState() != LifecycleStateEnum.CERTIFIED) {
1275 log.info("service {} is not available for distribution. Should be in certified state", service.getUniqueId());
1276 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.SERVICE_NOT_AVAILABLE_FOR_DISTRIBUTION, service.getVersion(), service.getName());
1277 createAudit(user, auditAction, comment, service, responseFormat);
1278 return Either.right(responseFormat);
1280 return Either.left(service);
1283 private Either<User, ResponseFormat> validateUserDistributionChange(User user, Service service, AuditingActionEnum auditAction, String comment) {
1284 log.debug("get user from DB");
1287 Either<User, ResponseFormat> eitherCreator = validateUser(user, "Activate Distribution", service, auditAction, false);
1288 if (eitherCreator.isRight()) {
1289 return Either.right(eitherCreator.right().value());
1291 user = eitherCreator.left().value();
1293 // validate user role
1294 List<Role> roles = new ArrayList<>();
1295 roles.add(Role.ADMIN);
1296 roles.add(Role.GOVERNOR);
1297 roles.add(Role.OPS);
1298 Either<Boolean, ResponseFormat> validateRes = validateUserRole(user, service, roles, auditAction, comment);
1299 if (validateRes.isRight()) {
1300 return Either.right(validateRes.right().value());
1302 return Either.left(user);
1305 private void createAudit(User user, AuditingActionEnum auditAction, String comment, ResponseFormat responseFormat) {
1306 EnumMap<AuditingFieldsKeysEnum, Object> auditingFields = new EnumMap<AuditingFieldsKeysEnum, Object>(AuditingFieldsKeysEnum.class);
1308 createAudit(user, auditAction, comment, null, responseFormat, auditingFields);
1311 private void createAudit(User user, AuditingActionEnum auditAction, String comment, Service component, ResponseFormat responseFormat) {
1312 EnumMap<AuditingFieldsKeysEnum, Object> auditingFields = new EnumMap<AuditingFieldsKeysEnum, Object>(AuditingFieldsKeysEnum.class);
1313 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_DCURR_STATUS, component.getDistributionStatus().name());
1314 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_DPREV_STATUS, component.getDistributionStatus().name());
1315 createAudit(user, auditAction, comment, component, component.getLifecycleState().name(), component.getVersion(), responseFormat, auditingFields);
1318 private void createAudit(User user, AuditingActionEnum auditAction, String comment, Service component, ResponseFormat responseFormat, EnumMap<AuditingFieldsKeysEnum, Object> auditingFields) {
1319 log.debug("audit before sending response");
1320 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_COMMENT, comment);
1321 componentsUtils.auditComponent(responseFormat, user, component, null, null, auditAction, ComponentTypeEnum.SERVICE, auditingFields);
1324 private void createAudit(User user, AuditingActionEnum auditAction, String comment, Service component, String prevState, String prevVersion, ResponseFormat responseFormat, EnumMap<AuditingFieldsKeysEnum, Object> auditingFields) {
1325 log.debug("audit before sending response");
1326 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_COMMENT, comment);
1327 componentsUtils.auditComponent(responseFormat, user, component, prevState, prevVersion, auditAction, ComponentTypeEnum.SERVICE, auditingFields);
1330 public Either<Service, ResponseFormat> activateDistribution(String serviceId, String envName, User modifier, HttpServletRequest request) {
1332 Either<User, ResponseFormat> eitherCreator = validateUserExists(modifier.getUserId(), "activate Distribution", false);
1333 if (eitherCreator.isRight()) {
1334 return Either.right(eitherCreator.right().value());
1337 User user = eitherCreator.left().value();
1339 Either<Service, ResponseFormat> result = null;
1340 ResponseFormat response = null;
1341 Service updatedService = null;
1342 String did = ThreadLocalsHolder.getUuid();
1343 EnumMap<AuditingFieldsKeysEnum, Object> auditingFields = new EnumMap<AuditingFieldsKeysEnum, Object>(AuditingFieldsKeysEnum.class);
1344 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_ID, did);
1346 String configuredEnvName = ConfigurationManager.getConfigurationManager().getDistributionEngineConfiguration().getEnvironments().get(0);
1347 if (configuredEnvName != null && false == envName.equals(configuredEnvName)) {
1348 log.trace("Update environment name to be {} instead of {}", configuredEnvName, envName);
1349 envName = configuredEnvName;
1353 ServletContext servletContext = request.getSession().getServletContext();
1354 boolean isDistributionEngineUp = getHealthCheckBL(servletContext).isDistributionEngineUp(); // DE
1355 if (!isDistributionEngineUp) {
1356 BeEcompErrorManager.getInstance().logBeSystemError("Distribution Engine is DOWN");
1357 log.debug("Distribution Engine is DOWN");
1358 response = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
1359 return Either.right(response);
1362 Either<Service, StorageOperationStatus> serviceRes = toscaOperationFacade.getToscaElement(serviceId);
1363 if (serviceRes.isRight()) {
1364 log.debug("failed retrieving service");
1365 response = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(serviceRes.right().value(), ComponentTypeEnum.SERVICE), serviceId);
1366 componentsUtils.auditComponent(response, user, null, null, null, AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_REQUEST, ComponentTypeEnum.SERVICE, auditingFields);
1367 return Either.right(response);
1369 Service service = serviceRes.left().value();
1370 String dcurrStatus = service.getDistributionStatus().name();
1371 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_DPREV_STATUS, dcurrStatus);
1373 Either<INotificationData, StorageOperationStatus> readyForDistribution = distributionEngine.isReadyForDistribution(service, did, envName);
1374 if (readyForDistribution.isLeft()) {
1375 INotificationData notificationData = readyForDistribution.left().value();
1376 StorageOperationStatus notifyServiceResponse = distributionEngine.notifyService(did, service, notificationData, envName, user.getUserId(), user.getFullName());
1377 if (notifyServiceResponse == StorageOperationStatus.OK) {
1378 Either<Service, ResponseFormat> updateStateRes = updateDistributionStatusForActivation(service, user, DistributionStatusEnum.DISTRIBUTED);
1379 if (updateStateRes.isLeft() && updateStateRes.left().value() != null) {
1380 updatedService = updateStateRes.left().value();
1381 dcurrStatus = updatedService.getDistributionStatus().name();
1383 // The response is not relevant
1384 updatedService = service;
1386 ASDCKpiApi.countActivatedDistribution();
1387 response = componentsUtils.getResponseFormat(ActionStatus.OK);
1388 result = Either.left(updatedService);
1390 BeEcompErrorManager.getInstance().logBeSystemError("Activate Distribution - send notification");
1391 log.debug("distributionEngine.notifyService response is: {}", notifyServiceResponse);
1392 response = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
1393 result = Either.right(response);
1396 StorageOperationStatus distEngineValidationResponse = readyForDistribution.right().value();
1397 response = componentsUtils.getResponseFormatByDE(componentsUtils.convertFromStorageResponse(distEngineValidationResponse), service.getName(), envName);
1398 result = Either.right(response);
1400 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_DCURR_STATUS, dcurrStatus);
1401 componentsUtils.auditComponent(response, user, service, null, null, AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_REQUEST, ComponentTypeEnum.SERVICE, auditingFields);
1405 // convert to private after deletion of temp url
1406 public Either<Service, ResponseFormat> updateDistributionStatusForActivation(Service service, User user, DistributionStatusEnum state) {
1408 Either<User, ResponseFormat> resp = validateUserExists(user.getUserId(), "update Distribution Status For Activation", false);
1409 if (resp.isRight()) {
1410 return Either.right(resp.right().value());
1413 String serviceId = service.getUniqueId();
1414 Either<Boolean, ResponseFormat> lockResult = lockComponent(serviceId, service, "updateDistributionStatusForActivation");
1415 if (lockResult.isRight()) {
1416 return Either.right(lockResult.right().value());
1419 Either<Service, StorageOperationStatus> result = toscaOperationFacade.updateDistributionStatus(service, user, state);
1420 if (result.isRight()) {
1421 titanDao.rollback();
1422 BeEcompErrorManager.getInstance().logBeSystemError("updateDistributionStatusForActivation");
1423 log.debug("service {} change distribution status failed", serviceId);
1424 return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
1427 return Either.left(result.left().value());
1429 graphLockOperation.unlockComponent(serviceId, NodeTypeEnum.Service);
1433 public Either<Service, ResponseFormat> markDistributionAsDeployed(String serviceId, String did, User user) {
1435 Either<User, ResponseFormat> resp = validateUserExists(user.getUserId(), "mark Distribution As Deployed", false);
1436 if (resp.isRight()) {
1437 return Either.right(resp.right().value());
1440 log.debug("mark distribution deployed");
1442 AuditingActionEnum auditAction = AuditingActionEnum.DISTRIBUTION_DEPLOY;
1443 Either<Service, StorageOperationStatus> getServiceResponse = toscaOperationFacade.getToscaElement(serviceId);
1444 if (getServiceResponse.isRight()) {
1445 BeEcompErrorManager.getInstance().logBeComponentMissingError("markDistributionAsDeployed", ComponentTypeEnum.SERVICE.getValue(), serviceId);
1446 log.debug("service {} not found", serviceId);
1447 ResponseFormat responseFormat = auditDeployError(did, user, auditAction, null, componentsUtils.convertFromStorageResponse(getServiceResponse.right().value(), ComponentTypeEnum.SERVICE), "");
1449 return Either.right(responseFormat);
1452 Service service = getServiceResponse.left().value();
1454 Either<User, ResponseFormat> validateRoleForDeploy = validateRoleForDeploy(did, user, auditAction, service);
1455 if (validateRoleForDeploy.isRight()) {
1456 return Either.right(validateRoleForDeploy.right().value());
1458 user = validateRoleForDeploy.left().value();
1460 return checkDistributionAndDeploy(did, user, auditAction, service);
1464 public Either<Service, ResponseFormat> generateVfModuleArtifacts(Service service, User modifier, boolean shouldLock) {
1465 Function<ComponentInstance, List<ArtifactGenerator<ArtifactDefinition>>> artifactTaskGeneratorCreator = ri ->
1466 // Only one VF Module Artifact per instance - add it to a list of one
1467 buildArtifactGenList(service, modifier, shouldLock, ri);
1469 return generateDeploymentArtifacts(service, modifier, artifactTaskGeneratorCreator);
1473 private List<ArtifactGenerator<ArtifactDefinition>> buildArtifactGenList(Service service, User modifier, boolean shouldLock, ComponentInstance ri) {
1474 List<ArtifactGenerator<ArtifactDefinition>> asList = new ArrayList<ArtifactGenerator<ArtifactDefinition>>();
1476 if (ri.getOriginType() == OriginTypeEnum.VF) {
1477 asList = Arrays.asList(new VfModuleArtifacGenerator(modifier, ri, service, shouldLock));
1482 private List<GroupInstance> collectGroupsInstanceForCompInstance(ComponentInstance currVF, Wrapper<ResponseFormat> responseWrapper) {
1484 return currVF.getGroupInstances();
1487 private ArtifactDefinition getVfModuleInstArtifactForCompInstance(ComponentInstance currVF, Service service, User modifier, List<GroupInstance> groupsForCurrVF, Wrapper<String> payloadWrapper, Wrapper<ResponseFormat> responseWrapper) {
1488 ArtifactDefinition vfModuleAertifact = null;
1489 if (MapUtils.isNotEmpty(currVF.getDeploymentArtifacts())) {
1490 Optional<ArtifactDefinition> optionalVfModuleArtifact = currVF.getDeploymentArtifacts().values().stream().filter(p -> p.getArtifactType().equals(ArtifactTypeEnum.VF_MODULES_METADATA.name())).findAny();
1491 if (optionalVfModuleArtifact.isPresent()) {
1492 vfModuleAertifact = optionalVfModuleArtifact.get();
1495 if (vfModuleAertifact == null) {
1496 Either<ArtifactDefinition, ResponseFormat> createVfModuleArtifact = createVfModuleArtifact(modifier, currVF, service, payloadWrapper.getInnerElement());
1497 if (createVfModuleArtifact.isLeft()) {
1498 vfModuleAertifact = createVfModuleArtifact.left().value();
1500 responseWrapper.setInnerElement(createVfModuleArtifact.right().value());
1503 return vfModuleAertifact;
1506 private void fillVfModuleInstHeatEnvPayload(List<GroupInstance> groupsForCurrVF, ComponentInstance currVFInstance, Wrapper<String> payloadWrapper) {
1507 // Converts GroupDefinition to VfModuleArtifactPayload which is the
1508 // format used in the payload
1510 // List<VfModuleArtifactPayload> vfModulePayloadForCurrVF = groupsForCurrVF.stream().map(group -> new VfModuleArtifactPayload(group)).collect(Collectors.toList());
1511 List<VfModuleArtifactPayload> vfModulePayloadForCurrVF = new ArrayList<VfModuleArtifactPayload>();
1512 if (groupsForCurrVF != null) {
1513 for (GroupInstance groupInstance : groupsForCurrVF) {
1514 VfModuleArtifactPayload modulePayload = new VfModuleArtifactPayload(groupInstance);
1515 vfModulePayloadForCurrVF.add(modulePayload);
1517 Collections.sort(vfModulePayloadForCurrVF, (art1, art2) -> VfModuleArtifactPayload.compareByGroupName(art1, art2));
1518 // Update Payload With Heat Env
1519 // vfModulePayloadForCurrVF.stream().forEach(e -> addHeatEnvArtifactsToVFModulePayload(e, currVFInstance));
1521 final Gson gson = new GsonBuilder().setPrettyPrinting().create();
1523 String vfModulePayloadString = gson.toJson(vfModulePayloadForCurrVF);
1524 payloadWrapper.setInnerElement(vfModulePayloadString);
1529 private void addHeatEnvArtifactsToVFModulePayload(VfModuleArtifactPayload vfModulePayload, ComponentInstance currVFInstance) {
1530 List<String> originalModuleArtifacts = vfModulePayload.getArtifacts();
1531 if (!MapUtils.isEmpty(currVFInstance.getDeploymentArtifacts()) && !CollectionUtils.isEmpty(originalModuleArtifacts)) {
1533 // EVG : fix now for patch. remove null from list. Need to be fixed later : remove VF HEAT ENV uuid from the list??
1534 List<String> filteredUUIDFromModule = originalModuleArtifacts.stream().filter(uuid -> uuid != null).collect(Collectors.toList());
1536 final Collection<ArtifactDefinition> depInsArtifacts = currVFInstance.getDeploymentArtifacts().values();
1538 List<ArtifactDefinition> heatEnvArtifacts = depInsArtifacts.stream().filter(art -> art.getArtifactType().equals(ArtifactTypeEnum.HEAT_ENV.getType())).collect(Collectors.toList());
1539 // Unique Id Of Artifacts In the vf module
1540 List<String> moduleArtUniqueId = depInsArtifacts.stream().filter(art -> originalModuleArtifacts.contains(art.getArtifactUUID())).map(art -> art.getUniqueId()).collect(Collectors.toList());
1541 // Collect Only Heat Artifatcs that are Generated from artifacts in
1543 List<String> relevantHeatEnvUUID = heatEnvArtifacts.stream().filter(heatEnv -> moduleArtUniqueId.contains(heatEnv.getGeneratedFromId())).map(heatEnv -> heatEnv.getArtifactUUID()).collect(Collectors.toList());
1545 List<String> fullArtifactList = new ArrayList<>();
1546 fullArtifactList.addAll(filteredUUIDFromModule);
1547 fullArtifactList.addAll(relevantHeatEnvUUID);
1549 vfModulePayload.setArtifacts(fullArtifactList);
1553 private Either<ArtifactDefinition, ResponseFormat> generateVfModuleInstanceArtifact(User modifier, ComponentInstance currVFInstance, Service service, boolean shouldLock) {
1554 ArtifactDefinition vfModuleAertifact = null;
1555 Wrapper<ResponseFormat> responseWrapper = new Wrapper<>();
1556 Wrapper<String> payloadWrapper = new Wrapper<>();
1557 List<GroupInstance> groupsForCurrVF = collectGroupsInstanceForCompInstance(currVFInstance, responseWrapper);
1558 if (responseWrapper.isEmpty()) {
1559 fillVfModuleInstHeatEnvPayload(groupsForCurrVF, currVFInstance, payloadWrapper);
1561 if (responseWrapper.isEmpty() && payloadWrapper.getInnerElement() != null) {
1562 vfModuleAertifact = getVfModuleInstArtifactForCompInstance(currVFInstance, service, modifier, groupsForCurrVF, payloadWrapper, responseWrapper);
1564 if (responseWrapper.isEmpty() && vfModuleAertifact != null) {
1565 vfModuleAertifact = fillVfModulePayload(modifier, currVFInstance, vfModuleAertifact, shouldLock, payloadWrapper, responseWrapper, service);
1568 Either<ArtifactDefinition, ResponseFormat> result;
1569 if (responseWrapper.isEmpty()) {
1570 result = Either.left(vfModuleAertifact);
1572 result = Either.right(responseWrapper.getInnerElement());
1578 private ArtifactDefinition fillVfModulePayload(User modifier, ComponentInstance currVF, ArtifactDefinition vfModuleArtifact, boolean shouldLock, Wrapper<String> payloadWrapper, Wrapper<ResponseFormat> responseWrapper, Service service) {
1579 ArtifactDefinition result = null;
1580 // final Either<Resource, StorageOperationStatus> eitherResource = toscaOperationFacade.getToscaElement(currVF.getComponentUid());
1581 // if (eitherResource.isRight()) {
1582 // responseWrapper.setInnerElement(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(eitherResource.right().value())));
1583 // } else if (!payloadWrapper.isEmpty()) {
1584 // Resource resource = eitherResource.left().value();
1585 Either<ArtifactDefinition, ResponseFormat> eitherPayload = artifactsBusinessLogic.generateArtifactPayload(vfModuleArtifact, ComponentTypeEnum.RESOURCE_INSTANCE, service, currVF.getName(), modifier, shouldLock, () -> System.currentTimeMillis(),
1586 () -> Either.left(artifactsBusinessLogic.createEsArtifactData(vfModuleArtifact, payloadWrapper.getInnerElement().getBytes(StandardCharsets.UTF_8))), currVF.getUniqueId());
1587 if (eitherPayload.isLeft()) {
1588 result = eitherPayload.left().value();
1590 responseWrapper.setInnerElement(eitherPayload.right().value());
1593 if (result == null) {
1594 result = vfModuleArtifact;
1600 private Either<ArtifactDefinition, ResponseFormat> createVfModuleArtifact(User modifier, ComponentInstance currVF, Service service, String vfModulePayloadString) {
1602 ArtifactDefinition vfModuleArtifactDefinition = new ArtifactDefinition();
1603 String newCheckSum = null;
1605 vfModuleArtifactDefinition.setDescription("Auto-generated VF Modules information artifact");
1606 vfModuleArtifactDefinition.setArtifactDisplayName("Vf Modules Metadata");
1607 vfModuleArtifactDefinition.setArtifactType(ArtifactTypeEnum.VF_MODULES_METADATA.getType());
1608 vfModuleArtifactDefinition.setArtifactGroupType(ArtifactGroupTypeEnum.DEPLOYMENT);
1609 vfModuleArtifactDefinition.setArtifactLabel("vfModulesMetadata");
1610 vfModuleArtifactDefinition.setTimeout(0);
1611 vfModuleArtifactDefinition.setArtifactName(currVF.getNormalizedName() + "_modules.json");
1612 vfModuleArtifactDefinition.setPayloadData(vfModulePayloadString);
1613 if (vfModulePayloadString != null) {
1614 newCheckSum = GeneralUtility.calculateMD5ByByteArray(vfModulePayloadString.getBytes());
1616 vfModuleArtifactDefinition.setArtifactChecksum(newCheckSum);
1618 Either<ArtifactDefinition, StorageOperationStatus> addArifactToComponent = artifactToscaOperation.addArifactToComponent(vfModuleArtifactDefinition, service.getUniqueId(), NodeTypeEnum.ResourceInstance, true, currVF.getUniqueId());
1620 Either<ArtifactDefinition, ResponseFormat> result;
1621 if (addArifactToComponent.isLeft()) {
1622 result = Either.left(addArifactToComponent.left().value());
1624 result = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(addArifactToComponent.right().value())));
1630 public Either<Service, ResponseFormat> generateHeatEnvArtifacts(Service service, User modifier, boolean shouldLock) {
1632 Function<ComponentInstance, List<ArtifactGenerator<ArtifactDefinition>>> artifactTaskGeneratorCreator = resourceInstance ->
1633 // Get All Deployment Artifacts
1634 service.getComponentInstances().stream().filter(ri -> ri != null && ri == resourceInstance).filter(ri -> ri.getDeploymentArtifacts() != null).flatMap(ri -> ri.getDeploymentArtifacts().values().stream()).
1635 // Filter in Only Heat Env
1636 filter(depArtifact -> ArtifactTypeEnum.HEAT_ENV.getType().equals(depArtifact.getArtifactType())).
1637 // Create ArtifactGenerator from those Artifacts
1638 map(depArtifact -> new HeatEnvArtifactGenerator(depArtifact, service, resourceInstance.getName(), modifier, shouldLock, resourceInstance.getUniqueId())).collect(Collectors.toList());
1640 return generateDeploymentArtifacts(service, modifier, artifactTaskGeneratorCreator);
1644 private <CallVal> Either<Service, ResponseFormat> generateDeploymentArtifacts(Service service, User modifier, Function<ComponentInstance, List<ArtifactGenerator<CallVal>>> artifactTaskGeneratorCreator) {
1646 // Get Flat List of (Callable) ArtifactGenerator for all the RI in the
1648 if (service.getComponentInstances() != null) {
1649 List<ArtifactGenerator<CallVal>> artifactGenList = service.getComponentInstances().stream().flatMap(ri -> artifactTaskGeneratorCreator.apply(ri).stream()).collect(Collectors.toList());
1650 if (artifactGenList != null && !artifactGenList.isEmpty()) {
1651 for (ArtifactGenerator<CallVal> entry : artifactGenList) {
1652 Either<CallVal, ResponseFormat> callRes;
1654 callRes = entry.call();
1655 if (callRes.isRight()) {
1656 log.debug("Failed to generate artifact error : {}", callRes.right().value());
1657 return Either.right(callRes.right().value());
1659 } catch (Exception e) {
1660 log.debug("Failed to generate artifact exception : {}", e);
1661 return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
1666 return Either.left(service);
1669 abstract class ArtifactGenerator<CallVal> implements Callable<Either<CallVal, ResponseFormat>> {
1673 class HeatEnvArtifactGenerator extends ArtifactGenerator<ArtifactDefinition> {
1674 ArtifactDefinition artifactDefinition;
1676 String resourceInstanceName;
1681 HeatEnvArtifactGenerator(ArtifactDefinition artifactDefinition, Service service, String resourceInstanceName, User modifier, boolean shouldLock, String instanceId) {
1682 this.artifactDefinition = artifactDefinition;
1683 this.service = service;
1684 this.resourceInstanceName = resourceInstanceName;
1685 this.modifier = modifier;
1686 this.shouldLock = shouldLock;
1687 this.instanceId = instanceId;
1691 public Either<ArtifactDefinition, ResponseFormat> call() throws Exception {
1692 return artifactsBusinessLogic.generateHeatEnvArtifact(artifactDefinition, ComponentTypeEnum.RESOURCE_INSTANCE, service, resourceInstanceName, modifier, shouldLock, instanceId);
1695 public ArtifactDefinition getArtifactDefinition() {
1696 return artifactDefinition;
1701 class VfModuleArtifacGenerator extends ArtifactGenerator<ArtifactDefinition> {
1703 private ComponentInstance componentInstance;
1704 private Service service;
1708 public Either<ArtifactDefinition, ResponseFormat> call() throws Exception {
1709 return generateVfModuleInstanceArtifact(user, componentInstance, service, shouldLock);// generateVfModuleArtifact(user, componentInstance, service, shouldLock);
1712 private VfModuleArtifacGenerator(User user, ComponentInstance componentInstance, Service service, boolean shouldLock) {
1715 this.componentInstance = componentInstance;
1716 this.service = service;
1717 this.shouldLock = shouldLock;
1722 private synchronized Either<Service, ResponseFormat> checkDistributionAndDeploy(String did, User user, AuditingActionEnum auditAction, Service service) {
1723 boolean isDeployed = isDistributionDeployed(did, service);
1725 return Either.left(service);
1727 Either<Boolean, ResponseFormat> distributionSuccess = checkDistributionSuccess(did, user, auditAction, service);
1728 if (distributionSuccess.isRight()) {
1729 return Either.right(distributionSuccess.right().value());
1732 log.debug("mark distribution {} as deployed - success", did);
1733 componentsUtils.auditServiceDistributionDeployed(auditAction, service.getName(), service.getVersion(), service.getUUID(), did, STATUS_DEPLOYED, "OK", user);
1734 return Either.left(service);
1737 private boolean isDistributionDeployed(String did, Service service) {
1738 Either<List<DistributionDeployEvent>, ActionStatus> alreadyDeployed = auditCassandraDao.getDistributionDeployByStatus(did, AuditingActionEnum.DISTRIBUTION_DEPLOY.getName(), STATUS_DEPLOYED);
1740 boolean isDeployed = false;
1741 if (alreadyDeployed.isLeft() && !alreadyDeployed.left().value().isEmpty()) {
1743 log.debug("distribution {} is already deployed", did);
1749 protected Either<Boolean, ResponseFormat> checkDistributionSuccess(String did, User user, AuditingActionEnum auditAction, Service service) {
1751 log.trace("checkDistributionSuccess");
1752 // get all "DRequest" records for this distribution
1753 // Either<List<ESTimeBasedEvent>, ActionStatus> distRequestsResponse =
1754 // auditingDao.getListOfDistributionByAction(did,
1755 // AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_REQUEST.getName(), "",
1756 // ResourceAdminEvent.class);
1757 Either<List<ResourceAdminEvent>, ActionStatus> distRequestsResponse = auditCassandraDao.getDistributionRequest(did, AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_REQUEST.getName());
1758 if (distRequestsResponse.isRight()) {
1759 ResponseFormat error = auditDeployError(did, user, auditAction, service, distRequestsResponse.right().value());
1760 return Either.right(error);
1763 List<ResourceAdminEvent> distributionRequests = distRequestsResponse.left().value();
1764 if (distributionRequests.isEmpty()) {
1765 BeEcompErrorManager.getInstance().logBeDistributionMissingError("markDistributionAsDeployed", did);
1766 log.info("distribution {} is not found", did);
1767 ResponseFormat error = auditDeployError(did, user, auditAction, service, ActionStatus.DISTRIBUTION_REQUESTED_NOT_FOUND);
1768 return Either.right(error);
1770 boolean isRequestSucceeded = false;
1771 for (ResourceAdminEvent event : distributionRequests) {
1772 String eventStatus = event.getStatus();
1773 if (eventStatus != null && eventStatus.equals(STATUS_SUCCESS_200)) {
1774 isRequestSucceeded = true;
1779 // get all "DNotify" records for this distribution
1780 // Either<List<ESTimeBasedEvent>, ActionStatus>
1781 // distNotificationsResponse =
1782 // auditingDao.getListOfDistributionByAction(did,
1783 // AuditingActionEnum.DISTRIBUTION_NOTIFY.getName(), "",
1784 // DistributionNotificationEvent.class);
1785 Either<List<DistributionNotificationEvent>, ActionStatus> distNotificationsResponse = auditCassandraDao.getDistributionNotify(did, AuditingActionEnum.DISTRIBUTION_NOTIFY.getName());
1786 if (distNotificationsResponse.isRight()) {
1787 ResponseFormat error = auditDeployError(did, user, auditAction, service, distNotificationsResponse.right().value());
1788 return Either.right(error);
1791 List<DistributionNotificationEvent> distributionNotifications = distNotificationsResponse.left().value();
1792 boolean isNotificationsSucceeded = false;
1793 for (DistributionNotificationEvent event : distributionNotifications) {
1794 String eventStatus = event.getStatus();
1795 if (eventStatus != null && eventStatus.equals(STATUS_SUCCESS_200)) {
1796 isNotificationsSucceeded = true;
1801 // if request failed OR there are notifications that failed
1802 if (!(isRequestSucceeded && isNotificationsSucceeded)) {
1804 log.info("distribution {} has failed", did);
1805 ResponseFormat error = componentsUtils.getResponseFormat(ActionStatus.DISTRIBUTION_REQUESTED_FAILED, did);
1806 auditDeployError(did, user, auditAction, service, ActionStatus.DISTRIBUTION_REQUESTED_FAILED, did);
1807 return Either.right(error);
1809 return Either.left(true);
1812 private ResponseFormat auditDeployError(String did, User user, AuditingActionEnum auditAction, Service service, ActionStatus status, String... params) {
1814 ResponseFormat error = componentsUtils.getResponseFormat(status, params);
1815 String message = "";
1816 if (error.getMessageId() != null) {
1817 message = error.getMessageId() + ": ";
1819 message += error.getFormattedMessage();
1821 if (service != null) {
1822 componentsUtils.auditServiceDistributionDeployed(auditAction, service.getName(), service.getVersion(), service.getUUID(), did, error.getStatus().toString(), message, user);
1824 componentsUtils.auditServiceDistributionDeployed(auditAction, "", "", "", did, error.getStatus().toString(), message, user);
1829 private Either<User, ResponseFormat> validateRoleForDeploy(String did, User user, AuditingActionEnum auditAction, Service service) {
1830 Either<User, ActionStatus> eitherCreator = userAdmin.getUser(user.getUserId(), false);
1831 if (eitherCreator.isRight() || eitherCreator.left().value() == null) {
1832 BeEcompErrorManager.getInstance().logBeUserMissingError("Deploy Service", user.getUserId());
1833 log.debug("validateRoleForDeploy method - user is not listed. userId= {}", user.getUserId());
1834 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.USER_NOT_FOUND, user.getUserId());
1835 auditDeployError(did, user, auditAction, service, ActionStatus.USER_NOT_FOUND);
1836 return Either.right(responseFormat);
1838 user = eitherCreator.left().value();
1839 log.debug("validate user role");
1840 List<Role> roles = new ArrayList<>();
1841 roles.add(Role.ADMIN);
1842 roles.add(Role.OPS);
1843 Either<Boolean, ResponseFormat> validateRes = validateUserRole(user, service, roles, auditAction, null);
1844 if (validateRes.isRight()) {
1845 log.info("role {} is not allowed to perform this action", user.getRole());
1846 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
1847 auditDeployError(did, user, auditAction, service, ActionStatus.RESTRICTED_OPERATION);
1848 return Either.right(responseFormat);
1850 return Either.left(user);
1855 public void setDeploymentArtifactsPlaceHolder(Component component, User user) {
1860 public Either<List<String>, ResponseFormat> deleteMarkedComponents() {
1861 return deleteMarkedComponents(ComponentTypeEnum.SERVICE);
1864 private HealthCheckBusinessLogic getHealthCheckBL(ServletContext context) {
1865 WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
1866 WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
1867 HealthCheckBusinessLogic healthCheckBl = webApplicationContext.getBean(HealthCheckBusinessLogic.class);
1868 return healthCheckBl;
1872 public ComponentInstanceBusinessLogic getComponentInstanceBL() {
1873 return serviceComponentInstanceBusinessLogic;
1877 public Either<List<ComponentInstance>, ResponseFormat> getComponentInstancesFilteredByPropertiesAndInputs(String componentId, ComponentTypeEnum componentTypeEnum, String userId, String searchText) {
1879 Either<User, ResponseFormat> resp = validateUserExists(userId, "Get Component Instances", false);
1880 if (resp.isRight()) {
1881 return Either.right(resp.right().value());
1883 Either<Component, StorageOperationStatus> getComponentRes = toscaOperationFacade.getToscaElement(componentId, JsonParseFlagEnum.ParseAll);
1884 if (getComponentRes.isRight()) {
1885 ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(getComponentRes.right().value()));
1886 return Either.right(responseFormat);
1889 List<ComponentInstance> componentInstances = getComponentRes.left().value().getComponentInstances();
1890 // componentInstances = componentInstances.stream().filter(instance -> instance.getOriginType().equals(OriginTypeEnum.VF)).collect(Collectors.toList());
1892 return Either.left(componentInstances);
1895 public ICacheMangerOperation getCacheManagerOperation() {
1896 return cacheManagerOperation;
1899 public void setCacheManagerOperation(ICacheMangerOperation cacheManagerOperation) {
1900 this.cacheManagerOperation = cacheManagerOperation;
1904 * 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
1908 * @param componentInstanceId
1909 * @param groupInstanceId
1910 * @param newProperties
1913 public Either<List<GroupInstanceProperty>, ResponseFormat> updateGroupInstancePropertyValues(User modifier, String serviceId, String componentInstanceId, String groupInstanceId, List<GroupInstanceProperty> newProperties) {
1915 Either<List<GroupInstanceProperty>, ResponseFormat> actionResult = null;
1916 Either<ImmutablePair<Component, User>, ResponseFormat> validateUserAndComponentRes;
1917 Component component = null;
1918 Either<Boolean, ResponseFormat> lockResult = null;
1919 log.debug("Going to update group instance {} of service {} with new property values. ", groupInstanceId, serviceId);
1921 validateUserAndComponentRes = validateUserAndComponent(serviceId, modifier);
1922 if (validateUserAndComponentRes.isRight()) {
1923 log.debug("Cannot update group instance {} of service {} with new property values. Validation failed. ", groupInstanceId, serviceId);
1924 actionResult = Either.right(validateUserAndComponentRes.right().value());
1926 if (actionResult == null) {
1927 component = validateUserAndComponentRes.left().value().getKey();
1928 lockResult = lockComponentByName(component.getSystemName(), component, "Update Group Instance on Service");
1929 if (lockResult.isRight()) {
1930 log.debug("Failed to lock service {}. Response is {}. ", component.getName(), lockResult.right().value().getFormattedMessage());
1931 actionResult = Either.right(lockResult.right().value());
1933 log.debug("The service with system name {} locked. ", component.getSystemName());
1936 if (actionResult == null) {
1937 actionResult = validateAndUpdateGroupInstancePropertyValuesAndContainingParents(component, componentInstanceId, groupInstanceId, newProperties);
1938 if (actionResult.isRight()) {
1939 log.debug("Failed to validate and update group instance {} property values and containing parents. The message is {}. ", groupInstanceId, actionResult.right().value().getFormattedMessage());
1942 } catch (Exception e) {
1943 log.error("Exception occured during update Group Instance property values: {}", e.getMessage(), e);
1944 actionResult = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
1946 if (lockResult != null && lockResult.isLeft() && lockResult.left().value()) {
1947 graphLockOperation.unlockComponentByName(component.getSystemName(), component.getUniqueId(), NodeTypeEnum.Service);
1950 return actionResult;
1953 private Either<List<GroupInstanceProperty>, ResponseFormat> validateAndUpdateGroupInstancePropertyValuesAndContainingParents(Component component, String componentInstanceId, String groupInstanceId, List<GroupInstanceProperty> newProperties) {
1955 Either<List<GroupInstanceProperty>, ResponseFormat> actionResult = null;
1956 Either<ImmutablePair<ComponentInstance, GroupInstance>, ResponseFormat> findGroupInstanceRes;
1957 Either<ImmutablePair<ComponentMetadataData, ComponentInstanceData>, ResponseFormat> updateParentsModificationTimeRes;
1958 ComponentInstance relatedComponentInstance = null;
1959 GroupInstance oldGroupInstance = null;
1960 Either<GroupInstance, ResponseFormat> updateGroupInstanceResult = null;
1961 GroupInstance updatedGroupInstance = null;
1962 boolean inTransaction = true;
1963 boolean shouldCloseTransaction = true;
1964 findGroupInstanceRes = findGroupInstanceOnRelatedComponentInstance(component, componentInstanceId, groupInstanceId);
1965 if (findGroupInstanceRes.isRight()) {
1966 log.debug("Group instance {} not found. ", groupInstanceId);
1967 actionResult = Either.right(findGroupInstanceRes.right().value());
1969 if (actionResult == null) {
1970 oldGroupInstance = findGroupInstanceRes.left().value().getValue();
1971 relatedComponentInstance = findGroupInstanceRes.left().value().getKey();
1972 updateGroupInstanceResult = groupBusinessLogic.validateAndUpdateGroupInstancePropertyValues(component.getUniqueId(), componentInstanceId, oldGroupInstance, newProperties, inTransaction);
1973 if (updateGroupInstanceResult.isRight()) {
1974 log.debug("Failed to update group instance {} property values. ", oldGroupInstance.getName());
1975 actionResult = Either.right(updateGroupInstanceResult.right().value());
1978 if (actionResult == null) {
1979 updatedGroupInstance = updateGroupInstanceResult.left().value();
1980 if (!oldGroupInstance.getModificationTime().equals(updatedGroupInstance.getModificationTime())) {
1981 updateParentsModificationTimeRes = updateParentsModificationTimeAndCustomizationUuid(component, relatedComponentInstance, updatedGroupInstance, inTransaction, shouldCloseTransaction);
1982 if (updateParentsModificationTimeRes.isRight()) {
1983 log.debug("Failed to update modification time. ", oldGroupInstance.getName());
1984 actionResult = Either.right(updateParentsModificationTimeRes.right().value());
1988 if (actionResult == null) {
1989 actionResult = Either.left(updatedGroupInstance.convertToGroupInstancesProperties());
1991 return actionResult;
1994 private Either<ImmutablePair<ComponentMetadataData, ComponentInstanceData>, ResponseFormat> updateParentsModificationTimeAndCustomizationUuid(Component component, ComponentInstance relatedComponentInstance, GroupInstance updatedGroupInstance,
1995 boolean inTranscation, boolean shouldCloseTransaction) {
1997 Either<ImmutablePair<ComponentMetadataData, ComponentInstanceData>, ResponseFormat> actionResult;
1998 Either<ComponentMetadataData, StorageOperationStatus> serviceMetadataUpdateResult;
1999 Either<ComponentInstanceData, ResponseFormat> updateComponentInstanceRes = serviceComponentInstanceBusinessLogic.updateComponentInstanceModificationTimeAndCustomizationUuid(relatedComponentInstance, NodeTypeEnum.ResourceInstance,
2000 updatedGroupInstance.getModificationTime(), inTranscation);
2001 if (updateComponentInstanceRes.isRight()) {
2002 log.debug("Failed to update component instance {} after update of group instance {}. ", relatedComponentInstance.getName(), updatedGroupInstance.getName());
2003 actionResult = Either.right(updateComponentInstanceRes.right().value());
2005 serviceMetadataUpdateResult = toscaOperationFacade.updateComponentLastUpdateDateOnGraph(component, updatedGroupInstance.getModificationTime());
2006 if (serviceMetadataUpdateResult.isRight()) {
2007 log.debug("Failed to update service {} after update of component instance {} with new property values of group instance {}. ", component.getName(), relatedComponentInstance.getName(), updatedGroupInstance.getName());
2008 actionResult = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(serviceMetadataUpdateResult.right().value())));
2010 actionResult = Either.left(new ImmutablePair<>(serviceMetadataUpdateResult.left().value(), updateComponentInstanceRes.left().value()));
2013 return actionResult;
2016 private Either<ImmutablePair<Component, User>, ResponseFormat> validateUserAndComponent(String serviceId, User modifier) {
2018 Either<ImmutablePair<Component, User>, ResponseFormat> result = null;
2019 Either<Component, ResponseFormat> validateComponentExistsRes = null;
2020 User currUser = null;
2021 Component component = null;
2022 Either<User, ResponseFormat> validationUserResult = validateUserIgnoreAudit(modifier, "updateGroupInstancePropertyValues");
2023 if (validationUserResult.isRight()) {
2024 log.debug("Failed to validate user with userId for update service {}. ", modifier.getUserId(), serviceId);
2025 result = Either.right(validationUserResult.right().value());
2027 if (result == null) {
2028 currUser = validationUserResult.left().value();
2029 validateComponentExistsRes = validateComponentExists(serviceId, ComponentTypeEnum.SERVICE, null);
2030 if (validateComponentExistsRes.isRight()) {
2031 log.debug("Failed to validate service existing {}. ", serviceId);
2032 result = Either.right(validateComponentExistsRes.right().value());
2035 if (result == null) {
2036 component = validateComponentExistsRes.left().value();
2037 if (!ComponentValidationUtils.canWorkOnComponent(component, currUser.getUserId())) {
2038 log.info("Restricted operation for user: {}, on service: {}", currUser.getUserId(), component.getCreatorUserId());
2039 return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
2042 if (result == null) {
2043 result = Either.left(new ImmutablePair<>(component, currUser));
2048 private Either<ImmutablePair<ComponentInstance, GroupInstance>, ResponseFormat> findGroupInstanceOnRelatedComponentInstance(Component component, String componentInstanceId, String groupInstanceId) {
2050 Either<ImmutablePair<ComponentInstance, GroupInstance>, ResponseFormat> actionResult = null;
2051 GroupInstance groupInstance = null;
2052 ComponentInstance foundComponentInstance = findRelatedComponentInstance(component, componentInstanceId);
2053 if (foundComponentInstance == null) {
2054 log.debug("Component instance {} not found on service {}. ", componentInstanceId, component.getName());
2055 actionResult = Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstanceId, "resource instance", "service", component.getName()));
2056 } else if (!CollectionUtils.isEmpty(foundComponentInstance.getGroupInstances())) {
2057 groupInstance = foundComponentInstance.getGroupInstances().stream().filter(gi -> gi.getUniqueId().equals(groupInstanceId)).findFirst().orElse(null);
2058 if (groupInstance == null) {
2059 log.debug("Group instance {} not found on component instance {}. ", groupInstanceId, foundComponentInstance.getName());
2060 actionResult = Either.right(componentsUtils.getResponseFormat(ActionStatus.GROUP_INSTANCE_NOT_FOUND_ON_COMPONENT_INSTANCE, groupInstanceId, foundComponentInstance.getName()));
2063 if (actionResult == null) {
2064 actionResult = Either.left(new ImmutablePair<>(foundComponentInstance, groupInstance));
2066 return actionResult;
2069 private ComponentInstance findRelatedComponentInstance(Component component, String componentInstanceId) {
2070 ComponentInstance componentInstance = null;
2071 if (!CollectionUtils.isEmpty(component.getComponentInstances())) {
2072 componentInstance = component.getComponentInstances().stream().filter(ci -> ci.getUniqueId().equals(componentInstanceId)).findFirst().orElse(null);
2074 return componentInstance;
2077 private Either<User, ResponseFormat> validateUserIgnoreAudit(User modifier, String ecompErrorContext) {
2078 Either<User, ResponseFormat> result = validateUser(modifier, ecompErrorContext, null, null, false);
2079 if (result.isLeft()) {
2080 List<Role> roles = new ArrayList<>();
2081 roles.add(Role.ADMIN);
2082 roles.add(Role.DESIGNER);
2083 Either<Boolean, ResponseFormat> validationRoleRes = validateUserRole(result.left().value(), roles);
2084 if (validationRoleRes.isRight()) {
2085 result = Either.right(validationRoleRes.right().value());
2091 public Either<UiComponentDataTransfer, ResponseFormat> getUiComponentDataTransferByComponentId(String serviceId, List<String> dataParamsToReturn) {
2093 ComponentParametersView paramsToRetuen = new ComponentParametersView(dataParamsToReturn);
2094 Either<Service, StorageOperationStatus> serviceResultEither = toscaOperationFacade.getToscaElement(serviceId, paramsToRetuen);
2096 if (serviceResultEither.isRight()) {
2097 if(serviceResultEither.right().value().equals(StorageOperationStatus.NOT_FOUND)) {
2098 log.debug("Failed to found service with id {} ", serviceId);
2099 Either.right(componentsUtils.getResponseFormat(ActionStatus.SERVICE_NOT_FOUND, serviceId));
2102 log.debug("failed to get service by id {} with filters {}", serviceId, dataParamsToReturn.toString());
2103 return Either.right(componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(serviceResultEither.right().value()), ""));
2106 Service service = serviceResultEither.left().value();
2107 UiComponentDataTransfer dataTransfer = UiComponentDataConverter.getUiDataTransferFromServiceByParams(service, dataParamsToReturn);
2108 return Either.left(dataTransfer);