forked from hashicorp/terraform-provider-google-beta
/
data_source_cloud_identity_group_memberships.go
102 lines (87 loc) · 3.16 KB
/
data_source_cloud_identity_group_memberships.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package cloudidentity
import (
"fmt"
"time"
"github.com/lorioux/google-beta/google-beta/tpgresource"
transport_tpg "github.com/lorioux/google-beta/google-beta/transport"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
cloudidentity "google.golang.org/api/cloudidentity/v1beta1"
)
func DataSourceGoogleCloudIdentityGroupMemberships() *schema.Resource {
// Generate datasource schema from resource
dsSchema := tpgresource.DatasourceSchemaFromResourceSchema(ResourceCloudIdentityGroupMembership().Schema)
return &schema.Resource{
Read: dataSourceGoogleCloudIdentityGroupMembershipsRead,
Schema: map[string]*schema.Schema{
"memberships": {
Type: schema.TypeList,
Computed: true,
Description: `List of Cloud Identity group memberships.`,
Elem: &schema.Resource{
Schema: dsSchema,
},
},
"group": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName,
Description: `The name of the Group to get memberships from.`,
},
},
}
}
func dataSourceGoogleCloudIdentityGroupMembershipsRead(d *schema.ResourceData, meta interface{}) error {
config := meta.(*transport_tpg.Config)
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
if err != nil {
return err
}
result := []map[string]interface{}{}
membershipsCall := config.NewCloudIdentityClient(userAgent).Groups.Memberships.List(d.Get("group").(string)).View("FULL")
if config.UserProjectOverride {
billingProject := ""
// err may be nil - project isn't required for this resource
if project, err := tpgresource.GetProject(d, config); err == nil {
billingProject = project
}
// err == nil indicates that the billing_project value was found
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
billingProject = bp
}
if billingProject != "" {
membershipsCall.Header().Set("X-Goog-User-Project", billingProject)
}
}
err = membershipsCall.Pages(config.Context, func(resp *cloudidentity.ListMembershipsResponse) error {
for _, member := range resp.Memberships {
result = append(result, map[string]interface{}{
"name": member.Name,
"type": member.Type,
"roles": flattenCloudIdentityGroupMembershipsRoles(member.Roles),
"member_key": flattenCloudIdentityGroupsEntityKey(member.MemberKey),
"preferred_member_key": flattenCloudIdentityGroupsEntityKey(member.PreferredMemberKey),
})
}
return nil
})
if err != nil {
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("CloudIdentityGroupMemberships %q", d.Id()))
}
if err := d.Set("memberships", result); err != nil {
return fmt.Errorf("Error setting memberships: %s", err)
}
d.SetId(time.Now().UTC().String())
return nil
}
func flattenCloudIdentityGroupMembershipsRoles(roles []*cloudidentity.MembershipRole) []interface{} {
transformed := []interface{}{}
for _, role := range roles {
transformed = append(transformed, map[string]interface{}{
"name": role.Name,
})
}
return transformed
}