Skip to content

Commit 64ffb63

Browse files
Mikhail PutilovMikhail Putilov
authored andcommitted
Allow importing by clientId, not only clientUuid. Unblocks (#1267)
Signed-off-by: Mikhail Putilov <[email protected]>
1 parent 75a1bb6 commit 64ffb63

File tree

3 files changed

+41
-8
lines changed

3 files changed

+41
-8
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/keycloak/terraform-provider-keycloak
33
require (
44
dario.cat/mergo v1.0.2
55
github.com/golang-jwt/jwt/v5 v5.3.0
6+
github.com/google/uuid v1.6.0
67
github.com/hashicorp/errwrap v1.1.0
78
github.com/hashicorp/go-cty v1.5.0
89
github.com/hashicorp/go-retryablehttp v0.7.8

keycloak/openid_client.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,28 @@ func (keycloakClient *KeycloakClient) NewOpenidClient(ctx context.Context, clien
161161
return nil
162162
}
163163

164+
func (keycloakClient *KeycloakClient) SearchOpenidClientExact(ctx context.Context, realmId string, clientId string) (*OpenidClient, error) {
165+
var clients []*OpenidClient
166+
167+
err := keycloakClient.get(ctx, fmt.Sprintf("/realms/%s/clients", realmId), &clients, map[string]string{
168+
"first": "0",
169+
"max": "101",
170+
"clientId": clientId,
171+
"search": "true",
172+
})
173+
if err != nil {
174+
return nil, err
175+
}
176+
for _, client := range clients {
177+
client.RealmId = realmId
178+
if client.ClientId == clientId {
179+
return client, nil
180+
}
181+
}
182+
183+
return nil, fmt.Errorf("openid clientId %s does not exist in realm %s", clientId, realmId)
184+
}
185+
164186
func (keycloakClient *KeycloakClient) GetOpenidClients(ctx context.Context, realmId string, withSecrets bool) ([]*OpenidClient, error) {
165187
var clients []*OpenidClient
166188
var clientSecret OpenidClientSecret

provider/resource_keycloak_openid_client.go

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99

1010
"github.com/hashicorp/go-cty/cty"
1111

12-
"dario.cat/mergo"
12+
"github.com/google/uuid"
1313
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1414
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff"
1515
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -661,18 +661,28 @@ func resourceKeycloakOpenidClientImport(ctx context.Context, d *schema.ResourceD
661661

662662
parts := strings.Split(d.Id(), "/")
663663
if len(parts) != 2 {
664-
return nil, fmt.Errorf("Invalid import. Supported import formats: {{realmId}}/{{openidClientId}}")
664+
return nil, fmt.Errorf("invalid import. Supported import formats: {{realmId}}/{{openidClientId}} or {{realmId}}/{{clientUuid}}")
665665
}
666-
667-
_, err := keycloakClient.GetOpenidClient(ctx, parts[0], parts[1])
666+
if _, err := uuid.Parse(parts[1]); err == nil {
667+
// {{realmId}}/{{clientUuid}}
668+
_, err := keycloakClient.GetOpenidClient(ctx, parts[0], parts[1])
669+
if err != nil {
670+
return nil, err
671+
}
672+
d.SetId(parts[1])
673+
} else {
674+
// {{realmId}}/{{openidClientId}}
675+
c, err := keycloakClient.SearchOpenidClientExact(ctx, parts[0], parts[1])
676+
if err != nil {
677+
return nil, err
678+
}
679+
d.SetId(c.Id)
680+
}
681+
err := d.Set("realm_id", parts[0])
668682
if err != nil {
669683
return nil, err
670684
}
671685

672-
d.Set("realm_id", parts[0])
673-
d.Set("import", false)
674-
d.SetId(parts[1])
675-
676686
diagnostics := resourceKeycloakOpenidClientRead(ctx, d, meta)
677687
if diagnostics.HasError() {
678688
return nil, errors.New(diagnostics[0].Summary)

0 commit comments

Comments
 (0)