github.com/in4it/ecs-deploy@v0.0.42-0.20240508120354-ed77ff16df25/provider/ecs/ecr.go (about)

     1  package ecs
     2  
     3  import (
     4  	"strconv"
     5  
     6  	"github.com/aws/aws-sdk-go/aws"
     7  	"github.com/aws/aws-sdk-go/aws/awserr"
     8  	"github.com/aws/aws-sdk-go/aws/session"
     9  	"github.com/aws/aws-sdk-go/service/ecr"
    10  	"github.com/in4it/ecs-deploy/util"
    11  	"github.com/juju/loggo"
    12  )
    13  
    14  // logging
    15  var ecrLogger = loggo.GetLogger("ecr")
    16  
    17  // ECR struct
    18  type ECR struct {
    19  	RepositoryName, RepositoryURI string
    20  }
    21  
    22  // Creates ECR repository
    23  func (e *ECR) CreateRepository() error {
    24  	scanOnPush, err := strconv.ParseBool(util.GetEnv("ECR_SCAN_ON_PUSH", "false"))
    25  	if err != nil {
    26  		ecrLogger.Errorf(err.Error())
    27  		scanOnPush = false
    28  	}
    29  	svc := ecr.New(session.New())
    30  	input := &ecr.CreateRepositoryInput{
    31  		RepositoryName: aws.String(e.RepositoryName),
    32  		ImageScanningConfiguration: &ecr.ImageScanningConfiguration{
    33  			ScanOnPush: aws.Bool(scanOnPush),
    34  		},
    35  	}
    36  
    37  	res, err := svc.CreateRepository(input)
    38  	if err == nil && res.Repository.RepositoryUri != nil {
    39  		e.RepositoryURI = *res.Repository.RepositoryUri
    40  
    41  		lifecyclePolicyText := `{
    42  			"rules": [
    43  				{
    44  					"rulePriority": 10,
    45  					"description": "cleanup",
    46  					"selection": {
    47  						"tagStatus": "any",
    48  						"countType": "imageCountMoreThan",
    49  						"countNumber": 100
    50  					},
    51  					"action": {
    52  						"type": "expire"
    53  					}
    54  				}
    55  			]
    56  		}`
    57  
    58  		lifecycleInput := &ecr.PutLifecyclePolicyInput{
    59  			RepositoryName:      aws.String(e.RepositoryName),
    60  			LifecyclePolicyText: aws.String(lifecyclePolicyText),
    61  			RegistryId:          aws.String(*res.Repository.RegistryId),
    62  		}
    63  
    64  		_, err := svc.PutLifecyclePolicy(lifecycleInput)
    65  		return err
    66  	} else {
    67  		return err
    68  	}
    69  }
    70  func (e *ECR) ListImagesWithTag(repositoryName string) (map[string]string, error) {
    71  	svc := ecr.New(session.New())
    72  
    73  	images := make(map[string]string)
    74  
    75  	input := &ecr.ListImagesInput{
    76  		RepositoryName: aws.String(repositoryName),
    77  	}
    78  
    79  	pageNum := 0
    80  	err := svc.ListImagesPages(input,
    81  		func(page *ecr.ListImagesOutput, lastPage bool) bool {
    82  			pageNum++
    83  			for _, image := range page.ImageIds {
    84  				if image.ImageTag != nil {
    85  					images[*image.ImageTag] = *image.ImageDigest
    86  				}
    87  			}
    88  			return pageNum <= 100
    89  		})
    90  
    91  	if err != nil {
    92  		if aerr, ok := err.(awserr.Error); ok {
    93  			ecrLogger.Errorf(aerr.Error())
    94  		} else {
    95  			ecrLogger.Errorf(err.Error())
    96  		}
    97  		return images, err
    98  	}
    99  	return images, nil
   100  }
   101  
   102  func (e *ECR) RepositoryExists(repositoryName string) (bool, error) {
   103  	svc := ecr.New(session.New())
   104  
   105  	var exists bool
   106  
   107  	input := &ecr.DescribeRepositoriesInput{
   108  		RepositoryNames: aws.StringSlice([]string{repositoryName}),
   109  	}
   110  
   111  	pageNum := 0
   112  	err := svc.DescribeRepositoriesPages(input,
   113  		func(page *ecr.DescribeRepositoriesOutput, lastPage bool) bool {
   114  			pageNum++
   115  			if len(page.Repositories) > 0 {
   116  				exists = true
   117  			}
   118  			return pageNum <= 100
   119  		})
   120  
   121  	if err != nil {
   122  		if aerr, ok := err.(awserr.Error); ok {
   123  			switch aerr.Code() {
   124  			case ecr.ErrCodeRepositoryNotFoundException:
   125  				return false, nil
   126  			default:
   127  				ecrLogger.Errorf(aerr.Error())
   128  			}
   129  		} else {
   130  			ecrLogger.Errorf(err.Error())
   131  		}
   132  		return exists, err
   133  	}
   134  	return exists, nil
   135  }