/**
- * ============LICENSE_START=======================================================
+ * ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
* Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
*/
package org.onap.aai.modelloader.entity.model;
-import java.io.StringWriter;
import java.util.List;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.xml.XMLConstants;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
+
import org.onap.aai.cl.api.Logger;
import org.onap.aai.cl.eelf.LoggerFactory;
import org.onap.aai.modelloader.config.ModelLoaderConfig;
import org.onap.aai.modelloader.entity.ArtifactType;
import org.onap.aai.modelloader.restclient.AaiRestClient;
import org.onap.aai.modelloader.service.ModelLoaderMsgs;
-import org.onap.aai.restclient.client.OperationResult;
-import org.w3c.dom.Node;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.client.HttpServerErrorException;
+
public class ModelArtifact extends AbstractModelArtifact {
+ private static Logger logger = LoggerFactory.getInstance().getLogger(ModelArtifact.class);
+
private static final String AAI_MODEL_VER_SUB_URL = "/model-vers/model-ver";
private static final String FAILURE_MSG_PREFIX = "Ingestion failed for ";
private static final String ROLLBACK_MSG_SUFFIX = ". Rolling back distribution.";
- private static Logger logger = LoggerFactory.getInstance().getLogger(ModelArtifact.class.getName());
private String modelVerId;
private String modelInvariantId;
- private Node modelVer;
+ private String modelVer;
private boolean firstVersionOfModel = false;
public ModelArtifact() {
this.modelInvariantId = modelInvariantId;
}
- public Node getModelVer() {
+ public String getModelVer() {
return modelVer;
}
- public void setModelVer(Node modelVer) {
+ public void setModelVer(String modelVer) {
this.modelVer = modelVer;
}
/**
* Test whether the specified resource (URL) can be requested successfully
- *
+ *
* @param aaiClient
* @param distId
* @param xmlResourceUrl
* @return true if a request to GET this resource as XML media is successful (status OK)
*/
private boolean xmlResourceCanBeFetched(AaiRestClient aaiClient, String distId, String xmlResourceUrl) {
- OperationResult getResponse = aaiClient.getResource(xmlResourceUrl, distId, MediaType.APPLICATION_XML_TYPE);
- return getResponse != null && getResponse.getResultCode() == Response.Status.OK.getStatusCode();
+ try {
+ ResponseEntity<Model> getResponse = getResourceModel(aaiClient, distId, xmlResourceUrl);
+ return getResponse.getStatusCode().equals(HttpStatus.OK);
+ } catch (HttpClientErrorException e) {
+ if(e.getStatusCode().equals(HttpStatus.NOT_FOUND)) {
+ return false;
+ } else {
+ throw e;
+ }
+ }
+ }
+
+ /**
+ * Test whether the specified resource (URL) can be requested successfully
+ *
+ * @param aaiClient
+ * @param distId
+ * @param xmlResourceUrl
+ * @return OperationResult the result of the operation
+ */
+ private ResponseEntity<Model> getResourceModel(AaiRestClient aaiClient, String distId, String xmlResourceUrl) {
+ return aaiClient.getResource(xmlResourceUrl, distId, MediaType.APPLICATION_XML, Model.class);
}
/**
* PUT the specified XML resource
- *
+ *
* @param aaiClient
* @param distId
* @param resourceUrl
* @return true if the resource PUT as XML media was successful (status OK)
*/
private boolean putXmlResource(AaiRestClient aaiClient, String distId, String resourceUrl, String payload) {
- OperationResult putResponse =
- aaiClient.putResource(resourceUrl, payload, distId, MediaType.APPLICATION_XML_TYPE);
- return putResponse != null && putResponse.getResultCode() == Response.Status.CREATED.getStatusCode();
+ ResponseEntity<String> putResponse = null;
+ try {
+ putResponse =
+ aaiClient.putResource(resourceUrl, payload, distId, MediaType.APPLICATION_XML, String.class);
+ } catch (HttpClientErrorException | HttpServerErrorException e) {
+ logger.error(ModelLoaderMsgs.AAI_REST_REQUEST_ERROR, "Error putting resource: " + e.toString());
+ }
+ return putResponse != null && putResponse.getStatusCode() == HttpStatus.CREATED;
}
@Override
public boolean push(AaiRestClient aaiClient, ModelLoaderConfig config, String distId,
List<Artifact> completedArtifacts) {
- boolean success;
+ if (config.useGizmo()) {
+ return pushToGizmo(aaiClient, config, distId);
+ }
+
+ return pushToResources(aaiClient, config, distId, completedArtifacts);
+ }
+
+ private boolean pushToResources(AaiRestClient aaiClient, ModelLoaderConfig config, String distId,
+ List<Artifact> completedArtifacts) {
+ boolean success = false;
// See whether the model is already present
String resourceUrl = getModelUrl(config);
+ // ResponseEntity<Model> result;
+ boolean modelExists = checkIfModelExists(aaiClient, distId, resourceUrl);
- if (xmlResourceCanBeFetched(aaiClient, distId, resourceUrl)) {
- logInfoMsg(getType().toString() + " " + getModelInvariantId() + " already exists. Skipping ingestion.");
- success = pushModelVersion(aaiClient, config, distId, completedArtifacts);
+ if(modelExists) {
+ success = updateExistingModel(aaiClient, config, distId, completedArtifacts);
} else {
- // Assume that the model does not exist and attempt the PUT
- success = putXmlResource(aaiClient, distId, resourceUrl, getPayload());
- if (success) {
- completedArtifacts.add(this);
+ success = createNewModel(aaiClient, distId, completedArtifacts, resourceUrl);
+ }
- // Record state to remember that this is the first version of the model (just added).
- firstVersionOfModel = true;
+ // if (result != null) {
+ // if (result.getStatusCode() == HttpStatus.OK) {
+ // success = updateExistingModel(aaiClient, config, distId, completedArtifacts);
+ // } else if (result.getStatusCode() == HttpStatus.NOT_FOUND) {
+ // success = createNewModel(aaiClient, distId, completedArtifacts, resourceUrl);
+ // } else {
+ // logModelUpdateFailure(
+ // "Response code " + result.getStatusCodeValue() + " invalid for getting resource model");
+ // }
+ // } else {
+ // logModelUpdateFailure("Null response from RestClient");
+ // }
+
+ return success;
+ }
- logInfoMsg(getType().toString() + " " + getUniqueIdentifier() + " successfully ingested.");
+ private boolean checkIfModelExists(AaiRestClient aaiClient, String distId, String resourceUrl) throws HttpClientErrorException {
+ try {
+ ResponseEntity<Model> response = getResourceModel(aaiClient, distId, resourceUrl);
+ return response.getStatusCode().equals(HttpStatus.OK);
+ } catch (HttpClientErrorException e) {
+ if(e.getStatusCode().equals(HttpStatus.NOT_FOUND)) {
+ return false;
} else {
- logErrorMsg(
- FAILURE_MSG_PREFIX + getType().toString() + " " + getUniqueIdentifier() + ROLLBACK_MSG_SUFFIX);
+ throw e;
}
}
+ }
+
+ private boolean createNewModel(AaiRestClient aaiClient, String distId, List<Artifact> completedArtifacts,
+ String resourceUrl) {
+ boolean success;
+ // Assume that the model does not exist and attempt the PUT
+ success = putXmlResource(aaiClient, distId, resourceUrl, getPayload());
+ if (success) {
+ completedArtifacts.add(this);
+
+ // Record state to remember that this is the first version of the model (just added).
+ firstVersionOfModel = true;
+
+ logInfoMsg(getType() + " " + getUniqueIdentifier() + " successfully ingested.");
+ } else {
+ logModelUpdateFailure("Error creating model. Skipping ingestion.");
+ }
+ return success;
+ }
+ private void logModelUpdateFailure(String message) {
+ logErrorMsg(FAILURE_MSG_PREFIX + getType() + " " + getUniqueIdentifier() + " " + message + ROLLBACK_MSG_SUFFIX);
+ }
+
+ private boolean updateExistingModel(AaiRestClient aaiClient, ModelLoaderConfig config, String distId,
+ List<Artifact> completedArtifacts) {
+ boolean success;
+ logInfoMsg(getType() + " " + getModelInvariantId() + " already exists. Skipping ingestion.");
+ success = pushModelVersion(aaiClient, config, distId, completedArtifacts);
return success;
}
private boolean pushModelVersion(AaiRestClient aaiClient, ModelLoaderConfig config, String distId,
List<Artifact> completedArtifacts) {
if (xmlResourceCanBeFetched(aaiClient, distId, getModelVerUrl(config))) {
- logInfoMsg(getType().toString() + " " + getUniqueIdentifier() + " already exists. Skipping ingestion.");
+ logInfoMsg(getType() + " " + getUniqueIdentifier() + " already exists. Skipping ingestion.");
return true;
}
// Load the model version
boolean success = true;
- try {
- success = putXmlResource(aaiClient, distId, getModelVerUrl(config), nodeToString(getModelVer()));
- if (success) {
- completedArtifacts.add(this);
- logInfoMsg(getType().toString() + " " + getUniqueIdentifier() + " successfully ingested.");
- } else {
- logErrorMsg(
- FAILURE_MSG_PREFIX + getType().toString() + " " + getUniqueIdentifier() + ROLLBACK_MSG_SUFFIX);
- }
- } catch (TransformerException e) {
- logErrorMsg(FAILURE_MSG_PREFIX + getType().toString() + " " + getUniqueIdentifier() + ": " + e.getMessage()
- + ROLLBACK_MSG_SUFFIX);
- success = false;
+ success = putXmlResource(aaiClient, distId, getModelVerUrl(config), getModelVer());
+ if (success) {
+ completedArtifacts.add(this);
+ logInfoMsg(getType() + " " + getUniqueIdentifier() + " successfully ingested.");
+ } else {
+ logModelUpdateFailure("Error pushing model");
}
return success;
@Override
public void rollbackModel(AaiRestClient aaiClient, ModelLoaderConfig config, String distId) {
+ // Gizmo is resilient and doesn't require a rollback. A redistribution will work fine even if
+ // the model is partially loaded.
+ if (config.useGizmo()) {
+ return;
+ }
+
String url = getModelVerUrl(config);
if (firstVersionOfModel) {
// If this was the first version of the model which was added, we want to remove the entire
aaiClient.getAndDeleteResource(url, distId);
}
-
- private void logInfoMsg(String infoMsg) {
- logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, infoMsg);
- }
-
- private void logErrorMsg(String errorMsg) {
- logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR, errorMsg);
- }
-
private String getModelUrl(ModelLoaderConfig config) {
String baseURL = config.getAaiBaseUrl().trim();
String subURL = config.getAaiModelUrl(getModelNamespaceVersion()).trim();
String instance = getModelInvariantId();
- if ((!baseURL.endsWith("/")) && (!subURL.startsWith("/"))) {
+ if (!baseURL.endsWith("/") && !subURL.startsWith("/")) {
baseURL = baseURL + "/";
}
+ AAI_MODEL_VER_SUB_URL;
String instance = getModelVerId();
- if ((!baseURL.endsWith("/")) && (!subURL.startsWith("/"))) {
+ if (!baseURL.endsWith("/") && !subURL.startsWith("/")) {
baseURL = baseURL + "/";
}
return baseURL + subURL + instance;
}
-
- private String nodeToString(Node node) throws TransformerException {
- StringWriter sw = new StringWriter();
- TransformerFactory transFact = TransformerFactory.newInstance();
- transFact.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
- Transformer t = transFact.newTransformer();
- t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
- t.transform(new DOMSource(node), new StreamResult(sw));
- return sw.toString();
- }
}