mirror of
https://github.com/opentofu/opentofu.git
synced 2025-02-20 11:48:24 -06:00
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.
205 lines
5.7 KiB
Go
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
|
|
}
|