Skip to content
This repository was archived by the owner on Jun 30, 2025. It is now read-only.

Commit cc229fe

Browse files
authored
add plural group_members resource back (#182)
* add group_members resource back * Revert "remove plural group_members in favor of retry transport" This reverts commit 5d4b2d9.
1 parent 45ae513 commit cc229fe

File tree

11 files changed

+995
-0
lines changed

11 files changed

+995
-0
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
## 0.5.0 (Unreleased)
22

3+
FEATURES:
4+
5+
* **New Resource:** `googleworkspace_group_members` [GH-155]
6+
7+
* **New Datasource:** `googleworkspace_group_members` [GH-155]
8+
39
IMPROVEMENTS:
410

511
* provider: added ability to authenticate using user credentials [GH-156]

docs/data-sources/group_members.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "googleworkspace_group_members Data Source - terraform-provider-googleworkspace"
4+
subcategory: ""
5+
description: |-
6+
Group Members data source in the Terraform Googleworkspace provider. Group Members resides under the https://www.googleapis.com/auth/admin.directory.group client scope.
7+
---
8+
9+
# googleworkspace_group_members (Data Source)
10+
11+
Group Members data source in the Terraform Googleworkspace provider. Group Members resides under the `https://www.googleapis.com/auth/admin.directory.group` client scope.
12+
13+
## Example Usage
14+
15+
```terraform
16+
data "googleworkspace_group" "sales" {
17+
18+
}
19+
20+
data "googleworkspace_group_members" "sales" {
21+
group_id = data.googleworkspace_group.sales.id
22+
}
23+
24+
output "group_members" {
25+
value = data.googleworkspace_group_members.sales.members
26+
}
27+
```
28+
29+
<!-- schema generated by tfplugindocs -->
30+
## Schema
31+
32+
### Required
33+
34+
- **group_id** (String) Identifies the group in the API request. The value can be the group's email address, group alias, or the unique group ID.
35+
36+
### Read-Only
37+
38+
- **etag** (String) ETag of the resource.
39+
- **id** (String) The ID of this resource.
40+
- **members** (Set of Object) The members of the group (see [below for nested schema](#nestedatt--members))
41+
42+
<a id="nestedatt--members"></a>
43+
### Nested Schema for `members`
44+
45+
Read-Only:
46+
47+
- **delivery_settings** (String)
48+
- **email** (String)
49+
- **id** (String)
50+
- **role** (String)
51+
- **status** (String)
52+
- **type** (String)
53+
54+

docs/resources/group_members.md

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "googleworkspace_group_members Resource - terraform-provider-googleworkspace"
4+
subcategory: ""
5+
description: |-
6+
Group Members resource manages Google Workspace Groups Members. Group Members resides under the https://www.googleapis.com/auth/admin.directory.group client scope.
7+
---
8+
9+
# googleworkspace_group_members (Resource)
10+
11+
Group Members resource manages Google Workspace Groups Members. Group Members resides under the `https://www.googleapis.com/auth/admin.directory.group` client scope.
12+
13+
## Example Usage
14+
15+
```terraform
16+
resource "googleworkspace_group" "sales" {
17+
18+
}
19+
20+
resource "googleworkspace_user" "michael" {
21+
primary_email = "[email protected]"
22+
password = "34819d7beeabb9260a5c854bc85b3e44"
23+
hash_function = "MD5"
24+
25+
name {
26+
family_name = "Scott"
27+
given_name = "Michael"
28+
}
29+
}
30+
31+
resource "googleworkspace_user" "frank" {
32+
primary_email = "[email protected]"
33+
password = "2095312189753de6ad47dfe20cbe97ec"
34+
hash_function = "MD5"
35+
36+
name {
37+
family_name = "Scott"
38+
given_name = "Frank"
39+
}
40+
}
41+
42+
resource "googleworkspace_group_members" "sales" {
43+
group_id = googleworkspace_group.sales.id
44+
45+
members {
46+
email = googleworkspace_user.michael.primary_email
47+
role = "MANAGER"
48+
}
49+
50+
members {
51+
email = googleworkspace_user.frank.primary_email
52+
role = "MEMBER"
53+
}
54+
}
55+
```
56+
57+
<!-- schema generated by tfplugindocs -->
58+
## Schema
59+
60+
### Required
61+
62+
- **group_id** (String) Identifies the group in the API request. The value can be the group's email address, group alias, or the unique group ID.
63+
- **members** (Block Set, Min: 1) The members of the group (see [below for nested schema](#nestedblock--members))
64+
65+
### Read-Only
66+
67+
- **etag** (String) ETag of the resource.
68+
- **id** (String) The ID of this resource.
69+
70+
<a id="nestedblock--members"></a>
71+
### Nested Schema for `members`
72+
73+
Required:
74+
75+
- **email** (String) The member's email address. A member can be a user or another group. This property isrequired when adding a member to a group. The email must be unique and cannot be an alias of another group. If the email address is changed, the API automatically reflects the email address changes.
76+
77+
Optional:
78+
79+
- **delivery_settings** (String) Defines mail delivery preferences of member. Acceptable values are:`ALL_MAIL`: All messages, delivered as soon as they arrive. `DAILY`: No more than one message a day. `DIGEST`: Up to 25 messages bundled into a single message. `DISABLED`: Remove subscription. `NONE`: No messages. Defaults to `ALL_MAIL`.
80+
- **role** (String) The member's role in a group. The API returns an error for cycles in group memberships. For example, if group1 is a member of group2, group2 cannot be a member of group1. Acceptable values are: `MANAGER`: This role is only available if the Google Groups for Business is enabled using the Admin Console. A `MANAGER` role can do everything done by an `OWNER` role except make a member an `OWNER` or delete the group. A group can have multiple `MANAGER` members. `MEMBER`: This role can subscribe to a group, view discussion archives, and view the group's membership list. `OWNER`: This role can send messages to the group, add or remove members, change member roles, change group's settings, and delete the group. An OWNER must be a member of the group. A group can have more than one OWNER. Defaults to `MEMBER`.
81+
- **type** (String) The type of group member. Acceptable values are: `CUSTOMER`: The member represents all users in a domain. An email address is not returned and the ID returned is the customer ID. `GROUP`: The member is another group. `USER`: The member is a user. Defaults to `USER`.
82+
83+
Read-Only:
84+
85+
- **id** (String) The unique ID of the group member. A member id can be used as a member request URI's memberKey.
86+
- **status** (String) Status of member.
87+
88+
## Import
89+
90+
Import is supported using the following syntax:
91+
92+
```shell
93+
terraform import googleworkspace_group_members.sales groups/01abcde23fg4h5i
94+
```
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
data "googleworkspace_group" "sales" {
2+
3+
}
4+
5+
data "googleworkspace_group_members" "sales" {
6+
group_id = data.googleworkspace_group.sales.id
7+
}
8+
9+
output "group_members" {
10+
value = data.googleworkspace_group_members.sales.members
11+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
terraform import googleworkspace_group_members.sales groups/01abcde23fg4h5i
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
resource "googleworkspace_group" "sales" {
2+
3+
}
4+
5+
resource "googleworkspace_user" "michael" {
6+
primary_email = "[email protected]"
7+
password = "34819d7beeabb9260a5c854bc85b3e44"
8+
hash_function = "MD5"
9+
10+
name {
11+
family_name = "Scott"
12+
given_name = "Michael"
13+
}
14+
}
15+
16+
resource "googleworkspace_user" "frank" {
17+
primary_email = "[email protected]"
18+
password = "2095312189753de6ad47dfe20cbe97ec"
19+
hash_function = "MD5"
20+
21+
name {
22+
family_name = "Scott"
23+
given_name = "Frank"
24+
}
25+
}
26+
27+
resource "googleworkspace_group_members" "sales" {
28+
group_id = googleworkspace_group.sales.id
29+
30+
members {
31+
email = googleworkspace_user.michael.primary_email
32+
role = "MANAGER"
33+
}
34+
35+
members {
36+
email = googleworkspace_user.frank.primary_email
37+
role = "MEMBER"
38+
}
39+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package googleworkspace
2+
3+
import (
4+
"context"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
8+
)
9+
10+
func dataSourceGroupMembers() *schema.Resource {
11+
// Generate datasource schema from resource
12+
dsSchema := datasourceSchemaFromResourceSchema(resourceGroupMembers().Schema)
13+
addRequiredFieldsToSchema(dsSchema, "group_id")
14+
15+
return &schema.Resource{
16+
// This description is used by the documentation generator and the language server.
17+
Description: "Group Members data source in the Terraform Googleworkspace provider. Group Members resides " +
18+
"under the `https://www.googleapis.com/auth/admin.directory.group` client scope.",
19+
20+
ReadContext: dataSourceGroupMembersRead,
21+
22+
Schema: dsSchema,
23+
}
24+
}
25+
26+
func dataSourceGroupMembersRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
27+
return resourceGroupMembersRead(ctx, d, meta)
28+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package googleworkspace
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"testing"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
10+
)
11+
12+
func TestAccDataSourceGroupMembers(t *testing.T) {
13+
t.Parallel()
14+
15+
domainName := os.Getenv("GOOGLEWORKSPACE_DOMAIN")
16+
17+
if domainName == "" {
18+
t.Skip("GOOGLEWORKSPACE_DOMAIN needs to be set to run this test")
19+
}
20+
21+
testGroupVals := map[string]interface{}{
22+
"userEmail": fmt.Sprintf("tf-test-%s@%s", acctest.RandString(10), domainName),
23+
"groupEmail": fmt.Sprintf("tf-test-%s@%s", acctest.RandString(10), domainName),
24+
"password": acctest.RandString(10),
25+
}
26+
27+
resource.Test(t, resource.TestCase{
28+
PreCheck: func() { testAccPreCheck(t) },
29+
ProviderFactories: providerFactories,
30+
Steps: []resource.TestStep{
31+
{
32+
Config: testAccDataSourceGroupMembers(testGroupVals),
33+
Check: resource.ComposeTestCheckFunc(
34+
resource.TestCheckResourceAttr(
35+
"data.googleworkspace_group_members.my-group-members", "members.#", "1"),
36+
resource.TestCheckTypeSetElemNestedAttrs(
37+
"data.googleworkspace_group_members.my-group-members", "members.*", map[string]string{
38+
"email": Nprintf("%{userEmail}", testGroupVals),
39+
"role": "MEMBER",
40+
"type": "USER",
41+
}),
42+
),
43+
},
44+
},
45+
})
46+
}
47+
48+
func testAccDataSourceGroupMembers(testGroupVals map[string]interface{}) string {
49+
return Nprintf(`
50+
resource "googleworkspace_group" "my-group" {
51+
email = "%{groupEmail}"
52+
}
53+
54+
resource "googleworkspace_user" "my-new-user" {
55+
primary_email = "%{userEmail}"
56+
password = "%{password}"
57+
58+
name {
59+
family_name = "Scott"
60+
given_name = "Michael"
61+
}
62+
}
63+
64+
resource "googleworkspace_group_member" "my-group-member" {
65+
group_id = googleworkspace_group.my-group.id
66+
email = googleworkspace_user.my-new-user.primary_email
67+
}
68+
69+
data "googleworkspace_group_members" "my-group-members" {
70+
group_id = googleworkspace_group.my-group.id
71+
72+
depends_on = [googleworkspace_group_member.my-group-member]
73+
}
74+
`, testGroupVals)
75+
}

internal/provider/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ func New(version string) func() *schema.Provider {
115115
"googleworkspace_domain_alias": dataSourceDomainAlias(),
116116
"googleworkspace_group": dataSourceGroup(),
117117
"googleworkspace_group_member": dataSourceGroupMember(),
118+
"googleworkspace_group_members": dataSourceGroupMembers(),
118119
"googleworkspace_group_settings": dataSourceGroupSettings(),
119120
"googleworkspace_org_unit": dataSourceOrgUnit(),
120121
"googleworkspace_privileges": dataSourcePrivileges(),
@@ -129,6 +130,7 @@ func New(version string) func() *schema.Provider {
129130
"googleworkspace_gmail_send_as_alias": resourceGmailSendAsAlias(),
130131
"googleworkspace_group": resourceGroup(),
131132
"googleworkspace_group_member": resourceGroupMember(),
133+
"googleworkspace_group_members": resourceGroupMembers(),
132134
"googleworkspace_group_settings": resourceGroupSettings(),
133135
"googleworkspace_org_unit": resourceOrgUnit(),
134136
"googleworkspace_role": resourceRole(),

0 commit comments

Comments
 (0)