diff options
author | Sonsino, Ofir (os0695) <os0695@intl.att.com> | 2018-07-10 14:20:54 +0300 |
---|---|---|
committer | Sonsino, Ofir (os0695) <os0695@intl.att.com> | 2018-07-10 14:20:54 +0300 |
commit | c72d565bb58226b20625b2bce5f0019046bee649 (patch) | |
tree | 8658e49595705b02e47ddc14afa20d6bb7123547 /vid-app-common/src/main/java/org/onap/vid/job/command | |
parent | ef8a6b47847012fd59ea20da21d8d3d7c4a301ed (diff) |
Merge 1806 code of vid-common
Change-Id: I75d52abed4a24dfe3827d79edc4a2938726aa87a
Issue-ID: VID-208
Signed-off-by: Sonsino, Ofir (os0695) <os0695@intl.att.com>
Diffstat (limited to 'vid-app-common/src/main/java/org/onap/vid/job/command')
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 00000000..65aadf3b --- /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 00000000..5951d7c8 --- /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 00000000..64c782c0 --- /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 00000000..1e613c58 --- /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 00000000..37636fca --- /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 00000000..6afacf23 --- /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 + ); + } +} |