Lokasi ngalangkungan proxy:   [ UP ]  
[Ngawartoskeun bug]   [Panyetelan cookie]                
Skip to content

Commit 926acfd

Browse files
authored
Merge pull request hashicorp#8092 from evandbrown/google-iam-resource
providers/google: Support IAM permissions for GCP projects
2 parents f257895 + 262661a commit 926acfd

12 files changed

Lines changed: 6259 additions & 6 deletions

File tree

builtin/providers/google/config.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"golang.org/x/oauth2"
1414
"golang.org/x/oauth2/google"
1515
"golang.org/x/oauth2/jwt"
16+
"google.golang.org/api/cloudresourcemanager/v1"
1617
"google.golang.org/api/compute/v1"
1718
"google.golang.org/api/container/v1"
1819
"google.golang.org/api/dns/v1"
@@ -28,12 +29,13 @@ type Config struct {
2829
Project string
2930
Region string
3031

31-
clientCompute *compute.Service
32-
clientContainer *container.Service
33-
clientDns *dns.Service
34-
clientStorage *storage.Service
35-
clientSqlAdmin *sqladmin.Service
36-
clientPubsub *pubsub.Service
32+
clientCompute *compute.Service
33+
clientContainer *container.Service
34+
clientDns *dns.Service
35+
clientPubsub *pubsub.Service
36+
clientResourceManager *cloudresourcemanager.Service
37+
clientStorage *storage.Service
38+
clientSqlAdmin *sqladmin.Service
3739
}
3840

3941
func (c *Config) loadAndValidate() error {
@@ -133,6 +135,13 @@ func (c *Config) loadAndValidate() error {
133135
}
134136
c.clientPubsub.UserAgent = userAgent
135137

138+
log.Printf("[INFO] Instatiating Google CloudResourceManager Client...")
139+
c.clientResourceManager, err = cloudresourcemanager.New(client)
140+
if err != nil {
141+
return err
142+
}
143+
c.clientPubsub.UserAgent = userAgent
144+
136145
return nil
137146
}
138147

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package google
2+
3+
import (
4+
"encoding/json"
5+
"strconv"
6+
7+
"github.com/hashicorp/terraform/helper/hashcode"
8+
"github.com/hashicorp/terraform/helper/schema"
9+
"google.golang.org/api/cloudresourcemanager/v1"
10+
)
11+
12+
var iamBinding *schema.Schema = &schema.Schema{
13+
Type: schema.TypeSet,
14+
Required: true,
15+
Elem: &schema.Resource{
16+
Schema: map[string]*schema.Schema{
17+
"role": {
18+
Type: schema.TypeString,
19+
Required: true,
20+
},
21+
"members": {
22+
Type: schema.TypeSet,
23+
Required: true,
24+
Elem: &schema.Schema{Type: schema.TypeString},
25+
Set: schema.HashString,
26+
},
27+
},
28+
},
29+
}
30+
31+
// dataSourceGoogleIamPolicy returns a *schema.Resource that allows a customer
32+
// to express a Google Cloud IAM policy in a data resource. This is an example
33+
// of how the schema would be used in a config:
34+
//
35+
// data "google_iam_policy" "admin" {
36+
// binding {
37+
// role = "roles/storage.objectViewer"
38+
// members = [
39+
// "user:evanbrown@google.com",
40+
// ]
41+
// }
42+
// }
43+
func dataSourceGoogleIamPolicy() *schema.Resource {
44+
return &schema.Resource{
45+
Read: dataSourceGoogleIamPolicyRead,
46+
Schema: map[string]*schema.Schema{
47+
"binding": iamBinding,
48+
"policy_data": {
49+
Type: schema.TypeString,
50+
Computed: true,
51+
},
52+
},
53+
}
54+
}
55+
56+
// dataSourceGoogleIamPolicyRead reads a data source from config and writes it
57+
// to state.
58+
func dataSourceGoogleIamPolicyRead(d *schema.ResourceData, meta interface{}) error {
59+
var policy cloudresourcemanager.Policy
60+
var bindings []*cloudresourcemanager.Binding
61+
62+
// The schema supports multiple binding{} blocks
63+
bset := d.Get("binding").(*schema.Set)
64+
65+
// All binding{} blocks will be converted and stored in an array
66+
bindings = make([]*cloudresourcemanager.Binding, bset.Len())
67+
policy.Bindings = bindings
68+
69+
// Convert each config binding into a cloudresourcemanager.Binding
70+
for i, v := range bset.List() {
71+
binding := v.(map[string]interface{})
72+
policy.Bindings[i] = &cloudresourcemanager.Binding{
73+
Role: binding["role"].(string),
74+
Members: dataSourceGoogleIamPolicyMembers(binding["members"].(*schema.Set)),
75+
}
76+
}
77+
78+
// Marshal cloudresourcemanager.Policy to JSON suitable for storing in state
79+
pjson, err := json.Marshal(&policy)
80+
if err != nil {
81+
// should never happen if the above code is correct
82+
return err
83+
}
84+
pstring := string(pjson)
85+
86+
d.Set("policy_data", pstring)
87+
d.SetId(strconv.Itoa(hashcode.String(pstring)))
88+
89+
return nil
90+
}
91+
92+
// dataSourceGoogleIamPolicyMembers converts a set of members in a binding
93+
// (a member is a principal, usually an e-mail address) into an array of
94+
// string.
95+
func dataSourceGoogleIamPolicyMembers(d *schema.Set) []string {
96+
var members []string
97+
members = make([]string, d.Len())
98+
99+
for i, v := range d.List() {
100+
members[i] = v.(string)
101+
}
102+
return members
103+
}

builtin/providers/google/provider.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ func Provider() terraform.ResourceProvider {
5656
},
5757
},
5858

59+
DataSourcesMap: map[string]*schema.Resource{
60+
"google_iam_policy": dataSourceGoogleIamPolicy(),
61+
},
62+
5963
ResourcesMap: map[string]*schema.Resource{
6064
"google_compute_autoscaler": resourceComputeAutoscaler(),
6165
"google_compute_address": resourceComputeAddress(),
@@ -89,6 +93,7 @@ func Provider() terraform.ResourceProvider {
8993
"google_sql_database": resourceSqlDatabase(),
9094
"google_sql_database_instance": resourceSqlDatabaseInstance(),
9195
"google_sql_user": resourceSqlUser(),
96+
"google_project": resourceGoogleProject(),
9297
"google_pubsub_topic": resourcePubsubTopic(),
9398
"google_pubsub_subscription": resourcePubsubSubscription(),
9499
"google_storage_bucket": resourceStorageBucket(),

0 commit comments

Comments
 (0)