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.IpPools; import io.fathom.cloud.compute.services.NetworkMap; import io.fathom.cloud.protobuf.CloudModel.HostGroupData; import io.fathom.cloud.protobuf.CloudModel.VirtualIpPoolData; import io.fathom.cloud.protobuf.CloudModel.VirtualIpPoolType; import javax.inject.Inject; import org.kohsuke.args4j.Option; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class VipPoolCreateCmdlet extends TypedCmdlet { private static final Logger log = LoggerFactory.getLogger(VipPoolCreateCmdlet.class); @Option(name = "-label", usage = "label", required = false) public String label; @Option(name = "-cidr", usage = "cidr") public String cidr; @Option(name = "-type", usage = "type") public String type = "ethernet"; @Option(name = "-hosts", usage = "host group key") public String hostGroupKey; @Inject IpPools ipPools; @Inject NetworkMap networkMap; public VipPoolCreateCmdlet() { super("vip-pool-create"); } @Override protected VirtualIpPoolData run0() throws Exception { VirtualIpPoolData.Builder b = VirtualIpPoolData.newBuilder(); if (label != null) { b.setLabel(label); } type = type.toLowerCase().trim(); if (type.equals("ethernet")) { b.setType(VirtualIpPoolType.LAYER_3); } else if (type.equals("aws")) { b.setType(VirtualIpPoolType.AMAZON_EC2); } else { throw new IllegalArgumentException("Unknown type (valid types are 'ethernet', 'aws')"); } if (b.getType() == VirtualIpPoolType.LAYER_3) { if (cidr == null) { throw new IllegalArgumentException("CIDR is required for Ethernet-based virtual-IP pools"); } IpRange range = IpRange.parse(cidr); // if (!range.isIpv4()) { // throw new IllegalArgumentException("Only IPV4 is supported"); // } b.setCidr(cidr); } if (b.getType() == VirtualIpPoolType.AMAZON_EC2) { if (cidr != null) { throw new IllegalArgumentException("CIDR cannot be provided for AWS virtual-IP pools"); } } if (hostGroupKey != null) { HostGroupData hostGroup = networkMap.findHostGroupByKey(hostGroupKey); if (hostGroup == null) { throw new IllegalArgumentException("Host group is not found"); } b.setHostGroupId(hostGroup.getId()); } VirtualIpPoolData created = ipPools.createVipPool(b); return created; } }