Runtime/Core/ContainerManagement/AmazonECRWrapper.cs (127 lines of code) (raw):

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 using Amazon.ECR; using Amazon.ECR.Model; using AmazonGameLiftPlugin.Core.BucketManagement.Models; using AmazonGameLiftPlugin.Core.ContainerManagement.Models; using AmazonGameLiftPlugin.Core.Shared; using Castle.Core.Internal; using System; using System.Collections.Generic; using System.Linq; using System.Net; using AmazonGameLiftPlugin.Core.Shared.Logging; namespace AmazonGameLiftPlugin.Core.ContainerManagement { public class AmazonECRWrapper : IAmazonECRWrapper { private readonly IAmazonECR _amazonECR; public AmazonECRWrapper(string accessKey, string secretKey, string region) { _amazonECR = new AmazonECRClient( accessKey, secretKey, AwsRegionMapper.GetRegionEndpoint(region) ); } public DescribeECRRepositoriesResponse DescribeECRRepositories(List<string> RepositoryNames = null) { try { List<Repository> rawRepositories = new List<Repository>(); string nextToken = null; do { var request = new DescribeRepositoriesRequest() { RepositoryNames = RepositoryNames.IsNullOrEmpty() ? null : RepositoryNames, NextToken = nextToken }; var response = _amazonECR.DescribeRepositories(request); nextToken = response.NextToken; rawRepositories.AddRange(response.Repositories); } while (!nextToken.IsNullOrEmpty()); return Response.Ok(new DescribeECRRepositoriesResponse() { ECRRepositories = rawRepositories }); } catch (Exception ex) { Logger.LogError(ex, ex.Message); return HandleAwsException(ex, () => new DescribeECRRepositoriesResponse()); } } public ListECRImagesResponse ListECRImages(string repositoryName) { try { List<ImageIdentifier> rawImageIds = new List<ImageIdentifier>(); string nextToken = null; do { var request = new ListImagesRequest() { RepositoryName = repositoryName, NextToken = nextToken }; var response = _amazonECR.ListImages(request); nextToken = response.NextToken; rawImageIds.AddRange(response.ImageIds); } while (!nextToken.IsNullOrEmpty()); return Response.Ok(new ListECRImagesResponse() { ECRImages = rawImageIds.Select(image => new ECRImage() { ImageTag = image.ImageTag, ImageDigest = image.ImageDigest }) }); } catch (Exception ex) { Logger.LogError(ex, ex.Message); return HandleAwsException(ex, () => new ListECRImagesResponse()); } } public CreateECRRepositoryResponse CreateRepository(string repositoryName) { var request = new CreateRepositoryRequest() { RepositoryName = repositoryName }; try { var response = _amazonECR.CreateRepository(request); if (response.HttpStatusCode != HttpStatusCode.OK) { return Response.Fail(new CreateECRRepositoryResponse() { ErrorCode = ErrorCode.AwsError, ErrorMessage = $"HTTP Status Code {response.HttpStatusCode}" }); } return Response.Ok(new CreateECRRepositoryResponse() { RepositoryUri = response.Repository.RepositoryUri }); } catch (Exception ex) { Logger.LogError(ex, ex.Message); return HandleAwsException(ex, () => new CreateECRRepositoryResponse()); } } private T HandleAwsException<T>(Exception ex, Func<T> responseObject) where T : Response { T response = responseObject(); if (ex is AmazonECRException exception) { response.ErrorCode = ErrorCode.AwsError; response.ErrorMessage = exception.Message; } else if (ex is WebException || ex is ArgumentNullException) { response.ErrorCode = ErrorCode.AwsError; response.ErrorMessage = ex.Message; } else { throw ex; } return Response.Fail(response); } } }