/**
- * ============LICENSE_START=======================================================
+ * ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
* Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
*/
package org.onap.aai.modelloader.service;
-import java.io.FileInputStream;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import javax.annotation.PostConstruct;
+import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
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.Artifact;
-import org.onap.aai.modelloader.notification.ArtifactDeploymentManager;
import org.onap.aai.modelloader.notification.ArtifactDownloadManager;
import org.onap.aai.modelloader.notification.EventCallback;
-import org.onap.aai.modelloader.restclient.BabelServiceClientFactory;
+import org.onap.aai.modelloader.notification.NotificationDataImpl;
+import org.onap.aai.modelloader.notification.NotificationPublisher;
import org.onap.sdc.api.IDistributionClient;
import org.onap.sdc.api.notification.IArtifactInfo;
-import org.onap.sdc.api.notification.INotificationData;
import org.onap.sdc.api.results.IDistributionClientResult;
import org.onap.sdc.impl.DistributionClientFactory;
import org.onap.sdc.utils.DistributionActionResultEnum;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
@RequestMapping("/services/model-loader/v1/model-service")
public class ModelLoaderService implements ModelLoaderInterface {
- static Logger logger = LoggerFactory.getInstance().getLogger(ModelLoaderService.class.getName());
-
- protected static final String FILESEP =
- (System.getProperty("file.separator") == null) ? "/" : System.getProperty("file.separator");
+ private static Logger logger = LoggerFactory.getInstance().getLogger(ModelLoaderService.class.getName());
@Value("${CONFIG_HOME}")
private String configDir;
private IDistributionClient client;
private ModelLoaderConfig config;
+ @Autowired
+ private BabelServiceClientFactory babelClientFactory;
/**
* Responsible for loading configuration files and calling initialization.
ModelLoaderConfig.setConfigHome(configDir);
Properties configProperties = new Properties();
try {
- configProperties.load(new FileInputStream(configDir + FILESEP + "model-loader.properties"));
+ configProperties.load(Files.newInputStream(Paths.get(configDir, "model-loader.properties")));
config = new ModelLoaderConfig(configProperties);
if (!config.getASDCConnectionDisabled()) {
initSdcClient();
/**
* Responsible for stopping the connection to the distribution client before the resource is destroyed.
*/
- protected void preShutdownOperations() {
+ public void preShutdownOperations() {
logger.info(ModelLoaderMsgs.STOPPING_CLIENT);
if (client != null) {
client.stop();
IDistributionClientResult initResult = client.init(config, callback);
- if (initResult.getDistributionActionResult() != DistributionActionResultEnum.SUCCESS) {
- String errorMsg = "Failed to initialize distribution client: " + initResult.getDistributionMessageResult();
- logger.error(ModelLoaderMsgs.ASDC_CONNECTION_ERROR, errorMsg);
-
- // Kick off a timer to retry the SDC connection
- Timer timer = new Timer();
- TimerTask task = new SdcConnectionJob(client, config, callback, timer);
- timer.schedule(task, new Date(), 60000);
- } else {
+ if (initResult.getDistributionActionResult() == DistributionActionResultEnum.SUCCESS) {
// Start distribution client
logger.debug(ModelLoaderMsgs.INITIALIZING, "Starting distribution client...");
IDistributionClientResult startResult = client.start();
- if (startResult.getDistributionActionResult() != DistributionActionResultEnum.SUCCESS) {
+ if (startResult.getDistributionActionResult() == DistributionActionResultEnum.SUCCESS) {
+ logger.info(ModelLoaderMsgs.INITIALIZING, "Connection to SDC established");
+ } else {
String errorMsg = "Failed to start distribution client: " + startResult.getDistributionMessageResult();
logger.error(ModelLoaderMsgs.ASDC_CONNECTION_ERROR, errorMsg);
Timer timer = new Timer();
TimerTask task = new SdcConnectionJob(client, config, callback, timer);
timer.schedule(task, new Date(), 60000);
- } else {
- logger.info(ModelLoaderMsgs.INITIALIZING, "Connection to SDC established");
}
+ } else {
+ String errorMsg = "Failed to initialize distribution client: " + initResult.getDistributionMessageResult();
+ logger.error(ModelLoaderMsgs.ASDC_CONNECTION_ERROR, errorMsg);
+
+ // Kick off a timer to retry the SDC connection
+ Timer timer = new Timer();
+ TimerTask task = new SdcConnectionJob(client, config, callback, timer);
+ timer.schedule(task, new Date(), 60000);
}
+
Runtime.getRuntime().addShutdownHook(new Thread(this::preShutdownOperations));
}
@Override
public Response ingestModel(@PathVariable String modelName, @PathVariable String modelVersion,
@RequestBody String payload) throws IOException {
- boolean success;
+ Response response;
if (config.getIngestSimulatorEnabled()) {
- try {
- logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Received test artifact");
+ response = processTestArtifact(modelName, modelVersion, payload);
+ } else {
+ logger.debug("Simulation interface disabled");
+ response = Response.serverError().build();
+ }
- List<Artifact> catalogArtifacts = new ArrayList<>();
- List<Artifact> modelArtifacts = new ArrayList<>();
+ return response;
+ }
- IArtifactInfo artifactInfo = new ArtifactInfoImpl();
- ((ArtifactInfoImpl) artifactInfo).setArtifactName(modelName);
- ((ArtifactInfoImpl) artifactInfo).setArtifactVersion(modelVersion);
+ private Response processTestArtifact(String modelName, String modelVersion, String payload) {
+ IArtifactInfo artifactInfo = new ArtifactInfoImpl();
+ ((ArtifactInfoImpl) artifactInfo).setArtifactName(modelName);
+ ((ArtifactInfoImpl) artifactInfo).setArtifactVersion(modelVersion);
- byte[] csarFile = Base64.getDecoder().decode(payload);
+ Response response;
+ try {
+ logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Received test artifact " + modelName + " " + modelVersion);
- logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Generating xml models from test artifact");
+ byte[] csarFile = Base64.getDecoder().decode(payload);
- new ArtifactDownloadManager(client, config, new BabelServiceClientFactory()).processToscaArtifacts(
- modelArtifacts, catalogArtifacts, csarFile, artifactInfo, "test-transaction-id", modelVersion);
+ logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Generating XML models from test artifact");
- List<IArtifactInfo> artifacts = new ArrayList<>();
- artifacts.add(artifactInfo);
- INotificationData notificationData = new NotificationDataImpl();
- ((NotificationDataImpl) notificationData).setDistributionID("TestDistributionID");
+ List<Artifact> modelArtifacts = new ArrayList<>();
+ List<Artifact> catalogArtifacts = new ArrayList<>();
- logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Loading xml models from test artifact");
+ new ArtifactDownloadManager(client, config, babelClientFactory).processToscaArtifacts(modelArtifacts,
+ catalogArtifacts, csarFile, artifactInfo, "test-transaction-id", modelVersion);
- success = new ArtifactDeploymentManager(client, config).deploy(notificationData, artifacts,
- modelArtifacts, catalogArtifacts);
+ logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Loading xml models from test artifacts: "
+ + modelArtifacts.size() + " model(s) and " + catalogArtifacts.size() + " catalog(s)");
- } catch (Exception e) {
- return Response.serverError().entity(e).build();
+ NotificationDataImpl notificationData = new NotificationDataImpl();
+ notificationData.setDistributionID("TestDistributionID");
+ boolean success =
+ new ArtifactDeploymentManager(config).deploy(notificationData, modelArtifacts, catalogArtifacts);
+ logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Deployment success was " + success);
+ response = success ? Response.ok().build() : Response.serverError().build();
+ } catch (Exception e) {
+ String responseMessage = e.getMessage();
+ logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Exception handled: " + responseMessage);
+ if (config.getASDCConnectionDisabled()) {
+ // Make sure the NotificationPublisher logger is invoked as per the standard processing flow.
+ new NotificationPublisher().publishDeployFailure(client, new NotificationDataImpl(), artifactInfo);
+ } else {
+ responseMessage += "\nSDC publishing is enabled but has been bypassed";
}
- } else {
- logger.debug("Simulation interface disabled");
- success = false;
- }
-
- Response response;
- if (success) {
- response = Response.ok().build();
- } else {
- response = Response.serverError().build();
+ response = Response.serverError().entity(responseMessage).type(MediaType.APPLICATION_XML).build();
}
-
return response;
}
}