azure-armrest 0.3.7 → 0.3.8
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 +14 -0
- data/lib/azure/armrest.rb +1 -0
- data/lib/azure/armrest/armrest_collection.rb +2 -0
- data/lib/azure/armrest/armrest_service.rb +32 -33
- data/lib/azure/armrest/configuration.rb +6 -17
- data/lib/azure/armrest/exception.rb +91 -9
- data/lib/azure/armrest/model/base_model.rb +10 -13
- data/lib/azure/armrest/resource_group_based_service.rb +36 -7
- data/lib/azure/armrest/resource_provider_service.rb +2 -2
- data/lib/azure/armrest/storage_account_service.rb +10 -14
- data/lib/azure/armrest/template_deployment_service.rb +12 -0
- 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: cfe77ac7705382e48afa5deeab108cefa90d07ae
|
4
|
+
data.tar.gz: a6c7a2ab379f076af861fb21fcc674a573aee67e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 97bfb012ae0a449c8c95ed107c68e5849dfcb5359a2e7a7d9a566bc12b4406722fa0c88e6678cf8834b0abdba81fbd07804d628ff4025a12940f0428d788e2e4
|
7
|
+
data.tar.gz: ebb632b5bfcf35007a99d6e46f0f65a85dea6fc0796d998d0b6c6620db01a6f99dc82795767db3c4792b226f07d6a81d539d0c53bc42f037d430057e2712e7e4
|
data/CHANGES
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
= 0.3.8 - 7-Oct-2-16
|
2
|
+
* Added more robust exception wrapping, now mostly based on http error code.
|
3
|
+
* Refactored the internal fetch_providers method so that it uses our own
|
4
|
+
service class method call, which is cached.
|
5
|
+
* Added the TemplateDeploymentService#get_template method.
|
6
|
+
* The :list and :list_all methods in the ResourceGroupBasedService class now
|
7
|
+
automatically perform pagination.
|
8
|
+
* Replaced our custom inspect with the one provided by pretty_print.
|
9
|
+
* Added the :response_code and :response_headers accessors to the BaseModel
|
10
|
+
class. All individual objects and collections now set these.
|
11
|
+
* Modified our :poll method to check the :response_code, and to try the
|
12
|
+
:location attribute if :azure_asyncoperation isn't found.
|
13
|
+
* Updated the :create documentation for the StorageAccountService class.
|
14
|
+
|
1
15
|
= 0.3.7 - 15-Sep-2016
|
2
16
|
* Modified the private image listing code in the StorageAccountService class
|
3
17
|
to skip over storage accounts when we cannot get a key.
|
data/lib/azure/armrest.rb
CHANGED
@@ -5,6 +5,7 @@ module Azure
|
|
5
5
|
class ArmrestCollection < Array
|
6
6
|
attr_accessor :continuation_token
|
7
7
|
attr_accessor :response_headers
|
8
|
+
attr_accessor :response_code
|
8
9
|
|
9
10
|
alias skip_token continuation_token
|
10
11
|
alias skip_token= continuation_token=
|
@@ -18,6 +19,7 @@ module Azure
|
|
18
19
|
json_response = JSON.parse(response)
|
19
20
|
array = new(json_response['value'].map { |hash| klass.new(hash) })
|
20
21
|
|
22
|
+
array.response_code = response.code
|
21
23
|
array.response_headers = response.headers
|
22
24
|
array.continuation_token = parse_skip_token(json_response)
|
23
25
|
|
@@ -166,7 +166,8 @@ module Azure
|
|
166
166
|
# such as create or delete.
|
167
167
|
#
|
168
168
|
def poll(response)
|
169
|
-
|
169
|
+
return 'Succeeded' if [200, 201].include?(response.response_code)
|
170
|
+
url = response.try(:azure_asyncoperation) || response.try(:location)
|
170
171
|
JSON.parse(rest_get(url))['status']
|
171
172
|
end
|
172
173
|
|
@@ -198,11 +199,9 @@ module Azure
|
|
198
199
|
class << self
|
199
200
|
private
|
200
201
|
|
201
|
-
def rest_execute(options, http_method = :get)
|
202
|
-
|
203
|
-
|
204
|
-
:url => Addressable::URI.escape(options[:url])
|
205
|
-
)
|
202
|
+
def rest_execute(options, http_method = :get, encode = true)
|
203
|
+
url = encode ? Addressable::URI.encode(options[:url]) : options[:url]
|
204
|
+
options = options.merge(:method => http_method, :url => url)
|
206
205
|
RestClient::Request.execute(options)
|
207
206
|
rescue RestClient::Exception => e
|
208
207
|
raise_api_exception(e)
|
@@ -232,34 +231,30 @@ module Azure
|
|
232
231
|
rest_execute(options, :head)
|
233
232
|
end
|
234
233
|
|
235
|
-
def raise_api_exception(
|
234
|
+
def raise_api_exception(err)
|
236
235
|
begin
|
237
|
-
response = JSON.parse(
|
238
|
-
code
|
239
|
-
message
|
236
|
+
response = JSON.parse(err.http_body)
|
237
|
+
code = response['error']['code']
|
238
|
+
message = response['error']['message']
|
240
239
|
rescue
|
241
|
-
|
240
|
+
code = err.try(:http_code) || err.try(:code)
|
241
|
+
message = err.try(:http_body) || err.try(:message)
|
242
242
|
end
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
else
|
259
|
-
ApiException
|
260
|
-
end
|
261
|
-
|
262
|
-
raise exception_type.new(code, message, e)
|
243
|
+
|
244
|
+
exception_type = Azure::Armrest::EXCEPTION_MAP[err.http_code]
|
245
|
+
|
246
|
+
# If this is an exception that doesn't map directly to an HTTP code
|
247
|
+
# then parse it the exception class name and re-raise it as our own.
|
248
|
+
if exception_type.nil?
|
249
|
+
begin
|
250
|
+
klass = "Azure::Armrest::" + err.class.to_s.split("::").last + "Exception"
|
251
|
+
exception_type = const_get(klass)
|
252
|
+
rescue NameError
|
253
|
+
exception_type = Azure::Armrest::ApiException
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
raise exception_type.new(code, message, err)
|
263
258
|
end
|
264
259
|
end
|
265
260
|
|
@@ -267,7 +262,7 @@ module Azure
|
|
267
262
|
|
268
263
|
# REST verb methods
|
269
264
|
|
270
|
-
def rest_execute(url, body = nil, http_method = :get)
|
265
|
+
def rest_execute(url, body = nil, http_method = :get, encode = true)
|
271
266
|
options = {
|
272
267
|
:url => url,
|
273
268
|
:proxy => configuration.proxy,
|
@@ -282,13 +277,17 @@ module Azure
|
|
282
277
|
|
283
278
|
options[:payload] = body if body
|
284
279
|
|
285
|
-
self.class.send(:rest_execute, options, http_method)
|
280
|
+
self.class.send(:rest_execute, options, http_method, encode)
|
286
281
|
end
|
287
282
|
|
288
283
|
def rest_get(url)
|
289
284
|
rest_execute(url)
|
290
285
|
end
|
291
286
|
|
287
|
+
def rest_get_without_encoding(url)
|
288
|
+
rest_execute(url, nil, :get, false)
|
289
|
+
end
|
290
|
+
|
292
291
|
def rest_put(url, body = '')
|
293
292
|
rest_execute(url, body, :put)
|
294
293
|
end
|
@@ -162,7 +162,11 @@ module Azure
|
|
162
162
|
|
163
163
|
# Return the default api version for the given provider and service
|
164
164
|
def provider_default_api_version(provider, service)
|
165
|
-
@provider_api_versions
|
165
|
+
if @provider_api_versions
|
166
|
+
@provider_api_versions[provider.downcase][service.downcase]
|
167
|
+
else
|
168
|
+
nil # Typically only for the fetch_providers method.
|
169
|
+
end
|
166
170
|
end
|
167
171
|
|
168
172
|
# The name of the file or handle used to log http requests.
|
@@ -266,22 +270,7 @@ module Azure
|
|
266
270
|
end
|
267
271
|
|
268
272
|
def fetch_providers
|
269
|
-
|
270
|
-
uri.query = "api-version=#{api_version}"
|
271
|
-
|
272
|
-
response = ArmrestService.send(
|
273
|
-
:rest_get,
|
274
|
-
:url => uri.to_s,
|
275
|
-
:proxy => proxy,
|
276
|
-
:ssl_version => ssl_version,
|
277
|
-
:ssl_verify => ssl_verify,
|
278
|
-
:headers => {
|
279
|
-
:content_type => content_type,
|
280
|
-
:authorization => token
|
281
|
-
}
|
282
|
-
)
|
283
|
-
|
284
|
-
JSON.parse(response.body)['value'].map { |hash| Azure::Armrest::ResourceProvider.new(hash) }
|
273
|
+
Azure::Armrest::ResourceProviderService.new(self).list
|
285
274
|
end
|
286
275
|
|
287
276
|
def fetch_token
|
@@ -52,18 +52,100 @@ module Azure
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
-
#
|
56
|
-
|
57
|
-
class ResourceNotFoundException < ApiException; end
|
58
|
-
|
55
|
+
# Rewrapped HTTP errors
|
56
|
+
class BadGatewayException < ApiException; end
|
59
57
|
class BadRequestException < ApiException; end
|
60
|
-
|
58
|
+
class BandwidthLimitExceededException < ApiException; end
|
59
|
+
class BlockedByWindowsParentalControlsException < ApiException; end
|
60
|
+
class ConflictException < ApiException; end
|
61
|
+
class ExpectationFailedException < ApiException; end
|
62
|
+
class FailedDependencyException < ApiException; end
|
63
|
+
class ForbiddenException < ApiException; end
|
64
|
+
class GatewayTimeoutException < ApiException; end
|
65
|
+
class GoneException < ApiException; end
|
66
|
+
class HTTPVersionNotSupportedException < ApiException; end
|
67
|
+
class ImATeapotException < ApiException; end
|
68
|
+
class InsufficientStorageException < ApiException; end
|
69
|
+
class InternalServerErrorException < ApiException; end
|
70
|
+
class LengthRequiredException < ApiException; end
|
71
|
+
class LockedException < ApiException; end
|
72
|
+
class LoopDetectedException < ApiException; end
|
73
|
+
class MethodNotAllowedException < ApiException; end
|
74
|
+
class NetworkAuthenticationRequiredException < ApiException; end
|
75
|
+
class NotAcceptableException < ApiException; end
|
76
|
+
class NotExtendedException < ApiException; end
|
77
|
+
class NotFoundException < ApiException; end
|
78
|
+
class NotImplementedException < ApiException; end
|
79
|
+
class PayloadTooLargeException < ApiException; end
|
80
|
+
class PaymentRequiredException < ApiException; end
|
81
|
+
class PreconditionFailedException < ApiException; end
|
82
|
+
class PreconditionRequiredException < ApiException; end
|
83
|
+
class ProxyAuthenticationRequiredException < ApiException; end
|
84
|
+
class RangeNotSatisfiableException < ApiException; end
|
85
|
+
class RequestHeaderFieldsTooLargeException < ApiException; end
|
86
|
+
class RequestTimeoutException < ApiException; end
|
87
|
+
class RetryWithException < ApiException; end
|
88
|
+
class ServiceUnavailableException < ApiException; end
|
89
|
+
class TooManyConnectionsFromThisIPException < ApiException; end
|
90
|
+
class TooManyRequestsException < ApiException; end
|
91
|
+
class URITooLongException < ApiException; end
|
61
92
|
class UnauthorizedException < ApiException; end
|
93
|
+
class UnorderedCollectionException < ApiException; end
|
94
|
+
class UnprocessableEntityException < ApiException; end
|
95
|
+
class UnsupportedMediaTypeException < ApiException; end
|
96
|
+
class UpgradeRequiredException < ApiException; end
|
97
|
+
class VariantAlsoNegotiatesException < ApiException; end
|
62
98
|
|
63
|
-
|
64
|
-
|
65
|
-
class
|
99
|
+
# Custom errors or other wrapped exceptions
|
100
|
+
class ResourceNotFoundException < ApiException; end
|
101
|
+
class TimeoutException < RequestTimeoutException; end
|
102
|
+
class OpenTimeoutException < TimeoutException; end
|
103
|
+
class ReadTimeoutException < TimeoutException; end
|
66
104
|
|
67
|
-
|
105
|
+
# Map HTTP error codes to our exception classes
|
106
|
+
EXCEPTION_MAP = {
|
107
|
+
400 => BadRequestException,
|
108
|
+
401 => UnauthorizedException,
|
109
|
+
402 => PaymentRequiredException,
|
110
|
+
403 => ForbiddenException,
|
111
|
+
404 => NotFoundException,
|
112
|
+
405 => MethodNotAllowedException,
|
113
|
+
406 => NotAcceptableException,
|
114
|
+
407 => ProxyAuthenticationRequiredException,
|
115
|
+
408 => RequestTimeoutException,
|
116
|
+
409 => ConflictException,
|
117
|
+
410 => GoneException,
|
118
|
+
411 => LengthRequiredException,
|
119
|
+
412 => PreconditionFailedException,
|
120
|
+
413 => PayloadTooLargeException,
|
121
|
+
414 => URITooLongException,
|
122
|
+
415 => UnsupportedMediaTypeException,
|
123
|
+
416 => RangeNotSatisfiableException,
|
124
|
+
417 => ExpectationFailedException,
|
125
|
+
418 => ImATeapotException,
|
126
|
+
421 => TooManyConnectionsFromThisIPException,
|
127
|
+
422 => UnprocessableEntityException,
|
128
|
+
423 => LockedException,
|
129
|
+
424 => FailedDependencyException,
|
130
|
+
425 => UnorderedCollectionException,
|
131
|
+
426 => UpgradeRequiredException,
|
132
|
+
428 => PreconditionRequiredException,
|
133
|
+
429 => TooManyRequestsException,
|
134
|
+
431 => RequestHeaderFieldsTooLargeException,
|
135
|
+
449 => RetryWithException,
|
136
|
+
450 => BlockedByWindowsParentalControlsException,
|
137
|
+
500 => InternalServerErrorException,
|
138
|
+
501 => NotImplementedException,
|
139
|
+
502 => BadGatewayException,
|
140
|
+
503 => ServiceUnavailableException,
|
141
|
+
504 => GatewayTimeoutException,
|
142
|
+
505 => HTTPVersionNotSupportedException,
|
143
|
+
506 => VariantAlsoNegotiatesException,
|
144
|
+
507 => InsufficientStorageException,
|
145
|
+
508 => LoopDetectedException,
|
146
|
+
509 => BandwidthLimitExceededException,
|
147
|
+
510 => NotExtendedException,
|
148
|
+
511 => NetworkAuthenticationRequiredException
|
149
|
+
}.freeze
|
68
150
|
end
|
69
151
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'active_support/core_ext/string/inflections'
|
2
|
+
require 'pp'
|
2
3
|
|
3
4
|
module Azure
|
4
5
|
module Armrest
|
@@ -23,6 +24,7 @@ module Azure
|
|
23
24
|
attr_hash :tags
|
24
25
|
|
25
26
|
attr_accessor :response_headers
|
27
|
+
attr_accessor :response_code
|
26
28
|
|
27
29
|
# Constructs and returns a new JSON wrapper class. Pass in a plain
|
28
30
|
# JSON string and it will automatically give you accessor methods
|
@@ -91,19 +93,9 @@ module Azure
|
|
91
93
|
@json
|
92
94
|
end
|
93
95
|
|
94
|
-
def inspect_method_list
|
95
|
-
methods(false).reject { |m| m.to_s.end_with?('=') }
|
96
|
-
end
|
97
|
-
private :inspect_method_list
|
98
|
-
|
99
|
-
def inspect
|
100
|
-
Kernel.instance_method(:to_s).bind(self).call.chomp!('>') <<
|
101
|
-
' ' <<
|
102
|
-
inspect_method_list.map { |m| "#{m}=#{send(m).inspect}" }.join(', ') <<
|
103
|
-
'>'
|
104
|
-
end
|
105
|
-
|
106
96
|
def pretty_print(q)
|
97
|
+
inspect_method_list = methods(false).reject { |m| m.to_s.end_with?('=') }
|
98
|
+
|
107
99
|
q.object_address_group(self) {
|
108
100
|
q.seplist(inspect_method_list, lambda { q.text ',' }) {|v|
|
109
101
|
q.breakable
|
@@ -117,6 +109,8 @@ module Azure
|
|
117
109
|
}
|
118
110
|
end
|
119
111
|
|
112
|
+
alias_method :inspect, :pretty_print_inspect
|
113
|
+
|
120
114
|
def ==(other)
|
121
115
|
return false unless other.kind_of?(BaseModel)
|
122
116
|
__getobj__ == other.__getobj__
|
@@ -186,6 +180,7 @@ module Azure
|
|
186
180
|
# Initial class definitions. Reopen these classes as needed.
|
187
181
|
|
188
182
|
class AvailabilitySet < BaseModel; end
|
183
|
+
class DeploymentTemplate < BaseModel; end
|
189
184
|
class Event < BaseModel; end
|
190
185
|
class ImageVersion < BaseModel; end
|
191
186
|
class Offer < BaseModel; end
|
@@ -196,7 +191,9 @@ module Azure
|
|
196
191
|
class Sku < BaseModel; end
|
197
192
|
class Usage < BaseModel; end
|
198
193
|
|
199
|
-
class ResponseHeaders < BaseModel
|
194
|
+
class ResponseHeaders < BaseModel
|
195
|
+
undef_method :response_headers
|
196
|
+
end
|
200
197
|
|
201
198
|
class StorageAccount < BaseModel; end
|
202
199
|
class StorageAccountKey < StorageAccount
|
@@ -21,13 +21,18 @@ module Azure
|
|
21
21
|
url = yield(url) || url if block_given?
|
22
22
|
response = rest_put(url, options.to_json)
|
23
23
|
|
24
|
-
|
24
|
+
headers = Azure::Armrest::ResponseHeaders.new(response.headers)
|
25
|
+
headers.response_code = response.code
|
25
26
|
|
26
|
-
|
27
|
+
if response.body.empty?
|
28
|
+
obj = get(name, rgroup)
|
29
|
+
else
|
27
30
|
obj = model_class.new(response.body)
|
28
|
-
obj.response_headers = Azure::Armrest::ResponseHeaders.new(response.headers)
|
29
31
|
end
|
30
32
|
|
33
|
+
obj.response_headers = headers
|
34
|
+
obj.response_code = headers.response_code
|
35
|
+
|
31
36
|
obj
|
32
37
|
end
|
33
38
|
|
@@ -46,7 +51,7 @@ module Azure
|
|
46
51
|
url = yield(url) || url if block_given?
|
47
52
|
response = rest_get(url)
|
48
53
|
|
49
|
-
|
54
|
+
get_all_results(response)
|
50
55
|
end
|
51
56
|
|
52
57
|
# Use a single call to get all resources for the service. You may
|
@@ -63,7 +68,7 @@ module Azure
|
|
63
68
|
url = yield(url) || url if block_given?
|
64
69
|
|
65
70
|
response = rest_get(url)
|
66
|
-
results =
|
71
|
+
results = get_all_results(response)
|
67
72
|
|
68
73
|
filter.empty? ? results : results.select { |obj| filter.all? { |k, v| obj.public_send(k) == v } }
|
69
74
|
end
|
@@ -81,6 +86,7 @@ module Azure
|
|
81
86
|
|
82
87
|
obj = model_class.new(response.body)
|
83
88
|
obj.response_headers = Azure::Armrest::ResponseHeaders.new(response.headers)
|
89
|
+
obj.response_code = response.code
|
84
90
|
|
85
91
|
obj
|
86
92
|
end
|
@@ -106,11 +112,29 @@ module Azure
|
|
106
112
|
raise Azure::Armrest::ResourceNotFoundException.new(response.code, msg, response)
|
107
113
|
end
|
108
114
|
|
109
|
-
Azure::Armrest::ResponseHeaders.new(response.headers)
|
115
|
+
headers = Azure::Armrest::ResponseHeaders.new(response.headers)
|
116
|
+
headers.response_code = response.code
|
117
|
+
|
118
|
+
headers
|
110
119
|
end
|
111
120
|
|
112
121
|
private
|
113
122
|
|
123
|
+
# Make additional calls and concatenate the results if a continuation URL is found.
|
124
|
+
def get_all_results(response)
|
125
|
+
results = Azure::Armrest::ArmrestCollection.create_from_response(response, model_class)
|
126
|
+
nextlink = JSON.parse(response)['nextLink']
|
127
|
+
|
128
|
+
while nextlink
|
129
|
+
response = rest_get_without_encoding(nextlink)
|
130
|
+
more = Azure::Armrest::ArmrestCollection.create_from_response(response, model_class)
|
131
|
+
results.concat(more)
|
132
|
+
nextlink = JSON.parse(response)['nextLink']
|
133
|
+
end
|
134
|
+
|
135
|
+
results
|
136
|
+
end
|
137
|
+
|
114
138
|
def validate_resource_group(name)
|
115
139
|
raise ArgumentError, "must specify resource group" unless name
|
116
140
|
end
|
@@ -144,17 +168,22 @@ module Azure
|
|
144
168
|
array = []
|
145
169
|
mutex = Mutex.new
|
146
170
|
headers = nil
|
171
|
+
code = nil
|
147
172
|
|
148
173
|
Parallel.each(list_resource_groups, :in_threads => configuration.max_threads) do |rg|
|
149
174
|
response = rest_get(build_url(rg.name))
|
150
175
|
json_response = JSON.parse(response.body)['value']
|
151
176
|
headers = Azure::Armrest::ResponseHeaders.new(response.headers)
|
177
|
+
code = response.code
|
152
178
|
results = json_response.map { |hash| model_class.new(hash) }
|
153
179
|
mutex.synchronize { array << results } unless results.blank?
|
154
180
|
end
|
155
181
|
|
156
182
|
array = ArmrestCollection.new(array.flatten)
|
157
|
-
|
183
|
+
|
184
|
+
# Use the last set of headers and response code for the overall result.
|
185
|
+
array.response_headers = headers
|
186
|
+
array.response_code = code
|
158
187
|
|
159
188
|
array
|
160
189
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'cache_method'
|
2
|
-
|
3
1
|
module Azure
|
4
2
|
module Armrest
|
5
3
|
class ResourceProviderService < ArmrestService
|
@@ -39,6 +37,8 @@ module Azure
|
|
39
37
|
_list.map{ |hash| Azure::Armrest::ResourceProvider.new(hash) }
|
40
38
|
end
|
41
39
|
|
40
|
+
# This is split out for the cache_method feature.
|
41
|
+
#
|
42
42
|
def _list
|
43
43
|
response = rest_get(build_url)
|
44
44
|
JSON.parse(response)["value"]
|
@@ -44,7 +44,8 @@ module Azure
|
|
44
44
|
# specified parameters.
|
45
45
|
#
|
46
46
|
# Note that the name of the storage account within the specified
|
47
|
-
# must be 3-24 alphanumeric lowercase characters.
|
47
|
+
# must be 3-24 alphanumeric lowercase characters. This name must be
|
48
|
+
# unique across all subscriptions.
|
48
49
|
#
|
49
50
|
# The options available are as follows:
|
50
51
|
#
|
@@ -68,15 +69,14 @@ module Azure
|
|
68
69
|
#
|
69
70
|
# sas = Azure::Armrest::StorageAccountService(config)
|
70
71
|
#
|
71
|
-
#
|
72
|
-
# "
|
73
|
-
#
|
74
|
-
# {
|
75
|
-
#
|
76
|
-
#
|
77
|
-
#
|
78
|
-
#
|
79
|
-
# )
|
72
|
+
# options = {
|
73
|
+
# :location => "Central US",
|
74
|
+
# :tags => {:redhat => true},
|
75
|
+
# :sku => {:name => "Standard_LRS"},
|
76
|
+
# :kind => "Storage"
|
77
|
+
# }
|
78
|
+
#
|
79
|
+
# sas.create("your_storage_account", "your_resource_group", options)
|
80
80
|
#
|
81
81
|
def create(account_name, rgroup = configuration.resource_group, options)
|
82
82
|
validating = options.delete(:validating)
|
@@ -86,10 +86,6 @@ module Azure
|
|
86
86
|
url << "&validating=" << validating if validating
|
87
87
|
end
|
88
88
|
|
89
|
-
# An initial create call will return nil because the response body is
|
90
|
-
# empty. In that case, make another call to get the object properties.
|
91
|
-
acct = get(account_name, rgroup) unless acct
|
92
|
-
|
93
89
|
acct.proxy = configuration.proxy
|
94
90
|
acct.ssl_version = configuration.ssl_version
|
95
91
|
acct.ssl_verify = configuration.ssl_verify
|
@@ -37,6 +37,18 @@ module Azure
|
|
37
37
|
response = rest_get(url)
|
38
38
|
TemplateDeploymentOperation.new(response)
|
39
39
|
end
|
40
|
+
|
41
|
+
# Returns the json template as an object for the given deployment.
|
42
|
+
#
|
43
|
+
# If you want the plain JSON text then call .to_json on the returned object.
|
44
|
+
#
|
45
|
+
def get_template(deploy_name, resource_group = configuration.resource_group)
|
46
|
+
validate_resource_group(resource_group)
|
47
|
+
validate_resource(deploy_name)
|
48
|
+
url = build_url(resource_group, deploy_name, 'exportTemplate')
|
49
|
+
response = JSON.parse(rest_post(url))['template']
|
50
|
+
DeploymentTemplate.new(response)
|
51
|
+
end
|
40
52
|
end
|
41
53
|
end
|
42
54
|
end
|
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.3.
|
4
|
+
version: 0.3.8
|
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-
|
14
|
+
date: 2016-10-07 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: json
|