azure-armrest 0.2.5 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 12001d2bb2d38d314b1e9ea8833922a7dfb97882
4
- data.tar.gz: b7a5853e8526cba1d68cf887b6d5451481e569e3
3
+ metadata.gz: 5bc812c499cfa7408aec0074256c17473d845988
4
+ data.tar.gz: d54a716667c8d7c50f28275d6652cf3c61998305
5
5
  SHA512:
6
- metadata.gz: 6213f8ef74444dbc11624c66b2e32dfd8168ed10cc240e50ae7ff4e5119ca2898a498ce385503ba84581c88945ba056709ad3013f7911e3f65276be1bf732945
7
- data.tar.gz: 0556e41d57f3d396621a080f9d7381267aa21ade4adaf92d1214ba4b02812350b452a9a61d37a769c52a3632776a0bd0fdf0e4fdd3f727738c6c03991f55b60e
6
+ metadata.gz: bc3934aab613328f0c07f3dfa0851b4e8c4ba2b86f10cc282171557dce558d4f9931359e7eb9214b07c8fc414885b985afea68249e004b660aeab133dfc3325b
7
+ data.tar.gz: eb767973f551518150186ed4ba42e38f4e6a752ed80f69319c0060e61a28f5e3834c029e1b93b5ee0bda7bd2f09db3d1f4c0ac6c5dbfd3842d76f1f976def50a
data/CHANGES CHANGED
@@ -1,3 +1,14 @@
1
+ = 0.2.6 - 9-May-2016
2
+ * If no subscription is provided, the internal method for fetching a default
3
+ subscription ID will now skip over tenant/subscription mismatches.
4
+ * Removed the hard-coded api-version string for both TemplateDeploymentService
5
+ and StorageAccountService.
6
+ * Because there was an underlying REST API change for storage account keys for
7
+ api-version strings set at 2016-01-01 or later, the list_account_key_objects
8
+ and regenerate_account_key_objects methods were added. These return model
9
+ objects instead of plain hashes. The list_account_keys and regenerate_account_keys
10
+ methods still behave as before.
11
+
1
12
  = 0.2.5 - 11-Apr-2016
2
13
  * Fixed a bug in the custom exception handler where the error code and
3
14
  message were not set properly.
@@ -171,25 +171,49 @@ module Azure
171
171
 
172
172
  url = File.join(Azure::Armrest::RESOURCE, "subscriptions?api-version=#{config.api_version}")
173
173
 
174
- response = rest_get(
174
+ options = {
175
175
  :url => url,
176
176
  :proxy => config.proxy,
177
177
  :ssl_version => config.ssl_version,
178
178
  :ssl_verify => config.ssl_verify,
179
- :headers => {
179
+ :headers => {
180
180
  :content_type => config.content_type,
181
181
  :authorization => config.token
182
182
  }
183
- )
183
+ }
184
184
 
185
- array = JSON.parse(response)["value"]
185
+ response = rest_get(options)
186
+ array = JSON.parse(response)['value']
186
187
 
187
188
  if array.nil? || array.empty?
188
189
  raise ArgumentError, "No associated subscription found"
189
190
  end
190
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
+
191
215
  # Look for the first enabled subscription, otherwise just take the first subscription found.
192
- hash = array.find{ |h| h['state'] == 'Enabled' } || array.first
216
+ hash = results.find { |h| h['state'] == 'Enabled' } || results.first
193
217
 
194
218
  id = hash.fetch('subscriptionId')
195
219
 
@@ -412,6 +436,7 @@ module Azure
412
436
 
413
437
  raise exception_type.new(code, message, e)
414
438
  end
439
+
415
440
  private_class_method :raise_api_exception
416
441
 
417
442
  private
@@ -173,7 +173,14 @@ module Azure
173
173
  class ResourceGroup < BaseModel; end
174
174
  class ResourceProvider < BaseModel; end
175
175
  class Sku < BaseModel; end
176
+
176
177
  class StorageAccount < BaseModel; end
178
+ class StorageAccountKey < StorageAccount
179
+ def key1; key_name == 'key1' ? value : nil; end
180
+ def key2; key_name == 'key2' ? value : nil; end
181
+ def key; key1 || key2; end
182
+ end
183
+
177
184
  class Subscription < BaseModel; end
178
185
  class Tag < BaseModel; end
179
186
  class TemplateDeployment < BaseModel
@@ -16,7 +16,6 @@ module Azure
16
16
  # Creates and returns a new StorageAccountService (SAS) instance.
17
17
  #
18
18
  def initialize(configuration, options = {})
19
- options = {'api_version' => '2015-05-01-preview'}.merge(options) # Must hard code for now
20
19
  super(configuration, 'storageAccounts', 'Microsoft.Storage', options)
21
20
  end
22
21
 
@@ -108,33 +107,85 @@ module Azure
108
107
  acct
109
108
  end
110
109
 
111
- # Returns the primary and secondary access keys for the given
112
- # storage account as a hash.
110
+ # Returns the primary and secondary access keys for the given storage
111
+ # account. This method will return a hash with 'key1' and 'key2' as its
112
+ # keys.
113
+ #
114
+ # If you want a list of StorageAccountKey objects, then use the
115
+ # list_account_key_objects method instead.
113
116
  #
114
117
  def list_account_keys(account_name, group = configuration.resource_group)
115
118
  validate_resource_group(group)
116
119
 
117
120
  url = build_url(group, account_name, 'listKeys')
118
121
  response = rest_post(url)
119
- JSON.parse(response)
122
+ hash = JSON.parse(response.body)
123
+
124
+ parse_account_keys_from_hash(hash)
125
+ end
126
+
127
+ alias list_storage_account_keys list_account_keys
128
+
129
+ # Returns a list of StorageAccountKey objects consisting of information
130
+ # the primary and secondary keys. This method requires an api-version
131
+ # string of 2016-01-01 or later, or an error is raised.
132
+ #
133
+ # If you want a plain hash, use the list_account_keys method instead.
134
+ #
135
+ def list_account_key_objects(account_name, group = configuration.resource_group)
136
+ validate_resource_group(group)
137
+
138
+ unless recent_api_version?
139
+ raise ArgumentError, "unsupported api-version string '#{api_version}'"
140
+ end
141
+
142
+ url = build_url(group, account_name, 'listKeys')
143
+ response = rest_post(url)
144
+ JSON.parse(response.body)['keys'].map { |hash| StorageAccountKey.new(hash) }
145
+ end
146
+
147
+ alias list_storage_account_key_objects list_account_key_objects
148
+
149
+ # Regenerates the primary or secondary access keys for the given storage
150
+ # account. The +key_name+ may be either 'key1' or 'key2'. If no key name
151
+ # is provided, then it defaults to 'key1'.
152
+ #
153
+ def regenerate_account_keys(account_name, group = configuration.resource_group, key_name = 'key1')
154
+ validate_resource_group(group)
155
+
156
+ options = {'keyName' => key_name}
157
+
158
+ url = build_url(group, account_name, 'regenerateKey')
159
+ response = rest_post(url, options.to_json)
160
+ hash = JSON.parse(response.body)
161
+
162
+ parse_account_keys_from_hash(hash)
120
163
  end
121
164
 
122
- # Regenerates the primary and secondary access keys for the given
123
- # storage account.
165
+ alias regenerate_storage_account_keys regenerate_account_keys
166
+
167
+ # Same as regenerate_account_keys, but returns an array of
168
+ # StorageAccountKey objects instead.
124
169
  #
125
- # options have only one key with two possible values:
126
- # {
127
- # "keyName": "key1|key2"
128
- # }
170
+ # This method requires an api-version string of 2016-01-01 or later
171
+ # or an ArgumentError is raised.
129
172
  #
130
- def regenerate_storage_account_keys(account_name, group = configuration.resource_group, options = {})
173
+ def regenerate_account_key_objects(account_name, group = configuration.resource_group, key_name = 'key1')
131
174
  validate_resource_group(group)
132
175
 
176
+ unless recent_api_version?
177
+ raise ArgumentError, "unsupported api-version string '#{api_version}'"
178
+ end
179
+
180
+ options = {'keyName' => key_name}
181
+
133
182
  url = build_url(group, account_name, 'regenerateKey')
134
183
  response = rest_post(url, options.to_json)
135
- JSON.parse(response)
184
+ JSON.parse(response.body)['keys'].map { |hash| StorageAccountKey.new(hash) }
136
185
  end
137
186
 
187
+ alias regenerate_storage_account_key_objects regenerate_account_key_objects
188
+
138
189
  # Returns a list of images that are available for provisioning for all
139
190
  # storage accounts in the provided resource group. The custom keys
140
191
  # :uri and :operating_system have been added for convenience.
@@ -146,7 +197,11 @@ module Azure
146
197
 
147
198
  list(group).each do |lstorage_account|
148
199
  threads << Thread.new(lstorage_account) do |storage_account|
149
- key = list_account_keys(storage_account.name, group).fetch('key1')
200
+ if recent_api_version?
201
+ key = list_account_key_objects(storage_account.name, group).first.key
202
+ else
203
+ key = list_account_keys(storage_account.name, group).fetch('key1')
204
+ end
150
205
 
151
206
  storage_account.all_blobs(key).each do |blob|
152
207
  next unless File.extname(blob.name).downcase == '.vhd'
@@ -212,6 +267,24 @@ module Azure
212
267
 
213
268
  private
214
269
 
270
+ # Check to see if the api-version string is 2016-01-01 or later.
271
+ def recent_api_version?
272
+ Time.parse(api_version).utc >= Time.parse('2016-01-01').utc
273
+ end
274
+
275
+ # As of api-version 2016-01-01, the format returned for listing and
276
+ # regenerating hash keys has changed.
277
+ #
278
+ def parse_account_keys_from_hash(hash)
279
+ if recent_api_version?
280
+ key1 = hash['keys'].find { |h| h['keyName'] == 'key1' }['value']
281
+ key2 = hash['keys'].find { |h| h['keyName'] == 'key2' }['value']
282
+ hash = {'key1' => key1, 'key2' => key2}
283
+ end
284
+
285
+ hash
286
+ end
287
+
215
288
  def validate_account_type(account_type)
216
289
  unless VALID_ACCOUNT_TYPES.include?(account_type)
217
290
  raise ArgumentError, "invalid account type '#{account_type}'"
@@ -4,8 +4,6 @@ module Azure
4
4
  class TemplateDeploymentService < ResourceGroupBasedService
5
5
 
6
6
  def initialize(configuration, options = {})
7
- # Has to be hard coded for now
8
- options = {'api_version' => '2014-04-01-preview'}.merge(options)
9
7
  super(configuration, 'deployments', 'Microsoft.Resources', options)
10
8
  end
11
9
 
@@ -1,5 +1,5 @@
1
1
  module Azure
2
2
  module Armrest
3
- VERSION = '0.2.5'
3
+ VERSION = '0.2.6'
4
4
  end
5
5
  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.2.5
4
+ version: 0.2.6
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-04-12 00:00:00.000000000 Z
14
+ date: 2016-05-09 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: json
@@ -241,7 +241,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
241
241
  version: '0'
242
242
  requirements: []
243
243
  rubyforge_project:
244
- rubygems_version: 2.5.1
244
+ rubygems_version: 2.6.4
245
245
  signing_key:
246
246
  specification_version: 4
247
247
  summary: An interface for ARM/JSON Azure REST API