package io.fathom.cloud.compute.api.aws.ec2.actions;
import io.fathom.cloud.CloudException;
import io.fathom.cloud.compute.api.aws.ec2.model.DescribeInstancesResponse;
import io.fathom.cloud.compute.api.aws.ec2.model.Instance;
import io.fathom.cloud.compute.api.aws.ec2.model.DescribeInstancesResponse.ReservationSetItem;
import io.fathom.cloud.protobuf.CloudModel.InstanceData;
import io.fathom.cloud.protobuf.CloudModel.ReservationData;
import io.fathom.cloud.protobuf.CloudModel.SecurityGroupData;
import io.fathom.cloud.server.model.Project;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@AwsAction("DescribeInstances")
public class DescribeInstances extends AwsActionHandler {
@Override
public Object go() throws CloudException {
// User user = getUser();
Project project = getProject();
// Get instances first; so we shouldn't have any instances that refer to
// not-yet-create reservations
List<InstanceData> instances = instanceStateStore.getInstances(getProject().getId()).list();
List<ReservationData> reservationInfoList = instanceStateStore.getReservations(project).list();
DescribeInstancesResponse response = new DescribeInstancesResponse();
response.requestId = getRequestId();
response.reservations = Lists.newArrayList();
Map<Long, ReservationData> reservationInfoMap = Maps.newHashMap();
for (ReservationData reservationInfo : reservationInfoList) {
reservationInfoMap.put(reservationInfo.getId(), reservationInfo);
}
Map<Long, ReservationSetItem> xmlReservations = Maps.newHashMap();
for (InstanceData instanceInfo : instances) {
long reservationId = instanceInfo.getReservationId();
ReservationData reservationInfo = reservationInfoMap.get(reservationId);
if (reservationInfo == null) {
throw new IllegalStateException();
}
ReservationSetItem reservation = xmlReservations.get(reservationId);
if (reservation == null) {
reservation = new ReservationSetItem();
xmlReservations.put(reservationId, reservation);
response.reservations.add(reservation);
reservation.reservationId = toEc2ReservationId(reservationInfo.getId());
reservation.ownerId = toEc2Owner(reservationInfo.getProjectId());
List<SecurityGroupData> groups = getSecurityGroups();
reservation.groups = buildGroupsXml(groups);
reservation.instances = Lists.newArrayList();
}
Instance instance = buildRunningInstanceXml(reservationInfo, instanceInfo);
reservation.instances.add(instance);
instance.groups = reservation.groups;
}
// <instanceState>[\n]"
// <code>16</code>[\n]"
// <name>running</name>[\n]"
// </instanceState>[\n]"
//
//
// <privateDnsName>ip-10-248-113-58.us-west-2.compute.internal</privateDnsName>[\n]"
// <dnsName>ec2-54-218-220-237.us-west-2.compute.amazonaws.com</dnsName>[\n]"
//
// <reason/>[\n]"
// <amiLaunchIndex>0</amiLaunchIndex>[\n]"
// <productCodes/>[\n]"
// <instanceType>m1.small</instanceType>[\n]"
// <launchTime>2013-06-25T22:18:51.000Z</launchTime>[\n]"
// <placement>[\n]"
// <availabilityZone>us-west-2a</availabilityZone>[\n]"
// <groupName/>[\n]"
// <tenancy>default</tenancy>[\n]"
// </placement>[\n]"
// <kernelId>aki-fc37bacc</kernelId>[\n]"
// <monitoring>[\n]"
// <state>disabled</state>[\n]"
// </monitoring>[\n]"
// <privateIpAddress>10.248.113.58</privateIpAddress>[\n]"
// <ipAddress>54.218.220.237</ipAddress>[\n]"
// <architecture>x86_64</architecture>[\n]"
// <rootDeviceType>instance-store</rootDeviceType>[\n]"
// <blockDeviceMapping/>[\n]"
// <virtualizationType>paravirtual</virtualizationType>[\n]"
// <clientToken/>[\n]"
// <hypervisor>xen</hypervisor>[\n]"
// <networkInterfaceSet/>[\n]"
// <ebsOptimized>false</ebsOptimized>[\n]"
// </item>[\n]"
// </instancesSet>[\n]"
// </item>[\n]"
// </reservationSet>[\n]"
return response;
}
}