vcloud-launcher 0.0.1

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.
Files changed (38) hide show
  1. data/.gitignore +16 -0
  2. data/Gemfile +9 -0
  3. data/LICENSE.txt +20 -0
  4. data/README.md +127 -0
  5. data/Rakefile +47 -0
  6. data/bin/vcloud-launch +47 -0
  7. data/examples/.fog-example.fog +15 -0
  8. data/examples/vcloud-launch/basic_preamble.erb +8 -0
  9. data/examples/vcloud-launch/complete_vapp_config.yaml +58 -0
  10. data/examples/vcloud-launch/minimal_vapp_config.yaml +11 -0
  11. data/examples/vcloud-launch/multiple_vapps_simple.yaml +45 -0
  12. data/examples/vcloud-launch/yaml_anchors_example.yaml +87 -0
  13. data/features/step_definitions/vcloud-launch_steps.rb +3 -0
  14. data/features/support/env.rb +16 -0
  15. data/features/vcloud-launch.feature +16 -0
  16. data/jenkins.sh +11 -0
  17. data/jenkins_integration_tests.sh +7 -0
  18. data/lib/vcloud/launcher.rb +22 -0
  19. data/lib/vcloud/launcher/launch.rb +46 -0
  20. data/lib/vcloud/launcher/vapp_orchestrator.rb +44 -0
  21. data/lib/vcloud/launcher/version.rb +5 -0
  22. data/lib/vcloud/launcher/vm_orchestrator.rb +85 -0
  23. data/scripts/basic.erb +13 -0
  24. data/scripts/generate_fog_conf_file.sh +6 -0
  25. data/spec/erb_helper.rb +11 -0
  26. data/spec/integration/launcher/data/basic_preamble_test.erb +8 -0
  27. data/spec/integration/launcher/data/happy_path.yaml.erb +32 -0
  28. data/spec/integration/launcher/data/minimum_data_setup.yaml.erb +6 -0
  29. data/spec/integration/launcher/data/storage_profile.yaml.erb +24 -0
  30. data/spec/integration/launcher/storage_profile_integration_spec.rb +90 -0
  31. data/spec/integration/launcher/vcloud_launcher_spec.rb +157 -0
  32. data/spec/spec_helper.rb +3 -0
  33. data/spec/support/stub_fog_interface.rb +59 -0
  34. data/spec/vcloud/launcher/launch_spec.rb +48 -0
  35. data/spec/vcloud/launcher/vapp_orchestrator_spec.rb +57 -0
  36. data/spec/vcloud/launcher/vm_orchestrator_spec.rb +80 -0
  37. data/vcloud-launcher.gemspec +30 -0
  38. metadata +214 -0
@@ -0,0 +1,157 @@
1
+ require 'spec_helper'
2
+ require 'pp'
3
+ require 'erb'
4
+ require 'ostruct'
5
+
6
+ describe Vcloud::Launcher::Launch do
7
+ context "with minimum input setup" do
8
+ it "should provision vapp with single vm" do
9
+ test_data_1 = define_test_data
10
+ minimum_data_erb = File.join(File.dirname(__FILE__), 'data/minimum_data_setup.yaml.erb')
11
+ @minimum_data_yaml = ErbHelper.convert_erb_template_to_yaml(test_data_1, minimum_data_erb)
12
+ @fog_interface = Vcloud::Fog::ServiceInterface.new
13
+
14
+ Vcloud::Launcher::Launch.new.run(@minimum_data_yaml, {"dont-power-on" => true})
15
+
16
+ vapp_query_result = @fog_interface.get_vapp_by_name_and_vdc_name(test_data_1[:vapp_name], test_data_1[:vdc_name])
17
+ @provisioned_vapp_id = vapp_query_result[:href].split('/').last
18
+ provisioned_vapp = @fog_interface.get_vapp @provisioned_vapp_id
19
+
20
+ provisioned_vapp.should_not be_nil
21
+ provisioned_vapp[:name].should == test_data_1[:vapp_name]
22
+ provisioned_vapp[:Children][:Vm].count.should == 1
23
+ end
24
+
25
+ after(:each) do
26
+ unless ENV['VCLOUD_TOOLS_RSPEC_NO_DELETE_VAPP']
27
+ File.delete @minimum_data_yaml
28
+ @fog_interface.delete_vapp(@provisioned_vapp_id).should == true
29
+ end
30
+ end
31
+ end
32
+
33
+ context "happy path" do
34
+ before(:all) do
35
+ @test_data = define_test_data
36
+ @config_yaml = ErbHelper.convert_erb_template_to_yaml(@test_data, File.join(File.dirname(__FILE__), 'data/happy_path.yaml.erb'))
37
+ @fog_interface = Vcloud::Fog::ServiceInterface.new
38
+ Vcloud::Launcher::Launch.new.run(@config_yaml, { "dont-power-on" => true })
39
+
40
+ @vapp_query_result = @fog_interface.get_vapp_by_name_and_vdc_name(@test_data[:vapp_name], @test_data[:vdc_name])
41
+ @vapp_id = @vapp_query_result[:href].split('/').last
42
+
43
+ @vapp = @fog_interface.get_vapp @vapp_id
44
+ @vm = @vapp[:Children][:Vm].first
45
+ @vm_id = @vm[:href].split('/').last
46
+
47
+ @vm_metadata = Vcloud::Core::Vm.get_metadata @vm_id
48
+ end
49
+
50
+ context 'provision vapp' do
51
+ it 'should create a vapp' do
52
+ @vapp[:name].should == @test_data[:vapp_name]
53
+ @vapp[:'ovf:NetworkSection'][:'ovf:Network'].count.should == 2
54
+ vapp_networks = @vapp[:'ovf:NetworkSection'][:'ovf:Network'].collect { |connection| connection[:ovf_name] }
55
+ vapp_networks.should =~ [@test_data[:network1], @test_data[:network2]]
56
+ end
57
+
58
+ it "should create vm within vapp" do
59
+ @vm.should_not be_nil
60
+ end
61
+
62
+ end
63
+
64
+ context "customize vm" do
65
+ it "change cpu for given vm" do
66
+ extract_memory(@vm).should == '8192'
67
+ extract_cpu(@vm).should == '4'
68
+ end
69
+
70
+ it "should have added the right number of metadata values" do
71
+ @vm_metadata.count.should == 6
72
+ end
73
+
74
+ it "the metadata should be equivalent to our input" do
75
+ @vm_metadata[:is_true].should == true
76
+ @vm_metadata[:is_integer].should == -999
77
+ @vm_metadata[:is_string].should == 'Hello World'
78
+ end
79
+
80
+ it "should attach extra hard disks to vm" do
81
+ disks = extract_disks(@vm)
82
+ disks.count.should == 3
83
+ [{:name => 'Hard disk 2', :size => '1024'}, {:name => 'Hard disk 3', :size => '2048'}].each do |new_disk|
84
+ disks.should include(new_disk)
85
+ end
86
+ end
87
+
88
+ it "should configure the vm network interface" do
89
+ vm_network_connection = @vm[:NetworkConnectionSection][:NetworkConnection]
90
+ vm_network_connection.should_not be_nil
91
+ vm_network_connection.count.should == 2
92
+
93
+
94
+ primary_nic = vm_network_connection.detect { |connection| connection[:network] == @test_data[:network1] }
95
+ primary_nic[:network].should == @test_data[:network1]
96
+ primary_nic[:NetworkConnectionIndex].should == @vm[:NetworkConnectionSection][:PrimaryNetworkConnectionIndex]
97
+ primary_nic[:IpAddress].should == @test_data[:network1_ip]
98
+ primary_nic[:IpAddressAllocationMode].should == 'MANUAL'
99
+
100
+ second_nic = vm_network_connection.detect { |connection| connection[:network] == @test_data[:network2] }
101
+ second_nic[:network].should == @test_data[:network2]
102
+ second_nic[:NetworkConnectionIndex].should == '1'
103
+ second_nic[:IpAddress].should == @test_data[:network2_ip]
104
+ second_nic[:IpAddressAllocationMode].should == 'MANUAL'
105
+
106
+ end
107
+
108
+ it 'should assign guest customization script to the VM' do
109
+ @vm[:GuestCustomizationSection][:CustomizationScript].should =~ /message: hello world/
110
+ @vm[:GuestCustomizationSection][:ComputerName].should == @test_data[:vapp_name]
111
+ end
112
+
113
+ it "should assign storage profile to the VM" do
114
+ @vm[:StorageProfile][:name].should == @test_data[:storage_profile]
115
+ end
116
+
117
+ end
118
+
119
+ after(:all) do
120
+ unless ENV['VCLOUD_TOOLS_RSPEC_NO_DELETE_VAPP']
121
+ File.delete @config_yaml
122
+ @fog_interface.delete_vapp(@vapp_id).should == true
123
+ end
124
+ end
125
+
126
+ end
127
+
128
+ def extract_memory(vm)
129
+ vm[:'ovf:VirtualHardwareSection'][:'ovf:Item'].detect { |i| i[:'rasd:ResourceType'] == '4' }[:'rasd:VirtualQuantity']
130
+ end
131
+
132
+ def extract_cpu(vm)
133
+ vm[:'ovf:VirtualHardwareSection'][:'ovf:Item'].detect { |i| i[:'rasd:ResourceType'] == '3' }[:'rasd:VirtualQuantity']
134
+ end
135
+
136
+ def extract_disks(vm)
137
+ vm[:'ovf:VirtualHardwareSection'][:'ovf:Item'].collect { |d|
138
+ {:name => d[:"rasd:ElementName"], :size => d[:"rasd:HostResource"][:ns12_capacity]} if d[:'rasd:ResourceType'] == '17'
139
+ }.compact
140
+ end
141
+
142
+ def define_test_data
143
+ {
144
+ vapp_name: "vapp-vcloud-tools-tests-#{Time.now.strftime('%s')}",
145
+ vdc_name: ENV['VCLOUD_VDC_NAME'],
146
+ catalog: ENV['VCLOUD_CATALOG_NAME'],
147
+ vapp_template: ENV['VCLOUD_TEMPLATE_NAME'],
148
+ network1: ENV['VCLOUD_NETWORK1_NAME'],
149
+ network2: ENV['VCLOUD_NETWORK2_NAME'],
150
+ network1_ip: ENV['VCLOUD_NETWORK1_IP'],
151
+ network2_ip: ENV['VCLOUD_NETWORK2_IP'],
152
+ storage_profile: ENV['VCLOUD_STORAGE_PROFILE_NAME'],
153
+ bootstrap_script: File.join(File.dirname(__FILE__), "data/basic_preamble_test.erb"),
154
+ date_metadata: DateTime.parse('2013-10-23 15:34:00 +0000')
155
+ }
156
+ end
157
+ end
@@ -0,0 +1,3 @@
1
+ require 'erb_helper'
2
+ require 'vcloud/launcher'
3
+ require 'support/stub_fog_interface.rb'
@@ -0,0 +1,59 @@
1
+ require 'ostruct'
2
+
3
+ class StubFogInterface
4
+
5
+ def name
6
+ 'Test vDC 1'
7
+ end
8
+
9
+ def vdc_object_by_name(vdc_name)
10
+ vdc = OpenStruct.new
11
+ vdc.name = 'test-vdc-1'
12
+ vdc
13
+ end
14
+
15
+ def template
16
+ { :href => '/vappTemplate-12345678-90ab-cdef-0123-4567890abcde' }
17
+ end
18
+
19
+ def find_networks(network_names, vdc_name)
20
+ [{
21
+ :name => 'org-vdc-1-net-1',
22
+ :href => '/org-vdc-1-net-1-id',
23
+ }]
24
+ end
25
+
26
+ def get_vapp(id)
27
+ { :name => 'test-vapp-1' }
28
+ end
29
+
30
+ def get_edge_gateway(id)
31
+ {
32
+ :name => 'test-edgegw-1',
33
+ :href => "/#{id}",
34
+ }
35
+ end
36
+
37
+ def vdc(name)
38
+ { }
39
+ end
40
+
41
+ def post_instantiate_vapp_template(vdc, template, name, params)
42
+ {
43
+ :href => '/test-vapp-1-id',
44
+ :Children => {
45
+ :Vm => ['bogus vm data']
46
+ }
47
+ }
48
+ end
49
+
50
+ def get_vapp_by_vdc_and_name
51
+ { }
52
+ end
53
+
54
+ def template(catalog_name, name)
55
+ { :href => '/vappTemplate-12345678-90ab-cdef-0123-4567890abcde' }
56
+ end
57
+
58
+
59
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ module Vcloud
4
+ # describe Launch 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 => "default",
12
+ # :catalog_item => "ubuntu-precise"
13
+ # }
14
+ # @fake_failing_app = {
15
+ # :name => "fake failing app",
16
+ # :vdc_name => "wrong vdc",
17
+ # :catalog => "default",
18
+ # :catalog_item => "ubuntu-precise"
19
+ # }
20
+ # @successful_app_2 = {
21
+ # :name => "successful app 2",
22
+ # :vdc_name => "Test Vdc",
23
+ # :catalog => "default",
24
+ # :catalog_item => "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
29
+ #
30
+ # it "should stop on failure by default" do
31
+ # expect(VappOrchestrator).to receive(:provision).with(@successful_app_1).and_return(double(:vapp, :power_on => true))
32
+ # expect(VappOrchestrator).to receive(:provision).with(@fake_failing_app).and_raise(RuntimeError.new('failed to find vdc'))
33
+ # expect(VappOrchestrator).not_to receive(:provision).with(@successful_app_2)
34
+ #
35
+ # cli_options = {}
36
+ # Launch.new.run('input_config_yaml', cli_options)
37
+ # end
38
+ #
39
+ # it "should continue on error if cli option continue-on-error is set" do
40
+ # expect(VappOrchestrator).to receive(:provision).with(@successful_app_1).and_return(double(:vapp, :power_on => true))
41
+ # expect(VappOrchestrator).to receive(:provision).with(@fake_failing_app).and_raise(RuntimeError.new('failed to find vdc'))
42
+ # expect(VappOrchestrator).to receive(:provision).with(@successful_app_2).and_return(double(:vapp, :power_on => true))
43
+ #
44
+ # cli_options = {"continue-on-error" => true}
45
+ # Launch.new.run('input_config_yaml', cli_options)
46
+ # end
47
+ # end
48
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ module Vcloud
4
+ module Launcher
5
+ describe VappOrchestrator do
6
+
7
+ before(:each) do
8
+ @mock_fog_interface = StubFogInterface.new
9
+ Vcloud::Fog::ServiceInterface.stub(:new).and_return(@mock_fog_interface)
10
+ end
11
+
12
+ context "provision a vapp" do
13
+
14
+ before(:each) do
15
+ @config = {
16
+ :name => 'test-vapp-1',
17
+ :vdc_name => 'test-vdc-1',
18
+ :catalog => 'org-1-catalog',
19
+ :catalog_item => 'org-1-template',
20
+ :vm => {
21
+ :network_connections => [{:name => 'org-vdc-1-net-1'}]
22
+ }
23
+ }
24
+ end
25
+
26
+ it "should return a vapp if it already exists" do
27
+ existing_vapp = double(:vapp, :name => 'existing-vapp-1')
28
+
29
+ Core::Vapp.should_receive(:get_by_name_and_vdc_name).with('test-vapp-1', 'test-vdc-1').and_return(existing_vapp)
30
+ Vcloud::Launcher.logger.should_receive(:info).with('Found existing vApp test-vapp-1 in vDC \'test-vdc-1\'. Skipping.')
31
+ actual_vapp = VappOrchestrator.provision @config
32
+ actual_vapp.should_not be_nil
33
+ actual_vapp.should == existing_vapp
34
+ end
35
+
36
+ it "should create a vapp if it does not exist" do
37
+ #this test highlights the problems in vapp
38
+ mock_fog_vm = double(:vm)
39
+ mock_vapp = double(:vapp, :fog_vms => [mock_fog_vm], :reload => self)
40
+ mock_vm_orchestrator = double(:vm_orchestrator, :customize => true)
41
+
42
+
43
+ Core::Vapp.should_receive(:get_by_name_and_vdc_name).with('test-vapp-1', 'test-vdc-1').and_return(nil)
44
+ Core::VappTemplate.should_receive(:get).with('org-1-catalog', 'org-1-template').and_return(double(:vapp_template, :id => 1))
45
+
46
+ Core::Vapp.should_receive(:instantiate).with('test-vapp-1', ['org-vdc-1-net-1'], 1, 'test-vdc-1')
47
+ .and_return(mock_vapp)
48
+ VmOrchestrator.should_receive(:new).with(mock_fog_vm, mock_vapp).and_return(mock_vm_orchestrator)
49
+
50
+ new_vapp = VappOrchestrator.provision @config
51
+ new_vapp.should == mock_vapp
52
+ end
53
+
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,80 @@
1
+ require 'spec_helper'
2
+
3
+ module Vcloud
4
+ module Launcher
5
+ describe VmOrchestrator do
6
+
7
+ before(:each) do
8
+ @vm_id = "vm-12345678-1234-1234-1234-123456712312"
9
+ end
10
+
11
+ it "orchestrate customization" do
12
+ vm_config = {
13
+ :hardware_config => {
14
+ :memory => 4096,
15
+ :cpu => 2
16
+ },
17
+ :metadata => {
18
+ :shutdown => true
19
+ },
20
+ :extra_disks => [
21
+ {:size => '1024', :name => 'Hard disk 2', :fs_file => 'mysql', :fs_mntops => 'mysql-something'},
22
+ {:size => '2048', :name => 'Hard disk 3', :fs_file => 'solr', :fs_mntops => 'solr-something'}
23
+ ],
24
+
25
+ :network_connections => [
26
+ {:name => "network1", :ip_address => "198.12.1.21"},
27
+ ],
28
+ :bootstrap => {
29
+ :script_path => '/tmp/boostrap.erb',
30
+ :vars => {
31
+ :message => 'hello world'
32
+ }
33
+ },
34
+ :storage_profile => {
35
+ :name => 'basic-storage',
36
+ :href => 'https://vcloud.example.net/api/vdcStorageProfile/000aea1e-a5e9-4dd1-a028-40db8c98d237'
37
+ }
38
+ }
39
+ fog_vm = { :href => "/#{@vm_id}" }
40
+ vapp = double(:vapp, :name => 'web-app1')
41
+ vm = double(:vm, :id => @vm_id, :vapp_name => 'web-app1', :vapp => vapp, :name => 'test-vm-1')
42
+ Core::Vm.should_receive(:new).with(@vm_id, vapp).and_return(vm)
43
+
44
+ vm.should_receive(:update_name).with('web-app1')
45
+ vm.should_receive(:configure_network_interfaces).with(vm_config[:network_connections])
46
+ vm.should_receive(:update_storage_profile).with(vm_config[:storage_profile])
47
+ vm.should_receive(:update_cpu_count).with(2)
48
+ vm.should_receive(:update_memory_size_in_mb).with(4096)
49
+ vm.should_receive(:add_extra_disks).with(vm_config[:extra_disks])
50
+ vm.should_receive(:update_metadata).with(vm_config[:metadata])
51
+ vm.should_receive(:configure_guest_customization_section).with('web-app1', vm_config[:bootstrap], vm_config[:extra_disks])
52
+
53
+ VmOrchestrator.new(fog_vm, vapp).customize(vm_config)
54
+ end
55
+
56
+ it "if a storage_profile is not specified, customize continues with other customizations" do
57
+ fog_vm = { :href => "/#{@vm_id}" }
58
+ vapp = double(:vapp, :name => 'web-app1')
59
+ vm = double(:vm, :id => @vm_id, :vapp_name => 'web-app1', :vapp => vapp, :name => 'test-vm-1')
60
+ vm_config = {
61
+ :metadata => {:shutdown => true},
62
+ :network_connections => [{:name => "network1", :ip_address => "198.12.1.21"}],
63
+ :extra_disks => [
64
+ {:size => '1024', :name => 'Hard disk 2', :fs_file => 'mysql', :fs_mntops => 'mysql-something'},
65
+ {:size => '2048', :name => 'Hard disk 3', :fs_file => 'solr', :fs_mntops => 'solr-something'}
66
+ ]
67
+ }
68
+ Core::Vm.should_receive(:new).with(@vm_id, vapp).and_return(vm)
69
+ vm.should_receive(:update_metadata).with(:shutdown => true)
70
+ vm.should_receive(:update_name).with('web-app1')
71
+ vm.should_receive(:add_extra_disks).with(vm_config[:extra_disks])
72
+ vm.should_receive(:configure_network_interfaces).with(vm_config[:network_connections])
73
+ vm.should_receive(:configure_guest_customization_section).with('web-app1', vm_config[:bootstrap], vm_config[:extra_disks])
74
+
75
+ VmOrchestrator.new(fog_vm, vapp).customize(vm_config)
76
+
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'vcloud/launcher/version'
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = 'vcloud-launcher'
9
+ s.version = Vcloud::Launcher::VERSION
10
+ s.authors = ['Anna Shipman']
11
+ s.email = ['anna.shipman@digital.cabinet-office.gov.uk']
12
+ s.summary = 'Tool to launch and configure vCloud vApps'
13
+ s.homepage = 'https://github.com/alphagov/vcloud-launcher'
14
+ s.license = 'MIT'
15
+
16
+ s.files = `git ls-files`.split($/)
17
+ s.executables = s.files.grep(%r{^bin/}) {|f| File.basename(f)}
18
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
19
+ s.require_paths = ['lib']
20
+
21
+ s.required_ruby_version = '>= 1.9.2'
22
+
23
+ s.add_runtime_dependency 'methadone'
24
+ s.add_runtime_dependency 'vcloud-core', '>= 0.0.9'
25
+ s.add_development_dependency 'aruba', '~> 0.5.3'
26
+ s.add_development_dependency 'cucumber', '~> 1.3.10'
27
+ s.add_development_dependency 'gem_publisher', '1.2.0'
28
+ s.add_development_dependency 'rake'
29
+ s.add_development_dependency 'rspec', '~> 2.14.1'
30
+ end
metadata ADDED
@@ -0,0 +1,214 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vcloud-launcher
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Anna Shipman
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-04-02 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: methadone
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: vcloud-core
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 0.0.9
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 0.0.9
46
+ - !ruby/object:Gem::Dependency
47
+ name: aruba
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 0.5.3
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.5.3
62
+ - !ruby/object:Gem::Dependency
63
+ name: cucumber
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 1.3.10
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 1.3.10
78
+ - !ruby/object:Gem::Dependency
79
+ name: gem_publisher
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - '='
84
+ - !ruby/object:Gem::Version
85
+ version: 1.2.0
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - '='
92
+ - !ruby/object:Gem::Version
93
+ version: 1.2.0
94
+ - !ruby/object:Gem::Dependency
95
+ name: rake
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: rspec
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 2.14.1
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 2.14.1
126
+ description:
127
+ email:
128
+ - anna.shipman@digital.cabinet-office.gov.uk
129
+ executables:
130
+ - vcloud-launch
131
+ extensions: []
132
+ extra_rdoc_files: []
133
+ files:
134
+ - .gitignore
135
+ - Gemfile
136
+ - LICENSE.txt
137
+ - README.md
138
+ - Rakefile
139
+ - bin/vcloud-launch
140
+ - examples/.fog-example.fog
141
+ - examples/vcloud-launch/basic_preamble.erb
142
+ - examples/vcloud-launch/complete_vapp_config.yaml
143
+ - examples/vcloud-launch/minimal_vapp_config.yaml
144
+ - examples/vcloud-launch/multiple_vapps_simple.yaml
145
+ - examples/vcloud-launch/yaml_anchors_example.yaml
146
+ - features/step_definitions/vcloud-launch_steps.rb
147
+ - features/support/env.rb
148
+ - features/vcloud-launch.feature
149
+ - jenkins.sh
150
+ - jenkins_integration_tests.sh
151
+ - lib/vcloud/launcher.rb
152
+ - lib/vcloud/launcher/launch.rb
153
+ - lib/vcloud/launcher/vapp_orchestrator.rb
154
+ - lib/vcloud/launcher/version.rb
155
+ - lib/vcloud/launcher/vm_orchestrator.rb
156
+ - scripts/basic.erb
157
+ - scripts/generate_fog_conf_file.sh
158
+ - spec/erb_helper.rb
159
+ - spec/integration/launcher/data/basic_preamble_test.erb
160
+ - spec/integration/launcher/data/happy_path.yaml.erb
161
+ - spec/integration/launcher/data/minimum_data_setup.yaml.erb
162
+ - spec/integration/launcher/data/storage_profile.yaml.erb
163
+ - spec/integration/launcher/storage_profile_integration_spec.rb
164
+ - spec/integration/launcher/vcloud_launcher_spec.rb
165
+ - spec/spec_helper.rb
166
+ - spec/support/stub_fog_interface.rb
167
+ - spec/vcloud/launcher/launch_spec.rb
168
+ - spec/vcloud/launcher/vapp_orchestrator_spec.rb
169
+ - spec/vcloud/launcher/vm_orchestrator_spec.rb
170
+ - vcloud-launcher.gemspec
171
+ homepage: https://github.com/alphagov/vcloud-launcher
172
+ licenses:
173
+ - MIT
174
+ post_install_message:
175
+ rdoc_options: []
176
+ require_paths:
177
+ - lib
178
+ required_ruby_version: !ruby/object:Gem::Requirement
179
+ none: false
180
+ requirements:
181
+ - - ! '>='
182
+ - !ruby/object:Gem::Version
183
+ version: 1.9.2
184
+ required_rubygems_version: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ segments:
191
+ - 0
192
+ hash: -3942344739831315401
193
+ requirements: []
194
+ rubyforge_project:
195
+ rubygems_version: 1.8.23
196
+ signing_key:
197
+ specification_version: 3
198
+ summary: Tool to launch and configure vCloud vApps
199
+ test_files:
200
+ - features/step_definitions/vcloud-launch_steps.rb
201
+ - features/support/env.rb
202
+ - features/vcloud-launch.feature
203
+ - spec/erb_helper.rb
204
+ - spec/integration/launcher/data/basic_preamble_test.erb
205
+ - spec/integration/launcher/data/happy_path.yaml.erb
206
+ - spec/integration/launcher/data/minimum_data_setup.yaml.erb
207
+ - spec/integration/launcher/data/storage_profile.yaml.erb
208
+ - spec/integration/launcher/storage_profile_integration_spec.rb
209
+ - spec/integration/launcher/vcloud_launcher_spec.rb
210
+ - spec/spec_helper.rb
211
+ - spec/support/stub_fog_interface.rb
212
+ - spec/vcloud/launcher/launch_spec.rb
213
+ - spec/vcloud/launcher/vapp_orchestrator_spec.rb
214
+ - spec/vcloud/launcher/vm_orchestrator_spec.rb