Search in sources :

Example 1 with CloudEfsAttributes

use of com.sequenceiq.cloudbreak.cloud.model.CloudEfsAttributes in project cloudbreak by hortonworks.

the class AwsEfsResourceBuilder method checkResources.

@Override
protected List<CloudResourceStatus> checkResources(ResourceType type, AwsContext context, AuthenticatedContext auth, Iterable<CloudResource> resources) {
    AmazonEfsClient client = getAmazonEfsClient(auth);
    List<CloudResource> efsResources = StreamSupport.stream(resources.spliterator(), false).filter(r -> r.getType().equals(resourceType())).collect(Collectors.toList());
    List<String> efsIds = new ArrayList<>();
    List<CloudResourceStatus> cloudResourceStatusList = new ArrayList<>();
    for (CloudResource efsResource : efsResources) {
        CloudEfsAttributes efsAttributes = efsResource.getParameter(CloudResource.ATTRIBUTES, CloudEfsAttributes.class);
        String efsId = efsAttributes.getFileSystemId();
        efsIds.add(efsId);
        DescribeFileSystemsRequest request = new DescribeFileSystemsRequest().withFileSystemId(efsId);
        DescribeFileSystemsResult result = client.describeFileSystems(request);
        List<CloudResourceStatus> efsStatusList = getResourceStatus(efsResource, efsId, result);
        cloudResourceStatusList.addAll(efsStatusList);
    }
    LOGGER.debug("got EFS status for [{}]", String.join(",", efsIds));
    return cloudResourceStatusList;
}
Also used : AmazonEfsClient(com.sequenceiq.cloudbreak.cloud.aws.common.client.AmazonEfsClient) DescribeMountTargetsResult(com.amazonaws.services.elasticfilesystem.model.DescribeMountTargetsResult) AmazonElasticFileSystemException(com.amazonaws.services.elasticfilesystem.model.AmazonElasticFileSystemException) AsyncTaskExecutor(org.springframework.core.task.AsyncTaskExecutor) LoggerFactory(org.slf4j.LoggerFactory) HashMap(java.util.HashMap) CloudInstance(com.sequenceiq.cloudbreak.cloud.model.CloudInstance) AmazonEfsClient(com.sequenceiq.cloudbreak.cloud.aws.common.client.AmazonEfsClient) Image(com.sequenceiq.cloudbreak.cloud.model.Image) Function(java.util.function.Function) ArrayList(java.util.ArrayList) Inject(javax.inject.Inject) Future(java.util.concurrent.Future) AwsCredentialView(com.sequenceiq.cloudbreak.cloud.aws.common.view.AwsCredentialView) AuthenticatedContext(com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext) AwsContext(com.sequenceiq.cloudbreak.cloud.aws.common.context.AwsContext) Map(java.util.Map) Qualifier(org.springframework.beans.factory.annotation.Qualifier) StreamSupport(java.util.stream.StreamSupport) DescribeMountTargetsRequest(com.amazonaws.services.elasticfilesystem.model.DescribeMountTargetsRequest) CommonStatus(com.sequenceiq.common.api.type.CommonStatus) ResourceType(com.sequenceiq.common.api.type.ResourceType) Logger(org.slf4j.Logger) CreateFileSystemRequest(com.amazonaws.services.elasticfilesystem.model.CreateFileSystemRequest) DescribeFileSystemsResult(com.amazonaws.services.elasticfilesystem.model.DescribeFileSystemsResult) FileSystemDescription(com.amazonaws.services.elasticfilesystem.model.FileSystemDescription) CloudResource(com.sequenceiq.cloudbreak.cloud.model.CloudResource) Collection(java.util.Collection) CloudResourceStatus(com.sequenceiq.cloudbreak.cloud.model.CloudResourceStatus) DescribeFileSystemsRequest(com.amazonaws.services.elasticfilesystem.model.DescribeFileSystemsRequest) Tag(com.amazonaws.services.elasticfilesystem.model.Tag) Collectors(java.util.stream.Collectors) CloudStack(com.sequenceiq.cloudbreak.cloud.model.CloudStack) CreateFileSystemResult(com.amazonaws.services.elasticfilesystem.model.CreateFileSystemResult) List(java.util.List) Component(org.springframework.stereotype.Component) DeleteMountTargetRequest(com.amazonaws.services.elasticfilesystem.model.DeleteMountTargetRequest) LifeCycleState(com.sequenceiq.cloudbreak.cloud.model.filesystem.efs.LifeCycleState) MountTargetDescription(com.amazonaws.services.elasticfilesystem.model.MountTargetDescription) CloudEfsAttributes(com.sequenceiq.cloudbreak.cloud.model.CloudEfsAttributes) Group(com.sequenceiq.cloudbreak.cloud.model.Group) Optional(java.util.Optional) DeleteFileSystemRequest(com.amazonaws.services.elasticfilesystem.model.DeleteFileSystemRequest) CommonAwsClient(com.sequenceiq.cloudbreak.cloud.aws.common.CommonAwsClient) Collections(java.util.Collections) AwsTaggingService(com.sequenceiq.cloudbreak.cloud.aws.common.AwsTaggingService) StringUtils(org.springframework.util.StringUtils) CloudEfsAttributes(com.sequenceiq.cloudbreak.cloud.model.CloudEfsAttributes) CloudResourceStatus(com.sequenceiq.cloudbreak.cloud.model.CloudResourceStatus) ArrayList(java.util.ArrayList) DescribeFileSystemsRequest(com.amazonaws.services.elasticfilesystem.model.DescribeFileSystemsRequest) DescribeFileSystemsResult(com.amazonaws.services.elasticfilesystem.model.DescribeFileSystemsResult) CloudResource(com.sequenceiq.cloudbreak.cloud.model.CloudResource)

Example 2 with CloudEfsAttributes

use of com.sequenceiq.cloudbreak.cloud.model.CloudEfsAttributes in project cloudbreak by hortonworks.

the class AwsEfsResourceBuilder method creatEfsRequest.

private CreateFileSystemRequest creatEfsRequest(CloudResource resource, CloudStack cloudStack, Map<String, CloudEfsAttributes> efsSetMap) {
    CloudEfsAttributes efsAttributes = resource.getParameter(CloudResource.ATTRIBUTES, CloudEfsAttributes.class);
    efsSetMap.put(resource.getName(), efsAttributes);
    efsAttributes.setTags(cloudStack.getTags());
    Collection<Tag> awsTags = awsTaggingService.prepareEfsTags(efsAttributes.getTags());
    CreateFileSystemRequest createFileSystemRequest = new CreateFileSystemRequest().withCreationToken(efsAttributes.getCreationToken()).withTags(awsTags).withPerformanceMode(efsAttributes.getPerformanceMode()).withThroughputMode(efsAttributes.getThroughputMode()).withProvisionedThroughputInMibps(efsAttributes.getProvisionedThroughputInMibps()).withEncrypted(efsAttributes.getEncrypted());
    if (!StringUtils.isEmpty(efsAttributes.getKmsKeyId())) {
        createFileSystemRequest.withKmsKeyId(efsAttributes.getKmsKeyId());
    }
    return createFileSystemRequest;
}
Also used : CloudEfsAttributes(com.sequenceiq.cloudbreak.cloud.model.CloudEfsAttributes) CreateFileSystemRequest(com.amazonaws.services.elasticfilesystem.model.CreateFileSystemRequest) Tag(com.amazonaws.services.elasticfilesystem.model.Tag)

Example 3 with CloudEfsAttributes

use of com.sequenceiq.cloudbreak.cloud.model.CloudEfsAttributes in project cloudbreak by hortonworks.

the class AwsEfsResourceBuilder method build.

@Override
public List<CloudResource> build(AwsContext context, CloudInstance instance, long privateId, AuthenticatedContext auth, Group group, List<CloudResource> buildableResource, CloudStack cloudStack) throws Exception {
    LOGGER.debug("Create EFS on provider" + buildableResource.stream().map(CloudResource::getName).collect(Collectors.toList()));
    AmazonEfsClient client = getAmazonEfsClient(auth);
    Map<String, CloudEfsAttributes> efsSetMap = Collections.synchronizedMap(new HashMap<>());
    List<Future<?>> futures = new ArrayList<>();
    List<CloudResource> requestedResources = buildableResource.stream().filter(cloudResource -> CommonStatus.REQUESTED.equals(cloudResource.getStatus())).collect(Collectors.toList());
    LOGGER.debug("Start creating EFS for stack: '{}' group: '{}'", auth.getCloudContext().getName(), group.getName());
    futures.addAll(requestedResources.stream().map(requestedResource -> creatEfsRequest(requestedResource, cloudStack, efsSetMap)).map(request -> intermediateBuilderExecutor.submit(() -> {
        CreateFileSystemResult result = client.createFileSystem(request);
        CloudEfsAttributes resultAttributes = getResultEfsAttributes(request, result, efsSetMap);
        efsSetMap.put(resultAttributes.getName(), resultAttributes);
    })).collect(Collectors.toList()));
    LOGGER.debug("Waiting for EFS creation requests");
    for (Future<?> future : futures) {
        future.get();
    }
    LOGGER.debug("EFS creation requests sent");
    return buildableResource.stream().peek(resource -> {
        CloudEfsAttributes resultEfsAttributes = efsSetMap.getOrDefault(resource.getName(), null);
        if (resultEfsAttributes != null) {
            CloudEfsAttributes resourceEfsAttributes = resource.getParameter(CloudResource.ATTRIBUTES, CloudEfsAttributes.class);
            resourceEfsAttributes.setFileSystemId(resultEfsAttributes.getFileSystemId());
            resourceEfsAttributes.setFileState(resultEfsAttributes.getFileState());
        }
    }).map(copyResourceWithCreatedStatus()).collect(Collectors.toList());
}
Also used : AmazonEfsClient(com.sequenceiq.cloudbreak.cloud.aws.common.client.AmazonEfsClient) DescribeMountTargetsResult(com.amazonaws.services.elasticfilesystem.model.DescribeMountTargetsResult) AmazonElasticFileSystemException(com.amazonaws.services.elasticfilesystem.model.AmazonElasticFileSystemException) AsyncTaskExecutor(org.springframework.core.task.AsyncTaskExecutor) LoggerFactory(org.slf4j.LoggerFactory) HashMap(java.util.HashMap) CloudInstance(com.sequenceiq.cloudbreak.cloud.model.CloudInstance) AmazonEfsClient(com.sequenceiq.cloudbreak.cloud.aws.common.client.AmazonEfsClient) Image(com.sequenceiq.cloudbreak.cloud.model.Image) Function(java.util.function.Function) ArrayList(java.util.ArrayList) Inject(javax.inject.Inject) Future(java.util.concurrent.Future) AwsCredentialView(com.sequenceiq.cloudbreak.cloud.aws.common.view.AwsCredentialView) AuthenticatedContext(com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext) AwsContext(com.sequenceiq.cloudbreak.cloud.aws.common.context.AwsContext) Map(java.util.Map) Qualifier(org.springframework.beans.factory.annotation.Qualifier) StreamSupport(java.util.stream.StreamSupport) DescribeMountTargetsRequest(com.amazonaws.services.elasticfilesystem.model.DescribeMountTargetsRequest) CommonStatus(com.sequenceiq.common.api.type.CommonStatus) ResourceType(com.sequenceiq.common.api.type.ResourceType) Logger(org.slf4j.Logger) CreateFileSystemRequest(com.amazonaws.services.elasticfilesystem.model.CreateFileSystemRequest) DescribeFileSystemsResult(com.amazonaws.services.elasticfilesystem.model.DescribeFileSystemsResult) FileSystemDescription(com.amazonaws.services.elasticfilesystem.model.FileSystemDescription) CloudResource(com.sequenceiq.cloudbreak.cloud.model.CloudResource) Collection(java.util.Collection) CloudResourceStatus(com.sequenceiq.cloudbreak.cloud.model.CloudResourceStatus) DescribeFileSystemsRequest(com.amazonaws.services.elasticfilesystem.model.DescribeFileSystemsRequest) Tag(com.amazonaws.services.elasticfilesystem.model.Tag) Collectors(java.util.stream.Collectors) CloudStack(com.sequenceiq.cloudbreak.cloud.model.CloudStack) CreateFileSystemResult(com.amazonaws.services.elasticfilesystem.model.CreateFileSystemResult) List(java.util.List) Component(org.springframework.stereotype.Component) DeleteMountTargetRequest(com.amazonaws.services.elasticfilesystem.model.DeleteMountTargetRequest) LifeCycleState(com.sequenceiq.cloudbreak.cloud.model.filesystem.efs.LifeCycleState) MountTargetDescription(com.amazonaws.services.elasticfilesystem.model.MountTargetDescription) CloudEfsAttributes(com.sequenceiq.cloudbreak.cloud.model.CloudEfsAttributes) Group(com.sequenceiq.cloudbreak.cloud.model.Group) Optional(java.util.Optional) DeleteFileSystemRequest(com.amazonaws.services.elasticfilesystem.model.DeleteFileSystemRequest) CommonAwsClient(com.sequenceiq.cloudbreak.cloud.aws.common.CommonAwsClient) Collections(java.util.Collections) AwsTaggingService(com.sequenceiq.cloudbreak.cloud.aws.common.AwsTaggingService) StringUtils(org.springframework.util.StringUtils) CloudEfsAttributes(com.sequenceiq.cloudbreak.cloud.model.CloudEfsAttributes) ArrayList(java.util.ArrayList) CreateFileSystemResult(com.amazonaws.services.elasticfilesystem.model.CreateFileSystemResult) Future(java.util.concurrent.Future) CloudResource(com.sequenceiq.cloudbreak.cloud.model.CloudResource)

Example 4 with CloudEfsAttributes

use of com.sequenceiq.cloudbreak.cloud.model.CloudEfsAttributes in project cloudbreak by hortonworks.

the class AwsEfsResourceBuilder method delete.

@Override
public CloudResource delete(AwsContext context, AuthenticatedContext auth, CloudResource resource) throws InterruptedException {
    // 
    // https://docs.aws.amazon.com/efs/latest/ug/wt1-clean-up.html
    // To delete an EFS instance, need the following steps
    // 1. Terminate the EC2 instances that mount on this EFS. The caller of this function has to make sure it is done before calling this function
    // 2. Delete the mount targets of this EFS.
    // 3. (Optional) Delete the security group of each mount target. AWS does not charge for security groups
    // 4. (Optional) Delete the security group of the EC2 instances at step 1. The mount target's security group has a rule that references
    // the EC2 security group. Therefore, we cannot first delete the EC2 instance's security group.
    // 5. Actually delete the EFS
    // 
    AmazonEfsClient client = getAmazonEfsClient(auth);
    CloudEfsAttributes efsAttributes = resource.getParameter(CloudResource.ATTRIBUTES, CloudEfsAttributes.class);
    String efsId = efsAttributes.getFileSystemId();
    DescribeFileSystemsRequest request = new DescribeFileSystemsRequest().withFileSystemId(efsId);
    DescribeFileSystemsResult result = client.describeFileSystems(request);
    List<FileSystemDescription> efsDescriptions = result.getFileSystems();
    for (FileSystemDescription efsDescription : efsDescriptions) {
        LifeCycleState efsLifeCycleState = LifeCycleState.fromValue(efsDescription.getLifeCycleState());
        if (LifeCycleState.DELETED.equals(efsLifeCycleState) || LifeCycleState.DELETING.equals(efsLifeCycleState)) {
            LOGGER.debug("The given AWS EFS's [name: {}] lifecycle state was [{}] hence we are going to skip any delete operation over this resource", efsDescription.getName(), efsLifeCycleState);
            continue;
        }
        if (efsDescription.getNumberOfMountTargets() > 0) {
            DescribeMountTargetsRequest mtRequest = new DescribeMountTargetsRequest().withFileSystemId(efsId);
            DescribeMountTargetsResult mtResult = client.describeMountTargets(mtRequest);
            List<MountTargetDescription> mountTargetDescriptionList = mtResult.getMountTargets();
            // Only delete the mount targets.
            for (MountTargetDescription mtDescription : mountTargetDescriptionList) {
                DeleteMountTargetRequest mtDelRequest = new DeleteMountTargetRequest().withMountTargetId(mtDescription.getMountTargetId());
                LOGGER.debug("About to delete AWS EFS mount target that has the following id: {}", mtDescription.getMountTargetId());
                client.deleteMountTarget(mtDelRequest);
            }
        // TODO: delete the security groups in the future
        }
        DeleteFileSystemRequest efsDelRequest = new DeleteFileSystemRequest().withFileSystemId(efsId);
        client.deleteFileSystem(efsDelRequest);
    }
    return null;
}
Also used : AmazonEfsClient(com.sequenceiq.cloudbreak.cloud.aws.common.client.AmazonEfsClient) CloudEfsAttributes(com.sequenceiq.cloudbreak.cloud.model.CloudEfsAttributes) DescribeMountTargetsResult(com.amazonaws.services.elasticfilesystem.model.DescribeMountTargetsResult) MountTargetDescription(com.amazonaws.services.elasticfilesystem.model.MountTargetDescription) DescribeMountTargetsRequest(com.amazonaws.services.elasticfilesystem.model.DescribeMountTargetsRequest) DescribeFileSystemsRequest(com.amazonaws.services.elasticfilesystem.model.DescribeFileSystemsRequest) DeleteFileSystemRequest(com.amazonaws.services.elasticfilesystem.model.DeleteFileSystemRequest) DeleteMountTargetRequest(com.amazonaws.services.elasticfilesystem.model.DeleteMountTargetRequest) LifeCycleState(com.sequenceiq.cloudbreak.cloud.model.filesystem.efs.LifeCycleState) DescribeFileSystemsResult(com.amazonaws.services.elasticfilesystem.model.DescribeFileSystemsResult) FileSystemDescription(com.amazonaws.services.elasticfilesystem.model.FileSystemDescription)

Example 5 with CloudEfsAttributes

use of com.sequenceiq.cloudbreak.cloud.model.CloudEfsAttributes in project cloudbreak by hortonworks.

the class AwsEfsResourceBuilder method getResultEfsAttributes.

private CloudEfsAttributes getResultEfsAttributes(CreateFileSystemRequest request, CreateFileSystemResult result, Map<String, CloudEfsAttributes> efsSetMap) {
    CloudEfsAttributes oriEfsAttributes = efsSetMap.getOrDefault(result.getName(), null);
    CloudEfsAttributes resultEfsAttributes = null;
    if (oriEfsAttributes != null) {
        resultEfsAttributes = new CloudEfsAttributes(oriEfsAttributes);
    } else {
        Map<String, String> efsTags = awsTaggingService.convertAwsEfsTags(request.getTags());
        resultEfsAttributes = new CloudEfsAttributes.Builder().withName(result.getName()).withCreationToken(request.getCreationToken()).withTags(efsTags).withPerformanceMode(request.getPerformanceMode()).withThroughputMode(request.getThroughputMode()).withProvisionedThroughputInMibps(request.getProvisionedThroughputInMibps()).withEncrypted(request.getEncrypted()).build();
    }
    resultEfsAttributes.setFileSystemId(result.getFileSystemId());
    resultEfsAttributes.setFileState(LifeCycleState.fromValue(result.getLifeCycleState()));
    return resultEfsAttributes;
}
Also used : CloudEfsAttributes(com.sequenceiq.cloudbreak.cloud.model.CloudEfsAttributes)

Aggregations

CloudEfsAttributes (com.sequenceiq.cloudbreak.cloud.model.CloudEfsAttributes)5 CreateFileSystemRequest (com.amazonaws.services.elasticfilesystem.model.CreateFileSystemRequest)3 DeleteFileSystemRequest (com.amazonaws.services.elasticfilesystem.model.DeleteFileSystemRequest)3 DeleteMountTargetRequest (com.amazonaws.services.elasticfilesystem.model.DeleteMountTargetRequest)3 DescribeFileSystemsRequest (com.amazonaws.services.elasticfilesystem.model.DescribeFileSystemsRequest)3 DescribeFileSystemsResult (com.amazonaws.services.elasticfilesystem.model.DescribeFileSystemsResult)3 DescribeMountTargetsRequest (com.amazonaws.services.elasticfilesystem.model.DescribeMountTargetsRequest)3 DescribeMountTargetsResult (com.amazonaws.services.elasticfilesystem.model.DescribeMountTargetsResult)3 FileSystemDescription (com.amazonaws.services.elasticfilesystem.model.FileSystemDescription)3 MountTargetDescription (com.amazonaws.services.elasticfilesystem.model.MountTargetDescription)3 Tag (com.amazonaws.services.elasticfilesystem.model.Tag)3 AmazonEfsClient (com.sequenceiq.cloudbreak.cloud.aws.common.client.AmazonEfsClient)3 LifeCycleState (com.sequenceiq.cloudbreak.cloud.model.filesystem.efs.LifeCycleState)3 AmazonElasticFileSystemException (com.amazonaws.services.elasticfilesystem.model.AmazonElasticFileSystemException)2 CreateFileSystemResult (com.amazonaws.services.elasticfilesystem.model.CreateFileSystemResult)2 AwsTaggingService (com.sequenceiq.cloudbreak.cloud.aws.common.AwsTaggingService)2 CommonAwsClient (com.sequenceiq.cloudbreak.cloud.aws.common.CommonAwsClient)2 AwsContext (com.sequenceiq.cloudbreak.cloud.aws.common.context.AwsContext)2 AwsCredentialView (com.sequenceiq.cloudbreak.cloud.aws.common.view.AwsCredentialView)2 AuthenticatedContext (com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext)2