azure-armrest 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES +7 -0
- data/lib/azure/armrest/model/base_model.rb +11 -6
- data/lib/azure/armrest/model/storage_account.rb +126 -23
- data/lib/azure/armrest/storage_account_service.rb +47 -3
- data/lib/azure/armrest/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c69e270a5d35df9198153455a690ada22d513f4c
|
4
|
+
data.tar.gz: 67ef3824766ab4ebf5a8b5926acf58a4d34fed8b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 08513ba9e0ae24282d58be10bf04b5ae9aa1a98bffee330d0678de5c4afd7ec4bd3be5b83ca12c02aabe5dd13a132155ba91df17cf049b6b4ae2ac64424b35d0
|
7
|
+
data.tar.gz: c21f1908abb2d89055db2aea97a57cdac1c080789e844538aa406e20cd8bce853e745f1efa024f13632a0ba17432506573352092c63301f7bb4dba999c2d69ac
|
data/CHANGES
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
= 0.2.1 - 15-Mar-2016
|
2
|
+
* The ssl_version and ssl_verify options are now supported by, and
|
3
|
+
automatically passed on to, StorageAccount model objects.
|
4
|
+
* Added the get_blob_raw method to get at raw blob data. Use wisely.
|
5
|
+
* Nested model objects are now named based on the attribute name rather
|
6
|
+
than anonymous.
|
7
|
+
|
1
8
|
= 0.2.0 - 10-Mar-2016
|
2
9
|
* The Armrest.configure method now supports the :ssl_verify and :ssl_version
|
3
10
|
options. By default, the ssl_version option is set to TLSv1 instead of
|
@@ -46,12 +46,9 @@ module Azure
|
|
46
46
|
# Find the exclusion list for the model of next level (@embed_model)
|
47
47
|
# '#' is the separator between levels. Remove attributes
|
48
48
|
# before the first separator.
|
49
|
-
child_excl_list = self.class.send(:excl_list).map do |e|
|
49
|
+
@child_excl_list = self.class.send(:excl_list).map do |e|
|
50
50
|
e.index('#') ? e[e.index('#') + 1..-1] : ''
|
51
51
|
end
|
52
|
-
@embed_model = Class.new(BaseModel) do
|
53
|
-
attr_hash(*child_excl_list)
|
54
|
-
end
|
55
52
|
|
56
53
|
if json.kind_of?(Hash)
|
57
54
|
@hash = json
|
@@ -136,10 +133,10 @@ module Azure
|
|
136
133
|
snake = snake_case(key)
|
137
134
|
unless excl_list.include?(snake) # Must deal with nested models
|
138
135
|
if value.kind_of?(Array)
|
139
|
-
newval = value.map { |elem| elem.kind_of?(Hash) ?
|
136
|
+
newval = value.map { |elem| elem.kind_of?(Hash) ? nested_object(snake.camelize.singularize, elem) : elem }
|
140
137
|
obj[key] = newval
|
141
138
|
elsif value.kind_of?(Hash)
|
142
|
-
obj[key] =
|
139
|
+
obj[key] = nested_object(snake.camelize, value)
|
143
140
|
end
|
144
141
|
end
|
145
142
|
|
@@ -147,6 +144,14 @@ module Azure
|
|
147
144
|
end
|
148
145
|
end
|
149
146
|
|
147
|
+
def nested_object(klass_name, value)
|
148
|
+
unless self.class.const_defined?(klass_name)
|
149
|
+
child_excl_list = @child_excl_list
|
150
|
+
self.class.const_set(klass_name, Class.new(BaseModel) { attr_hash(*child_excl_list) })
|
151
|
+
end
|
152
|
+
self.class.const_get(klass_name).new(value)
|
153
|
+
end
|
154
|
+
|
150
155
|
def add_accessor_methods(method, key)
|
151
156
|
method.prepend('_') if methods.include?(method.to_sym)
|
152
157
|
instance_eval { define_singleton_method(method) { __getobj__[key] } }
|
@@ -27,10 +27,18 @@ module Azure
|
|
27
27
|
# An http proxy to use per request. Defaults to ENV['http_proxy'] if set.
|
28
28
|
attr_accessor :proxy
|
29
29
|
|
30
|
+
# The SSL version to use per request. Defaults to TLSv1.
|
31
|
+
attr_accessor :ssl_version
|
32
|
+
|
33
|
+
# The SSL verification method used for each request. The default is VERIFY_PEER.
|
34
|
+
attr_accessor :ssl_verify
|
35
|
+
|
30
36
|
def initialize(json)
|
31
37
|
super
|
32
38
|
@storage_api_version = '2015-02-21'
|
33
39
|
@proxy = ENV['http_proxy']
|
40
|
+
@ssl_version = 'TLSv1'
|
41
|
+
@ssl_verify = nil
|
34
42
|
end
|
35
43
|
|
36
44
|
# Returns a list of tables for the given storage account +key+. Note
|
@@ -134,9 +142,11 @@ module Azure
|
|
134
142
|
headers = build_headers(url, key, :blob, :verb => 'HEAD')
|
135
143
|
|
136
144
|
response = ArmrestService.rest_head(
|
137
|
-
:url
|
138
|
-
:headers
|
139
|
-
:proxy
|
145
|
+
:url => url,
|
146
|
+
:headers => headers,
|
147
|
+
:proxy => proxy,
|
148
|
+
:ssl_version => ssl_version,
|
149
|
+
:ssl_verify => ssl_verify
|
140
150
|
)
|
141
151
|
|
142
152
|
BlobProperty.new(response.headers)
|
@@ -155,9 +165,11 @@ module Azure
|
|
155
165
|
headers = build_headers(url, key)
|
156
166
|
|
157
167
|
response = ArmrestService.rest_get(
|
158
|
-
:url
|
159
|
-
:headers
|
160
|
-
:proxy
|
168
|
+
:url => url,
|
169
|
+
:headers => headers,
|
170
|
+
:proxy => proxy,
|
171
|
+
:ssl_version => ssl_version,
|
172
|
+
:ssl_verify => ssl_verify
|
161
173
|
)
|
162
174
|
|
163
175
|
doc = Nokogiri::XML(response.body)
|
@@ -244,10 +256,12 @@ module Azure
|
|
244
256
|
headers = build_headers(dst_url, key, :blob, options)
|
245
257
|
|
246
258
|
response = ArmrestService.rest_put(
|
247
|
-
:url
|
248
|
-
:payload
|
249
|
-
:headers
|
250
|
-
:proxy
|
259
|
+
:url => dst_url,
|
260
|
+
:payload => '',
|
261
|
+
:headers => headers,
|
262
|
+
:proxy => proxy,
|
263
|
+
:ssl_version => ssl_version,
|
264
|
+
:ssl_verify => ssl_verify
|
251
265
|
)
|
252
266
|
|
253
267
|
Blob.new(response.headers)
|
@@ -264,9 +278,11 @@ module Azure
|
|
264
278
|
headers = build_headers(url, key, :blob, :verb => 'DELETE')
|
265
279
|
|
266
280
|
response = ArmrestService.rest_delete(
|
267
|
-
:url
|
268
|
-
:headers
|
269
|
-
:proxy
|
281
|
+
:url => url,
|
282
|
+
:headers => headers,
|
283
|
+
:proxy => proxy,
|
284
|
+
:ssl_version => ssl_version,
|
285
|
+
:ssl_verify => ssl_verify
|
270
286
|
)
|
271
287
|
|
272
288
|
true
|
@@ -292,10 +308,12 @@ module Azure
|
|
292
308
|
headers = build_headers(url, key, :blob, options)
|
293
309
|
|
294
310
|
response = ArmrestService.rest_put(
|
295
|
-
:url
|
296
|
-
:payload
|
297
|
-
:headers
|
298
|
-
:proxy
|
311
|
+
:url => url,
|
312
|
+
:payload => '',
|
313
|
+
:headers => headers,
|
314
|
+
:proxy => proxy,
|
315
|
+
:ssl_version => ssl_version,
|
316
|
+
:ssl_verify => ssl_verify
|
299
317
|
)
|
300
318
|
|
301
319
|
Blob.new(response.headers)
|
@@ -310,10 +328,12 @@ module Azure
|
|
310
328
|
headers = build_headers(url, key, :blob, :verb => 'PUT')
|
311
329
|
|
312
330
|
response = ArmrestService.rest_put(
|
313
|
-
:url
|
314
|
-
:payload
|
315
|
-
:headers
|
316
|
-
:proxy
|
331
|
+
:url => url,
|
332
|
+
:payload => '',
|
333
|
+
:headers => headers,
|
334
|
+
:proxy => proxy,
|
335
|
+
:ssl_version => ssl_version,
|
336
|
+
:ssl_verify => ssl_verify
|
317
337
|
)
|
318
338
|
|
319
339
|
BlobSnapshot.new(
|
@@ -323,6 +343,76 @@ module Azure
|
|
323
343
|
)
|
324
344
|
end
|
325
345
|
|
346
|
+
# Get the contents of the given +blob+ found in +container+ using the
|
347
|
+
# given +options+. This is a low level method to read a range of bytes
|
348
|
+
# from the blob directly. The possible options are:
|
349
|
+
#
|
350
|
+
# * range - A range of bytes to collect.
|
351
|
+
# * start_byte - The starting byte for collection.
|
352
|
+
# * end_byte - The end byte for collection. Use this or :length with :start_byte.
|
353
|
+
# * length - The number of bytes to collect starting at +start_byte+.
|
354
|
+
# * entire_image - Read all bytes for the blob.
|
355
|
+
# * md5 - If true, the response headers will include MD5 checksum information.
|
356
|
+
# * date - Get the blob snapshot for the given date.
|
357
|
+
#
|
358
|
+
# If you do not specify a :range or :start_byte, then an error will be
|
359
|
+
# raised unless you explicitly set the :entire_image option to true.
|
360
|
+
# However, that is not recommended because the blobs can be huge.
|
361
|
+
#
|
362
|
+
# Unlike other methods, this method returns a raw response object rather
|
363
|
+
# than a wrapper model. Get the information you need using:
|
364
|
+
#
|
365
|
+
# * response.body - blob data.
|
366
|
+
# * response.headers - blob metadata.
|
367
|
+
#
|
368
|
+
# Example:
|
369
|
+
#
|
370
|
+
# ret = @storage_acct.get_blob(@container, @blob, key, :start_byte => start_byte, :length => length)
|
371
|
+
# content_md5 = ret.headers[:content_md5].unpack("m0").first.unpack("H*").first
|
372
|
+
# returned_md5 = Digest::MD5.hexdigest(ret.body)
|
373
|
+
# raise "Checksum error: #{range_str}, blob: #{@container}/#{@blob}" unless content_md5 == returned_md5
|
374
|
+
# return ret.body
|
375
|
+
#
|
376
|
+
def get_blob_raw(container, blob, key = nil, options = {})
|
377
|
+
key ||= properties.key1
|
378
|
+
|
379
|
+
url = File.join(properties.primary_endpoints.blob, container, blob)
|
380
|
+
url += "?snapshot=" + options[:date] if options[:date]
|
381
|
+
|
382
|
+
additional_headers = {
|
383
|
+
'verb' => 'GET'
|
384
|
+
}
|
385
|
+
|
386
|
+
range_str = nil
|
387
|
+
if options[:range]
|
388
|
+
range_str = "bytes=#{options[:range].min}-#{options[:range].max}"
|
389
|
+
elsif options[:start_byte]
|
390
|
+
range_str = "bytes=#{options[:start_byte]}-"
|
391
|
+
if options[:end_byte]
|
392
|
+
range_str << options[:end_byte].to_s
|
393
|
+
elsif options[:length]
|
394
|
+
range_str << (options[:start_byte] + options[:length] - 1).to_s
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
if range_str
|
399
|
+
additional_headers['x-ms-range'] = range_str
|
400
|
+
additional_headers['x-ms-range-get-content-md5'] = true if options[:md5]
|
401
|
+
else
|
402
|
+
raise ArgumentError, "must specify byte range or entire_image flag" unless options[:entire_image]
|
403
|
+
end
|
404
|
+
|
405
|
+
headers = build_headers(url, key, :blob, additional_headers)
|
406
|
+
|
407
|
+
ArmrestService.rest_get(
|
408
|
+
:url => url,
|
409
|
+
:headers => headers,
|
410
|
+
:proxy => proxy,
|
411
|
+
:ssl_version => ssl_version,
|
412
|
+
:ssl_verify => ssl_verify,
|
413
|
+
)
|
414
|
+
end
|
415
|
+
|
326
416
|
private
|
327
417
|
|
328
418
|
# Using the blob primary endpoint as a base, join any arguments to the
|
@@ -331,7 +421,14 @@ module Azure
|
|
331
421
|
def blob_response(key, query, *args)
|
332
422
|
url = File.join(properties.primary_endpoints.blob, *args) + "?#{query}"
|
333
423
|
headers = build_headers(url, key, 'blob')
|
334
|
-
|
424
|
+
|
425
|
+
ArmrestService.rest_get(
|
426
|
+
:url => url,
|
427
|
+
:headers => headers,
|
428
|
+
:proxy => proxy,
|
429
|
+
:ssl_version => ssl_version,
|
430
|
+
:ssl_verify => ssl_verify,
|
431
|
+
)
|
335
432
|
end
|
336
433
|
|
337
434
|
# Using the blob primary endpoint as a base, join any arguments to the
|
@@ -344,7 +441,13 @@ module Azure
|
|
344
441
|
|
345
442
|
url << "?#{query}" if query # Must happen after headers are built
|
346
443
|
|
347
|
-
ArmrestService.rest_get(
|
444
|
+
ArmrestService.rest_get(
|
445
|
+
:url => url,
|
446
|
+
:headers => headers,
|
447
|
+
:proxy => proxy,
|
448
|
+
:ssl_version => ssl_version,
|
449
|
+
:ssl_verify => ssl_verify,
|
450
|
+
)
|
348
451
|
end
|
349
452
|
|
350
453
|
# Set the headers needed, including the Authorization header.
|
@@ -23,19 +23,31 @@ module Azure
|
|
23
23
|
# Same as other resource based get methods, but also sets the proxy on the model object.
|
24
24
|
#
|
25
25
|
def get(name, resource_group = configuration.resource_group)
|
26
|
-
super.tap
|
26
|
+
super.tap do |m|
|
27
|
+
m.proxy = configuration.proxy
|
28
|
+
m.ssl_version = configuration.ssl_version
|
29
|
+
m.ssl_verify = configuration.ssl_verify
|
30
|
+
end
|
27
31
|
end
|
28
32
|
|
29
33
|
# Same as other resource based list methods, but also sets the proxy on each model object.
|
30
34
|
#
|
31
35
|
def list(resource_group = configuration.resource_group)
|
32
|
-
super.each
|
36
|
+
super.each do |m|
|
37
|
+
m.proxy = configuration.proxy
|
38
|
+
m.ssl_version = configuration.ssl_version
|
39
|
+
m.ssl_verify = configuration.ssl_verify
|
40
|
+
end
|
33
41
|
end
|
34
42
|
|
35
43
|
# Same as other resource based list_all methods, but also sets the proxy on each model object.
|
36
44
|
#
|
37
45
|
def list_all
|
38
|
-
super.each
|
46
|
+
super.each do |m|
|
47
|
+
m.proxy = configuration.proxy
|
48
|
+
m.ssl_version = configuration.ssl_version
|
49
|
+
m.ssl_verify = configuration.ssl_verify
|
50
|
+
end
|
39
51
|
end
|
40
52
|
|
41
53
|
# Creates a new storage account, or updates an existing account with the
|
@@ -156,6 +168,38 @@ module Azure
|
|
156
168
|
results.flatten
|
157
169
|
end
|
158
170
|
|
171
|
+
def accounts_by_name
|
172
|
+
@accounts_by_name ||= list_all.each_with_object({}) { |sa, sah| sah[sa.name] = sa }
|
173
|
+
end
|
174
|
+
|
175
|
+
def parse_uri(uri)
|
176
|
+
uri = URI.parse(uri)
|
177
|
+
host_components = uri.host.split('.')
|
178
|
+
|
179
|
+
rh = {
|
180
|
+
:scheme => uri.scheme,
|
181
|
+
:account_name => host_components[0],
|
182
|
+
:service_name => host_components[1],
|
183
|
+
:resource_path => uri.path
|
184
|
+
}
|
185
|
+
|
186
|
+
# TODO: support other service types.
|
187
|
+
return rh unless rh[:service_name] == "blob"
|
188
|
+
|
189
|
+
blob_components = uri.path.split('/', 3)
|
190
|
+
if blob_components[2]
|
191
|
+
rh[:container] = blob_components[1]
|
192
|
+
rh[:blob] = blob_components[2]
|
193
|
+
else
|
194
|
+
rh[:container] = '$root'
|
195
|
+
rh[:blob] = blob_components[1]
|
196
|
+
end
|
197
|
+
|
198
|
+
return rh unless uri.query && uri.query.start_with?("snapshot=")
|
199
|
+
rh[:snapshot] = uri.query.split('=', 2)[1]
|
200
|
+
rh
|
201
|
+
end
|
202
|
+
|
159
203
|
private
|
160
204
|
|
161
205
|
def validate_account_type(account_type)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: azure-armrest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel J. Berger
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2016-03-
|
14
|
+
date: 2016-03-15 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: json
|