/** * Get the main route table for a given VPC */ public RouteTable getMainRouteTable(String vpcId) { // build filter list List<Filter> filters = new ArrayList<>(); filters.add(AWSUtils.getFilter(AWSUtils.AWS_FILTER_VPC_ID, vpcId)); filters.add(AWSUtils.getFilter(AWS_MAIN_ROUTE_ASSOCIATION, "true")); DescribeRouteTablesRequest req = new DescribeRouteTablesRequest() .withFilters(filters); DescribeRouteTablesResult res = this.client.describeRouteTables(req); List<RouteTable> routeTables = res.getRouteTables(); return routeTables.isEmpty() ? null : routeTables.get(0); }
/** * Update the main route table information for the VPC that is being mapped to a network * state. Query AWS for the main route tables with a list of VPCs. From the result set find * the relevant route table Id and upda */ @Override protected void consumeSuccess(DescribeRouteTablesRequest request, DescribeRouteTablesResult result) { for (RouteTable routeTable : result.getRouteTables()) { if (this.context.vpcs.containsKey(routeTable.getVpcId())) { NetworkState networkStateToUpdate = this.context.vpcs .get(routeTable.getVpcId()); networkStateToUpdate.customProperties.put(AWS_VPC_ROUTE_TABLE_ID, routeTable.getRouteTableId()); this.context.vpcs.put(routeTable.getVpcId(), networkStateToUpdate); } } }
@Override @Cacheable(value = CachingConfiguration.ROUTE_TABLE_CACHE, key = "#vpcId", condition = "#bypassCache == false") public List<RouteTable> getRouteTablesForVpcInRegion(final String vpcId, final String region, boolean bypassCache) { LOG.info("Retrieving route tables for VPC {} in region {} ({})", vpcId, region, bypassCache); DescribeRouteTablesRequest request = new DescribeRouteTablesRequest() .withFilters(new Filter() .withName("vpc-id") .withValues(vpcId)); DescribeRouteTablesResult result = getClientForRegion(region).describeRouteTables(request); return result.getRouteTables(); }
@Override public List<AbstractResource<?>> describeRouteTables(Account account, Region region, DateTime dt, Ec2Filter... filters) { AmazonEC2 ec2 = findClient(account, region); DescribeRouteTablesRequest req = new DescribeRouteTablesRequest(); for (Ec2Filter filter : filters) { Filter f = new Filter().withName(filter.getName()).withValues(filter.getValues()); req.withFilters(f); } log.debug("start describing route tables for account:{} in region:{} via api", account.getId() + "=>" + account.getName(), region); DescribeRouteTablesResult res = ec2.describeRouteTables(req); return converter.toVpcRouteTables(res.getRouteTables(), account.getId(), region, dt); }
/** * Checks if routes between the selected VPCs already exist * * @param vpnEndpoints * @return */ private boolean checkIfRoutesExist(List<VPNEndpoint> vpnEndpoints) { boolean routesExist = false; for (VPNEndpoint vpnEndpoint : vpnEndpoints) { ec2Client.setEndpoint(vpnEndpoint.getRegion().getEndpoint()); DescribeRouteTablesResult descRouteTableResult = ec2Client.describeRouteTables(); List<RouteTable> routeTables = descRouteTableResult.getRouteTables(); for (RouteTable routeTable : routeTables) { if (routeTable.getVpcId().equals(vpnEndpoint.getVpc().getVpcId())) { List<Route> routes = routeTable.getRoutes(); for (Route route : routes) { for (VPNEndpoint extVpnEndpoint : vpnEndpoints) { if (!vpnEndpoint.equals(extVpnEndpoint)) { LOG.debug("Checking if route allows requested traffic: " + route); if (route.getDestinationCidrBlock().endsWith(extVpnEndpoint.getVpc().getCidrBlock())) { routesExist = true; LOG.error("A route already exists between " + vpnEndpoint.getVpc().getCidrBlock() + " and " + extVpnEndpoint.getVpc().getCidrBlock()); } } } } } } } return routesExist; }
/** * Create routes * * @param vpnEndpoints */ private void createAndAssociateRoutes(List<VPNEndpoint> vpnEndpoints) { for (VPNEndpoint vpnEndpoint : vpnEndpoints) { ec2Client.setEndpoint(vpnEndpoint.getRegion().getEndpoint()); for (VPNEndpoint extVpnEndpoint : vpnEndpoints) { if (!vpnEndpoint.equals(extVpnEndpoint)) { // Get route tables DescribeRouteTablesResult descRouteTablesResult = ec2Client.describeRouteTables(); List<RouteTable> routeTables = descRouteTablesResult.getRouteTables(); for (RouteTable routeTable : routeTables) { if (routeTable.getVpcId().equals(vpnEndpoint.getVpc().getVpcId())) { // Create the route CreateRouteRequest createRouteReq = new CreateRouteRequest(); createRouteReq.setDestinationCidrBlock(extVpnEndpoint.getVpc().getCidrBlock()); createRouteReq.setInstanceId(vpnEndpoint.getInstance().getInstanceId()); createRouteReq.setRouteTableId(routeTable.getRouteTableId()); LOG.debug("About to create a route in " + vpnEndpoint.getVpc().getVpcId() + " to " + extVpnEndpoint.getVpc().getVpcId() + " in route table: " + routeTable.getRouteTableId()); ec2Client.createRoute(createRouteReq); LOG.debug("Created route in " + vpnEndpoint.getVpc().getVpcId() + " to " + extVpnEndpoint.getVpc().getVpcId() + " in route table: " + routeTable.getRouteTableId()); } } } } } }
/** * Describe route table. * * @return RouteTable */ protected final RouteTable getRouteTable() { RouteTable routeTable = null; DescribeRouteTablesRequest req = new DescribeRouteTablesRequest(); DescribeRouteTablesResult result = amazonEC2Client.describeRouteTables(req); if (result != null && !result.getRouteTables().isEmpty()) { routeTable = result.getRouteTables().get(0); } return routeTable; }
@Override public DescribeRouteTablesResult describeRouteTables(DescribeRouteTablesRequest describeRouteTablesRequest) throws AmazonServiceException, AmazonClientException { throw new UnsupportedOperationException("Not supported in mock"); }
@Override public DescribeRouteTablesResult describeRouteTables() throws AmazonServiceException, AmazonClientException { throw new UnsupportedOperationException("Not supported in mock"); }
@Override public boolean load(DescribeRouteTablesRequest request, ResultCapture<DescribeRouteTablesResult> extractor) { return resource.load(request, extractor); }
/** * Makes a call to the service to load this resource's attributes if they * are not loaded yet, and use a ResultCapture to retrieve the low-level * client response * The following request parameters will be populated from the data of this * <code>RouteTable</code> resource, and any conflicting parameter value set * in the request will be overridden: * <ul> * <li> * <b><code>RouteTableIds.0</code></b> * - mapped from the <code>Id</code> identifier. * </li> * </ul> * * <p> * * @return Returns {@code true} if the resource is not yet loaded when this * method was invoked, which indicates that a service call has been * made to retrieve the attributes. * @see DescribeRouteTablesRequest */ boolean load(DescribeRouteTablesRequest request, ResultCapture<DescribeRouteTablesResult> extractor);