blob: dc42136a441b7e9635270ad34d84544907c4380a [file] [log] [blame]
/*-
* ============LICENSE_START=======================================================
* OSAM
* ================================================================================
* Copyright (C) 2018 AT&T
* ================================================================================
* 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=========================================================
*/
package org.onap.osam.job.command;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.ImmutableMap;
import io.joshworks.restclient.http.HttpResponse;
import org.onap.osam.job.Job.JobStatus;
import org.onap.osam.job.JobCommand;
import org.onap.osam.job.NextCommand;
import org.onap.osam.mso.MsoInterface;
import org.onap.osam.mso.rest.AsyncRequestStatus;
import org.onap.osam.services.IAsyncInstantiationBusinessLogic;
import org.onap.osam.services.IAuditService;
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 IAsyncInstantiationBusinessLogic asyncInstantiationBL;
@Inject
private MsoInterface restMso;
@Inject
private IAuditService 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;
HttpResponse<AsyncRequestStatus> msoResponse = restMso.get(path, AsyncRequestStatus.class);
JobStatus jobStatus;
if (msoResponse.getStatus() >= 400 || msoResponse.getBody() == null) {
auditService.setFailedAuditStatusFromMso(jobUuid, requestId, msoResponse.getStatus(), msoResponse.getBody().toString());
LOGGER.error(EELFLoggerDelegate.errorLogger,
"Failed to get orchestration status for {}. Status code: {}, Body: {}",
requestId, msoResponse.getStatus(), msoResponse.getRawBody().toString());
return new NextCommand(JobStatus.IN_PROGRESS, this);
}
else {
jobStatus = asyncInstantiationBL.calcStatus(msoResponse.getBody());
}
asyncInstantiationBL.auditMsoStatus(jobUuid,msoResponse.getBody().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);
}
}