package com.sequenceiq.cloudbreak.cloud.openstack.heat;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import javax.inject.Inject;
import org.openstack4j.api.OSClient;
import org.openstack4j.model.compute.Action;
import org.openstack4j.model.compute.ActionResponse;
import org.openstack4j.model.compute.Server;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.sequenceiq.cloudbreak.cloud.InstanceConnector;
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.openstack.auth.OpenStackClient;
import com.sequenceiq.cloudbreak.cloud.openstack.status.NovaInstanceStatus;
@Service
public class OpenStackInstanceConnector implements InstanceConnector {
private static final Logger LOGGER = LoggerFactory.getLogger(OpenStackInstanceConnector.class);
private static final int CONSOLE_OUTPUT_LINES = Integer.MAX_VALUE;
@Inject
private OpenStackClient openStackClient;
@Override
public String getConsoleOutput(AuthenticatedContext authenticatedContext, CloudInstance vm) {
OSClient osClient = openStackClient.createOSClient(authenticatedContext);
return osClient.compute().servers().getConsoleOutput(vm.getInstanceId(), CONSOLE_OUTPUT_LINES);
}
@Override
public List<CloudVmInstanceStatus> start(AuthenticatedContext ac, List<CloudResource> resources, List<CloudInstance> vms) {
return executeAction(ac, vms, Action.START);
}
@Override
public List<CloudVmInstanceStatus> stop(AuthenticatedContext ac, List<CloudResource> resources, List<CloudInstance> vms) {
return executeAction(ac, vms, Action.STOP);
}
@Override
public List<CloudVmInstanceStatus> check(AuthenticatedContext ac, List<CloudInstance> vms) {
List<CloudVmInstanceStatus> statuses = new ArrayList<>();
OSClient osClient = openStackClient.createOSClient(ac);
for (CloudInstance vm : vms) {
Optional<Server> server = Optional.ofNullable(vm.getInstanceId())
.map(iid -> osClient.compute().servers().get(iid));
if (server.isPresent()) {
statuses.add(new CloudVmInstanceStatus(vm, NovaInstanceStatus.get(server.get())));
} else {
statuses.add(new CloudVmInstanceStatus(vm, InstanceStatus.TERMINATED));
}
}
return statuses;
}
private List<CloudVmInstanceStatus> executeAction(AuthenticatedContext ac, List<CloudInstance> cloudInstances, Action action) {
List<CloudVmInstanceStatus> statuses = new ArrayList<>();
OSClient osClient = openStackClient.createOSClient(ac);
for (CloudInstance cloudInstance : cloudInstances) {
ActionResponse actionResponse = osClient.compute().servers().action(cloudInstance.getInstanceId(), action);
if (actionResponse.isSuccess()) {
statuses.add(new CloudVmInstanceStatus(cloudInstance, InstanceStatus.IN_PROGRESS));
} else {
statuses.add(new CloudVmInstanceStatus(cloudInstance, InstanceStatus.FAILED, actionResponse.getFault()));
}
}
return statuses;
}
}