Catalog alignment
[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 org.apache.commons.collections.MapUtils;
21 import org.apache.commons.lang3.StringUtils;
22 import org.openecomp.sdc.asdctool.migration.core.DBVersion;
23 import org.openecomp.sdc.asdctool.migration.core.task.Migration;
24 import org.openecomp.sdc.asdctool.migration.core.task.MigrationResult;
25 import org.openecomp.sdc.be.config.ConfigurationManager;
26 import org.openecomp.sdc.be.dao.api.ActionStatus;
27 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
28 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
29 import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao;
30 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
31 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
32 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
33 import org.openecomp.sdc.be.datatypes.elements.InterfaceDataDefinition;
34 import org.openecomp.sdc.be.datatypes.elements.MapInterfaceDataDefinition;
35 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
36 import org.openecomp.sdc.be.model.User;
37 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
38 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
39 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
40 import org.openecomp.sdc.be.model.operations.impl.UserAdminOperation;
41 import org.openecomp.sdc.common.log.wrappers.Logger;
42 import org.springframework.beans.factory.annotation.Autowired;
43
44 import java.math.BigInteger;
45 import java.util.EnumMap;
46 import java.util.List;
47 import java.util.Map;
48
49 @org.springframework.stereotype.Component
50 public class InterfaceOperationMigration implements Migration {
51
52     private static final Logger LOGGER = Logger.getLogger(InterfaceOperationMigration.class);
53
54     @Autowired
55     private JanusGraphDao janusGraphDao;
56     @Autowired
57     private UserAdminOperation userAdminOperation;
58     @Autowired
59     private InterfaceOperation interfaceOperation;
60
61     @Override
62     public String description() {
63         return "Update interface operation data to latest data model";
64     }
65
66     @Override
67     public DBVersion getVersion() {
68         return DBVersion.from(BigInteger.valueOf(1902), BigInteger.valueOf(0));
69     }
70
71     @Override
72     public MigrationResult migrate() {
73         final String userId = ConfigurationManager.getConfigurationManager().getConfiguration().getAutoHealingOwner();
74
75         Either<User, ActionStatus> userData = userAdminOperation.getUserData(userId, false);
76         if (userData.isRight()) {
77             return MigrationResult.error(
78                     "failed to update interface operation data. Failed to resolve user : "
79                             + userId + " error " + userData.right().value());
80         }
81
82         StorageOperationStatus status = getAndUpdateAllComponents();
83         return status == StorageOperationStatus.OK ? MigrationResult.success()
84                 : MigrationResult.error("failed to update interface operation data . Error : " + status);
85     }
86
87     private StorageOperationStatus getAndUpdateAllComponents(){
88         Map<GraphPropertyEnum, Object> hasNotProps = new EnumMap<>(GraphPropertyEnum.class);
89         hasNotProps.put(GraphPropertyEnum.IS_DELETED, true);
90         return janusGraphDao
91             .getByCriteria(VertexTypeEnum.TOPOLOGY_TEMPLATE, null, hasNotProps, JsonParseFlagEnum.ParseAll)
92                 .either(this::updateComponentVertices, this::handleError);
93     }
94
95     private StorageOperationStatus updateComponentVertices(List<GraphVertex> containersV) {
96         StorageOperationStatus status = StorageOperationStatus.OK;
97         for (GraphVertex container : containersV) {
98             status = updateDataOnGraph(container);
99             if (status != StorageOperationStatus.OK) {
100                 break;
101             }
102         }
103         return status;
104     }
105
106     private StorageOperationStatus handleError(JanusGraphOperationStatus err) {
107         janusGraphDao.rollback();
108         return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(
109                 JanusGraphOperationStatus.NOT_FOUND == err ? JanusGraphOperationStatus.OK : err);
110     }
111
112     private StorageOperationStatus updateDataOnGraph(GraphVertex componentVertex) {
113         try {
114             Either<GraphVertex, JanusGraphOperationStatus> interfaceVertexEither =
115                     janusGraphDao
116                         .getChildVertex(componentVertex, EdgeLabelEnum.INTERFACE, JsonParseFlagEnum.ParseJson);
117             if (interfaceVertexEither.isLeft()) {
118                 GraphVertex interfaceVertex = interfaceVertexEither.left().value();
119                 Map<String, InterfaceDataDefinition> interfaceDefinitions = (Map<String, InterfaceDataDefinition>) interfaceVertex.getJson();
120                 if(MapUtils.isNotEmpty(interfaceDefinitions)){
121                     for (Map.Entry<String, InterfaceDataDefinition> interfaceDefinition : interfaceDefinitions.entrySet()) {
122                         if (StringUtils.isEmpty(interfaceDefinition.getValue().getType())) {
123                             interfaceDefinition.getValue().setType(interfaceDefinition.getValue().getToscaResourceName());
124                         }
125                     }
126                     interfaceVertex.setJson(interfaceDefinitions);
127                     Either<GraphVertex, JanusGraphOperationStatus> updateInterfaceVertexEither = janusGraphDao
128                         .updateVertex(interfaceVertex);
129                     if(updateInterfaceVertexEither.isRight()){
130                         return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateInterfaceVertexEither.right().value());
131                     }
132                 }
133
134                 StorageOperationStatus statusRes = interfaceOperation.removeToscaDataVertex(
135                         interfaceVertex, EdgeLabelEnum.INTERFACE_OPERATION, VertexTypeEnum.INTERFACE_OPERATION);
136                 if (statusRes != StorageOperationStatus.NOT_FOUND && statusRes != StorageOperationStatus.OK) {
137                     return statusRes;
138                 }
139             }
140
141             Either<GraphVertex, JanusGraphOperationStatus> instInterfaceVertexEither =
142                     janusGraphDao.getChildVertex(componentVertex, EdgeLabelEnum.INST_INTERFACES, JsonParseFlagEnum.ParseJson);
143             if (instInterfaceVertexEither.isLeft()) {
144                 GraphVertex instInterfaceVertex = instInterfaceVertexEither.left().value();
145                 Map<String, MapInterfaceDataDefinition> instInterfaceDefinitions = (Map<String, MapInterfaceDataDefinition>) instInterfaceVertex.getJson();
146                 if(MapUtils.isNotEmpty(instInterfaceDefinitions)){
147                     for (Map.Entry<String, MapInterfaceDataDefinition> mapInstInterfaceDataDefinitions : instInterfaceDefinitions.entrySet()) {
148                         for (Map.Entry<String, InterfaceDataDefinition> instInterfaceDataDefinitions : mapInstInterfaceDataDefinitions.getValue().getMapToscaDataDefinition().entrySet()) {
149                             if (StringUtils.isEmpty(instInterfaceDataDefinitions.getValue().getType())) {
150                                 instInterfaceDataDefinitions.getValue().setType(instInterfaceDataDefinitions.getValue().getToscaResourceName());
151                             }
152                         }
153                     }
154                     instInterfaceVertex.setJson(instInterfaceDefinitions);
155                     Either<GraphVertex, JanusGraphOperationStatus> updateInstInterfaceVertexEither = janusGraphDao
156                         .updateVertex(instInterfaceVertex);
157                     if(updateInstInterfaceVertexEither.isRight()){
158                         return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateInstInterfaceVertexEither.right().value());
159                     }
160                 }
161             }
162
163             janusGraphDao.commit();
164         } catch (Exception e) {
165             LOGGER.debug("Interface operation migration failed with error : ", e);
166             janusGraphDao.rollback();
167             return StorageOperationStatus.GENERAL_ERROR;
168         }
169
170         return StorageOperationStatus.OK;
171     }
172 }