package core.aws.local.vpc; import core.aws.env.Environment; import core.aws.local.DependencyResolvers; import core.aws.local.LocalResourceLoader; import core.aws.local.ResourceNode; import core.aws.resource.Resources; import core.aws.resource.vpc.InternetGateway; import core.aws.resource.vpc.NATGateway; import core.aws.resource.vpc.RouteTable; import core.aws.resource.vpc.Subnet; import core.aws.resource.vpc.SubnetType; import java.util.ArrayList; import java.util.List; /** * @author neo */ public class SubnetLoader implements LocalResourceLoader { @Override @SuppressWarnings("unchecked") public void load(ResourceNode node, final Resources resources, DependencyResolvers resolvers, Environment env) { List<String> cidrs = new ArrayList<>(); final SubnetType type = SubnetType.valueOf(node.getString("type").orElse("PUBLIC").toUpperCase()); Object cidr = node.field("cidr"); if (cidr instanceof String) cidrs.add((String) cidr); else if (cidr instanceof List) cidrs.addAll((java.util.Collection<? extends String>) cidr); final Subnet subnet = new Subnet(node.id); subnet.cidrs.addAll(cidrs); subnet.type = type; subnet.vpc = resources.vpc; if (type == SubnetType.PUBLIC) { addInternetGateway(node, resources, resolvers); addPublicRouteTable(node, resources, resolvers); node.getString("nat").ifPresent(ip -> { final NATGateway nat = resources.add(new NATGateway()); nat.subnet = subnet; nat.ip = ip; }); } else { addPrivateRouteTable(node, resources, resolvers); } resources.add(subnet); resolvers.add(node, () -> { String routeTableId = type == SubnetType.PUBLIC ? RouteTable.PUBLIC_ROUTE_TABLE_RESOURCE_ID : RouteTable.PRIVATE_ROUTE_TABLE_RESOURCE_ID; subnet.routeTable = resources.get(RouteTable.class, routeTableId); }); } private void addPrivateRouteTable(ResourceNode node, final Resources resources, DependencyResolvers resolvers) { if (!resources.find(RouteTable.class, RouteTable.PRIVATE_ROUTE_TABLE_RESOURCE_ID).isPresent()) { final RouteTable routeTable = resources.add(new RouteTable(RouteTable.PRIVATE_ROUTE_TABLE_RESOURCE_ID)); resolvers.add(node, () -> { routeTable.vpc = resources.vpc; routeTable.nat = resources.onlyOne(NATGateway.class).get(); }); } } private void addPublicRouteTable(ResourceNode node, final Resources resources, DependencyResolvers resolvers) { if (!resources.find(RouteTable.class, RouteTable.PUBLIC_ROUTE_TABLE_RESOURCE_ID).isPresent()) { final RouteTable routeTable = resources.add(new RouteTable(RouteTable.PUBLIC_ROUTE_TABLE_RESOURCE_ID)); resolvers.add(node, () -> { routeTable.vpc = resources.vpc; routeTable.internetGateway = resources.onlyOne(InternetGateway.class).get(); }); } } private void addInternetGateway(ResourceNode node, Resources resources, DependencyResolvers resolvers) { if (!resources.onlyOne(InternetGateway.class).isPresent()) { final InternetGateway internetGateway = resources.add(new InternetGateway()); resolvers.add(node, () -> internetGateway.vpc = resources.vpc); } } }