Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clarify realm id / name and expose realm id as new realm attribute #270

Merged
merged 1 commit into from
May 21, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions docs/resources/keycloak_realm.md
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,12 @@ The `brute_force_detection` block supports the following attributes:

Map, can be used to add custom attributes to a realm. Or perhaps influence a certain attribute that is not supported in this terraform-provider

### Attributes Reference

In addition to the arguments listed above, the following computed attributes are exported:

- `internal_id` - When importing realms created outside of this terraform provider, they could use generated arbitrary IDs for the technical realm id. Realms created by this provider always use the realm's name for its technical id.

### Import

Realms can be imported using their name:
Expand Down
18 changes: 9 additions & 9 deletions keycloak/realm.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ type Keys struct {
}

type Realm struct {
Id string `json:"id"`
Id string `json:"id,omitempty"`
Realm string `json:"realm"`
Enabled bool `json:"enabled"`
DisplayName string `json:"displayName"`
Expand Down Expand Up @@ -124,10 +124,10 @@ func (keycloakClient *KeycloakClient) NewRealm(realm *Realm) error {
return err
}

func (keycloakClient *KeycloakClient) GetRealm(id string) (*Realm, error) {
func (keycloakClient *KeycloakClient) GetRealm(name string) (*Realm, error) {
var realm Realm

err := keycloakClient.get(fmt.Sprintf("/realms/%s", id), &realm, nil)
err := keycloakClient.get(fmt.Sprintf("/realms/%s", name), &realm, nil)
if err != nil {
return nil, err
}
Expand All @@ -145,10 +145,10 @@ func (keycloakClient *KeycloakClient) GetRealms() ([]*Realm, error) {
return realms, nil
}

func (keycloakClient *KeycloakClient) GetRealmKeys(id string) (*Keys, error) {
func (keycloakClient *KeycloakClient) GetRealmKeys(name string) (*Keys, error) {
var keys Keys

err := keycloakClient.get(fmt.Sprintf("/realms/%s/keys", id), &keys, nil)
err := keycloakClient.get(fmt.Sprintf("/realms/%s/keys", name), &keys, nil)
if err != nil {
return nil, err
}
Expand All @@ -157,14 +157,14 @@ func (keycloakClient *KeycloakClient) GetRealmKeys(id string) (*Keys, error) {
}

func (keycloakClient *KeycloakClient) UpdateRealm(realm *Realm) error {
return keycloakClient.put(fmt.Sprintf("/realms/%s", realm.Id), realm)
return keycloakClient.put(fmt.Sprintf("/realms/%s", realm.Realm), realm)
}

func (keycloakClient *KeycloakClient) DeleteRealm(id string) error {
err := keycloakClient.delete(fmt.Sprintf("/realms/%s", id), nil)
func (keycloakClient *KeycloakClient) DeleteRealm(name string) error {
err := keycloakClient.delete(fmt.Sprintf("/realms/%s", name), nil)
if err != nil {
// For whatever reason, this fails sometimes with a 500 during acceptance tests. try again
return keycloakClient.delete(fmt.Sprintf("/realms/%s", id), nil)
return keycloakClient.delete(fmt.Sprintf("/realms/%s", name), nil)
}

return nil
Expand Down
8 changes: 6 additions & 2 deletions provider/data_source_keycloak_realm.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ func dataSourceKeycloakRealm() *schema.Resource {
Type: schema.TypeString,
Required: true,
},
"internal_id": {
Type: schema.TypeString,
Computed: true,
},
"enabled": {
Type: schema.TypeBool,
Computed: true,
Expand Down Expand Up @@ -359,9 +363,9 @@ func dataSourceKeycloakRealm() *schema.Resource {
func dataSourceKeycloakRealmRead(data *schema.ResourceData, meta interface{}) error {
keycloakClient := meta.(*keycloak.KeycloakClient)

realmId := data.Get("realm").(string)
realmName := data.Get("realm").(string)

realm, err := keycloakClient.GetRealm(realmId)
realm, err := keycloakClient.GetRealm(realmName)
if err != nil {
return err
}
Expand Down
13 changes: 12 additions & 1 deletion provider/resource_keycloak_realm.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ func resourceKeycloakRealm() *schema.Resource {
Required: true,
ForceNew: true,
},
"internal_id": {
Type: schema.TypeString,
Computed: true,
},
"enabled": {
Type: schema.TypeBool,
Optional: true,
Expand Down Expand Up @@ -454,8 +458,14 @@ func getRealmFromData(data *schema.ResourceData) (*keycloak.Realm, error) {
defaultLocale = internationalizationSettings["default_locale"].(string)
}

realmId := data.Get("realm")
internalId := data.Get("internal_id")
if internalId != "" {
realmId = internalId
}

realm := &keycloak.Realm{
Id: data.Get("realm").(string),
Id: realmId.(string),
Realm: data.Get("realm").(string),
Enabled: data.Get("enabled").(bool),
DisplayName: data.Get("display_name").(string),
Expand Down Expand Up @@ -731,6 +741,7 @@ func setRealmData(data *schema.ResourceData, realm *keycloak.Realm) {
data.SetId(realm.Realm)

data.Set("realm", realm.Realm)
data.Set("internal_id", realm.Id)
data.Set("enabled", realm.Enabled)
data.Set("display_name", realm.DisplayName)
data.Set("display_name_html", realm.DisplayNameHtml)
Expand Down
46 changes: 46 additions & 0 deletions provider/resource_keycloak_realm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -678,6 +678,37 @@ func TestAccKeycloakRealm_passwordPolicyInvalid(t *testing.T) {
})
}

func TestAccKeycloakRealm_internalId(t *testing.T) {
realmName := "terraform-" + acctest.RandString(10)
internalId := acctest.RandString(10)
realm := &keycloak.Realm{
Realm: realmName,
Id: internalId,
}

resource.Test(t, resource.TestCase{
Providers: testAccProviders,
PreCheck: func() { testAccPreCheck(t) },
CheckDestroy: testAccCheckKeycloakRealmDestroy(),
Steps: []resource.TestStep{
{
ResourceName: "keycloak_realm.realm",
ImportStateId: realmName,
ImportState: true,
PreConfig: func() {
keycloakClient := testAccProvider.Meta().(*keycloak.KeycloakClient)

err := keycloakClient.NewRealm(realm)
if err != nil {
t.Fatal(err)
}
},
Check: testAccCheckKeycloakRealmWithInternalId(realmName, internalId),
},
},
})
}

func testKeycloakRealmLoginInfo(resourceName string, realm *keycloak.Realm) resource.TestCheckFunc {
return func(s *terraform.State) error {
realmFromState, err := getRealmFromState(s, resourceName)
Expand Down Expand Up @@ -981,6 +1012,21 @@ func testAccCheckKeycloakRealmCustomAttribute(resourceName, key, value string) r
}
}

func testAccCheckKeycloakRealmWithInternalId(resourceName, id string) resource.TestCheckFunc {
return func(s *terraform.State) error {
realm, err := getRealmFromState(s, resourceName)
if err != nil {
return err
}

if realm.Id != id {
return fmt.Errorf("expected realm %s to have an internal id with value %s but was %s", realm.Realm, id, realm.Id)
}

return nil
}
}

func testKeycloakRealm_basic(realm, realmDisplayName, realmDisplayNameHtml string) string {
return fmt.Sprintf(`
resource "keycloak_realm" "realm" {
Expand Down