opentofu/builtin/providers/aws/resource_aws_codecommit_repository.go
Hector Rivas Gandara 0c49b17f72 provider/aws: codecommit check default_branch before update
In AWS codecommit the default branch must have a value unless there are
no branches created, in which case it is not possible to set it to any value.

We query the existing branches and do not update the default branch
if there are none defined remotely.

This solves the issue of the initial creation of the repository with a
resource with `default_branch` defined.
2016-03-30 16:40:41 +01:00

205 lines
5.7 KiB
Go

package aws
import (
"fmt"
"log"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/codecommit"
"github.com/hashicorp/terraform/helper/schema"
)
func resourceAwsCodeCommitRepository() *schema.Resource {
return &schema.Resource{
Create: resourceAwsCodeCommitRepositoryCreate,
Update: resourceAwsCodeCommitRepositoryUpdate,
Read: resourceAwsCodeCommitRepositoryRead,
Delete: resourceAwsCodeCommitRepositoryDelete,
Schema: map[string]*schema.Schema{
"repository_name": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) {
value := v.(string)
if len(value) > 100 {
errors = append(errors, fmt.Errorf(
"%q cannot be longer than 100 characters", k))
}
return
},
},
"description": &schema.Schema{
Type: schema.TypeString,
Optional: true,
ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) {
value := v.(string)
if len(value) > 1000 {
errors = append(errors, fmt.Errorf(
"%q cannot be longer than 1000 characters", k))
}
return
},
},
"arn": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"repository_id": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"clone_url_http": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"clone_url_ssh": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"default_branch": &schema.Schema{
Type: schema.TypeString,
Optional: true,
},
},
}
}
func resourceAwsCodeCommitRepositoryCreate(d *schema.ResourceData, meta interface{}) error {
conn := meta.(*AWSClient).codecommitconn
region := meta.(*AWSClient).region
// This is a temporary thing - we need to ensure that CodeCommit is only being run against us-east-1
// As this is the only place that AWS currently supports it
if region != "us-east-1" {
return fmt.Errorf("CodeCommit can only be used with us-east-1. You are trying to use it on %s", region)
}
input := &codecommit.CreateRepositoryInput{
RepositoryName: aws.String(d.Get("repository_name").(string)),
RepositoryDescription: aws.String(d.Get("description").(string)),
}
out, err := conn.CreateRepository(input)
if err != nil {
return fmt.Errorf("Error creating CodeCommit Repository: %s", err)
}
d.SetId(d.Get("repository_name").(string))
d.Set("repository_id", *out.RepositoryMetadata.RepositoryId)
d.Set("arn", *out.RepositoryMetadata.Arn)
d.Set("clone_url_http", *out.RepositoryMetadata.CloneUrlHttp)
d.Set("clone_url_ssh", *out.RepositoryMetadata.CloneUrlSsh)
return resourceAwsCodeCommitRepositoryUpdate(d, meta)
}
func resourceAwsCodeCommitRepositoryUpdate(d *schema.ResourceData, meta interface{}) error {
conn := meta.(*AWSClient).codecommitconn
if _, ok := d.GetOk("default_branch"); ok {
if d.HasChange("default_branch") {
if err := resourceAwsCodeCommitUpdateDefaultBranch(conn, d); err != nil {
return err
}
}
}
if d.HasChange("description") {
if err := resourceAwsCodeCommitUpdateDescription(conn, d); err != nil {
return err
}
}
return resourceAwsCodeCommitRepositoryRead(d, meta)
}
func resourceAwsCodeCommitRepositoryRead(d *schema.ResourceData, meta interface{}) error {
conn := meta.(*AWSClient).codecommitconn
input := &codecommit.GetRepositoryInput{
RepositoryName: aws.String(d.Id()),
}
out, err := conn.GetRepository(input)
if err != nil {
return fmt.Errorf("Error reading CodeCommit Repository: %s", err.Error())
}
d.Set("repository_id", *out.RepositoryMetadata.RepositoryId)
d.Set("arn", *out.RepositoryMetadata.Arn)
d.Set("clone_url_http", *out.RepositoryMetadata.CloneUrlHttp)
d.Set("clone_url_ssh", *out.RepositoryMetadata.CloneUrlSsh)
if _, ok := d.GetOk("default_branch"); ok {
if out.RepositoryMetadata.DefaultBranch != nil {
d.Set("default_branch", *out.RepositoryMetadata.DefaultBranch)
}
}
return nil
}
func resourceAwsCodeCommitRepositoryDelete(d *schema.ResourceData, meta interface{}) error {
conn := meta.(*AWSClient).codecommitconn
log.Printf("[DEBUG] CodeCommit Delete Repository: %s", d.Id())
_, err := conn.DeleteRepository(&codecommit.DeleteRepositoryInput{
RepositoryName: aws.String(d.Id()),
})
if err != nil {
return fmt.Errorf("Error deleting CodeCommit Repository: %s", err.Error())
}
return nil
}
func resourceAwsCodeCommitUpdateDescription(conn *codecommit.CodeCommit, d *schema.ResourceData) error {
branchInput := &codecommit.UpdateRepositoryDescriptionInput{
RepositoryName: aws.String(d.Id()),
RepositoryDescription: aws.String(d.Get("description").(string)),
}
_, err := conn.UpdateRepositoryDescription(branchInput)
if err != nil {
return fmt.Errorf("Error Updating Repository Description for CodeCommit Repository: %s", err.Error())
}
return nil
}
func resourceAwsCodeCommitUpdateDefaultBranch(conn *codecommit.CodeCommit, d *schema.ResourceData) error {
input := &codecommit.ListBranchesInput{
RepositoryName: aws.String(d.Id()),
}
out, err := conn.ListBranches(input)
if err != nil {
return fmt.Errorf("Error reading CodeCommit Repository branches: %s", err.Error())
}
if len(out.Branches) == 0 {
log.Printf("[WARN] Not setting Default Branch CodeCommit Repository that has no branches: %s", d.Id())
return nil
}
branchInput := &codecommit.UpdateDefaultBranchInput{
RepositoryName: aws.String(d.Id()),
DefaultBranchName: aws.String(d.Get("default_branch").(string)),
}
_, err = conn.UpdateDefaultBranch(branchInput)
if err != nil {
return fmt.Errorf("Error Updating Default Branch for CodeCommit Repository: %s", err.Error())
}
return nil
}