Example usage for com.amazonaws.services.ec2.model ClassicLinkInstance ClassicLinkInstance

List of usage examples for com.amazonaws.services.ec2.model ClassicLinkInstance ClassicLinkInstance

Introduction

In this page you can find the example usage for com.amazonaws.services.ec2.model ClassicLinkInstance ClassicLinkInstance.

Prototype

ClassicLinkInstance

Source Link

Usage

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

License:Apache License

@Override
public void run() {
    if (!deployDefaults.isReconcileClassicLinkAccount(account)) {
        return;/*from  w  w  w  .  j  a  v  a  2 s.co 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());
}