package io.fathom.cloud.compute.api.aws.ec2.actions;
import io.fathom.cloud.CloudException;
import io.fathom.cloud.compute.actions.StartInstancesAction;
import io.fathom.cloud.compute.api.aws.ec2.model.Instance;
import io.fathom.cloud.compute.api.aws.ec2.model.RunInstancesResponse;
import io.fathom.cloud.compute.scheduler.InstanceScheduler;
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 io.fathom.cloud.services.ImageService;
import java.util.List;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Lists;
@AwsAction("RunInstances")
public class RunInstancesHandler extends AwsActionHandler {
private static final Logger log = LoggerFactory.getLogger(RunInstancesHandler.class);
@Inject
InstanceScheduler scheduler;
@Inject
ImageService imageService;
@Override
public Object go() throws CloudException {
// User user = getUser();
Project project = getProject();
// ImageId=ami-5168f861
// MinCount=1
// MaxCount=1
// DisableApiTermination=false
// Monitoring.Enabled=false
// EbsOptimized=false
StartInstancesAction action = new StartInstancesAction();
long imageId = decodeEc2Id(get("ImageId"));
{
ReservationData.Builder reservation = ReservationData.newBuilder();
ImageService.Image image = imageService.findImage(project, imageId);
if (image == null) {
throw new IllegalArgumentException();
}
reservation.setImageId(image.getId());
action.reservationTemplate = reservation.build();
}
List<SecurityGroupData> securityGroups = getSecurityGroups();
{
InstanceData.Builder instance = InstanceData.newBuilder();
for (SecurityGroupData securityGroup : securityGroups) {
instance.addSecurityGroupId(securityGroup.getId());
}
action.instanceTemplate = instance.build();
}
action.maxCount = get("MaxCount", 1);
action.minCount = get("MinCount", 1);
// action.user = getUser();
action.project = project;
StartInstancesAction.Result result = action.go();
RunInstancesResponse response = new RunInstancesResponse();
response.requestId = getRequestId();
response.reservationId = toEc2ReservationId(result.reservation.getId());
response.ownerId = toEc2Owner(project.getId());
response.groups = buildGroupsXml(securityGroups);
response.instances = Lists.newArrayList();
for (InstanceData instanceInfo : result.instances) {
Instance instance = buildRunningInstanceXml(result.reservation, instanceInfo);
response.instances.add(instance);
instance.groups = response.groups;
}
// <instanceId>i-e6655ad3</instanceId>[\n]"
// <imageId>ami-5168f861</imageId>[\n]"
// <instanceState>[\n]"
// <code>0</code>[\n]"
// <name>pending</name>[\n]"
// </instanceState>[\n]"
// <privateDnsName/>[\n]"
// <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]"
// <groupSet>[\n]"
// <item>[\n]"
// <groupId>sg-44412974</groupId>[\n]"
// <groupName>default</groupName>[\n]"
// </item>[\n]"
// </groupSet>[\n]"
// <stateReason>[\n]"
// <code>pending</code>[\n]"
// <message>pending</message>[\n]"
// </stateReason>[\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]"
return response;
}
}