Upgrade SDC from Titan to Janus Graph
[sdc.git] / asdctool / src / main / java / org / openecomp / sdc / asdctool / migration / tasks / mig1806 / ResourceLifecycleMigration.java
1 package org.openecomp.sdc.asdctool.migration.tasks.mig1806;
2
3 import fj.data.Either;
4 import org.openecomp.sdc.asdctool.migration.core.DBVersion;
5 import org.openecomp.sdc.asdctool.migration.core.task.Migration;
6 import org.openecomp.sdc.asdctool.migration.core.task.MigrationResult;
7 import org.openecomp.sdc.be.components.lifecycle.LifecycleBusinessLogic;
8 import org.openecomp.sdc.be.components.lifecycle.LifecycleChangeInfoWithAction;
9 import org.openecomp.sdc.be.config.ConfigurationManager;
10 import org.openecomp.sdc.be.dao.api.ActionStatus;
11 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
12 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
13 import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao;
14 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
15 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
16 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
17 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
18 import org.openecomp.sdc.be.model.LifeCycleTransitionEnum;
19 import org.openecomp.sdc.be.model.LifecycleStateEnum;
20 import org.openecomp.sdc.be.model.User;
21 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
22 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
23 import org.openecomp.sdc.be.model.operations.impl.UserAdminOperation;
24 import org.openecomp.sdc.common.log.wrappers.Logger;
25 import org.openecomp.sdc.exception.ResponseFormat;
26 import org.springframework.stereotype.Component;
27
28 import java.math.BigInteger;
29 import java.util.EnumMap;
30 import java.util.List;
31 import java.util.Map;
32
33 @Component  
34 public class ResourceLifecycleMigration implements Migration {
35
36     private JanusGraphDao janusGraphDao;
37     private LifecycleBusinessLogic lifecycleBusinessLogic;
38     private UserAdminOperation userAdminOperation;
39     
40     private User user = null;
41
42     private static final Logger log = Logger.getLogger(ResourceLifecycleMigration.class);
43
44     public ResourceLifecycleMigration(JanusGraphDao janusGraphDao, LifecycleBusinessLogic lifecycleBusinessLogic, UserAdminOperation userAdminOperation) {
45         this.janusGraphDao = janusGraphDao;
46         this.lifecycleBusinessLogic = lifecycleBusinessLogic;
47         this.userAdminOperation = userAdminOperation;
48     }
49
50     @Override
51     public String description() {
52         return "change resource lifecycle state from testing to certified";
53     }
54
55     @Override
56     public DBVersion getVersion() {
57         return DBVersion.from(BigInteger.valueOf(1806), BigInteger.valueOf(0));
58     }
59
60     @Override
61     public MigrationResult migrate() {
62         log.info("start change resource lifecycle states migration");
63         final String userId = ConfigurationManager.getConfigurationManager().getConfiguration().getAutoHealingOwner();
64
65         Either<User, ActionStatus> userReq = userAdminOperation.getUserData(userId, false);
66         if (userReq.isRight()) {
67             log.error("Upgrade migration failed. User {} resolve failed: {} ", userId, userReq.right().value());
68             return MigrationResult.error("failed to change lifecycle state of resources. Failed to resolve user : " + userId + " error " + userReq.right().value());
69         } else {
70             user = userReq.left().value();
71             log.info("User {} will perform upgrade operation with role {}", user.getUserId(), user.getRole());
72         }
73
74         StorageOperationStatus status = changeResourceLifecycleState();
75
76         return status == StorageOperationStatus.OK ? MigrationResult.success() : MigrationResult.error("failed to change lifecycle state of resources. Error : " + status);
77     }
78
79     private StorageOperationStatus changeResourceLifecycleState() {
80         StorageOperationStatus status;
81         status = findResourcesAndChangeStatus(VertexTypeEnum.NODE_TYPE);
82         if (StorageOperationStatus.OK == status) {
83             status = findResourcesAndChangeStatus(VertexTypeEnum.TOPOLOGY_TEMPLATE);
84         }
85         janusGraphDao.commit();
86         return status;
87     }
88
89     private StorageOperationStatus findResourcesAndChangeStatus(VertexTypeEnum type) {
90         StorageOperationStatus status;
91         Map<GraphPropertyEnum, Object> props = new EnumMap<>(GraphPropertyEnum.class);
92         props.put(GraphPropertyEnum.COMPONENT_TYPE, ComponentTypeEnum.RESOURCE.name());       
93         props.put(GraphPropertyEnum.STATE, LifecycleStateEnum.READY_FOR_CERTIFICATION.name());
94         props.put(GraphPropertyEnum.IS_HIGHEST_VERSION, true);
95
96         Map<GraphPropertyEnum, Object> hasNot = new EnumMap<>(GraphPropertyEnum.class);
97         hasNot.put(GraphPropertyEnum.IS_DELETED, true);
98
99         log.info("findResourcesAndChangeStatus for type {} and state {}", type ,LifecycleStateEnum.READY_FOR_CERTIFICATION);
100         status = janusGraphDao.getByCriteria(type, props, hasNot, JsonParseFlagEnum.ParseAll).either(this::changeState, this::handleError);
101         log.info("status {} for type {} and state {}", status, type ,LifecycleStateEnum.READY_FOR_CERTIFICATION);
102         
103         log.info("findResourcesAndChangeStatus for type {} and state {}", type ,LifecycleStateEnum.CERTIFICATION_IN_PROGRESS);
104         props.put(GraphPropertyEnum.STATE, LifecycleStateEnum.CERTIFICATION_IN_PROGRESS.name());
105         status = janusGraphDao.getByCriteria(type, props, hasNot, JsonParseFlagEnum.ParseAll).either(this::changeState, this::handleError);
106         log.info("status {} for type {} and state {}", status, type ,LifecycleStateEnum.CERTIFICATION_IN_PROGRESS);
107         
108         
109         return status;
110     }
111
112     private StorageOperationStatus changeState(List<GraphVertex> resourcesV) {
113         StorageOperationStatus status = StorageOperationStatus.OK;
114         
115         for (GraphVertex resourceV : resourcesV) {
116             status = changeResourceState(resourceV);
117             if (status != StorageOperationStatus.OK) {
118                 log.info("Failed to change state to certified of resource with id {} , continue to next, reset status", resourceV.getUniqueId() );
119                 status = StorageOperationStatus.OK;
120             }
121         }
122         return status;
123     }
124
125     private StorageOperationStatus changeResourceState(GraphVertex resourceV) {
126         log.debug("Change state to certified to resource with id {} ", resourceV.getUniqueId() );
127         
128         LifecycleChangeInfoWithAction changeInfo = new LifecycleChangeInfoWithAction("change resource state by migration");
129         final Either<? extends org.openecomp.sdc.be.model.Component, ResponseFormat> changeComponentState = lifecycleBusinessLogic.changeComponentState(ComponentTypeEnum.RESOURCE, resourceV.getUniqueId(), user, LifeCycleTransitionEnum.CERTIFY, changeInfo, false, true);
130         return changeComponentState.isLeft() ? StorageOperationStatus.OK : StorageOperationStatus.GENERAL_ERROR;
131     }
132
133     private StorageOperationStatus handleError(JanusGraphOperationStatus err) {
134         log.debug("receive janusgraph error {}", err);
135         return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(
136             JanusGraphOperationStatus.NOT_FOUND == err ? JanusGraphOperationStatus.OK : err);
137     }
138
139 }