package alien4cloud.deployment;
import javax.inject.Inject;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import alien4cloud.model.deployment.Deployment;
import alien4cloud.model.deployment.DeploymentTopology;
import alien4cloud.orchestrators.plugin.IOrchestratorPlugin;
import alien4cloud.paas.IPaaSCallback;
import alien4cloud.paas.OrchestratorPluginService;
import alien4cloud.paas.model.PaaSDeploymentContext;
import lombok.extern.slf4j.Slf4j;
/**
* Manages topology un-deployment.
*/
@Service
@Slf4j
public class UndeployService {
@Inject
private OrchestratorPluginService orchestratorPluginService;
@Inject
private DeploymentService deploymentService;
@Inject
private DeploymentRuntimeStateService deploymentRuntimeStateService;
/**
* Un-deploy a deployment object
*
* @param deploymentId deployment id to deploy
*/
public synchronized void undeploy(String deploymentId) {
Deployment deployment = deploymentService.getOrfail(deploymentId);
undeploy(deployment);
}
public synchronized void undeployEnvironment(String environmentId) {
Deployment deployment = deploymentService.getActiveDeployment(environmentId);
if (deployment != null) {
undeploy(deployment);
} else {
log.warn("No deployment found for environment " + environmentId);
}
}
/**
* Un-deploy from a deployment setup.
*
* @param deploymentTopology setup object containing information to deploy
*/
public synchronized void undeploy(DeploymentTopology deploymentTopology) {
Deployment activeDeployment = deploymentService.getActiveDeploymentOrFail(deploymentTopology.getEnvironmentId());
undeploy(activeDeployment);
}
private void undeploy(final Deployment deployment) {
log.info("Un-deploying deployment [{}] on cloud [{}]", deployment.getId(), deployment.getOrchestratorId());
IOrchestratorPlugin orchestratorPlugin = orchestratorPluginService.getOrFail(deployment.getOrchestratorId());
DeploymentTopology deployedTopology = deploymentRuntimeStateService.getRuntimeTopology(deployment.getId());
PaaSDeploymentContext deploymentContext = new PaaSDeploymentContext(deployment, deployedTopology);
orchestratorPlugin.undeploy(deploymentContext, new IPaaSCallback<ResponseEntity>() {
@Override
public void onSuccess(ResponseEntity data) {
deploymentService.markUndeployed(deployment);
log.info("Un-deployed deployment [{}] on cloud [{}]", deployment.getId(), deployment.getOrchestratorId());
}
@Override
public void onFailure(Throwable throwable) {
log.warn("Fail while Undeploying deployment [{}] on cloud [{}]", deployment.getId(), deployment.getOrchestratorId());
}
});
}
}