github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/aws/resource_aws_ecr_repository.go (about) 1 package aws 2 3 import ( 4 "log" 5 "time" 6 7 "fmt" 8 9 "github.com/aws/aws-sdk-go/aws" 10 "github.com/aws/aws-sdk-go/aws/awserr" 11 "github.com/aws/aws-sdk-go/service/ecr" 12 "github.com/hashicorp/terraform/helper/resource" 13 "github.com/hashicorp/terraform/helper/schema" 14 ) 15 16 func resourceAwsEcrRepository() *schema.Resource { 17 return &schema.Resource{ 18 Create: resourceAwsEcrRepositoryCreate, 19 Read: resourceAwsEcrRepositoryRead, 20 Delete: resourceAwsEcrRepositoryDelete, 21 Importer: &schema.ResourceImporter{ 22 State: schema.ImportStatePassthrough, 23 }, 24 25 Schema: map[string]*schema.Schema{ 26 "name": &schema.Schema{ 27 Type: schema.TypeString, 28 Required: true, 29 ForceNew: true, 30 }, 31 "arn": &schema.Schema{ 32 Type: schema.TypeString, 33 Computed: true, 34 }, 35 "registry_id": &schema.Schema{ 36 Type: schema.TypeString, 37 Computed: true, 38 }, 39 "repository_url": &schema.Schema{ 40 Type: schema.TypeString, 41 Computed: true, 42 }, 43 }, 44 } 45 } 46 47 func resourceAwsEcrRepositoryCreate(d *schema.ResourceData, meta interface{}) error { 48 conn := meta.(*AWSClient).ecrconn 49 50 input := ecr.CreateRepositoryInput{ 51 RepositoryName: aws.String(d.Get("name").(string)), 52 } 53 54 log.Printf("[DEBUG] Creating ECR resository: %s", input) 55 out, err := conn.CreateRepository(&input) 56 if err != nil { 57 return err 58 } 59 60 repository := *out.Repository 61 62 log.Printf("[DEBUG] ECR repository created: %q", *repository.RepositoryArn) 63 64 d.SetId(*repository.RepositoryName) 65 d.Set("arn", repository.RepositoryArn) 66 d.Set("registry_id", repository.RegistryId) 67 68 return resourceAwsEcrRepositoryRead(d, meta) 69 } 70 71 func resourceAwsEcrRepositoryRead(d *schema.ResourceData, meta interface{}) error { 72 conn := meta.(*AWSClient).ecrconn 73 74 log.Printf("[DEBUG] Reading repository %s", d.Id()) 75 out, err := conn.DescribeRepositories(&ecr.DescribeRepositoriesInput{ 76 RepositoryNames: []*string{aws.String(d.Id())}, 77 }) 78 if err != nil { 79 if ecrerr, ok := err.(awserr.Error); ok && ecrerr.Code() == "RepositoryNotFoundException" { 80 d.SetId("") 81 return nil 82 } 83 return err 84 } 85 86 repository := out.Repositories[0] 87 88 log.Printf("[DEBUG] Received repository %s", out) 89 90 d.SetId(*repository.RepositoryName) 91 d.Set("arn", repository.RepositoryArn) 92 d.Set("registry_id", repository.RegistryId) 93 d.Set("name", repository.RepositoryName) 94 95 repositoryUrl := buildRepositoryUrl(repository, meta.(*AWSClient).region) 96 log.Printf("[INFO] Setting the repository url to be %s", repositoryUrl) 97 d.Set("repository_url", repositoryUrl) 98 99 return nil 100 } 101 102 func buildRepositoryUrl(repo *ecr.Repository, region string) string { 103 return fmt.Sprintf("%s.dkr.ecr.%s.amazonaws.com/%s", *repo.RegistryId, region, *repo.RepositoryName) 104 } 105 106 func resourceAwsEcrRepositoryDelete(d *schema.ResourceData, meta interface{}) error { 107 conn := meta.(*AWSClient).ecrconn 108 109 _, err := conn.DeleteRepository(&ecr.DeleteRepositoryInput{ 110 RepositoryName: aws.String(d.Id()), 111 RegistryId: aws.String(d.Get("registry_id").(string)), 112 Force: aws.Bool(true), 113 }) 114 if err != nil { 115 if ecrerr, ok := err.(awserr.Error); ok && ecrerr.Code() == "RepositoryNotFoundException" { 116 d.SetId("") 117 return nil 118 } 119 return err 120 } 121 122 log.Printf("[DEBUG] Waiting for ECR Repository %q to be deleted", d.Id()) 123 err = resource.Retry(20*time.Minute, func() *resource.RetryError { 124 _, err := conn.DescribeRepositories(&ecr.DescribeRepositoriesInput{ 125 RepositoryNames: []*string{aws.String(d.Id())}, 126 }) 127 128 if err != nil { 129 awsErr, ok := err.(awserr.Error) 130 if !ok { 131 return resource.NonRetryableError(err) 132 } 133 134 if awsErr.Code() == "RepositoryNotFoundException" { 135 return nil 136 } 137 138 return resource.NonRetryableError(err) 139 } 140 141 return resource.RetryableError( 142 fmt.Errorf("%q: Timeout while waiting for the ECR Repository to be deleted", d.Id())) 143 }) 144 if err != nil { 145 return err 146 } 147 148 d.SetId("") 149 log.Printf("[DEBUG] repository %q deleted.", d.Get("name").(string)) 150 151 return nil 152 }