azure-armrest 0.0.3 → 0.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 62a4984d7d387a029f6e37b0b3fb34e3ef2cb66b
4
- data.tar.gz: 7f7d881116fe76082ed7ca21352117796bc01516
3
+ metadata.gz: 90de5f291ba5efea0f715c848e05dcaecf52110d
4
+ data.tar.gz: c30be8f74ef00dfe99f069eac51bbed61644ff00
5
5
  SHA512:
6
- metadata.gz: 9e208bb91e488aa4d1718c926c269ad1535845bacf50e7207fc9503ef6d704e314de34cf75077cab0c90a34f1eacc5fca10b5efac3fdc9f8952c6e1e1bd8161e
7
- data.tar.gz: df333ea565a2e3a0d06cfe98cfd6f2948fc412bcbd3607201cedaaed838422e8c998e1a825e7a959c9cacbb33f6b4cf367e846d11bdb266db345c2abd762f7d9
6
+ metadata.gz: b1e1f5f15e417fe74e275bad5ca0becd7b762022bcab8eb5ad526c9cb6776760ee7d32fdc72cd6c6dbee9c11ff1c8a6dfab28c57e719db9ed97c70fb3b245646
7
+ data.tar.gz: 9cabb2b1274e5ff5474675cd18cb7ee959cd0508719bf553dd7944b498f3fb9eddc36728cab8b9ce7e7fe7f6349d6f281d331f263b20e33a72638299ed1956b9
data/CHANGES CHANGED
@@ -1,3 +1,22 @@
1
+ = 0.0.4 - 19-Oct-2015
2
+ * All get/list/list_all methods now return wrapper class instances, e.g.
3
+ a call to VirtualMachineService#get will return a VirtualMachine instance.
4
+ These provide a nice OpenStruct wrapper so you can use methods instead
5
+ of hash references if desired.
6
+ * A custom StorageAccount class was added that implements methods for
7
+ gathering blob information.
8
+ * Most service classes now inherit from ResourceGroupBasedService, which
9
+ provides a common set of methods typically used for various services.
10
+ * Now re-raises RestClient exceptions as exceptions that we have defined.
11
+ * The VirtualMachineImage class was overhauled and is now working properly.
12
+ * The azure-signature, nokogiri and activesupport dependencies were added.
13
+
14
+ = 0.0.3 - 13-Oct-2015
15
+ * Bug fixes for VirtualMachineImageService class.
16
+ * Reorganized and updated SubnetService class.
17
+ * Some updates to the BaseModel in prep for JSON wrapper classes.
18
+ * Added NetworkSecurityGroupService and IpAddressService classes.
19
+
1
20
  = 0.0.2 - 23-Sep-2015
2
21
  * Revamped class names. Now use "Service" instead of "Manager".
3
22
  * Several new service classes added, updated, and refactored.
@@ -20,12 +20,15 @@ behind the scenes.
20
20
  EOF
21
21
 
22
22
  spec.add_dependency 'json'
23
- spec.add_dependency 'rest-client'
24
- spec.add_dependency 'cache_method', "~> 0.2.7"
23
+ spec.add_dependency 'rest-client', '=2.0.0.rc1'
24
+ spec.add_dependency 'cache_method', '~> 0.2.7'
25
+ spec.add_dependency 'azure-signature', '~> 0.2.0'
26
+ spec.add_dependency 'activesupport', '>= 1.2.0'
27
+ spec.add_dependency 'nokogiri', '~> 1.6.0'
25
28
 
26
- spec.add_development_dependency "bundler"
27
- spec.add_development_dependency "rake"
28
- spec.add_development_dependency "rspec", "~> 3.0"
29
- spec.add_development_dependency "codeclimate-test-reporter"
30
- spec.add_development_dependency "timecop", "~> 0.7"
29
+ spec.add_development_dependency 'bundler'
30
+ spec.add_development_dependency 'rake'
31
+ spec.add_development_dependency 'rspec', '~> 3.0'
32
+ spec.add_development_dependency 'codeclimate-test-reporter'
33
+ spec.add_development_dependency 'timecop', '~> 0.7'
31
34
  end
@@ -18,11 +18,12 @@ module Azure
18
18
  # A common URI for all subclasses
19
19
  COMMON_URI = RESOURCE + "subscriptions/"
20
20
  end
21
-
22
21
  end
23
22
 
24
23
  require 'azure/armrest/version'
24
+ require 'azure/armrest/exception'
25
25
  require 'azure/armrest/armrest_service'
26
+ require 'azure/armrest/resource_group_based_service'
26
27
  require 'azure/armrest/storage_account_service'
27
28
  require 'azure/armrest/availability_set_service'
28
29
  require 'azure/armrest/virtual_machine_service'
@@ -35,7 +35,7 @@ module Azure
35
35
  def fetch_token
36
36
  token_url = Azure::Armrest::AUTHORITY + tenant_id + "/oauth2/token"
37
37
 
38
- response = JSON.parse(RestClient.post(
38
+ response = JSON.parse(ArmrestService.rest_post(
39
39
  token_url,
40
40
  :grant_type => grant_type,
41
41
  :client_id => client_id,
@@ -123,7 +123,7 @@ module Azure
123
123
 
124
124
  url = File.join(Azure::Armrest::RESOURCE, "subscriptions?api-version=#{config.api_version}")
125
125
 
126
- response = RestClient.get(
126
+ response = rest_get(
127
127
  url,
128
128
  :content_type => config.content_type,
129
129
  :authorization => config.token
@@ -157,7 +157,7 @@ module Azure
157
157
  def providers
158
158
  url = url_with_api_version(armrest_configuration.api_version, @base_url, 'providers')
159
159
  resp = rest_get(url)
160
- JSON.parse(resp.body)["value"]
160
+ JSON.parse(resp.body)["value"].map{ |hash| Azure::Armrest::ResourceProvider.new(hash) }
161
161
  end
162
162
 
163
163
  # Returns information about the specific provider +namespace+.
@@ -165,7 +165,7 @@ module Azure
165
165
  def provider_info(provider)
166
166
  url = url_with_api_version(armrest_configuration.api_version, @base_url, 'providers', provider)
167
167
  response = rest_get(url)
168
- JSON.parse(response.body)
168
+ Azure::Armrest::ResourceProvider.new(response)
169
169
  end
170
170
 
171
171
  alias geo_locations provider_info
@@ -190,8 +190,8 @@ module Azure
190
190
  #
191
191
  def subscriptions
192
192
  url = url_with_api_version(armrest_configuration.api_version, @base_url, 'subscriptions')
193
- resp = rest_get(url)
194
- JSON.parse(resp.body)["value"]
193
+ response = rest_get(url)
194
+ JSON.parse(response.body)["value"].map{ |hash| Azure::Armrest::Subscription.new(hash) }
195
195
  end
196
196
 
197
197
  # Return information for the specified subscription ID, or the
@@ -206,8 +206,8 @@ module Azure
206
206
  armrest_configuration.subscription_id
207
207
  )
208
208
 
209
- resp = rest_get(url)
210
- JSON.parse(resp.body)
209
+ response = rest_get(url)
210
+ Azure::Armrest::Subscription.new(response.body)
211
211
  end
212
212
 
213
213
  # Returns a list of resources for the current subscription. If a
@@ -222,7 +222,7 @@ module Azure
222
222
  url = url_with_api_version(armrest_configuration.api_version, url_comps)
223
223
  response = rest_get(url)
224
224
 
225
- JSON.parse(response.body)["value"]
225
+ JSON.parse(response)["value"].map{ |hash| Azure::Armrest::Resource.new(hash) }
226
226
  end
227
227
 
228
228
  # Returns a list of resource groups for the current subscription.
@@ -236,14 +236,14 @@ module Azure
236
236
  'resourcegroups'
237
237
  )
238
238
  response = rest_get(url)
239
- JSON.parse(response.body)["value"]
239
+ JSON.parse(response)["value"].map{ |hash| Azure::Armrest::ResourceGroup.new(hash) }
240
240
  end
241
241
 
242
242
  # Returns information on the specified +resource_group+ for the current
243
243
  # subscription, or the resource group specified in the constructor if
244
244
  # none is provided.
245
245
  #
246
- def resource_group_info(resource_group)
246
+ def resource_group_info(resource_group = armrest_configuration.resource_group)
247
247
  url = url_with_api_version(
248
248
  armrest_configuration.api_version,
249
249
  @base_url,
@@ -253,8 +253,8 @@ module Azure
253
253
  resource_group
254
254
  )
255
255
 
256
- resp = rest_get(url)
257
- JSON.parse(resp.body)
256
+ response = rest_get(url)
257
+ Azure::Armrest::ResourceGroup.new(response.body)
258
258
  end
259
259
 
260
260
  # Returns a list of tags for the current subscription.
@@ -268,7 +268,7 @@ module Azure
268
268
  'tagNames'
269
269
  )
270
270
  resp = rest_get(url)
271
- JSON.parse(resp.body)["value"]
271
+ JSON.parse(resp.body)["value"].map{ |hash| Azure::Armrest::Tag.new(hash) }
272
272
  end
273
273
 
274
274
  # Returns a list of tenants that can be accessed.
@@ -276,15 +276,74 @@ module Azure
276
276
  def tenants
277
277
  url = url_with_api_version(armrest_configuration.api_version, @base_url, 'tenants')
278
278
  resp = rest_get(url)
279
- JSON.parse(resp.body)
279
+ JSON.parse(resp.body)['value'].map{ |hash| Azure::Armrest::Tenant.new(hash) }
280
+ end
281
+
282
+ def self.rest_get(url, headers = {})
283
+ RestClient.get(url, headers)
284
+ rescue RestClient::Exception => e
285
+ raise_api_exception(e)
286
+ end
287
+
288
+ def self.rest_post(url, body, headers = {})
289
+ RestClient.post(url, body, headers)
290
+ rescue RestClient::Exception => e
291
+ raise_api_exception(e)
292
+ end
293
+
294
+ def self.rest_patch(url, body, headers = {})
295
+ RestClient.patch(url, body, headers)
296
+ rescue RestClient::Exception => e
297
+ raise_api_exception(e)
298
+ end
299
+
300
+ def self.rest_delete(url, headers = {})
301
+ RestClient.delete(url, headers)
302
+ rescue RestClient::Exception => e
303
+ raise_api_exception(e)
304
+ end
305
+
306
+ def self.rest_put(url, body, headers = {})
307
+ RestClient.put(url, body, headers)
308
+ rescue RestClient::Exception => e
309
+ raise_api_exception(e)
310
+ end
311
+
312
+ def self.raise_api_exception(e)
313
+ begin
314
+ response = JSON.parse(e.http_body)
315
+ code = response.fetch_path('error', 'code')
316
+ message = response.fetch_path('error', 'message')
317
+ rescue
318
+ message = e.http_body
319
+ end
320
+ message = e.http_body unless message
321
+
322
+ exception_type = case e
323
+ when RestClient::NotFound
324
+ ResourceNotFoundException
325
+ when RestClient::BadRequest
326
+ BadRequestException
327
+ when RestClient::GatewayTimeout
328
+ GatewayTimeoutException
329
+ when RestClient::BadGateway
330
+ BadGatewayException
331
+ when RestClient::Unauthorized
332
+ UnauthorizedException
333
+ else
334
+ ApiException
335
+ end
336
+
337
+ raise exception_type.new(code, message, e)
280
338
  end
339
+ private_class_method :raise_api_exception
281
340
 
282
341
  private
283
342
 
284
343
  # REST verb methods
285
344
 
286
345
  def rest_get(url)
287
- RestClient.get(
346
+ self.class.rest_get(
288
347
  url,
289
348
  :accept => armrest_configuration.accept,
290
349
  :content_type => armrest_configuration.content_type,
@@ -293,7 +352,7 @@ module Azure
293
352
  end
294
353
 
295
354
  def rest_put(url, body = '')
296
- RestClient.put(
355
+ self.class.rest_put(
297
356
  url,
298
357
  body,
299
358
  :accept => armrest_configuration.accept,
@@ -303,7 +362,7 @@ module Azure
303
362
  end
304
363
 
305
364
  def rest_post(url, body = '')
306
- RestClient.post(
365
+ self.class.rest_post(
307
366
  url,
308
367
  body,
309
368
  :accept => armrest_configuration.accept,
@@ -313,7 +372,7 @@ module Azure
313
372
  end
314
373
 
315
374
  def rest_patch(url, body = '')
316
- RestClient.patch(
375
+ self.class.rest_patch(
317
376
  url,
318
377
  body,
319
378
  :accept => armrest_configuration.accept,
@@ -323,7 +382,7 @@ module Azure
323
382
  end
324
383
 
325
384
  def rest_delete(url)
326
- RestClient.delete(
385
+ self.class.rest_delete(
327
386
  url,
328
387
  :accept => armrest_configuration.accept,
329
388
  :content_type => armrest_configuration.content_type,
@@ -350,13 +409,13 @@ module Azure
350
409
 
351
410
  providers.each do |info|
352
411
  provider_info = {}
353
- info['resourceTypes'].each do |resource|
354
- provider_info[resource['resourceType']] = {
355
- 'api_version' => resource['apiVersions'].first,
356
- 'locations' => resource['locations'] - [''] # Ignore empty elements
412
+ info.resource_types.each do |resource|
413
+ provider_info[resource.resource_type] = {
414
+ 'api_version' => resource.api_versions.first,
415
+ 'locations' => resource.locations - [''] # Ignore empty elements
357
416
  }
358
417
  end
359
- @@providers_hash[info['namespace'].downcase] = provider_info
418
+ @@providers_hash[info.namespace.downcase] = provider_info
360
419
  end
361
420
  end
362
421
 
@@ -3,97 +3,21 @@ module Azure
3
3
  # Armrest namespace
4
4
  module Armrest
5
5
  # Base class for managing availability sets.
6
- class AvailabilitySetService < ArmrestService
7
- # The provider used in requests when gathering ASM information.
6
+ class AvailabilitySetService < ResourceGroupBasedService
7
+ # The provider used in requests when gathering AvailabilitySet information.
8
8
  attr_reader :provider
9
9
 
10
- # Create and return a new AvailabilitySetService (ASM) instance.
10
+ # Create and return a new AvailabilitySetService instance.
11
11
  #
12
12
  def initialize(_armrest_configuration, options = {})
13
13
  super
14
-
15
14
  @provider = options[:provider] || 'Microsoft.Compute'
16
-
17
15
  set_service_api_version(options, 'availabilitySets')
16
+ @service_name = 'availabilitySets'
18
17
  end
19
18
 
20
- # Creates a new availability set with the given name. The optional +tags+
21
- # argument should be a hash, if provided.
22
- #
23
- def create(name, location, tags = nil, resource_group = armrest_configuration.resource_group)
24
- raise ArgumentError, "No resource group specified" if resource_group.nil?
25
-
26
- url = build_url(resource_group, name)
27
- body = {:name => name, :location => location, :tags => tags}.to_json
28
- response = rest_put(url, body)
29
- response.return!
30
- end
31
-
32
- alias update create
33
-
34
- # Deletes the +name+ availability set.
35
- #
36
- def delete(name, resource_group = armrest_configuration.resource_group)
37
- raise ArgumentError, "No resource group specified" if resource_group.nil?
38
- url = build_url(resource_group, name)
39
- response = rest_delete(url)
40
- response.return!
41
- end
42
-
43
- # Retrieves the options of an availability set +name+.
44
- #
45
- def get(name, resource_group = armrest_configuration.resource_group)
46
- raise ArgumentError, "No resource group specified" if resource_group.nil?
47
- url = build_url(resource_group, name)
48
- response = rest_get(url)
49
- JSON.parse(response.body)
50
- end
51
-
52
- # List availability sets.
53
- #
54
- def list(resource_group = armrest_configuration.resource_group)
55
- array = []
56
-
57
- if resource_group
58
- url = build_url(resource_group)
59
- response = rest_get(url)
60
- array << JSON.parse(response.body)['value']
61
- else
62
- threads = []
63
- mutex = Mutex.new
64
-
65
- resource_groups.each do |group|
66
- url = build_url(group['name'])
67
-
68
- threads << Thread.new(url) do |thread_url|
69
- response = rest_get(thread_url)
70
- result = JSON.parse(response)['value']
71
- mutex.synchronize{ array << result if result }
72
- end
73
- end
74
-
75
- threads.each(&:join)
76
- end
77
-
78
- array.flatten
79
- end
80
-
81
- # Builds a URL based on subscription_id an resource_group and any other
82
- # arguments provided, and appends it with the api_version.
83
- #
84
- def build_url(resource_group, *args)
85
- url = File.join(
86
- Azure::Armrest::COMMON_URI,
87
- armrest_configuration.subscription_id,
88
- 'resourceGroups',
89
- resource_group,
90
- 'providers',
91
- @provider,
92
- 'availabilitySets',
93
- )
94
-
95
- url = File.join(url, *args) unless args.empty?
96
- url << "?api-version=#{@api_version}"
19
+ def list_all
20
+ list_in_all_groups
97
21
  end
98
22
  end # AvailabilitySetService
99
23
  end # Armrest
@@ -0,0 +1,45 @@
1
+ module Azure
2
+ module Armrest
3
+ class Exception < StandardError
4
+ attr_accessor :cause
5
+ attr_writer :message
6
+
7
+ def initialize(message = nil, cause_exception = nil)
8
+ @message = message
9
+ @cause = cause_exception
10
+ end
11
+
12
+ def to_s
13
+ message
14
+ end
15
+
16
+ def message
17
+ @message || self.class.name
18
+ end
19
+ end
20
+
21
+ class ApiException < Exception
22
+ attr_accessor :code
23
+
24
+ def initialize(code, message, cause_exception)
25
+ @code = code
26
+ super(message, cause_exception)
27
+ end
28
+
29
+ def to_s
30
+ "[#{code}] #{message}"
31
+ end
32
+ end
33
+
34
+ class ResourceNotFoundException < ApiException; end
35
+
36
+ class BadRequestException < ApiException; end
37
+
38
+ class UnauthorizedException < ApiException; end
39
+
40
+ class BadGatewayException < ApiException; end
41
+
42
+ class GatewayTimeoutException < ApiException; end
43
+
44
+ end
45
+ end