Allow handling of legact model artifacts
[aai/model-loader.git] / src / main / java / org / openecomp / modelloader / entity / model / ModelV8Artifact.java
diff --git a/src/main/java/org/openecomp/modelloader/entity/model/ModelV8Artifact.java b/src/main/java/org/openecomp/modelloader/entity/model/ModelV8Artifact.java
new file mode 100644 (file)
index 0000000..847f880
--- /dev/null
@@ -0,0 +1,122 @@
+/**
+ * ============LICENSE_START=======================================================
+ * Model Loader
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.modelloader.entity.model;
+
+import java.util.List;
+
+import javax.ws.rs.core.Response;
+
+import org.openecomp.cl.api.Logger;
+import org.openecomp.cl.eelf.LoggerFactory;
+import org.openecomp.modelloader.config.ModelLoaderConfig;
+import org.openecomp.modelloader.entity.Artifact;
+import org.openecomp.modelloader.entity.ArtifactType;
+import org.openecomp.modelloader.restclient.AaiRestClient;
+import org.openecomp.modelloader.service.ModelLoaderMsgs;
+
+import com.sun.jersey.api.client.ClientResponse;
+
+public class ModelV8Artifact extends AbstractModelArtifact {
+  private static String AAI_CONVERSION_URL = "/aai/tools/modeltransform";      
+
+  private static Logger logger = LoggerFactory.getInstance().getLogger(ModelArtifact.class.getName());
+
+  private String modelNameVersionId; 
+       private ModelArtifact translatedModel;
+
+       public ModelV8Artifact() {
+         super(ArtifactType.MODEL_V8);
+       }
+
+       public String getModelNameVersionId() {
+         return modelNameVersionId;
+       }
+       
+       public void setModelNameVersionId(String modelNameVersionId) {
+               this.modelNameVersionId = modelNameVersionId;
+       }
+       
+  @Override
+  public String getUniqueIdentifier() {
+    return getModelNameVersionId();
+  }    
+       
+  @Override
+  public boolean push(AaiRestClient aaiClient, ModelLoaderConfig config, String distId, List<AbstractModelArtifact> addedModels) {
+    // For a legacy model (version <= v8), we need to call out to an A&AI endpoint to convert to the proper format
+    ClientResponse response  = aaiClient.postResource(getConversionUrl(config), constructTransformPayload(), distId, AaiRestClient.MimeType.XML);
+    if ( (response == null) || (response.getStatus() != Response.Status.OK.getStatusCode()) ) {
+      logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR, "Ingestion failed for " + 
+          getType().toString() + " " + getModelNameVersionId() + ". Unable to convert model.  Rolling back distribution.");
+      return false;
+    }
+    
+    String translatedPayload = response.getEntity(String.class);
+    
+    logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Translated artifact payload:\n" + translatedPayload);
+    
+    ModelArtifactParser parser = new ModelArtifactParser();
+    
+    List<Artifact> parsedArtifacts = parser.parse(translatedPayload.getBytes(), "translated-payload");
+    if (parsedArtifacts == null || parsedArtifacts.isEmpty()) {
+      return false;
+    } 
+    
+    translatedModel = (ModelArtifact)parsedArtifacts.get(0);
+    return translatedModel.push(aaiClient, config, distId, addedModels);
+  }
+
+  @Override
+  public void rollbackModel(AaiRestClient aaiClient, ModelLoaderConfig config, String distId) {
+    if (translatedModel != null) {
+      translatedModel.rollbackModel(aaiClient, config, distId);
+    }
+  }
+  
+
+  private String constructTransformPayload() {
+    // A&AI requires that to transform a legacy model, we need to use the v8 namespace (even 
+    // if the version < 8)
+    return getPayload().replaceFirst("aai.inventory/v.", "aai.inventory/v8");
+  }
+  
+  private String getConversionUrl(ModelLoaderConfig config) {
+    String baseUrl = config.getAaiBaseUrl().trim();
+    String subUrl = AAI_CONVERSION_URL;
+
+    if ( (!baseUrl.endsWith("/")) && (!subUrl.startsWith("/")) ) {
+      baseUrl = baseUrl + "/";
+    }
+
+    if ( baseUrl.endsWith("/") && subUrl.startsWith("/") ) {
+      baseUrl = baseUrl.substring(0, baseUrl.length()-1);
+    }
+
+    if (!subUrl.endsWith("/")) {
+      subUrl = subUrl + "/";
+    }
+
+    String url = baseUrl + subUrl;
+    return url;
+  }
+}