2 * Copyright © 2016-2018 European Support Limited
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package org.openecomp.sdc.asdctool.migration.tasks.mig1902;
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;
44 import java.math.BigInteger;
45 import java.util.EnumMap;
46 import java.util.List;
49 @org.springframework.stereotype.Component
50 public class InterfaceOperationMigration implements Migration {
52 private static final Logger LOGGER = Logger.getLogger(InterfaceOperationMigration.class);
55 private JanusGraphDao janusGraphDao;
57 private UserAdminOperation userAdminOperation;
59 private InterfaceOperation interfaceOperation;
62 public String description() {
63 return "Update interface operation data to latest data model";
67 public DBVersion getVersion() {
68 return DBVersion.from(BigInteger.valueOf(1902), BigInteger.valueOf(0));
72 public MigrationResult migrate() {
73 final String userId = ConfigurationManager.getConfigurationManager().getConfiguration().getAutoHealingOwner();
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());
82 StorageOperationStatus status = getAndUpdateAllComponents();
83 return status == StorageOperationStatus.OK ? MigrationResult.success()
84 : MigrationResult.error("failed to update interface operation data . Error : " + status);
87 private StorageOperationStatus getAndUpdateAllComponents(){
88 Map<GraphPropertyEnum, Object> hasNotProps = new EnumMap<>(GraphPropertyEnum.class);
89 hasNotProps.put(GraphPropertyEnum.IS_DELETED, true);
91 .getByCriteria(VertexTypeEnum.TOPOLOGY_TEMPLATE, null, hasNotProps, JsonParseFlagEnum.ParseAll)
92 .either(this::updateComponentVertices, this::handleError);
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) {
106 private StorageOperationStatus handleError(JanusGraphOperationStatus err) {
107 janusGraphDao.rollback();
108 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(
109 JanusGraphOperationStatus.NOT_FOUND == err ? JanusGraphOperationStatus.OK : err);
112 private StorageOperationStatus updateDataOnGraph(GraphVertex componentVertex) {
114 Either<GraphVertex, JanusGraphOperationStatus> interfaceVertexEither =
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());
126 interfaceVertex.setJson(interfaceDefinitions);
127 Either<GraphVertex, JanusGraphOperationStatus> updateInterfaceVertexEither = janusGraphDao
128 .updateVertex(interfaceVertex);
129 if(updateInterfaceVertexEither.isRight()){
130 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateInterfaceVertexEither.right().value());
134 StorageOperationStatus statusRes = interfaceOperation.removeToscaDataVertex(
135 interfaceVertex, EdgeLabelEnum.INTERFACE_OPERATION, VertexTypeEnum.INTERFACE_OPERATION);
136 if (statusRes != StorageOperationStatus.NOT_FOUND && statusRes != StorageOperationStatus.OK) {
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());
154 instInterfaceVertex.setJson(instInterfaceDefinitions);
155 Either<GraphVertex, JanusGraphOperationStatus> updateInstInterfaceVertexEither = janusGraphDao
156 .updateVertex(instInterfaceVertex);
157 if(updateInstInterfaceVertexEither.isRight()){
158 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateInstInterfaceVertexEither.right().value());
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;
170 return StorageOperationStatus.OK;