Example usage for com.amazonaws.services.ec2 AmazonEC2 describeVpcClassicLink

List of usage examples for com.amazonaws.services.ec2 AmazonEC2 describeVpcClassicLink

Introduction

In this page you can find the example usage for com.amazonaws.services.ec2 AmazonEC2 describeVpcClassicLink.

Prototype

DescribeVpcClassicLinkResult describeVpcClassicLink();

Source Link

Document

Simplified method form for invoking the DescribeVpcClassicLink operation.

Usage

From source file:com.netflix.spinnaker.clouddriver.aws.agent.ReconcileClassicLinkSecurityGroupsAgent.java

License:Apache License

@Override
public void run() {
    if (!deployDefaults.isReconcileClassicLinkAccount(account)) {
        return;//ww  w . ja va  2s .c o  m
    }
    log.info("Checking classic link security groups in {}/{}", account.getName(), region);
    AmazonEC2 ec2 = amazonClientProvider.getAmazonEC2(account, region, true);
    List<String> classicLinkVpcIds = ec2.describeVpcClassicLink().getVpcs().stream()
            .filter(VpcClassicLink::getClassicLinkEnabled).map(VpcClassicLink::getVpcId)
            .collect(Collectors.toList());
    if (classicLinkVpcIds.size() > 1) {
        log.warn("Multiple classicLinkVpcs found: {}", classicLinkVpcIds);
        throw new IllegalStateException("More than 1 classicLinkVpc found: " + classicLinkVpcIds);
    }

    if (classicLinkVpcIds.isEmpty()) {
        return;
    }
    String classicLinkVpcId = classicLinkVpcIds.get(0);

    RateLimiter apiRequestRateLimit = RateLimiter.create(5);
    final Map<String, ClassicLinkInstance> classicLinkInstances = new HashMap<>();
    DescribeInstancesRequest describeInstances = new DescribeInstancesRequest().withMaxResults(500);
    while (true) {
        apiRequestRateLimit.acquire();
        DescribeInstancesResult instanceResult = ec2.describeInstances(describeInstances);
        instanceResult.getReservations().stream().flatMap(r -> r.getInstances().stream())
                .filter(i -> i.getVpcId() == null)
                .filter(i -> Optional
                        .ofNullable(i.getState()).filter(is -> is.getCode() == RUNNING_STATE).isPresent())
                .filter(this::isInstanceOldEnough)
                .map(i -> new ClassicLinkInstance().withInstanceId(i.getInstanceId())
                        .withVpcId(classicLinkVpcId).withTags(i.getTags()))
                .forEach(cli -> classicLinkInstances.put(cli.getInstanceId(), cli));

        if (instanceResult.getNextToken() == null) {
            break;
        }
        describeInstances.setNextToken(instanceResult.getNextToken());
    }

    DescribeClassicLinkInstancesRequest request = new DescribeClassicLinkInstancesRequest()
            .withMaxResults(1000);
    while (true) {
        apiRequestRateLimit.acquire();
        DescribeClassicLinkInstancesResult result = ec2.describeClassicLinkInstances(request);
        result.getInstances().forEach(i -> classicLinkInstances.put(i.getInstanceId(), i));
        if (result.getNextToken() == null) {
            break;
        }
        request.setNextToken(result.getNextToken());
    }

    log.info("{} existing classic instances in {}/{}", classicLinkInstances.size(), account.getName(), region);

    Map<String, String> groupNamesToIds = ec2
            .describeSecurityGroups(new DescribeSecurityGroupsRequest()
                    .withFilters(new Filter("vpc-id").withValues(classicLinkVpcId)))
            .getSecurityGroups().stream()
            .collect(Collectors.toMap(SecurityGroup::getGroupName, SecurityGroup::getGroupId));

    reconcileInstances(ec2, groupNamesToIds, classicLinkInstances.values());
}