Skip to content

Commit

Permalink
Identity V3: Add identity service resource (gophercloud#821)
Browse files Browse the repository at this point in the history
  • Loading branch information
kayrus authored and ozerovandrei committed Aug 4, 2019
1 parent 0d4664a commit 5516c17
Show file tree
Hide file tree
Showing 6 changed files with 389 additions and 0 deletions.
34 changes: 34 additions & 0 deletions openstack/import_openstack_identity_service_v3_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package openstack

import (
"fmt"
"testing"

"github.com/hashicorp/terraform/helper/acctest"
"github.com/hashicorp/terraform/helper/resource"
)

func TestAccIdentityV3Service_importBasic(t *testing.T) {
resourceName := "openstack_identity_service_v3.service_1"
var serviceName = fmt.Sprintf("ACCPTTEST-%s", acctest.RandString(5))

resource.Test(t, resource.TestCase{
PreCheck: func() {
testAccPreCheck(t)
testAccPreCheckAdminOnly(t)
},
Providers: testAccProviders,
CheckDestroy: testAccCheckIdentityV3ServiceDestroy,
Steps: []resource.TestStep{
{
Config: testAccIdentityV3Service_basic(serviceName),
},

{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}
1 change: 1 addition & 0 deletions openstack/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,7 @@ func Provider() terraform.ResourceProvider {
"openstack_identity_project_v3": resourceIdentityProjectV3(),
"openstack_identity_role_v3": resourceIdentityRoleV3(),
"openstack_identity_role_assignment_v3": resourceIdentityRoleAssignmentV3(),
"openstack_identity_service_v3": resourceIdentityServiceV3(),
"openstack_identity_user_v3": resourceIdentityUserV3(),
"openstack_identity_application_credential_v3": resourceIdentityApplicationCredentialV3(),
"openstack_images_image_v2": resourceImagesImageV2(),
Expand Down
156 changes: 156 additions & 0 deletions openstack/resource_openstack_identity_service_v3.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
package openstack

import (
"fmt"
"log"

"github.com/gophercloud/gophercloud/openstack/identity/v3/services"
"github.com/hashicorp/terraform/helper/schema"
)

func resourceIdentityServiceV3() *schema.Resource {
return &schema.Resource{
Create: resourceIdentityServiceV3Create,
Read: resourceIdentityServiceV3Read,
Update: resourceIdentityServiceV3Update,
Delete: resourceIdentityServiceV3Delete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},

Schema: map[string]*schema.Schema{
"region": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
},

"name": {
Type: schema.TypeString,
Required: true,
},

"description": {
Type: schema.TypeString,
Optional: true,
},

"type": {
Type: schema.TypeString,
Required: true,
},

"enabled": {
Type: schema.TypeBool,
Optional: true,
Default: true,
},
},
}
}

func resourceIdentityServiceV3Create(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
identityClient, err := config.identityV3Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack identity client: %s", err)
}

enabled := d.Get("enabled").(bool)
createOpts := services.CreateOpts{
Extra: map[string]interface{}{
"name": d.Get("name").(string),
"description": d.Get("description").(string),
},
Type: d.Get("type").(string),
Enabled: &enabled,
}

log.Printf("[DEBUG] openstack_identity_service_v3 create options: %#v", createOpts)
service, err := services.Create(identityClient, createOpts).Extract()
if err != nil {
return fmt.Errorf("Error creating openstack_identity_service_v3: %s", err)
}

d.SetId(service.ID)

return resourceIdentityServiceV3Read(d, meta)
}

func resourceIdentityServiceV3Read(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
identityClient, err := config.identityV3Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack identity client: %s", err)
}

service, err := services.Get(identityClient, d.Id()).Extract()
if err != nil {
return CheckDeleted(d, err, "Error retrieving openstack_identity_service_v3")
}

log.Printf("[DEBUG] Retrieved openstack_identity_service_v3: %#v", service)

name := ""
description := ""
if v, ok := service.Extra["name"].(string); ok {
name = v
}
if v, ok := service.Extra["description"].(string); ok {
description = v
}

d.Set("name", name)
d.Set("description", description)
d.Set("type", service.Type)
d.Set("enabled", service.Enabled)

d.Set("region", GetRegion(d, config))

return nil
}

func resourceIdentityServiceV3Update(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
identityClient, err := config.identityV3Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack identity client: %s", err)
}

var updateOpts services.UpdateOpts

// these options must always be set
enabled := d.Get("enabled").(bool)
updateOpts.Enabled = &enabled
updateOpts.Type = d.Get("type").(string)

if d.HasChange("name") || d.HasChange("description") {
updateOpts.Extra = map[string]interface{}{
"name": d.Get("name").(string),
"description": d.Get("description").(string),
}
}

_, err = services.Update(identityClient, d.Id(), updateOpts).Extract()
if err != nil {
return fmt.Errorf("Error updating openstack_identity_service_v3: %s", err)
}

return resourceIdentityServiceV3Read(d, meta)
}

func resourceIdentityServiceV3Delete(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
identityClient, err := config.identityV3Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack identity client: %s", err)
}

err = services.Delete(identityClient, d.Id()).ExtractErr()
if err != nil {
return fmt.Errorf("Error deleting openstack_identity_service_v3: %s", err)
}

return nil
}
139 changes: 139 additions & 0 deletions openstack/resource_openstack_identity_service_v3_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
package openstack

import (
"fmt"
"testing"

"github.com/hashicorp/terraform/helper/acctest"
"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/terraform"

"github.com/gophercloud/gophercloud/openstack/identity/v3/services"
)

func TestAccIdentityV3Service_basic(t *testing.T) {
var name, description string
var service services.Service
var serviceName = fmt.Sprintf("ACCPTTEST-%s", acctest.RandString(5))

resource.Test(t, resource.TestCase{
PreCheck: func() {
testAccPreCheck(t)
testAccPreCheckAdminOnly(t)
},
Providers: testAccProviders,
CheckDestroy: testAccCheckIdentityV3ServiceDestroy,
Steps: []resource.TestStep{
{
Config: testAccIdentityV3Service_basic(serviceName),
Check: resource.ComposeTestCheckFunc(
testAccCheckIdentityV3ServiceExists("openstack_identity_service_v3.service_1", &service, &name, &description),
resource.TestCheckResourceAttrPtr(
"openstack_identity_service_v3.service_1", "name", &name),
resource.TestCheckResourceAttr(
"openstack_identity_service_v3.service_1", "type", "foo"),
resource.TestCheckResourceAttrPtr(
"openstack_identity_service_v3.service_1", "description", &description),
resource.TestCheckResourceAttr(
"openstack_identity_service_v3.service_1", "enabled", "true"),
),
},
{
Config: testAccIdentityV3Service_update(serviceName),
Check: resource.ComposeTestCheckFunc(
testAccCheckIdentityV3ServiceExists("openstack_identity_service_v3.service_1", &service, &name, &description),
resource.TestCheckResourceAttrPtr(
"openstack_identity_service_v3.service_1", "name", &name),
resource.TestCheckResourceAttr(
"openstack_identity_service_v3.service_1", "type", "bar"),
resource.TestCheckResourceAttrPtr(
"openstack_identity_service_v3.service_1", "description", &description),
resource.TestCheckResourceAttr(
"openstack_identity_service_v3.service_1", "enabled", "false"),
),
},
},
})
}

func testAccCheckIdentityV3ServiceDestroy(s *terraform.State) error {
config := testAccProvider.Meta().(*Config)
identityClient, err := config.identityV3Client(OS_REGION_NAME)
if err != nil {
return fmt.Errorf("Error creating OpenStack identity client: %s", err)
}

for _, rs := range s.RootModule().Resources {
if rs.Type != "openstack_identity_service_v3" {
continue
}

_, err := services.Get(identityClient, rs.Primary.ID).Extract()
if err == nil {
return fmt.Errorf("Service still exists")
}
}

return nil
}

func testAccCheckIdentityV3ServiceExists(n string, service *services.Service, name *string, description *string) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[n]
if !ok {
return fmt.Errorf("Not found: %s", n)
}

if rs.Primary.ID == "" {
return fmt.Errorf("No ID is set")
}

config := testAccProvider.Meta().(*Config)
identityClient, err := config.identityV3Client(OS_REGION_NAME)
if err != nil {
return fmt.Errorf("Error creating OpenStack identity client: %s", err)
}

found, err := services.Get(identityClient, rs.Primary.ID).Extract()
if err != nil {
return err
}

if found.ID != rs.Primary.ID {
return fmt.Errorf("Service not found")
}

if v, ok := found.Extra["name"]; ok {
*name = v.(string)
}

if v, ok := found.Extra["description"]; ok {
*description = v.(string)
}

*service = *found

return nil
}
}

func testAccIdentityV3Service_basic(serviceName string) string {
return fmt.Sprintf(`
resource "openstack_identity_service_v3" "service_1" {
name = "%s"
type = "foo"
description = "A service"
}
`, serviceName)
}

func testAccIdentityV3Service_update(serviceName string) string {
return fmt.Sprintf(`
resource "openstack_identity_service_v3" "service_1" {
name = "%s"
type = "bar"
description = "A service"
enabled = false
}
`, serviceName)
}
56 changes: 56 additions & 0 deletions website/docs/r/identity_service_v3.html.markdown
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
---
layout: "openstack"
page_title: "OpenStack: openstack_identity_service_v3"
sidebar_current: "docs-openstack-resource-identity-service-v3"
description: |-
Manages a V3 Service resource within OpenStack Keystone.
---

# openstack\_identity\_service\_v3

Manages a V3 Service resource within OpenStack Keystone.

~> **Note:** This usually requires admin privileges.

## Example Usage

```hcl
resource "openstack_identity_service_v3" "service_1" {
name = "custom"
type = "custom"
}
```

## Argument Reference

The following arguments are supported:

* `region` - (Optional) The region in which to obtain the V3 Keystone client.
If omitted, the `region` argument of the provider is used.

* `name` - (Required) The service name.

* `description` - (Optional) The service description.

* `type` - (Required) The service type.

* `enabled` - (Optional) The service status. Defaults to `true`.

## Attributes Reference

`id` is set to the ID of the found service. In addition, the following attributes
are exported:

* `region` - See Argument Reference above.
* `name` - See Argument Reference above.
* `type` - See Argument Reference above.
* `enabled` - See Argument Reference above.
* `description` - See Argument Reference above.

## Import

Services can be imported using the `id`, e.g.

```
$ terraform import openstack_identity_service_v3.service_1 6688e967-158a-496f-a224-cae3414e6b61
```
Loading

0 comments on commit 5516c17

Please sign in to comment.