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