package io.fathom.cloud.compute.commands; import io.fathom.cloud.commands.TypedCmdlet; import io.fathom.cloud.compute.services.ComputeSecrets; import io.fathom.cloud.compute.services.NetworkMap; import io.fathom.cloud.protobuf.CloudCommons.SecretData; import io.fathom.cloud.protobuf.CloudModel.HostGroupData; import io.fathom.cloud.protobuf.CloudModel.HostGroupSecretData; import io.fathom.cloud.protobuf.CloudModel.HostGroupType; import javax.inject.Inject; import org.kohsuke.args4j.Option; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HostGroupCreateCmdlet extends TypedCmdlet { private static final Logger log = LoggerFactory.getLogger(HostGroupCreateCmdlet.class); @Option(name = "-label", usage = "label", required = false) public String label; @Option(name = "-key", usage = "cidr", required = true) public String key; // TODO: We could probably auto-find the smallest CIDR @Option(name = "-parent", usage = "parent key", required = false) public String parentKey = null; @Option(name = "-type", usage = "type", required = true) public String type; // @Option(name = "-username", usage = "AWS username", required = false) // public String username = null; // // @Option(name = "-password", usage = "AWS password", required = false) // public String password = null; @Inject ComputeSecrets computeSecrets; @Inject NetworkMap networkMap; public HostGroupCreateCmdlet() { super("hostgroup-create"); } @Override protected HostGroupData run0() throws Exception { // IpRange range = IpRange.parse(cidr); // if (!range.isIpv6()) { // throw new IllegalArgumentException("Only IPV6 is supported"); // } // // if (range.getNetmaskLength() > 120) { // // No real reason, just to keep things sensible // throw new IllegalArgumentException("Must allocate at least a /120"); // } if (networkMap.findHostGroupByKey(key) != null) { throw new IllegalArgumentException("Host group already exists"); } HostGroupData parent = null; if (parentKey != null) { parent = networkMap.findHostGroupByKey(parentKey); if (parent == null) { throw new IllegalArgumentException("Specified parent not found"); } } HostGroupData.Builder b = HostGroupData.newBuilder(); if (label != null) { b.setLabel(label); } b.setKey(key); type = type.toLowerCase().trim(); if (type.equals("ec2")) { b.setHostGroupType(HostGroupType.HOST_GROUP_TYPE_AMAZON_EC2); } else if (type.equals("bare")) { b.setHostGroupType(HostGroupType.HOST_GROUP_TYPE_RAW); } else { throw new IllegalArgumentException("Expected type to be 'bare' or 'ec2'"); } { HostGroupSecretData.Builder sb = HostGroupSecretData.newBuilder(); // We're going to rely on IAM ... so much easier + more secure // if (username != null) { // sb.setUsername(username); // } // // if (password != null) { // sb.setPassword(password); // } SecretData secretData = computeSecrets.encrypt(sb.build()); b.setSecretData(secretData); } if (parent != null) { b.setParent(parent.getId()); // IpRange parentRange = IpRange.parse(parent.getCidr()); // if (!containsStrict(parentRange, range)) { // throw new // IllegalArgumentException("Child CIDR must be a sub-range of the parent range"); // } } HostGroupData created = networkMap.createHostGroup(b); return created; } }