vagrant-cosmic 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/CHANGELOG.md +8 -0
  4. data/Docker/.dockerignore +2 -0
  5. data/Docker/Dockerfile +48 -0
  6. data/Docker/Dockerfile.chefdk_0_17 +49 -0
  7. data/Docker/Dockerfile.latest_dependencies +49 -0
  8. data/Docker/README.md +95 -0
  9. data/Docker/vac.ps1 +29 -0
  10. data/Docker/vac.sh +30 -0
  11. data/Gemfile +21 -0
  12. data/Gemfile.lock +187 -0
  13. data/LICENSE +8 -0
  14. data/README.md +409 -0
  15. data/Rakefile +106 -0
  16. data/build_rpm.sh +7 -0
  17. data/functional-tests/basic/Vagrantfile.basic_networking +34 -0
  18. data/functional-tests/basic/basic_spec.rb +15 -0
  19. data/functional-tests/networking/Vagrantfile.advanced_networking +106 -0
  20. data/functional-tests/networking/networking_spec.rb +14 -0
  21. data/functional-tests/rsync/Vagrantfile.advanced_networking +40 -0
  22. data/functional-tests/rsync/rsync_spec.rb +9 -0
  23. data/functional-tests/vmlifecycle/Vagrantfile.advanced_networking +64 -0
  24. data/functional-tests/vmlifecycle/vmlifecycle_spec.rb +25 -0
  25. data/lib/vagrant-cosmic/action/connect_cosmic.rb +47 -0
  26. data/lib/vagrant-cosmic/action/is_created.rb +18 -0
  27. data/lib/vagrant-cosmic/action/is_stopped.rb +18 -0
  28. data/lib/vagrant-cosmic/action/message_already_created.rb +16 -0
  29. data/lib/vagrant-cosmic/action/message_not_created.rb +16 -0
  30. data/lib/vagrant-cosmic/action/message_will_not_destroy.rb +16 -0
  31. data/lib/vagrant-cosmic/action/read_rdp_info.rb +42 -0
  32. data/lib/vagrant-cosmic/action/read_ssh_info.rb +70 -0
  33. data/lib/vagrant-cosmic/action/read_state.rb +38 -0
  34. data/lib/vagrant-cosmic/action/read_transport_info.rb +59 -0
  35. data/lib/vagrant-cosmic/action/read_winrm_info.rb +69 -0
  36. data/lib/vagrant-cosmic/action/run_instance.rb +819 -0
  37. data/lib/vagrant-cosmic/action/start_instance.rb +81 -0
  38. data/lib/vagrant-cosmic/action/stop_instance.rb +28 -0
  39. data/lib/vagrant-cosmic/action/terminate_instance.rb +208 -0
  40. data/lib/vagrant-cosmic/action/timed_provision.rb +21 -0
  41. data/lib/vagrant-cosmic/action/wait_for_state.rb +41 -0
  42. data/lib/vagrant-cosmic/action/warn_networks.rb +19 -0
  43. data/lib/vagrant-cosmic/action.rb +210 -0
  44. data/lib/vagrant-cosmic/capabilities/rdp.rb +12 -0
  45. data/lib/vagrant-cosmic/capabilities/winrm.rb +12 -0
  46. data/lib/vagrant-cosmic/config.rb +422 -0
  47. data/lib/vagrant-cosmic/errors.rb +27 -0
  48. data/lib/vagrant-cosmic/exceptions/exceptions.rb +15 -0
  49. data/lib/vagrant-cosmic/model/cosmic_resource.rb +51 -0
  50. data/lib/vagrant-cosmic/plugin.rb +82 -0
  51. data/lib/vagrant-cosmic/provider.rb +58 -0
  52. data/lib/vagrant-cosmic/service/cosmic_resource_service.rb +76 -0
  53. data/lib/vagrant-cosmic/util/timer.rb +17 -0
  54. data/lib/vagrant-cosmic/version.rb +5 -0
  55. data/lib/vagrant-cosmic.rb +17 -0
  56. data/locales/en.yml +131 -0
  57. data/spec/spec_helper.rb +53 -0
  58. data/spec/vagrant-cosmic/action/read_ssh_info_spec.rb +80 -0
  59. data/spec/vagrant-cosmic/action/retrieve_public_ip_port_spec.rb +94 -0
  60. data/spec/vagrant-cosmic/action/run_instance_spec.rb +573 -0
  61. data/spec/vagrant-cosmic/action/terminate_instance_spec.rb +207 -0
  62. data/spec/vagrant-cosmic/config_spec.rb +340 -0
  63. data/spec/vagrant-cosmic/model/cosmic_resource_spec.rb +95 -0
  64. data/spec/vagrant-cosmic/service/cosmic_resource_service_spec.rb +43 -0
  65. data/spec/vagrant-cosmic/support/be_a_resource.rb +6 -0
  66. data/vagrant-cosmic.gemspec +59 -0
  67. data/vagrant-cosmic.spec +42 -0
  68. metadata +218 -0
@@ -0,0 +1,573 @@
1
+ require 'spec_helper'
2
+ require 'vagrant-cosmic/action/run_instance'
3
+ require 'vagrant-cosmic/config'
4
+
5
+ require 'vagrant'
6
+ require 'fog/cosmic'
7
+
8
+ describe VagrantPlugins::Cosmic::Action::RunInstance do
9
+ let(:action) { VagrantPlugins::Cosmic::Action::RunInstance.new(app, env) }
10
+
11
+ let(:create_servers_parameters) do
12
+ {
13
+ :display_name => DISPLAY_NAME,
14
+ :group => nil,
15
+ :zone_id => ZONE_ID,
16
+ :flavor_id => SERVICE_OFFERING_ID,
17
+ :image_id => TEMPLATE_ID,
18
+ 'network_ids' => NETWORK_ID
19
+ }
20
+ end
21
+
22
+ let(:fake_job_result) do
23
+ {
24
+ 'queryasyncjobresultresponse' => {
25
+ 'jobstatus' => 1,
26
+ 'jobresult' => {
27
+ 'portforwardingrule' => {
28
+ 'id' => PORT_FORWARDING_RULE_ID
29
+ },
30
+ 'networkacl' => {
31
+ 'id' => ACL_ID
32
+ },
33
+ 'virtualmachine' => {
34
+ 'password' => GENERATED_PASSWORD
35
+ }
36
+ }
37
+ }
38
+ }
39
+ end
40
+
41
+ let(:list_public_ip_addresses_response) do
42
+ {
43
+ 'listpublicipaddressesresponse' => {
44
+ 'count' => 1,
45
+ 'publicipaddress' =>
46
+ [
47
+ {
48
+ 'id' => PF_IP_ADDRESS_ID,
49
+ 'ipaddress' => PF_IP_ADDRESS,
50
+ 'associatednetworkid' => NETWORK_ID,
51
+ 'associatednetworkname' => NETWORK_NAME,
52
+ 'vpcid' => VPC_ID
53
+ }
54
+ ]
55
+ }
56
+ }
57
+ end
58
+
59
+ let(:network_type) { NETWORK_TYPE_ADVANCED }
60
+ let(:list_zones_response) do
61
+ {
62
+ 'listzonesresponse' => {
63
+ 'count' => 1,
64
+ 'zone' =>
65
+ [
66
+ {
67
+ 'tags' => [],
68
+ 'id' => ZONE_ID,
69
+ 'name' => ZONE_NAME,
70
+ 'networktype' => network_type,
71
+ }
72
+ ]
73
+ }
74
+ }
75
+ end
76
+
77
+ let(:list_service_offerings_response) do
78
+ {
79
+ 'listserviceofferingsresponse' => {
80
+ 'count' => 1,
81
+ 'serviceoffering' => [
82
+ {
83
+ 'id' => SERVICE_OFFERING_ID,
84
+ 'name' => SERVICE_OFFERING_NAME,
85
+ 'displaytext' => "Display version of #{SERVICE_OFFERING_NAME}"
86
+ }
87
+ ]
88
+ }
89
+ }
90
+ end
91
+
92
+ let(:list_templates_response) do
93
+ {
94
+ 'listtemplatesresponse' => {
95
+ 'count' => 1,
96
+ 'template' => [
97
+ {
98
+ 'id' => TEMPLATE_ID,
99
+ 'name' => TEMPLATE_NAME
100
+ }
101
+ ]
102
+ }
103
+ }
104
+ end
105
+
106
+ let(:list_networks_response) do
107
+ {
108
+ 'listnetworksresponse' => {
109
+ 'count' => 1,
110
+ 'network' => [
111
+ {
112
+ 'id' => NETWORK_ID,
113
+ 'name' => NETWORK_NAME,
114
+ 'vpcid' => VPC_ID,
115
+ 'aclid' => ACL_ID
116
+ }
117
+ ]
118
+ }
119
+ }
120
+ end
121
+
122
+ let(:list_network_acl_lists_response) do
123
+ {
124
+ 'listnetworkacllistsresponse' => {
125
+ 'count' => 3,
126
+ 'networkacllist' => [
127
+ {
128
+ 'id' => ACL_ID,
129
+ 'name' => NETWORK_NAME,
130
+ 'vpcid' => VPC_ID
131
+ },
132
+ {
133
+ 'id' => '13fa8945-9248-13e5-4afa-525405b8977a', 'name' => 'default_allow',
134
+ 'description' => 'Default Network ACL Allow All'
135
+ },
136
+ {
137
+ 'id' => '13fa283b-9248-13e5-4afa-525405b8977a', 'name' => 'default_deny',
138
+ 'description' => 'Default Network ACL Deny All'
139
+ }
140
+ ]
141
+ }
142
+ }
143
+ end
144
+ let(:list_disk_offerings_response) do
145
+ {
146
+ 'listdiskofferingsresponse' => {
147
+ 'count' => 1,
148
+ 'diskoffering' => [
149
+ {
150
+ 'id' => DISK_OFFERING_ID,
151
+ 'name' => DISK_OFFERING_NAME
152
+ }
153
+ ]
154
+ }
155
+ }
156
+ end
157
+
158
+ let(:create_port_forwarding_rule_parameters) do
159
+ {
160
+ networkid: NETWORK_ID,
161
+ ipaddressid: PF_IP_ADDRESS_ID,
162
+ publicport: 49_152,
163
+ privateport: GUEST_PORT_SSH,
164
+ protocol: 'tcp',
165
+ virtualmachineid: SERVER_ID
166
+ }
167
+ end
168
+
169
+ let(:create_port_forwarding_rule_respones) do
170
+ {
171
+ 'createportforwardingruleresponse' => {
172
+ 'id' => PORT_FORWARDING_RULE_ID,
173
+ 'jobid' => JOB_ID
174
+ }
175
+ }
176
+ end
177
+
178
+ let(:create_network_acl_request) do
179
+ {
180
+ command: 'createNetworkACL',
181
+ aclid: ACL_ID,
182
+ action: 'Allow',
183
+ protocol: 'tcp',
184
+ cidrlist: PF_TRUSTED_NETWORKS,
185
+ startport: GUEST_PORT_SSH,
186
+ endport: GUEST_PORT_SSH,
187
+ icmpcode: nil,
188
+ icmptype: nil,
189
+ traffictype: 'Ingress'
190
+ }
191
+ end
192
+
193
+ let(:createNetworkACL_response) do
194
+ {
195
+ 'createnetworkaclresponse' => {
196
+ 'id' => '5dcb96b5-7785-463d-9a11-d8388c98e4ee',
197
+ 'jobid' => JOB_ID
198
+ }
199
+ }
200
+ end
201
+
202
+ let(:create_ssh_key_pair_response) do
203
+ {
204
+ 'createsshkeypairresponse' => {
205
+ 'keypair' => {
206
+ 'privatekey' => "#{SSH_GENERATED_PRIVATE_KEY}\n",
207
+ 'name' => SSH_GENERATED_KEY_NAME
208
+ }
209
+ }
210
+ }
211
+ end
212
+
213
+ describe 'run_instance' do
214
+ subject { action.call(env) }
215
+ let(:app) { double('Vagrant::Action::Warden') }
216
+ let(:ssh_key) { '/some/path' }
217
+
218
+ let(:template_name) { TEMPLATE_NAME }
219
+ let(:machine) { double('Vagrant::Machine') }
220
+ let(:data_dir) { double('Pathname') }
221
+ let(:a_path) { double('Pathname') }
222
+ let(:file) { double('File') }
223
+ let(:communicator) { double('VagrantPlugins::CommunicatorSSH::Communicator') }
224
+ let(:communicator_config) { double('VagrantPlugins::...::...Config') }
225
+ let(:cosmic_compute) { double('Fog::Cosmic::Compute') }
226
+ let(:servers) { double('Fog::Cosmic::Compute::Servers') }
227
+ let(:server) { double('Fog::Cosmic::Compute::Server') }
228
+ let(:ui) { double('Vagrant::UI::Prefixed') }
229
+ let(:root_path) { double('Pathname') }
230
+ let(:env) do
231
+ {
232
+ root_path: root_path,
233
+ ui: ui,
234
+ machine: machine,
235
+ cosmic_compute: cosmic_compute
236
+ }
237
+ end
238
+
239
+ let(:cosmic_zone) do
240
+ instance_double('Fog::Cosmic::Compute::Zone',
241
+ id: ZONE_ID,
242
+ name: ZONE_NAME,
243
+ network_type: network_type)
244
+ end
245
+
246
+ before(:each) do
247
+ allow(app).to receive(:call).and_return(true)
248
+ allow(ui).to receive(:info)
249
+ allow(ui).to receive(:detail)
250
+
251
+ allow(machine).to receive(:data_dir).and_return(data_dir)
252
+ allow(data_dir).to receive(:join).and_return(a_path)
253
+ allow(a_path).to receive(:open).and_yield(file)
254
+
255
+ allow(machine).to receive(:communicate).and_return(communicator)
256
+ allow(machine).to receive_message_chain(:communicate, :ready?).and_return(true)
257
+
258
+ allow(machine).to receive(:provider_config).and_return(provider_config)
259
+ expect(server).to receive(:wait_for).and_return(ready = true)
260
+ allow(server).to receive(:job_id).and_return(JOB_ID)
261
+ allow(server).to receive(:password_enabled).and_return(false)
262
+ expect(cosmic_compute).to receive(:servers).and_return(servers)
263
+ allow(cosmic_compute).to receive(:send).with(:list_zones, available: true, name: ZONE_NAME).and_return(list_zones_response)
264
+ allow(cosmic_compute).to receive(:send).with(:list_service_offerings, listall: true, name: SERVICE_OFFERING_NAME)
265
+ .and_return(list_service_offerings_response)
266
+ allow(cosmic_compute).to receive(:send)
267
+ .with(:list_templates, zoneid: ZONE_ID, templatefilter: 'executable', listall: true, name: TEMPLATE_NAME)
268
+ .and_return(list_templates_response)
269
+ allow(cosmic_compute).to receive(:zones).and_return([cosmic_zone])
270
+ allow(servers).to receive(:create).with(create_servers_parameters).and_return(server)
271
+ expect(server).to receive(:id).and_return(SERVER_ID)
272
+ expect(machine).to receive(:id=).with(SERVER_ID)
273
+
274
+ allow(cosmic_compute).to receive(:volumes).and_return([])
275
+ end
276
+
277
+ context 'in basic zone' do
278
+ let(:network_name) { nil }
279
+ let(:provider_config) do
280
+ config = VagrantPlugins::Cosmic::Config.new
281
+ config.domain_config :cosmic do |cfg|
282
+ cfg.zone_name = ZONE_NAME
283
+ cfg.service_offering_name = SERVICE_OFFERING_NAME
284
+ cfg.template_name = template_name
285
+ cfg.display_name = DISPLAY_NAME
286
+ cfg.ssh_key = ssh_key
287
+ cfg.network_name = network_name
288
+ end
289
+ config.finalize!
290
+ config.get_domain_config(:cosmic)
291
+ end
292
+ let(:network_type) { NETWORK_TYPE_BASIC }
293
+
294
+ let(:create_servers_parameters) do
295
+ {
296
+ display_name: DISPLAY_NAME,
297
+ group: nil,
298
+ zone_id: ZONE_ID,
299
+ flavor_id: SERVICE_OFFERING_ID,
300
+ image_id: TEMPLATE_ID
301
+ }
302
+ end
303
+
304
+ context 'a basic configuration' do
305
+ it 'starts a vm' do
306
+ should eq true
307
+ end
308
+ end
309
+
310
+ context 'with advanced zone parameters give warnings' do
311
+ let(:network_name) { NETWORK_NAME }
312
+
313
+ before(:each) do
314
+ expect(ui).to receive(:warn).with("Network name or id defined but zone Zone Name is of network type 'Basic'"\
315
+ "\nNetwork name or id will be ignored")
316
+ end
317
+ it 'starts a vm' do
318
+ should eq true
319
+ end
320
+ end
321
+ end
322
+
323
+ context 'in advanced zone' do
324
+ let(:pf_ip_address) { nil }
325
+ let(:pf_trusted_networks) { nil }
326
+ let(:pf_public_port_randomrange) { { start: 49_152, end: 65_535 } }
327
+ let(:pf_open_firewall) { true }
328
+ let(:disk_offering_name) { nil }
329
+
330
+ let(:provider_config) do
331
+ config = VagrantPlugins::Cosmic::Config.new
332
+ config.domain_config :cosmic do |cfg|
333
+ cfg.zone_name = ZONE_NAME
334
+ cfg.network_name = NETWORK_NAME
335
+ cfg.service_offering_name = SERVICE_OFFERING_NAME
336
+ cfg.template_name = template_name
337
+ cfg.display_name = DISPLAY_NAME
338
+ cfg.pf_ip_address = pf_ip_address
339
+ cfg.pf_trusted_networks = pf_trusted_networks
340
+ cfg.pf_public_port_randomrange = pf_public_port_randomrange
341
+ cfg.pf_open_firewall = pf_open_firewall
342
+ cfg.ssh_key = ssh_key
343
+ cfg.disk_offering_name = disk_offering_name
344
+ end
345
+ config.finalize!
346
+ config.get_domain_config(:cosmic)
347
+ end
348
+
349
+ let(:winrm_config) { double('VagrantPlugins::VagrantWinRM::WinRMConfig') }
350
+
351
+ before(:each) do
352
+ allow(cosmic_compute).to receive(:query_async_job_result).with(jobid: JOB_ID).and_return(fake_job_result)
353
+
354
+ allow(cosmic_compute).to receive(:send).with(:list_networks, {}).and_return(list_networks_response)
355
+ end
356
+
357
+ context 'a basic configuration' do
358
+ it 'starts a vm' do
359
+ should eq true
360
+ end
361
+ end
362
+
363
+ context 'with template specified from Vagrant(file)' do
364
+ let(:template_name) { nil }
365
+
366
+ before(:each) do
367
+ expect(machine).to receive_message_chain(:config, :vm, :box).and_return(TEMPLATE_NAME)
368
+ end
369
+ it 'starts a vm' do
370
+ should eq true
371
+ end
372
+ end
373
+
374
+ context 'with additional data disk' do
375
+ let(:disk_offering_name) { DISK_OFFERING_NAME }
376
+ let(:create_servers_parameters) { super().merge('disk_offering_id' => DISK_OFFERING_ID) }
377
+ let(:volume) { double('Fog::Cosmic::Compute::Volume') }
378
+
379
+ before(:each) do
380
+ allow(cosmic_compute).to receive(:send).with(:list_disk_offerings, listall: true, name: DISK_OFFERING_NAME)
381
+ .and_return(list_disk_offerings_response)
382
+ expect(cosmic_compute).to receive(:volumes).and_return([volume])
383
+ allow(volume).to receive(:server_id).and_return(SERVER_ID)
384
+ allow(volume).to receive(:type).and_return('DATADISK')
385
+ allow(volume).to receive(:id).and_return(VOLUME_ID)
386
+ expect(file).to receive(:write).with("#{VOLUME_ID}\n")
387
+ allow(server).to receive(:id).and_return(SERVER_ID)
388
+ end
389
+ it 'starts a vm' do
390
+ should eq true
391
+ end
392
+ end
393
+
394
+ context 'with generated password' do
395
+ before(:each) do
396
+ expect(server).to receive(:password_enabled).and_return(true)
397
+ allow(server).to receive(:job_id).and_return(JOB_ID)
398
+ expect(file).to receive(:write).with(GENERATED_PASSWORD)
399
+ end
400
+
401
+ it 'starts a vm' do
402
+ should eq true
403
+ end
404
+ end
405
+
406
+ context 'with SSH key generation' do
407
+ let(:ssh_key) { nil }
408
+ let(:create_servers_parameters) { super().merge('key_name' => SSH_GENERATED_KEY_NAME) }
409
+
410
+ before(:each) do
411
+ expect(ui).to receive(:warn)
412
+ .with('No keypair or ssh_key specified to launch your instance with.' \
413
+ "\n" + 'Generating a temporary keypair for this instance...')
414
+ expect(cosmic_compute).to receive(:create_ssh_key_pair).with(/vagacs_#{DISPLAY_NAME}/, nil, nil, nil)
415
+ .and_return(create_ssh_key_pair_response)
416
+ expect(file).to receive(:write).with("#{SSH_GENERATED_PRIVATE_KEY}\n")
417
+ expect(file).to receive(:write).with(SSH_GENERATED_KEY_NAME)
418
+ end
419
+
420
+ it 'starts a vm' do
421
+ should eq true
422
+ end
423
+ end
424
+
425
+ context 'with autogenerated firewall and port forward' do
426
+ let(:pf_ip_address) { PF_IP_ADDRESS }
427
+ let(:pf_trusted_networks) { PF_TRUSTED_NETWORKS }
428
+ let(:pf_public_port_randomrange) { { start: PF_RANDOM_START, end: PF_RANDOM_START + 1 } }
429
+ let(:pf_open_firewall) { false }
430
+
431
+ before(:each) do
432
+ allow(cosmic_compute).to receive(:send).with(:list_public_ip_addresses, {})
433
+ .and_return(list_public_ip_addresses_response)
434
+ expect(communicator_config).to receive(:port).and_return(nil)
435
+ expect(communicator_config).to receive(:guest_port).and_return(nil)
436
+
437
+ allow(machine).to receive_message_chain(:config, :vm, :rdp, :port).and_return(3389)
438
+ allow(machine).to receive_message_chain(:config, :vm, :guest).and_return(nil)
439
+ allow(machine).to receive(:id).and_return(SERVER_ID)
440
+
441
+ allow(cosmic_compute).to receive(:send).with(:list_public_ip_addresses, 'id' => PF_IP_ADDRESS_ID)
442
+ .and_return(list_public_ip_addresses_response)
443
+ allow(cosmic_compute).to receive(:list_network_acl_lists).with(id: nil)
444
+ .and_return(list_network_acl_lists_response)
445
+
446
+ expect(file).to receive(:write).with(PORT_FORWARDING_RULE_ID + "\n")
447
+ expect(file).to receive(:write).with(PF_RANDOM_START.to_s)
448
+ expect(file).to receive(:write).with("#{ACL_ID},networkacl\n")
449
+ end
450
+
451
+ context 'for the SSH communicator' do
452
+ before(:each) do
453
+ allow(communicator).to receive_message_chain(:class, :name).and_return(COMMUNICATOR_SSH)
454
+ expect(machine).to receive_message_chain(:config, :ssh).and_return(communicator_config)
455
+
456
+ allow(communicator_config).to receive_message_chain(:default, :port).and_return(GUEST_PORT_SSH)
457
+ expect(cosmic_compute).to receive(:create_port_forwarding_rule)
458
+ .with(create_port_forwarding_rule_parameters)
459
+ .and_return(create_port_forwarding_rule_respones)
460
+ expect(cosmic_compute).to receive(:request)
461
+ .with(create_network_acl_request)
462
+ .and_return(createNetworkACL_response)
463
+ end
464
+ it 'starts a vm' do
465
+ should eq true
466
+ end
467
+
468
+ context 'with a port conflict' do
469
+ let(:pf_public_port_randomrange) { { start: PF_RANDOM_START - 1, end: PF_RANDOM_START + 1 } }
470
+
471
+ before(:each) do
472
+ allow(Kernel).to receive(:rand).with((PF_RANDOM_START - 1)...(PF_RANDOM_START + 1))
473
+ .and_return(PF_RANDOM_START - 1, PF_RANDOM_START)
474
+ expect(cosmic_compute).to receive(:create_port_forwarding_rule)
475
+ .with(create_port_forwarding_rule_parameters.merge(publicport: PF_RANDOM_START - 1))
476
+ .and_raise(
477
+ Fog::Cosmic::Compute::Error,
478
+ 'The range specified, CONFLICTINGRANGE, conflicts with rule SOMERULE which has THESAME'
479
+ )
480
+ end
481
+
482
+ it 'starts a vm' do
483
+ should eq true
484
+ end
485
+ end
486
+ end
487
+
488
+ context 'for the WinRM (and RDP) communicator' do
489
+ PF_RDP_RULE_ID = 'UUID RDP port forwarding rule'.freeze
490
+ PF_RDP_JOB_ID = 'UUID RDP Port Forward Job'.freeze
491
+ FW_RDP_JOB_ID = 'UUID RDP Port Firewall Job'.freeze
492
+ FW_RDP_ACL_ID = 'UUID of RDP ACL'.freeze
493
+
494
+ let(:pf_public_port_randomrange) { { start: PF_RANDOM_START, end: PF_RANDOM_START + 2 } }
495
+
496
+ let(:create_port_forwarding_rule_parameters) { super().merge(privateport: GUEST_PORT_WINRM) }
497
+ let(:create_port_forwarding_rule_rdp_parameters) do
498
+ create_port_forwarding_rule_parameters.merge(privateport: GUEST_PORT_RDP, publicport: PF_RANDOM_START + 1)
499
+ end
500
+
501
+ let(:create_network_acl_winrm_request) do
502
+ create_network_acl_request.merge(startport: GUEST_PORT_WINRM, endport: GUEST_PORT_WINRM)
503
+ end
504
+ let(:create_network_acl_rdp_request) do
505
+ create_network_acl_request.merge(startport: GUEST_PORT_RDP, endport: GUEST_PORT_RDP)
506
+ end
507
+
508
+ before(:each) do
509
+ allow(Kernel).to receive(:rand).with(PF_RANDOM_START...(PF_RANDOM_START + 2))
510
+ .and_return(PF_RANDOM_START, PF_RANDOM_START + 1)
511
+
512
+ allow(communicator).to receive_message_chain(:class, :name).and_return(COMMUNICATOR_WINRM)
513
+ expect(machine).to receive_message_chain(:config, :winrm).and_return(communicator_config)
514
+
515
+ allow(communicator_config).to receive_message_chain(:default, :port).and_return(GUEST_PORT_WINRM)
516
+
517
+ expect(cosmic_compute).to receive(:create_port_forwarding_rule)
518
+ .with(create_port_forwarding_rule_parameters)
519
+ .and_return(create_port_forwarding_rule_respones)
520
+
521
+ expect(cosmic_compute).to receive(:create_port_forwarding_rule)
522
+ .with(create_port_forwarding_rule_rdp_parameters).and_return(
523
+ 'createportforwardingruleresponse' =>
524
+ {
525
+ 'id' => PF_RDP_RULE_ID,
526
+ 'jobid' => PF_RDP_JOB_ID
527
+ }
528
+ )
529
+ allow(cosmic_compute).to receive(:query_async_job_result).with(jobid: PF_RDP_JOB_ID)
530
+ .and_return(fake_job_result.merge(
531
+ 'queryasyncjobresultresponse' => {
532
+ 'jobresult' => {
533
+ 'portforwardingrule' => {
534
+ 'id' => PF_RDP_RULE_ID
535
+ }
536
+ }
537
+ }
538
+ ))
539
+ expect(file).to receive(:write).with(PF_RDP_RULE_ID + "\n")
540
+ expect(file).to receive(:write).with((PF_RANDOM_START + 1).to_s)
541
+ expect(cosmic_compute).to receive(:request).with(create_network_acl_winrm_request)
542
+ .and_return(createNetworkACL_response)
543
+
544
+ expect(cosmic_compute).to receive(:request).with(create_network_acl_rdp_request)
545
+ .and_return(
546
+ 'createnetworkaclresponse' => {
547
+ 'id' => '5dcb96b5-7785-463d-9a11-d8388c98e4ee',
548
+ 'jobid' => FW_RDP_JOB_ID
549
+ }
550
+ )
551
+ allow(cosmic_compute).to receive(:query_async_job_result).with(jobid: FW_RDP_JOB_ID)
552
+ .and_return(
553
+ fake_job_result.merge(
554
+ 'queryasyncjobresultresponse' => {
555
+ 'jobstatus' => 1,
556
+ 'jobresult' => {
557
+ 'networkacl' => {
558
+ 'id' => FW_RDP_ACL_ID
559
+ }
560
+ }
561
+ }
562
+ )
563
+ )
564
+ expect(file).to receive(:write).with("#{FW_RDP_ACL_ID},networkacl\n")
565
+ end
566
+ it 'starts a vm' do
567
+ should eq true
568
+ end
569
+ end
570
+ end
571
+ end
572
+ end
573
+ end