gcloud 0.11.0 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/AUTHENTICATION.md +3 -3
- data/CHANGELOG.md +92 -0
- data/OVERVIEW.md +3 -3
- data/lib/gcloud.rb +75 -25
- data/lib/gcloud/backoff.rb +5 -1
- data/lib/gcloud/bigquery.rb +25 -43
- data/lib/gcloud/bigquery/copy_job.rb +13 -13
- data/lib/gcloud/bigquery/data.rb +20 -16
- data/lib/gcloud/bigquery/dataset.rb +202 -177
- data/lib/gcloud/bigquery/dataset/access.rb +118 -104
- data/lib/gcloud/bigquery/dataset/list.rb +14 -18
- data/lib/gcloud/bigquery/extract_job.rb +12 -12
- data/lib/gcloud/bigquery/insert_response.rb +12 -14
- data/lib/gcloud/bigquery/job.rb +45 -57
- data/lib/gcloud/bigquery/job/list.rb +18 -24
- data/lib/gcloud/bigquery/load_job.rb +35 -27
- data/lib/gcloud/bigquery/project.rb +53 -73
- data/lib/gcloud/bigquery/query_data.rb +28 -35
- data/lib/gcloud/bigquery/query_job.rb +18 -18
- data/lib/gcloud/bigquery/schema.rb +359 -0
- data/lib/gcloud/bigquery/service.rb +506 -0
- data/lib/gcloud/bigquery/table.rb +185 -266
- data/lib/gcloud/bigquery/table/list.rb +15 -19
- data/lib/gcloud/bigquery/view.rb +126 -81
- data/lib/gcloud/datastore.rb +39 -27
- data/lib/gcloud/datastore/commit.rb +2 -2
- data/lib/gcloud/datastore/dataset.rb +8 -19
- data/lib/gcloud/datastore/dataset/lookup_results.rb +2 -4
- data/lib/gcloud/datastore/dataset/query_results.rb +0 -2
- data/lib/gcloud/datastore/entity.rb +7 -1
- data/lib/gcloud/datastore/errors.rb +5 -27
- data/lib/gcloud/datastore/grpc_utils.rb +4 -3
- data/lib/gcloud/datastore/key.rb +6 -0
- data/lib/gcloud/datastore/service.rb +18 -12
- data/lib/gcloud/datastore/transaction.rb +0 -10
- data/lib/gcloud/dns.rb +29 -19
- data/lib/gcloud/dns/change.rb +10 -15
- data/lib/gcloud/dns/change/list.rb +4 -4
- data/lib/gcloud/dns/importer.rb +1 -1
- data/lib/gcloud/dns/project.rb +32 -49
- data/lib/gcloud/dns/record.rb +8 -2
- data/lib/gcloud/dns/record/list.rb +4 -4
- data/lib/gcloud/dns/service.rb +167 -0
- data/lib/gcloud/dns/zone.rb +33 -52
- data/lib/gcloud/dns/zone/list.rb +12 -16
- data/lib/gcloud/errors.rb +31 -19
- data/lib/gcloud/logging.rb +50 -39
- data/lib/gcloud/logging/entry.rb +197 -24
- data/lib/gcloud/logging/entry/list.rb +0 -2
- data/lib/gcloud/logging/logger.rb +1 -1
- data/lib/gcloud/logging/metric.rb +3 -9
- data/lib/gcloud/logging/metric/list.rb +0 -2
- data/lib/gcloud/logging/project.rb +58 -54
- data/lib/gcloud/logging/resource_descriptor.rb +2 -2
- data/lib/gcloud/logging/resource_descriptor/list.rb +0 -2
- data/lib/gcloud/logging/service.rb +32 -23
- data/lib/gcloud/logging/sink.rb +8 -14
- data/lib/gcloud/logging/sink/list.rb +0 -2
- data/lib/gcloud/pubsub.rb +21 -16
- data/lib/gcloud/pubsub/policy.rb +204 -0
- data/lib/gcloud/pubsub/project.rb +26 -38
- data/lib/gcloud/pubsub/service.rb +39 -31
- data/lib/gcloud/pubsub/subscription.rb +56 -59
- data/lib/gcloud/pubsub/subscription/list.rb +4 -4
- data/lib/gcloud/pubsub/topic.rb +69 -66
- data/lib/gcloud/pubsub/topic/list.rb +0 -2
- data/lib/gcloud/pubsub/topic/{batch.rb → publisher.rb} +15 -2
- data/lib/gcloud/resource_manager.rb +27 -26
- data/lib/gcloud/resource_manager/manager.rb +19 -39
- data/lib/gcloud/resource_manager/policy.rb +211 -0
- data/lib/gcloud/resource_manager/project.rb +97 -121
- data/lib/gcloud/resource_manager/project/list.rb +7 -7
- data/lib/gcloud/resource_manager/project/updater.rb +4 -9
- data/lib/gcloud/resource_manager/service.rb +127 -0
- data/lib/gcloud/storage.rb +24 -42
- data/lib/gcloud/storage/bucket.rb +104 -192
- data/lib/gcloud/storage/bucket/acl.rb +47 -143
- data/lib/gcloud/storage/bucket/cors.rb +55 -11
- data/lib/gcloud/storage/bucket/list.rb +14 -14
- data/lib/gcloud/storage/errors.rb +3 -43
- data/lib/gcloud/storage/file.rb +114 -111
- data/lib/gcloud/storage/file/acl.rb +27 -113
- data/lib/gcloud/storage/file/list.rb +21 -21
- data/lib/gcloud/storage/project.rb +49 -59
- data/lib/gcloud/storage/service.rb +347 -0
- data/lib/gcloud/translate.rb +24 -14
- data/lib/gcloud/translate/api.rb +12 -21
- data/lib/gcloud/translate/detection.rb +5 -5
- data/lib/gcloud/translate/language.rb +1 -1
- data/lib/gcloud/translate/service.rb +80 -0
- data/lib/gcloud/translate/translation.rb +6 -6
- data/lib/gcloud/version.rb +1 -1
- data/lib/gcloud/vision.rb +24 -15
- data/lib/gcloud/vision/annotate.rb +24 -21
- data/lib/gcloud/vision/annotation.rb +9 -9
- data/lib/gcloud/vision/annotation/entity.rb +11 -11
- data/lib/gcloud/vision/annotation/face.rb +25 -25
- data/lib/gcloud/vision/annotation/properties.rb +8 -8
- data/lib/gcloud/vision/annotation/safe_search.rb +4 -4
- data/lib/gcloud/vision/annotation/text.rb +7 -7
- data/lib/gcloud/vision/annotation/vertex.rb +1 -1
- data/lib/gcloud/vision/image.rb +11 -11
- data/lib/gcloud/vision/location.rb +5 -2
- data/lib/gcloud/vision/project.rb +14 -16
- data/lib/gcloud/vision/service.rb +66 -0
- data/lib/google/api_client.rb +0 -0
- metadata +27 -24
- data/lib/gcloud/bigquery/connection.rb +0 -624
- data/lib/gcloud/bigquery/errors.rb +0 -68
- data/lib/gcloud/bigquery/table/schema.rb +0 -234
- data/lib/gcloud/dns/connection.rb +0 -173
- data/lib/gcloud/dns/errors.rb +0 -68
- data/lib/gcloud/resource_manager/connection.rb +0 -134
- data/lib/gcloud/resource_manager/errors.rb +0 -68
- data/lib/gcloud/storage/connection.rb +0 -444
- data/lib/gcloud/translate/connection.rb +0 -85
- data/lib/gcloud/translate/errors.rb +0 -68
- data/lib/gcloud/upload.rb +0 -95
- data/lib/gcloud/vision/connection.rb +0 -63
- data/lib/gcloud/vision/errors.rb +0 -69
@@ -0,0 +1,211 @@
|
|
1
|
+
# Copyright 2016 Google Inc. All rights reserved.
|
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
|
+
|
16
|
+
require "gcloud/errors"
|
17
|
+
require "google/apis/cloudresourcemanager_v1beta1"
|
18
|
+
|
19
|
+
module Gcloud
|
20
|
+
module ResourceManager
|
21
|
+
##
|
22
|
+
# # Policy
|
23
|
+
#
|
24
|
+
# Represents a Cloud IAM Policy for the Resource Manager service.
|
25
|
+
#
|
26
|
+
# A common pattern for updating a resource's metadata, such as its Policy,
|
27
|
+
# is to read the current data from the service, update the data locally, and
|
28
|
+
# then send the modified data for writing. This pattern may result in a
|
29
|
+
# conflict if two or more processes attempt the sequence simultaneously. IAM
|
30
|
+
# solves this problem with the {Gcloud::ResourceManager::Policy#etag}
|
31
|
+
# property, which is used to verify whether the policy has changed since the
|
32
|
+
# last request. When you make a request to with an `etag` value, Cloud IAM
|
33
|
+
# compares the `etag` value in the request with the existing `etag` value
|
34
|
+
# associated with the policy. It writes the policy only if the `etag` values
|
35
|
+
# match.
|
36
|
+
#
|
37
|
+
# When you update a policy, first read the policy (and its current `etag`)
|
38
|
+
# from the service, then modify the policy locally, and then write the
|
39
|
+
# modified policy to the service. See
|
40
|
+
# {Gcloud::ResourceManager::Project#policy} and
|
41
|
+
# {Gcloud::ResourceManager::Project#policy=}.
|
42
|
+
#
|
43
|
+
# @see https://cloud.google.com/iam/docs/managing-policies Managing policies
|
44
|
+
# @see https://cloud.google.com/resource-manager/reference/rest/v1beta1/projects/setIamPolicy
|
45
|
+
# projects.setIamPolicy
|
46
|
+
#
|
47
|
+
# @attr [String] etag Used to verify whether the policy has changed since
|
48
|
+
# the last request. The policy will be written only if the `etag` values
|
49
|
+
# match.
|
50
|
+
# @attr [Hash{String => Array<String>}] roles The bindings that associate
|
51
|
+
# roles with an array of members. See [Understanding
|
52
|
+
# Roles](https://cloud.google.com/iam/docs/understanding-roles) for a
|
53
|
+
# listing of primitive and curated roles.
|
54
|
+
# See [Binding](https://cloud.google.com/resource-manager/reference/rpc/google.iam.v1#binding)
|
55
|
+
# for a listing of values and patterns for members.
|
56
|
+
#
|
57
|
+
# @example
|
58
|
+
# require "gcloud"
|
59
|
+
#
|
60
|
+
# gcloud = Gcloud.new
|
61
|
+
# resource_manager = gcloud.resource_manager
|
62
|
+
# project = resource_manager.project "tokyo-rain-123"
|
63
|
+
#
|
64
|
+
# policy = project.policy # API call
|
65
|
+
#
|
66
|
+
# policy.remove "roles/owner", "user:owner@example.com" # Local call
|
67
|
+
# policy.add "roles/owner", "user:newowner@example.com" # Local call
|
68
|
+
# policy.roles["roles/viewer"] = ["allUsers"] # Local call
|
69
|
+
#
|
70
|
+
# project.policy = policy # API call
|
71
|
+
#
|
72
|
+
class Policy
|
73
|
+
##
|
74
|
+
# Alias to the Google Client API module
|
75
|
+
API = Google::Apis::CloudresourcemanagerV1
|
76
|
+
|
77
|
+
attr_reader :etag, :roles
|
78
|
+
|
79
|
+
##
|
80
|
+
# @private Creates a Policy object.
|
81
|
+
def initialize etag, roles
|
82
|
+
@etag = etag
|
83
|
+
@roles = roles
|
84
|
+
end
|
85
|
+
|
86
|
+
##
|
87
|
+
# Convenience method for adding a member to a binding on this policy.
|
88
|
+
# See [Understanding
|
89
|
+
# Roles](https://cloud.google.com/iam/docs/understanding-roles) for a
|
90
|
+
# listing of primitive and curated roles.
|
91
|
+
# See [Binding](https://cloud.google.com/resource-manager/reference/rpc/google.iam.v1#binding)
|
92
|
+
# for a listing of values and patterns for members.
|
93
|
+
#
|
94
|
+
# @param [String] role_name A Cloud IAM role, such as `"roles/owner"`.
|
95
|
+
# @param [String] member A Cloud IAM identity, such as
|
96
|
+
# `"user:owner@example.com"`.
|
97
|
+
#
|
98
|
+
# @example
|
99
|
+
# require "gcloud"
|
100
|
+
#
|
101
|
+
# gcloud = Gcloud.new
|
102
|
+
# resource_manager = gcloud.resource_manager
|
103
|
+
# project = resource_manager.project "tokyo-rain-123"
|
104
|
+
#
|
105
|
+
# policy = project.policy # API call
|
106
|
+
#
|
107
|
+
# policy.add "roles/owner", "user:newowner@example.com" # Local call
|
108
|
+
#
|
109
|
+
# project.policy = policy # API call
|
110
|
+
#
|
111
|
+
def add role_name, member
|
112
|
+
role(role_name) << member
|
113
|
+
end
|
114
|
+
|
115
|
+
##
|
116
|
+
# Convenience method for removing a member from a binding on this policy.
|
117
|
+
# See [Understanding
|
118
|
+
# Roles](https://cloud.google.com/iam/docs/understanding-roles) for a
|
119
|
+
# listing of primitive and curated roles.
|
120
|
+
# See [Binding](https://cloud.google.com/resource-manager/reference/rpc/google.iam.v1#binding)
|
121
|
+
# for a listing of values and patterns for members.
|
122
|
+
#
|
123
|
+
# @param [String] role_name A Cloud IAM role, such as `"roles/owner"`.
|
124
|
+
# @param [String] member A Cloud IAM identity, such as
|
125
|
+
# `"user:owner@example.com"`.
|
126
|
+
#
|
127
|
+
# @example
|
128
|
+
# require "gcloud"
|
129
|
+
#
|
130
|
+
# gcloud = Gcloud.new
|
131
|
+
# resource_manager = gcloud.resource_manager
|
132
|
+
# project = resource_manager.project "tokyo-rain-123"
|
133
|
+
#
|
134
|
+
# policy = project.policy # API call
|
135
|
+
#
|
136
|
+
# policy.remove "roles/owner", "user:owner@example.com" # Local call
|
137
|
+
#
|
138
|
+
# project.policy = policy # API call
|
139
|
+
#
|
140
|
+
def remove role_name, member
|
141
|
+
role(role_name).delete member
|
142
|
+
end
|
143
|
+
|
144
|
+
##
|
145
|
+
# Convenience method returning the array of members bound to a role in
|
146
|
+
# this policy, or an empty array if no value is present for the role in
|
147
|
+
# {#roles}. See [Understanding
|
148
|
+
# Roles](https://cloud.google.com/iam/docs/understanding-roles) for a
|
149
|
+
# listing of primitive and curated roles. See
|
150
|
+
# [Binding](https://cloud.google.com/resource-manager/reference/rpc/google.iam.v1#binding)
|
151
|
+
# for a listing of values and patterns for members.
|
152
|
+
#
|
153
|
+
# @return [Array<String>] The members strings, or an empty array.
|
154
|
+
#
|
155
|
+
# @example
|
156
|
+
# require "gcloud"
|
157
|
+
#
|
158
|
+
# gcloud = Gcloud.new
|
159
|
+
# resource_manager = gcloud.resource_manager
|
160
|
+
# project = resource_manager.project "tokyo-rain-123"
|
161
|
+
#
|
162
|
+
# policy = project.policy
|
163
|
+
#
|
164
|
+
# policy.role("roles/viewer") << "user:viewer@example.com"
|
165
|
+
#
|
166
|
+
def role role_name
|
167
|
+
roles[role_name] ||= []
|
168
|
+
end
|
169
|
+
|
170
|
+
##
|
171
|
+
# Returns a deep copy of the policy.
|
172
|
+
#
|
173
|
+
# @return [Policy]
|
174
|
+
#
|
175
|
+
def deep_dup
|
176
|
+
dup.tap do |p|
|
177
|
+
roles_dup = p.roles.each_with_object({}) do |(k, v), memo|
|
178
|
+
memo[k] = v.dup rescue value
|
179
|
+
end
|
180
|
+
p.instance_variable_set "@roles", roles_dup
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
##
|
185
|
+
# @private Convert the Policy to a
|
186
|
+
# Google::Apis::CloudresourcemanagerV1::Policy.
|
187
|
+
def to_gapi
|
188
|
+
API::Policy.new(
|
189
|
+
etag: etag,
|
190
|
+
bindings: roles.keys.map do |role_name|
|
191
|
+
next if roles[role_name].empty?
|
192
|
+
API::Binding.new(
|
193
|
+
role: role_name,
|
194
|
+
members: roles[role_name]
|
195
|
+
)
|
196
|
+
end
|
197
|
+
)
|
198
|
+
end
|
199
|
+
|
200
|
+
##
|
201
|
+
# @private New Policy from a
|
202
|
+
# Google::Apis::CloudresourcemanagerV1::Policy object.
|
203
|
+
def self.from_gapi gapi
|
204
|
+
roles = gapi.bindings.each_with_object({}) do |binding, memo|
|
205
|
+
memo[binding.role] = binding.members.to_a
|
206
|
+
end
|
207
|
+
new gapi.etag, roles
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
@@ -14,9 +14,9 @@
|
|
14
14
|
|
15
15
|
|
16
16
|
require "time"
|
17
|
-
require "gcloud/resource_manager/errors"
|
18
17
|
require "gcloud/resource_manager/project/list"
|
19
18
|
require "gcloud/resource_manager/project/updater"
|
19
|
+
require "gcloud/resource_manager/policy"
|
20
20
|
|
21
21
|
module Gcloud
|
22
22
|
module ResourceManager
|
@@ -40,8 +40,8 @@ module Gcloud
|
|
40
40
|
#
|
41
41
|
class Project
|
42
42
|
##
|
43
|
-
# @private The
|
44
|
-
attr_accessor :
|
43
|
+
# @private The Service object.
|
44
|
+
attr_accessor :service
|
45
45
|
|
46
46
|
##
|
47
47
|
# @private The Google API Client object.
|
@@ -50,8 +50,8 @@ module Gcloud
|
|
50
50
|
##
|
51
51
|
# @private Create an empty Project object.
|
52
52
|
def initialize
|
53
|
-
@
|
54
|
-
@gapi =
|
53
|
+
@service = nil
|
54
|
+
@gapi = Gcloud::ResourceManager::Service::API::Project.new
|
55
55
|
end
|
56
56
|
|
57
57
|
##
|
@@ -60,21 +60,21 @@ module Gcloud
|
|
60
60
|
# Trailing hyphens are prohibited. e.g. tokyo-rain-123
|
61
61
|
#
|
62
62
|
def project_id
|
63
|
-
@gapi
|
63
|
+
@gapi.project_id
|
64
64
|
end
|
65
65
|
|
66
66
|
##
|
67
67
|
# The number uniquely identifying the project. e.g. 415104041262
|
68
68
|
#
|
69
69
|
def project_number
|
70
|
-
@gapi
|
70
|
+
@gapi.project_number
|
71
71
|
end
|
72
72
|
|
73
73
|
##
|
74
74
|
# The user-assigned name of the project.
|
75
75
|
#
|
76
76
|
def name
|
77
|
-
@gapi
|
77
|
+
@gapi.name
|
78
78
|
end
|
79
79
|
|
80
80
|
##
|
@@ -93,14 +93,9 @@ module Gcloud
|
|
93
93
|
# project.name = "My Project"
|
94
94
|
#
|
95
95
|
def name= new_name
|
96
|
-
|
97
|
-
@gapi
|
98
|
-
|
99
|
-
if resp.success?
|
100
|
-
@gapi = resp.data
|
101
|
-
else
|
102
|
-
fail ApiError.from_response(resp)
|
103
|
-
end
|
96
|
+
ensure_service!
|
97
|
+
@gapi.name = new_name
|
98
|
+
@gapi = service.update_project @gapi
|
104
99
|
end
|
105
100
|
|
106
101
|
##
|
@@ -138,8 +133,7 @@ module Gcloud
|
|
138
133
|
# end
|
139
134
|
#
|
140
135
|
def labels
|
141
|
-
labels = @gapi
|
142
|
-
labels = labels.to_hash if labels.respond_to? :to_hash
|
136
|
+
labels = @gapi.labels.to_h
|
143
137
|
if block_given?
|
144
138
|
yielded_labels = labels.dup
|
145
139
|
yield yielded_labels
|
@@ -170,21 +164,16 @@ module Gcloud
|
|
170
164
|
# project.labels = { "env" => "production" }
|
171
165
|
#
|
172
166
|
def labels= new_labels
|
173
|
-
|
174
|
-
@gapi
|
175
|
-
|
176
|
-
if resp.success?
|
177
|
-
@gapi = resp.data
|
178
|
-
else
|
179
|
-
fail ApiError.from_response(resp)
|
180
|
-
end
|
167
|
+
ensure_service!
|
168
|
+
@gapi.labels = new_labels
|
169
|
+
@gapi = service.update_project @gapi
|
181
170
|
end
|
182
171
|
|
183
172
|
##
|
184
173
|
# The time that this project was created.
|
185
174
|
#
|
186
175
|
def created_at
|
187
|
-
Time.parse @gapi
|
176
|
+
Time.parse @gapi.create_time
|
188
177
|
rescue
|
189
178
|
nil
|
190
179
|
end
|
@@ -194,16 +183,16 @@ module Gcloud
|
|
194
183
|
#
|
195
184
|
# Possible values are:
|
196
185
|
# * `ACTIVE` - The normal and active state.
|
197
|
-
# * `LIFECYCLE_STATE_UNSPECIFIED` - Unspecified state. This is only
|
198
|
-
# used/useful for distinguishing unset values.
|
199
186
|
# * `DELETE_REQUESTED` - The project has been marked for deletion by the
|
200
|
-
# user (by invoking
|
201
|
-
# Platform). This can generally be reversed by invoking
|
187
|
+
# user (by invoking ##delete) or by the system (Google Cloud
|
188
|
+
# Platform). This can generally be reversed by invoking {#undelete}.
|
202
189
|
# * `DELETE_IN_PROGRESS` - The process of deleting the project has begun.
|
203
190
|
# Reversing the deletion is no longer possible.
|
191
|
+
# * `LIFECYCLE_STATE_UNSPECIFIED` - Unspecified state. This is only
|
192
|
+
# used/useful for distinguishing unset values.
|
204
193
|
#
|
205
194
|
def state
|
206
|
-
@gapi
|
195
|
+
@gapi.lifecycle_state
|
207
196
|
end
|
208
197
|
|
209
198
|
##
|
@@ -255,12 +244,10 @@ module Gcloud
|
|
255
244
|
def update
|
256
245
|
updater = Updater.from_project self
|
257
246
|
yield updater
|
258
|
-
|
259
|
-
|
260
|
-
@gapi = resp.data
|
261
|
-
else
|
262
|
-
fail ApiError.from_response(resp)
|
247
|
+
if updater.gapi.to_h != @gapi.to_h # changed
|
248
|
+
@gapi = service.update_project updater.gapi
|
263
249
|
end
|
250
|
+
self
|
264
251
|
end
|
265
252
|
|
266
253
|
##
|
@@ -276,12 +263,7 @@ module Gcloud
|
|
276
263
|
# project.reload!
|
277
264
|
#
|
278
265
|
def reload!
|
279
|
-
|
280
|
-
if resp.success?
|
281
|
-
@gapi = resp.data
|
282
|
-
else
|
283
|
-
fail ApiError.from_response(resp)
|
284
|
-
end
|
266
|
+
@gapi = service.get_project project_id
|
285
267
|
end
|
286
268
|
alias_method :refresh!, :reload!
|
287
269
|
|
@@ -317,13 +299,9 @@ module Gcloud
|
|
317
299
|
# project.delete_requested? #=> true
|
318
300
|
#
|
319
301
|
def delete
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
true
|
324
|
-
else
|
325
|
-
fail ApiError.from_response(resp)
|
326
|
-
end
|
302
|
+
service.delete_project project_id
|
303
|
+
reload!
|
304
|
+
true
|
327
305
|
end
|
328
306
|
|
329
307
|
##
|
@@ -346,85 +324,92 @@ module Gcloud
|
|
346
324
|
# project.active? #=> true
|
347
325
|
#
|
348
326
|
def undelete
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
true
|
353
|
-
else
|
354
|
-
fail ApiError.from_response(resp)
|
355
|
-
end
|
327
|
+
service.undelete_project project_id
|
328
|
+
reload!
|
329
|
+
true
|
356
330
|
end
|
357
331
|
|
358
332
|
##
|
359
|
-
# Gets the [Cloud IAM](https://cloud.google.com/iam/) access
|
360
|
-
# policy
|
361
|
-
#
|
362
|
-
# {
|
363
|
-
# "bindings" => [{
|
364
|
-
# "role" => "roles/viewer",
|
365
|
-
# "members" => ["serviceAccount:your-service-account"]
|
366
|
-
# }],
|
367
|
-
# "version" => 0,
|
368
|
-
# "etag" => "CAE="
|
369
|
-
# }
|
333
|
+
# Gets and updates the [Cloud IAM](https://cloud.google.com/iam/) access
|
334
|
+
# control policy for this project.
|
370
335
|
#
|
371
336
|
# @see https://cloud.google.com/iam/docs/managing-policies Managing
|
372
337
|
# Policies
|
338
|
+
# @see https://cloud.google.com/resource-manager/reference/rest/v1beta1/projects/setIamPolicy
|
339
|
+
# projects.setIamPolicy
|
373
340
|
#
|
374
341
|
# @param [Boolean] force Force load the latest policy when `true`.
|
375
342
|
# Otherwise the policy will be memoized to reduce the number of API
|
376
343
|
# calls made. The default is `false`.
|
377
344
|
#
|
378
|
-
# @
|
345
|
+
# @yield [policy] A block for updating the policy. The latest policy will
|
346
|
+
# be read from the service and passed to the block. After the block
|
347
|
+
# completes, the modified policy will be written to the service.
|
348
|
+
# @yieldparam [Policy] policy the current Cloud IAM Policy for this
|
349
|
+
# project
|
350
|
+
#
|
351
|
+
# @return [Policy] the current Cloud IAM Policy for this project
|
379
352
|
#
|
380
|
-
# @example Policy values are memoized
|
353
|
+
# @example Policy values are memoized to reduce the number of API calls:
|
381
354
|
# require "gcloud"
|
382
355
|
#
|
383
356
|
# gcloud = Gcloud.new
|
384
357
|
# resource_manager = gcloud.resource_manager
|
385
358
|
# project = resource_manager.project "tokyo-rain-123"
|
386
|
-
# policy = project.policy
|
387
359
|
#
|
388
|
-
#
|
389
|
-
#
|
390
|
-
# puts policy["etag"]
|
360
|
+
# policy = project.policy # API call
|
361
|
+
# policy_2 = project.policy # No API call
|
391
362
|
#
|
392
|
-
# @example Use
|
363
|
+
# @example Use `force` to retrieve the latest policy from the service:
|
393
364
|
# require "gcloud"
|
394
365
|
#
|
395
366
|
# gcloud = Gcloud.new
|
396
367
|
# resource_manager = gcloud.resource_manager
|
397
368
|
# project = resource_manager.project "tokyo-rain-123"
|
398
|
-
#
|
369
|
+
#
|
370
|
+
# policy = project.policy force: true # API call
|
371
|
+
# policy_2 = project.policy force: true # API call
|
372
|
+
#
|
373
|
+
# @example Update the policy by passing a block:
|
374
|
+
# require "gcloud"
|
375
|
+
#
|
376
|
+
# gcloud = Gcloud.new
|
377
|
+
# resource_manager = gcloud.resource_manager
|
378
|
+
# project = resource_manager.project "tokyo-rain-123"
|
379
|
+
#
|
380
|
+
# policy = project.policy do |p|
|
381
|
+
# p.add "roles/owner", "user:owner@example.com"
|
382
|
+
# end # 2 API calls
|
399
383
|
#
|
400
384
|
def policy force: false
|
401
|
-
@policy = nil if force
|
385
|
+
@policy = nil if force || block_given?
|
402
386
|
@policy ||= begin
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
policy = resp.data
|
407
|
-
policy = policy.to_hash if policy.respond_to? :to_hash
|
408
|
-
policy
|
387
|
+
ensure_service!
|
388
|
+
gapi = service.get_policy project_id
|
389
|
+
Policy.from_gapi gapi
|
409
390
|
end
|
391
|
+
return @policy unless block_given?
|
392
|
+
p = @policy.deep_dup
|
393
|
+
yield p
|
394
|
+
self.policy = p
|
410
395
|
end
|
411
396
|
|
412
397
|
##
|
413
|
-
#
|
414
|
-
# policy.
|
398
|
+
# Updates the [Cloud IAM](https://cloud.google.com/iam/) access control
|
399
|
+
# policy for this project. The policy should be read from {#policy}.
|
400
|
+
# See {Gcloud::ResourceManager::Policy} for an explanation of the policy
|
401
|
+
# `etag` property and how to modify policies.
|
402
|
+
#
|
403
|
+
# You can also update the policy by passing a block to {#policy}, which
|
404
|
+
# will call this method internally after the block completes.
|
415
405
|
#
|
416
406
|
# @see https://cloud.google.com/iam/docs/managing-policies Managing
|
417
407
|
# Policies
|
408
|
+
# @see https://cloud.google.com/resource-manager/reference/rest/v1beta1/projects/setIamPolicy
|
409
|
+
# projects.setIamPolicy
|
418
410
|
#
|
419
|
-
# @param [
|
420
|
-
#
|
421
|
-
#
|
422
|
-
# {
|
423
|
-
# "bindings" => [{
|
424
|
-
# "role" => "roles/viewer",
|
425
|
-
# "members" => ["serviceAccount:your-service-account"]
|
426
|
-
# }]
|
427
|
-
# }
|
411
|
+
# @param [Policy] new_policy a new or modified Cloud IAM Policy for this
|
412
|
+
# project
|
428
413
|
#
|
429
414
|
# @example
|
430
415
|
# require "gcloud"
|
@@ -433,23 +418,18 @@ module Gcloud
|
|
433
418
|
# resource_manager = gcloud.resource_manager
|
434
419
|
# project = resource_manager.project "tokyo-rain-123"
|
435
420
|
#
|
436
|
-
#
|
437
|
-
#
|
438
|
-
#
|
439
|
-
#
|
440
|
-
#
|
441
|
-
# }
|
442
|
-
# project.policy = viewer_policy
|
421
|
+
# policy = project.policy # API call
|
422
|
+
#
|
423
|
+
# policy.add "roles/owner", "user:owner@example.com"
|
424
|
+
#
|
425
|
+
# project.policy = policy # API call
|
443
426
|
#
|
444
427
|
def policy= new_policy
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
else
|
451
|
-
fail ApiError.from_response(resp)
|
452
|
-
end
|
428
|
+
ensure_service!
|
429
|
+
gapi = service.set_policy project_id, new_policy.to_gapi
|
430
|
+
# Convert symbols to strings for backwards compatibility.
|
431
|
+
# This will go away when we add a ResourceManager::Policy class.
|
432
|
+
@policy = Policy.from_gapi gapi
|
453
433
|
end
|
454
434
|
|
455
435
|
##
|
@@ -478,30 +458,26 @@ module Gcloud
|
|
478
458
|
#
|
479
459
|
def test_permissions *permissions
|
480
460
|
permissions = Array(permissions).flatten
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
Array(resp.data["permissions"])
|
485
|
-
else
|
486
|
-
fail ApiError.from_response(resp)
|
487
|
-
end
|
461
|
+
ensure_service!
|
462
|
+
gapi = service.test_permissions project_id, permissions
|
463
|
+
gapi.permissions
|
488
464
|
end
|
489
465
|
|
490
466
|
##
|
491
467
|
# @private New Change from a Google API Client object.
|
492
|
-
def self.from_gapi gapi,
|
468
|
+
def self.from_gapi gapi, service
|
493
469
|
new.tap do |p|
|
494
470
|
p.gapi = gapi
|
495
|
-
p.
|
471
|
+
p.service = service
|
496
472
|
end
|
497
473
|
end
|
498
474
|
|
499
475
|
protected
|
500
476
|
|
501
477
|
##
|
502
|
-
# Raise an error unless an active
|
503
|
-
def
|
504
|
-
fail "Must have active connection" unless
|
478
|
+
# Raise an error unless an active service is available.
|
479
|
+
def ensure_service!
|
480
|
+
fail "Must have active connection" unless service
|
505
481
|
end
|
506
482
|
end
|
507
483
|
end
|