package com.sequenceiq.it.spark.spi;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import com.sequenceiq.cloudbreak.cloud.model.CloudInstance;
import com.sequenceiq.cloudbreak.cloud.model.CloudVmInstanceStatus;
import com.sequenceiq.cloudbreak.cloud.model.CloudVmMetaDataStatus;
import com.sequenceiq.cloudbreak.cloud.model.InstanceTemplate;
import com.sequenceiq.it.spark.ITResponse;
public class CloudMetaDataStatuses extends ITResponse {
private Map<String, CloudVmMetaDataStatus> instanceMap;
public CloudMetaDataStatuses(Map<String, CloudVmMetaDataStatus> instanceMap) {
this.instanceMap = instanceMap;
}
private List<CloudVmMetaDataStatus> createCloudVmMetaDataStatuses(List<CloudInstance> cloudInstances) {
List<CloudVmMetaDataStatus> cloudVmMetaDataStatuses = new ArrayList<>();
for (String instanceId : instanceMap.keySet()) {
CloudVmMetaDataStatus oldCloudVmMetaDataStatus = instanceMap.get(instanceId);
InstanceTemplate oldTemplate = oldCloudVmMetaDataStatus.getCloudVmInstanceStatus().getCloudInstance().getTemplate();
Optional<CloudInstance> cloudInstance = cloudInstances.stream()
.filter(instance -> Objects.equals(instance.getTemplate().getPrivateId(), oldTemplate.getPrivateId())).findFirst();
if (cloudInstance.isPresent()) {
CloudInstance newCloudInstance = new CloudInstance(instanceId, cloudInstance.get().getTemplate(), cloudInstance.get().getParameters());
CloudVmInstanceStatus cloudVmInstanceStatus = new CloudVmInstanceStatus(newCloudInstance,
oldCloudVmMetaDataStatus.getCloudVmInstanceStatus().getStatus());
CloudVmMetaDataStatus newCloudVmMetaDataStatus = new CloudVmMetaDataStatus(cloudVmInstanceStatus, oldCloudVmMetaDataStatus.getMetaData());
cloudVmMetaDataStatuses.add(newCloudVmMetaDataStatus);
}
}
return cloudVmMetaDataStatuses;
}
@Override
public Object handle(spark.Request request, spark.Response response) throws Exception {
List<CloudInstance> cloudInstances = new Gson().fromJson(request.body(), new TypeToken<List<CloudInstance>>() {
}.getType());
return createCloudVmMetaDataStatuses(cloudInstances);
}
}