vcloud-launcher 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,9 @@
1
+ ## 0.7.0 (2014-12-05)
2
+
3
+ Features:
4
+
5
+ - Supports attaching of independent disks to VMs.
6
+
1
7
  ## 0.6.0 (2014-12-03)
2
8
 
3
9
  Features:
@@ -7,6 +7,7 @@ require 'vcloud/launcher/schema/launcher_vapps'
7
7
 
8
8
  require 'vcloud/launcher/launch'
9
9
  require 'vcloud/launcher/preamble'
10
+ require 'vcloud/launcher/independent_disk_orchestrator'
10
11
  require 'vcloud/launcher/vm_orchestrator'
11
12
  require 'vcloud/launcher/vapp_orchestrator'
12
13
 
@@ -0,0 +1,29 @@
1
+ module Vcloud
2
+ module Launcher
3
+ class IndependentDiskOrchestrator
4
+
5
+ def initialize(vm)
6
+ @vm = vm
7
+ end
8
+
9
+ def attach(independent_disks_config)
10
+ disk_list = find_disks(independent_disks_config)
11
+ @vm.attach_independent_disks(disk_list)
12
+ end
13
+
14
+ def vdc_name
15
+ return @vdc_name if @vdc_name
16
+ parent_vapp = Vcloud::Core::Vapp.get_by_child_vm_id(@vm.id)
17
+ parent_vdc = Vcloud::Core::Vdc.new(parent_vapp.vdc_id)
18
+ @vdc_name = parent_vdc.name
19
+ end
20
+
21
+ def find_disks(independent_disks_config)
22
+ independent_disks_config.map do |disk|
23
+ Vcloud::Core::IndependentDisk.get_by_name_and_vdc_name(disk[:name], vdc_name)
24
+ end
25
+ end
26
+
27
+ end
28
+ end
29
+ end
@@ -40,6 +40,17 @@ module Vcloud
40
40
  },
41
41
  },
42
42
  },
43
+ independent_disks: {
44
+ type: 'array',
45
+ required: false,
46
+ allowed_empty: true,
47
+ each_element_is: {
48
+ type: 'hash',
49
+ internals: {
50
+ name: { type: 'string', required: true },
51
+ },
52
+ },
53
+ },
43
54
  bootstrap: {
44
55
  type: 'hash',
45
56
  required: false,
@@ -1,5 +1,5 @@
1
1
  module Vcloud
2
2
  module Launcher
3
- VERSION = '0.6.0'
3
+ VERSION = '0.7.0'
4
4
  end
5
5
  end
@@ -17,6 +17,9 @@ module Vcloud
17
17
  end
18
18
  @vm.add_extra_disks(vm_config[:extra_disks])
19
19
  @vm.update_metadata(vm_config[:metadata])
20
+ if vm_config.key?(:independent_disks)
21
+ Vcloud::Launcher::IndependentDiskOrchestrator.new(@vm).attach(vm_config.fetch(:independent_disks))
22
+ end
20
23
 
21
24
  preamble = vm_config[:bootstrap] ? generate_preamble(vm_config) : ''
22
25
 
@@ -20,6 +20,8 @@ vapps:
20
20
  name: Hard disk 2
21
21
  - size: '2048'
22
22
  name: Hard disk 3
23
+ independent_disks:
24
+ - name: <%= independent_disk_name %>
23
25
  network_connections:
24
26
  - name: <%= network_1 %>
25
27
  ip_address: <%= network_1_ip %>
@@ -81,6 +81,11 @@ describe Vcloud::Launcher::Launch do
81
81
  context "happy path" do
82
82
  before(:all) do
83
83
  @test_data = define_test_data
84
+ @test_case_independent_disks = IntegrationHelper.create_test_case_independent_disks(
85
+ 1, @test_data[:vdc_name], '100MB')
86
+ @test_independent_disk = @test_case_independent_disks.first
87
+ @test_data[:independent_disk_name] = @test_independent_disk.name
88
+
84
89
  @config_yaml = ErbHelper.convert_erb_template_to_yaml(@test_data, File.join(File.dirname(__FILE__), 'data/happy_path.yaml.erb'))
85
90
  @api_interface = Vcloud::Core::ApiInterface.new
86
91
  Vcloud::Launcher::Launch.new(@config_yaml, { "dont-power-on" => true }).run
@@ -125,14 +130,22 @@ describe Vcloud::Launcher::Launch do
125
130
  expect(@vm_metadata[:is_string]).to eq('Hello World')
126
131
  end
127
132
 
128
- it "should attach extra hard disks to vm" do
129
- disks = extract_disks(@vm)
133
+ it "should attach extra local hard disks to vm" do
134
+ disks = extract_local_disks(@vm)
130
135
  expect(disks.count).to eq(3)
131
136
  [{:name => 'Hard disk 2', :size => '1024'}, {:name => 'Hard disk 3', :size => '2048'}].each do |new_disk|
132
137
  expect(disks).to include(new_disk)
133
138
  end
134
139
  end
135
140
 
141
+ it "should attach extra independent disks to vm" do
142
+ disks = extract_independent_disks(@vm)
143
+ expect(disks.count).to eq(1)
144
+ [{:name => 'Hard disk 4'}].each do |new_disk|
145
+ expect(disks).to include(new_disk)
146
+ end
147
+ end
148
+
136
149
  it "should configure the vm network interface" do
137
150
  vm_network_connection = @vm[:NetworkConnectionSection][:NetworkConnection]
138
151
  expect(vm_network_connection).not_to be_nil
@@ -167,12 +180,25 @@ describe Vcloud::Launcher::Launch do
167
180
  after(:all) do
168
181
  unless ENV['VCLOUD_TOOLS_RSPEC_NO_DELETE_VAPP']
169
182
  File.delete @config_yaml
170
- expect(@api_interface.delete_vapp(@vapp_id)).to eq(true)
183
+ @api_interface.delete_vapp(@vapp_id)
184
+ wait_for_disks_to_detach
185
+ IntegrationHelper.delete_independent_disks(@test_case_independent_disks)
171
186
  end
172
187
  end
173
188
 
174
189
  end
175
190
 
191
+ def wait_for_disks_to_detach
192
+ # There is an annoying delay after a vapp is deleted before any attached
193
+ # independent disks are registered as detached in vCD. The
194
+ # disk#attached_vms call lies during this period too, so cannot be used to
195
+ # ascertain that the disk is completely detached.
196
+ #
197
+ # As a result, just wait for a sufficiently long time for vCD to get its
198
+ # act together.
199
+ sleep(20)
200
+ end
201
+
176
202
  def extract_memory(vm)
177
203
  vm[:'ovf:VirtualHardwareSection'][:'ovf:Item'].detect { |i| i[:'rasd:ResourceType'] == '4' }[:'rasd:VirtualQuantity']
178
204
  end
@@ -181,9 +207,26 @@ describe Vcloud::Launcher::Launch do
181
207
  vm[:'ovf:VirtualHardwareSection'][:'ovf:Item'].detect { |i| i[:'rasd:ResourceType'] == '3' }[:'rasd:VirtualQuantity']
182
208
  end
183
209
 
184
- def extract_disks(vm)
210
+ def extract_local_disks(vm)
185
211
  vm[:'ovf:VirtualHardwareSection'][:'ovf:Item'].collect { |d|
186
- {:name => d[:"rasd:ElementName"], :size => (d[:"rasd:HostResource"][:ns12_capacity] || d[:"rasd:HostResource"][:vcloud_capacity])} if d[:'rasd:ResourceType'] == '17'
212
+ if d[:'rasd:ResourceType'] == '17' && ! d[:'rasd:HostResource'].key?(:vcloud_disk)
213
+ {
214
+ :name => d[:"rasd:ElementName"],
215
+ :size => (
216
+ d[:"rasd:HostResource"][:ns12_capacity] || d[:"rasd:HostResource"][:vcloud_capacity]
217
+ )
218
+ }
219
+ end
220
+ }.compact
221
+ end
222
+
223
+ def extract_independent_disks(vm)
224
+ vm[:'ovf:VirtualHardwareSection'][:'ovf:Item'].collect { |d|
225
+ if d[:'rasd:ResourceType'] == '17' && d[:'rasd:HostResource'].key?(:vcloud_disk)
226
+ {
227
+ :name => d[:"rasd:ElementName"]
228
+ }
229
+ end
187
230
  }.compact
188
231
  end
189
232
 
@@ -22,6 +22,7 @@ if ENV['COVERAGE']
22
22
  end
23
23
 
24
24
  require 'erb_helper'
25
+ require 'support/integration_helper'
25
26
  require 'vcloud/launcher'
26
27
 
27
28
  RSpec.configure do |config|
@@ -0,0 +1,28 @@
1
+ module IntegrationHelper
2
+
3
+ def self.create_test_case_independent_disks(number_of_disks,
4
+ vdc_name,
5
+ size,
6
+ prefix = "vcloud-launcher-tests"
7
+ )
8
+ timestamp_in_s = Time.new.to_i
9
+ base_disk_name = "#{prefix}-#{timestamp_in_s}-"
10
+ disk_list = []
11
+ vdc = Vcloud::Core::Vdc.get_by_name(vdc_name)
12
+ number_of_disks.times do |index|
13
+ disk_list << Vcloud::Core::IndependentDisk.create(
14
+ vdc,
15
+ base_disk_name + index.to_s,
16
+ size,
17
+ )
18
+ end
19
+ disk_list
20
+ end
21
+
22
+ def self.delete_independent_disks(disk_list)
23
+ disk_list.each do |disk|
24
+ disk.destroy
25
+ end
26
+ end
27
+
28
+ end
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vcloud::Launcher::IndependentDiskOrchestrator do
4
+
5
+ let(:mock_vm) {
6
+ double(
7
+ :vm,
8
+ :id => 'vm-12341234-1234-1234-1234-123412340001',
9
+ :vapp_name => 'web-app1',
10
+ :name => 'test-vm-1'
11
+ )
12
+ }
13
+
14
+ let(:mock_parent_vapp) {
15
+ double(
16
+ :vapp,
17
+ :id => 'vapp-12341234-1234-1234-1234-123412340000',
18
+ :name => 'web-app1',
19
+ :vdc_id => '12341234-1234-1234-1234-123412349999',
20
+ )
21
+ }
22
+
23
+ let(:mock_parent_vdc) {
24
+ double(
25
+ :vdc,
26
+ :id => '12341234-1234-1234-1234-123412349999',
27
+ :name => 'test-vdc-1',
28
+ )
29
+ }
30
+
31
+ let(:independent_disk_config) {
32
+ [
33
+ {:name => 'test-independent-disk-1' },
34
+ {:name => 'test-independent-disk-2' },
35
+ ]
36
+ }
37
+
38
+ let(:mock_disk_1) {
39
+ double(
40
+ :independent_disk_1,
41
+ :id => '12341234-1234-1234-123411110001',
42
+ :name => 'test-independent-disk-1'
43
+ )
44
+ }
45
+
46
+ let(:mock_disk_2) {
47
+ double(
48
+ :independent_disk_2,
49
+ :id => '12341234-1234-1234-123411110002',
50
+ :name => 'test-independent-disk-2'
51
+ )
52
+ }
53
+
54
+ subject { Vcloud::Launcher::IndependentDiskOrchestrator.new(mock_vm) }
55
+
56
+ describe "#vdc_name" do
57
+ end
58
+
59
+ describe "#find_disks" do
60
+
61
+ before(:each) do
62
+ expect(Vcloud::Core::Vapp).to receive(:get_by_child_vm_id).with(mock_vm.id).
63
+ and_return(mock_parent_vapp)
64
+ expect(Vcloud::Core::Vdc).to receive(:new).with(mock_parent_vapp.vdc_id).
65
+ and_return(mock_parent_vdc)
66
+ end
67
+
68
+ it "finds Vcloud::Core::IndependentDisk objects from our configuration" do
69
+ expect(Vcloud::Core::IndependentDisk).
70
+ to receive(:get_by_name_and_vdc_name).
71
+ with(independent_disk_config[0][:name], mock_parent_vdc.name).
72
+ ordered.
73
+ and_return(mock_disk_1)
74
+ expect(Vcloud::Core::IndependentDisk).
75
+ to receive(:get_by_name_and_vdc_name).
76
+ with(independent_disk_config[1][:name], mock_parent_vdc.name).
77
+ ordered.
78
+ and_return(mock_disk_2)
79
+ expect(subject.find_disks(independent_disk_config)).
80
+ to eq([mock_disk_1, mock_disk_2])
81
+ end
82
+
83
+ end
84
+
85
+ describe "#attach" do
86
+ it "orchestrates attachment of independent disks to a VM" do
87
+ expect(subject).to receive(:find_disks).and_return([mock_disk_1, mock_disk_2])
88
+ expect(mock_vm).to receive(:attach_independent_disks).
89
+ with([mock_disk_1, mock_disk_2]).
90
+ and_return(true)
91
+ expect(subject.attach(independent_disk_config)).to be_true
92
+ end
93
+ end
94
+
95
+ end
@@ -0,0 +1,111 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vcloud::Launcher::Schema::LAUNCHER_VAPPS do
4
+
5
+ let(:schema) { Vcloud::Launcher::Schema::LAUNCHER_VAPPS }
6
+
7
+ context "independent_disks section is present" do
8
+
9
+ let(:config) do
10
+ { vapps: [
11
+ {
12
+ name: "test_vapp_name",
13
+ vdc_name: "Test VDC",
14
+ catalog_name: "default",
15
+ vapp_template_name: "ubuntu-precise",
16
+ vm: {
17
+ independent_disks: [ { name: 'indydisk-1' }, { name: 'indydisk-2' } ],
18
+ }
19
+ }
20
+ ]
21
+ }
22
+ end
23
+
24
+ it "validates successfully" do
25
+ validation = Vcloud::Core::ConfigValidator.new(:base, config, schema)
26
+ expect(validation.valid?).to be_true
27
+ end
28
+
29
+ end
30
+
31
+ context "independent_disks section is present but not an array" do
32
+
33
+ let(:config) do
34
+ { vapps: [
35
+ {
36
+ name: "test_vapp_name",
37
+ vdc_name: "Test VDC",
38
+ catalog_name: "default",
39
+ vapp_template_name: "ubuntu-precise",
40
+ vm: {
41
+ independent_disks: 'indydisk-1'
42
+ }
43
+ }
44
+ ]
45
+ }
46
+ end
47
+
48
+ it "does not validate successfully" do
49
+ validation = Vcloud::Core::ConfigValidator.new(:base, config, schema)
50
+ expect(validation.valid?).to be_false
51
+ expect(validation.errors).to eq(['independent_disks is not an array'])
52
+ end
53
+
54
+ end
55
+
56
+ context "independent_disks section is present but not an array of hashes" do
57
+
58
+ let(:config) do
59
+ { vapps: [
60
+ {
61
+ name: "test_vapp_name",
62
+ vdc_name: "Test VDC",
63
+ catalog_name: "default",
64
+ vapp_template_name: "ubuntu-precise",
65
+ vm: {
66
+ independent_disks: [ 'indydisk-1', 'indydisk-2' ]
67
+ }
68
+ }
69
+ ]
70
+ }
71
+ end
72
+
73
+ it "does not validate successfully" do
74
+ validation = Vcloud::Core::ConfigValidator.new(:base, config, schema)
75
+ expect(validation.valid?).to be_false
76
+ expect(validation.errors).to eq(
77
+ ['independent_disks: is not a hash', 'independent_disks: is not a hash']
78
+ )
79
+ end
80
+
81
+ end
82
+
83
+ context "independent_disks section is present and a hash, but not contain a :name parameter" do
84
+
85
+ let(:config) do
86
+ { vapps: [
87
+ {
88
+ name: "test_vapp_name",
89
+ vdc_name: "Test VDC",
90
+ catalog_name: "default",
91
+ vapp_template_name: "ubuntu-precise",
92
+ vm: {
93
+ independent_disks: [ { nametypo: 'indydisk-1'} ]
94
+ }
95
+ }
96
+ ]
97
+ }
98
+ end
99
+
100
+ it "does not validate successfully" do
101
+ validation = Vcloud::Core::ConfigValidator.new(:base, config, schema)
102
+ expect(validation.valid?).to be_false
103
+ expect(validation.errors).to eq([
104
+ "independent_disks: parameter 'nametypo' is invalid",
105
+ "independent_disks: missing 'name' parameter"
106
+ ])
107
+ end
108
+
109
+ end
110
+
111
+ end
@@ -12,6 +12,10 @@ describe Vcloud::Launcher::VmOrchestrator do
12
12
  let(:vapp) {
13
13
  double(:vapp, :name => 'web-app1')
14
14
  }
15
+ let(:mock_disk_orchestrator) {
16
+ double(:mock_disk_orchestrator)
17
+ }
18
+
15
19
  subject {
16
20
  Vcloud::Launcher::VmOrchestrator.new(vcloud_vm, vapp)
17
21
  }
@@ -29,6 +33,10 @@ describe Vcloud::Launcher::VmOrchestrator do
29
33
  {:name => 'Hard disk 2', :size => '1024'},
30
34
  {:name => 'Hard disk 3', :size => '2048'},
31
35
  ],
36
+ :independent_disks => [
37
+ {:name => 'test-independent-disk-1' },
38
+ {:name => 'test-independent-disk-2' },
39
+ ],
32
40
  :network_connections => [
33
41
  {:name => "network1", :ip_address => "198.12.1.21"},
34
42
  ],
@@ -47,6 +55,9 @@ describe Vcloud::Launcher::VmOrchestrator do
47
55
  expect(vm).to receive(:update_memory_size_in_mb).with(4096)
48
56
  expect(vm).to receive(:add_extra_disks).with(vm_config[:extra_disks])
49
57
  expect(vm).to receive(:update_metadata).with(vm_config[:metadata])
58
+ expect(Vcloud::Launcher::IndependentDiskOrchestrator).
59
+ to receive(:new).with(vm).and_return(mock_disk_orchestrator)
60
+ expect(mock_disk_orchestrator).to receive(:attach).with(vm_config[:independent_disks])
50
61
 
51
62
  allow(vm).to receive(:configure_guest_customization_section).with('')
52
63
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vcloud-launcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-12-03 00:00:00.000000000 Z
12
+ date: 2014-12-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: vcloud-core
16
- requirement: &7246000 !ruby/object:Gem::Requirement
16
+ requirement: &16107320 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.16.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *7246000
24
+ version_requirements: *16107320
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: gem_publisher
27
- requirement: &7244900 !ruby/object:Gem::Requirement
27
+ requirement: &16106340 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - =
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.2.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *7244900
35
+ version_requirements: *16106340
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: pry
38
- requirement: &7243800 !ruby/object:Gem::Requirement
38
+ requirement: &16105780 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *7243800
46
+ version_requirements: *16105780
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rake
49
- requirement: &7242280 !ruby/object:Gem::Requirement
49
+ requirement: &16104580 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *7242280
57
+ version_requirements: *16104580
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rspec
60
- requirement: &7240360 !ruby/object:Gem::Requirement
60
+ requirement: &16103800 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 2.14.1
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *7240360
68
+ version_requirements: *16103800
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rubocop
71
- requirement: &7239760 !ruby/object:Gem::Requirement
71
+ requirement: &16102180 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 0.23.0
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *7239760
79
+ version_requirements: *16102180
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: simplecov
82
- requirement: &7239120 !ruby/object:Gem::Requirement
82
+ requirement: &16192900 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 0.7.1
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *7239120
90
+ version_requirements: *16192900
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: vcloud-tools-tester
93
- requirement: &7137660 !ruby/object:Gem::Requirement
93
+ requirement: &16192100 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,7 +98,7 @@ dependencies:
98
98
  version: 0.2.0
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *7137660
101
+ version_requirements: *16192100
102
102
  description:
103
103
  email:
104
104
  - anna.shipman@digital.cabinet-office.gov.uk
@@ -125,6 +125,7 @@ files:
125
125
  - jenkins_tests.sh
126
126
  - lib/vcloud/launcher.rb
127
127
  - lib/vcloud/launcher/cli.rb
128
+ - lib/vcloud/launcher/independent_disk_orchestrator.rb
128
129
  - lib/vcloud/launcher/launch.rb
129
130
  - lib/vcloud/launcher/preamble.rb
130
131
  - lib/vcloud/launcher/schema/launcher_vapps.rb
@@ -146,9 +147,12 @@ files:
146
147
  - spec/integration/launcher/storage_profile_integration_spec.rb
147
148
  - spec/integration/vcloud_tools_testing_config.yaml.template
148
149
  - spec/spec_helper.rb
150
+ - spec/support/integration_helper.rb
149
151
  - spec/vcloud/launcher/cli_spec.rb
152
+ - spec/vcloud/launcher/independent_disk_orchestrator_spec.rb
150
153
  - spec/vcloud/launcher/launch_spec.rb
151
154
  - spec/vcloud/launcher/preamble_spec.rb
155
+ - spec/vcloud/launcher/schema/launcher_vapps_spec.rb
152
156
  - spec/vcloud/launcher/vapp_orchestrator_spec.rb
153
157
  - spec/vcloud/launcher/vm_orchestrator_spec.rb
154
158
  - vcloud-launcher.gemspec
@@ -173,7 +177,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
173
177
  version: '0'
174
178
  segments:
175
179
  - 0
176
- hash: 646331227041677497
180
+ hash: 2886844518648342452
177
181
  requirements: []
178
182
  rubyforge_project:
179
183
  rubygems_version: 1.8.11
@@ -193,8 +197,11 @@ test_files:
193
197
  - spec/integration/launcher/storage_profile_integration_spec.rb
194
198
  - spec/integration/vcloud_tools_testing_config.yaml.template
195
199
  - spec/spec_helper.rb
200
+ - spec/support/integration_helper.rb
196
201
  - spec/vcloud/launcher/cli_spec.rb
202
+ - spec/vcloud/launcher/independent_disk_orchestrator_spec.rb
197
203
  - spec/vcloud/launcher/launch_spec.rb
198
204
  - spec/vcloud/launcher/preamble_spec.rb
205
+ - spec/vcloud/launcher/schema/launcher_vapps_spec.rb
199
206
  - spec/vcloud/launcher/vapp_orchestrator_spec.rb
200
207
  - spec/vcloud/launcher/vm_orchestrator_spec.rb