Skip to content

Commit f64accf

Browse files
Merge pull request #145 from EduardoEspinozaPerez/feature/kong_consumer_oauth2
add kong_consumer_oauth2 resource
2 parents ca93cf0 + da9a860 commit f64accf

7 files changed

+457
-50
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
*.dll
22
*.exe
33
.DS_Store
4+
.devcontainer
45
example.tf
56
terraform.tfplan
67
terraform.tfstate

docs/resources/consumer_oauth2.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# kong_consumer_oauth2
2+
3+
Resource that allows you to configure the OAuth2 plugin credentials for a consumer.
4+
5+
## Example Usage
6+
7+
```hcl
8+
resource "kong_consumer" "my_consumer" {
9+
username = "User1"
10+
custom_id = "123"
11+
}
12+
13+
resource "kong_plugin" "oauth2_plugin" {
14+
name = "oauth2"
15+
config_json = <<EOT
16+
{
17+
"global_credentials": true,
18+
"enable_password_grant": true,
19+
"token_expiration": 180,
20+
"refresh_token_ttl": 180,
21+
"provision_key": "testprovisionkey"
22+
}
23+
EOT
24+
}
25+
26+
resource "kong_consumer_oauth2" "consumer_oauth2" {
27+
name = "test_application"
28+
consumer_id = "${kong_consumer.my_consumer.id}"
29+
client_id = "client_id"
30+
client_secret = "client_secret"
31+
redirect_uris = ["https://asdf.com/callback", "https://test.cl/callback"]
32+
tags = ["myTag"]
33+
}
34+
```
35+
36+
## Argument Reference
37+
38+
* `name` - (Required) The name associated with the credential.
39+
* `consumer_id` - (Required) The id of the consumer to be configured with oauth2.
40+
* `client_id` - (Optional) Unique oauth2 client id. If not set, the oauth2 plugin will generate one
41+
* `client_secret` - (Optional) Unique oauth2 client secret. If not set, the oauth2 plugin will generate one
42+
* `hash_secret` - (Optional) A boolean flag that indicates whether the client_secret field will be stored in hashed form. If enabled on existing plugin instances, client secrets are hashed on the fly upon first usage. Default: `false`.
43+
* `redirect_uris` - (Required) An array with one or more URLs in your app where users will be sent after authorization ([RFC 6742 Section 3.1.2](https://tools.ietf.org/html/rfc6749#section-3.1.2)).
44+
* `tags` - (Optional) A list of strings associated with the consumer for grouping and filtering.

go.mod

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,11 @@ require (
1111
github.com/docker/cli v20.10.8+incompatible // indirect
1212
github.com/docker/docker v20.10.8+incompatible // indirect
1313
github.com/hashicorp/terraform-plugin-sdk/v2 v2.10.1
14-
github.com/kong/go-kong v0.20.0
14+
github.com/kong/go-kong v0.28.0
1515
github.com/lib/pq v1.0.0
1616
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect
1717
github.com/opencontainers/runc v1.0.1 // indirect
1818
github.com/ory/dockertest/v3 v3.7.0
1919
github.com/pkg/errors v0.9.1
2020
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
21-
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d // indirect
22-
golang.org/x/sys v0.0.0-20210809203939-894668206c86 // indirect
2321
)

go.sum

Lines changed: 73 additions & 47 deletions
Large diffs are not rendered by default.

kong/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ func Provider() *schema.Provider {
7272
"kong_consumer_acl": resourceKongConsumerACL(),
7373
"kong_consumer_basic_auth": resourceKongConsumerBasicAuth(),
7474
"kong_consumer_key_auth": resourceKongConsumerKeyAuth(),
75+
"kong_consumer_oauth2": resourceKongConsumerOAuth2(),
7576
"kong_plugin": resourceKongPlugin(),
7677
"kong_upstream": resourceKongUpstream(),
7778
"kong_target": resourceKongTarget(),

kong/resource_kong_consumer_oauth2.go

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
package kong
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
"github.com/kong/go-kong/kong"
10+
)
11+
12+
func resourceKongConsumerOAuth2() *schema.Resource {
13+
return &schema.Resource{
14+
CreateContext: resourceKongConsumerOAuth2Create,
15+
ReadContext: resourceKongConsumerOAuth2Read,
16+
DeleteContext: resourceKongConsumerOAuth2Delete,
17+
UpdateContext: resourceKongConsumerOAuth2Update,
18+
Schema: map[string]*schema.Schema{
19+
"consumer_id": {
20+
Type: schema.TypeString,
21+
Required: true,
22+
ForceNew: false,
23+
},
24+
"name": {
25+
Type: schema.TypeString,
26+
Required: true,
27+
ForceNew: false,
28+
},
29+
"client_id": {
30+
Type: schema.TypeString,
31+
Optional: true,
32+
ForceNew: false,
33+
},
34+
"client_secret": {
35+
Type: schema.TypeString,
36+
Optional: true,
37+
ForceNew: false,
38+
},
39+
"hash_secret": {
40+
Type: schema.TypeBool,
41+
Optional: true,
42+
ForceNew: false,
43+
Default: false,
44+
},
45+
"redirect_uris": {
46+
Type: schema.TypeList,
47+
Required: true,
48+
ForceNew: false,
49+
Elem: &schema.Schema{Type: schema.TypeString},
50+
},
51+
"tags": {
52+
Type: schema.TypeList,
53+
Optional: true,
54+
ForceNew: false,
55+
Elem: &schema.Schema{Type: schema.TypeString},
56+
},
57+
},
58+
}
59+
}
60+
61+
func resourceKongConsumerOAuth2Create(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
62+
OAuth2CredentialRequest := &kong.Oauth2Credential{
63+
Name: readStringPtrFromResource(d, "name"),
64+
ClientID: readStringPtrFromResource(d, "client_id"),
65+
ClientSecret: readStringPtrFromResource(d, "client_secret"),
66+
HashSecret: readBoolPtrFromResource(d, "hash_secret"),
67+
RedirectURIs: readStringArrayPtrFromResource(d, "redirect_uris"),
68+
Tags: readStringArrayPtrFromResource(d, "tags"),
69+
}
70+
71+
consumerId := kong.String(d.Get("consumer_id").(string))
72+
73+
client := meta.(*config).adminClient.Oauth2Credentials
74+
oAuth2Credentials, err := client.Create(ctx, consumerId, OAuth2CredentialRequest)
75+
76+
if err != nil {
77+
return diag.FromErr(fmt.Errorf("failed to create oauth2 credentials: %v error: %v", OAuth2CredentialRequest, err))
78+
}
79+
80+
d.SetId(buildConsumerPairID(*oAuth2Credentials.ID, *consumerId))
81+
82+
return resourceKongConsumerOAuth2Read(ctx, d, meta)
83+
}
84+
85+
func resourceKongConsumerOAuth2Update(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
86+
id, _ := splitConsumerID(d.Id())
87+
88+
OAuth2CredentialRequest := &kong.Oauth2Credential{
89+
ID: kong.String(id.ID),
90+
Name: readStringPtrFromResource(d, "name"),
91+
ClientID: readStringPtrFromResource(d, "client_id"),
92+
ClientSecret: readStringPtrFromResource(d, "client_secret"),
93+
HashSecret: readBoolPtrFromResource(d, "hash_secret"),
94+
RedirectURIs: readStringArrayPtrFromResource(d, "redirect_uris"),
95+
Tags: readStringArrayPtrFromResource(d, "tags"),
96+
}
97+
98+
consumerId := kong.String(d.Get("consumer_id").(string))
99+
100+
client := meta.(*config).adminClient.Oauth2Credentials
101+
_, err := client.Update(ctx, consumerId, OAuth2CredentialRequest)
102+
103+
if err != nil {
104+
return diag.FromErr(fmt.Errorf("error updating kong oauth2 credentials: %s", err))
105+
}
106+
107+
return resourceKongConsumerOAuth2Read(ctx, d, meta)
108+
}
109+
110+
func resourceKongConsumerOAuth2Read(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
111+
var diags diag.Diagnostics
112+
id, err := splitConsumerID(d.Id())
113+
if err != nil {
114+
return diag.FromErr(err)
115+
}
116+
117+
client := meta.(*config).adminClient.Oauth2Credentials
118+
oAuth2Credentials, err := client.Get(ctx, kong.String(id.ConsumerID), kong.String(id.ID))
119+
120+
if kong.IsNotFoundErr(err) {
121+
d.SetId("")
122+
} else if err != nil {
123+
return diag.FromErr(fmt.Errorf("could not find kong oauth2 credentials with id: %s error: %v", id, err))
124+
}
125+
126+
if oAuth2Credentials == nil {
127+
d.SetId("")
128+
} else {
129+
err = d.Set("consumer_id", oAuth2Credentials.Consumer.ID)
130+
if err != nil {
131+
return diag.FromErr(err)
132+
}
133+
err = d.Set("name", oAuth2Credentials.Name)
134+
if err != nil {
135+
return diag.FromErr(err)
136+
}
137+
err = d.Set("client_id", oAuth2Credentials.ClientID)
138+
if err != nil {
139+
return diag.FromErr(err)
140+
}
141+
err = d.Set("client_secret", oAuth2Credentials.ClientSecret)
142+
if err != nil {
143+
return diag.FromErr(err)
144+
}
145+
err = d.Set("hash_secret", oAuth2Credentials.HashSecret)
146+
if err != nil {
147+
return diag.FromErr(err)
148+
}
149+
err = d.Set("redirect_uris", oAuth2Credentials.RedirectURIs)
150+
if err != nil {
151+
return diag.FromErr(err)
152+
}
153+
err = d.Set("tags", oAuth2Credentials.Tags)
154+
if err != nil {
155+
return diag.FromErr(err)
156+
}
157+
}
158+
159+
return diags
160+
}
161+
162+
func resourceKongConsumerOAuth2Delete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
163+
var diags diag.Diagnostics
164+
id, err := splitConsumerID(d.Id())
165+
if err != nil {
166+
return diag.FromErr(err)
167+
}
168+
client := meta.(*config).adminClient.Oauth2Credentials
169+
err = client.Delete(ctx, kong.String(id.ConsumerID), kong.String(id.ID))
170+
171+
if err != nil {
172+
return diag.FromErr(fmt.Errorf("could not delete kong oauth2 credentials: %v", err))
173+
}
174+
175+
return diags
176+
}

0 commit comments

Comments
 (0)