package com.sequenceiq.cloudbreak.cloud.mock;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;
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;
@Service
public class MockInstanceConnector implements InstanceConnector {
private static final Logger LOGGER = LoggerFactory.getLogger(MockInstanceConnector.class);
private static final String CB_FINGERPRINT = "ce:50:66:23:96:08:04:ea:01:62:9b:18:f9:ee:ac:aa (RSA)";
@Value("${mock.spi.endpoint:https://localhost:9443}")
private String mockServerAddress;
@Override
public List<CloudVmInstanceStatus> start(AuthenticatedContext authenticatedContext, List<CloudResource> resources, List<CloudInstance> vms)
throws Exception {
List<CloudVmInstanceStatus> cloudVmInstanceStatuses = new ArrayList<>();
for (CloudInstance instance : vms) {
CloudVmInstanceStatus instanceStatus = new CloudVmInstanceStatus(instance, InstanceStatus.CREATED);
cloudVmInstanceStatuses.add(instanceStatus);
}
return cloudVmInstanceStatuses;
}
@Override
public List<CloudVmInstanceStatus> stop(AuthenticatedContext authenticatedContext, List<CloudResource> resources, List<CloudInstance> vms)
throws Exception {
List<CloudVmInstanceStatus> cloudVmInstanceStatuses = new ArrayList<>();
for (CloudInstance instance : vms) {
CloudVmInstanceStatus instanceStatus = new CloudVmInstanceStatus(instance, InstanceStatus.STOPPED);
cloudVmInstanceStatuses.add(instanceStatus);
}
return cloudVmInstanceStatuses;
}
@Override
public List<CloudVmInstanceStatus> check(AuthenticatedContext authenticatedContext, List<CloudInstance> vms) {
try {
LOGGER.info("collect instance statuses from mock spi, server address: " + mockServerAddress);
CloudVmInstanceStatus[] cloudVmInstanceStatusArray = Unirest.post(mockServerAddress + "/spi/cloud_instance_statuses")
.asObject(CloudVmInstanceStatus[].class).getBody();
LOGGER.info("collected instance statuses: " + Arrays.toString(cloudVmInstanceStatusArray));
List<CloudVmInstanceStatus> cloudVmInstanceStatuses = new ArrayList<>();
for (CloudInstance instance : vms) {
Optional<CloudVmInstanceStatus> vmInstanceStatusFromApi = Arrays.stream(cloudVmInstanceStatusArray)
.filter(instanceStatus -> instanceStatus.getCloudInstance().getTemplate().getPrivateId().equals(instance.getTemplate().getPrivateId()))
.findFirst();
InstanceStatus instanceStatus = InstanceStatus.TERMINATED;
if (vmInstanceStatusFromApi.isPresent()) {
instanceStatus = vmInstanceStatusFromApi.get().getStatus();
}
CloudVmInstanceStatus cloudVmInstanceStatus = new CloudVmInstanceStatus(instance, instanceStatus);
cloudVmInstanceStatuses.add(cloudVmInstanceStatus);
}
return cloudVmInstanceStatuses;
} catch (UnirestException e) {
throw new RuntimeException("can't convert to object", e);
}
}
@Override
public String getConsoleOutput(AuthenticatedContext authenticatedContext, CloudInstance vm) {
return CB_FINGERPRINT;
}
}