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 java.math.BigInteger;
21 import java.util.EnumMap;
22 import java.util.List;
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;
48 @org.springframework.stereotype.Component
49 public class InterfaceOperationMigration implements Migration {
51 private static final Logger LOGGER = Logger.getLogger(InterfaceOperationMigration.class);
54 private JanusGraphDao janusGraphDao;
56 private UserAdminOperation userAdminOperation;
58 private InterfaceOperation interfaceOperation;
61 public String description() {
62 return "Update interface operation data to latest data model";
66 public DBVersion getVersion() {
67 return DBVersion.from(BigInteger.valueOf(1902), BigInteger.valueOf(0));
71 public MigrationResult migrate() {
72 final String userId = ConfigurationManager.getConfigurationManager().getConfiguration().getAutoHealingOwner();
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());
81 StorageOperationStatus status = getAndUpdateAllComponents();
82 return status == StorageOperationStatus.OK ? MigrationResult.success()
83 : MigrationResult.error("failed to update interface operation data . Error : " + status);
86 private StorageOperationStatus getAndUpdateAllComponents(){
87 Map<GraphPropertyEnum, Object> hasNotProps = new EnumMap<>(GraphPropertyEnum.class);
88 hasNotProps.put(GraphPropertyEnum.IS_DELETED, true);
90 .getByCriteria(VertexTypeEnum.TOPOLOGY_TEMPLATE, null, hasNotProps, JsonParseFlagEnum.ParseAll)
91 .either(this::updateComponentVertices, this::handleError);
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) {
105 private StorageOperationStatus handleError(JanusGraphOperationStatus err) {
106 janusGraphDao.rollback();
107 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(
108 JanusGraphOperationStatus.NOT_FOUND == err ? JanusGraphOperationStatus.OK : err);
111 private StorageOperationStatus updateDataOnGraph(GraphVertex componentVertex) {
113 Either<GraphVertex, JanusGraphOperationStatus> interfaceVertexEither =
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());
125 interfaceVertex.setJson(interfaceDefinitions);
126 Either<GraphVertex, JanusGraphOperationStatus> updateInterfaceVertexEither = janusGraphDao
127 .updateVertex(interfaceVertex);
128 if(updateInterfaceVertexEither.isRight()){
129 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateInterfaceVertexEither.right().value());
133 StorageOperationStatus statusRes = interfaceOperation.removeToscaDataVertex(
134 interfaceVertex, EdgeLabelEnum.INTERFACE_OPERATION, VertexTypeEnum.INTERFACE_OPERATION);
135 if (statusRes != StorageOperationStatus.NOT_FOUND && statusRes != StorageOperationStatus.OK) {
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());
153 instInterfaceVertex.setJson(instInterfaceDefinitions);
154 Either<GraphVertex, JanusGraphOperationStatus> updateInstInterfaceVertexEither = janusGraphDao
155 .updateVertex(instInterfaceVertex);
156 if(updateInstInterfaceVertexEither.isRight()){
157 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateInstInterfaceVertexEither.right().value());
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;
169 return StorageOperationStatus.OK;