1 package org.openecomp.sdc.asdctool.impl.migration.v1707;
3 import java.io.BufferedWriter;
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6 import java.io.OutputStreamWriter;
8 import java.util.ArrayList;
9 import java.util.HashMap;
10 import java.util.HashSet;
11 import java.util.List;
15 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
16 import org.openecomp.sdc.be.dao.jsongraph.TitanDao;
17 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
18 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
19 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
20 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
21 import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
22 import org.openecomp.sdc.be.datatypes.elements.MapGroupsDataDefinition;
23 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
24 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
25 import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
26 import org.openecomp.sdc.be.model.ArtifactDefinition;
27 import org.openecomp.sdc.be.model.Component;
28 import org.openecomp.sdc.be.model.ComponentInstance;
29 import org.openecomp.sdc.be.model.ComponentParametersView;
30 import org.openecomp.sdc.be.model.DistributionStatusEnum;
31 import org.openecomp.sdc.be.model.GroupDefinition;
32 import org.openecomp.sdc.be.model.GroupInstance;
33 import org.openecomp.sdc.be.model.LifecycleStateEnum;
34 import org.openecomp.sdc.be.model.Resource;
35 import org.openecomp.sdc.be.model.Service;
36 import org.openecomp.sdc.be.model.jsontitan.datamodel.TopologyTemplate;
37 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
38 import org.openecomp.sdc.be.model.jsontitan.utils.ModelConverter;
39 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
40 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
41 import org.openecomp.sdc.common.api.Constants;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
44 import org.springframework.beans.factory.annotation.Autowired;
46 import fj.data.Either;
48 @org.springframework.stereotype.Component("migration1707UuidFix")
49 public class Migration1707ArtifactUuidFix {
52 private TitanDao titanDao;
55 private ToscaOperationFacade toscaOperationFacade;
57 private static Logger log = LoggerFactory.getLogger(Migration1707ArtifactUuidFix.class.getName());
59 public boolean migrate(String fixServices, String runMode) {
60 List<Resource> vfLst = new ArrayList<>();
61 List<Service> serviceList = new ArrayList<>();
63 long time = System.currentTimeMillis();
65 if (fetchServices(fixServices, serviceList, time) == false) {
68 if (runMode.equals("service_vf") || runMode.equals("fix")) {
69 log.info("Mode {}. Find problem VFs", runMode);
70 if (fetchVf(serviceList, vfLst, time) == false) {
71 log.info("Mode {}. Find problem VFs finished with failure", runMode);
74 log.info("Mode {}. Find problem VFs finished with success", runMode);
76 if (runMode.equals("fix") || runMode.equals("fix_only_services")) {
77 log.info("Mode {}. Start fix", runMode);
78 if (fix(vfLst, serviceList) == false) {
79 log.info("Mode {}. Fix finished withh failure", runMode);
82 log.info("Mode {}. Fix finished withh success", runMode);
88 private boolean fetchVf(List<Service> serviceList, List<Resource> vfLst, long time) {
89 log.info("Find problem VF ");
90 if (serviceList.isEmpty()) {
91 log.info("No services as input");
96 String fileName = "problemVf_" + time + ".csv";
97 writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), "utf-8"));
98 writer.write("vf name, vf id, state, version, example service name\n");
99 Set<String> vfIds = new HashSet<>();
100 for (Service service : serviceList) {
101 List<ComponentInstance> componentInstances = service.getComponentInstances();
102 for (ComponentInstance ci : componentInstances) {
103 if (!vfIds.contains(ci.getComponentUid())) {
104 vfIds.add(ci.getComponentUid());
105 Either<Resource, StorageOperationStatus> toscaElement = toscaOperationFacade.getToscaElement(ci.getComponentUid());
106 if (toscaElement.isRight()) {
107 log.info("Failed to fetch resource {} {}", ci.getComponentUid(), toscaElement.right().value());
110 Resource resource = toscaElement.left().value();
112 writeModuleResultToFile(writer, resource, service);
118 log.info("output file with list of Vf : {}", fileName);
119 } catch (Exception e) {
120 log.info("Failed to fetch services ", e);
127 } catch (Exception ex) {
133 private boolean fetchServices(String fixServices, List<Service> serviceList, long time) {
134 log.info("Find problem Services {}", fixServices);
135 Writer writer = null;
138 String fileName = "problemService_" + time + ".csv";
139 writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), "utf-8"));
140 writer.write("service name, service id, state, version\n");
142 Map<GraphPropertyEnum, Object> hasProps = new HashMap<>();
143 hasProps.put(GraphPropertyEnum.COMPONENT_TYPE, ComponentTypeEnum.SERVICE.name());
144 if (fixServices.equals("distributed_only")) {
145 hasProps.put(GraphPropertyEnum.STATE, LifecycleStateEnum.CERTIFIED.name());
146 hasProps.put(GraphPropertyEnum.DISTRIBUTION_STATUS, DistributionStatusEnum.DISTRIBUTED.name());
149 Map<GraphPropertyEnum, Object> hasNotProps = new HashMap<>();
150 hasNotProps.put(GraphPropertyEnum.IS_DELETED, true);
151 log.info("Try to fetch services with properties {} and not {}", hasProps, hasNotProps);
153 Either<List<GraphVertex>, TitanOperationStatus> servicesByCriteria = titanDao.getByCriteria(VertexTypeEnum.TOPOLOGY_TEMPLATE, hasProps, hasNotProps, JsonParseFlagEnum.ParseAll);
154 if (servicesByCriteria.isRight()) {
155 log.info("Failed to fetch services {}", servicesByCriteria.right().value());
158 List<GraphVertex> services = servicesByCriteria.left().value();
159 for (GraphVertex gv : services) {
160 ComponentParametersView filter = new ComponentParametersView(true);
161 filter.setIgnoreComponentInstances(false);
162 filter.setIgnoreArtifacts(false);
163 filter.setIgnoreGroups(false);
165 Either<Service, StorageOperationStatus> toscaElement = toscaOperationFacade.getToscaElement(gv.getUniqueId());
166 if (toscaElement.isRight()) {
167 log.info("Failed to fetch service {} {}", gv.getUniqueId(), toscaElement.right().value());
170 Service service = toscaElement.left().value();
171 List<ComponentInstance> componentInstances = service.getComponentInstances();
172 boolean isProblematic = false;
173 if (componentInstances == null) {
174 log.info("No instances for service {} ", gv.getUniqueId());
177 String serviceName = (String) gv.getMetadataProperty(GraphPropertyEnum.NAME);
179 for (ComponentInstance ci : componentInstances) {
180 Map<String, ArtifactDefinition> deploymentArtifacts = ci.getDeploymentArtifacts();
181 List<GroupInstance> groupInstances = ci.getGroupInstances();
182 if (groupInstances == null || groupInstances.isEmpty()) {
183 log.info("No instance groups for instance {} in service {} id {} ", ci.getName(), serviceName, gv.getUniqueId());
187 for (GroupInstance gi : groupInstances) {
188 if (gi.getType().equals(Constants.DEFAULT_GROUP_VF_MODULE)) {
189 if (isProblematicGroupInstance(gi, ci.getName(), serviceName, deploymentArtifacts)) {
190 isProblematic = true;
196 serviceList.add(service);
197 writeModuleResultToFile(writer, service, null);
203 log.info("output file with list of services : {}", fileName);
204 } catch (Exception e) {
205 log.info("Failed to fetch services ", e);
212 } catch (Exception ex) {
218 private boolean isProblematicGroupInstance(GroupInstance gi, String instName, String servicename, Map<String, ArtifactDefinition> deploymentArtifacts) {
219 List<String> artifacts = gi.getArtifacts();
220 List<String> artifactsUuid = gi.getArtifactsUuid();
221 List<String> instArtifactsUuid = gi.getGroupInstanceArtifactsUuid();
223 if ((artifactsUuid == null || artifactsUuid.isEmpty()) && (artifacts == null || artifacts.isEmpty())) {
224 log.info("No instance groups for instance {} in service {} ", instName, servicename);
227 if (artifacts.size() < artifactsUuid.size()) {
228 log.info(" artifacts.size() < artifactsUuid.size() inst {} in service {} ", instName, servicename);
231 if (artifacts.size() > 0 && (artifactsUuid == null || artifactsUuid.isEmpty())) {
232 log.info(" artifacts.size() > 0 && (artifactsUuid == null || artifactsUuid.isEmpty() inst {} in service {} ", instName, servicename);
235 if (artifactsUuid.contains(null)) {
236 log.info(" artifactsUuid.contains(null) inst {} in service {} ", instName, servicename);
240 for (String artifactId : artifacts) {
241 String artifactlabel = findArtifactLabelFromArtifactId(artifactId);
242 ArtifactDefinition artifactDefinition = deploymentArtifacts.get(artifactlabel);
243 if (artifactDefinition == null) {
244 log.info(" artifactDefinition == null label {} inst {} in service {} ", artifactlabel, instName, servicename);
247 ArtifactTypeEnum artifactType = ArtifactTypeEnum.findType(artifactDefinition.getArtifactType());
248 if (artifactType != ArtifactTypeEnum.HEAT_ENV) {
249 if (!artifactId.equals(artifactDefinition.getUniqueId())) {
250 log.info(" !artifactId.equals(artifactDefinition.getUniqueId() artifact {} artId {} inst {} in service {} ", artifactlabel, artifactId, instName, servicename);
253 if (!artifactsUuid.contains(artifactDefinition.getArtifactUUID())) {
254 log.info(" artifactsUuid.contains(artifactDefinition.getArtifactUUID() label {} inst {} in service {} ", artifactlabel, instName, servicename);
258 if (!instArtifactsUuid.contains(artifactDefinition.getArtifactUUID())) {
259 log.info(" instArtifactsUuid.contains(artifactDefinition.getArtifactUUID() label {} inst {} in service {} ", artifactlabel, instName, servicename);
267 private boolean fix(List<Resource> vfLst, List<Service> serviceList) {
270 if (vfLst != null && !vfLst.isEmpty()) {
273 for (Component component : vfLst) {
274 TopologyTemplate topologyTemplate = ModelConverter.convertToToscaElement(component);
275 Map<String, GroupDataDefinition> groups = topologyTemplate.getGroups();
276 res = fixDataOnGraph(component.getUniqueId(), VertexTypeEnum.GROUPS, EdgeLabelEnum.GROUPS, groups);
281 if (res == true && serviceList != null && !serviceList.isEmpty()) {
282 res = fixServices(serviceList);
284 for (Component component : serviceList) {
285 TopologyTemplate topologyTemplate = ModelConverter.convertToToscaElement(component);
286 Map<String, MapGroupsDataDefinition> groups = topologyTemplate.getInstGroups();
287 res = fixDataOnGraph(component.getUniqueId(), VertexTypeEnum.INST_GROUPS, EdgeLabelEnum.INST_GROUPS, groups);
295 private <T extends ToscaDataDefinition> boolean fixDataOnGraph(String componentId, VertexTypeEnum vertexTypeEnum, EdgeLabelEnum edgeLabelEnum, Map<String, T> groups) {
297 Either<GraphVertex, TitanOperationStatus> getResponse = titanDao.getVertexById(componentId, JsonParseFlagEnum.NoParse);
298 if (getResponse.isRight()) {
299 log.debug("Couldn't fetch component unique id {}, error: {}", componentId, getResponse.right().value());
304 GraphVertex componentVertex = getResponse.left().value();
306 GraphVertex toscaDataVertex = null;
307 Either<GraphVertex, TitanOperationStatus> groupVertexEither = titanDao.getChildVertex(componentVertex, edgeLabelEnum, JsonParseFlagEnum.ParseJson);
308 if (groupVertexEither.isRight()) {
310 log.debug("failed to get child {} vertex for component unique id {}, error: {}", edgeLabelEnum, componentId, groupVertexEither.right().value());
313 toscaDataVertex = groupVertexEither.left().value();
314 toscaDataVertex.setJson(groups);
315 Either<GraphVertex, TitanOperationStatus> updatevertexEither = titanDao.updateVertex(toscaDataVertex);
316 if (updatevertexEither.isRight()) {
317 log.debug("failed to update vertex for component unique id {}, error: {}", componentId, updatevertexEither.right().value());
329 private boolean fixServices(List<Service> serviceList) {
330 for (Service service : serviceList) {
331 log.debug("Migration1707ArtifactUuidFix fix service: id {}, name {} ", service.getUniqueId(), service.getName());
332 List<ComponentInstance> instances = service.getComponentInstances();
333 for (ComponentInstance instance : instances) {
334 Map<String, ArtifactDefinition> artifactsMap = instance.getDeploymentArtifacts();
335 List<GroupInstance> groupsList = instance.getGroupInstances();
336 if (groupsList != null && artifactsMap != null) {
337 for (GroupInstance group : groupsList) {
338 if (group.getType().equals(Constants.DEFAULT_GROUP_VF_MODULE)) {
339 log.debug("Migration1707ArtifactUuidFix fix group: resource id {}, group name {} ", service.getUniqueId(), group.getName());
340 List<String> groupArtifacts = new ArrayList<String>(group.getArtifacts());
342 group.getArtifacts().clear();
343 group.getArtifactsUuid().clear();
344 group.getGroupInstanceArtifacts().clear();
345 group.getGroupInstanceArtifactsUuid().clear();
347 for (String artifactId : groupArtifacts) {
348 String artifactlabel = findArtifactLabelFromArtifactId(artifactId);
349 log.debug("Migration1707ArtifactUuidFix fix group: group name {} artifactId for fix {} artifactlabel {} ", group.getName(), artifactId, artifactlabel);
350 if (!artifactlabel.isEmpty() && artifactsMap.containsKey(artifactlabel)) {
351 ArtifactDefinition artifact = artifactsMap.get(artifactlabel);
352 ArtifactTypeEnum artifactType = ArtifactTypeEnum.findType(artifact.getArtifactType());
353 String correctArtifactId = artifact.getUniqueId();
354 String correctArtifactUUID = artifact.getArtifactUUID();
355 if (artifactType != ArtifactTypeEnum.HEAT_ENV) {
357 log.debug("Migration1707ArtifactUuidFix fix group: group name {} correct artifactId {} artifactUUID {} ", group.getName(), correctArtifactId, correctArtifactUUID);
358 group.getArtifacts().add(correctArtifactId);
359 if (correctArtifactUUID != null && !correctArtifactUUID.isEmpty()) {
360 group.getArtifactsUuid().add(correctArtifactUUID);
363 log.debug("Migration1707ArtifactUuidFix fix group: group name {} correct artifactId {} artifactUUID {} ", group.getName(), correctArtifactId, correctArtifactUUID);
364 group.getGroupInstanceArtifacts().add(correctArtifactId);
365 if (correctArtifactUUID != null && !correctArtifactUUID.isEmpty()) {
366 group.getGroupInstanceArtifactsUuid().add(correctArtifactUUID);
381 private boolean fixVf(List<Resource> vfLst) {
382 for (Resource resource : vfLst) {
383 log.debug("Migration1707ArtifactUuidFix fix resource: id {}, name {} ", resource.getUniqueId(), resource.getName());
384 Map<String, ArtifactDefinition> artifactsMap = resource.getDeploymentArtifacts();
385 List<GroupDefinition> groupsList = resource.getGroups();
386 if (groupsList != null && artifactsMap != null) {
387 for (GroupDefinition group : groupsList) {
388 if (group.getType().equals(Constants.DEFAULT_GROUP_VF_MODULE)) {
389 log.debug("Migration1707ArtifactUuidFix fix group: resource id {}, group name {} ", resource.getUniqueId(), group.getName());
390 List<String> groupArtifacts = new ArrayList<String>(group.getArtifacts());
391 group.getArtifacts().clear();
392 group.getArtifactsUuid().clear();
393 for (String artifactId : groupArtifacts) {
394 String artifactlabel = findArtifactLabelFromArtifactId(artifactId);
395 log.debug("Migration1707ArtifactUuidFix fix group: group name {} artifactId for fix {} artifactlabel {} ", group.getName(), artifactId, artifactlabel);
396 if (!artifactlabel.isEmpty() && artifactsMap.containsKey(artifactlabel)) {
397 ArtifactDefinition artifact = artifactsMap.get(artifactlabel);
398 String correctArtifactId = artifact.getUniqueId();
399 String correctArtifactUUID = artifact.getArtifactUUID();
400 log.debug("Migration1707ArtifactUuidFix fix group: group name {} correct artifactId {} artifactUUID {} ", group.getName(), correctArtifactId, correctArtifactUUID);
401 group.getArtifacts().add(correctArtifactId);
402 if (correctArtifactUUID != null && !correctArtifactUUID.isEmpty()) {
403 group.getArtifactsUuid().add(correctArtifactUUID);
417 private String findArtifactLabelFromArtifactId(String artifactId) {
418 String artifactLabel = "";
420 int index = artifactId.lastIndexOf(".");
421 if (index > 0 && index + 1 < artifactId.length())
422 artifactLabel = artifactId.substring(index + 1);
423 return artifactLabel;
426 private void writeModuleResultToFile(Writer writer, org.openecomp.sdc.be.model.Component component, Service service) {
428 // "service name, service id, state, version
429 StringBuffer sb = new StringBuffer(component.getName());
430 sb.append(",").append(component.getUniqueId()).append(",").append(component.getLifecycleState()).append(",").append(component.getVersion());
431 if (service != null) {
432 sb.append(",").append(service.getName());
435 writer.write(sb.toString());
436 } catch (IOException e) {
437 // TODO Auto-generated catch block