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