package com.sequenceiq.cloudbreak.cloud.task; import java.util.List; import java.util.Set; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import com.google.common.collect.Sets; import com.sequenceiq.cloudbreak.cloud.InstanceConnector; import com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext; import com.sequenceiq.cloudbreak.cloud.event.instance.InstancesStatusResult; import com.sequenceiq.cloudbreak.cloud.model.CloudInstance; import com.sequenceiq.cloudbreak.cloud.model.CloudVmInstanceStatus; import com.sequenceiq.cloudbreak.cloud.model.InstanceStatus; @Component(PollInstancesStateTask.NAME) @Scope(value = "prototype") public class PollInstancesStateTask extends AbstractPollTask<InstancesStatusResult> { public static final String NAME = "pollInstancesStateTask"; private List<CloudInstance> instances; private InstanceConnector instanceConnector; private Set<InstanceStatus> completedStatuses; public PollInstancesStateTask(AuthenticatedContext authenticatedContext, InstanceConnector instanceConnector, List<CloudInstance> instances) { this(authenticatedContext, instanceConnector, instances, Sets.newHashSet()); } public PollInstancesStateTask(AuthenticatedContext authenticatedContext, InstanceConnector instanceConnector, List<CloudInstance> instances, Set<InstanceStatus> completedStatuses) { super(authenticatedContext); this.instances = instances; this.instanceConnector = instanceConnector; this.completedStatuses = completedStatuses; } @Override public InstancesStatusResult call() throws Exception { List<CloudVmInstanceStatus> instanceStatuses = instanceConnector.check(getAuthenticatedContext(), instances); return new InstancesStatusResult(getAuthenticatedContext().getCloudContext(), instanceStatuses); } @Override public boolean completed(InstancesStatusResult instancesStatusResult) { for (CloudVmInstanceStatus result : instancesStatusResult.getResults()) { if (result.getStatus().isTransient() || (!completedStatuses.isEmpty() && !completedStatuses.contains(result.getStatus()))) { return false; } } return true; } }