protected ProgressEvent preAttachInstances()

in aws-lightsail-bucket/src/main/java/software/amazon/lightsail/bucket/helpers/handler/BucketHandler.java [223:260]


    protected ProgressEvent<ResourceModel, CallbackContext> preAttachInstances(
            final ProgressEvent<ResourceModel, CallbackContext> progress) {
        val bucket = getBucket(resourceModelRequest, proxyClient, logger);
        val instance = getInstance(resourceModelRequest, proxyClient, logger);
        logger.log("Executing AWS-Lightsail-Bucket::Update::PreAttachInstances...");
        return proxy
                .initiate("AWS-Lightsail-Bucket::Update::PreAttachInstances", proxyClient, progress.getResourceModel(),
                        progress.getCallbackContext())
                .translateToServiceRequest(Translator::translateToReadRequest).backoffDelay(BACKOFF_DELAY)
                .makeServiceCall((awsRequest, client) -> {
                    // Just return empty Get Response. We are not making any service call here.
                    // Making sure that all instances that need to be attached are not attached to other buckets.
                    return GetBucketsResponse.builder().build();
                })
                .stabilize((awsRequest, awsResponse, client, model, context) -> {
                    Set<String> desiredResources = resourceModelRequest.getDesiredResourceState().getResourcesReceivingAccess();
                    Set<String> currentResources = bucket.getCurrentResourceModelFromLightsail().getResourcesReceivingAccess();

                    Set<String> resourcesToAdd = bucket.setDifference(desiredResources, currentResources);

                    val getBucketsResponse = (GetBucketsResponse) bucket.readAll(awsRequest);
                    Set<String> alreadyAttached = new HashSet<>();
                    for (val buck: getBucketsResponse.buckets()) {
                        alreadyAttached.addAll(buck.resourcesReceivingAccess().stream()
                                .map(resourceReceivingAccess -> resourceReceivingAccess.name()).collect(Collectors.toSet()));
                    }
                    logger.log("Already attached resources: " + alreadyAttached.toString());
                    for (val resource: resourcesToAdd) {
                        if (!instance.isStabilized(resource) || alreadyAttached.contains(resource)) {
                            return this.isStabilized(callbackContext, PRE_CHECK_ATTACH);
                        }
                    }
                    return true;
                })
                .handleError((awsRequest, exception, client, model, context) -> handleError(exception, model,
                        callbackContext, ImmutableList.of(), logger, this.getClass().getSimpleName()))
                .progress();
    }