Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 30 additions & 28 deletions github/resource_github_issue_label.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,20 @@ package github
import (
"context"
"errors"
"log"
"net/http"

"github.com/hashicorp/terraform-plugin-log/tflog"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/google/go-github/v85/github"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

func resourceGithubIssueLabel() *schema.Resource {
return &schema.Resource{
Create: resourceGithubIssueLabelCreateOrUpdate,
Read: resourceGithubIssueLabelRead,
Update: resourceGithubIssueLabelCreateOrUpdate,
Delete: resourceGithubIssueLabelDelete,
CreateContext: resourceGithubIssueLabelCreateOrUpdate,
ReadContext: resourceGithubIssueLabelRead,
UpdateContext: resourceGithubIssueLabelCreateOrUpdate,
DeleteContext: resourceGithubIssueLabelDelete,
Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},
Expand Down Expand Up @@ -70,7 +71,7 @@ func resourceGithubIssueLabel() *schema.Resource {
// otherwise it will create. This is also advantageous in that we get to use the
// same function for two schema funcs.

func resourceGithubIssueLabelCreateOrUpdate(d *schema.ResourceData, meta any) error {
func resourceGithubIssueLabelCreateOrUpdate(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
client := meta.(*Owner).v3client
orgName := meta.(*Owner).name
repoName := d.Get("repository").(string)
Expand All @@ -81,7 +82,6 @@ func resourceGithubIssueLabelCreateOrUpdate(d *schema.ResourceData, meta any) er
Name: new(name),
Color: new(color),
}
ctx := context.Background()
if !d.IsNewResource() {
ctx = context.WithValue(ctx, ctxId, d.Id())
}
Expand All @@ -95,14 +95,14 @@ func resourceGithubIssueLabelCreateOrUpdate(d *schema.ResourceData, meta any) er
var err error
_, originalName, err = parseTwoPartID(d.Id(), "repository", "name")
if err != nil {
return err
return diag.FromErr(err)
}
}

existing, resp, err := client.Issues.GetLabel(ctx,
orgName, repoName, originalName)
if err != nil && resp.StatusCode != http.StatusNotFound {
return err
return diag.FromErr(err)
}

if existing != nil {
Expand All @@ -117,14 +117,14 @@ func resourceGithubIssueLabelCreateOrUpdate(d *schema.ResourceData, meta any) er
var err error
_, originalName, err = parseTwoPartID(d.Id(), "repository", "name")
if err != nil {
return err
return diag.FromErr(err)
}
}

_, _, err := client.Issues.EditLabel(ctx,
orgName, repoName, originalName, label)
if err != nil {
return err
return diag.FromErr(err)
}
} else {
if v, ok := d.GetOk("description"); ok {
Expand All @@ -134,24 +134,23 @@ func resourceGithubIssueLabelCreateOrUpdate(d *schema.ResourceData, meta any) er
_, _, err := client.Issues.CreateLabel(ctx,
orgName, repoName, label)
if err != nil {
return err
return diag.FromErr(err)
}
}

d.SetId(buildTwoPartID(repoName, name))

return resourceGithubIssueLabelRead(d, meta)
return resourceGithubIssueLabelRead(ctx, d, meta)
}

func resourceGithubIssueLabelRead(d *schema.ResourceData, meta any) error {
func resourceGithubIssueLabelRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
client := meta.(*Owner).v3client
repoName, name, err := parseTwoPartID(d.Id(), "repository", "name")
if err != nil {
return err
return diag.FromErr(err)
}

orgName := meta.(*Owner).name
ctx := context.WithValue(context.Background(), ctxId, d.Id())
if !d.IsNewResource() {
ctx = context.WithValue(ctx, ctxEtag, d.Get("etag").(string))
}
Expand All @@ -165,45 +164,48 @@ func resourceGithubIssueLabelRead(d *schema.ResourceData, meta any) error {
return nil
}
if ghErr.Response.StatusCode == http.StatusNotFound {
log.Printf("[INFO] Removing label %s (%s/%s) from state because it no longer exists in GitHub",
name, orgName, repoName)
tflog.Info(ctx, "Removing label from state because it no longer exists in GitHub", map[string]any{
"name": name,
"org_name": orgName,
"repo_name": repoName,
})
d.SetId("")
return nil
}
}
return err
return diag.FromErr(err)
}

if err = d.Set("etag", resp.Header.Get("ETag")); err != nil {
return err
return diag.FromErr(err)
}
if err = d.Set("repository", repoName); err != nil {
return err
return diag.FromErr(err)
}
if err = d.Set("name", name); err != nil {
return err
return diag.FromErr(err)
}
if err = d.Set("color", githubLabel.GetColor()); err != nil {
return err
return diag.FromErr(err)
}
if err = d.Set("description", githubLabel.GetDescription()); err != nil {
return err
return diag.FromErr(err)
}
if err = d.Set("url", githubLabel.GetURL()); err != nil {
return err
return diag.FromErr(err)
}

return nil
}

func resourceGithubIssueLabelDelete(d *schema.ResourceData, meta any) error {
func resourceGithubIssueLabelDelete(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
client := meta.(*Owner).v3client

orgName := meta.(*Owner).name
repoName := d.Get("repository").(string)
name := d.Get("name").(string)
ctx := context.WithValue(context.Background(), ctxId, d.Id())
ctx = context.WithValue(ctx, ctxId, d.Id())

_, err := client.Issues.DeleteLabel(ctx, orgName, repoName, name)
return handleArchivedRepoDelete(err, "issue label", name, orgName, repoName)
return diag.FromErr(handleArchivedRepoDelete(err, "issue label", name, orgName, repoName))
}