vcloud-launcher 0.0.5 → 0.1.0
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.
- data/.gitignore +1 -0
- data/.travis.yml +0 -3
- data/CHANGELOG.md +11 -0
- data/README.md +8 -42
- data/examples/vcloud-launch/complete_vapp_config.yaml +3 -2
- data/examples/vcloud-launch/minimal_vapp_config.yaml +2 -2
- data/examples/vcloud-launch/multiple_vapps_simple.yaml +6 -6
- data/examples/vcloud-launch/yaml_anchors_example.yaml +5 -5
- data/jenkins.sh +8 -0
- data/jenkins_integration_tests.sh +9 -0
- data/lib/vcloud/launcher.rb +4 -0
- data/lib/vcloud/launcher/launch.rb +1 -17
- data/lib/vcloud/launcher/schema/launcher_vapps.rb +21 -0
- data/lib/vcloud/launcher/schema/vapp.rb +22 -0
- data/lib/vcloud/launcher/schema/vm.rb +63 -0
- data/lib/vcloud/launcher/vapp_orchestrator.rb +3 -16
- data/lib/vcloud/launcher/version.rb +1 -1
- data/lib/vcloud/launcher/vm_orchestrator.rb +1 -57
- data/spec/integration/README.md +40 -0
- data/spec/integration/launcher/data/happy_path.yaml.erb +6 -6
- data/spec/integration/launcher/data/minimum_data_setup.yaml.erb +2 -2
- data/spec/integration/launcher/data/storage_profile.yaml.erb +12 -12
- data/spec/integration/launcher/storage_profile_integration_spec.rb +23 -19
- data/spec/integration/launcher/vcloud_launcher_spec.rb +22 -18
- data/spec/integration/vcloud_tools_testing_config.yaml.template +14 -0
- data/spec/vcloud/launcher/launch_spec.rb +57 -59
- data/spec/vcloud/launcher/vapp_orchestrator_spec.rb +70 -37
- data/spec/vcloud/launcher/vm_orchestrator_spec.rb +68 -66
- data/vcloud-launcher.gemspec +3 -1
- metadata +44 -5
@@ -0,0 +1,40 @@
|
|
1
|
+
# Running vCloud Launcher Integration Tests
|
2
|
+
|
3
|
+
## Prerequisites
|
4
|
+
|
5
|
+
- Access to a suitable vCloud Director organisation.
|
6
|
+
|
7
|
+
**NB** It is not safe to run them against an environment that is in use (e.g. production, preview) as
|
8
|
+
many of the tests clear down all config at the beginning and/or end to ensure the environment is as
|
9
|
+
the tests expect.
|
10
|
+
|
11
|
+
- A config file with the settings configured.
|
12
|
+
|
13
|
+
There is a [template file](/spec/integration/vcloud_tools_testing_config.yaml.template) to help with this. Copy the template file to `/spec/integration` (i.e. next to the template file) and remove the `.template`. This file will now be ignored by Git and you can safely add the parameters relevant to your environment.
|
14
|
+
|
15
|
+
- You need to include the set-up for your testing environment in your [fog file](https://github.com/alphagov/vcloud-launcher#credentials).
|
16
|
+
|
17
|
+
- The tests use the [vCloud Tools Tester](http://rubygems.org/gems/vcloud-tools-tester) gem. You do not need to install this, `bundler` will do this for you.
|
18
|
+
|
19
|
+
## Parameters
|
20
|
+
|
21
|
+
````
|
22
|
+
default: # This is the fog credential that refers to your testing environment, e.g. `test_credential`
|
23
|
+
vdc_1_name: # The name of a VDC
|
24
|
+
vdc_2_name: # The name of another VDC - you need two in your organisation to run these tests
|
25
|
+
catalog: # A catalog
|
26
|
+
vapp_template: # A vApp Template within that catalog
|
27
|
+
network_1: # The name of the primary network
|
28
|
+
network_1_ip: # The IP address of the primary network
|
29
|
+
network_2: # The name of a secondary network
|
30
|
+
network_2_ip: # The IP address of the secondary network
|
31
|
+
storage_profile: # The name of a storage profile (not the default)
|
32
|
+
default_storage_profile_name: # The name of the default storage profile
|
33
|
+
default_storage_profile_href: # The href of the default storage profile
|
34
|
+
vdc_1_storage_profile_href: # The href of `storage_profile` in `vdc_1`
|
35
|
+
vdc_2_storage_profile_href: # The href of `storage_profile` in `vdc_2`
|
36
|
+
````
|
37
|
+
|
38
|
+
## To run the tests
|
39
|
+
|
40
|
+
`FOG_CREDENTIAL=test_credential bundle exec integration`
|
@@ -2,8 +2,8 @@
|
|
2
2
|
vapps:
|
3
3
|
- name: <%= vapp_name %>
|
4
4
|
vdc_name: <%= vdc_name %>
|
5
|
-
|
6
|
-
|
5
|
+
catalog_name: <%= catalog %>
|
6
|
+
vapp_template_name: <%= vapp_template %>
|
7
7
|
vm:
|
8
8
|
hardware_config:
|
9
9
|
memory: 8192
|
@@ -21,10 +21,10 @@ vapps:
|
|
21
21
|
- size: '2048'
|
22
22
|
name: Hard disk 3
|
23
23
|
network_connections:
|
24
|
-
- name: <%=
|
25
|
-
ip_address: <%=
|
26
|
-
- name: <%=
|
27
|
-
ip_address: <%=
|
24
|
+
- name: <%= network_1 %>
|
25
|
+
ip_address: <%= network_1_ip %>
|
26
|
+
- name: <%= network_2 %>
|
27
|
+
ip_address: <%= network_2_ip %>
|
28
28
|
bootstrap:
|
29
29
|
script_path: <%= bootstrap_script %>
|
30
30
|
vars:
|
@@ -1,9 +1,9 @@
|
|
1
1
|
---
|
2
2
|
vapps:
|
3
3
|
- name: <%= vapp_name_1 %>
|
4
|
-
vdc_name: <%=
|
5
|
-
|
6
|
-
|
4
|
+
vdc_name: <%= vdc_1_name %>
|
5
|
+
catalog_name: <%= catalog %>
|
6
|
+
vapp_template_name: <%= vapp_template %>
|
7
7
|
vm:
|
8
8
|
hardware_config: &hardware_config
|
9
9
|
memory: 4096
|
@@ -14,9 +14,9 @@ vapps:
|
|
14
14
|
message: hello world
|
15
15
|
storage_profile: <%= storage_profile %>
|
16
16
|
- name: <%= vapp_name_2 %>
|
17
|
-
vdc_name: <%=
|
18
|
-
|
19
|
-
|
17
|
+
vdc_name: <%= vdc_2_name %>
|
18
|
+
catalog_name: <%= catalog %>
|
19
|
+
vapp_template_name: <%= vapp_template %>
|
20
20
|
vm:
|
21
21
|
hardware_config:
|
22
22
|
<<: *hardware_config
|
@@ -24,9 +24,9 @@ vapps:
|
|
24
24
|
<<: *bootstrap
|
25
25
|
storage_profile: <%= storage_profile %>
|
26
26
|
- name: <%= vapp_name_3 %>
|
27
|
-
vdc_name: <%=
|
28
|
-
|
29
|
-
|
27
|
+
vdc_name: <%= vdc_1_name %>
|
28
|
+
catalog_name: <%= catalog %>
|
29
|
+
vapp_template_name: <%= vapp_template %>
|
30
30
|
vm:
|
31
31
|
hardware_config:
|
32
32
|
<<: *hardware_config
|
@@ -35,9 +35,9 @@ vapps:
|
|
35
35
|
bootstrap:
|
36
36
|
<<: *bootstrap
|
37
37
|
- name: <%= vapp_name_4 %>
|
38
|
-
vdc_name: <%=
|
39
|
-
|
40
|
-
|
38
|
+
vdc_name: <%= vdc_1_name %>
|
39
|
+
catalog_name: <%= catalog %>
|
40
|
+
vapp_template_name: <%= vapp_template %>
|
41
41
|
vm:
|
42
42
|
hardware_config:
|
43
43
|
<<: *hardware_config
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'vcloud/tools/tester'
|
2
3
|
|
3
4
|
describe Vcloud::Launcher::Launch do
|
4
5
|
context "storage profile", :take_too_long => true do
|
@@ -8,22 +9,22 @@ describe Vcloud::Launcher::Launch do
|
|
8
9
|
@fog_interface = Vcloud::Fog::ServiceInterface.new
|
9
10
|
Vcloud::Launcher::Launch.new.run(@config_yaml, {'dont-power-on' => true})
|
10
11
|
|
11
|
-
@vapp_query_result_1 = @fog_interface.get_vapp_by_name_and_vdc_name(@test_data[:vapp_name_1], @test_data[:
|
12
|
+
@vapp_query_result_1 = @fog_interface.get_vapp_by_name_and_vdc_name(@test_data[:vapp_name_1], @test_data[:vdc_1_name])
|
12
13
|
@vapp_id_1 = @vapp_query_result_1[:href].split('/').last
|
13
14
|
@vapp_1 = @fog_interface.get_vapp @vapp_id_1
|
14
15
|
@vm_1 = @vapp_1[:Children][:Vm].first
|
15
16
|
|
16
|
-
@vapp_query_result_2 = @fog_interface.get_vapp_by_name_and_vdc_name(@test_data[:vapp_name_2], @test_data[:
|
17
|
+
@vapp_query_result_2 = @fog_interface.get_vapp_by_name_and_vdc_name(@test_data[:vapp_name_2], @test_data[:vdc_2_name])
|
17
18
|
@vapp_id_2 = @vapp_query_result_2[:href].split('/').last
|
18
19
|
@vapp_2 = @fog_interface.get_vapp @vapp_id_2
|
19
20
|
@vm_2 = @vapp_2[:Children][:Vm].first
|
20
21
|
|
21
|
-
@vapp_query_result_3 = @fog_interface.get_vapp_by_name_and_vdc_name(@test_data[:vapp_name_3], @test_data[:
|
22
|
+
@vapp_query_result_3 = @fog_interface.get_vapp_by_name_and_vdc_name(@test_data[:vapp_name_3], @test_data[:vdc_1_name])
|
22
23
|
@vapp_id_3 = @vapp_query_result_3[:href].split('/').last
|
23
24
|
@vapp_3 = @fog_interface.get_vapp @vapp_id_3
|
24
25
|
@vm_3 = @vapp_3[:Children][:Vm].first
|
25
26
|
|
26
|
-
@vapp_query_result_4 = @fog_interface.get_vapp_by_name_and_vdc_name(@test_data[:vapp_name_4], @test_data[:
|
27
|
+
@vapp_query_result_4 = @fog_interface.get_vapp_by_name_and_vdc_name(@test_data[:vapp_name_4], @test_data[:vdc_1_name])
|
27
28
|
@vapp_id_4 = @vapp_query_result_4[:href].split('/').last
|
28
29
|
@vapp_4 = @fog_interface.get_vapp @vapp_id_4
|
29
30
|
@vm_4 = @vapp_4[:Children][:Vm].first
|
@@ -83,21 +84,24 @@ describe Vcloud::Launcher::Launch do
|
|
83
84
|
end
|
84
85
|
|
85
86
|
def define_test_data
|
87
|
+
config_file = File.join(File.dirname(__FILE__),
|
88
|
+
"../vcloud_tools_testing_config.yaml")
|
89
|
+
parameters = Vcloud::Tools::Tester::TestParameters.new(config_file)
|
86
90
|
{
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
91
|
+
vapp_name_1: "vdc-1-sp-#{Time.now.strftime('%s')}",
|
92
|
+
vapp_name_2: "vdc-2-sp-#{Time.now.strftime('%s')}",
|
93
|
+
vapp_name_3: "vdc-3-sp-#{Time.now.strftime('%s')}",
|
94
|
+
vapp_name_4: "vdc-4-sp-#{Time.now.strftime('%s')}",
|
95
|
+
vdc_1_name: parameters.vdc_1_name,
|
96
|
+
vdc_2_name: parameters.vdc_2_name,
|
97
|
+
catalog: parameters.catalog,
|
98
|
+
vapp_template: parameters.vapp_template,
|
99
|
+
storage_profile: parameters.storage_profile,
|
100
|
+
vdc_1_sp_href: parameters.vdc_1_storage_profile_href,
|
101
|
+
vdc_2_sp_href: parameters.vdc_2_storage_profile_href,
|
102
|
+
default_storage_profile_name: parameters.default_storage_profile_name,
|
103
|
+
default_storage_profile_href: parameters.default_storage_profile_href,
|
104
|
+
nonsense_storage_profile: "nonsense-storage-profile-name",
|
105
|
+
bootstrap_script: File.join(File.dirname(__FILE__), "data/basic_preamble_test.erb"),
|
102
106
|
}
|
103
107
|
end
|
@@ -2,6 +2,7 @@ require 'spec_helper'
|
|
2
2
|
require 'pp'
|
3
3
|
require 'erb'
|
4
4
|
require 'ostruct'
|
5
|
+
require 'vcloud/tools/tester'
|
5
6
|
|
6
7
|
describe Vcloud::Launcher::Launch do
|
7
8
|
context "with minimum input setup" do
|
@@ -52,7 +53,7 @@ describe Vcloud::Launcher::Launch do
|
|
52
53
|
@vapp[:name].should eq(@test_data[:vapp_name])
|
53
54
|
@vapp[:'ovf:NetworkSection'][:'ovf:Network'].count.should eq(2)
|
54
55
|
vapp_networks = @vapp[:'ovf:NetworkSection'][:'ovf:Network'].collect { |connection| connection[:ovf_name] }
|
55
|
-
vapp_networks.should =~ [@test_data[:
|
56
|
+
vapp_networks.should =~ [@test_data[:network_1], @test_data[:network_2]]
|
56
57
|
end
|
57
58
|
|
58
59
|
it "should create vm within vapp" do
|
@@ -91,16 +92,16 @@ describe Vcloud::Launcher::Launch do
|
|
91
92
|
vm_network_connection.count.should eq(2)
|
92
93
|
|
93
94
|
|
94
|
-
primary_nic = vm_network_connection.detect { |connection| connection[:network] == @test_data[:
|
95
|
-
primary_nic[:network].should eq(@test_data[:
|
95
|
+
primary_nic = vm_network_connection.detect { |connection| connection[:network] == @test_data[:network_1] }
|
96
|
+
primary_nic[:network].should eq(@test_data[:network_1])
|
96
97
|
primary_nic[:NetworkConnectionIndex].should eq(@vm[:NetworkConnectionSection][:PrimaryNetworkConnectionIndex])
|
97
|
-
primary_nic[:IpAddress].should eq(@test_data[:
|
98
|
+
primary_nic[:IpAddress].should eq(@test_data[:network_1_ip])
|
98
99
|
primary_nic[:IpAddressAllocationMode].should eq('MANUAL')
|
99
100
|
|
100
|
-
second_nic = vm_network_connection.detect { |connection| connection[:network] == @test_data[:
|
101
|
-
second_nic[:network].should eq(@test_data[:
|
101
|
+
second_nic = vm_network_connection.detect { |connection| connection[:network] == @test_data[:network_2] }
|
102
|
+
second_nic[:network].should eq(@test_data[:network_2])
|
102
103
|
second_nic[:NetworkConnectionIndex].should eq('1')
|
103
|
-
second_nic[:IpAddress].should eq(@test_data[:
|
104
|
+
second_nic[:IpAddress].should eq(@test_data[:network_2_ip])
|
104
105
|
second_nic[:IpAddressAllocationMode].should eq('MANUAL')
|
105
106
|
|
106
107
|
end
|
@@ -140,18 +141,21 @@ describe Vcloud::Launcher::Launch do
|
|
140
141
|
end
|
141
142
|
|
142
143
|
def define_test_data
|
144
|
+
config_file = File.join(File.dirname(__FILE__),
|
145
|
+
"../vcloud_tools_testing_config.yaml")
|
146
|
+
parameters = Vcloud::Tools::Tester::TestParameters.new(config_file)
|
143
147
|
{
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
148
|
+
vapp_name: "vapp-vcloud-tools-tests-#{Time.now.strftime('%s')}",
|
149
|
+
vdc_name: parameters.vdc_1_name,
|
150
|
+
catalog: parameters.catalog,
|
151
|
+
vapp_template: parameters.vapp_template,
|
152
|
+
storage_profile: parameters.storage_profile,
|
153
|
+
network_1: parameters.network_1,
|
154
|
+
network_2: parameters.network_2,
|
155
|
+
network_1_ip: parameters.network_1_ip,
|
156
|
+
network_2_ip: parameters.network_2_ip,
|
157
|
+
bootstrap_script: File.join(File.dirname(__FILE__), "data/basic_preamble_test.erb"),
|
158
|
+
date_metadata: DateTime.parse('2013-10-23 15:34:00 +0000')
|
155
159
|
}
|
156
160
|
end
|
157
161
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
default:
|
2
|
+
vdc_1_name:
|
3
|
+
vdc_2_name:
|
4
|
+
catalog:
|
5
|
+
vapp_template:
|
6
|
+
network_1:
|
7
|
+
network_1_ip:
|
8
|
+
network_2:
|
9
|
+
network_2_ip:
|
10
|
+
storage_profile:
|
11
|
+
default_storage_profile_name:
|
12
|
+
default_storage_profile_href:
|
13
|
+
vdc_1_storage_profile_href:
|
14
|
+
vdc_2_storage_profile_href:
|
@@ -1,76 +1,74 @@
|
|
1
1
|
require 'spec_helper'
|
2
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
|
-
end
|
30
|
-
|
31
|
-
it "should stop on failure by default" do
|
32
|
-
expect(Vcloud::Launcher::VappOrchestrator).to receive(:provision).with(@successful_app_1).and_return(double(:vapp, :power_on => true))
|
33
|
-
expect(Vcloud::Launcher::VappOrchestrator).to receive(:provision).with(@fake_failing_app).and_raise(RuntimeError.new('failed to find vdc'))
|
34
|
-
expect(Vcloud::Launcher::VappOrchestrator).not_to receive(:provision).with(@successful_app_2)
|
3
|
+
describe Vcloud::Launcher::Launch do
|
4
|
+
context "#run" do
|
5
|
+
before(:each) do
|
6
|
+
config_loader = double(:config_loader)
|
7
|
+
expect(Vcloud::Core::ConfigLoader).to receive(:new).and_return(config_loader)
|
8
|
+
@successful_app_1 = {
|
9
|
+
:name => "successful app 1",
|
10
|
+
:vdc_name => "Test Vdc",
|
11
|
+
:catalog_name => "default",
|
12
|
+
:vapp_template_name => "ubuntu-precise"
|
13
|
+
}
|
14
|
+
@fake_failing_app = {
|
15
|
+
:name => "fake failing app",
|
16
|
+
:vdc_name => "wrong vdc",
|
17
|
+
:catalog_name => "default",
|
18
|
+
:vapp_template_name => "ubuntu-precise"
|
19
|
+
}
|
20
|
+
@successful_app_2 = {
|
21
|
+
:name => "successful app 2",
|
22
|
+
:vdc_name => "Test Vdc",
|
23
|
+
:catalog_name => "default",
|
24
|
+
:vapp_template_name => "ubuntu-precise"
|
25
|
+
}
|
26
|
+
expect(config_loader).to receive(:load_config).
|
27
|
+
and_return({:vapps => [@successful_app_1, @fake_failing_app, @successful_app_2]})
|
28
|
+
end
|
35
29
|
|
36
|
-
|
37
|
-
|
38
|
-
|
30
|
+
it "should stop on failure by default" do
|
31
|
+
expect(Vcloud::Launcher::VappOrchestrator).to receive(:provision).with(@successful_app_1).and_return(double(:vapp, :power_on => true))
|
32
|
+
expect(Vcloud::Launcher::VappOrchestrator).to receive(:provision).with(@fake_failing_app).and_raise(RuntimeError.new('failed to find vdc'))
|
33
|
+
expect(Vcloud::Launcher::VappOrchestrator).not_to receive(:provision).with(@successful_app_2)
|
39
34
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
expect(Vcloud::Launcher::VappOrchestrator).to receive(:provision).with(@successful_app_2).and_return(double(:vapp, :power_on => true))
|
35
|
+
cli_options = {}
|
36
|
+
subject.run('input_config_yaml', cli_options)
|
37
|
+
end
|
44
38
|
|
45
|
-
|
46
|
-
|
47
|
-
|
39
|
+
it "should continue on error if cli option continue-on-error is set" do
|
40
|
+
expect(Vcloud::Launcher::VappOrchestrator).to receive(:provision).with(@successful_app_1).and_return(double(:vapp, :power_on => true))
|
41
|
+
expect(Vcloud::Launcher::VappOrchestrator).to receive(:provision).with(@fake_failing_app).and_raise(RuntimeError.new('failed to find vdc'))
|
42
|
+
expect(Vcloud::Launcher::VappOrchestrator).to receive(:provision).with(@successful_app_2).and_return(double(:vapp, :power_on => true))
|
48
43
|
|
44
|
+
cli_options = {"continue-on-error" => true}
|
45
|
+
subject.run('input_config_yaml', cli_options)
|
49
46
|
end
|
50
47
|
|
51
|
-
|
48
|
+
end
|
52
49
|
|
53
|
-
|
54
|
-
expect(Vcloud::Core.logger).to receive(:level=).with(Logger::DEBUG)
|
55
|
-
Vcloud::Launcher::Launch.new.set_logging_level(:verbose => true)
|
56
|
-
end
|
50
|
+
context "#set_logging_level" do
|
57
51
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
52
|
+
it "sets the logging level to DEBUG when :verbose is specified" do
|
53
|
+
expect(Vcloud::Core.logger).to receive(:level=).with(Logger::DEBUG)
|
54
|
+
subject.set_logging_level(:verbose => true)
|
55
|
+
end
|
62
56
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
57
|
+
it "sets the logging level to ERROR when :quiet is specified" do
|
58
|
+
expect(Vcloud::Core.logger).to receive(:level=).with(Logger::ERROR)
|
59
|
+
subject.set_logging_level(:quiet => true)
|
60
|
+
end
|
67
61
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
62
|
+
it "sets the logging level to DEBUG when :quiet and :verbose are specified" do
|
63
|
+
expect(Vcloud::Core.logger).to receive(:level=).with(Logger::DEBUG)
|
64
|
+
subject.set_logging_level(:quiet => true, :verbose => true)
|
65
|
+
end
|
72
66
|
|
67
|
+
it "sets the logging level to INFO by default" do
|
68
|
+
expect(Vcloud::Core.logger).to receive(:level=).with(Logger::INFO)
|
69
|
+
subject.set_logging_level({})
|
73
70
|
end
|
74
71
|
|
75
72
|
end
|
73
|
+
|
76
74
|
end
|
@@ -1,52 +1,85 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
3
|
+
describe Vcloud::Launcher::VappOrchestrator do
|
4
|
+
# Testing class methods rather than instance methods.
|
5
|
+
let(:subject) { Vcloud::Launcher::VappOrchestrator }
|
6
|
+
|
7
|
+
context "provision a vapp" do
|
8
|
+
|
9
|
+
let(:mock_fog_vm) {
|
10
|
+
double(:vm)
|
11
|
+
}
|
12
|
+
let(:mock_vapp) {
|
13
|
+
double(:vapp, :fog_vms => [mock_fog_vm], :reload => self)
|
14
|
+
}
|
15
|
+
let(:mock_vm_orchestrator) {
|
16
|
+
double(:vm_orchestrator, :customize => true)
|
17
|
+
}
|
18
|
+
|
19
|
+
before(:each) do
|
20
|
+
@config = {
|
21
|
+
:name => 'test-vapp-1',
|
22
|
+
:vdc_name => 'test-vdc-1',
|
23
|
+
:catalog_name => 'org-1-catalog',
|
24
|
+
:vapp_template_name => 'org-1-template',
|
25
|
+
:vm => {
|
26
|
+
:network_connections => [{:name => 'org-vdc-1-net-1'}]
|
18
27
|
}
|
19
|
-
|
28
|
+
}
|
29
|
+
end
|
20
30
|
|
21
|
-
|
22
|
-
|
31
|
+
it "should return a vapp if it already exists" do
|
32
|
+
existing_vapp = double(:vapp, :name => 'existing-vapp-1')
|
23
33
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
34
|
+
Vcloud::Core::Vapp.should_receive(:get_by_name_and_vdc_name).with('test-vapp-1', 'test-vdc-1').and_return(existing_vapp)
|
35
|
+
Vcloud::Core.logger.should_receive(:info).with('Found existing vApp test-vapp-1 in vDC \'test-vdc-1\'. Skipping.')
|
36
|
+
actual_vapp = subject.provision @config
|
37
|
+
actual_vapp.should_not be_nil
|
38
|
+
actual_vapp.should == existing_vapp
|
39
|
+
end
|
30
40
|
|
31
|
-
|
32
|
-
|
33
|
-
mock_fog_vm = double(:vm)
|
34
|
-
mock_vapp = double(:vapp, :fog_vms => [mock_fog_vm], :reload => self)
|
35
|
-
mock_vm_orchestrator = double(:vm_orchestrator, :customize => true)
|
41
|
+
it "should create a vapp if it does not exist" do
|
42
|
+
#this test highlights the problems in vapp
|
36
43
|
|
44
|
+
Vcloud::Core::Vapp.should_receive(:get_by_name_and_vdc_name).with('test-vapp-1', 'test-vdc-1').and_return(nil)
|
45
|
+
Vcloud::Core::VappTemplate.should_receive(:get).with('org-1-template', 'org-1-catalog').and_return(double(:vapp_template, :id => 1))
|
37
46
|
|
38
|
-
|
39
|
-
|
47
|
+
Vcloud::Core::Vapp.should_receive(:instantiate).with('test-vapp-1', ['org-vdc-1-net-1'], 1, 'test-vdc-1')
|
48
|
+
.and_return(mock_vapp)
|
49
|
+
Vcloud::Launcher::VmOrchestrator.should_receive(:new).with(mock_fog_vm, mock_vapp).and_return(mock_vm_orchestrator)
|
40
50
|
|
41
|
-
|
42
|
-
|
43
|
-
|
51
|
+
new_vapp = subject.provision @config
|
52
|
+
new_vapp.should == mock_vapp
|
53
|
+
end
|
44
54
|
|
45
|
-
|
46
|
-
|
47
|
-
|
55
|
+
context "deprecated config items" do
|
56
|
+
let(:mock_vapp_template) {
|
57
|
+
double(:vapp_template, :id => 2)
|
58
|
+
}
|
59
|
+
before(:each) {
|
60
|
+
Vcloud::Core::Vapp.stub(:get_by_name_and_vdc_name)
|
61
|
+
Vcloud::Core::Vapp.stub(:instantiate).and_return(mock_vapp)
|
62
|
+
Vcloud::Launcher::VmOrchestrator.stub(:new).and_return(mock_vm_orchestrator)
|
63
|
+
}
|
48
64
|
|
65
|
+
it "should use catalog_item when vapp_template_name is not present" do
|
66
|
+
config = @config.clone
|
67
|
+
config.delete(:vapp_template_name)
|
68
|
+
config[:catalog_item] = 'deprecated-template'
|
69
|
+
|
70
|
+
Vcloud::Core::VappTemplate.should_receive(:get).with('deprecated-template', 'org-1-catalog').and_return(mock_vapp_template)
|
71
|
+
Vcloud::Launcher::VappOrchestrator.provision(config)
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should use catalog when catalog_name is not present" do
|
75
|
+
config = @config.clone
|
76
|
+
config.delete(:catalog_name)
|
77
|
+
config[:catalog] = 'deprecated-catalog'
|
78
|
+
|
79
|
+
Vcloud::Core::VappTemplate.should_receive(:get).with('org-1-template', 'deprecated-catalog').and_return(mock_vapp_template)
|
80
|
+
Vcloud::Launcher::VappOrchestrator.provision(config)
|
49
81
|
end
|
50
82
|
end
|
83
|
+
|
51
84
|
end
|
52
85
|
end
|