Service Consumption BE
[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.jsongraph.GraphVertex;
32 import org.openecomp.sdc.be.dao.jsongraph.TitanDao;
33 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
34 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
35 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
36 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
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.jsontitan.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 TitanDao titanDao;
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 titanDao.getByCriteria(VertexTypeEnum.TOPOLOGY_TEMPLATE, null, hasNotProps, JsonParseFlagEnum.ParseAll)
90                 .either(this::updateComponentVertices, this::handleError);
91     }
92
93     private StorageOperationStatus updateComponentVertices(List<GraphVertex> containersV) {
94         StorageOperationStatus status = StorageOperationStatus.OK;
95         for (GraphVertex container : containersV) {
96             status = updateDataOnGraph(container);
97             if (status != StorageOperationStatus.OK) {
98                 break;
99             }
100         }
101         return status;
102     }
103
104     private StorageOperationStatus handleError(TitanOperationStatus err) {
105         titanDao.rollback();
106         return DaoStatusConverter.convertTitanStatusToStorageStatus(
107                 TitanOperationStatus.NOT_FOUND == err ? TitanOperationStatus.OK : err);
108     }
109
110     private StorageOperationStatus updateDataOnGraph(GraphVertex componentVertex) {
111         try {
112             Either<GraphVertex, TitanOperationStatus> interfaceVertexEither =
113                     titanDao.getChildVertex(componentVertex, EdgeLabelEnum.INTERFACE, JsonParseFlagEnum.ParseJson);
114             if (interfaceVertexEither.isLeft()) {
115                 GraphVertex interfaceVertex = interfaceVertexEither.left().value();
116                 Map<String, InterfaceDataDefinition> interfaceDefinitions = (Map<String, InterfaceDataDefinition>) interfaceVertex.getJson();
117                 if(MapUtils.isNotEmpty(interfaceDefinitions)){
118                     for (Map.Entry<String, InterfaceDataDefinition> interfaceDefinition : interfaceDefinitions.entrySet()) {
119                         if (StringUtils.isEmpty(interfaceDefinition.getValue().getType())) {
120                             interfaceDefinition.getValue().setType(interfaceDefinition.getValue().getToscaResourceName());
121                         }
122                     }
123                     interfaceVertex.setJson(interfaceDefinitions);
124                     Either<GraphVertex, TitanOperationStatus> updateInterfaceVertexEither = titanDao.updateVertex(interfaceVertex);
125                     if(updateInterfaceVertexEither.isRight()){
126                         return DaoStatusConverter.convertTitanStatusToStorageStatus(updateInterfaceVertexEither.right().value());
127                     }
128                 }
129
130                 StorageOperationStatus statusRes = interfaceOperation.removeToscaDataVertex(
131                         interfaceVertex, EdgeLabelEnum.INTERFACE_OPERATION, VertexTypeEnum.INTERFACE_OPERATION);
132                 if (statusRes != StorageOperationStatus.NOT_FOUND && statusRes != StorageOperationStatus.OK) {
133                     return statusRes;
134                 }
135             }
136
137             Either<GraphVertex, TitanOperationStatus> instInterfaceVertexEither =
138                     titanDao.getChildVertex(componentVertex, EdgeLabelEnum.INST_INTERFACES, JsonParseFlagEnum.ParseJson);
139             if (instInterfaceVertexEither.isLeft()) {
140                 GraphVertex instInterfaceVertex = instInterfaceVertexEither.left().value();
141                 Map<String, MapInterfaceDataDefinition> instInterfaceDefinitions = (Map<String, MapInterfaceDataDefinition>) instInterfaceVertex.getJson();
142                 if(MapUtils.isNotEmpty(instInterfaceDefinitions)){
143                     for (Map.Entry<String, MapInterfaceDataDefinition> mapInstInterfaceDataDefinitions : instInterfaceDefinitions.entrySet()) {
144                         for (Map.Entry<String, InterfaceDataDefinition> instInterfaceDataDefinitions : mapInstInterfaceDataDefinitions.getValue().getMapToscaDataDefinition().entrySet()) {
145                             if (StringUtils.isEmpty(instInterfaceDataDefinitions.getValue().getType())) {
146                                 instInterfaceDataDefinitions.getValue().setType(instInterfaceDataDefinitions.getValue().getToscaResourceName());
147                             }
148                         }
149                     }
150                     instInterfaceVertex.setJson(instInterfaceDefinitions);
151                     Either<GraphVertex, TitanOperationStatus> updateInstInterfaceVertexEither = titanDao.updateVertex(instInterfaceVertex);
152                     if(updateInstInterfaceVertexEither.isRight()){
153                         return DaoStatusConverter.convertTitanStatusToStorageStatus(updateInstInterfaceVertexEither.right().value());
154                     }
155                 }
156             }
157
158             titanDao.commit();
159         } catch (Exception e) {
160             LOGGER.debug("Interface operation migration failed with error : ", e);
161             titanDao.rollback();
162             return StorageOperationStatus.GENERAL_ERROR;
163         }
164
165         return StorageOperationStatus.OK;
166     }
167 }