package io.fathom.cloud.compute.commands;
//
//import java.util.List;
//
//import javax.inject.Inject;
//import javax.inject.Provider;
//
//import org.kohsuke.args4j.Option;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import io.fathom.cloud.CloudException;
//import io.fathom.cloud.actions.StartInstancesAction;
//import io.fathom.cloud.commands.TypedCmdlet;
//import io.fathom.cloud.compute.api.os.resources.OpenstackIds;
//import io.fathom.cloud.compute.api.os.resources.SecurityGroupDictionary;
//import io.fathom.cloud.compute.services.ComputeServices;
//import io.fathom.cloud.compute.services.KeyPairs;
//import io.fathom.cloud.compute.services.SecurityGroups;
//import io.fathom.cloud.protobuf.CloudModel.InstanceInfo;
//import io.fathom.cloud.protobuf.CloudModel.KeyPairData;
//import io.fathom.cloud.protobuf.CloudModel.ReservationInfo;
//import io.fathom.cloud.protobuf.CloudModel.SecurityGroupData;
//import io.fathom.cloud.server.auth.Auth;
//import io.fathom.cloud.server.model.Project;
//import io.fathom.cloud.services.AuthService;
//import io.fathom.cloud.services.ImageService;
//
//public class CreateInstanceCommand extends TypedCmdlet {
// private static final Logger log = LoggerFactory.getLogger(CreateInstanceCommand.class);
//
// @Option(name = "-ip", usage = "ip", required = true)
// public String ip;
//
// @Option(name = "-image", usage = "image", required = true)
// public String imageRef;
//
// @Option(name = "-name", usage = "name", required = true)
// public String name;
//
// @Option(name = "-key", usage = "key", required = true)
// public String keyName;
//
// @Option(name = "-sg", usage = "security group", required = true)
// public List<String> securityGroupNames;
//
// @Option(name = "-u", usage = "username", required = true)
// public String username;
//
// @Option(name = "-p", usage = "password", required = true)
// public String password;
//
// @Inject
// ComputeServices computeServices;
//
// @Inject
// SecurityGroups securityGroups;
//
// public CreateInstanceCommand() {
// super("create-instance");
// }
//
// @Inject
// Provider<StartInstancesAction> startInstancesActionProvider;
//
// @Inject
// ImageService imageService;
//
// @Inject
// KeyPairs keypairs;
//
// @Inject
// AuthService authService;
//
// Auth authenticate() throws CloudException {
// Auth auth = authService.authenticate(null, username, password);
// if (auth == null) {
// throw new IllegalStateException("Authentication failed");
// }
// return auth;
// }
//
// @Override
// protected InstanceInfo run0() throws Exception {
// authenticate();
//
// StartInstancesAction action = startInstancesActionProvider.get();
//
// Auth auth = authenticate();
// Project project = auth.getProject();
//
// action.project = project;
// action.auth = auth;
//
// action.minCount = 1;
// action.maxCount = 1;
//
// ImageService.Image image;
// {
// ReservationInfo.Builder reservation = ReservationInfo.newBuilder();
//
// long imageId = OpenstackIds.toImageId(imageRef);
// image = imageService.findImage(project, imageId);
// if (image == null) {
// throw new IllegalArgumentException("Image not found");
// }
//
// // TODO: Copy image?
// reservation.setImageId(image.getId());
//
// action.reservationTemplate = reservation.build();
// }
//
// {
// InstanceInfo.Builder instance = InstanceInfo.newBuilder();
// instance.setName(name);
//
// if (keyName != null) {
// KeyPairData keypair = keypairs.findKeyPair(project, keyName);
// if (keypair == null) {
// throw new IllegalArgumentException();
// }
// instance.setKeyPair(keypair);
// }
//
// instance.setImageId(image.getId());
//
// if (securityGroupNames != null && !securityGroupNames.isEmpty()) {
// SecurityGroupDictionary dictionary = new SecurityGroupDictionary(securityGroups.list(project));
//
// for (String securityGroupName : securityGroupNames) {
// SecurityGroupData data = dictionary.getByName(securityGroupName);
// if (data == null) {
// throw new IllegalArgumentException("Security group not found: " + securityGroupName);
// }
//
// instance.addSecurityGroupId(data.getId());
// }
// }
//
// action.instanceTemplate = instance.build();
// }
//
// StartInstancesAction.Result result = action.go();
//
// if (result.instances.size() != 1) {
// throw new IllegalStateException();
// }
//
// return result.instances.get(0);
// }
// }