]> git.immae.eu Git - github/fretlink/terraform-provider-statuscake.git/blob - vendor/cloud.google.com/go/storage/iam.go
Upgrade to 0.12
[github/fretlink/terraform-provider-statuscake.git] / vendor / cloud.google.com / go / storage / iam.go
1 // Copyright 2017 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 package storage
16
17 import (
18 "context"
19
20 "cloud.google.com/go/iam"
21 "cloud.google.com/go/internal/trace"
22 raw "google.golang.org/api/storage/v1"
23 iampb "google.golang.org/genproto/googleapis/iam/v1"
24 )
25
26 // IAM provides access to IAM access control for the bucket.
27 func (b *BucketHandle) IAM() *iam.Handle {
28 return iam.InternalNewHandleClient(&iamClient{
29 raw: b.c.raw,
30 userProject: b.userProject,
31 }, b.name)
32 }
33
34 // iamClient implements the iam.client interface.
35 type iamClient struct {
36 raw *raw.Service
37 userProject string
38 }
39
40 func (c *iamClient) Get(ctx context.Context, resource string) (p *iampb.Policy, err error) {
41 ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.IAM.Get")
42 defer func() { trace.EndSpan(ctx, err) }()
43
44 call := c.raw.Buckets.GetIamPolicy(resource)
45 setClientHeader(call.Header())
46 if c.userProject != "" {
47 call.UserProject(c.userProject)
48 }
49 var rp *raw.Policy
50 err = runWithRetry(ctx, func() error {
51 rp, err = call.Context(ctx).Do()
52 return err
53 })
54 if err != nil {
55 return nil, err
56 }
57 return iamFromStoragePolicy(rp), nil
58 }
59
60 func (c *iamClient) Set(ctx context.Context, resource string, p *iampb.Policy) (err error) {
61 ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.IAM.Set")
62 defer func() { trace.EndSpan(ctx, err) }()
63
64 rp := iamToStoragePolicy(p)
65 call := c.raw.Buckets.SetIamPolicy(resource, rp)
66 setClientHeader(call.Header())
67 if c.userProject != "" {
68 call.UserProject(c.userProject)
69 }
70 return runWithRetry(ctx, func() error {
71 _, err := call.Context(ctx).Do()
72 return err
73 })
74 }
75
76 func (c *iamClient) Test(ctx context.Context, resource string, perms []string) (permissions []string, err error) {
77 ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.IAM.Test")
78 defer func() { trace.EndSpan(ctx, err) }()
79
80 call := c.raw.Buckets.TestIamPermissions(resource, perms)
81 setClientHeader(call.Header())
82 if c.userProject != "" {
83 call.UserProject(c.userProject)
84 }
85 var res *raw.TestIamPermissionsResponse
86 err = runWithRetry(ctx, func() error {
87 res, err = call.Context(ctx).Do()
88 return err
89 })
90 if err != nil {
91 return nil, err
92 }
93 return res.Permissions, nil
94 }
95
96 func iamToStoragePolicy(ip *iampb.Policy) *raw.Policy {
97 return &raw.Policy{
98 Bindings: iamToStorageBindings(ip.Bindings),
99 Etag: string(ip.Etag),
100 }
101 }
102
103 func iamToStorageBindings(ibs []*iampb.Binding) []*raw.PolicyBindings {
104 var rbs []*raw.PolicyBindings
105 for _, ib := range ibs {
106 rbs = append(rbs, &raw.PolicyBindings{
107 Role: ib.Role,
108 Members: ib.Members,
109 })
110 }
111 return rbs
112 }
113
114 func iamFromStoragePolicy(rp *raw.Policy) *iampb.Policy {
115 return &iampb.Policy{
116 Bindings: iamFromStorageBindings(rp.Bindings),
117 Etag: []byte(rp.Etag),
118 }
119 }
120
121 func iamFromStorageBindings(rbs []*raw.PolicyBindings) []*iampb.Binding {
122 var ibs []*iampb.Binding
123 for _, rb := range rbs {
124 ibs = append(ibs, &iampb.Binding{
125 Role: rb.Role,
126 Members: rb.Members,
127 })
128 }
129 return ibs
130 }