File: virtual_machines_spec.rb

package info (click to toggle)
ruby-azure-sdk 0.8.0-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 22,400 kB
  • ctags: 12,388
  • sloc: ruby: 168,299; sh: 6; makefile: 2
file content (388 lines) | stat: -rw-r--r-- 13,636 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
# encoding: utf-8
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.

require_relative 'spec_helper'

include Azure::ARM::Resources
include Azure::ARM::Resources::Models

include Azure::ARM::Compute
include Azure::ARM::Compute::Models

include Azure::ARM::Network
include Azure::ARM::Network::Models

describe 'Virtual machine and vm extension creation' do
  before(:each) do
    @resource_helper = ResourceHelper.new
    @location = 'westus'
    @resource_group = @resource_helper.create_resource_group
    @client = @resource_helper.compute_client.virtual_machines
    @extensions_client = @resource_helper.compute_client.virtual_machine_extensions
  end

  after(:each) do
    @resource_helper.delete_resource_group(@resource_group.name)
  end

  it 'should create virtual machine and vm extension' do
    params = build_virtual_machine_parameters
    vm_name = 'testvm'
    result = @client.create_or_update_async(@resource_group.name, vm_name, params).value!
    expect(result.response.status).to eq(200)
    expect(result.body).not_to be_nil
    expect(result.body.name).to eq vm_name
    expect(result.body.location).to eq @location

    vm_extension = build_extension_parameter
    ext_name = 'testextension'
    result = @extensions_client.create_or_update_async(@resource_group.name, vm_name, ext_name, vm_extension).value!
    expect(result.response.status).to eq(200)
    expect(result.body.name).to eq(ext_name)
  end
end

describe 'Virtual machine and vm extension api' do
  before(:each) do
    @resource_helper = ResourceHelper.new
    @client = @resource_helper.compute_client.virtual_machines
    @extensions_client = @resource_helper.compute_client.virtual_machine_extensions
    @resource_group = @resource_helper.create_resource_group
    @location = 'westus'
    @vm_name = 'testvm'
    @client.create_or_update(@resource_group.name, @vm_name, build_virtual_machine_parameters())
    @ext_name = 'testextension'
    @extensions_client.create_or_update(@resource_group.name, @vm_name, @ext_name, build_extension_parameter())
  end

  after(:each) do
    @resource_helper.delete_resource_group(@resource_group.name)
  end

  it 'should get vm extension' do
    result = @extensions_client.get_async(@resource_group.name, @vm_name, @ext_name, nil).value!
    expect(result.response.status).to eq(200)
    expect(result.body.name).to eq(@ext_name)
  end

  it 'should get vm extension with expand parameter' do
    result = @extensions_client.get_async(@resource_group.name, @vm_name, @ext_name, 'instanceView').value!
    expect(result.response.status).to eq(200)
    expect(result.body.name).to eq(@ext_name)
  end

  it 'should delete vm extension' do
    result = @extensions_client.delete_async(@resource_group.name, @vm_name, @ext_name).value!
    expect(result.response.status).to eq(200)
  end
end

describe 'Virtual machine api' do
  before(:each) do
    @resource_helper = ResourceHelper.new
    @client = @resource_helper.compute_client.virtual_machines
    @resource_group = @resource_helper.create_resource_group
    @location = 'westus'
    @vm_name = 'testvm'
    @client.create_or_update(@resource_group.name, @vm_name, build_virtual_machine_parameters())
  end

  after(:each) do
    @resource_helper.delete_resource_group(@resource_group.name)
  end

  it 'should get virtual machine' do
    result = @client.get_async(@resource_group.name, @vm_name).value!
    expect(result.response.status).to eq(200)
    expect(result.body.name).to eq(@vm_name)
  end

  it 'should get ip address for virtual machine using generic request' do
    result = @client.get_async(@resource_group.name, @vm_name).value!
    # retrieve network interface and public IP address for the virtual machine
    # using generic request on network client
    network_client = @resource_helper.network_client

    # get first network interface of the network profile
    ni_path = result.body.network_profile.network_interfaces[0].id
    # ni_path "/subscriptions/#{subscription_id}/resourceGroups/RubySDKTest_azure_mgmt_compute/providers/Microsoft.Network/networkInterfaces/testnic53464"
    options = {
        query_params: {'api-version' => '2016-09-01'}
    }
    ni = network_client.make_request(:get, ni_path, options)
    expect(ni).not_to be_nil
    # user NetworkInterface mapper to deserialize object
    ni_instance  = network_client.deserialize(NetworkInterface.mapper(), ni, 'ni_instance')
    # retrieve first IP address for first IP configuration
    ip_address_path = ni_instance.ip_configurations[0].public_ipaddress.id
    ip_address = network_client.make_request(:get, ip_address_path, options)
    ip_address_instance = network_client.deserialize(PublicIPAddress.mapper(), ip_address, 'ip_address_instance')
    expect(ip_address_instance.dns_settings.fqdn).to eq("testdomain53464.westus.cloudapp.azure.com")
  end

  it 'should get virtual machine with expand parameter' do
    result = @client.get_async(@resource_group.name, @vm_name, 'instanceView').value!
    expect(result.response.status).to eq(200)
    expect(result.body.name).to eq(@vm_name)
  end

  it 'should list virtual machines and interfaces' do
    result = @client.list_async(@resource_group.name).value!
    expect(result.response.status).to eq(200)
    expect(result.body.value).not_to be_nil
    expect(result.body.value).to be_a(Array)

    result = @resource_helper.network_client.network_interfaces.list_all
    result.each do |network_interface|
      expect(network_interface.virtual_machine).to be_an_instance_of(MsRestAzure::SubResource)
    end
  end

  it 'should list all virtual machines' do
    result = @client.list_all_async.value!
    expect(result.response.status).to eq(200)
    expect(result.body.value).not_to be_nil
    expect(result.body.value).to be_a(Array)
  end

  it 'should list available sizes' do
    result = @client.list_available_sizes_async(@resource_group.name, @vm_name).value!
    expect(result.response.status).to eq(200)
    expect(result.body.value).not_to be_nil
    expect(result.body.value).to be_a(Array)
  end

  it 'should restart virtual machine' do
    result = @client.restart_async(@resource_group.name, @vm_name).value!
    expect(result.response.status).to eq(200)
  end

  it 'should power off virtual machine' do
    result = @client.power_off_async(@resource_group.name, @vm_name).value!
    expect(result.response.status).to eq(200)
  end

  it 'should start virtual machine' do
    result = @client.start_async(@resource_group.name, @vm_name).value!
    expect(result.response.status).to eq(200)
  end

  it 'should generalize and capture virtual machine' do
    @client.power_off(@resource_group.name, @vm_name)

    # To generalize VM it should be started. But sometimes even after API method
    # starts it - the API still says that it cannot be generalized because it is
    # turned off. Also there is no property provided by API which can be polled
    # to find out whether VM is turned on or not. So the timeout is added here.
    # todo: add VM polling until VM is started if API method appear which provides
    # such info.
    sleep ENV.fetch('RETRY_TIMEOUT', 300).to_i

    result = @client.generalize_async(@resource_group.name, @vm_name).value!
    expect(result.response.status).to eq(200)

    #capturing VM requires VM to be generalized
    capture_params = VirtualMachineCaptureParameters.new
    capture_params.vhd_prefix = 'test'
    capture_params.destination_container_name = 'test'
    capture_params.overwrite_vhds = true

    result = @client.capture_async(@resource_group.name, @vm_name, capture_params).value!
    expect(result.response.status).to eq(200)
  end

  it 'should deallocate virtual machine' do
    result = @client.deallocate_async(@resource_group.name, @vm_name).value!
    expect(result.response.status).to eq(200)
  end

  it 'should delete virtual machine' do
    result = @client.delete_async(@resource_group.name, @vm_name).value!
    expect(result.response.status).to eq(200)
  end
end

# VM helpers
def build_virtual_machine_parameters
  windows_config = WindowsConfiguration.new
  windows_config.provision_vmagent = true
  windows_config.enable_automatic_updates = true

  os_profile = OSProfile.new
  os_profile.computer_name = 'testvm1'
  os_profile.admin_username = 'testvm1'
  os_profile.admin_password = 'P@ssword1'
  os_profile.windows_configuration = windows_config
  os_profile.secrets = []

  hardware_profile = HardwareProfile.new
  hardware_profile.vm_size = 'Standard_A0'

  params = VirtualMachine.new
  params.type = 'Microsoft.Compute/virtualMachines'
  params.network_profile = create_network_profile
  params.storage_profile = create_storage_profile
  params.hardware_profile = hardware_profile
  params.os_profile = os_profile

  params.location = @location
  params
end

def build_extension_parameter
  vm_extension = VirtualMachineExtension.new
  vm_extension.publisher = 'Microsoft.Compute'
  vm_extension.type = 'VMAccessAgent'
  vm_extension.type_handler_version = '2.0'
  vm_extension.auto_upgrade_minor_version = true
  vm_extension.tags = Hash.new
  vm_extension.tags['extensionTag1'] = '1'
  vm_extension.tags['extensionTag2'] = '2'
  vm_extension.location = 'westus'
  vm_extension
end

def generate_os_vhd_uri(storage_name)
  container_name = 'testcontainer'
  vhd_container = "https://#{storage_name}.blob.core.windows.net/#{container_name}"
  os_vhduri = "#{vhd_container}/os#{'test'}.vhd"
  os_vhduri
end

def get_image_reference
  ref = ImageReference.new
  ref.publisher = 'MicrosoftWindowsServer'
  ref.offer = 'WindowsServer'
  ref.sku = '2012-R2-Datacenter'
  ref.version = 'latest'
  ref
end

# Storage helpers
def build_storage_account_create_parameters(name)
  sku = Azure::ARM::Storage::Models::Sku.new
  sku.name = 'Standard_GRS'

  params = Azure::ARM::Storage::Models::StorageAccountCreateParameters.new
  params.location = @location
  params.sku = sku
  params.kind = Azure::ARM::Storage::Models::Kind::Storage

  params
end

def create_storage_account
  storage_name = 'teststorage53464'
  params = build_storage_account_create_parameters storage_name
  result = @resource_helper.storage_client.storage_accounts.create(@resource_group.name, storage_name, params)
  result.name = storage_name #similar problem in dot net tests
  result
end

def create_storage_profile
  storage_profile = StorageProfile.new
  storage_profile.image_reference = get_image_reference
  storage = create_storage_account
  os_disk = OSDisk.new
  os_disk.caching = 'None'
  os_disk.create_option = 'fromImage'
  os_disk.name = 'Test'
  virtual_hard_disk = VirtualHardDisk.new
  virtual_hard_disk.uri = generate_os_vhd_uri storage.name
  os_disk.vhd = virtual_hard_disk
  storage_profile.os_disk = os_disk
  storage_profile
end

# Network helpers
def build_public_ip_params(location)
  domain_name = 'testdomain53464'
  dns_settings = PublicIPAddressDnsSettings.new
  dns_settings.domain_name_label = domain_name

  public_ip = PublicIPAddress.new
  public_ip.location = location
  public_ip.public_ipallocation_method = 'Dynamic'
  public_ip.dns_settings = dns_settings

  public_ip
end

def create_public_ip_address(location, resource_group)
  public_ip_address_name = 'test_ip_name'
  params = build_public_ip_params(location)
  @resource_helper.network_client.public_ipaddresses.create_or_update(resource_group.name, public_ip_address_name, params)
end

def build_virtual_network_params(location)
  params = VirtualNetwork.new
  params.location = location
  address_space = AddressSpace.new
  address_space.address_prefixes = ['10.0.0.0/16']

  dhcp_options = DhcpOptions.new
  dhcp_options.dns_servers = %w(10.1.1.1 10.1.2.4)

  sub2 = Subnet.new
  sub2.name = 'subnet253464'
  sub2.address_prefix = '10.0.2.0/24'

  params.address_space = address_space
  params.dhcp_options = dhcp_options
  params.subnets = [sub2]

  params
end

def create_virtual_network(resource_group_name)
  virtualNetworkName = "testvnet53464"
  params = build_virtual_network_params('westus')
  @resource_helper.network_client.virtual_networks.create_or_update(resource_group_name, virtualNetworkName, params)
end

def build_subnet_params
  params = Subnet.new
  params.address_prefix = '10.0.1.0/24'
  params
end

def create_subnet(virtual_network, resource_group, subnet_client)
  subnet_name = 'testsubnet53464'
  params = build_subnet_params

  subnet_client.create_or_update(resource_group.name, virtual_network.name, subnet_name, params)
end

def create_network_interface
  params = build_network_interface_param
  @resource_helper.network_client.network_interfaces.create_or_update(@resource_group.name, params.name, params)
end

def build_network_interface_param
  params = NetworkInterface.new
  params.location = @location
  network_interface_name = 'testnic53464'
  ip_config_name = 'ip_name53464'
  params.name = network_interface_name

  ip_configuration = NetworkInterfaceIPConfiguration.new
  ip_configuration.name = ip_config_name
  ip_configuration.private_ipallocation_method = IPAllocationMethod::Dynamic
  ip_configuration.public_ipaddress = create_public_ip_address(@location, @resource_group)
  ip_configuration.subnet = @subnet

  params.ip_configurations = [ip_configuration]
  params
end

def create_network_profile
  vn = create_virtual_network(@resource_group.name)
  @subnet = create_subnet(vn, @resource_group, @resource_helper.network_client.subnets)
  network_interface = create_network_interface

  profile = NetworkProfile.new
  profile.network_interfaces = [network_interface]

  profile
end