Skip to content

Commit beca488

Browse files
committed
Enable repository rename
Signed-off-by: Timo Sand <timo.sand@f-secure.com>
1 parent ce1a026 commit beca488

2 files changed

Lines changed: 113 additions & 5 deletions

File tree

github/resource_github_repository_autolink_reference.go

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
func resourceGithubRepositoryAutolinkReference() *schema.Resource {
2020
return &schema.Resource{
2121
CreateContext: resourceGithubRepositoryAutolinkReferenceCreate,
22+
UpdateContext: resourceGithubRepositoryAutolinkReferenceUpdate,
2223
ReadContext: resourceGithubRepositoryAutolinkReferenceRead,
2324
DeleteContext: resourceGithubRepositoryAutolinkReferenceDelete,
2425

@@ -32,15 +33,15 @@ func resourceGithubRepositoryAutolinkReference() *schema.Resource {
3233
repository := parts[0]
3334
id := parts[1]
3435

36+
client := meta.(*Owner).v3client
37+
owner := meta.(*Owner).name
38+
3539
// If the second part of the provided ID isn't an integer, assume that the
3640
// caller provided the key prefix for the autolink reference, and look up
3741
// the autolink by the key prefix.
3842

3943
_, err := strconv.Atoi(id)
4044
if err != nil {
41-
client := meta.(*Owner).v3client
42-
owner := meta.(*Owner).name
43-
4445
autolink, err := getAutolinkByKeyPrefix(ctx, client, owner, repository, id)
4546
if err != nil {
4647
return nil, err
@@ -49,22 +50,38 @@ func resourceGithubRepositoryAutolinkReference() *schema.Resource {
4950
id = strconv.FormatInt(*autolink.ID, 10)
5051
}
5152

53+
d.SetId(id)
54+
55+
repo, _, err := client.Repositories.Get(ctx, owner, repository)
56+
if err != nil {
57+
return nil, fmt.Errorf("failed to retrieve repository %s: %w", repository, err)
58+
}
59+
5260
if err = d.Set("repository", repository); err != nil {
5361
return nil, err
5462
}
55-
d.SetId(id)
63+
if err = d.Set("repository_id", int(repo.GetID())); err != nil {
64+
return nil, err
65+
}
66+
5667
return []*schema.ResourceData{d}, nil
5768
},
5869
},
5970

71+
CustomizeDiff: diffRepository,
72+
6073
SchemaVersion: 1,
6174
Schema: map[string]*schema.Schema{
6275
"repository": {
6376
Type: schema.TypeString,
6477
Required: true,
65-
ForceNew: true,
6678
Description: "The repository name",
6779
},
80+
"repository_id": {
81+
Type: schema.TypeInt,
82+
Computed: true,
83+
Description: "The ID of the GitHub repository.",
84+
},
6885
"key_prefix": {
6986
Type: schema.TypeString,
7087
Required: true,
@@ -115,6 +132,15 @@ func resourceGithubRepositoryAutolinkReferenceCreate(ctx context.Context, d *sch
115132
}
116133
d.SetId(strconv.FormatInt(autolinkRef.GetID(), 10))
117134

135+
repo, _, err := client.Repositories.Get(ctx, owner, repoName)
136+
if err != nil {
137+
return diag.FromErr(err)
138+
}
139+
140+
if err := d.Set("repository_id", int(repo.GetID())); err != nil {
141+
return diag.FromErr(err)
142+
}
143+
118144
return resourceGithubRepositoryAutolinkReferenceRead(ctx, d, m)
119145
}
120146

@@ -168,6 +194,15 @@ func resourceGithubRepositoryAutolinkReferenceRead(ctx context.Context, d *schem
168194
return nil
169195
}
170196

197+
func resourceGithubRepositoryAutolinkReferenceUpdate(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics {
198+
tflog.Warn(ctx, "Update function of autolink reference. This should not be called. But it's necessary when 'repository' doesn't have `ForceNew`", map[string]any{
199+
"repository": d.Get("repository"),
200+
"repository_id": d.Get("repository_id"),
201+
"id": d.Id(),
202+
})
203+
return nil
204+
}
205+
171206
func resourceGithubRepositoryAutolinkReferenceDelete(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics {
172207
ctx = tflog.SetField(ctx, "id", d.Id())
173208

github/resource_github_repository_autolink_reference_test.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@ import (
55
"regexp"
66
"testing"
77

8+
"github.com/hashicorp/terraform-plugin-testing/compare"
89
"github.com/hashicorp/terraform-plugin-testing/helper/acctest"
910
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
11+
"github.com/hashicorp/terraform-plugin-testing/knownvalue"
12+
"github.com/hashicorp/terraform-plugin-testing/plancheck"
13+
"github.com/hashicorp/terraform-plugin-testing/statecheck"
14+
"github.com/hashicorp/terraform-plugin-testing/tfjsonpath"
1015
)
1116

1217
func TestAccGithubRepositoryAutolinkReference(t *testing.T) {
@@ -61,6 +66,9 @@ func TestAccGithubRepositoryAutolinkReference(t *testing.T) {
6166
resource.TestCheckResourceAttr(
6267
"github_repository_autolink_reference.autolink_default", "is_alphanumeric", "true",
6368
),
69+
resource.TestCheckResourceAttrSet(
70+
"github_repository_autolink_reference.autolink_default", "repository_id",
71+
),
6472
// autolink_alphanumeric
6573
resource.TestCheckResourceAttr(
6674
"github_repository_autolink_reference.autolink_alphanumeric", "key_prefix", "TEST2-",
@@ -71,6 +79,9 @@ func TestAccGithubRepositoryAutolinkReference(t *testing.T) {
7179
resource.TestCheckResourceAttr(
7280
"github_repository_autolink_reference.autolink_alphanumeric", "is_alphanumeric", "true",
7381
),
82+
resource.TestCheckResourceAttrSet(
83+
"github_repository_autolink_reference.autolink_alphanumeric", "repository_id",
84+
),
7485
// autolink_numeric
7586
resource.TestCheckResourceAttr(
7687
"github_repository_autolink_reference.autolink_numeric", "key_prefix", "TEST3-",
@@ -81,6 +92,9 @@ func TestAccGithubRepositoryAutolinkReference(t *testing.T) {
8192
resource.TestCheckResourceAttr(
8293
"github_repository_autolink_reference.autolink_numeric", "is_alphanumeric", "false",
8394
),
95+
resource.TestCheckResourceAttrSet(
96+
"github_repository_autolink_reference.autolink_numeric", "repository_id",
97+
),
8498
// autolink_with_port
8599
resource.TestCheckResourceAttr(
86100
"github_repository_autolink_reference.autolink_with_port", "key_prefix", "TEST4-",
@@ -91,6 +105,9 @@ func TestAccGithubRepositoryAutolinkReference(t *testing.T) {
91105
resource.TestCheckResourceAttr(
92106
"github_repository_autolink_reference.autolink_with_port", "is_alphanumeric", "true",
93107
),
108+
resource.TestCheckResourceAttrSet(
109+
"github_repository_autolink_reference.autolink_with_port", "repository_id",
110+
),
94111
)
95112

96113
resource.Test(t, resource.TestCase{
@@ -156,6 +173,9 @@ func TestAccGithubRepositoryAutolinkReference(t *testing.T) {
156173
resource.TestCheckResourceAttr(
157174
"github_repository_autolink_reference.autolink_default", "is_alphanumeric", "true",
158175
),
176+
resource.TestCheckResourceAttrSet(
177+
"github_repository_autolink_reference.autolink_default", "repository_id",
178+
),
159179
// autolink_alphanumeric
160180
resource.TestCheckResourceAttr(
161181
"github_repository_autolink_reference.autolink_alphanumeric", "key_prefix", "TEST2-",
@@ -166,6 +186,9 @@ func TestAccGithubRepositoryAutolinkReference(t *testing.T) {
166186
resource.TestCheckResourceAttr(
167187
"github_repository_autolink_reference.autolink_alphanumeric", "is_alphanumeric", "true",
168188
),
189+
resource.TestCheckResourceAttrSet(
190+
"github_repository_autolink_reference.autolink_alphanumeric", "repository_id",
191+
),
169192
// autolink_numeric
170193
resource.TestCheckResourceAttr(
171194
"github_repository_autolink_reference.autolink_numeric", "key_prefix", "TEST3-",
@@ -176,6 +199,9 @@ func TestAccGithubRepositoryAutolinkReference(t *testing.T) {
176199
resource.TestCheckResourceAttr(
177200
"github_repository_autolink_reference.autolink_numeric", "is_alphanumeric", "false",
178201
),
202+
resource.TestCheckResourceAttrSet(
203+
"github_repository_autolink_reference.autolink_numeric", "repository_id",
204+
),
179205
// autolink_with_port
180206
resource.TestCheckResourceAttr(
181207
"github_repository_autolink_reference.autolink_with_port", "key_prefix", "TEST4-",
@@ -186,6 +212,9 @@ func TestAccGithubRepositoryAutolinkReference(t *testing.T) {
186212
resource.TestCheckResourceAttr(
187213
"github_repository_autolink_reference.autolink_with_port", "is_alphanumeric", "true",
188214
),
215+
resource.TestCheckResourceAttrSet(
216+
"github_repository_autolink_reference.autolink_with_port", "repository_id",
217+
),
189218
)
190219

191220
resource.Test(t, resource.TestCase{
@@ -296,4 +325,48 @@ func TestAccGithubRepositoryAutolinkReference(t *testing.T) {
296325
},
297326
})
298327
})
328+
t.Run("should not recreate autolink reference when repository is renamed", func(t *testing.T) {
329+
randomID := acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum)
330+
repoName := fmt.Sprintf("%srepo-rename-%s", testResourcePrefix, randomID)
331+
repoNameRenamed := fmt.Sprintf("%srepo-renamed-%s", testResourcePrefix, randomID)
332+
const configStr = `
333+
resource "github_repository" "test" {
334+
name = "%s"
335+
description = "Test autolink creation"
336+
}
337+
338+
resource "github_repository_autolink_reference" "autolink_default" {
339+
repository = github_repository.test.name
340+
341+
key_prefix = "TEST1-"
342+
target_url_template = "https://example.com/TEST-<num>"
343+
}
344+
`
345+
346+
repoIdChangeCheck := statecheck.CompareValue(compare.ValuesSame())
347+
resource.Test(t, resource.TestCase{
348+
PreCheck: func() { skipUnauthenticated(t) },
349+
ProviderFactories: providerFactories,
350+
Steps: []resource.TestStep{
351+
{
352+
Config: fmt.Sprintf(configStr, repoName),
353+
ConfigStateChecks: []statecheck.StateCheck{
354+
repoIdChangeCheck.AddStateValue("github_repository_autolink_reference.autolink_default", tfjsonpath.New("repository_id")),
355+
},
356+
},
357+
{
358+
Config: fmt.Sprintf(configStr, repoNameRenamed),
359+
ConfigPlanChecks: resource.ConfigPlanChecks{
360+
PreApply: []plancheck.PlanCheck{
361+
plancheck.ExpectResourceAction("github_repository_autolink_reference.autolink_default", plancheck.ResourceActionUpdate),
362+
},
363+
},
364+
ConfigStateChecks: []statecheck.StateCheck{
365+
repoIdChangeCheck.AddStateValue("github_repository_autolink_reference.autolink_default", tfjsonpath.New("repository_id")),
366+
statecheck.ExpectKnownValue("github_repository_autolink_reference.autolink_default", tfjsonpath.New("repository"), knownvalue.StringExact(repoNameRenamed)),
367+
},
368+
},
369+
},
370+
})
371+
})
299372
}

0 commit comments

Comments
 (0)