forked from gophercloud/gophercloud
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Identity V3: Add identity service resource (gophercloud#821)
- Loading branch information
1 parent
0d4664a
commit 5516c17
Showing
6 changed files
with
389 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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, | ||
}, | ||
}, | ||
}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
139
openstack/resource_openstack_identity_service_v3_test.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
``` |
Oops, something went wrong.