azure 0.6.3 → 0.6.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.
Files changed (27) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog.txt +7 -0
  3. data/README.md +52 -35
  4. data/lib/azure/base_management/management_http_request.rb +1 -1
  5. data/lib/azure/cloud_service_management/cloud_service.rb +1 -1
  6. data/lib/azure/cloud_service_management/cloud_service_management_service.rb +8 -10
  7. data/lib/azure/cloud_service_management/serialization.rb +9 -8
  8. data/lib/azure/storage_management/storage_management_service.rb +2 -2
  9. data/lib/azure/version.rb +1 -1
  10. data/lib/azure/virtual_machine_image_management/serialization.rb +4 -6
  11. data/lib/azure/virtual_machine_image_management/virtual_machine_disk.rb +0 -2
  12. data/lib/azure/virtual_machine_image_management/virtual_machine_image.rb +0 -2
  13. data/lib/azure/virtual_machine_image_management/virtual_machine_image_management_service.rb +4 -9
  14. data/lib/azure/virtual_machine_management/serialization.rb +19 -4
  15. data/lib/azure/virtual_machine_management/virtual_machine.rb +1 -0
  16. data/lib/azure/virtual_machine_management/virtual_machine_management_service.rb +118 -68
  17. data/test/integration/cloud_service/Cloud_Create_test.rb +44 -0
  18. data/test/integration/cloud_service/Cloud_Delete_test.rb +44 -0
  19. data/test/integration/vm/VM_Create_test.rb +56 -10
  20. data/test/integration/vm/VM_Operations_test.rb +3 -4
  21. data/test/unit/cloud_service_management/cloud_service_management_service_test.rb +30 -30
  22. data/test/unit/cloud_service_management/serialization_test.rb +20 -20
  23. data/test/unit/virtual_machine_image_management/serialization_test.rb +6 -6
  24. data/test/unit/virtual_machine_image_management/virtual_machine_image_management_service_test.rb +20 -20
  25. data/test/unit/virtual_machine_management/serialization_test.rb +26 -14
  26. data/test/unit/virtual_machine_management/virtual_machine_management_service_test.rb +80 -75
  27. metadata +4 -2
@@ -12,12 +12,11 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  #--------------------------------------------------------------------------
15
- require "azure/virtual_machine_image_management/serialization"
15
+ require 'azure/virtual_machine_image_management/serialization'
16
16
 
17
17
  module Azure
18
18
  module VirtualMachineImageManagement
19
19
  class VirtualMachineImageManagementService < BaseManagementService
20
-
21
20
  def initialize
22
21
  super()
23
22
  end
@@ -26,16 +25,14 @@ module Azure
26
25
  #
27
26
  # Returns an array of Azure::VirtualMachineImageManagementService objects
28
27
  def list_virtual_machine_images
29
- request_path = "/services/images"
28
+ request_path = '/services/images'
30
29
  request = ManagementHttpRequest.new(:get, request_path, nil)
31
30
  response = request.call
32
31
  Serialization.virtual_machine_images_from_xml(response)
33
32
  end
34
-
35
33
  end
36
34
 
37
35
  class VirtualMachineDiskManagementService < BaseManagementService
38
-
39
36
  def initialize
40
37
  super()
41
38
  end
@@ -44,14 +41,14 @@ module Azure
44
41
  #
45
42
  # Returns an array of Azure::VirtualMachineDiskManagementService objects
46
43
  def list_virtual_machine_disks
47
- request_path = "/services/disks"
44
+ request_path = '/services/disks'
48
45
  request = ManagementHttpRequest.new(:get, request_path, nil)
49
46
  response = request.call
50
47
  Serialization.disks_from_xml(response)
51
48
  end
52
49
 
53
50
  def get_virtual_machine_disk(disk_name)
54
- disk = list_virtual_machine_disks.select {|x| x.name == disk_name}
51
+ disk = list_virtual_machine_disks.select { |x| x.name == disk_name }
55
52
  disk.first
56
53
  end
57
54
 
@@ -64,8 +61,6 @@ module Azure
64
61
  request = ManagementHttpRequest.new(:delete, path)
65
62
  request.call
66
63
  end
67
-
68
64
  end
69
65
  end
70
66
  end
71
-
@@ -263,6 +263,7 @@ module Azure
263
263
  if xml_content(role, 'RoleName') == role_name
264
264
  vm.availability_set_name = xml_content(role, 'AvailabilitySetName')
265
265
  endpoints_from_xml(role, vm)
266
+ vm.data_disks = data_disks_from_xml(role)
266
267
  vm.os_type = xml_content(role, 'OSVirtualHardDisk OS')
267
268
  vm.disk_name = xml_content(role, 'OSVirtualHardDisk DiskName')
268
269
  vm.media_link = xml_content(role, 'OSVirtualHardDisk MediaLink')
@@ -276,6 +277,20 @@ module Azure
276
277
  end
277
278
  end
278
279
 
280
+ def self.data_disks_from_xml(rolesXML)
281
+ data_disks = []
282
+ virtual_hard_disks = rolesXML.css('DataVirtualHardDisks DataVirtualHardDisk')
283
+ virtual_hard_disks.each do |disk|
284
+ data_disk = {}
285
+ data_disk[:name] = xml_content(disk, 'DiskName')
286
+ data_disk[:lun] = xml_content(disk, 'Lun')
287
+ data_disk[:size_in_gb] = xml_content(disk, 'LogicalDiskSizeInGB')
288
+ data_disk[:media_link] = xml_content(disk, 'MediaLink')
289
+ data_disks << data_disk
290
+ end
291
+ data_disks
292
+ end
293
+
279
294
  def self.endpoints_from_xml(rolesXML, vm)
280
295
  vm.tcp_endpoints = []
281
296
  vm.udp_endpoints = []
@@ -370,10 +385,11 @@ module Azure
370
385
  end
371
386
  end
372
387
 
373
- def self.add_data_disk_to_xml(lun, media_link, options)
388
+ def self.add_data_disk_to_xml(vm, options)
374
389
  if options[:import] && options[:disk_name].nil?
375
390
  Loggerx.error_with_exit "The data disk name is not valid."
376
391
  end
392
+ media_link = vm.media_link
377
393
  builder = Nokogiri::XML::Builder.new do |xml|
378
394
  xml.DataVirtualHardDisk(
379
395
  'xmlns' => 'http://schemas.microsoft.com/windowsazure',
@@ -382,8 +398,7 @@ module Azure
382
398
  xml.HostCaching options[:host_caching] || 'ReadOnly'
383
399
  xml.DiskLabel options[:disk_label]
384
400
  xml.DiskName options[:disk_name] if options[:import]
385
- xml.Lun lun
386
- xml.LogicalDiskSizeInGB options[:disk_size] || 1
401
+ xml.LogicalDiskSizeInGB options[:disk_size] || 100
387
402
  unless options[:import]
388
403
  disk_name = media_link[/([^\/]+)$/]
389
404
  media_link = media_link.gsub(/#{disk_name}/, (Time.now.strftime('disk_%Y_%m_%d_%H_%M')) + '.vhd')
@@ -399,7 +414,7 @@ module Azure
399
414
  def self.port_already_opened?(existing_ports, port)
400
415
  return false if existing_ports.nil?
401
416
  raise "Port #{port} conflicts with a port already opened. "\
402
- "Please select a different port." if existing_ports.include?(port)
417
+ "Please select a different port." if existing_ports.include?(port)
403
418
  false
404
419
  end
405
420
 
@@ -36,6 +36,7 @@ module Azure
36
36
  attr_accessor :virtual_network_name
37
37
  attr_accessor :availability_set_name
38
38
  attr_accessor :media_link
39
+ attr_accessor :data_disks
39
40
  end
40
41
  end
41
42
  end
@@ -51,7 +51,7 @@ module Azure
51
51
  #
52
52
  # Returns an Azure::VirtualMachineManagement::VirtualMachine instance.
53
53
  def get_virtual_machine(name, cloud_service_name)
54
- server = list_virtual_machines(cloud_service_name).select { |x| x.vm_name == name && x.cloud_service_name == cloud_service_name }
54
+ server = list_virtual_machines(cloud_service_name).select { |x| x.vm_name == name.downcase }
55
55
  server.first
56
56
  end
57
57
 
@@ -103,57 +103,33 @@ module Azure
103
103
  # See:
104
104
  # http://msdn.microsoft.com/en-us/library/windowsazure/jj157194.aspx
105
105
  # http://msdn.microsoft.com/en-us/library/windowsazure/jj157186.aspx
106
- def create_virtual_machine(params, options = {}, add_role = false)
106
+ def create_virtual_machine(params, options = {})
107
107
  options[:os_type] = get_os_type(params[:image])
108
108
  validate_deployment_params(params, options)
109
109
  options[:deployment_name] ||= options[:cloud_service_name]
110
-
111
- unless add_role
112
- Loggerx.info 'Creating deploymnent...'
113
- options[:cloud_service_name] ||= generate_cloud_service_name(params[:vm_name])
114
- options[:storage_account_name] ||= generate_storage_account_name(params[:vm_name])
115
- optionals = {}
116
- if options[:virtual_network_name]
117
- virtual_network_service = Azure::VirtualNetworkManagementService.new
118
- virtual_networks = virtual_network_service.list_virtual_networks.select { |x| x.name == options[:virtual_network_name] }
119
- if virtual_networks.empty?
120
- Loggerx.error_with_exit "Virtual network #{options[:virtual_network_name]} doesn't exists"
121
- else
122
- optionals[:affinity_group_name] = virtual_networks.first.affinity_group
123
- end
124
- elsif options[:affinity_group_name]
125
- optionals[:affinity_group_name] = options[:affinity_group_name]
110
+ Loggerx.info 'Creating deploymnent...'
111
+ options[:cloud_service_name] ||= generate_cloud_service_name(params[:vm_name])
112
+ options[:storage_account_name] ||= generate_storage_account_name(params[:vm_name])
113
+ optionals = {}
114
+ if options[:virtual_network_name]
115
+ virtual_network_service = Azure::VirtualNetworkManagementService.new
116
+ virtual_networks = virtual_network_service.list_virtual_networks.select { |x| x.name == options[:virtual_network_name] }
117
+ if virtual_networks.empty?
118
+ Loggerx.error_with_exit "Virtual network #{options[:virtual_network_name]} doesn't exists"
126
119
  else
127
- optionals[:location] = params[:location]
120
+ optionals[:affinity_group_name] = virtual_networks.first.affinity_group
128
121
  end
129
- cloud_service = Azure::CloudServiceManagementService.new
130
- cloud_service.create_cloud_service(options[:cloud_service_name], optionals)
131
- cloud_service.upload_certificate(options[:cloud_service_name], params[:certificate]) unless params[:certificate].empty?
132
- Azure::StorageManagementService.new.create_storage_account(options[:storage_account_name], optionals)
133
- body = Serialization.deployment_to_xml(params, options)
134
- path = "/services/hostedservices/#{options[:cloud_service_name]}/deployments"
122
+ elsif options[:affinity_group_name]
123
+ optionals[:affinity_group_name] = options[:affinity_group_name]
135
124
  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
150
-
151
- Loggerx.info 'Deployment exists, adding role...'
152
- body = Serialization.role_to_xml(params, options).to_xml
153
- path = "/services/hostedservices/#{options[:cloud_service_name]}/deployments/#{options[:deployment_name]}/roles"
125
+ optionals[:location] = params[:location]
154
126
  end
155
- Loggerx.error 'Cloud service name is required for adding role.' unless options[:cloud_service_name]
156
- Loggerx.error 'Storage account name is required for adding role.' unless options[:storage_account_name]
127
+ cloud_service = Azure::CloudServiceManagementService.new
128
+ cloud_service.create_cloud_service(options[:cloud_service_name], optionals)
129
+ cloud_service.upload_certificate(options[:cloud_service_name], params[:certificate]) unless params[:certificate].empty?
130
+ Azure::StorageManagementService.new.create_storage_account(options[:storage_account_name], optionals)
131
+ body = Serialization.deployment_to_xml(params, options)
132
+ path = "/services/hostedservices/#{options[:cloud_service_name]}/deployments"
157
133
  Loggerx.info 'Deployment in progress...'
158
134
  request = ManagementHttpRequest.new(:post, path, body)
159
135
  request.call
@@ -162,6 +138,71 @@ module Azure
162
138
  e.message
163
139
  end
164
140
 
141
+ # Public: Add a new role to a cloud service. Atleast one deployment should exist before you can add a role.
142
+ #
143
+ # ==== Attributes
144
+ #
145
+ # * +params+ - Hash. parameters.
146
+ # * +options+ - Hash. Optional parameters.
147
+ #
148
+ # ==== Params
149
+ #
150
+ # Accepted key/value pairs are:
151
+ # * +:vm_name+ - String. Name of virtual machine.
152
+ # * +:vm_user+ - String. User name for the virtual machine instance.
153
+ # * +:password+ - String. A description for the hosted service.
154
+ # * +:image+ - String. Name of the disk image to use to create the virtual machine.
155
+ # * +:cloud_service_name+ - String. Name of cloud service.
156
+ #
157
+ # ==== Options
158
+ #
159
+ # Accepted key/value pairs are:
160
+ # * +:storage_account_name+ - String. Name of storage account.
161
+ # * +:tcp_endpoints+ - String. Specifies the internal port and external/public port separated by a colon.
162
+ # You can map multiple internal and external ports by separating them with a comma.
163
+ # * +:ssh_private_key_file+ - String. Path of private key file.
164
+ # * +:ssh_certificate_file+ - String. Path of certificate file.
165
+ # * +:ssh_port+ - Integer. Specifies the SSH port number.
166
+ # * +:winrm_http_port - Integer. Specifies the WinRM HTTP port number.
167
+ # * +:winrm_https_port - Integer. Specifies the WinRM HTTPS port number.
168
+ # * +:vm_size+ - String. Specifies the size of the virtual machine instance.
169
+ # * +:winrm_transport+ - Array. Specifies WINRM transport protocol.
170
+ #
171
+ # Returns Azure::VirtualMachineManagement::VirtualMachine objects of newly created instance.
172
+ #
173
+ # See:
174
+ # http://msdn.microsoft.com/en-us/library/windowsazure/jj157186.aspx
175
+ def add_role(params, options = {})
176
+ options[:os_type] = get_os_type(params[:image])
177
+ validate_deployment_params(params, options, true)
178
+ cloud_service = Azure::CloudServiceManagementService.new
179
+ cloud_service = cloud_service.get_cloud_service_properties(params[:cloud_service_name])
180
+ deployment_name = cloud_service.deployment_name
181
+ Loggerx.error_with_exit "Deployment doesn't exists." if cloud_service && deployment_name.empty?
182
+ others = {}
183
+ if cloud_service.location
184
+ others[:location] = cloud_service.location
185
+ elsif cloud_service.affinity_group
186
+ others[:affinity_group_name] = cloud_service.affinity_group
187
+ end
188
+ options[:storage_account_name] ||= generate_storage_account_name(params[:vm_name])
189
+ Azure::StorageManagementService.new.create_storage_account(options[:storage_account_name], others)
190
+ Loggerx.info 'Deployment exists, adding role...'
191
+ existing_ports = []
192
+ cloud_service.virtual_machines[deployment_name.to_sym].each do |vm|
193
+ vm.tcp_endpoints.each do |endpoint|
194
+ existing_ports << endpoint[:public_port]
195
+ end
196
+ end
197
+ options[:existing_ports] = existing_ports
198
+ body = Serialization.role_to_xml(params, options).to_xml
199
+ path = "/services/hostedservices/#{cloud_service.name}/deployments/#{deployment_name}/roles"
200
+ Loggerx.info 'Deployment in progress...'
201
+ request = ManagementHttpRequest.new(:post, path, body)
202
+ request.call
203
+ get_virtual_machine(params[:vm_name], cloud_service.name)
204
+ end
205
+
165
206
  # Public: Deletes the deployment, cloud service and disk.
166
207
  #
167
208
  # ==== Attributes
@@ -174,11 +215,19 @@ module Azure
174
215
  #
175
216
  # Returns NONE
176
217
  def delete_virtual_machine(vm_name, cloud_service_name)
177
- vm = get_virtual_machine(vm_name, cloud_service_name)
218
+ virtual_machines = list_virtual_machines(cloud_service_name)
219
+ vm = virtual_machines.select { |x| x.vm_name == vm_name }.first
178
220
  if vm
179
- cloud_service = Azure::CloudServiceManagementService.new
180
- cloud_service.delete_cloud_service_deployment(cloud_service_name)
181
- cloud_service.delete_cloud_service(cloud_service_name)
221
+ if virtual_machines.size == 1
222
+ cloud_service = Azure::CloudServiceManagementService.new
223
+ cloud_service.delete_cloud_service_deployment(cloud_service_name)
224
+ cloud_service.delete_cloud_service(cloud_service_name)
225
+ else
226
+ path = "/services/hostedservices/#{vm.cloud_service_name}/deployments/#{vm.deployment_name}/roles/#{vm.vm_name}"
227
+ Loggerx.info "Deleting virtual machine #{vm_name}. \n"
228
+ request = ManagementHttpRequest.new(:delete, path)
229
+ request.call
230
+ end
182
231
  Loggerx.info "Waiting for disk to be released.\n"
183
232
  disk_name = vm.disk_name
184
233
  disk_management_service = VirtualMachineDiskManagementService.new
@@ -217,7 +266,7 @@ module Azure
217
266
  def shutdown_virtual_machine(vm_name, cloud_service_name)
218
267
  vm = get_virtual_machine(vm_name, cloud_service_name)
219
268
  if vm
220
- if ['StoppedVM', 'StoppedDeallocated'].include?(vm.status)
269
+ if %w(StoppedVM StoppedDeallocated).include?(vm.status)
221
270
  Loggerx.error 'Cannot perform the shutdown operation on a stopped virtual machine.'
222
271
  elsif vm.deployment_status == 'Running'
223
272
  path = "/services/hostedservices/#{vm.cloud_service_name}/deployments/#{vm.deployment_name}/roleinstances/#{vm.vm_name}/Operations"
@@ -282,7 +331,7 @@ module Azure
282
331
  Loggerx.error "Cannot find virtual machine \"#{vm_name}\" under cloud service \"#{cloud_service_name}\"."
283
332
  end
284
333
  end
285
-
334
+
286
335
  # Public: Add/Update endpoints of virtual machine.
287
336
  #
288
337
  # ==== Attributes
@@ -304,7 +353,7 @@ module Azure
304
353
  # * +:protocol+ - String. Specifies the transport protocol
305
354
  # for the endpoint. Possible values are: TCP, UDP
306
355
  # * +:direct_server_return+ - String. Specifies whether the endpoint
307
- # uses Direct Server Return. (optional)
356
+ # uses Direct Server Return. Possible values are: true, false (optional)
308
357
  # * +:load_balancer - Hash. Contains properties that define the
309
358
  # endpoint settings that the load balancer uses to monitor the
310
359
  # availability of the Virtual Machine (optional)
@@ -333,7 +382,7 @@ module Azure
333
382
  path = "/services/hostedservices/#{vm.cloud_service_name}/deployments/#{vm.deployment_name}/roles/#{vm_name}"
334
383
  endpoints = vm.tcp_endpoints + vm.udp_endpoints
335
384
  input_endpoints.each do |iep|
336
- endpoints.delete_if { |ep| iep[:name].downcase == ep[:name].downcase && iep[:protocol].downcase == ep[:protocol] }
385
+ endpoints.delete_if { |ep| iep[:name].downcase == ep[:name].downcase }
337
386
  end
338
387
  endpoints += input_endpoints
339
388
  body = Serialization.update_role_to_xml(endpoints, vm)
@@ -352,7 +401,7 @@ module Azure
352
401
  # * +name+ - String. Virtual machine name.
353
402
  # * +cloud_service_name+ - String. Cloud service name.
354
403
  # * +endpoint_name+ - String. Name of endpoint.
355
- #
404
+ #
356
405
  # See http://msdn.microsoft.com/en-us/library/windowsazure/jj157187.aspx
357
406
  #
358
407
  # Returns NONE
@@ -377,8 +426,6 @@ module Azure
377
426
  #
378
427
  # * +cloud_service_name+ - String. Cloud service name.
379
428
  # * +vm_name+ - String. Virtual machine name.
380
- # * +lun+ - String. Specifies the Logical Unit Number
381
- # (LUN) for the disk. Valid LUN values are 0 through 15.
382
429
  # * +options+ - Hash. Optional parameters.
383
430
  #
384
431
  # ==== Options
@@ -396,12 +443,12 @@ module Azure
396
443
  # See http://msdn.microsoft.com/en-us/library/windowsazure/jj157199.aspx
397
444
  #
398
445
  # Returns None
399
- def add_data_disk(vm_name, cloud_service_name, lun, options = {})
446
+ def add_data_disk(vm_name, cloud_service_name, options = {})
400
447
  options[:import] ||= false
401
448
  vm = get_virtual_machine(vm_name, cloud_service_name)
402
449
  if vm
403
450
  path = "/services/hostedservices/#{cloud_service_name}/deployments/#{vm.deployment_name}/roles/#{vm_name}/DataDisks"
404
- body = Serialization.add_data_disk_to_xml(lun, vm.media_link, options)
451
+ body = Serialization.add_data_disk_to_xml(vm, options)
405
452
  Loggerx.info "Adding data disk to virtual machine #{vm_name} ..."
406
453
  request = ManagementHttpRequest.new(:post, path, body)
407
454
  request.call
@@ -430,15 +477,17 @@ module Azure
430
477
  random_string(vm_name + 'storage').gsub(/[^0-9a-z ]/i, '').downcase[0..23]
431
478
  end
432
479
 
433
- def validate_deployment_params(params, options)
480
+ def validate_deployment_params(params, options, add_role = false)
434
481
  errors = []
435
- params_keys = ['vm_name', 'image', 'location', 'vm_user']
436
- if options[:os_type] == 'Windows'
437
- params_keys += ['password']
438
- end
482
+ params_keys = %w(vm_name image vm_user)
483
+ params_keys += ['password'] if options[:os_type] == 'Windows'
439
484
  options_keys = []
440
- options_keys = ['private_key_file', 'certificate_file'] if certificate_required?(params, options)
441
-
485
+ options_keys = %w(private_key_file certificate_file) if certificate_required?(params, options)
486
+ if add_role
487
+ params_keys += ['cloud_service_name']
488
+ else
489
+ params_keys += ['location']
490
+ end
442
491
  params_keys.each do |key|
443
492
  errors << key if params[key.to_sym].nil?
444
493
  end
@@ -446,9 +495,10 @@ module Azure
446
495
  options_keys.each do |key|
447
496
  errors << key if options[key.to_sym].nil?
448
497
  end
449
- validate_role_size(options[:vm_size])
450
- validate_location(params[:location]) unless errors.include?('location')
498
+
451
499
  if errors.empty?
500
+ validate_location(params[:location]) unless add_role
501
+ validate_role_size(options[:vm_size])
452
502
  params[:certificate] = {}
453
503
  if certificate_required?(params, options)
454
504
  begin
@@ -479,7 +529,7 @@ module Azure
479
529
  end
480
530
 
481
531
  def validate_role_size(vm_size)
482
- valid_role_sizes = ['ExtraSmall', 'Small', 'Medium', 'Large', 'ExtraLarge', 'A6', 'A7']
532
+ valid_role_sizes = %w(ExtraSmall Small Medium Large ExtraLarge A5 A6 A7 Basic_A0 Basic_A1 Basic_A2 Basic_A3 Basic_A4)
483
533
  if vm_size && !valid_role_sizes.include?(vm_size)
484
534
  Loggerx.error_with_exit "Value '#{vm_size}' specified for parameter 'vm_size' is invalid. Allowed values are 'ExtraSmall,Small,Medium,Large,ExtraLarge,A6,A7'"
485
535
  end
@@ -0,0 +1,44 @@
1
+ #-------------------------------------------------------------------------
2
+ # Copyright 2013 Microsoft Open Technologies, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #--------------------------------------------------------------------------
15
+ require 'integration/test_helper'
16
+
17
+ describe Azure::CloudServiceManagementService do
18
+
19
+ subject { Azure::CloudServiceManagementService.new }
20
+ let(:options) do
21
+ {
22
+ location: 'West US',
23
+ description: 'Test'
24
+ }
25
+ end
26
+
27
+ before do
28
+ Loggerx.expects(:puts).returns(nil).at_least(0)
29
+ end
30
+
31
+ describe '#create_cloud_service' do
32
+ before do
33
+ @cloud_name = random_string('test-service-cloud', 10)
34
+ subject.create_cloud_service(@cloud_name, options)
35
+ end
36
+
37
+ it 'Creates a new cloud service in Windows Azure.' do
38
+ cloud_service = subject.get_cloud_service_properties(@cloud_name)
39
+ assert cloud_service.name, @cloud_name
40
+ assert cloud_service.location, options[:location]
41
+ assert cloud_service.virtual_machines, Hash.new
42
+ end
43
+ end
44
+ end