Skip to content

Commit ad6a908

Browse files
manuelfeliperileykarson
authored andcommitted
Add support for data source 'google_iam_role' (#2482)
Add `google_iam_role` data source to be able to fetch and query for GCP IAM roles permissions.
1 parent 3526774 commit ad6a908

5 files changed

+139
-0
lines changed

google/data_source_google_iam_role.go

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package google
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/hashicorp/terraform/helper/schema"
7+
)
8+
9+
func dataSourceGoogleIamRole() *schema.Resource {
10+
return &schema.Resource{
11+
Read: dataSourceGoogleIamRoleRead,
12+
Schema: map[string]*schema.Schema{
13+
"name": &schema.Schema{
14+
Type: schema.TypeString,
15+
Required: true,
16+
},
17+
"title": {
18+
Type: schema.TypeString,
19+
Computed: true,
20+
},
21+
"included_permissions": {
22+
Type: schema.TypeList,
23+
Computed: true,
24+
Elem: &schema.Schema{Type: schema.TypeString},
25+
},
26+
"stage": {
27+
Type: schema.TypeString,
28+
Computed: true,
29+
},
30+
},
31+
}
32+
}
33+
34+
func dataSourceGoogleIamRoleRead(d *schema.ResourceData, meta interface{}) error {
35+
config := meta.(*Config)
36+
roleName := d.Get("name").(string)
37+
role, err := config.clientIAM.Roles.Get(roleName).Do()
38+
if err != nil {
39+
return handleNotFoundError(err, d, fmt.Sprintf("Error reading IAM Role %s: %s", roleName, err))
40+
}
41+
42+
d.SetId(role.Name)
43+
d.Set("title", role.Title)
44+
d.Set("stage", role.Stage)
45+
d.Set("included_permissions", role.IncludedPermissions)
46+
47+
return nil
48+
}
+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package google
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"testing"
7+
8+
"github.com/hashicorp/terraform/helper/resource"
9+
"github.com/hashicorp/terraform/terraform"
10+
)
11+
12+
func TestAccDataSourceIAMRole(t *testing.T) {
13+
name := "roles/viewer"
14+
15+
resource.Test(t, resource.TestCase{
16+
PreCheck: func() { testAccPreCheck(t) },
17+
Providers: testAccProviders,
18+
Steps: []resource.TestStep{
19+
{
20+
Config: testAccCheckGoogleIamRoleConfig(name),
21+
Check: resource.ComposeTestCheckFunc(
22+
testAccCheckGoogleIAMRoleCheck("data.google_iam_role.role"),
23+
),
24+
},
25+
},
26+
})
27+
}
28+
29+
func testAccCheckGoogleIAMRoleCheck(n string) resource.TestCheckFunc {
30+
return func(s *terraform.State) error {
31+
ds, ok := s.RootModule().Resources[n]
32+
if !ok {
33+
return fmt.Errorf("Can't find iam role data source: %s", n)
34+
}
35+
36+
_, ok = ds.Primary.Attributes["included_permissions.#"]
37+
if !ok {
38+
return errors.New("can't find 'included_permissions' attribute")
39+
}
40+
41+
return nil
42+
}
43+
}
44+
45+
func testAccCheckGoogleIamRoleConfig(name string) string {
46+
return fmt.Sprintf(`
47+
data "google_iam_role" "role" {
48+
name = "%s"
49+
}
50+
`, name)
51+
}

google/provider.go

+1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ func Provider() terraform.ResourceProvider {
8787
"google_container_registry_repository": dataSourceGoogleContainerRepo(),
8888
"google_container_registry_image": dataSourceGoogleContainerImage(),
8989
"google_iam_policy": dataSourceGoogleIamPolicy(),
90+
"google_iam_role": dataSourceGoogleIamRole(),
9091
"google_kms_secret": dataSourceGoogleKmsSecret(),
9192
"google_folder": dataSourceGoogleFolder(),
9293
"google_netblock_ip_ranges": dataSourceGoogleNetblockIpRanges(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
---
2+
layout: "google"
3+
page_title: "Google: google_iam_role"
4+
sidebar_current: "docs-google-datasource-iam-role"
5+
description: |-
6+
Get information about a Google IAM Role.
7+
---
8+
9+
# google\_iam\_role
10+
11+
Use this data source to get information about a Google IAM Role.
12+
13+
```hcl
14+
data "google_iam_role" "roleinfo" {
15+
name = "roles/compute.viewer"
16+
}
17+
18+
output "the_role_permissions" {
19+
value = "${data.google_iam_role.roleinfo.included_permissions}"
20+
}
21+
22+
```
23+
24+
## Argument Reference
25+
26+
The following arguments are supported:
27+
28+
* `name` (Required) - The name of the Role to lookup in the form `roles/{ROLE_NAME}`, `organizations/{ORGANIZATION_ID}/roles/{ROLE_NAME}` or `projects/{PROJECT_ID}/roles/{ROLE_NAME}`
29+
30+
## Attributes Reference
31+
32+
The following attributes are exported:
33+
34+
* `title` - is a friendly title for the role, such as "Role Viewer"
35+
* `included_permissions` - specifies the list of one or more permissions to include in the custom role, such as - `iam.roles.get`
36+
* `stage` - indicates the stage of a role in the launch lifecycle, such as `GA`, `BETA` or `ALPHA`.

website/google.erb

+3
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@
114114
<li<%= sidebar_current("docs-google-datasource-iam-policy") %>>
115115
<a href="/docs/providers/google/d/google_iam_policy.html">google_iam_policy</a>
116116
</li>
117+
<li<%= sidebar_current("docs-google-datasource-iam-role") %>>
118+
<a href="/docs/providers/google/d/datasource_google_iam_role.html">google_iam_role</a>
119+
</li>
117120
<li<%= sidebar_current("docs-google-kms-secret") %>>
118121
<a href="/docs/providers/google/d/google_kms_secret.html">google_kms_secret</a>
119122
</li>

0 commit comments

Comments
 (0)