azure 0.6.3 → 0.6.4

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