aboutsummaryrefslogtreecommitdiffstats
path: root/vid-app-common/src/main/java/org/onap/vid/job/command
diff options
context:
space:
mode:
Diffstat (limited to 'vid-app-common/src/main/java/org/onap/vid/job/command')
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/job/command/AggregateStateCommand.java26
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/job/command/HttpCallCommand.java52
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/job/command/InProgressStatusCommand.java110
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/job/command/JobCommandFactory.java43
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/job/command/NoOpCommand.java25
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/job/command/ServiceInstantiationCommand.java140
6 files changed, 396 insertions, 0 deletions
diff --git a/vid-app-common/src/main/java/org/onap/vid/job/command/AggregateStateCommand.java b/vid-app-common/src/main/java/org/onap/vid/job/command/AggregateStateCommand.java
new file mode 100644
index 000000000..65aadf3be
--- /dev/null
+++ b/vid-app-common/src/main/java/org/onap/vid/job/command/AggregateStateCommand.java
@@ -0,0 +1,26 @@
+package org.onap.vid.job.command;
+
+import org.onap.vid.job.JobCommand;
+import org.onap.vid.job.NextCommand;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.Map;
+
+@Component
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class AggregateStateCommand implements JobCommand {
+
+ @Override
+ public NextCommand call() {
+ return null;
+ }
+
+ @Override
+ public Map<String, Object> getData() {
+ return Collections.emptyMap();
+ }
+
+}
diff --git a/vid-app-common/src/main/java/org/onap/vid/job/command/HttpCallCommand.java b/vid-app-common/src/main/java/org/onap/vid/job/command/HttpCallCommand.java
new file mode 100644
index 000000000..5951d7c83
--- /dev/null
+++ b/vid-app-common/src/main/java/org/onap/vid/job/command/HttpCallCommand.java
@@ -0,0 +1,52 @@
+package org.onap.vid.job.command;
+
+import com.google.common.collect.ImmutableMap;
+import org.onap.vid.job.Job;
+import org.onap.vid.job.JobCommand;
+import org.onap.vid.job.NextCommand;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.Response;
+import java.util.Map;
+import java.util.UUID;
+
+
+@Component
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class HttpCallCommand implements JobCommand {
+ private String url;
+ private UUID uuid;
+
+ public HttpCallCommand() {
+ }
+
+ public HttpCallCommand(String url, UUID uuid) {
+ init(url, uuid);
+ }
+
+ @Override
+ public NextCommand call() {
+ final Response response = ClientBuilder.newClient().target(url).request().post(Entity.text(uuid.toString()));
+ return new NextCommand(Job.JobStatus.COMPLETED);
+ }
+
+ @Override
+ public HttpCallCommand init(UUID jobUuid, Map<String, Object> data) {
+ return init((String) data.get("url"), jobUuid);
+ }
+
+ private HttpCallCommand init(String url, UUID jobUuid) {
+ this.url = url;
+ this.uuid = jobUuid;
+ return this;
+ }
+
+ @Override
+ public Map<String, Object> getData() {
+ return ImmutableMap.of("url", url);
+ }
+}
diff --git a/vid-app-common/src/main/java/org/onap/vid/job/command/InProgressStatusCommand.java b/vid-app-common/src/main/java/org/onap/vid/job/command/InProgressStatusCommand.java
new file mode 100644
index 000000000..64c782c00
--- /dev/null
+++ b/vid-app-common/src/main/java/org/onap/vid/job/command/InProgressStatusCommand.java
@@ -0,0 +1,110 @@
+package org.onap.vid.job.command;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.ImmutableMap;
+import org.onap.vid.job.Job.JobStatus;
+import org.onap.vid.job.JobCommand;
+import org.onap.vid.job.NextCommand;
+import org.onap.vid.mso.RestMsoImplementation;
+import org.onap.vid.mso.RestObject;
+import org.onap.vid.mso.rest.AsyncRequestStatus;
+import org.onap.vid.services.AsyncInstantiationBusinessLogic;
+import org.onap.vid.services.AuditService;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+import javax.inject.Inject;
+import java.util.Map;
+import java.util.UUID;
+
+
+@Component
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class InProgressStatusCommand implements JobCommand {
+
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+ private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(InProgressStatusCommand.class);
+
+ @Inject
+ private AsyncInstantiationBusinessLogic asyncInstantiationBL;
+
+ @Inject
+ private RestMsoImplementation restMso;
+
+ @Inject
+ private AuditService auditService;
+
+ private String requestId;
+
+ private UUID jobUuid;
+
+ public InProgressStatusCommand() {
+ }
+
+ InProgressStatusCommand(UUID jobUuid, String requestId) {
+ init(jobUuid, requestId);
+ }
+
+ @Override
+ public NextCommand call() {
+
+ try {
+ String path = asyncInstantiationBL.getOrchestrationRequestsPath()+"/"+requestId;
+ RestObject<AsyncRequestStatus> msoResponse = restMso.GetForObject("", path, AsyncRequestStatus.class);
+ JobStatus jobStatus;
+ if (msoResponse.getStatusCode() >= 400 || msoResponse.get() == null) {
+ auditService.setFailedAuditStatusFromMso(jobUuid, requestId, msoResponse.getStatusCode(), msoResponse.getRaw());
+ LOGGER.error(EELFLoggerDelegate.errorLogger,
+ "Failed to get orchestration status for {}. Status code: {}, Body: {}",
+ requestId, msoResponse.getStatusCode(), msoResponse.getRaw());
+ return new NextCommand(JobStatus.IN_PROGRESS, this);
+ }
+ else {
+ jobStatus = asyncInstantiationBL.calcStatus(msoResponse.get());
+ }
+
+ asyncInstantiationBL.auditMsoStatus(jobUuid,msoResponse.get().request);
+
+
+ if (jobStatus == JobStatus.FAILED) {
+ asyncInstantiationBL.handleFailedInstantiation(jobUuid);
+ }
+ else {
+ asyncInstantiationBL.updateServiceInfoAndAuditStatus(jobUuid, jobStatus);
+ }
+ //in case of JobStatus.PAUSE we leave the job itself as IN_PROGRESS, for keep tracking job progress
+ if (jobStatus == JobStatus.PAUSE) {
+ return new NextCommand(JobStatus.IN_PROGRESS, this);
+ }
+ return new NextCommand(jobStatus, this);
+ } catch (javax.ws.rs.ProcessingException e) {
+ // Retry when we can't connect MSO during getStatus
+ LOGGER.error(EELFLoggerDelegate.errorLogger, "Cannot get orchestration status for {}, will retry: {}", requestId, e, e);
+ return new NextCommand(JobStatus.IN_PROGRESS, this);
+ } catch (RuntimeException e) {
+ LOGGER.error(EELFLoggerDelegate.errorLogger, "Cannot get orchestration status for {}, stopping: {}", requestId, e, e);
+ return new NextCommand(JobStatus.STOPPED, this);
+ }
+ }
+
+ @Override
+ public InProgressStatusCommand init(UUID jobUuid, Map<String, Object> data) {
+ return init(jobUuid, (String) data.get("requestId"));
+ }
+
+ private InProgressStatusCommand init(UUID jobUuid, String requestId) {
+ this.requestId = requestId;
+ this.jobUuid = jobUuid;
+ return this;
+ }
+
+ @Override
+ public Map<String, Object> getData() {
+ return ImmutableMap.of("requestId", requestId);
+ }
+
+
+}
diff --git a/vid-app-common/src/main/java/org/onap/vid/job/command/JobCommandFactory.java b/vid-app-common/src/main/java/org/onap/vid/job/command/JobCommandFactory.java
new file mode 100644
index 000000000..1e613c58b
--- /dev/null
+++ b/vid-app-common/src/main/java/org/onap/vid/job/command/JobCommandFactory.java
@@ -0,0 +1,43 @@
+package org.onap.vid.job.command;
+
+import org.onap.vid.exceptions.GenericUncheckedException;
+import org.onap.vid.job.Job;
+import org.onap.vid.job.JobCommand;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+
+import javax.inject.Inject;
+import java.util.function.Function;
+
+@Component
+public class JobCommandFactory {
+
+ final Function<Class<? extends JobCommand>, JobCommand> jobFactory;
+
+ @Inject
+ public JobCommandFactory(ApplicationContext applicationContext) {
+ this.jobFactory = (jobType -> {
+ final Object commandBean = applicationContext.getBean(jobType);
+
+ if (!(commandBean instanceof JobCommand)) {
+ throw new GenericUncheckedException(commandBean.getClass() + " is not a JobCommand");
+ }
+
+ return (JobCommand) commandBean;
+ });
+ }
+
+ public JobCommandFactory(Function<Class<? extends JobCommand>, JobCommand> jobFactory) {
+ this.jobFactory = jobFactory;
+ }
+
+ public JobCommand toCommand(Job job) {
+
+ final JobCommand command = jobFactory.apply(job.getType().getCommandClass());
+ command.init(job.getUuid(), job.getData());
+
+ return command;
+ }
+
+
+}
diff --git a/vid-app-common/src/main/java/org/onap/vid/job/command/NoOpCommand.java b/vid-app-common/src/main/java/org/onap/vid/job/command/NoOpCommand.java
new file mode 100644
index 000000000..37636fcaa
--- /dev/null
+++ b/vid-app-common/src/main/java/org/onap/vid/job/command/NoOpCommand.java
@@ -0,0 +1,25 @@
+package org.onap.vid.job.command;
+
+import org.onap.vid.job.JobCommand;
+import org.onap.vid.job.NextCommand;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.Map;
+
+@Component
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class NoOpCommand implements JobCommand {
+
+ @Override
+ public NextCommand call() {
+ return null;
+ }
+
+ @Override
+ public Map<String, Object> getData() {
+ return Collections.emptyMap();
+ }
+}
diff --git a/vid-app-common/src/main/java/org/onap/vid/job/command/ServiceInstantiationCommand.java b/vid-app-common/src/main/java/org/onap/vid/job/command/ServiceInstantiationCommand.java
new file mode 100644
index 000000000..6afacf23e
--- /dev/null
+++ b/vid-app-common/src/main/java/org/onap/vid/job/command/ServiceInstantiationCommand.java
@@ -0,0 +1,140 @@
+package org.onap.vid.job.command;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.ImmutableMap;
+import org.onap.vid.aai.exceptions.InvalidAAIResponseException;
+import org.onap.vid.changeManagement.RequestDetailsWrapper;
+import org.onap.vid.exceptions.MaxRetriesException;
+import org.onap.vid.job.Job;
+import org.onap.vid.job.JobCommand;
+import org.onap.vid.job.NextCommand;
+import org.onap.vid.model.RequestReferencesContainer;
+import org.onap.vid.model.serviceInstantiation.ServiceInstantiation;
+import org.onap.vid.mso.RestMsoImplementation;
+import org.onap.vid.mso.RestObject;
+import org.onap.vid.mso.model.ServiceInstantiationRequestDetails;
+import org.onap.vid.services.AsyncInstantiationBusinessLogic;
+import org.onap.vid.services.AuditService;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+import javax.inject.Inject;
+import java.util.Map;
+import java.util.UUID;
+
+
+@Component
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class ServiceInstantiationCommand implements JobCommand {
+
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+ private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(ServiceInstantiationCommand.class);
+
+ @Inject
+ private AsyncInstantiationBusinessLogic asyncInstantiationBL;
+
+ @Inject
+ private AuditService auditService;
+
+ @Inject
+ private RestMsoImplementation restMso;
+
+ private UUID uuid;
+ private ServiceInstantiation serviceInstantiationRequest;
+ private String userId;
+
+ public ServiceInstantiationCommand() {
+ }
+
+ public ServiceInstantiationCommand(UUID uuid, ServiceInstantiation serviceInstantiationRequest, String userId) {
+ init(uuid, serviceInstantiationRequest, userId);
+ }
+
+ @Override
+ public NextCommand call() {
+ RequestDetailsWrapper<ServiceInstantiationRequestDetails> requestDetailsWrapper ;
+ try {
+ requestDetailsWrapper = asyncInstantiationBL.generateServiceInstantiationRequest(
+ uuid, serviceInstantiationRequest, userId
+ );
+ }
+
+ //Aai return bad response while checking names uniqueness
+ catch (InvalidAAIResponseException exception) {
+ LOGGER.error("Failed to check name uniqueness in AAI. VID will try again later", exception);
+ //put the job in_progress so we will keep trying to check name uniqueness in AAI
+ //And then send the request to MSO
+ return new NextCommand(Job.JobStatus.IN_PROGRESS, this);
+ }
+
+ //Vid reached to max retries while trying to find unique name in AAI
+ catch (MaxRetriesException exception) {
+ LOGGER.error("Failed to find unused name in AAI. Set the job to FAILED ", exception);
+ return handleCommandFailed();
+ }
+
+ String path = asyncInstantiationBL.getServiceInstantiationPath(serviceInstantiationRequest);
+
+ RestObject<RequestReferencesContainer> msoResponse = restMso.PostForObject(requestDetailsWrapper, "",
+ path, RequestReferencesContainer.class);
+
+ if (msoResponse.getStatusCode() >= 200 && msoResponse.getStatusCode() < 400) {
+ final Job.JobStatus jobStatus = Job.JobStatus.IN_PROGRESS;
+ final String requestId = msoResponse.get().getRequestReferences().getRequestId();
+ final String instanceId = msoResponse.get().getRequestReferences().getInstanceId();
+ asyncInstantiationBL.auditVidStatus(uuid, jobStatus);
+ setInitialRequestAuditStatusFromMso(requestId);
+ asyncInstantiationBL.updateServiceInfo(uuid, x-> {
+ x.setJobStatus(jobStatus);
+ x.setServiceInstanceId(instanceId);
+ });
+
+ return new NextCommand(jobStatus, new InProgressStatusCommand(uuid, requestId));
+ } else {
+ auditService.setFailedAuditStatusFromMso(uuid,null, msoResponse.getStatusCode(),msoResponse.getRaw());
+ return handleCommandFailed();
+ }
+
+ }
+
+ private void setInitialRequestAuditStatusFromMso(String requestId){
+ final String initialMsoRequestStatus = "REQUESTED";
+ asyncInstantiationBL.auditMsoStatus(uuid,initialMsoRequestStatus,requestId,null);
+ }
+
+ protected NextCommand handleCommandFailed() {
+ asyncInstantiationBL.handleFailedInstantiation(uuid);
+ return new NextCommand(Job.JobStatus.FAILED);
+ }
+
+ @Override
+ public ServiceInstantiationCommand init(UUID jobUuid, Map<String, Object> data) {
+ final Object request = data.get("request");
+
+ return init(
+ jobUuid,
+ OBJECT_MAPPER.convertValue(request, ServiceInstantiation.class),
+ (String) data.get("userId")
+ );
+ }
+
+ private ServiceInstantiationCommand init(UUID jobUuid, ServiceInstantiation serviceInstantiationRequest, String userId) {
+ this.uuid = jobUuid;
+ this.serviceInstantiationRequest = serviceInstantiationRequest;
+ this.userId = userId;
+
+ return this;
+ }
+
+ @Override
+ public Map<String, Object> getData() {
+ return ImmutableMap.of(
+ "uuid", uuid,
+ "request", serviceInstantiationRequest,
+ "userId", userId
+ );
+ }
+}