2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.asdctool.migration.tasks.mig1806;
23 import fj.data.Either;
24 import org.openecomp.sdc.asdctool.migration.core.DBVersion;
25 import org.openecomp.sdc.asdctool.migration.core.task.Migration;
26 import org.openecomp.sdc.asdctool.migration.core.task.MigrationResult;
27 import org.openecomp.sdc.asdctool.migration.tasks.InstanceMigrationBase;
28 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
29 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
30 import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao;
31 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
32 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
33 import org.openecomp.sdc.be.datatypes.elements.ComponentInstanceDataDefinition;
34 import org.openecomp.sdc.be.datatypes.elements.CompositionDataDefinition;
35 import org.openecomp.sdc.be.datatypes.elements.MapPropertiesDataDefinition;
36 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
37 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
38 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
39 import org.openecomp.sdc.be.model.jsonjanusgraph.enums.JsonConstantKeysEnum;
40 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeTemplateOperation;
41 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
42 import org.openecomp.sdc.common.log.wrappers.Logger;
43 import org.springframework.stereotype.Component;
45 import java.math.BigInteger;
46 import java.util.Arrays;
47 import java.util.HashMap;
48 import java.util.List;
50 import java.util.Map.Entry;
51 import java.util.Optional;
54 public class SDCInstancesMigration extends InstanceMigrationBase implements Migration {
56 private NodeTemplateOperation nodeTemplateOperation;
58 private static final Logger log = Logger.getLogger(SDCInstancesMigration.class);
60 private static final String ALLOTTED_CATEGORY = "Allotted Resource";
62 private static final List<String> UUID_PROPS_NAMES = Arrays.asList("providing_service_uuid", "providing_service_uuid");
65 public SDCInstancesMigration(JanusGraphDao janusGraphDao, NodeTemplateOperation nodeTemplateOperation) {
67 this.nodeTemplateOperation = nodeTemplateOperation;
71 public String description() {
72 return "connect instances in container to its origins";
76 public DBVersion getVersion() {
77 return DBVersion.from(BigInteger.valueOf(1806), BigInteger.valueOf(0));
81 public MigrationResult migrate() {
82 StorageOperationStatus status = upgradeTopologyTemplates();
83 return status == StorageOperationStatus.OK ? MigrationResult.success() : MigrationResult.error("failed to create connection between instances and origins. Error : " + status);
86 protected StorageOperationStatus handleOneContainer(GraphVertex containerVorig) {
87 StorageOperationStatus status = StorageOperationStatus.OK;
89 GraphVertex containerV = getVertexById(containerVorig.getUniqueId());
91 boolean needConnectAllotted = false;
92 ComponentTypeEnum componentType = containerV.getType();
93 Map<String, MapPropertiesDataDefinition> instanceProperties = null;
94 if (componentType == ComponentTypeEnum.RESOURCE) {
95 Either<GraphVertex, JanusGraphOperationStatus> subcategoryV = janusGraphDao
96 .getChildVertex(containerV, EdgeLabelEnum.CATEGORY, JsonParseFlagEnum.NoParse);
97 if (subcategoryV.isRight()) {
98 log.debug("Failed to fetch category vertex for resource {} error {} ", containerV.getUniqueId(), subcategoryV.right().value());
99 return StorageOperationStatus.GENERAL_ERROR;
101 GraphVertex catV = subcategoryV.left().value();
102 Map<GraphPropertyEnum, Object> metadataProperties = catV.getMetadataProperties();
104 String name = (String) metadataProperties.get(GraphPropertyEnum.NAME);
105 if (name.equals(ALLOTTED_CATEGORY)) {
106 log.debug("Find allotted resource {}.", containerV.getUniqueId());
107 needConnectAllotted = true;
108 Either<Map<String, MapPropertiesDataDefinition>, StorageOperationStatus> instProperties = getInstProperties(containerV);
109 if ( instProperties.isRight() ){
110 return instProperties.right().value();
112 instanceProperties = instProperties.left().value();
115 Map<String, CompositionDataDefinition> jsonComposition = (Map<String, CompositionDataDefinition>) containerV.getJson();
116 if (jsonComposition != null && !jsonComposition.isEmpty()) {
118 status = connectInstances(containerV, needConnectAllotted, instanceProperties, jsonComposition);
121 if (status == StorageOperationStatus.OK) {
122 janusGraphDao.commit();
124 janusGraphDao.rollback();
132 private Either<Map<String, MapPropertiesDataDefinition>, StorageOperationStatus> getInstProperties(GraphVertex containerV) {
133 Map<String, MapPropertiesDataDefinition> instanceProperties;
134 Either<GraphVertex, JanusGraphOperationStatus> instProps = janusGraphDao
135 .getChildVertex(containerV, EdgeLabelEnum.INST_PROPERTIES, JsonParseFlagEnum.ParseAll);
137 if (instProps.isRight()) {
138 if (instProps.right().value() == JanusGraphOperationStatus.NOT_FOUND) {
139 instanceProperties = new HashMap<>();
141 log.debug("Failed to fetch instance properties vertex for resource {} error {} ", containerV.getUniqueId(), instProps.right().value());
142 return Either.right(StorageOperationStatus.GENERAL_ERROR);
145 instanceProperties = (Map<String, MapPropertiesDataDefinition>) instProps.left().value().getJson();
147 return Either.left(instanceProperties);
150 private StorageOperationStatus connectInstances(GraphVertex containerV, boolean needConnectAllotted, Map<String, MapPropertiesDataDefinition> instanceProperties,
151 Map<String, CompositionDataDefinition> jsonComposition) {
152 StorageOperationStatus status = StorageOperationStatus.OK;
153 CompositionDataDefinition compositionDataDefinition = jsonComposition.get(JsonConstantKeysEnum.COMPOSITION.getValue());
154 Map<String, ComponentInstanceDataDefinition> componentInstances = compositionDataDefinition.getComponentInstances();
155 for (Map.Entry<String, ComponentInstanceDataDefinition> entry : componentInstances.entrySet()) {
156 status = handleInstance(containerV, needConnectAllotted, instanceProperties, entry);
157 if ( status != StorageOperationStatus.OK){
158 if ( status == StorageOperationStatus.NOT_FOUND ){
159 log.debug("reset status and continue");
160 status = StorageOperationStatus.OK;
162 log.debug("Failed handle instance. exit");
170 private StorageOperationStatus handleInstance(GraphVertex containerV, boolean needConnectAllotted, Map<String, MapPropertiesDataDefinition> instanceProperties, Map.Entry<String, ComponentInstanceDataDefinition> entry) {
171 ComponentInstanceDataDefinition instance = entry.getValue();
172 StorageOperationStatus status = nodeTemplateOperation.createInstanceEdge(containerV, instance);
173 if (status != StorageOperationStatus.OK) {
174 if ( status == StorageOperationStatus.NOT_FOUND ){
175 Boolean highest = (Boolean) containerV.getMetadataProperties().get(GraphPropertyEnum.IS_HIGHEST_VERSION);
176 log.debug("No origin for instance {} with ID {}. The component is highest ={}, Reset status and continue.. ", instance.getUniqueId(), instance.getComponentUid(), highest);
177 status = StorageOperationStatus.OK;
179 log.debug("Failed to connect in container {} instance {} to origin {} error {} ", containerV.getUniqueId(), instance.getUniqueId(), instance.getComponentUid(), status);
183 if (needConnectAllotted) {
184 status = connectAllotedInstances(containerV, instanceProperties, instance);
189 private StorageOperationStatus connectAllotedInstances(GraphVertex containerV, Map<String, MapPropertiesDataDefinition> instanceProperties, ComponentInstanceDataDefinition instance) {
190 StorageOperationStatus status = StorageOperationStatus.OK;
191 if ( instanceProperties != null ){
192 MapPropertiesDataDefinition mapPropertiesDataDefinition = instanceProperties.get(instance.getUniqueId());
193 if ( mapPropertiesDataDefinition != null ){
194 status = checkAllottedPropertyAndConnect(containerV, instance, mapPropertiesDataDefinition);
196 log.debug("No isntances properties for instance {}", instance.getUniqueId());
202 private StorageOperationStatus checkAllottedPropertyAndConnect(GraphVertex containerV, ComponentInstanceDataDefinition instance, MapPropertiesDataDefinition mapPropertiesDataDefinition) {
203 Map<String, PropertyDataDefinition> mapToscaDataDefinition = mapPropertiesDataDefinition.getMapToscaDataDefinition();
204 StorageOperationStatus status = StorageOperationStatus.OK;
205 Optional<Entry<String, PropertyDataDefinition>> findFirst = mapToscaDataDefinition
208 .filter(e -> UUID_PROPS_NAMES.contains(e.getKey()))
211 if ( findFirst.isPresent() ){
212 PropertyDataDefinition property = findFirst.get().getValue();
213 String serviceUUID = property.getValue();
214 if ( serviceUUID != null ){
215 log.debug("Defined reference service on property {} value {} on instance {}", property.getName(), property.getValue(), instance.getUniqueId() );
216 status = nodeTemplateOperation.createAllottedOfEdge(containerV.getUniqueId(), instance.getUniqueId(), serviceUUID);
217 if ( status != StorageOperationStatus.OK ){
218 if ( status == StorageOperationStatus.NOT_FOUND ){
219 Boolean highest = (Boolean) containerV.getMetadataProperties().get(GraphPropertyEnum.IS_HIGHEST_VERSION);
220 log.debug("No origin for allotted reference {} with UUID {}. the component highest = {}, Reset status and continue.. ", instance.getUniqueId(), serviceUUID, highest);
221 status = StorageOperationStatus.OK;
223 log.debug("Failed to connect in container {} instance {} to allotted service {} error {} ", containerV.getUniqueId(), instance.getUniqueId(), instance.getComponentUid(), status);
228 log.debug("No value for property {} on instance {}", property.getName(),instance.getUniqueId() );
231 log.debug("No sercific properties of dependencies for instance {}", instance.getUniqueId());