azure 0.6.2 → 0.6.3

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: 2218a9a37d85a587e477daa5f91d8c06d0eb3f59
4
- data.tar.gz: 39efa8b58227090e87058d9aa4765251d423f4ce
3
+ metadata.gz: 184071aad7a3c42ae4096da3d27aaadf01f5dd42
4
+ data.tar.gz: 2b8f026ba119dda6324cbaeb1c0c0857dade93b8
5
5
  SHA512:
6
- metadata.gz: a47b93b9e6e87ea04bc0458569e16d3b75046f8a3ce178c4d0914078f94d4b78d4ffd3ac124c8870033f09cf2d6932fec147ed739d43f1fb71e8cb72620a32ca
7
- data.tar.gz: f15f40f69a33d35902b0f585c1de2a405a7468b7c21befe2b0902d0d61da233923c8bb417b4d0212e8ddab87937a9607c32d13220e2316e9d492df2d2a314c40
6
+ metadata.gz: d73a29abe2a26c39630977cce42d940cc1d15b9c12eeb87aeb8cf880427691e5952e85798ad47488b0ccd8f36c8f41648bc40febe0ea32506ba78b739cd47d68
7
+ data.tar.gz: ed70f72f78035c46141b33d56a7b1611fd610e8c1a2eab44c944c11d78c4062006e8b8915f425c007e48402b4bdfb78c77093c8bdf7dc30979c3916a6f85d9b4
@@ -1,3 +1,10 @@
1
+ 2014.03.28 - version 0.6.3
2
+ * Added get_cloud_service_properties method, which returns all cloud service properties (embed-detail=true), including info about all VMs
3
+ * Added winrm_http_port and winrm_https_port to get_virtual_machine method to allow the users to configure custom ports for winrm-http and winrm-https
4
+ * Checks if any ports are in use before adding a role in the existing cloud service
5
+ * Auto generate public port for add role.
6
+ * Fix issue https://github.com/WindowsAzure/azure-sdk-for-ruby/issues/130
7
+
1
8
  2014.03.15 - version 0.6.2
2
9
  * Restart Virtual Machine
3
10
  * Add disk to Virtual Machine
@@ -32,7 +32,7 @@ module Azure
32
32
  attr_accessor :date_modified
33
33
  attr_accessor :extended_properties
34
34
  attr_accessor :default_winrm_certificate_thumbprint
35
-
35
+ attr_accessor :virtual_machines
36
36
  end
37
37
  end
38
38
  end
@@ -91,6 +91,13 @@ module Azure
91
91
  flag
92
92
  end
93
93
 
94
+ def get_cloud_service_properties(name)
95
+ request_path = "/services/hostedservices/#{name}?embed-detail=true"
96
+ request = ManagementHttpRequest.new(:get, request_path)
97
+ response = request.call
98
+ Serialization.cloud_services_from_xml(response)
99
+ end
100
+
94
101
  # Public: Deletes the specified cloud service of given subscription id from Windows Azure.
95
102
  #
96
103
  # ==== Attributes
@@ -14,6 +14,7 @@
14
14
  #--------------------------------------------------------------------------
15
15
  require 'base64'
16
16
  require 'azure/cloud_service_management/cloud_service'
17
+ require 'azure/virtual_machine_management/serialization'
17
18
 
18
19
  module Azure
19
20
  module CloudServiceManagement
@@ -54,6 +55,8 @@ module Azure
54
55
  def self.cloud_services_from_xml(cloud_xml)
55
56
  clouds = []
56
57
  cloud_services_xml = cloud_xml.css('HostedServices HostedService')
58
+ cloud_services_xml = cloud_xml.css('HostedService') if \
59
+ cloud_services_xml.length == 0
57
60
  cloud_services_xml.each do |cloud_service_xml|
58
61
  cloud = CloudService.new
59
62
  cloud.url = xml_content(cloud_service_xml, 'Url')
@@ -80,6 +83,18 @@ module Azure
80
83
  cloud_service_xml, 'DefaultWinRMCertificateThumbprint'
81
84
  )
82
85
 
86
+ vms_in_deployment = {}
87
+
88
+ cloud_service_xml.css('Deployments').each do |deployxml|
89
+ deployment_name = xml_content(deployxml, 'Deployment Name')
90
+ vms = Azure::VirtualMachineManagement::Serialization.virtual_machines_from_xml(
91
+ deployxml, cloud.name
92
+ )
93
+
94
+ vms_in_deployment[deployment_name.to_sym] = vms
95
+ end
96
+
97
+ cloud.virtual_machines = vms_in_deployment
83
98
  clouds << cloud
84
99
  end
85
100
  clouds.compact
@@ -107,12 +107,6 @@ module Azure
107
107
  storage_accounts << storage_account
108
108
  end
109
109
 
110
- # returns the first storage account if only one found
111
- # This will be the case when calling the get_storage_account_properties
112
- # API or if only one storage account exists for the subscription
113
- return storage_accounts.first if storage_accounts.size == 1
114
-
115
- # returns all the storage accounts, if more than 1 found
116
110
  storage_accounts.compact
117
111
  end
118
112
 
@@ -67,7 +67,7 @@ module Azure
67
67
  request_path = "/services/storageservices/#{name}"
68
68
  request = ManagementHttpRequest.new(:get, request_path, nil)
69
69
  response = request.call
70
- Serialization.storage_services_from_xml(response)
70
+ Serialization.storage_services_from_xml(response).first
71
71
  end
72
72
 
73
73
  # Public: Create a new storage account in Windows Azure.
@@ -17,7 +17,7 @@ module Azure
17
17
  class Version
18
18
  MAJOR = 0 unless defined? MAJOR
19
19
  MINOR = 6 unless defined? MINOR
20
- UPDATE = 2 unless defined? UPDATE
20
+ UPDATE = 3 unless defined? UPDATE
21
21
  PRE = nil unless defined? PRE
22
22
 
23
23
  class << self
@@ -91,7 +91,11 @@ module Azure
91
91
  xml.ConfigurationSetType 'NetworkConfiguration'
92
92
  xml.InputEndpoints do
93
93
  default_endpoints_to_xml(xml, options)
94
- tcp_endpoints_to_xml(xml, options[:tcp_endpoints]) if options[:tcp_endpoints]
94
+ tcp_endpoints_to_xml(
95
+ xml,
96
+ options[:tcp_endpoints],
97
+ options[:existing_ports]
98
+ ) if options[:tcp_endpoints]
95
99
  end
96
100
  if options[:virtual_network_name] && options[:subnet_name]
97
101
  xml.SubnetNames do
@@ -127,10 +131,16 @@ module Azure
127
131
  xml.SSH do
128
132
  xml.PublicKeys do
129
133
  xml.PublicKey do
130
- xml.Fingerprint fingerprint
134
+ xml.Fingerprint fingerprint.to_s.upcase
131
135
  xml.Path "/home/#{params[:vm_user]}/.ssh/authorized_keys"
132
136
  end
133
137
  end
138
+ xml.KeyPairs do
139
+ xml.KeyPair do
140
+ xml.Fingerprint fingerprint.to_s.upcase
141
+ xml.Path "/home/#{params[:vm_user]}/.ssh/id_rsa"
142
+ end
143
+ end
134
144
  end
135
145
  end
136
146
  end
@@ -165,49 +175,64 @@ module Azure
165
175
 
166
176
  def self.default_endpoints_to_xml(xml, options)
167
177
  os_type = options[:os_type]
178
+ used_ports = options[:existing_ports]
168
179
  endpoints = []
169
180
  if os_type == 'Linux'
170
- endpoints << {
181
+ preferred_port = '22'
182
+ port_already_opened?(used_ports, options[:ssh_port])
183
+ endpoints << {
171
184
  name: 'SSH',
172
- public_port: options[:ssh_port] || '22',
185
+ public_port: options[:ssh_port] || assign_random_port(preferred_port, used_ports),
173
186
  protocol: 'TCP',
174
- local_port: '22'
187
+ local_port: preferred_port
175
188
  }
176
189
  elsif os_type == 'Windows' && options[:winrm_transport]
177
190
  if options[:winrm_transport].include?('http')
178
- endpoints << {
191
+ preferred_port = '5985'
192
+ port_already_opened?(used_ports, options[:winrm_http_port])
193
+ endpoints << {
179
194
  name: 'WinRm-Http',
180
- public_port: '5985',
195
+ public_port: options[:winrm_http_port] || assign_random_port(preferred_port, used_ports),
181
196
  protocol: 'TCP',
182
- local_port: '5985'
197
+ local_port: preferred_port
183
198
  }
184
199
  end
185
200
  if options[:winrm_transport].include?('https')
186
- endpoints << {
201
+ preferred_port = '5986'
202
+ port_already_opened?(used_ports, options[:winrm_https_port])
203
+ endpoints << {
187
204
  name: 'PowerShell',
188
- public_port: '5986',
205
+ public_port: options[:winrm_https_port] || assign_random_port(preferred_port, used_ports),
189
206
  protocol: 'TCP',
190
- local_port: '5986'
207
+ local_port: preferred_port
191
208
  }
192
209
  end
193
210
  end
194
211
  endpoints_to_xml(xml, endpoints)
195
212
  end
196
213
 
197
- def self.tcp_endpoints_to_xml(xml, tcp_endpoints)
214
+ def self.tcp_endpoints_to_xml(xml, tcp_endpoints, existing_ports = [])
198
215
  endpoints = []
216
+
199
217
  tcp_endpoints.split(',').each do |endpoint|
200
218
  ports = endpoint.split(':')
201
219
  tcp_ep = {}
220
+
202
221
  if ports.length > 1
203
- tcp_ep[:name] = 'TCP-PORT-' + ports[1]
222
+ port_already_opened?(existing_ports, ports[1])
223
+
224
+ tcp_ep[:name] = "TCP-PORT-#{ports[1]}"
204
225
  tcp_ep[:public_port] = ports[1]
205
226
  else
206
- tcp_ep[:name] = 'TCP-PORT-' + ports[0]
227
+ port_already_opened?(existing_ports, ports[0])
228
+
229
+ tcp_ep[:name] = "TCP-PORT-#{ports[0]}"
207
230
  tcp_ep[:public_port] = ports[0]
208
231
  end
232
+
209
233
  tcp_ep[:local_port] = ports[0]
210
234
  tcp_ep[:protocol] = 'TCP'
235
+
211
236
  endpoints << tcp_ep
212
237
  end
213
238
  endpoints_to_xml(xml, endpoints)
@@ -230,17 +255,18 @@ module Azure
230
255
  vm.cloud_service_name = cloud_service_name.downcase
231
256
  vm.deployment_name = xml_content(deployXML, 'Deployment Name')
232
257
  vm.deployment_status = xml_content(deployXML, 'Deployment Status')
233
- vm.virtual_network_name = xml_content(
258
+ vm.virtual_network_name = xml_content(
234
259
  deployXML.css('Deployment'),
235
260
  'VirtualNetworkName'
236
261
  )
237
262
  roles.each do |role|
238
- if xml_content(role, 'RoleName') == role_name
263
+ if xml_content(role, 'RoleName') == role_name
239
264
  vm.availability_set_name = xml_content(role, 'AvailabilitySetName')
240
265
  endpoints_from_xml(role, vm)
241
266
  vm.os_type = xml_content(role, 'OSVirtualHardDisk OS')
242
267
  vm.disk_name = xml_content(role, 'OSVirtualHardDisk DiskName')
243
268
  vm.media_link = xml_content(role, 'OSVirtualHardDisk MediaLink')
269
+ vm.image = xml_content(role, 'OSVirtualHardDisk SourceImageName')
244
270
  break
245
271
  end
246
272
  end
@@ -266,7 +292,7 @@ module Azure
266
292
  ep[:direct_server_return] = server_return if !server_return.empty?
267
293
  unless lb_name.empty?
268
294
  ep[:protocol] = endpoint.css('Protocol').last.text
269
- ep[:load_balancer_name] = lb_name
295
+ ep[:load_balancer_name] = lb_name
270
296
  lb_port = xml_content(endpoint, 'LoadBalancerProbe Port')
271
297
  lb_protocol = xml_content(endpoint, 'LoadBalancerProbe Protocol')
272
298
  lb_path = xml_content(endpoint, 'LoadBalancerProbe Path')
@@ -321,7 +347,7 @@ module Azure
321
347
  protocol = endpoint[:protocol]
322
348
  port = endpoint[:public_port]
323
349
  interval = endpoint[:load_balancer][:interval]
324
- timeout = endpoint[:load_balancer][:timeout]
350
+ timeout = endpoint[:load_balancer][:timeout]
325
351
  path = endpoint[:load_balancer][:path]
326
352
  balancer_name = endpoint[:load_balancer_name]
327
353
  xml.InputEndpoint do
@@ -359,7 +385,7 @@ module Azure
359
385
  xml.Lun lun
360
386
  xml.LogicalDiskSizeInGB options[:disk_size] || 1
361
387
  unless options[:import]
362
- disk_name = media_link[/([^\/]+)$/]
388
+ disk_name = media_link[/([^\/]+)$/]
363
389
  media_link = media_link.gsub(/#{disk_name}/, (Time.now.strftime('disk_%Y_%m_%d_%H_%M')) + '.vhd')
364
390
  xml.MediaLink media_link
365
391
  end
@@ -368,6 +394,28 @@ module Azure
368
394
  builder.doc.to_xml
369
395
  end
370
396
 
397
+ private
398
+
399
+ def self.port_already_opened?(existing_ports, port)
400
+ return false if existing_ports.nil?
401
+ raise "Port #{port} conflicts with a port already opened. "\
402
+ "Please select a different port." if existing_ports.include?(port)
403
+ false
404
+ end
405
+
406
+ def self.assign_random_port(preferred_port, used_ports)
407
+ random_port = nil
408
+ if used_ports.nil? || !used_ports.include?(preferred_port)
409
+ random_port = preferred_port
410
+ else
411
+ random_port = Random.new.rand(10000..65535)
412
+ while(used_ports.include?(random_port.to_s))
413
+ random_port = Random.new.rand(10000..65535)
414
+ end
415
+ end
416
+ random_port
417
+ end
418
+
371
419
  end
372
420
  end
373
421
  end
@@ -30,7 +30,6 @@ module Azure
30
30
  attr_accessor :deployment_status
31
31
  attr_accessor :tcp_endpoints
32
32
  attr_accessor :role_size
33
- attr_accessor :vm_user
34
33
  attr_accessor :image
35
34
  attr_accessor :os_type
36
35
  attr_accessor :disk_name
@@ -85,6 +85,8 @@ module Azure
85
85
  # * +:ssh_private_key_file+ - String. Path of private key file.
86
86
  # * +:ssh_certificate_file+ - String. Path of certificate file.
87
87
  # * +:ssh_port+ - Integer. Specifies the SSH port number.
88
+ # * +:winrm_http_port - Integer. Specifies the WinRM HTTP port number.
89
+ # * +:winrm_https_port - Integer. Specifies the WinRM HTTPS port number.
88
90
  # * +:vm_size+ - String. Specifies the size of the virtual machine instance.
89
91
  # * +:winrm_transport+ - Array. Specifies WINRM transport protocol.
90
92
  # * +:availability_set_name+ - String. Specifies the availability set name.
@@ -131,6 +133,20 @@ module Azure
131
133
  body = Serialization.deployment_to_xml(params, options)
132
134
  path = "/services/hostedservices/#{options[:cloud_service_name]}/deployments"
133
135
  else
136
+ cloud_services = Azure::CloudServiceManagementService.new.get_cloud_service_properties(
137
+ options[:cloud_service_name]
138
+ )
139
+ existing_ports = []
140
+ # There should be only one cloud_serivce in the Array.
141
+ cloud_services.each do |cloud_service|
142
+ cloud_service.virtual_machines[options[:deployment_name].to_sym].each do |vm|
143
+ vm.tcp_endpoints.each do |endpoint|
144
+ existing_ports << endpoint[:public_port]
145
+ end
146
+ end
147
+ end
148
+
149
+ options[:existing_ports] = existing_ports
134
150
 
135
151
  Loggerx.info 'Deployment exists, adding role...'
136
152
  body = Serialization.role_to_xml(params, options).to_xml
@@ -0,0 +1,25 @@
1
+
2
+ <?xml version="1.0"?>
3
+ <StorageServices xmlns="http://schemas.microsoft.com/windowsazure" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
4
+ <StorageService>
5
+ <Url>https://management.core.windows.net/268a3762-abcd-4cd3-a4ea-80e84bddff87/services/storageservices/storage1</Url>
6
+ <ServiceName>storage1</ServiceName>
7
+ <StorageServiceProperties>
8
+ <Description i:nil="true"/>
9
+ <Location>West US</Location>
10
+ <Label>c3VzZQ==</Label>
11
+ <Status>Created</Status>
12
+ <Endpoints>
13
+ <Endpoint>http://storage1.blob.core.windows.net/</Endpoint>
14
+ <Endpoint>http://storage1.queue.core.windows.net/</Endpoint>
15
+ <Endpoint>http://storage1.table.core.windows.net/</Endpoint>
16
+ </Endpoints>
17
+ <GeoReplicationEnabled>true</GeoReplicationEnabled>
18
+ <GeoPrimaryRegion>West US</GeoPrimaryRegion>
19
+ <StatusOfPrimary/>
20
+ <GeoSecondaryRegion>East US</GeoSecondaryRegion>
21
+ <StatusOfSecondary/>
22
+ </StorageServiceProperties>
23
+ <ExtendedProperties/>
24
+ </StorageService>
25
+ </StorageServices>
@@ -83,7 +83,6 @@ describe Azure::VirtualMachineManagementService do
83
83
  assert_match(/^#{params[:vm_name] + '-service'}*/, csn)
84
84
  # Test for add role
85
85
  params[:vm_name] = 'test-add-role-vm'
86
- options[:ssh_port] = 2222
87
86
  vm = subject.create_virtual_machine(params, options, true)
88
87
  vm.cloud_service_name.must_equal csn
89
88
  vm.vm_name.must_equal params[:vm_name]
@@ -19,14 +19,25 @@ describe Azure::StorageManagementService do
19
19
  subject { Azure::StorageManagementService.new }
20
20
  let(:request_path) {'/services/storageservices'}
21
21
  let(:storage_accounts_xml) { Fixtures["list_storage_accounts"] }
22
+ let(:one_storage_account_xml) { Fixtures['list_storage_account_single']}
22
23
  let(:method) { :get }
23
24
  let(:mock_request){ mock() }
25
+
24
26
  let(:response) {
25
27
  response = mock()
26
28
  response.stubs(:body).returns(storage_accounts_xml)
27
29
  response
28
30
  }
31
+
32
+ let(:single_response) {
33
+ single_response = mock()
34
+ single_response.stubs(:body).returns(one_storage_account_xml)
35
+ single_response
36
+ }
37
+
29
38
  let(:response_body) {Nokogiri::XML response.body}
39
+ let(:single_response_body) { Nokogiri::XML single_response.body }
40
+
30
41
  before{
31
42
  Loggerx.expects(:puts).returns(nil).at_least(0)
32
43
  }
@@ -54,6 +65,23 @@ describe Azure::StorageManagementService do
54
65
  end
55
66
  end
56
67
 
68
+ describe "#list_storage_accounts_single" do
69
+ before {
70
+ ManagementHttpRequest.stubs(:new).with(
71
+ method, request_path, nil
72
+ ).returns(mock_request)
73
+ mock_request.expects(:call).returns(single_response_body)
74
+ }
75
+
76
+ it "returns an array even if single account exists" do
77
+ results = subject.list_storage_accounts
78
+ results.must_be_kind_of Array
79
+ results.length.must_equal 1
80
+ results.first.must_be_kind_of Azure::StorageManagement::StorageAccount
81
+ results.first.name.must_equal 'storage1'
82
+ end
83
+ end
84
+
57
85
  describe "#get_storage_account" do
58
86
  before {
59
87
  ManagementHttpRequest.stubs(:new).with(method, request_path, nil).returns(mock_request)
@@ -105,7 +105,7 @@ describe Azure::VirtualMachineManagement::Serialization do
105
105
  end
106
106
 
107
107
  describe '#deployment_to_xml' do
108
- let(:params)do
108
+ let(:params) do
109
109
  {
110
110
  vm_name: 'virtual-machine-name',
111
111
  vm_user: 'username',
@@ -125,7 +125,7 @@ describe Azure::VirtualMachineManagement::Serialization do
125
125
  end
126
126
 
127
127
  it 'returns an VirtualMachine object with correct tcp endpoints' do
128
- params[:certificate] = { fingerprint: 'CFB8C256D2986559C630547F2D0' }
128
+ params[:certificate] = {fingerprint: 'CFB8C256D2986559C630547F2D0'}
129
129
  result = subject.deployment_to_xml params, options
130
130
  doc = Nokogiri::XML(result)
131
131
  endpoints = doc.css('Deployment RoleList ConfigurationSet InputEndpoints InputEndpoint')
@@ -160,7 +160,7 @@ describe Azure::VirtualMachineManagement::Serialization do
160
160
  describe '#add_data_disk_to_xml' do
161
161
 
162
162
  let(:options) do
163
- { disk_size: 100 }
163
+ {disk_size: 100}
164
164
  end
165
165
  let(:media_link) { 'https://sta.blob.managment.core.net/vhds/1234.vhd' }
166
166
  let(:lun) { 5 }
@@ -169,7 +169,7 @@ describe Azure::VirtualMachineManagement::Serialization do
169
169
  end
170
170
 
171
171
  it 'returns an xml for newly created data disk' do
172
- result = subject.add_data_disk_to_xml(lun, media_link , options)
172
+ result = subject.add_data_disk_to_xml(lun, media_link, options)
173
173
  doc = Nokogiri::XML(result)
174
174
  disk_size = doc.css('DataVirtualHardDisk LogicalDiskSizeInGB').text
175
175
  media_link = doc.css('DataVirtualHardDisk MediaLink').text
@@ -184,7 +184,7 @@ describe Azure::VirtualMachineManagement::Serialization do
184
184
  it 'returns an xml for existing data disk' do
185
185
  options[:import] = true
186
186
  options[:disk_name] = 'disk_name'
187
- result = subject.add_data_disk_to_xml(lun, media_link , options)
187
+ result = subject.add_data_disk_to_xml(lun, media_link, options)
188
188
  doc = Nokogiri::XML(result)
189
189
  media_link = doc.css('DataVirtualHardDisk MediaLink').text
190
190
  disk_name = doc.css('DataVirtualHardDisk DiskName').text
@@ -197,10 +197,39 @@ describe Azure::VirtualMachineManagement::Serialization do
197
197
  it 'raise error when disk name is empty' do
198
198
  options[:import] = true
199
199
  exception = assert_raises(RuntimeError) do
200
- subject.add_data_disk_to_xml(lun, media_link , options)
200
+ subject.add_data_disk_to_xml(lun, media_link, options)
201
201
  end
202
202
  assert_match(/The data disk name is not valid/i, exception.message)
203
203
  end
204
204
  end
205
205
 
206
+ describe '#add_data_disk_to_xml' do
207
+ let(:preferred_port) { '22' }
208
+ before do
209
+ subject.class.send(:public, *subject.class.private_instance_methods)
210
+ Loggerx.expects(:puts).returns(nil).at_least(0)
211
+ end
212
+
213
+ it 'returns an xml for newly created data disk' do
214
+ result = subject.assign_random_port(preferred_port, [preferred_port])
215
+ assert_operator result.to_i, :>=, 10000
216
+ assert_operator result.to_i, :<=, 65535
217
+ end
218
+
219
+ it 'returns an xml for newly created data disk' do
220
+ result = subject.assign_random_port(preferred_port, nil)
221
+ result.must_equal preferred_port
222
+ end
223
+
224
+ it 'returns an xml for newly created data disk' do
225
+ result = subject.assign_random_port(preferred_port, [])
226
+ result.must_equal preferred_port
227
+ end
228
+
229
+ it 'returns an xml for newly created data disk' do
230
+ result = subject.assign_random_port(preferred_port, ['1', preferred_port])
231
+ assert_operator result.to_i, :>=, 10000
232
+ assert_operator result.to_i, :<=, 65535
233
+ end
234
+ end
206
235
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: azure
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Microsoft Corporation
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-03-15 00:00:00.000000000 Z
12
+ date: 2014-03-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -281,6 +281,7 @@ files:
281
281
  - test/fixtures/list_page_ranges.xml
282
282
  - test/fixtures/list_sql_database.xml
283
283
  - test/fixtures/list_sql_server_firewall.xml
284
+ - test/fixtures/list_storage_account_single.xml
284
285
  - test/fixtures/list_storage_accounts.xml
285
286
  - test/fixtures/list_virtual_networks.xml
286
287
  - test/fixtures/logging.xml