Skip to content

Commit 37ced99

Browse files
fix: readd url
1 parent 53625ce commit 37ced99

File tree

4 files changed

+149
-60
lines changed

4 files changed

+149
-60
lines changed

github/resource_github_user_ssh_key.go

Lines changed: 21 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"strconv"
99

1010
"github.com/google/go-github/v84/github"
11-
"github.com/hashicorp/go-cty/cty"
1211
"github.com/hashicorp/terraform-plugin-log/tflog"
1312
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1413
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -41,7 +40,6 @@ func resourceGithubUserSshKey() *schema.Resource {
4140
Type: schema.TypeString,
4241
Computed: true,
4342
Description: "The URL of the SSH key.",
44-
Deprecated: "Use key_id instead.",
4543
},
4644
"key_id": {
4745
Type: schema.TypeInt,
@@ -57,31 +55,8 @@ func resourceGithubUserSshKey() *schema.Resource {
5755
StateUpgraders: []schema.StateUpgrader{
5856
{
5957
Version: 0,
60-
Type: cty.Object(map[string]cty.Type{
61-
"id": cty.String,
62-
"title": cty.String,
63-
"key": cty.String,
64-
"url": cty.String,
65-
"etag": cty.String,
66-
}),
67-
Upgrade: func(ctx context.Context, rawState map[string]any, meta any) (map[string]any, error) {
68-
if rawState == nil {
69-
return nil, fmt.Errorf("resource state upgrade failed, state is nil")
70-
}
71-
72-
// copy d.Id() into key_id
73-
if id, ok := rawState["id"].(string); ok {
74-
keyID, err := strconv.ParseInt(id, 10, 64)
75-
if err != nil {
76-
return nil, fmt.Errorf("resource state upgrade failed, invalid SSH key ID format: %w", err)
77-
}
78-
rawState["key_id"] = keyID
79-
} else {
80-
return nil, fmt.Errorf("resource state upgrade failed, missing or invalid 'id' field in state")
81-
}
82-
83-
return rawState, nil
84-
},
58+
Type: resourceGithubUserSshKeyV0().CoreConfigSchema().ImpliedType(),
59+
Upgrade: resourceGithubUserSshKeyStateUpgradeV0,
8560
},
8661
},
8762
}
@@ -94,8 +69,8 @@ func resourceGithubUserSshKeyCreate(ctx context.Context, d *schema.ResourceData,
9469
key := d.Get("key").(string)
9570

9671
userKey, resp, err := client.Users.CreateKey(ctx, &github.Key{
97-
Title: github.Ptr(title),
98-
Key: github.Ptr(key),
72+
Title: new(title),
73+
Key: new(key),
9974
})
10075
if err != nil {
10176
return diag.FromErr(err)
@@ -109,6 +84,9 @@ func resourceGithubUserSshKeyCreate(ctx context.Context, d *schema.ResourceData,
10984
if err = d.Set("etag", resp.Header.Get("ETag")); err != nil {
11085
return diag.FromErr(err)
11186
}
87+
if err = d.Set("url", userKey.GetURL()); err != nil {
88+
return diag.FromErr(err)
89+
}
11290
if err = d.Set("title", userKey.GetTitle()); err != nil {
11391
return diag.FromErr(err)
11492
}
@@ -120,16 +98,7 @@ func resourceGithubUserSshKeyRead(ctx context.Context, d *schema.ResourceData, m
12098
client := meta.(*Owner).v3client
12199

122100
keyID := int64(d.Get("key_id").(int))
123-
// fallback to d.Id() for backward compatibility when key_id is not set
124-
if keyID == 0 {
125-
var err error
126-
keyID, err = strconv.ParseInt(d.Id(), 10, 64)
127-
if err != nil {
128-
return diag.FromErr(fmt.Errorf("invalid SSH key ID format: %w", err))
129-
}
130-
}
131-
132-
_, _, err := client.Users.GetKey(ctx, keyID)
101+
userKey, resp, err := client.Users.GetKey(ctx, keyID)
133102
if err != nil {
134103
var ghErr *github.ErrorResponse
135104
if errors.As(err, &ghErr) {
@@ -145,6 +114,18 @@ func resourceGithubUserSshKeyRead(ctx context.Context, d *schema.ResourceData, m
145114
}
146115
}
147116
}
117+
118+
// set computed fields
119+
if err = d.Set("key_id", userKey.GetID()); err != nil {
120+
return diag.FromErr(err)
121+
}
122+
if err = d.Set("etag", resp.Header.Get("ETag")); err != nil {
123+
return diag.FromErr(err)
124+
}
125+
if err = d.Set("url", userKey.GetURL()); err != nil {
126+
return diag.FromErr(err)
127+
}
128+
148129
return nil
149130
}
150131

@@ -179,7 +160,7 @@ func resourceGithubUserSshKeyImport(ctx context.Context, d *schema.ResourceData,
179160
return nil, fmt.Errorf("invalid SSH key ID format: %w", err)
180161
}
181162

182-
key, resp, err := client.Users.GetKey(ctx, keyID)
163+
key, _, err := client.Users.GetKey(ctx, keyID)
183164
if err != nil {
184165
var ghErr *github.ErrorResponse
185166
if errors.As(err, &ghErr) {
@@ -192,12 +173,6 @@ func resourceGithubUserSshKeyImport(ctx context.Context, d *schema.ResourceData,
192173

193174
d.SetId(strconv.FormatInt(key.GetID(), 10))
194175

195-
if err = d.Set("key_id", key.GetID()); err != nil {
196-
return nil, err
197-
}
198-
if err = d.Set("etag", resp.Header.Get("ETag")); err != nil {
199-
return nil, err
200-
}
201176
if err = d.Set("title", key.GetTitle()); err != nil {
202177
return nil, err
203178
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package github
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"strconv"
7+
"strings"
8+
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
)
11+
12+
func resourceGithubUserSshKeyV0() *schema.Resource {
13+
return &schema.Resource{
14+
SchemaVersion: 1,
15+
Schema: map[string]*schema.Schema{
16+
"title": {
17+
Type: schema.TypeString,
18+
Required: true,
19+
ForceNew: true,
20+
Description: "A descriptive name for the new key.",
21+
},
22+
"key": {
23+
Type: schema.TypeString,
24+
Required: true,
25+
ForceNew: true,
26+
Description: "The public SSH key to add to your GitHub account.",
27+
DiffSuppressFunc: func(k, oldV, newV string, d *schema.ResourceData) bool {
28+
newTrimmed := strings.TrimSpace(newV)
29+
return oldV == newTrimmed
30+
},
31+
},
32+
"url": {
33+
Type: schema.TypeString,
34+
Computed: true,
35+
Description: "The URL of the SSH key.",
36+
},
37+
"etag": {
38+
Type: schema.TypeString,
39+
Computed: true,
40+
},
41+
},
42+
}
43+
}
44+
45+
func resourceGithubUserSshKeyStateUpgradeV0(ctx context.Context, rawState map[string]any, m any) (map[string]any, error) {
46+
if rawState == nil {
47+
return nil, fmt.Errorf("resource state upgrade failed, state is nil")
48+
}
49+
50+
// copy d.Id() into key_id
51+
if id, ok := rawState["id"].(string); ok {
52+
keyID, err := strconv.ParseInt(id, 10, 64)
53+
if err != nil {
54+
return nil, fmt.Errorf("resource state upgrade failed, invalid SSH key ID format: %w", err)
55+
}
56+
rawState["key_id"] = keyID
57+
} else {
58+
return nil, fmt.Errorf("resource state upgrade failed, missing or invalid 'id' field in state")
59+
}
60+
61+
return rawState, nil
62+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package github
2+
3+
import (
4+
"context"
5+
"reflect"
6+
"testing"
7+
)
8+
9+
func Test_resourceGithubUserSshKeyStateUpgradeV0(t *testing.T) {
10+
t.Parallel()
11+
12+
for _, d := range []struct {
13+
testName string
14+
rawState map[string]any
15+
want map[string]any
16+
shouldError bool
17+
}{
18+
{
19+
testName: "migrates_v0_to_v1",
20+
rawState: map[string]any{
21+
"id": "123",
22+
"title": "test-key",
23+
"key": "test-key-data",
24+
"url": "test-url",
25+
},
26+
want: map[string]any{
27+
"id": "123",
28+
"key_id": int64(123),
29+
"title": "test-key",
30+
"key": "test-key-data",
31+
"url": "test-url",
32+
},
33+
shouldError: false,
34+
},
35+
} {
36+
t.Run(d.testName, func(t *testing.T) {
37+
t.Parallel()
38+
39+
got, err := resourceGithubUserSshKeyStateUpgradeV0(context.Background(), d.rawState, nil)
40+
if (err != nil) != d.shouldError {
41+
t.Fatalf("unexpected error state")
42+
}
43+
44+
if !d.shouldError && !reflect.DeepEqual(got, d.want) {
45+
t.Fatalf("got %+v, want %+v", got, d.want)
46+
}
47+
})
48+
}
49+
}

github/resource_github_user_ssh_signing_key.go

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func resourceGithubUserSshSigningKey() *schema.Resource {
3333
Type: schema.TypeString,
3434
Required: true,
3535
ForceNew: true,
36-
Description: "The public SSH key to add to your GitHub account.",
36+
Description: "The public SSH signing key to add to your GitHub account.",
3737
},
3838
"key_id": {
3939
Type: schema.TypeInt,
@@ -55,8 +55,8 @@ func resourceGithubUserSshSigningKeyCreate(ctx context.Context, d *schema.Resour
5555
key := d.Get("key").(string)
5656

5757
userKey, resp, err := client.Users.CreateSSHSigningKey(ctx, &github.Key{
58-
Title: github.Ptr(title),
59-
Key: github.Ptr(key),
58+
Title: new(title),
59+
Key: new(key),
6060
})
6161
if err != nil {
6262
return diag.FromErr(err)
@@ -80,30 +80,39 @@ func resourceGithubUserSshSigningKeyCreate(ctx context.Context, d *schema.Resour
8080
func resourceGithubUserSshSigningKeyRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
8181
client := meta.(*Owner).v3client
8282

83-
keyID := d.Get("key_id").(int64)
84-
_, _, err := client.Users.GetSSHSigningKey(ctx, keyID)
83+
keyID := int64(d.Get("key_id").(int))
84+
userKey, resp, err := client.Users.GetSSHSigningKey(ctx, keyID)
8585
if err != nil {
8686
var ghErr *github.ErrorResponse
8787
if errors.As(err, &ghErr) {
8888
if ghErr.Response.StatusCode == http.StatusNotModified {
8989
return nil
9090
}
9191
if ghErr.Response.StatusCode == http.StatusNotFound {
92-
tflog.Info(ctx, fmt.Sprintf("Removing user SSH key %s from state because it no longer exists in GitHub", d.Id()), map[string]any{
92+
tflog.Info(ctx, fmt.Sprintf("Removing user SSH signing key %s from state because it no longer exists in GitHub", d.Id()), map[string]any{
9393
"ssh_signing_key_id": d.Id(),
9494
})
9595
d.SetId("")
9696
return nil
9797
}
9898
}
9999
}
100+
101+
// set computed fields
102+
if err = d.Set("key_id", userKey.GetID()); err != nil {
103+
return diag.FromErr(err)
104+
}
105+
if err = d.Set("etag", resp.Header.Get("ETag")); err != nil {
106+
return diag.FromErr(err)
107+
}
108+
100109
return nil
101110
}
102111

103112
func resourceGithubUserSshSigningKeyDelete(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
104113
client := meta.(*Owner).v3client
105114

106-
keyID := d.Get("key_id").(int64)
115+
keyID := int64(d.Get("key_id").(int))
107116
resp, err := client.Users.DeleteSSHSigningKey(ctx, keyID)
108117
if err != nil {
109118
if resp != nil && resp.StatusCode == http.StatusNotFound {
@@ -122,7 +131,7 @@ func resourceGithubUserSshSigningKeyImport(ctx context.Context, d *schema.Resour
122131
return nil, fmt.Errorf("invalid SSH signing key ID format: %w", err)
123132
}
124133

125-
key, resp, err := client.Users.GetSSHSigningKey(ctx, keyID)
134+
key, _, err := client.Users.GetSSHSigningKey(ctx, keyID)
126135
if err != nil {
127136
var ghErr *github.ErrorResponse
128137
if errors.As(err, &ghErr) {
@@ -135,12 +144,6 @@ func resourceGithubUserSshSigningKeyImport(ctx context.Context, d *schema.Resour
135144

136145
d.SetId(strconv.FormatInt(key.GetID(), 10))
137146

138-
if err = d.Set("key_id", key.GetID()); err != nil {
139-
return nil, err
140-
}
141-
if err = d.Set("etag", resp.Header.Get("ETag")); err != nil {
142-
return nil, err
143-
}
144147
if err = d.Set("title", key.GetTitle()); err != nil {
145148
return nil, err
146149
}

0 commit comments

Comments
 (0)