gcloud 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
data/lib/gcloud/dns/errors.rb
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
# Copyright 2015 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
|
-
|
|
18
|
-
module Gcloud
|
|
19
|
-
module Dns
|
|
20
|
-
##
|
|
21
|
-
# Base DNS exception class.
|
|
22
|
-
class Error < Gcloud::Error
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
##
|
|
26
|
-
# Raised when an API call is not successful.
|
|
27
|
-
class ApiError < Error
|
|
28
|
-
##
|
|
29
|
-
# The code of the error.
|
|
30
|
-
attr_reader :code
|
|
31
|
-
|
|
32
|
-
##
|
|
33
|
-
# The errors encountered.
|
|
34
|
-
attr_reader :errors
|
|
35
|
-
|
|
36
|
-
# @private
|
|
37
|
-
def initialize message, code, errors = []
|
|
38
|
-
super message
|
|
39
|
-
@code = code
|
|
40
|
-
@errors = errors
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# @private
|
|
44
|
-
def self.from_response resp
|
|
45
|
-
if resp.data? && resp.data["error"]
|
|
46
|
-
from_response_data resp.data["error"]
|
|
47
|
-
else
|
|
48
|
-
from_response_status resp
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# @private
|
|
53
|
-
def self.from_response_data error
|
|
54
|
-
new error["message"], error["code"], error["errors"]
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# @private
|
|
58
|
-
def self.from_response_status resp
|
|
59
|
-
if resp.status == 404
|
|
60
|
-
new "#{resp.error_message}: #{resp.request.uri.request_uri}",
|
|
61
|
-
resp.status
|
|
62
|
-
else
|
|
63
|
-
new resp.error_message, resp.status
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
end
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
# Copyright 2015 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/version"
|
|
17
|
-
require "gcloud/backoff"
|
|
18
|
-
require "google/api_client"
|
|
19
|
-
|
|
20
|
-
module Gcloud
|
|
21
|
-
module ResourceManager
|
|
22
|
-
##
|
|
23
|
-
# @private
|
|
24
|
-
# Represents the connection to Resource Manager, as well as expose the API
|
|
25
|
-
# calls.
|
|
26
|
-
class Connection
|
|
27
|
-
API_VERSION = "v1beta1"
|
|
28
|
-
|
|
29
|
-
attr_accessor :credentials
|
|
30
|
-
|
|
31
|
-
##
|
|
32
|
-
# Creates a new Connection instance.
|
|
33
|
-
def initialize credentials
|
|
34
|
-
@credentials = credentials
|
|
35
|
-
@client = Google::APIClient.new application_name: "gcloud-ruby",
|
|
36
|
-
application_version: Gcloud::VERSION
|
|
37
|
-
@client.authorization = @credentials.client
|
|
38
|
-
@res_man = @client.discovered_api "cloudresourcemanager", API_VERSION
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def list_project filter: nil, token: nil, max: nil
|
|
42
|
-
params = { filter: filter,
|
|
43
|
-
pageToken: token,
|
|
44
|
-
maxResults: max
|
|
45
|
-
}.delete_if { |_, v| v.nil? }
|
|
46
|
-
|
|
47
|
-
execute(
|
|
48
|
-
api_method: @res_man.projects.list,
|
|
49
|
-
parameters: params
|
|
50
|
-
)
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def get_project project_id
|
|
54
|
-
execute(
|
|
55
|
-
api_method: @res_man.projects.get,
|
|
56
|
-
parameters: { projectId: project_id }
|
|
57
|
-
)
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def create_project project_id, name, labels
|
|
61
|
-
project_gapi = { projectId: project_id, name: name,
|
|
62
|
-
labels: labels }.delete_if { |_, v| v.nil? }
|
|
63
|
-
|
|
64
|
-
execute(
|
|
65
|
-
api_method: @res_man.projects.create,
|
|
66
|
-
body_object: project_gapi
|
|
67
|
-
)
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
##
|
|
71
|
-
# Updated the project, given the project Google API Client object/hash.
|
|
72
|
-
# We try not to pass the gapi objects, but there is no PATCH, so we need
|
|
73
|
-
# to pass in a complete Project object.
|
|
74
|
-
def update_project project_gapi
|
|
75
|
-
project_id = project_gapi["projectId"]
|
|
76
|
-
|
|
77
|
-
execute(
|
|
78
|
-
api_method: @res_man.projects.update,
|
|
79
|
-
parameters: { projectId: project_id },
|
|
80
|
-
body_object: project_gapi
|
|
81
|
-
)
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def delete_project project_id
|
|
85
|
-
execute(
|
|
86
|
-
api_method: @res_man.projects.delete,
|
|
87
|
-
parameters: { projectId: project_id }
|
|
88
|
-
)
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def undelete_project project_id
|
|
92
|
-
execute(
|
|
93
|
-
api_method: @res_man.projects.undelete,
|
|
94
|
-
parameters: { projectId: project_id }
|
|
95
|
-
)
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def get_policy project_id
|
|
99
|
-
execute(
|
|
100
|
-
api_method: @res_man.projects.get_iam_policy,
|
|
101
|
-
parameters: { resource: project_id }
|
|
102
|
-
)
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
def set_policy project_id, new_policy
|
|
106
|
-
execute(
|
|
107
|
-
api_method: @res_man.projects.set_iam_policy,
|
|
108
|
-
parameters: { resource: project_id },
|
|
109
|
-
body_object: { policy: new_policy }
|
|
110
|
-
)
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
def test_permissions project_id, permissions
|
|
114
|
-
execute(
|
|
115
|
-
api_method: @res_man.projects.test_iam_permissions,
|
|
116
|
-
parameters: { resource: project_id },
|
|
117
|
-
body_object: { permissions: permissions }
|
|
118
|
-
)
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
def inspect
|
|
122
|
-
"#{self.class}(#{@project})"
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
protected
|
|
126
|
-
|
|
127
|
-
def execute options
|
|
128
|
-
Gcloud::Backoff.new.execute_gapi do
|
|
129
|
-
@client.execute options
|
|
130
|
-
end
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
end
|
|
134
|
-
end
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
# Copyright 2015 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
|
-
|
|
18
|
-
module Gcloud
|
|
19
|
-
module ResourceManager
|
|
20
|
-
##
|
|
21
|
-
# Base Resource Manager exception class.
|
|
22
|
-
class Error < Gcloud::Error
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
##
|
|
26
|
-
# Raised when an API call is not successful.
|
|
27
|
-
class ApiError < Error
|
|
28
|
-
##
|
|
29
|
-
# The code of the error.
|
|
30
|
-
attr_reader :code
|
|
31
|
-
|
|
32
|
-
##
|
|
33
|
-
# The errors encountered.
|
|
34
|
-
attr_reader :errors
|
|
35
|
-
|
|
36
|
-
# @private
|
|
37
|
-
def initialize message, code, errors = []
|
|
38
|
-
super message
|
|
39
|
-
@code = code
|
|
40
|
-
@errors = errors
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# @private
|
|
44
|
-
def self.from_response resp
|
|
45
|
-
if resp.data? && resp.data["error"]
|
|
46
|
-
from_response_data resp.data["error"]
|
|
47
|
-
else
|
|
48
|
-
from_response_status resp
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# @private
|
|
53
|
-
def self.from_response_data error
|
|
54
|
-
new error["message"], error["code"], error["errors"]
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# @private
|
|
58
|
-
def self.from_response_status resp
|
|
59
|
-
if resp.status == 404
|
|
60
|
-
new "#{resp.error_message}: #{resp.request.uri.request_uri}",
|
|
61
|
-
resp.status
|
|
62
|
-
else
|
|
63
|
-
new resp.error_message, resp.status
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
end
|
|
@@ -1,444 +0,0 @@
|
|
|
1
|
-
# Copyright 2014 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 "pathname"
|
|
17
|
-
require "gcloud/version"
|
|
18
|
-
require "gcloud/backoff"
|
|
19
|
-
require "gcloud/upload"
|
|
20
|
-
require "google/api_client"
|
|
21
|
-
require "mime/types"
|
|
22
|
-
require "digest/sha2"
|
|
23
|
-
|
|
24
|
-
module Gcloud
|
|
25
|
-
module Storage
|
|
26
|
-
##
|
|
27
|
-
# @private Represents the connection to Storage,
|
|
28
|
-
# as well as expose the API calls.
|
|
29
|
-
class Connection
|
|
30
|
-
API_VERSION = "v1"
|
|
31
|
-
|
|
32
|
-
attr_accessor :project
|
|
33
|
-
|
|
34
|
-
# @private
|
|
35
|
-
attr_accessor :credentials
|
|
36
|
-
|
|
37
|
-
##
|
|
38
|
-
# Creates a new Connection instance.
|
|
39
|
-
def initialize project, credentials
|
|
40
|
-
@project = project
|
|
41
|
-
@credentials = credentials
|
|
42
|
-
@client = Google::APIClient.new application_name: "gcloud-ruby",
|
|
43
|
-
application_version: Gcloud::VERSION
|
|
44
|
-
@client.authorization = @credentials.client
|
|
45
|
-
@storage = @client.discovered_api "storage", API_VERSION
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
##
|
|
49
|
-
# Retrieves a list of buckets for the given project.
|
|
50
|
-
def list_buckets options = {}
|
|
51
|
-
params = { project: @project }
|
|
52
|
-
params["prefix"] = options[:prefix] if options[:prefix]
|
|
53
|
-
params["pageToken"] = options[:token] if options[:token]
|
|
54
|
-
params["maxResults"] = options[:max] if options[:max]
|
|
55
|
-
|
|
56
|
-
execute(
|
|
57
|
-
api_method: @storage.buckets.list,
|
|
58
|
-
parameters: params
|
|
59
|
-
)
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
##
|
|
63
|
-
# Retrieves bucket by name.
|
|
64
|
-
def get_bucket bucket_name
|
|
65
|
-
execute(
|
|
66
|
-
api_method: @storage.buckets.get,
|
|
67
|
-
parameters: { bucket: bucket_name }
|
|
68
|
-
)
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
##
|
|
72
|
-
# Creates a new bucket.
|
|
73
|
-
def insert_bucket bucket_name, options = {}
|
|
74
|
-
params = { project: @project, predefinedAcl: options[:acl],
|
|
75
|
-
predefinedDefaultObjectAcl: options[:default_acl]
|
|
76
|
-
}.delete_if { |_, v| v.nil? }
|
|
77
|
-
|
|
78
|
-
execute(
|
|
79
|
-
api_method: @storage.buckets.insert,
|
|
80
|
-
parameters: params,
|
|
81
|
-
body_object: insert_bucket_request(bucket_name, options)
|
|
82
|
-
)
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
##
|
|
86
|
-
# Updates a bucket, including its ACL metadata.
|
|
87
|
-
def patch_bucket bucket_name, options = {}
|
|
88
|
-
params = { bucket: bucket_name,
|
|
89
|
-
predefinedAcl: options[:predefined_acl],
|
|
90
|
-
predefinedDefaultObjectAcl: options[:predefined_default_acl]
|
|
91
|
-
}.delete_if { |_, v| v.nil? }
|
|
92
|
-
|
|
93
|
-
execute(
|
|
94
|
-
api_method: @storage.buckets.patch,
|
|
95
|
-
parameters: params,
|
|
96
|
-
body_object: patch_bucket_request(options)
|
|
97
|
-
)
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
##
|
|
101
|
-
# Permanently deletes an empty bucket.
|
|
102
|
-
def delete_bucket bucket_name
|
|
103
|
-
execute(
|
|
104
|
-
api_method: @storage.buckets.delete,
|
|
105
|
-
parameters: { bucket: bucket_name }
|
|
106
|
-
)
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
##
|
|
110
|
-
# Retrieves a list of ACLs for the given bucket.
|
|
111
|
-
def list_bucket_acls bucket_name
|
|
112
|
-
execute(
|
|
113
|
-
api_method: @storage.bucket_access_controls.list,
|
|
114
|
-
parameters: { bucket: bucket_name }
|
|
115
|
-
)
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
##
|
|
119
|
-
# Creates a new bucket ACL.
|
|
120
|
-
def insert_bucket_acl bucket_name, entity, role
|
|
121
|
-
execute(
|
|
122
|
-
api_method: @storage.bucket_access_controls.insert,
|
|
123
|
-
parameters: { bucket: bucket_name },
|
|
124
|
-
body_object: { entity: entity, role: role }
|
|
125
|
-
)
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
##
|
|
129
|
-
# Permanently deletes a bucket ACL.
|
|
130
|
-
def delete_bucket_acl bucket_name, entity
|
|
131
|
-
execute(
|
|
132
|
-
api_method: @storage.bucket_access_controls.delete,
|
|
133
|
-
parameters: { bucket: bucket_name, entity: entity }
|
|
134
|
-
)
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
##
|
|
138
|
-
# Retrieves a list of default ACLs for the given bucket.
|
|
139
|
-
def list_default_acls bucket_name
|
|
140
|
-
execute(
|
|
141
|
-
api_method: @storage.default_object_access_controls.list,
|
|
142
|
-
parameters: { bucket: bucket_name }
|
|
143
|
-
)
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
##
|
|
147
|
-
# Creates a new default ACL.
|
|
148
|
-
def insert_default_acl bucket_name, entity, role
|
|
149
|
-
execute(
|
|
150
|
-
api_method: @storage.default_object_access_controls.insert,
|
|
151
|
-
parameters: { bucket: bucket_name },
|
|
152
|
-
body_object: { entity: entity, role: role }
|
|
153
|
-
)
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
##
|
|
157
|
-
# Permanently deletes a default ACL.
|
|
158
|
-
def delete_default_acl bucket_name, entity
|
|
159
|
-
execute(
|
|
160
|
-
api_method: @storage.default_object_access_controls.delete,
|
|
161
|
-
parameters: { bucket: bucket_name, entity: entity }
|
|
162
|
-
)
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
##
|
|
166
|
-
# Retrieves a list of files matching the criteria.
|
|
167
|
-
def list_files bucket_name, options = {}
|
|
168
|
-
params = {
|
|
169
|
-
bucket: bucket_name,
|
|
170
|
-
prefix: options[:prefix],
|
|
171
|
-
delimiter: options[:delimiter],
|
|
172
|
-
pageToken: options[:token],
|
|
173
|
-
maxResults: options[:max],
|
|
174
|
-
versions: options[:versions]
|
|
175
|
-
}.delete_if { |_, v| v.nil? }
|
|
176
|
-
|
|
177
|
-
execute(
|
|
178
|
-
api_method: @storage.objects.list,
|
|
179
|
-
parameters: params
|
|
180
|
-
)
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
##
|
|
184
|
-
# Stores a new object and metadata. If resumable is true, a resumable
|
|
185
|
-
# upload, otherwise uses a multipart form post.
|
|
186
|
-
#
|
|
187
|
-
# UploadIO comes from Faraday, which gets it from multipart-post
|
|
188
|
-
# The initializer signature is:
|
|
189
|
-
# filename_or_io, content_type, filename = nil, opts = {}
|
|
190
|
-
def upload_file resumable, bucket_name, file, path = nil, options = {}
|
|
191
|
-
local_path = Pathname(file).to_path
|
|
192
|
-
options[:content_type] ||= mime_type_for(local_path)
|
|
193
|
-
media = file_media local_path, options, resumable
|
|
194
|
-
upload_path = Pathname(path || local_path).to_path
|
|
195
|
-
result = insert_file resumable, bucket_name, upload_path, media, options
|
|
196
|
-
return result unless resumable
|
|
197
|
-
upload = result.resumable_upload
|
|
198
|
-
result = execute upload while upload.resumable?
|
|
199
|
-
result
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
##
|
|
203
|
-
# Retrieves an object or its metadata.
|
|
204
|
-
def get_file bucket_name, file_path, options = {}
|
|
205
|
-
query = { bucket: bucket_name, object: file_path }
|
|
206
|
-
query[:generation] = options[:generation] if options[:generation]
|
|
207
|
-
|
|
208
|
-
request_options = {
|
|
209
|
-
api_method: @storage.objects.get,
|
|
210
|
-
parameters: query
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
request_options = add_headers request_options, options
|
|
214
|
-
execute request_options
|
|
215
|
-
end
|
|
216
|
-
|
|
217
|
-
## Copy a file from source bucket/object to a
|
|
218
|
-
# destination bucket/object.
|
|
219
|
-
def copy_file source_bucket_name, source_file_path,
|
|
220
|
-
destination_bucket_name, destination_file_path, options = {}
|
|
221
|
-
request_options = {
|
|
222
|
-
api_method: @storage.objects.copy,
|
|
223
|
-
parameters: { sourceBucket: source_bucket_name,
|
|
224
|
-
sourceObject: source_file_path,
|
|
225
|
-
sourceGeneration: options[:generation],
|
|
226
|
-
destinationBucket: destination_bucket_name,
|
|
227
|
-
destinationObject: destination_file_path,
|
|
228
|
-
predefinedAcl: options[:acl]
|
|
229
|
-
}.delete_if { |_, v| v.nil? }
|
|
230
|
-
}
|
|
231
|
-
request_options = add_headers request_options, options
|
|
232
|
-
execute request_options
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
##
|
|
236
|
-
# Download contents of a file.
|
|
237
|
-
|
|
238
|
-
def download_file bucket_name, file_path, options = {}
|
|
239
|
-
request_options = {
|
|
240
|
-
api_method: @storage.objects.get,
|
|
241
|
-
parameters: { bucket: bucket_name,
|
|
242
|
-
object: file_path,
|
|
243
|
-
alt: :media }
|
|
244
|
-
}
|
|
245
|
-
request_options = add_headers request_options, options
|
|
246
|
-
execute request_options
|
|
247
|
-
end
|
|
248
|
-
|
|
249
|
-
##
|
|
250
|
-
# Updates a file's metadata.
|
|
251
|
-
def patch_file bucket_name, file_path, options = {}
|
|
252
|
-
params = { bucket: bucket_name,
|
|
253
|
-
object: file_path,
|
|
254
|
-
predefinedAcl: options[:predefined_acl]
|
|
255
|
-
}.delete_if { |_, v| v.nil? }
|
|
256
|
-
|
|
257
|
-
execute(
|
|
258
|
-
api_method: @storage.objects.patch,
|
|
259
|
-
parameters: params,
|
|
260
|
-
body_object: patch_file_request(options)
|
|
261
|
-
)
|
|
262
|
-
end
|
|
263
|
-
|
|
264
|
-
##
|
|
265
|
-
# Permanently deletes a file.
|
|
266
|
-
def delete_file bucket_name, file_path
|
|
267
|
-
execute(
|
|
268
|
-
api_method: @storage.objects.delete,
|
|
269
|
-
parameters: { bucket: bucket_name,
|
|
270
|
-
object: file_path }
|
|
271
|
-
)
|
|
272
|
-
end
|
|
273
|
-
|
|
274
|
-
##
|
|
275
|
-
# Retrieves a list of ACLs for the given file.
|
|
276
|
-
def list_file_acls bucket_name, file_name
|
|
277
|
-
execute(
|
|
278
|
-
api_method: @storage.object_access_controls.list,
|
|
279
|
-
parameters: { bucket: bucket_name, object: file_name }
|
|
280
|
-
)
|
|
281
|
-
end
|
|
282
|
-
|
|
283
|
-
##
|
|
284
|
-
# Creates a new file ACL.
|
|
285
|
-
def insert_file_acl bucket_name, file_name, entity, role, options = {}
|
|
286
|
-
query = { bucket: bucket_name, object: file_name }
|
|
287
|
-
query[:generation] = options[:generation] if options[:generation]
|
|
288
|
-
|
|
289
|
-
execute(
|
|
290
|
-
api_method: @storage.object_access_controls.insert,
|
|
291
|
-
parameters: query,
|
|
292
|
-
body_object: { entity: entity, role: role }
|
|
293
|
-
)
|
|
294
|
-
end
|
|
295
|
-
|
|
296
|
-
##
|
|
297
|
-
# Permanently deletes a file ACL.
|
|
298
|
-
def delete_file_acl bucket_name, file_name, entity, options = {}
|
|
299
|
-
query = { bucket: bucket_name, object: file_name, entity: entity }
|
|
300
|
-
query[:generation] = options[:generation] if options[:generation]
|
|
301
|
-
|
|
302
|
-
execute(
|
|
303
|
-
api_method: @storage.object_access_controls.delete,
|
|
304
|
-
parameters: query
|
|
305
|
-
)
|
|
306
|
-
end
|
|
307
|
-
|
|
308
|
-
##
|
|
309
|
-
# Retrieves the mime-type for a file path.
|
|
310
|
-
# An empty string is returned if no mime-type can be found.
|
|
311
|
-
def mime_type_for path
|
|
312
|
-
MIME::Types.of(path).first.to_s
|
|
313
|
-
end
|
|
314
|
-
|
|
315
|
-
# @private
|
|
316
|
-
def inspect
|
|
317
|
-
"#{self.class}(#{@project})"
|
|
318
|
-
end
|
|
319
|
-
|
|
320
|
-
protected
|
|
321
|
-
|
|
322
|
-
def insert_bucket_request name, options = {}
|
|
323
|
-
{
|
|
324
|
-
"name" => name,
|
|
325
|
-
"location" => options[:location],
|
|
326
|
-
"cors" => options[:cors],
|
|
327
|
-
"logging" => logging_config(options),
|
|
328
|
-
"storageClass" => storage_class(options[:storage_class]),
|
|
329
|
-
"versioning" => versioning_config(options[:versioning]),
|
|
330
|
-
"website" => website_config(options)
|
|
331
|
-
}.delete_if { |_, v| v.nil? }
|
|
332
|
-
end
|
|
333
|
-
|
|
334
|
-
def patch_bucket_request options = {}
|
|
335
|
-
{
|
|
336
|
-
"cors" => options[:cors],
|
|
337
|
-
"logging" => logging_config(options),
|
|
338
|
-
"versioning" => versioning_config(options[:versioning]),
|
|
339
|
-
"website" => website_config(options),
|
|
340
|
-
"acl" => options[:acl],
|
|
341
|
-
"defaultObjectAcl" => options[:default_acl]
|
|
342
|
-
}.delete_if { |_, v| v.nil? }
|
|
343
|
-
end
|
|
344
|
-
|
|
345
|
-
def versioning_config enabled
|
|
346
|
-
{ "enabled" => enabled } unless enabled.nil?
|
|
347
|
-
end
|
|
348
|
-
|
|
349
|
-
def logging_config options
|
|
350
|
-
bucket = options[:logging_bucket]
|
|
351
|
-
prefix = options[:logging_prefix]
|
|
352
|
-
{
|
|
353
|
-
"logBucket" => bucket,
|
|
354
|
-
"logObjectPrefix" => prefix
|
|
355
|
-
}.delete_if { |_, v| v.nil? } if bucket || prefix
|
|
356
|
-
end
|
|
357
|
-
|
|
358
|
-
def website_config options
|
|
359
|
-
website_main = options[:website_main]
|
|
360
|
-
website_404 = options[:website_404]
|
|
361
|
-
{
|
|
362
|
-
"mainPageSuffix" => website_main,
|
|
363
|
-
"notFoundPage" => website_404
|
|
364
|
-
}.delete_if { |_, v| v.nil? } if website_main || website_404
|
|
365
|
-
end
|
|
366
|
-
|
|
367
|
-
# @private
|
|
368
|
-
def storage_class str
|
|
369
|
-
{ "durable_reduced_availability" => "DURABLE_REDUCED_AVAILABILITY",
|
|
370
|
-
"dra" => "DURABLE_REDUCED_AVAILABILITY",
|
|
371
|
-
"durable" => "DURABLE_REDUCED_AVAILABILITY",
|
|
372
|
-
"nearline" => "NEARLINE",
|
|
373
|
-
"standard" => "STANDARD" }[str.to_s.downcase]
|
|
374
|
-
end
|
|
375
|
-
|
|
376
|
-
def insert_file resumable, bucket_name, path, media, options
|
|
377
|
-
params = { uploadType: (resumable ? "resumable" : "multipart"),
|
|
378
|
-
bucket: bucket_name,
|
|
379
|
-
name: path,
|
|
380
|
-
predefinedAcl: options[:acl]
|
|
381
|
-
}.delete_if { |_, v| v.nil? }
|
|
382
|
-
|
|
383
|
-
request_options = {
|
|
384
|
-
api_method: @storage.objects.insert,
|
|
385
|
-
media: media,
|
|
386
|
-
parameters: params,
|
|
387
|
-
body_object: insert_file_request(options)
|
|
388
|
-
}
|
|
389
|
-
request_options = add_headers request_options, options
|
|
390
|
-
execute request_options
|
|
391
|
-
end
|
|
392
|
-
|
|
393
|
-
def file_media local_path, options, resumable
|
|
394
|
-
media = Google::APIClient::UploadIO.new local_path,
|
|
395
|
-
options[:content_type]
|
|
396
|
-
return media unless resumable
|
|
397
|
-
media.chunk_size = Gcloud::Upload.verify_chunk_size(
|
|
398
|
-
options.delete(:chunk_size), media.length)
|
|
399
|
-
media
|
|
400
|
-
end
|
|
401
|
-
|
|
402
|
-
def insert_file_request options = {}
|
|
403
|
-
request = {
|
|
404
|
-
"crc32c" => options[:crc32c],
|
|
405
|
-
"md5Hash" => options[:md5],
|
|
406
|
-
"metadata" => options[:metadata]
|
|
407
|
-
}.delete_if { |_, v| v.nil? }
|
|
408
|
-
request.merge patch_file_request(options)
|
|
409
|
-
end
|
|
410
|
-
|
|
411
|
-
def patch_file_request options = {}
|
|
412
|
-
{
|
|
413
|
-
"cacheControl" => options[:cache_control],
|
|
414
|
-
"contentDisposition" => options[:content_disposition],
|
|
415
|
-
"contentEncoding" => options[:content_encoding],
|
|
416
|
-
"contentLanguage" => options[:content_language],
|
|
417
|
-
"contentType" => options[:content_type],
|
|
418
|
-
"metadata" => options[:metadata],
|
|
419
|
-
"acl" => options[:acl]
|
|
420
|
-
}.delete_if { |_, v| v.nil? }
|
|
421
|
-
end
|
|
422
|
-
|
|
423
|
-
def add_headers request_options, options
|
|
424
|
-
headers = (request_options[:headers] ||= {})
|
|
425
|
-
if options[:encryption_key] || options[:encryption_key_sha256]
|
|
426
|
-
headers["x-goog-encryption-algorithm"] = "AES256"
|
|
427
|
-
end
|
|
428
|
-
if (key = options.delete(:encryption_key))
|
|
429
|
-
headers["x-goog-encryption-key"] = Base64.encode64 key
|
|
430
|
-
end
|
|
431
|
-
if (key_sha256 = options.delete(:encryption_key_sha256))
|
|
432
|
-
headers["x-goog-encryption-key-sha256"] = Base64.encode64 key_sha256
|
|
433
|
-
end
|
|
434
|
-
request_options
|
|
435
|
-
end
|
|
436
|
-
|
|
437
|
-
def execute options
|
|
438
|
-
Gcloud::Backoff.new.execute_gapi do
|
|
439
|
-
@client.execute options
|
|
440
|
-
end
|
|
441
|
-
end
|
|
442
|
-
end
|
|
443
|
-
end
|
|
444
|
-
end
|