package io.fathom.cloud.compute.commands;
import io.fathom.cloud.commands.TypedCmdlet;
import io.fathom.cloud.compute.networks.IpRange;
import io.fathom.cloud.compute.services.NetworkMap;
import io.fathom.cloud.protobuf.CloudModel.HostData;
import io.fathom.cloud.protobuf.CloudModel.HostGroupData;
import javax.inject.Inject;
import org.kohsuke.args4j.Option;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HostCreateCmdlet extends TypedCmdlet {
private static final Logger log = LoggerFactory.getLogger(HostCreateCmdlet.class);
@Option(name = "-parent", usage = "parent key", required = true)
public String parentKey = null;
@Option(name = "-label", usage = "label", required = false)
public String label;
// TODO: We could probably auto-allocate child CIDRs
@Option(name = "-cidr", usage = "cidr", required = true)
public String cidr;
@Option(name = "-net", usage = "network interface", required = false)
public String networkDevice = "eth0";
@Inject
NetworkMap networkMap;
public HostCreateCmdlet() {
super("host-create");
}
@Override
protected HostData run0() throws Exception {
IpRange range = IpRange.parse(cidr);
if (!range.isIpv6()) {
throw new IllegalArgumentException("Only IPV6 is supported");
}
if (range.getNetmaskLength() > 124) {
// No real reason, just to keep things sensible
throw new IllegalArgumentException("Must allocate at least a /124");
}
// DatacenterData dc = getDatacenter(datacenterKey);
//
// RackData rack;
// if (rackKey == null) {
// List<RackData> racks = networkMap.listRacks(dc);
// if (racks.size() == 0) {
// throw new
// IllegalArgumentException("Please create a rack first, with create-rack");
// } else if (racks.size() == 1) {
// rack = racks.get(0);
// } else {
// throw new
// IllegalArgumentException("Multiple racks found; please specify the rack to use");
// }
// } else {
// rack = networkMap.findRack(dc, rackKey);
// if (rack == null) {
// throw new IllegalArgumentException("Specified rack not found");
// }
// }
HostGroupData parent = networkMap.findHostGroupByKey(parentKey);
if (parent == null) {
throw new IllegalArgumentException("Specified parent not found");
}
// List<HostData> hosts = networkMap.listHosts(rack);
// long max = 0;
// for (HostData host : hosts) {
// long v = host.getKey();
// max = Math.max(v, max);
// }
//
// long next = max + 1;
//
// if (next < 16) {
// // We reserve the first 16 for operational stuff
// next = 16;
// }
//
// if (next >= 65500) {
// // Reserve some at the end as well
// // TODO: Reclaim deleted hosts??
// throw new
// IllegalArgumentException("Too many machines already configured in rack");
// }
// IpRange parentRange = IpRange.parse(parent.getCidr());
// if (!containsStrict(parentRange, range)) {
// throw new
// IllegalArgumentException("Child CIDR must be a sub-range of the parent range");
// }
HostData.Builder b = HostData.newBuilder();
if (label != null) {
b.setLabel(label);
}
b.setHostGroup(parent.getId());
b.setCidr(cidr);
b.setNetworkDevice(networkDevice);
HostData created = networkMap.createHost(b);
return created;
}
}