azure-armrest 0.2.10 → 0.3.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 +4 -4
- data/.travis.yml +3 -2
- data/CHANGES +16 -10
- data/README.md +4 -3
- data/azure-armrest.gemspec +1 -0
- data/lib/azure/armrest.rb +3 -1
- data/lib/azure/armrest/armrest_service.rb +111 -364
- data/lib/azure/armrest/billing/usage_service.rb +54 -0
- data/lib/azure/armrest/configuration.rb +258 -0
- data/lib/azure/armrest/exception.rb +4 -25
- data/lib/azure/armrest/model/base_model.rb +24 -4
- data/lib/azure/armrest/model/storage_account.rb +18 -9
- data/lib/azure/armrest/resource_group_based_service.rb +1 -1
- data/lib/azure/armrest/resource_group_service.rb +3 -3
- data/lib/azure/armrest/resource_service.rb +35 -26
- data/lib/azure/armrest/storage_account_service.rb +2 -24
- data/lib/azure/armrest/version.rb +1 -1
- data/lib/azure/armrest/virtual_machine_service.rb +6 -5
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d6e051e8b1aafc0e56dead25b4b049a1db77991d
|
4
|
+
data.tar.gz: 6cd67f1ba82fc44da524373ae20f68b6e0a29737
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2243372f9f4b26501539f91db5d91be939454c7608a6feee25d9addd8aae16239c986b76555286a1f19e384ce4fc7d77511701f30ae5104145b8da3003671bc2
|
7
|
+
data.tar.gz: c139739090ad6fa30c5e86e61197db7cf09c7695d79ad4ee6aa728281294653234728cb782542f7a0633b1deede6d10258107211d51588ff1afcc2964aa7ee03
|
data/.travis.yml
CHANGED
data/CHANGES
CHANGED
@@ -1,15 +1,21 @@
|
|
1
|
-
= 0.
|
2
|
-
*
|
3
|
-
|
4
|
-
|
5
|
-
*
|
6
|
-
|
7
|
-
|
8
|
-
*
|
9
|
-
*
|
1
|
+
= 0.3.0 - 28-Jun-2016
|
2
|
+
* The configuration handling has been moved into its own class called
|
3
|
+
Azure::Armrest::Configuration. You can call this explicitly using :new,
|
4
|
+
or you can still use ArmrestService.configure.
|
5
|
+
* The :subscription_id option for configuration is no longer optional.
|
6
|
+
The logic for automatically fetching the first active subscription ID
|
7
|
+
that could be found has been dropped.
|
8
|
+
* Added the Billing::UsageService class.
|
9
|
+
* Added a TooManyRequests exception.
|
10
|
+
* Added support for pretty_print.
|
11
|
+
* Added the addressable gem as a dependency, as it internally replaces
|
12
|
+
the uri standard library. Calls to rest-client are still encoded, but
|
13
|
+
now using Addressable::URI.
|
14
|
+
* StorageAccountService no longer does account type validation.
|
15
|
+
* Added the StorageAccountService#list_all_private_images method.
|
10
16
|
|
11
17
|
= 0.2.7 - 20-Jun-2016
|
12
|
-
* All internal calls to rest-client are now explicitly URI.
|
18
|
+
* All internal calls to rest-client are now explicitly URI.encoded.
|
13
19
|
|
14
20
|
= 0.2.6 - 9-May-2016
|
15
21
|
* If no subscription is provided, the internal method for fetching a default
|
data/README.md
CHANGED
@@ -18,7 +18,7 @@ require 'azure/armrest'
|
|
18
18
|
#
|
19
19
|
# A token will be retrieved based on the information you provided
|
20
20
|
|
21
|
-
conf = Azure::Armrest::
|
21
|
+
conf = Azure::Armrest::Configuration.new(
|
22
22
|
:client_id => 'XXXXX',
|
23
23
|
:client_key => 'YYYYY',
|
24
24
|
:tenant_id => 'ZZZZZ',
|
@@ -40,8 +40,9 @@ end
|
|
40
40
|
|
41
41
|
## Subscriptions
|
42
42
|
|
43
|
-
|
44
|
-
|
43
|
+
As of version 0.3.0 you must provide a subscription ID. In previous versions,
|
44
|
+
if you did not provide a subscription ID in your configuration object, then the
|
45
|
+
first subscription ID returned from a REST call would be used.
|
45
46
|
|
46
47
|
## Notes
|
47
48
|
|
data/azure-armrest.gemspec
CHANGED
@@ -25,6 +25,7 @@ behind the scenes.
|
|
25
25
|
spec.add_dependency 'azure-signature', '~> 0.2.0'
|
26
26
|
spec.add_dependency 'activesupport', '>= 1.2.0'
|
27
27
|
spec.add_dependency 'nokogiri', '~> 1.6.0'
|
28
|
+
spec.add_dependency 'addressable', '~> 2.4.0'
|
28
29
|
|
29
30
|
spec.add_development_dependency 'bundler'
|
30
31
|
spec.add_development_dependency 'rake'
|
data/lib/azure/armrest.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'rest-client'
|
2
2
|
require 'json'
|
3
3
|
require 'thread'
|
4
|
-
require '
|
4
|
+
require 'addressable'
|
5
5
|
|
6
6
|
# The Azure module serves as a namespace.
|
7
7
|
module Azure
|
@@ -21,6 +21,7 @@ module Azure
|
|
21
21
|
end
|
22
22
|
|
23
23
|
require 'azure/armrest/version'
|
24
|
+
require 'azure/armrest/configuration'
|
24
25
|
require 'azure/armrest/exception'
|
25
26
|
require 'azure/armrest/armrest_collection'
|
26
27
|
require 'azure/armrest/armrest_service'
|
@@ -48,6 +49,7 @@ require 'azure/armrest/role/assignment_service'
|
|
48
49
|
require 'azure/armrest/role/definition_service'
|
49
50
|
require 'azure/armrest/sql/sql_server_service'
|
50
51
|
require 'azure/armrest/sql/sql_database_service'
|
52
|
+
require 'azure/armrest/billing/usage_service'
|
51
53
|
|
52
54
|
# JSON wrapper classes. The service classes should require their own
|
53
55
|
# wrappers from this point on.
|
@@ -5,61 +5,7 @@ module Azure
|
|
5
5
|
module Armrest
|
6
6
|
# Abstract base class for the other service classes.
|
7
7
|
class ArmrestService
|
8
|
-
|
9
|
-
:client_id,
|
10
|
-
:client_key,
|
11
|
-
:tenant_id,
|
12
|
-
:subscription_id,
|
13
|
-
:resource_group,
|
14
|
-
:api_version,
|
15
|
-
:grant_type,
|
16
|
-
:content_type,
|
17
|
-
:accept,
|
18
|
-
:token,
|
19
|
-
:token_expiration, # token expiration local system date
|
20
|
-
:proxy,
|
21
|
-
:ssl_verify,
|
22
|
-
:ssl_version
|
23
|
-
) do
|
24
|
-
@@tokens = Hash.new([])
|
25
|
-
|
26
|
-
def as_cache_key
|
27
|
-
"#{grant_type}_#{tenant_id}_#{client_id}_#{client_key}"
|
28
|
-
end
|
29
|
-
|
30
|
-
def token
|
31
|
-
self[:token], self[:token_expiration] = @@tokens[as_cache_key] if self[:token].nil?
|
32
|
-
|
33
|
-
if self[:token].nil? || Time.now > (self[:token_expiration] || Time.new(0))
|
34
|
-
self[:token], self[:token_expiration] = fetch_token
|
35
|
-
end
|
36
|
-
self[:token]
|
37
|
-
end
|
38
|
-
|
39
|
-
def fetch_token
|
40
|
-
token_url = Azure::Armrest::AUTHORITY + tenant_id + "/oauth2/token"
|
41
|
-
|
42
|
-
response = JSON.parse(
|
43
|
-
ArmrestService.rest_post(
|
44
|
-
:url => token_url,
|
45
|
-
:proxy => proxy,
|
46
|
-
:ssl_version => ssl_version,
|
47
|
-
:ssl_verify => ssl_verify,
|
48
|
-
:payload => {
|
49
|
-
:grant_type => grant_type,
|
50
|
-
:client_id => client_id,
|
51
|
-
:client_secret => client_key,
|
52
|
-
:resource => Azure::Armrest::RESOURCE
|
53
|
-
}
|
54
|
-
)
|
55
|
-
)
|
56
|
-
|
57
|
-
token = 'Bearer ' + response['access_token']
|
58
|
-
@@tokens[as_cache_key] = [token, Time.now + response['expires_in'].to_i]
|
59
|
-
end
|
60
|
-
|
61
|
-
private :fetch_token
|
62
|
-
end
|
8
|
+
extend Gem::Deprecate
|
63
9
|
|
64
10
|
# Configuration to access azure APIs
|
65
11
|
attr_accessor :armrest_configuration
|
@@ -69,161 +15,20 @@ module Azure
|
|
69
15
|
# Base url used for REST calls.
|
70
16
|
attr_accessor :base_url
|
71
17
|
|
72
|
-
#
|
18
|
+
# Provider for service specific API calls
|
73
19
|
attr_accessor :provider
|
74
20
|
|
75
|
-
# The api-version string
|
21
|
+
# The api-version string for this particular service
|
76
22
|
attr_accessor :api_version
|
77
23
|
|
78
|
-
#
|
79
|
-
attr_accessor :proxy
|
80
|
-
|
81
|
-
# The SSL verification method used for each request. The default is VERIFY_PEER.
|
82
|
-
attr_accessor :ssl_verify
|
83
|
-
|
84
|
-
# The SSL version used for each request. The default is TLSv1.
|
85
|
-
attr_accessor :ssl_version
|
86
|
-
|
87
|
-
# Clear class level caches.
|
88
|
-
def self.clear_caches
|
89
|
-
@@providers_hash = {} # Set in constructor
|
90
|
-
@@tokens = {} # token caches
|
91
|
-
@@subscriptions = {} # subscription caches
|
92
|
-
end
|
93
|
-
|
94
|
-
clear_caches
|
95
|
-
|
96
|
-
# Create a configuration object based on input options.
|
97
|
-
# This object can be used to create service objects.
|
98
|
-
#
|
99
|
-
# Possible options are:
|
100
|
-
#
|
101
|
-
# - client_id
|
102
|
-
# - client_key
|
103
|
-
# - tenant_id
|
104
|
-
# - subscription_id
|
105
|
-
# - resource_group
|
106
|
-
# - api_version
|
107
|
-
# - grant_type
|
108
|
-
# - content_type
|
109
|
-
# - accept
|
110
|
-
# - token,
|
111
|
-
# - token_expiration
|
112
|
-
# - proxy
|
113
|
-
# - ssl_verify
|
114
|
-
# - ssl_version
|
115
|
-
#
|
116
|
-
# Of these, you should include a :client_id, :client_key and :tenant_id.
|
117
|
-
# The resource_group can be specified here, but many methods allow you
|
118
|
-
# to specify a resource group if you prefer flexibility.
|
119
|
-
#
|
120
|
-
# If no :subscription_id is provided then this method will attempt to find
|
121
|
-
# a list of associated subscriptions and use the first one it finds as
|
122
|
-
# the default. If no associated subscriptions are found, an ArgumentError
|
123
|
-
# is raised.
|
124
|
-
#
|
125
|
-
# The other options (:grant_type, :content_type, :accept, :token,
|
126
|
-
# :token_expiration and :api_version) should generally NOT be set by you
|
127
|
-
# except in specific circumstances. Setting them explicitly will likely
|
128
|
-
# cause breakage.
|
129
|
-
#
|
130
|
-
# The :token and :token_expiration options must be set in pair. The
|
131
|
-
# :token_expiration should be set in local system time.
|
24
|
+
# Returns a new Armrest::Configuration object.
|
132
25
|
#
|
133
|
-
#
|
134
|
-
# basis within subclasses anyway.
|
135
|
-
#
|
136
|
-
# You may need to associate your application with a subscription using
|
137
|
-
# the new portal or the New-AzureRoleAssignment powershell command.
|
26
|
+
# This method is deprecated, but is provided for backwards compatibility.
|
138
27
|
#
|
139
28
|
def self.configure(options)
|
140
|
-
|
141
|
-
|
142
|
-
options.each do |k,v|
|
143
|
-
configuration[k] = v
|
144
|
-
end
|
145
|
-
|
146
|
-
unless configuration.client_id && configuration.client_key
|
147
|
-
raise ArgumentError, "client_id and client_key must be specified"
|
148
|
-
end
|
149
|
-
|
150
|
-
# Set default values for certain configuration items.
|
151
|
-
configuration.api_version ||= '2015-01-01'
|
152
|
-
configuration.grant_type ||= 'client_credentials'
|
153
|
-
configuration.content_type ||= 'application/json'
|
154
|
-
configuration.accept ||= 'application/json'
|
155
|
-
configuration.proxy ||= ENV['http_proxy']
|
156
|
-
configuration.ssl_version ||= 'TLSv1'
|
157
|
-
|
158
|
-
# Allows for URI objects or Strings.
|
159
|
-
configuration.proxy = configuration.proxy.to_s if configuration.proxy
|
160
|
-
|
161
|
-
# After all other config options have been set, look for default subscription.
|
162
|
-
configuration.subscription_id ||= fetch_subscription_id(configuration)
|
163
|
-
|
164
|
-
configuration
|
165
|
-
end
|
166
|
-
|
167
|
-
# Find the first enabled subscription if one isn't provided or cached.
|
168
|
-
#
|
169
|
-
def self.fetch_subscription_id(config)
|
170
|
-
return @@subscriptions[config.as_cache_key] if @@subscriptions.has_key?(config.as_cache_key)
|
171
|
-
|
172
|
-
url = File.join(Azure::Armrest::RESOURCE, "subscriptions?api-version=#{config.api_version}")
|
173
|
-
|
174
|
-
options = {
|
175
|
-
:url => url,
|
176
|
-
:proxy => config.proxy,
|
177
|
-
:ssl_version => config.ssl_version,
|
178
|
-
:ssl_verify => config.ssl_verify,
|
179
|
-
:headers => {
|
180
|
-
:content_type => config.content_type,
|
181
|
-
:authorization => config.token
|
182
|
-
}
|
183
|
-
}
|
184
|
-
|
185
|
-
response = rest_get(options)
|
186
|
-
array = JSON.parse(response)['value']
|
187
|
-
|
188
|
-
if array.nil? || array.empty?
|
189
|
-
raise ArgumentError, "No associated subscription found"
|
190
|
-
end
|
191
|
-
|
192
|
-
results = []
|
193
|
-
|
194
|
-
# Skip over any invalid subscriptions
|
195
|
-
array.each do |sub_hash|
|
196
|
-
sub_id = sub_hash['subscriptionId']
|
197
|
-
|
198
|
-
# Use tagNames as a test URL
|
199
|
-
test_url = File.join(
|
200
|
-
Azure::Armrest::RESOURCE, 'subscriptions', sub_id,
|
201
|
-
"tagNames?api-version=#{config.api_version}"
|
202
|
-
)
|
203
|
-
|
204
|
-
begin
|
205
|
-
options[:url] = test_url
|
206
|
-
rest_get(options)
|
207
|
-
rescue Azure::Armrest::UnauthorizedException, Azure::Armrest::BadRequestException
|
208
|
-
next
|
209
|
-
else
|
210
|
-
results << sub_hash
|
211
|
-
break if sub_hash['state'] == 'Enabled'
|
212
|
-
end
|
213
|
-
end
|
214
|
-
|
215
|
-
# Look for the first enabled subscription, otherwise just take the first subscription found.
|
216
|
-
hash = results.find { |h| h['state'] == 'Enabled' } || results.first
|
217
|
-
|
218
|
-
id = hash.fetch('subscriptionId')
|
219
|
-
|
220
|
-
warn "Warning: subscription #{id} is not enabled" unless hash['state'] == 'Enabled'
|
221
|
-
|
222
|
-
@@subscriptions[config.as_cache_key] = id
|
29
|
+
Azure::Armrest::Configuration.new(options)
|
223
30
|
end
|
224
31
|
|
225
|
-
private_class_method :fetch_subscription_id
|
226
|
-
|
227
32
|
# Do not instantiate directly. This is an abstract base class from which
|
228
33
|
# all other service classes should subclass, and call super within their
|
229
34
|
# own constructors.
|
@@ -239,23 +44,27 @@ module Azure
|
|
239
44
|
set_service_api_version(options, service_name)
|
240
45
|
end
|
241
46
|
|
242
|
-
# Returns a list of the available resource providers.
|
47
|
+
# Returns a list of the available resource providers. This is really
|
48
|
+
# just a wrapper for Azure::Armrest::Configuration#providers.
|
243
49
|
#
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
50
|
+
delegate :providers, :to => :configuration, :prefix => :list
|
51
|
+
|
52
|
+
alias providers list_providers
|
53
|
+
deprecate :providers, :list_providers, 2018, 1
|
54
|
+
|
55
|
+
# Need an "as_cache_key" method for the cache_method library interface.
|
56
|
+
delegate :hash, :to => :configuration
|
57
|
+
alias as_cache_key hash
|
249
58
|
|
250
59
|
# Returns information about the specific provider +namespace+.
|
251
60
|
#
|
252
|
-
def
|
253
|
-
|
254
|
-
response = rest_get(url)
|
255
|
-
Azure::Armrest::ResourceProvider.new(response)
|
61
|
+
def get_provider(provider)
|
62
|
+
configuration.providers.find { |rp| rp.namespace.casecmp(provider) == 0 }
|
256
63
|
end
|
257
64
|
|
258
|
-
alias geo_locations
|
65
|
+
alias geo_locations get_provider
|
66
|
+
alias provider_info get_provider
|
67
|
+
deprecate :provider_info, :get_provider, 2018, 1
|
259
68
|
|
260
69
|
# Returns a list of all locations for all resource types of the given
|
261
70
|
# +provider+. If you do not specify a provider, then the locations for
|
@@ -266,26 +75,28 @@ module Azure
|
|
266
75
|
#--
|
267
76
|
#
|
268
77
|
def locations(provider = nil)
|
269
|
-
|
78
|
+
list = configuration.providers
|
79
|
+
list = list.select { |rp| rp.namespace.casecmp(provider) == 0 } if provider
|
270
80
|
|
271
|
-
|
272
|
-
provider_data.collect { |_resource, resource_data| resource_data['locations'] }
|
273
|
-
end.flatten.uniq
|
81
|
+
list.collect { |rp| rp.resource_types.map(&:locations) }.flatten.uniq.sort
|
274
82
|
end
|
275
83
|
|
276
|
-
# Returns a list of
|
84
|
+
# Returns a list of Subscription objects for the tenant.
|
277
85
|
#
|
278
|
-
def
|
86
|
+
def list_subscriptions
|
279
87
|
url = url_with_api_version(configuration.api_version, @base_url, 'subscriptions')
|
280
88
|
response = rest_get(url)
|
281
|
-
JSON.parse(response.body)[
|
89
|
+
JSON.parse(response.body)['value'].map { |hash| Azure::Armrest::Subscription.new(hash) }
|
282
90
|
end
|
283
91
|
|
92
|
+
alias subscriptions list_subscriptions
|
93
|
+
deprecate :subscriptions, :list_subscriptions, 2018, 1
|
94
|
+
|
284
95
|
# Return information for the specified subscription ID, or the
|
285
96
|
# subscription ID that was provided in the constructor if none is
|
286
97
|
# specified.
|
287
98
|
#
|
288
|
-
def
|
99
|
+
def get_subscription(subscription_id = configuration.subscription_id)
|
289
100
|
url = url_with_api_version(
|
290
101
|
configuration.api_version,
|
291
102
|
@base_url,
|
@@ -297,53 +108,33 @@ module Azure
|
|
297
108
|
Azure::Armrest::Subscription.new(response.body)
|
298
109
|
end
|
299
110
|
|
300
|
-
|
111
|
+
alias subscription_info get_subscription
|
112
|
+
deprecate :subscription_info, :get_subscription, 2018, 1
|
113
|
+
|
114
|
+
# Returns an array of Resource objects for the current subscription. If a
|
301
115
|
# +resource_group+ is provided, only list resources for that
|
302
116
|
# resource group.
|
303
117
|
#
|
304
|
-
def
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
response = rest_get(url)
|
311
|
-
|
312
|
-
JSON.parse(response)["value"].map{ |hash| Azure::Armrest::Resource.new(hash) }
|
118
|
+
def list_resources(resource_group = nil)
|
119
|
+
if resource_group
|
120
|
+
Azure::Armrest::ResourceService.new(configuration).list(resource_group)
|
121
|
+
else
|
122
|
+
Azure::Armrest::ResourceService.new(configuration).list_all
|
123
|
+
end
|
313
124
|
end
|
314
125
|
|
315
|
-
|
316
|
-
|
317
|
-
def resource_groups
|
318
|
-
url = url_with_api_version(
|
319
|
-
configuration.api_version,
|
320
|
-
@base_url,
|
321
|
-
'subscriptions',
|
322
|
-
configuration.subscription_id,
|
323
|
-
'resourcegroups'
|
324
|
-
)
|
325
|
-
response = rest_get(url)
|
326
|
-
JSON.parse(response)["value"].map{ |hash| Azure::Armrest::ResourceGroup.new(hash) }
|
327
|
-
end
|
126
|
+
alias resources list_resources
|
127
|
+
deprecate :resources, :list_resources, 2018, 1
|
328
128
|
|
329
|
-
# Returns
|
330
|
-
# subscription, or the resource group specified in the constructor if
|
331
|
-
# none is provided.
|
129
|
+
# Returns an array of ResourceGroup objects for the current subscription.
|
332
130
|
#
|
333
|
-
def
|
334
|
-
|
335
|
-
configuration.api_version,
|
336
|
-
@base_url,
|
337
|
-
'subscriptions',
|
338
|
-
configuration.subscription_id,
|
339
|
-
'resourcegroups',
|
340
|
-
resource_group
|
341
|
-
)
|
342
|
-
|
343
|
-
response = rest_get(url)
|
344
|
-
Azure::Armrest::ResourceGroup.new(response.body)
|
131
|
+
def list_resource_groups
|
132
|
+
Azure::Armrest::ResourceGroupService.new(configuration).list
|
345
133
|
end
|
346
134
|
|
135
|
+
alias resource_groups list_resource_groups
|
136
|
+
deprecate :resource_groups, :list_resource_groups, 2018, 1
|
137
|
+
|
347
138
|
# Returns a list of tags for the current subscription.
|
348
139
|
#
|
349
140
|
def tags
|
@@ -366,84 +157,74 @@ module Azure
|
|
366
157
|
JSON.parse(resp.body)['value'].map{ |hash| Azure::Armrest::Tenant.new(hash) }
|
367
158
|
end
|
368
159
|
|
369
|
-
|
370
|
-
|
371
|
-
def self.log
|
372
|
-
file = RestClient.log.instance_variable_get("@target_file")
|
373
|
-
file || RestClient.log
|
374
|
-
end
|
160
|
+
class << self
|
161
|
+
private
|
375
162
|
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
:url => URI.escape(options[:url])
|
386
|
-
)
|
387
|
-
|
388
|
-
RestClient::Request.execute(options)
|
389
|
-
rescue RestClient::Exception => e
|
390
|
-
raise_api_exception(e)
|
391
|
-
end
|
163
|
+
def rest_execute(options, http_method = :get)
|
164
|
+
options = options.merge(
|
165
|
+
:method => http_method,
|
166
|
+
:url => Addressable::URI.escape(options[:url])
|
167
|
+
)
|
168
|
+
RestClient::Request.execute(options)
|
169
|
+
rescue RestClient::Exception => e
|
170
|
+
raise_api_exception(e)
|
171
|
+
end
|
392
172
|
|
393
|
-
|
394
|
-
|
395
|
-
|
173
|
+
def rest_get(options)
|
174
|
+
rest_execute(options, :get)
|
175
|
+
end
|
396
176
|
|
397
|
-
|
398
|
-
|
399
|
-
|
177
|
+
def rest_post(options)
|
178
|
+
rest_execute(options, :post)
|
179
|
+
end
|
400
180
|
|
401
|
-
|
402
|
-
|
403
|
-
|
181
|
+
def rest_patch(options)
|
182
|
+
rest_execute(options, :patch)
|
183
|
+
end
|
404
184
|
|
405
|
-
|
406
|
-
|
407
|
-
|
185
|
+
def rest_delete(options)
|
186
|
+
rest_execute(options, :delete)
|
187
|
+
end
|
408
188
|
|
409
|
-
|
410
|
-
|
411
|
-
|
189
|
+
def rest_put(options)
|
190
|
+
rest_execute(options, :put)
|
191
|
+
end
|
412
192
|
|
413
|
-
|
414
|
-
|
415
|
-
|
193
|
+
def rest_head(options)
|
194
|
+
rest_execute(options, :head)
|
195
|
+
end
|
416
196
|
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
197
|
+
def raise_api_exception(e)
|
198
|
+
begin
|
199
|
+
response = JSON.parse(e.http_body)
|
200
|
+
code = response['error']['code']
|
201
|
+
message = response['error']['message']
|
202
|
+
rescue
|
203
|
+
message = e.http_body
|
204
|
+
end
|
205
|
+
message = e.http_body unless message
|
206
|
+
|
207
|
+
exception_type = case e
|
208
|
+
when RestClient::NotFound
|
209
|
+
ResourceNotFoundException
|
210
|
+
when RestClient::BadRequest
|
211
|
+
BadRequestException
|
212
|
+
when RestClient::GatewayTimeout
|
213
|
+
GatewayTimeoutException
|
214
|
+
when RestClient::BadGateway
|
215
|
+
BadGatewayException
|
216
|
+
when RestClient::Unauthorized, RestClient::Forbidden
|
217
|
+
UnauthorizedException
|
218
|
+
when RestClient::TooManyRequests
|
219
|
+
TooManyRequestsException
|
220
|
+
else
|
221
|
+
ApiException
|
222
|
+
end
|
223
|
+
|
224
|
+
raise exception_type.new(code, message, e)
|
424
225
|
end
|
425
|
-
message = e.http_body unless message
|
426
|
-
|
427
|
-
exception_type = case e
|
428
|
-
when RestClient::NotFound
|
429
|
-
ResourceNotFoundException
|
430
|
-
when RestClient::BadRequest
|
431
|
-
BadRequestException
|
432
|
-
when RestClient::GatewayTimeout
|
433
|
-
GatewayTimeoutException
|
434
|
-
when RestClient::BadGateway
|
435
|
-
BadGatewayException
|
436
|
-
when RestClient::Unauthorized, RestClient::Forbidden
|
437
|
-
UnauthorizedException
|
438
|
-
else
|
439
|
-
ApiException
|
440
|
-
end
|
441
|
-
|
442
|
-
raise exception_type.new(code, message, e)
|
443
226
|
end
|
444
227
|
|
445
|
-
private_class_method :raise_api_exception
|
446
|
-
|
447
228
|
private
|
448
229
|
|
449
230
|
# REST verb methods
|
@@ -463,7 +244,7 @@ module Azure
|
|
463
244
|
|
464
245
|
options[:payload] = body if body
|
465
246
|
|
466
|
-
self.class.rest_execute
|
247
|
+
self.class.send(:rest_execute, options, http_method)
|
467
248
|
end
|
468
249
|
|
469
250
|
def rest_get(url)
|
@@ -495,35 +276,6 @@ module Azure
|
|
495
276
|
File.join(*paths) << "?api-version=#{api_version}"
|
496
277
|
end
|
497
278
|
|
498
|
-
# Build a one-time lookup table for each provider & resource. This
|
499
|
-
# lets subclasses set api-version strings properly for each method
|
500
|
-
# depending on whichever provider they're using.
|
501
|
-
#
|
502
|
-
# e.g. @@providers_hash['Microsoft.Compute']['virtualMachines']['api_version']
|
503
|
-
#
|
504
|
-
# Note that for methods that don't depend on a resource type should use
|
505
|
-
# armrest_configuration.api_version instead or set it explicitly as needed.
|
506
|
-
#
|
507
|
-
def set_providers_info
|
508
|
-
return unless @@providers_hash.empty?
|
509
|
-
|
510
|
-
providers.each do |info|
|
511
|
-
provider_info = {}
|
512
|
-
info.resource_types.each do |resource|
|
513
|
-
provider_info[resource.resource_type.downcase] = {
|
514
|
-
'api_version' => resource.api_versions.reject{ |version|
|
515
|
-
version =~ /preview/i || Time.parse(version) > Time.now
|
516
|
-
}.first,
|
517
|
-
'locations' => resource.locations - [''] # Ignore empty elements
|
518
|
-
}
|
519
|
-
end
|
520
|
-
# TODO: how does base model handle method naming collision?
|
521
|
-
# rename or access through hash?
|
522
|
-
# namespace is a method introduced by more_core_extensions
|
523
|
-
@@providers_hash[info['namespace'].downcase] = provider_info
|
524
|
-
end
|
525
|
-
end
|
526
|
-
|
527
279
|
# Each Azure API call may require different api_version.
|
528
280
|
# The api_version in armrest_configuration is used for common methods provided
|
529
281
|
# by ArmrestService
|
@@ -532,20 +284,15 @@ module Azure
|
|
532
284
|
# api_version => version
|
533
285
|
# This version will be used for the service specific API calls
|
534
286
|
#
|
535
|
-
# Otherwise the service specific api_version is looked up from
|
287
|
+
# Otherwise the service specific api_version is looked up from configuration.providers
|
536
288
|
#
|
537
289
|
# Finally api_version in armrest_configuration is used if service specific version
|
538
290
|
# cannot be determined
|
539
291
|
def set_service_api_version(options, service)
|
540
|
-
set_providers_info
|
541
292
|
@api_version =
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
@@providers_hash[provider.downcase][service.downcase]['api_version']
|
546
|
-
else
|
547
|
-
configuration.api_version
|
548
|
-
end
|
293
|
+
options['api_version'] ||
|
294
|
+
configuration.provider_default_api_version(provider, service) ||
|
295
|
+
configuration.api_version
|
549
296
|
end
|
550
297
|
|
551
298
|
# Parse the skip token value out of the nextLink attribute from a response.
|