azure-armrest 0.9.1 → 0.9.2
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 +4 -4
- data/CHANGES +11 -0
- data/azure-armrest.gemspec +1 -2
- data/lib/azure/armrest/armrest_service.rb +3 -1
- data/lib/azure/armrest/model/base_model.rb +3 -1
- data/lib/azure/armrest/model/storage_account.rb +65 -49
- data/lib/azure/armrest/resource_group_based_service.rb +2 -2
- data/lib/azure/armrest/storage_account_service.rb +1 -1
- data/lib/azure/armrest/version.rb +1 -1
- metadata +5 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b445a2a57cca396bfb03a3f62393f4c0669f708
|
4
|
+
data.tar.gz: 9a4984a64e5db8057e7c018b8f9730134735dd6a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aefd6f6a4936e5f93e6144f4dec4d841f6335dc65542c0ad00fdb881a3153ca9e2abd163b527633cc4a1eba09495b93917d97f6ecbbf23bd2f01a0c0a6373c0a
|
7
|
+
data.tar.gz: e7338c46f28895160763f8bc1df1b9c0118fa16830435c1fdd90f5d62bdb3bce01595a78e0aa292ea55f8a5887de8a0dfab7dd395ed3e2ba38d63b0f29372167
|
data/CHANGES
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
= 0.9.2 - 31-Oct-2017
|
2
|
+
* Fixed a bug in the StorageAccountService#list_private_images method. It
|
3
|
+
now accepts an option to skip accessor definitions.
|
4
|
+
* Fixed a caller bug that caused tests to fail on Windows.
|
5
|
+
* Fixed a bug where an argument to a sleep call could be a string by mistake.
|
6
|
+
* Fixed issues with continuation results for list methods in the
|
7
|
+
StorageAccount model class.
|
8
|
+
* The json dependency restriction was loosened to 1.anything.
|
9
|
+
* The nokogiri dependency was removed. We now rely on Hash#from_xml courtesy
|
10
|
+
of activesupport, which we were already using.
|
11
|
+
|
1
12
|
= 0.9.1 - 9-Oct-2017
|
2
13
|
* Fixed an issue where hash properties that contain a '$' sign would fail
|
3
14
|
when we attempted to convert them to model objects. They are now converted
|
data/azure-armrest.gemspec
CHANGED
@@ -17,12 +17,11 @@ different than the current azure gem, which uses the older (XML) interface
|
|
17
17
|
behind the scenes.
|
18
18
|
EOF
|
19
19
|
|
20
|
-
spec.add_dependency 'json', '~> 2
|
20
|
+
spec.add_dependency 'json', '~> 2'
|
21
21
|
spec.add_dependency 'rest-client', '~> 2.0.0'
|
22
22
|
spec.add_dependency 'memoist', '~> 0.15.0'
|
23
23
|
spec.add_dependency 'azure-signature', '~> 0.2.3'
|
24
24
|
spec.add_dependency 'activesupport', '>= 4.2.2'
|
25
|
-
spec.add_dependency 'nokogiri', '>= 1.8.1', '~> 1.8'
|
26
25
|
spec.add_dependency 'addressable', '~> 2.4.0'
|
27
26
|
spec.add_dependency 'parallel', '~> 1.12.0'
|
28
27
|
|
@@ -216,7 +216,9 @@ module Azure
|
|
216
216
|
if tries <= max_retries
|
217
217
|
msg = "A rate limit or server side issue has occurred [#{err.http_code}]. Retry number #{tries}."
|
218
218
|
Azure::Armrest::Configuration.log.try(:log, Logger::WARN, msg)
|
219
|
-
sleep_time = err.response.headers[:retry_after] || 30
|
219
|
+
sleep_time = (err.response.headers[:retry_after] || 30).to_i
|
220
|
+
sleep_time = 5 if sleep_time < 5 # 5 second minimum
|
221
|
+
sleep_time = 120 if sleep_time > 120 # 2 minute maximum
|
220
222
|
sleep(sleep_time)
|
221
223
|
retry
|
222
224
|
end
|
@@ -56,7 +56,9 @@ module Azure
|
|
56
56
|
# #=> "123.123.123.123"
|
57
57
|
#
|
58
58
|
def self.attr_from_hash(attrs = {})
|
59
|
-
|
59
|
+
location = caller_locations(1, 1).first
|
60
|
+
file, line = location.path, location.lineno
|
61
|
+
|
60
62
|
attrs.each do |attr_name, keys|
|
61
63
|
keys = Array(keys)
|
62
64
|
first_key = keys.shift
|
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'azure-signature'
|
2
2
|
require 'active_support/core_ext/hash/conversions'
|
3
|
-
require 'nokogiri'
|
4
3
|
|
5
4
|
module Azure
|
6
5
|
module Armrest
|
@@ -194,27 +193,43 @@ module Azure
|
|
194
193
|
# * marker
|
195
194
|
# * maxresults
|
196
195
|
# * timeout
|
196
|
+
# * all
|
197
|
+
#
|
198
|
+
# If the :all option is set to true, then this method will collect all
|
199
|
+
# records. Otherwise, it is capped at 5000 records by Azure, or whatever
|
200
|
+
# you set :maxresults to. If you set both the :all option and the :maxresults
|
201
|
+
# option, then all records will be collected in :maxresults batches.
|
197
202
|
#
|
198
203
|
def files(share, key = access_key, options = {})
|
199
204
|
raise ArgumentError, "No access key specified" unless key
|
200
205
|
|
201
|
-
query =
|
206
|
+
query = "comp=list&restype=directory"
|
207
|
+
|
208
|
+
skip_defs = options[:skip_accessors_definition]
|
209
|
+
|
210
|
+
options.each do |okey, ovalue|
|
211
|
+
unless okey == :skip_accessors_definition
|
212
|
+
query += "&#{okey}=#{[ovalue].flatten.join(',')}"
|
213
|
+
end
|
214
|
+
end
|
202
215
|
|
203
216
|
response = file_response(key, query, 'get', nil, share)
|
204
217
|
|
205
|
-
|
218
|
+
hash = Hash.from_xml(response.body)['EnumerationResults']['Entries']
|
206
219
|
results = []
|
207
220
|
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
end
|
221
|
+
if hash && hash['Directory']
|
222
|
+
Array.wrap(hash['Directory']).each { |dir| results << ShareDirectory.new(dir, skip_defs) }
|
223
|
+
end
|
224
|
+
|
225
|
+
if hash && hash['File']
|
226
|
+
Array.wrap(hash['File']).each { |file| results << ShareFile.new(file, skip_defs) }
|
215
227
|
end
|
216
228
|
|
217
|
-
|
229
|
+
if options[:all] && hash['NextMarker']
|
230
|
+
options[:marker] = hash['NextMarker']
|
231
|
+
results.concat(files(share, key, options))
|
232
|
+
end
|
218
233
|
|
219
234
|
results
|
220
235
|
end
|
@@ -407,6 +422,7 @@ module Azure
|
|
407
422
|
# * maxresults
|
408
423
|
# * include
|
409
424
|
# * timeout
|
425
|
+
# * all
|
410
426
|
#
|
411
427
|
# By default Azure uses a value of 5000 for :maxresults.
|
412
428
|
#
|
@@ -414,6 +430,11 @@ module Azure
|
|
414
430
|
# one element: metadata. More options may be added by Microsoft
|
415
431
|
# at a later date.
|
416
432
|
#
|
433
|
+
# If the :all option is set to true, then this method will collect all
|
434
|
+
# records. Otherwise, it is capped at 5000 records by Azure, or whatever
|
435
|
+
# you set :maxresults to. If you set both the :all option and the :maxresults
|
436
|
+
# option, then all records will be collected in :maxresults batches.
|
437
|
+
#
|
417
438
|
# Example:
|
418
439
|
#
|
419
440
|
# sas = Azure::Armrest::StorageAccountService.new(conf)
|
@@ -424,10 +445,6 @@ module Azure
|
|
424
445
|
# p acct.containers(key, :include => ['metadata'])
|
425
446
|
# p acct.containers(key, :maxresults => 1)
|
426
447
|
#
|
427
|
-
# In cases where a NextMarker element is found in the original response,
|
428
|
-
# another call will automatically be made with the marker value included
|
429
|
-
# in the URL so that you don't have to perform such a step manually.
|
430
|
-
#
|
431
448
|
def containers(key = access_key, options = {})
|
432
449
|
raise ArgumentError, "No access key specified" unless key
|
433
450
|
|
@@ -442,13 +459,19 @@ module Azure
|
|
442
459
|
|
443
460
|
response = blob_response(key, query)
|
444
461
|
|
445
|
-
|
462
|
+
hash = Hash.from_xml(response.body)['EnumerationResults']['Containers']
|
463
|
+
results = []
|
464
|
+
|
465
|
+
if hash && hash['Container']
|
466
|
+
Array.wrap(hash['Container']).each { |c| results << Container.new(c, skip_defs) }
|
467
|
+
end
|
446
468
|
|
447
|
-
|
448
|
-
|
469
|
+
if options[:all] && hash['NextMarker']
|
470
|
+
options[:marker] = hash['NextMarker']
|
471
|
+
results.concat(containers(key, options))
|
449
472
|
end
|
450
473
|
|
451
|
-
results
|
474
|
+
results
|
452
475
|
end
|
453
476
|
|
454
477
|
# Returns the properties for the given container +name+ using account +key+.
|
@@ -555,6 +578,11 @@ module Azure
|
|
555
578
|
# one or more of the following values: snapshots, metadata, copy or
|
556
579
|
# uncommittedblobs.
|
557
580
|
#
|
581
|
+
# If the :all option is set to true, then this method will collect all
|
582
|
+
# records. Otherwise, it is capped at 5000 records by Azure, or whatever
|
583
|
+
# you set :maxresults to. If you set both the :all option and the :maxresults
|
584
|
+
# option, then all records will be collected in :maxresults batches.
|
585
|
+
#
|
558
586
|
# Example:
|
559
587
|
#
|
560
588
|
# sas = Azure::Armrest::StorageAccountService.new(conf)
|
@@ -565,10 +593,6 @@ module Azure
|
|
565
593
|
# p acct.blobs('vhds', key, :timeout => 30)
|
566
594
|
# p acct.blobs('vhds', key, :include => ['snapshots', 'metadata'])
|
567
595
|
#
|
568
|
-
# In cases where a NextMarker element is found in the original response,
|
569
|
-
# another call will automatically be made with the marker value included
|
570
|
-
# in the URL so that you don't have to perform such a step manually.
|
571
|
-
#
|
572
596
|
def blobs(container, key = access_key, options = {})
|
573
597
|
raise ArgumentError, "No access key specified" unless key
|
574
598
|
|
@@ -583,14 +607,23 @@ module Azure
|
|
583
607
|
|
584
608
|
response = blob_response(key, query, container)
|
585
609
|
|
586
|
-
|
610
|
+
hash = Hash.from_xml(response.body)['EnumerationResults']['Blobs']
|
611
|
+
results = []
|
612
|
+
|
613
|
+
if hash && hash['Blob']
|
614
|
+
Array.wrap(hash['Blob']).each do |h|
|
615
|
+
h[:container] = container
|
616
|
+
object = h.key?('Snapshot') ? BlobSnapshot.new(h, skip_defs) : Blob.new(h, skip_defs)
|
617
|
+
results << object
|
618
|
+
end
|
619
|
+
end
|
587
620
|
|
588
|
-
|
589
|
-
|
590
|
-
|
621
|
+
if options[:all] && hash['NextMarker']
|
622
|
+
options[:marker] = hash['NextMarker']
|
623
|
+
results.concat(blobs(container, key, options))
|
591
624
|
end
|
592
625
|
|
593
|
-
results
|
626
|
+
results
|
594
627
|
end
|
595
628
|
|
596
629
|
# Returns an array of all blobs for all containers. The +options+ hash
|
@@ -625,10 +658,9 @@ module Azure
|
|
625
658
|
raise ArgumentError, "No access key specified" unless key
|
626
659
|
|
627
660
|
response = blob_response(key, "restype=service&comp=properties")
|
628
|
-
|
661
|
+
hash = Hash.from_xml(response.body)['StorageServiceProperties']
|
629
662
|
|
630
|
-
|
631
|
-
BlobServiceProperty.new(Hash.from_xml(doc.to_s)[toplevel])
|
663
|
+
BlobServiceProperty.new(hash)
|
632
664
|
end
|
633
665
|
|
634
666
|
# Return metadata for the given +blob+ within +container+. You may
|
@@ -653,10 +685,9 @@ module Azure
|
|
653
685
|
raise ArgumentError, "No access key specified" unless key
|
654
686
|
|
655
687
|
response = blob_response(key, "restype=service&comp=stats")
|
656
|
-
toplevel = 'StorageServiceStats'
|
657
688
|
|
658
|
-
|
659
|
-
BlobServiceStat.new(
|
689
|
+
hash = Hash.from_xml(response.body)['StorageServiceStats']
|
690
|
+
BlobServiceStat.new(hash)
|
660
691
|
end
|
661
692
|
|
662
693
|
# Copy the blob from the source container/blob to the destination container/blob.
|
@@ -1045,21 +1076,6 @@ module Azure
|
|
1045
1076
|
|
1046
1077
|
headers
|
1047
1078
|
end
|
1048
|
-
|
1049
|
-
# Generic method to handle NextMarker token. The +doc+ should be an
|
1050
|
-
# XML object that responds to .xpath, followed by a method name,
|
1051
|
-
# followed by any arguments to pass to that method.
|
1052
|
-
#
|
1053
|
-
def next_marker_results(doc, method_name, *args)
|
1054
|
-
xmarker = doc.xpath('//NextMarker').first # There is only one
|
1055
|
-
if xmarker.children.empty?
|
1056
|
-
return []
|
1057
|
-
else
|
1058
|
-
args = args.dup # Avoid modifying original argument
|
1059
|
-
args.last[:marker] = xmarker.children.first.to_s
|
1060
|
-
return send(method_name, *args)
|
1061
|
-
end
|
1062
|
-
end
|
1063
1079
|
end
|
1064
1080
|
end
|
1065
1081
|
end
|
@@ -72,14 +72,14 @@ module Azure
|
|
72
72
|
# Returns an ArmrestCollection, with the response headers set
|
73
73
|
# for the operation as a whole.
|
74
74
|
#
|
75
|
-
def list(rgroup = configuration.resource_group)
|
75
|
+
def list(rgroup = configuration.resource_group, skip_accessors_definition = false)
|
76
76
|
validate_resource_group(rgroup)
|
77
77
|
|
78
78
|
url = build_url(rgroup)
|
79
79
|
url = yield(url) || url if block_given?
|
80
80
|
response = rest_get(url)
|
81
81
|
|
82
|
-
get_all_results(response)
|
82
|
+
get_all_results(response, skip_accessors_definition)
|
83
83
|
end
|
84
84
|
|
85
85
|
# Use a single call to get all resources for the service. You may
|
@@ -18,7 +18,7 @@ module Azure
|
|
18
18
|
|
19
19
|
# Same as other resource based list methods, but also sets the proxy on each model object.
|
20
20
|
#
|
21
|
-
def list(resource_group = configuration.resource_group)
|
21
|
+
def list(resource_group = configuration.resource_group, skip_accessors_definition = false)
|
22
22
|
super.each { |model| model.configuration = configuration }
|
23
23
|
end
|
24
24
|
|
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.9.
|
4
|
+
version: 0.9.2
|
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: 2017-10-
|
14
|
+
date: 2017-10-31 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: json
|
@@ -19,14 +19,14 @@ dependencies:
|
|
19
19
|
requirements:
|
20
20
|
- - "~>"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 2
|
22
|
+
version: '2'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - "~>"
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 2
|
29
|
+
version: '2'
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: rest-client
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -83,26 +83,6 @@ dependencies:
|
|
83
83
|
- - ">="
|
84
84
|
- !ruby/object:Gem::Version
|
85
85
|
version: 4.2.2
|
86
|
-
- !ruby/object:Gem::Dependency
|
87
|
-
name: nokogiri
|
88
|
-
requirement: !ruby/object:Gem::Requirement
|
89
|
-
requirements:
|
90
|
-
- - ">="
|
91
|
-
- !ruby/object:Gem::Version
|
92
|
-
version: 1.8.1
|
93
|
-
- - "~>"
|
94
|
-
- !ruby/object:Gem::Version
|
95
|
-
version: '1.8'
|
96
|
-
type: :runtime
|
97
|
-
prerelease: false
|
98
|
-
version_requirements: !ruby/object:Gem::Requirement
|
99
|
-
requirements:
|
100
|
-
- - ">="
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version: 1.8.1
|
103
|
-
- - "~>"
|
104
|
-
- !ruby/object:Gem::Version
|
105
|
-
version: '1.8'
|
106
86
|
- !ruby/object:Gem::Dependency
|
107
87
|
name: addressable
|
108
88
|
requirement: !ruby/object:Gem::Requirement
|
@@ -308,7 +288,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
308
288
|
version: '0'
|
309
289
|
requirements: []
|
310
290
|
rubyforge_project:
|
311
|
-
rubygems_version: 2.6.
|
291
|
+
rubygems_version: 2.6.14
|
312
292
|
signing_key:
|
313
293
|
specification_version: 4
|
314
294
|
summary: An interface for ARM/JSON Azure REST API
|