[sdc] update code of sdc
[sdc.git] / openecomp-be / lib / openecomp-migration-lib / src / main / java / org / openecomp / sdc / migration / ToscaNamespaceMigration.java
1 package org.openecomp.sdc.migration;
2
3 import org.apache.commons.collections4.CollectionUtils;
4 import org.apache.commons.io.IOUtils;
5 import org.openecomp.core.model.dao.EnrichedServiceModelDao;
6 import org.openecomp.core.model.dao.EnrichedServiceModelDaoFactory;
7 import org.openecomp.core.model.dao.ServiceModelDao;
8 import org.openecomp.core.model.dao.ServiceModelDaoFactory;
9 import org.openecomp.core.model.types.ServiceElement;
10 import org.openecomp.core.utilities.json.JsonUtil;
11 import org.openecomp.sdc.logging.api.Logger;
12 import org.openecomp.sdc.logging.api.LoggerFactory;
13 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
14 import org.openecomp.sdc.tosca.datatypes.model.Import;
15 import org.openecomp.sdc.tosca.datatypes.model.Old1610ServiceTemplate;
16 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
17 import org.openecomp.sdc.tosca.services.yamlutil.ToscaExtensionYamlUtil;
18 import org.openecomp.sdc.vendorsoftwareproduct.OrchestrationTemplateCandidateManager;
19 import org.openecomp.sdc.vendorsoftwareproduct.OrchestrationTemplateCandidateManagerFactory;
20 import org.openecomp.sdc.vendorsoftwareproduct.VendorSoftwareProductConstants;
21 import org.openecomp.sdc.vendorsoftwareproduct.VendorSoftwareProductManager;
22 import org.openecomp.sdc.vendorsoftwareproduct.VspManagerFactory;
23 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDao;
24 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDaoFactory;
25 import org.openecomp.sdc.vendorsoftwareproduct.dao.PackageInfoDao;
26 import org.openecomp.sdc.vendorsoftwareproduct.dao.PackageInfoDaoFactory;
27 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductDao;
28 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductDaoFactory;
29 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao;
30 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDaoFactory;
31 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentEntity;
32 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.PackageInfo;
33 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
34 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComponentData;
35 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionData;
36 import org.openecomp.sdc.versioning.dao.types.Version;
37 import org.openecomp.core.zusammen.impl.CassandraConnectionInitializer;
38
39
40 import java.io.ByteArrayOutputStream;
41 import java.io.File;
42 import java.io.FileOutputStream;
43 import java.io.IOException;
44 import java.io.InputStream;
45 import java.nio.ByteBuffer;
46 import java.util.ArrayList;
47 import java.util.Collection;
48 import java.util.Enumeration;
49 import java.util.HashMap;
50 import java.util.List;
51 import java.util.Map;
52 import java.util.Objects;
53 import java.util.zip.ZipEntry;
54 import java.util.zip.ZipFile;
55 import java.util.zip.ZipOutputStream;
56
57
58 /**
59  * Created by TALIO on 3/19/2017
60  */
61 public class ToscaNamespaceMigration {
62
63   private static VendorSoftwareProductManager vendorSoftwareProductManager =
64       VspManagerFactory.getInstance().createInterface();
65   private static OrchestrationTemplateCandidateManager orchestrationTemplateCandidateManager =
66       OrchestrationTemplateCandidateManagerFactory.getInstance().createInterface();
67   private static VendorSoftwareProductDao vendorSoftwareProductDao =
68       VendorSoftwareProductDaoFactory.getInstance().createInterface();
69   private static ServiceModelDao<ToscaServiceModel, ServiceElement> serviceModelDao =
70       ServiceModelDaoFactory.getInstance().createInterface();
71   private static EnrichedServiceModelDao<ToscaServiceModel, ServiceElement>
72       enrichedServiceModelDao =
73       EnrichedServiceModelDaoFactory.getInstance().createInterface();
74   private static VendorSoftwareProductInfoDao vspInfoDao =
75       VendorSoftwareProductInfoDaoFactory.getInstance().createInterface();
76   private static PackageInfoDao packageInfoDao = PackageInfoDaoFactory.getInstance()
77       .createInterface();
78   private static final ComponentDao componentDao =
79       ComponentDaoFactory.getInstance().createInterface();
80   private static Logger logger = LoggerFactory.getLogger(ToscaNamespaceMigration.class);
81   private static int status = 0;
82
83
84   public static void main(String[] args) {
85     //CassandraConnectionInitializer.setCassandraConnectionPropertiesToSystem();
86
87     Collection<VspDetails> vspList = vspInfoDao.list(new VspDetails());
88
89     List<PackageInfo> packagesList =
90         packageInfoDao.listByCategory(null, null);
91
92     for (VspDetails vspInfo : vspList) {
93       printMessage("Performing migration on vsp " + vspInfo.getName() + " and version " + vspInfo
94           .getVersion().toString() + "\n");
95       performMigration(vspInfo);
96     }
97
98     System.exit(status);
99   }
100
101   private static void performMigration(VspDetails vspDetails) {
102
103     changeComponentNamePrefix(vspDetails);
104
105     try {
106       changeNamespaceInServiceTemplates(vspDetails);
107     } catch (Exception e) {
108       printMessage(
109           "Could not perform migration for service templates on vsp " + vspDetails.getName());
110       status = -1;
111     }
112
113     if (vspDetails.getVersion().isFinal()) {
114       changeNamespaceInPackage(vspDetails);
115     }
116
117   }
118
119   private static void changeComponentNamePrefix(VspDetails vspDetails){
120     Collection<ComponentEntity> componentsList =
121         componentDao.list(new ComponentEntity(vspDetails.getId(), vspDetails.getVersion(), null));
122
123     if(CollectionUtils.isEmpty(componentsList)){
124       printMessage("No component namespace migration was performed on vsp with id" + vspDetails
125           .getId() + " and version " + vspDetails.getVersion().toString() + " since it has no " +
126           "components");
127       return;
128     }
129
130     for(ComponentEntity component : componentsList){
131       String compositionData = component.getCompositionData();
132
133       if(Objects.isNull(compositionData)){
134         continue;
135       }
136
137       ComponentData componentData =
138           JsonUtil.json2Object(compositionData, ComponentData.class);
139       componentData.setName(componentData.getName().replace("com.att.d2", "org.openecomp"));
140       component.setCompositionData(JsonUtil.object2Json(componentData));
141
142       componentDao.update(component);
143     }
144
145     printMessage("Component namespace migration was performed on vsp with id" + vspDetails
146         .getId() + " and version " + vspDetails.getVersion().toString());
147   }
148
149   private static void changeNamespaceInServiceTemplates(VspDetails vspDetails) throws IOException {
150     String vspId = vspDetails.getId();
151     Version version = vspDetails.getVersion();
152     ToscaServiceModel serviceModel;
153     ToscaServiceModel enrichedServiceModel;
154
155     serviceModel =
156         serviceModelDao.getServiceModel(vspId, version);
157     enrichedServiceModel =
158         enrichedServiceModelDao.getServiceModel(vspId, version);
159
160     printMessage("Working on vsp_service_template table in DB \n");
161     changeNamespaceInServiceModel(serviceModel);
162     printMessage("Finished Working on vsp_service_template table in DB \n");
163
164     printMessage("Working on vsp_enriched_service_template table in DB \n");
165     changeNamespaceInServiceModel(enrichedServiceModel);
166     printMessage("Finished Working on vsp_enriched_service_template table in DB \n");
167
168     serviceModelDao.storeServiceModel(vspId, version, serviceModel);
169     enrichedServiceModelDao.storeServiceModel(vspId, version, enrichedServiceModel);
170   }
171
172   private static void changeNamespaceInServiceModel(ToscaServiceModel serviceModel) {
173     Map<String, ServiceTemplate> changedServiceTemplates = new HashMap<>();
174     Map<String, ServiceTemplate> serviceTemplates = serviceModel.getServiceTemplates();
175
176     for (Map.Entry<String, ServiceTemplate> serviceTemplateEntry : serviceTemplates.entrySet()) {
177       printMessage(
178           "Changing namespace for Service Template " + serviceTemplateEntry.getKey() + "\n");
179
180       ServiceTemplate serviceTemplate = serviceTemplateEntry.getValue();
181       String fileAsJson = JsonUtil.object2Json(serviceTemplate);
182       String replacedNamespace = fileAsJson.replace("org.openecomp.d2", "org.openecomp");
183       ServiceTemplate newServiceTemplate;
184       try {
185         newServiceTemplate =
186             new ToscaExtensionYamlUtil().yamlToObject(replacedNamespace, ServiceTemplate.class);
187       } catch (Exception e) {
188         System.out.println("Found vsp with old-versioned tosca service template");
189         Old1610ServiceTemplate oldServiceTemplate =
190             JsonUtil.json2Object(replacedNamespace, Old1610ServiceTemplate.class);
191         newServiceTemplate = mapOldSTToCurrentST(oldServiceTemplate);
192
193       }
194       changedServiceTemplates.put(
195           serviceTemplateEntry.getKey(), newServiceTemplate);
196     }
197
198     serviceModel.setServiceTemplates(changedServiceTemplates);
199   }
200
201   private static org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate mapOldSTToCurrentST(
202       Old1610ServiceTemplate oldServiceTemplate) {
203     org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate
204         serviceTemplate = new org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate();
205
206     serviceTemplate.setArtifact_types(oldServiceTemplate.getArtifact_types());
207     serviceTemplate.setCapability_types(oldServiceTemplate.getCapability_types());
208     serviceTemplate.setData_types(oldServiceTemplate.getData_types());
209     serviceTemplate.setDescription(oldServiceTemplate.getDescription());
210     serviceTemplate.setGroup_types(oldServiceTemplate.getGroup_types());
211     serviceTemplate.setInterface_types(oldServiceTemplate.getInterface_types());
212     serviceTemplate.setMetadata(oldServiceTemplate.getMetadata());
213     serviceTemplate.setNode_types(oldServiceTemplate.getNode_types());
214     serviceTemplate.setPolicy_types(oldServiceTemplate.getPolicy_types());
215     serviceTemplate.setRelationship_types(oldServiceTemplate.getRelationship_types());
216     serviceTemplate.setTopology_template(oldServiceTemplate.getTopology_template());
217
218     List<Map<String, Import>> imports = new ArrayList<>();
219     for (Map.Entry<String, Import> importEntry : oldServiceTemplate.getImports().entrySet()) {
220       Map<String, Import> importMap = new HashMap<>();
221       importMap.put(importEntry.getKey(), importEntry.getValue());
222       imports.add(importMap);
223     }
224     serviceTemplate.setImports(imports);
225
226     return serviceTemplate;
227
228   }
229
230   private static void changeNamespaceInPackage(VspDetails vspDetails) {
231     String vspId = vspDetails.getId();
232     printMessage("Start updating CSAR file with new namespace in DB \n");
233
234     File translatedFile;
235     try {
236       translatedFile =
237           getTranslatedFile(vspId, vspDetails.getVersion());
238     } catch (Exception e) {
239       printMessage("No translated file was found under vsp " + vspDetails.getName() + "\n");
240       return;
241     }
242     try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
243          ZipOutputStream zos = new ZipOutputStream(baos);
244          ZipFile zipFile = new ZipFile(translatedFile)) {
245       Enumeration<? extends ZipEntry> entries = zipFile.entries();
246
247       while (entries.hasMoreElements()) {
248         ZipEntry ze = entries.nextElement();
249         InputStream zipEntryIs = zipFile.getInputStream(ze);
250         byte[] contentAsByte = IOUtils.toByteArray(zipEntryIs);
251         String fileContent = new String(contentAsByte);
252
253         String replacedNamespace = fileContent.replace("org.openecomp.d2", "org.openecomp");
254
255         zos.putNextEntry(new ZipEntry(ze.getName()));
256         zos.write(replacedNamespace.getBytes());
257       }
258       printMessage("Changed Tosca namesapce in package for vsp " + vspDetails.getName() + "\n");
259
260
261       packageInfoDao.updateTranslatedContent(
262           vspId, vspDetails.getVersion(), ByteBuffer.wrap(baos.toByteArray()));
263       printMessage("Updated CSAR file with new namespace in DB \n");
264
265     } catch (Exception e) {
266       printMessage("Could not perform migration on csar");
267     }
268   }
269
270   private static void printMessage(String message) {
271     System.out.print(message);
272     logger.debug(message);
273   }
274
275   private static File getTranslatedFile(String vspId, Version version)
276       throws IOException {
277     PackageInfo packageInfo =
278         packageInfoDao.get(new PackageInfo(vspId, version));
279     ByteBuffer translatedFileBuffer = packageInfo == null ? null :  packageInfo.getTranslatedFile();
280
281     File translatedFile = new File(VendorSoftwareProductConstants.VSP_PACKAGE_ZIP);
282
283     FileOutputStream fos = new FileOutputStream(translatedFile);
284     fos.write(translatedFileBuffer.array());
285     fos.close();
286
287
288     return translatedFile;
289   }
290 }