package com.sequenceiq.cloudbreak.cloud.template.compute;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Callable;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext;
import com.sequenceiq.cloudbreak.cloud.model.CloudResource;
import com.sequenceiq.cloudbreak.cloud.model.CloudResourceStatus;
import com.sequenceiq.cloudbreak.cloud.model.ResourceStatus;
import com.sequenceiq.cloudbreak.cloud.notification.PersistenceNotifier;
import com.sequenceiq.cloudbreak.cloud.scheduler.SyncPollingScheduler;
import com.sequenceiq.cloudbreak.cloud.task.PollTask;
import com.sequenceiq.cloudbreak.cloud.template.ComputeResourceBuilder;
import com.sequenceiq.cloudbreak.cloud.template.context.ResourceBuilderContext;
import com.sequenceiq.cloudbreak.cloud.template.task.ResourcePollTaskFactory;
import com.sequenceiq.cloudbreak.common.type.CommonStatus;
@Component(ResourceDeleteThread.NAME)
@Scope(value = "prototype")
public class ResourceDeleteThread implements Callable<ResourceRequestResult<List<CloudResourceStatus>>> {
public static final String NAME = "resourceDeleteThread";
private static final Logger LOGGER = LoggerFactory.getLogger(ResourceDeleteThread.class);
@Inject
private SyncPollingScheduler<List<CloudResourceStatus>> syncPollingScheduler;
@Inject
private ResourcePollTaskFactory resourcePollTaskFactory;
@Inject
private PersistenceNotifier resourceNotifier;
private final ResourceBuilderContext context;
private final AuthenticatedContext auth;
private final CloudResource resource;
private final ComputeResourceBuilder builder;
private final boolean cancellable;
public ResourceDeleteThread(ResourceBuilderContext context, AuthenticatedContext auth,
CloudResource resource, ComputeResourceBuilder builder, boolean cancellable) {
this.context = context;
this.auth = auth;
this.resource = resource;
this.builder = builder;
this.cancellable = cancellable;
}
@Override
public ResourceRequestResult<List<CloudResourceStatus>> call() throws Exception {
LOGGER.info("Deleting compute resource {}", resource);
if (resource.getStatus() == CommonStatus.CREATED) {
CloudResource deletedResource = builder.delete(context, auth, resource);
if (deletedResource != null) {
PollTask<List<CloudResourceStatus>> task = resourcePollTaskFactory
.newPollResourceTask(builder, auth, Collections.singletonList(deletedResource), context, cancellable);
List<CloudResourceStatus> pollerResult = syncPollingScheduler.schedule(task);
deleteResource();
return new ResourceRequestResult<>(FutureResult.SUCCESS, pollerResult);
}
}
deleteResource();
CloudResourceStatus status = new CloudResourceStatus(resource, ResourceStatus.DELETED);
return new ResourceRequestResult<>(FutureResult.SUCCESS, Collections.singletonList(status));
}
private void deleteResource() {
resourceNotifier.notifyDeletion(resource, auth.getCloudContext());
}
}