azure-armrest 0.2.10 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|