package com.sequenceiq.cloudbreak.cloud.template.compute; import static com.sequenceiq.cloudbreak.cloud.scheduler.PollGroup.CANCELLED; 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.CloudInstance; import com.sequenceiq.cloudbreak.cloud.model.CloudResource; import com.sequenceiq.cloudbreak.cloud.model.CloudVmInstanceStatus; import com.sequenceiq.cloudbreak.cloud.model.InstanceStatus; import com.sequenceiq.cloudbreak.cloud.scheduler.PollGroup; import com.sequenceiq.cloudbreak.cloud.scheduler.SyncPollingScheduler; import com.sequenceiq.cloudbreak.cloud.store.InMemoryStateStore; 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; @Component(ResourceStopStartThread.NAME) @Scope(value = "prototype") public class ResourceStopStartThread implements Callable<ResourceRequestResult<List<CloudVmInstanceStatus>>> { public static final String NAME = "resourceStopStartThread"; private static final Logger LOGGER = LoggerFactory.getLogger(ResourceStopStartThread.class); @Inject private SyncPollingScheduler<List<CloudVmInstanceStatus>> syncPollingScheduler; @Inject private ResourcePollTaskFactory resourcePollTaskFactory; private final ResourceBuilderContext context; private final AuthenticatedContext auth; private final CloudResource resource; private final CloudInstance instance; private final ComputeResourceBuilder builder; public ResourceStopStartThread(ResourceBuilderContext context, AuthenticatedContext auth, CloudResource resource, CloudInstance instance, ComputeResourceBuilder builder) { this.context = context; this.auth = auth; this.resource = resource; this.instance = instance; this.builder = builder; } @Override public ResourceRequestResult<List<CloudVmInstanceStatus>> call() throws Exception { LOGGER.info("{} compute resource {}", context.isBuild() ? "Starting" : "Stopping", resource); PollGroup pollGroup = InMemoryStateStore.getStack(auth.getCloudContext().getId()); if (pollGroup != null && CANCELLED.equals(pollGroup)) { List<CloudVmInstanceStatus> result = createResult(InstanceStatus.UNKNOWN); return new ResourceRequestResult<>(FutureResult.SUCCESS, result); } CloudVmInstanceStatus status = context.isBuild() ? builder.start(context, auth, instance) : builder.stop(context, auth, instance); if (status != null) { PollTask<List<CloudVmInstanceStatus>> task = resourcePollTaskFactory.newPollComputeStatusTask(builder, auth, context, status.getCloudInstance()); List<CloudVmInstanceStatus> pollResult = syncPollingScheduler.schedule(task); return new ResourceRequestResult<>(FutureResult.SUCCESS, pollResult); } return new ResourceRequestResult<>(FutureResult.SUCCESS, createResult(InstanceStatus.UNKNOWN)); } private List<CloudVmInstanceStatus> createResult(InstanceStatus status) { return Collections.singletonList(new CloudVmInstanceStatus(instance, status)); } }