Skip to content

Commit

Permalink
[IAM]: new data/opentelekomcloud_identity_projects_v3 (#1814)
Browse files Browse the repository at this point in the history
[IAM]: new ``data/opentelekomcloud_identity_projects_v3``

Summary of the Pull Request
Adds new data source to list all available projects
PR Checklist

 Resolves: #1798
 Tests added/passed.
 Documentation updated.
 Schema updated.
 Release notes added.

Acceptance Steps Performed
=== RUN   TestAccOpenStackIdentityV3ProjectsDataSource_basic
--- PASS: TestAccOpenStackIdentityV3ProjectsDataSource_basic (34.75s)
PASS

Process finished with the exit code 0

Reviewed-by: Anton Sidelnikov <None>
  • Loading branch information
artem-lifshits committed Jul 19, 2022
1 parent 4f4bec9 commit 6e452de
Show file tree
Hide file tree
Showing 5 changed files with 191 additions and 0 deletions.
34 changes: 34 additions & 0 deletions docs/data-sources/identity_projects_v3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
---
subcategory: "Identity and Access Management (IAM)"
---

# opentelekomcloud_identity_projects_v3

Use this data source to get the list of all OpenTelekomCloud projects.

## Example Usage

```hcl
data "opentelekomcloud_identity_projects_v3" "project_1" {}
```


## Argument Reference

Data resource lists all available project therefore no arguments are provided.

## Attributes Reference

* `region` - Indicates the region where the project is present.

* `name` - Indicated the name of the project.

* `description` - The description of the project.

* `domain_id` - The domain this project belongs to.

* `parent_id` - The parent of this project.

* `enabled` - Describes whether the project is available

* `is_domain` - Indicates whether the user calling the API is a tenant.
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package acceptance

import (
"fmt"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
"github.com/opentelekomcloud/terraform-provider-opentelekomcloud/opentelekomcloud/acceptance/common"
)

func TestAccOpenStackIdentityV3ProjectsDataSource_basic(t *testing.T) {
userRegion := "eu-de"

resource.Test(t, resource.TestCase{
PreCheck: func() {
common.TestAccPreCheck(t)
common.TestAccPreCheckAdminOnly(t)
},
ProviderFactories: common.TestAccProviderFactories,
Steps: []resource.TestStep{
{
Config: testIdentityProjectsV3DataSource_basic(),
Check: resource.ComposeTestCheckFunc(
testAccCheckIdentityV3ProjectsDataSourceID("data.opentelekomcloud_identity_projects_v3.projects_data"),
resource.TestCheckResourceAttr("data.opentelekomcloud_identity_projects_v3.projects_data", "region", userRegion),
),
},
},
})
}

func testAccCheckIdentityV3ProjectsDataSourceID(n string) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[n]
if !ok {
return fmt.Errorf("can't find project data source: %s", n)
}

if rs.Primary.ID == "" {
return fmt.Errorf("project data source ID not set")
}

return nil
}
}

func testIdentityProjectsV3DataSource_basic() string {
return `data "opentelekomcloud_identity_projects_v3" "projects_data" {}`
}
1 change: 1 addition & 0 deletions opentelekomcloud/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,7 @@ func Provider() *schema.Provider {
"opentelekomcloud_identity_credential_v3": iam.DataSourceIdentityCredentialV3(),
"opentelekomcloud_identity_group_v3": iam.DataSourceIdentityGroupV3(),
"opentelekomcloud_identity_project_v3": iam.DataSourceIdentityProjectV3(),
"opentelekomcloud_identity_projects_v3": iam.DataSourceIdentityProjectsV3(),
"opentelekomcloud_identity_role_v3": iam.DataSourceIdentityRoleV3(),
"opentelekomcloud_identity_user_v3": iam.DataSourceIdentityUserV3(),
"opentelekomcloud_images_image_v2": ims.DataSourceImagesImageV2(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package iam

import (
"context"

"github.com/hashicorp/go-multierror"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/opentelekomcloud/gophertelekomcloud/openstack/identity/v3/projects"
"github.com/opentelekomcloud/terraform-provider-opentelekomcloud/opentelekomcloud/common/cfg"
"github.com/opentelekomcloud/terraform-provider-opentelekomcloud/opentelekomcloud/common/fmterr"
)

func DataSourceIdentityProjectsV3() *schema.Resource {
return &schema.Resource{
ReadContext: dataSourceIdentityProjectsV3Read,

Schema: map[string]*schema.Schema{
"region": {
Type: schema.TypeString,
Computed: true,
},
"projects": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"description": {
Type: schema.TypeString,
Computed: true,
},
"domain_id": {
Type: schema.TypeString,
Computed: true,
},
"name": {
Type: schema.TypeString,
Computed: true,
},
"parent_id": {
Type: schema.TypeString,
Optional: true,
},
"enabled": {
Type: schema.TypeBool,
Computed: true,
},
"is_domain": {
Type: schema.TypeBool,
Computed: true,
},
},
},
},
},
}
}

func dataSourceIdentityProjectsV3Read(_ context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
config := meta.(*cfg.Config)
client, err := config.IdentityV3Client(config.GetRegion(d))
if err != nil {
return fmterr.Errorf(clientCreationFail, err)
}

allPages, err := projects.List(client, projects.ListOpts{}).AllPages()
if err != nil {
return fmterr.Errorf("unable to query projects: %s", err)
}

allProjects, err := projects.ExtractProjects(allPages)
if err != nil {
return fmterr.Errorf("unable to retrieve projects: %s", err)
}

var flattenProjects []map[string]interface{}

for _, item := range allProjects {
project := map[string]interface{}{
"name": item.Name,
"description": item.Description,
"domain_id": item.DomainID,
"parent_id": item.ParentID,
"enabled": item.Enabled,
"is_domain": item.IsDomain,
}
flattenProjects = append(flattenProjects, project)
}

d.SetId(client.DomainID)
mErr := multierror.Append(
d.Set("region", config.GetRegion(d)),
d.Set("projects", flattenProjects),
)

if err := mErr.ErrorOrNil(); err != nil {
return diag.FromErr(err)
}

return nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
features:
- |
**[IAM]** New ``data/opentelekomcloud_identity_projects_v3`` data source
(`#1798 <https://github.com/opentelekomcloud/terraform-provider-opentelekomcloud/issues/1798>`_)

0 comments on commit 6e452de

Please sign in to comment.