Upgrade SDC from Titan to Janus Graph
[sdc.git] / asdctool / src / main / java / org / openecomp / sdc / asdctool / migration / tasks / mig1902 / InterfaceOperationMigration.java
1 /*
2  * Copyright © 2016-2018 European Support Limited
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.openecomp.sdc.asdctool.migration.tasks.mig1902;
18
19 import fj.data.Either;
20 import java.math.BigInteger;
21 import java.util.EnumMap;
22 import java.util.List;
23 import java.util.Map;
24 import org.apache.commons.collections.MapUtils;
25 import org.apache.commons.lang3.StringUtils;
26 import org.openecomp.sdc.asdctool.migration.core.DBVersion;
27 import org.openecomp.sdc.asdctool.migration.core.task.Migration;
28 import org.openecomp.sdc.asdctool.migration.core.task.MigrationResult;
29 import org.openecomp.sdc.be.config.ConfigurationManager;
30 import org.openecomp.sdc.be.dao.api.ActionStatus;
31 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
32 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
33 import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao;
34 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
35 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
36 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
37 import org.openecomp.sdc.be.datatypes.elements.InterfaceDataDefinition;
38 import org.openecomp.sdc.be.datatypes.elements.MapInterfaceDataDefinition;
39 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
40 import org.openecomp.sdc.be.model.User;
41 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
42 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
43 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
44 import org.openecomp.sdc.be.model.operations.impl.UserAdminOperation;
45 import org.openecomp.sdc.common.log.wrappers.Logger;
46 import org.springframework.beans.factory.annotation.Autowired;
47
48 @org.springframework.stereotype.Component
49 public class InterfaceOperationMigration implements Migration {
50
51     private static final Logger LOGGER = Logger.getLogger(InterfaceOperationMigration.class);
52
53     @Autowired
54     private JanusGraphDao janusGraphDao;
55     @Autowired
56     private UserAdminOperation userAdminOperation;
57     @Autowired
58     private InterfaceOperation interfaceOperation;
59
60     @Override
61     public String description() {
62         return "Update interface operation data to latest data model";
63     }
64
65     @Override
66     public DBVersion getVersion() {
67         return DBVersion.from(BigInteger.valueOf(1902), BigInteger.valueOf(0));
68     }
69
70     @Override
71     public MigrationResult migrate() {
72         final String userId = ConfigurationManager.getConfigurationManager().getConfiguration().getAutoHealingOwner();
73
74         Either<User, ActionStatus> userData = userAdminOperation.getUserData(userId, false);
75         if (userData.isRight()) {
76             return MigrationResult.error(
77                     "failed to update interface operation data. Failed to resolve user : "
78                             + userId + " error " + userData.right().value());
79         }
80
81         StorageOperationStatus status = getAndUpdateAllComponents();
82         return status == StorageOperationStatus.OK ? MigrationResult.success()
83                 : MigrationResult.error("failed to update interface operation data . Error : " + status);
84     }
85
86     private StorageOperationStatus getAndUpdateAllComponents(){
87         Map<GraphPropertyEnum, Object> hasNotProps = new EnumMap<>(GraphPropertyEnum.class);
88         hasNotProps.put(GraphPropertyEnum.IS_DELETED, true);
89         return janusGraphDao
90             .getByCriteria(VertexTypeEnum.TOPOLOGY_TEMPLATE, null, hasNotProps, JsonParseFlagEnum.ParseAll)
91                 .either(this::updateComponentVertices, this::handleError);
92     }
93
94     private StorageOperationStatus updateComponentVertices(List<GraphVertex> containersV) {
95         StorageOperationStatus status = StorageOperationStatus.OK;
96         for (GraphVertex container : containersV) {
97             status = updateDataOnGraph(container);
98             if (status != StorageOperationStatus.OK) {
99                 break;
100             }
101         }
102         return status;
103     }
104
105     private StorageOperationStatus handleError(JanusGraphOperationStatus err) {
106         janusGraphDao.rollback();
107         return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(
108                 JanusGraphOperationStatus.NOT_FOUND == err ? JanusGraphOperationStatus.OK : err);
109     }
110
111     private StorageOperationStatus updateDataOnGraph(GraphVertex componentVertex) {
112         try {
113             Either<GraphVertex, JanusGraphOperationStatus> interfaceVertexEither =
114                     janusGraphDao
115                         .getChildVertex(componentVertex, EdgeLabelEnum.INTERFACE, JsonParseFlagEnum.ParseJson);
116             if (interfaceVertexEither.isLeft()) {
117                 GraphVertex interfaceVertex = interfaceVertexEither.left().value();
118                 Map<String, InterfaceDataDefinition> interfaceDefinitions = (Map<String, InterfaceDataDefinition>) interfaceVertex.getJson();
119                 if(MapUtils.isNotEmpty(interfaceDefinitions)){
120                     for (Map.Entry<String, InterfaceDataDefinition> interfaceDefinition : interfaceDefinitions.entrySet()) {
121                         if (StringUtils.isEmpty(interfaceDefinition.getValue().getType())) {
122                             interfaceDefinition.getValue().setType(interfaceDefinition.getValue().getToscaResourceName());
123                         }
124                     }
125                     interfaceVertex.setJson(interfaceDefinitions);
126                     Either<GraphVertex, JanusGraphOperationStatus> updateInterfaceVertexEither = janusGraphDao
127                         .updateVertex(interfaceVertex);
128                     if(updateInterfaceVertexEither.isRight()){
129                         return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateInterfaceVertexEither.right().value());
130                     }
131                 }
132
133                 StorageOperationStatus statusRes = interfaceOperation.removeToscaDataVertex(
134                         interfaceVertex, EdgeLabelEnum.INTERFACE_OPERATION, VertexTypeEnum.INTERFACE_OPERATION);
135                 if (statusRes != StorageOperationStatus.NOT_FOUND && statusRes != StorageOperationStatus.OK) {
136                     return statusRes;
137                 }
138             }
139
140             Either<GraphVertex, JanusGraphOperationStatus> instInterfaceVertexEither =
141                     janusGraphDao.getChildVertex(componentVertex, EdgeLabelEnum.INST_INTERFACES, JsonParseFlagEnum.ParseJson);
142             if (instInterfaceVertexEither.isLeft()) {
143                 GraphVertex instInterfaceVertex = instInterfaceVertexEither.left().value();
144                 Map<String, MapInterfaceDataDefinition> instInterfaceDefinitions = (Map<String, MapInterfaceDataDefinition>) instInterfaceVertex.getJson();
145                 if(MapUtils.isNotEmpty(instInterfaceDefinitions)){
146                     for (Map.Entry<String, MapInterfaceDataDefinition> mapInstInterfaceDataDefinitions : instInterfaceDefinitions.entrySet()) {
147                         for (Map.Entry<String, InterfaceDataDefinition> instInterfaceDataDefinitions : mapInstInterfaceDataDefinitions.getValue().getMapToscaDataDefinition().entrySet()) {
148                             if (StringUtils.isEmpty(instInterfaceDataDefinitions.getValue().getType())) {
149                                 instInterfaceDataDefinitions.getValue().setType(instInterfaceDataDefinitions.getValue().getToscaResourceName());
150                             }
151                         }
152                     }
153                     instInterfaceVertex.setJson(instInterfaceDefinitions);
154                     Either<GraphVertex, JanusGraphOperationStatus> updateInstInterfaceVertexEither = janusGraphDao
155                         .updateVertex(instInterfaceVertex);
156                     if(updateInstInterfaceVertexEither.isRight()){
157                         return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateInstInterfaceVertexEither.right().value());
158                     }
159                 }
160             }
161
162             janusGraphDao.commit();
163         } catch (Exception e) {
164             LOGGER.debug("Interface operation migration failed with error : ", e);
165             janusGraphDao.rollback();
166             return StorageOperationStatus.GENERAL_ERROR;
167         }
168
169         return StorageOperationStatus.OK;
170     }
171 }