Skip to content

Commit db08cbb

Browse files
authored
Merge pull request #1052 from leonardobiffi/feature/add-name-badge
add badge name
2 parents 2f5031d + 38e1d42 commit db08cbb

File tree

4 files changed

+72
-120
lines changed

4 files changed

+72
-120
lines changed

docs/resources/project_badge.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ resource "gitlab_project_badge" "example" {
2424
project = gitlab_project.foo.id
2525
link_url = "https://example.com/badge-123"
2626
image_url = "https://example.com/badge-123.svg"
27+
name = "badge-123"
2728
}
2829
```
2930

@@ -39,6 +40,7 @@ resource "gitlab_project_badge" "example" {
3940
### Optional
4041

4142
- `id` (String) The ID of this resource.
43+
- `name` (String) The name of the badge.
4244

4345
### Read-Only
4446

examples/resources/gitlab_project_badge/resource.tf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ resource "gitlab_project_badge" "example" {
66
project = gitlab_project.foo.id
77
link_url = "https://example.com/badge-123"
88
image_url = "https://example.com/badge-123.svg"
9+
name = "badge-123"
910
}

internal/provider/resource_gitlab_project_badge.go

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package provider
22

33
import (
44
"context"
5+
"fmt"
56
"log"
67
"strconv"
78
"strings"
@@ -41,6 +42,11 @@ var _ = registerResource("gitlab_project_badge", func() *schema.Resource {
4142
Type: schema.TypeString,
4243
Required: true,
4344
},
45+
"name": {
46+
Description: "The name of the badge.",
47+
Type: schema.TypeString,
48+
Optional: true,
49+
},
4450
"rendered_link_url": {
4551
Description: "The link_url argument rendered (in case of use of placeholders).",
4652
Type: schema.TypeString,
@@ -61,6 +67,7 @@ func resourceGitlabProjectBadgeCreate(ctx context.Context, d *schema.ResourceDat
6167
options := &gitlab.AddProjectBadgeOptions{
6268
LinkURL: gitlab.String(d.Get("link_url").(string)),
6369
ImageURL: gitlab.String(d.Get("image_url").(string)),
70+
Name: gitlab.String(d.Get("name").(string)),
6471
}
6572

6673
log.Printf("[DEBUG] create gitlab project badge %q / %q", *options.LinkURL, *options.ImageURL)
@@ -79,9 +86,7 @@ func resourceGitlabProjectBadgeCreate(ctx context.Context, d *schema.ResourceDat
7986

8087
func resourceGitlabProjectBadgeRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
8188
client := meta.(*gitlab.Client)
82-
ids := strings.Split(d.Id(), ":")
83-
projectID := ids[0]
84-
badgeID, err := strconv.Atoi(ids[1])
89+
projectID, badgeID, err := resourceGitlabProjectBadgeParseID(d.Id())
8590
if err != nil {
8691
return diag.FromErr(err)
8792
}
@@ -104,16 +109,15 @@ func resourceGitlabProjectBadgeRead(ctx context.Context, d *schema.ResourceData,
104109

105110
func resourceGitlabProjectBadgeUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
106111
client := meta.(*gitlab.Client)
107-
ids := strings.Split(d.Id(), ":")
108-
projectID := ids[0]
109-
badgeID, err := strconv.Atoi(ids[1])
112+
projectID, badgeID, err := resourceGitlabProjectBadgeParseID(d.Id())
110113
if err != nil {
111114
return diag.FromErr(err)
112115
}
113116

114117
options := &gitlab.EditProjectBadgeOptions{
115118
LinkURL: gitlab.String(d.Get("link_url").(string)),
116119
ImageURL: gitlab.String(d.Get("image_url").(string)),
120+
Name: gitlab.String(d.Get("name").(string)),
117121
}
118122

119123
log.Printf("[DEBUG] update gitlab project badge %s/%d", projectID, badgeID)
@@ -128,9 +132,7 @@ func resourceGitlabProjectBadgeUpdate(ctx context.Context, d *schema.ResourceDat
128132

129133
func resourceGitlabProjectBadgeDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
130134
client := meta.(*gitlab.Client)
131-
ids := strings.Split(d.Id(), ":")
132-
projectID := ids[0]
133-
badgeID, err := strconv.Atoi(ids[1])
135+
projectID, badgeID, err := resourceGitlabProjectBadgeParseID(d.Id())
134136
if err != nil {
135137
return diag.FromErr(err)
136138
}
@@ -148,7 +150,21 @@ func resourceGitlabProjectBadgeDelete(ctx context.Context, d *schema.ResourceDat
148150
func resourceGitlabProjectBadgeSetToState(d *schema.ResourceData, badge *gitlab.ProjectBadge, projectID *string) {
149151
d.Set("link_url", badge.LinkURL)
150152
d.Set("image_url", badge.ImageURL)
153+
d.Set("name", badge.Name)
151154
d.Set("rendered_link_url", badge.RenderedLinkURL)
152155
d.Set("rendered_image_url", badge.RenderedImageURL)
153156
d.Set("project", projectID)
154157
}
158+
159+
func resourceGitlabProjectBadgeParseID(id string) (string, int, error) {
160+
ids := strings.Split(id, ":")
161+
if len(ids) != 2 {
162+
return "", 0, fmt.Errorf("unexpected format of ID (%s), expected 'project:badge_id'", id)
163+
}
164+
projectID := ids[0]
165+
badgeID, err := strconv.Atoi(ids[1])
166+
if err != nil {
167+
return "", 0, fmt.Errorf("unexpected format of ID (%s), expected 'project:badge_id'", id)
168+
}
169+
return projectID, badgeID, nil
170+
}

internal/provider/resource_gitlab_project_badge_test.go

Lines changed: 44 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -2,159 +2,92 @@ package provider
22

33
import (
44
"fmt"
5-
"strconv"
6-
"strings"
75
"testing"
86

9-
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
107
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
118
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
12-
"github.com/xanzy/go-gitlab"
139
)
1410

1511
func TestAccGitlabProjectBadge_basic(t *testing.T) {
16-
var badge gitlab.ProjectBadge
17-
rInt := acctest.RandInt()
12+
testAccCheck(t)
13+
14+
testProject := testAccCreateProject(t)
1815

1916
resource.Test(t, resource.TestCase{
2017
PreCheck: func() { testAccPreCheck(t) },
2118
ProviderFactories: providerFactories,
2219
CheckDestroy: testAccCheckGitlabProjectBadgeDestroy,
2320
Steps: []resource.TestStep{
24-
// Create a project and badge
21+
// Create a project badge
2522
{
26-
Config: testAccGitlabProjectBadgeConfig(rInt),
23+
Config: fmt.Sprintf(`
24+
resource "gitlab_project_badge" "this" {
25+
project = "%d"
26+
link_url = "https://example.com/badge"
27+
image_url = "https://example.com/badge.svg"
28+
name = "badge"
29+
}
30+
`, testProject.ID),
2731
Check: resource.ComposeTestCheckFunc(
28-
testAccCheckGitlabProjectBadgeExists("gitlab_project_badge.foo", &badge),
29-
testAccCheckGitlabProjectBadgeAttributes(&badge, &testAccGitlabProjectBadgeExpectedAttributes{
30-
LinkURL: fmt.Sprintf("https://example.com/badge-%d", rInt),
31-
ImageURL: fmt.Sprintf("https://example.com/badge-%d.svg", rInt),
32-
}),
32+
resource.TestCheckResourceAttrSet("gitlab_project_badge.this", "rendered_link_url"),
33+
resource.TestCheckResourceAttrSet("gitlab_project_badge.this", "rendered_image_url"),
3334
),
3435
},
35-
// Test ImportState
36+
// Verify Import
3637
{
37-
ResourceName: "gitlab_project_badge.foo",
38+
ResourceName: "gitlab_project_badge.this",
3839
ImportState: true,
3940
ImportStateVerify: true,
4041
},
4142
// Update the project badge
4243
{
43-
Config: testAccGitlabProjectBadgeUpdateConfig(rInt),
44+
Config: fmt.Sprintf(`
45+
resource "gitlab_project_badge" "this" {
46+
project = "%d"
47+
link_url = "https://example.com/badge-updated"
48+
image_url = "https://example.com/badge-updated.svg"
49+
name = "badge-updated"
50+
}
51+
`, testProject.ID),
4452
Check: resource.ComposeTestCheckFunc(
45-
testAccCheckGitlabProjectBadgeExists("gitlab_project_badge.foo", &badge),
46-
testAccCheckGitlabProjectBadgeAttributes(&badge, &testAccGitlabProjectBadgeExpectedAttributes{
47-
LinkURL: fmt.Sprintf("https://example.com/badge-%d", rInt),
48-
ImageURL: fmt.Sprintf("https://example.com/badge-%d.svg", rInt),
49-
}),
53+
resource.TestCheckResourceAttrSet("gitlab_project_badge.this", "rendered_link_url"),
54+
resource.TestCheckResourceAttrSet("gitlab_project_badge.this", "rendered_image_url"),
5055
),
5156
},
57+
// Verify Import
58+
{
59+
ResourceName: "gitlab_project_badge.this",
60+
ImportState: true,
61+
ImportStateVerify: true,
62+
},
5263
},
5364
})
5465
}
5566

56-
func testAccCheckGitlabProjectBadgeExists(n string, badge *gitlab.ProjectBadge) resource.TestCheckFunc {
57-
return func(s *terraform.State) error {
58-
rs, ok := s.RootModule().Resources[n]
59-
if !ok {
60-
return fmt.Errorf("Not Found: %s", n)
67+
func testAccCheckGitlabProjectBadgeDestroy(s *terraform.State) error {
68+
for _, rs := range s.RootModule().Resources {
69+
if rs.Type != "gitlab_project_badge" {
70+
continue
6171
}
6272

63-
splitID := strings.Split(rs.Primary.ID, ":")
64-
65-
badgeID, err := strconv.Atoi(splitID[len(splitID)-1])
73+
projectID, badgeID, err := resourceGitlabProjectBadgeParseID(rs.Primary.ID)
6674
if err != nil {
6775
return err
6876
}
69-
repoName := rs.Primary.Attributes["project"]
70-
if repoName == "" {
71-
return fmt.Errorf("No project ID is set")
72-
}
7377

74-
gotBadge, _, err := testGitlabClient.ProjectBadges.GetProjectBadge(repoName, badgeID)
78+
gotBadge, _, err := testGitlabClient.ProjectBadges.GetProjectBadge(projectID, badgeID)
7579
if err != nil {
76-
return err
77-
}
78-
*badge = *gotBadge
79-
return nil
80-
}
81-
}
82-
83-
type testAccGitlabProjectBadgeExpectedAttributes struct {
84-
LinkURL string
85-
ImageURL string
86-
}
87-
88-
func testAccCheckGitlabProjectBadgeAttributes(badge *gitlab.ProjectBadge, want *testAccGitlabProjectBadgeExpectedAttributes) resource.TestCheckFunc {
89-
return func(s *terraform.State) error {
90-
if badge.LinkURL != want.LinkURL {
91-
return fmt.Errorf("got link_url %q; want %q", badge.LinkURL, want.LinkURL)
92-
}
93-
94-
if badge.ImageURL != want.ImageURL {
95-
return fmt.Errorf("got image_url %s; want %s", badge.ImageURL, want.ImageURL)
80+
if !is404(err) {
81+
return err
82+
}
83+
return nil
9684
}
9785

98-
return nil
99-
}
100-
}
101-
102-
func testAccCheckGitlabProjectBadgeDestroy(s *terraform.State) error {
103-
for _, rs := range s.RootModule().Resources {
104-
if rs.Type != "gitlab_project" {
105-
continue
86+
if gotBadge != nil {
87+
return fmt.Errorf("Badge still exists")
10688
}
10789

108-
gotRepo, resp, err := testGitlabClient.Projects.GetProject(rs.Primary.ID, nil)
109-
if err == nil {
110-
if gotRepo != nil && fmt.Sprintf("%d", gotRepo.ID) == rs.Primary.ID {
111-
if gotRepo.MarkedForDeletionAt == nil {
112-
return fmt.Errorf("Repository still exists")
113-
}
114-
}
115-
}
116-
if resp.StatusCode != 404 {
117-
return err
118-
}
11990
return nil
12091
}
12192
return nil
12293
}
123-
124-
func testAccGitlabProjectBadgeConfig(rInt int) string {
125-
return fmt.Sprintf(`
126-
resource "gitlab_project" "foo" {
127-
name = "foo-%d"
128-
description = "Terraform acceptance tests"
129-
130-
# So that acceptance tests can be run in a gitlab organization
131-
# with no billing
132-
visibility_level = "public"
133-
}
134-
135-
resource "gitlab_project_badge" "foo" {
136-
project = "${gitlab_project.foo.id}"
137-
link_url = "https://example.com/badge-%d"
138-
image_url = "https://example.com/badge-%d.svg"
139-
}
140-
`, rInt, rInt, rInt)
141-
}
142-
143-
func testAccGitlabProjectBadgeUpdateConfig(rInt int) string {
144-
return fmt.Sprintf(`
145-
resource "gitlab_project" "foo" {
146-
name = "foo-%d"
147-
description = "Terraform acceptance tests"
148-
149-
# So that acceptance tests can be run in a gitlab organization
150-
# with no billing
151-
visibility_level = "public"
152-
}
153-
154-
resource "gitlab_project_badge" "foo" {
155-
project = "${gitlab_project.foo.id}"
156-
link_url = "https://example.com/badge-%d"
157-
image_url = "https://example.com/badge-%d.svg"
158-
}
159-
`, rInt, rInt, rInt)
160-
}

0 commit comments

Comments
 (0)