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
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
## 0.1.0 (2014-06-02)
|
2
|
+
|
3
|
+
Features:
|
4
|
+
|
5
|
+
- Support 'pool' mode for VM IP address allocation. Thanks @geriBatai.
|
6
|
+
|
7
|
+
Maint:
|
8
|
+
|
9
|
+
- Deprecate 'catalog_item' for 'vapp_template_name' in config.
|
10
|
+
- Deprecate 'catalog' for 'catalog_name' in config.
|
11
|
+
|
1
12
|
## 0.0.5 (2014-05-14)
|
2
13
|
|
3
14
|
Features:
|
data/README.md
CHANGED
@@ -43,6 +43,12 @@ Or install it yourself as:
|
|
43
43
|
|
44
44
|
`vcloud-launch node.yaml`
|
45
45
|
|
46
|
+
## Configuration schemas
|
47
|
+
|
48
|
+
Configuration schemas can be found in [`lib/vcloud/launcher/schema/`][schema].
|
49
|
+
|
50
|
+
[schema]: /lib/vcloud/launcher/schema
|
51
|
+
|
46
52
|
## Credentials
|
47
53
|
|
48
54
|
vCloud Launcher is based around [fog](http://fog.io/). To use it you'll need to give it
|
@@ -125,45 +131,5 @@ Run the integration tests minus some that are very slow:
|
|
125
131
|
bundle exec rake integration:quick
|
126
132
|
|
127
133
|
You need access to a suitable vCloud Director organization to run the
|
128
|
-
integration tests.
|
129
|
-
|
130
|
-
|
131
|
-
The easiest thing to do is create a local shell script called
|
132
|
-
`vcloud_env.sh` and set the contents:
|
133
|
-
|
134
|
-
export FOG_CREDENTIAL=test
|
135
|
-
export VCLOUD_VDC_NAME="Name of the VDC"
|
136
|
-
export VCLOUD_CATALOG_NAME="catalog-name"
|
137
|
-
export VCLOUD_TEMPLATE_NAME="name-of-template"
|
138
|
-
export VCLOUD_NETWORK1_NAME="name-of-primary-network"
|
139
|
-
export VCLOUD_NETWORK2_NAME="name-of-secondary-network"
|
140
|
-
export VCLOUD_NETWORK1_IP="ip-on-primary-network"
|
141
|
-
export VCLOUD_NETWORK2_IP="ip-on-secondary-network"
|
142
|
-
export VCLOUD_STORAGE_PROFILE_NAME="storage-profile-name"
|
143
|
-
export VCLOUD_EDGE_GATEWAY="name-of-edge-gateway-in-vdc"
|
144
|
-
|
145
|
-
Then run this before you run the integration tests.
|
146
|
-
|
147
|
-
### Specific integration tests
|
148
|
-
|
149
|
-
#### Storage profile tests
|
150
|
-
|
151
|
-
There is an integration test to check storage profile behaviour, but it requires
|
152
|
-
a lot of set-up so it is not called by the rake task. If you wish to run it you
|
153
|
-
need access to an environment that has two VDCs, each one containing a storage
|
154
|
-
profile with the same name. This named storage profile needs to be different
|
155
|
-
from the default storage profile.
|
156
|
-
|
157
|
-
You will need to set the following environment variables:
|
158
|
-
|
159
|
-
export VDC_NAME_1="Name of the first vDC"
|
160
|
-
export VDC_NAME_2="Name of the second vDC"
|
161
|
-
export VCLOUD_CATALOG_NAME="Catalog name" # Can be the same as above settings if appropriate
|
162
|
-
export VCLOUD_TEMPLATE_NAME="Template name" # Can be the same as above setting if appropriate
|
163
|
-
export VCLOUD_STORAGE_PROFILE_NAME="Storage profile name" # This needs to exist in both vDCs
|
164
|
-
export VDC_1_STORAGE_PROFILE_HREF="Href of the named storage profile in vDC 1"
|
165
|
-
export VDC_2_STORAGE_PROFILE_HREF="Href of the named storage profile in vDC 2"
|
166
|
-
export DEFAULT_STORAGE_PROFILE_NAME="Default storage profile name"
|
167
|
-
export DEFAULT_STORAGE_PROFILE_HREF="Href of default storage profile"
|
168
|
-
|
169
|
-
To run this test: `rspec spec/integration/launcher/storage_profile_integration_test.rb`
|
134
|
+
integration tests. See the [integration tests README](/spec/integration/README.md) for
|
135
|
+
further details.
|
@@ -29,8 +29,8 @@
|
|
29
29
|
vapps:
|
30
30
|
- name: 'vapp-example-complete'
|
31
31
|
vdc_name: 'Our vDC 1'
|
32
|
-
|
33
|
-
|
32
|
+
catalog_name: 'our-catalog'
|
33
|
+
vapp_template_name: 'our-template-vapp'
|
34
34
|
vm:
|
35
35
|
hardware_config:
|
36
36
|
memory: 4096
|
@@ -39,6 +39,7 @@ vapps:
|
|
39
39
|
- name: 'FrontendNetwork'
|
40
40
|
ip_address: '192.0.2.10'
|
41
41
|
- name: 'BackendNetwork'
|
42
|
+
allocation_mode: 'pool'
|
42
43
|
extra_disks:
|
43
44
|
- name: logs-disk
|
44
45
|
size: 10240
|
@@ -10,8 +10,8 @@ vapps:
|
|
10
10
|
|
11
11
|
- name: vapp-example-1
|
12
12
|
vdc_name: "Our VDC1"
|
13
|
-
|
14
|
-
|
13
|
+
catalog_name: our-catalog
|
14
|
+
vapp_template_name: our-vapp-template
|
15
15
|
vm:
|
16
16
|
hardware_config:
|
17
17
|
memory: '4096'
|
@@ -22,8 +22,8 @@ vapps:
|
|
22
22
|
|
23
23
|
- name: vapp-example-2
|
24
24
|
vdc_name: "Our VDC1"
|
25
|
-
|
26
|
-
|
25
|
+
catalog_name: our-catalog
|
26
|
+
vapp_template_name: our-vapp-template
|
27
27
|
vm:
|
28
28
|
hardware_config:
|
29
29
|
memory: '4096'
|
@@ -34,8 +34,8 @@ vapps:
|
|
34
34
|
|
35
35
|
- name: vapp-example-3
|
36
36
|
vdc_name: "Our VDC1"
|
37
|
-
|
38
|
-
|
37
|
+
catalog_name: our-catalog
|
38
|
+
vapp_template_name: our-vapp-template
|
39
39
|
vm:
|
40
40
|
hardware_config:
|
41
41
|
memory: '4096'
|
@@ -10,7 +10,7 @@
|
|
10
10
|
---
|
11
11
|
anchors:
|
12
12
|
|
13
|
-
- &
|
13
|
+
- &VAPP_TEMPLATE_NAME our-vapp-template
|
14
14
|
|
15
15
|
- &ENVIRONMENT example
|
16
16
|
- &VDC_NAME example-vdc
|
@@ -20,18 +20,18 @@ anchors:
|
|
20
20
|
|
21
21
|
- &BASE_VAPP
|
22
22
|
vdc_name: *VDC_NAME
|
23
|
-
|
24
|
-
|
23
|
+
catalog_name: our-catalog
|
24
|
+
vapp_template_name: *VAPP_TEMPLATE_NAME
|
25
25
|
|
26
26
|
- &BASE_VM
|
27
27
|
metadata:
|
28
28
|
environment: *ENVIRONMENT
|
29
|
-
vapp_template: *
|
29
|
+
vapp_template: *VAPP_TEMPLATE_NAME
|
30
30
|
bootstrap: &BASE_VM_BOOTSTRAP
|
31
31
|
script_path: basic_preamble.erb
|
32
32
|
vars: &BASE_VM_VARS
|
33
33
|
environment: *ENVIRONMENT
|
34
|
-
vapp_template: *
|
34
|
+
vapp_template: *VAPP_TEMPLATE_NAME
|
35
35
|
vdc: *VDC_NAME
|
36
36
|
|
37
37
|
- &SMALL_VM
|
data/jenkins.sh
CHANGED
@@ -1,8 +1,16 @@
|
|
1
1
|
#!/bin/bash -x
|
2
2
|
set -e
|
3
|
+
|
4
|
+
git clean -ffdx
|
5
|
+
|
3
6
|
bundle install --path "${HOME}/bundles/${JOB_NAME}"
|
4
7
|
bundle exec rake
|
5
8
|
|
9
|
+
# Obtain the integration test parameters
|
10
|
+
git clone git@github.gds:gds/vcloud-tools-testing-config.git
|
11
|
+
mv vcloud-tools-testing-config/vcloud_tools_testing_config.yaml spec/integration/
|
12
|
+
rm -rf vcloud-tools-testing-config
|
13
|
+
|
6
14
|
RUBYOPT="-r ./tools/fog_credentials" bundle exec rake integration:all
|
7
15
|
|
8
16
|
bundle exec rake publish_gem
|
@@ -1,4 +1,13 @@
|
|
1
1
|
#!/bin/bash -x
|
2
2
|
set -e
|
3
|
+
|
4
|
+
git clean -ffdx
|
5
|
+
|
3
6
|
bundle install --path "${HOME}/bundles/${JOB_NAME}"
|
7
|
+
|
8
|
+
# Obtain the integration test parameters
|
9
|
+
git clone git@github.gds:gds/vcloud-tools-testing-config.git
|
10
|
+
mv vcloud-tools-testing-config/vcloud_tools_testing_config.yaml spec/integration/
|
11
|
+
rm -rf vcloud-tools-testing-config
|
12
|
+
|
4
13
|
RUBYOPT="-r ./tools/fog_credentials" bundle exec rake integration:all
|
data/lib/vcloud/launcher.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
require 'vcloud/fog'
|
2
2
|
require 'vcloud/core'
|
3
3
|
|
4
|
+
require 'vcloud/launcher/schema/vm'
|
5
|
+
require 'vcloud/launcher/schema/vapp'
|
6
|
+
require 'vcloud/launcher/schema/launcher_vapps'
|
7
|
+
|
4
8
|
require 'vcloud/launcher/launch'
|
5
9
|
require 'vcloud/launcher/vm_orchestrator'
|
6
10
|
require 'vcloud/launcher/vapp_orchestrator'
|
@@ -8,7 +8,7 @@ module Vcloud
|
|
8
8
|
|
9
9
|
def run(config_file = nil, cli_options = {})
|
10
10
|
set_logging_level(cli_options)
|
11
|
-
config = @config_loader.load_config(config_file,
|
11
|
+
config = @config_loader.load_config(config_file, Vcloud::Launcher::Schema::LAUNCHER_VAPPS)
|
12
12
|
config[:vapps].each do |vapp_config|
|
13
13
|
Vcloud::Core.logger.info("Provisioning vApp #{vapp_config[:name]}.")
|
14
14
|
begin
|
@@ -24,22 +24,6 @@ module Vcloud
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
def config_schema
|
28
|
-
{
|
29
|
-
type: 'hash',
|
30
|
-
allowed_empty: false,
|
31
|
-
permit_unknown_parameters: true,
|
32
|
-
internals: {
|
33
|
-
vapps: {
|
34
|
-
type: 'array',
|
35
|
-
required: false,
|
36
|
-
allowed_empty: true,
|
37
|
-
each_element_is: ::Vcloud::Launcher::VappOrchestrator.provision_schema
|
38
|
-
},
|
39
|
-
}
|
40
|
-
}
|
41
|
-
end
|
42
|
-
|
43
27
|
def set_logging_level(cli_options)
|
44
28
|
if cli_options[:verbose]
|
45
29
|
Vcloud::Core.logger.level = Logger::DEBUG
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Vcloud
|
2
|
+
module Launcher
|
3
|
+
module Schema
|
4
|
+
|
5
|
+
LAUNCHER_VAPPS = {
|
6
|
+
type: 'hash',
|
7
|
+
allowed_empty: false,
|
8
|
+
permit_unknown_parameters: true,
|
9
|
+
internals: {
|
10
|
+
vapps: {
|
11
|
+
type: 'array',
|
12
|
+
required: false,
|
13
|
+
allowed_empty: true,
|
14
|
+
each_element_is: Vcloud::Launcher::Schema::VAPP,
|
15
|
+
},
|
16
|
+
},
|
17
|
+
}
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Vcloud
|
2
|
+
module Launcher
|
3
|
+
module Schema
|
4
|
+
|
5
|
+
VAPP = {
|
6
|
+
type: 'hash',
|
7
|
+
required: true,
|
8
|
+
allowed_empty: false,
|
9
|
+
internals: {
|
10
|
+
name: { type: 'string', required: true, allowed_empty: false },
|
11
|
+
vdc_name: { type: 'string', required: true, allowed_empty: false },
|
12
|
+
catalog: { type: 'string', deprecated_by: 'catalog_name', allowed_empty: false },
|
13
|
+
catalog_name: { type: 'string', required: true, allowed_empty: false },
|
14
|
+
catalog_item: { type: 'string', deprecated_by: 'vapp_template_name', allowed_empty: false },
|
15
|
+
vapp_template_name: { type: 'string', required: true, allowed_empty: false },
|
16
|
+
vm: Vcloud::Launcher::Schema::VM,
|
17
|
+
},
|
18
|
+
}
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Vcloud
|
2
|
+
module Launcher
|
3
|
+
module Schema
|
4
|
+
|
5
|
+
VM = {
|
6
|
+
type: 'hash',
|
7
|
+
required: false,
|
8
|
+
allowed_empty: false,
|
9
|
+
internals: {
|
10
|
+
network_connections: {
|
11
|
+
type: 'array',
|
12
|
+
required: false,
|
13
|
+
each_element_is: {
|
14
|
+
type: 'hash',
|
15
|
+
internals: {
|
16
|
+
name: { type: 'string', required: true },
|
17
|
+
ip_address: { type: 'ip_address', required: false },
|
18
|
+
allocation_mode: { type: 'string', required: false },
|
19
|
+
},
|
20
|
+
},
|
21
|
+
},
|
22
|
+
storage_profile: { type: 'string', required: false },
|
23
|
+
hardware_config: {
|
24
|
+
type: 'hash',
|
25
|
+
required: false,
|
26
|
+
internals: {
|
27
|
+
cpu: { type: 'string_or_number', required: false },
|
28
|
+
memory: { type: 'string_or_number', required: false },
|
29
|
+
},
|
30
|
+
},
|
31
|
+
extra_disks: {
|
32
|
+
type: 'array',
|
33
|
+
required: false,
|
34
|
+
allowed_empty: false,
|
35
|
+
each_element_is: {
|
36
|
+
type: 'hash',
|
37
|
+
internals: {
|
38
|
+
name: { type: 'string', required: false },
|
39
|
+
size: { type: 'string_or_number', required: false },
|
40
|
+
},
|
41
|
+
},
|
42
|
+
},
|
43
|
+
bootstrap: {
|
44
|
+
type: 'hash',
|
45
|
+
required: false,
|
46
|
+
allowed_empty: false,
|
47
|
+
internals: {
|
48
|
+
script_path: { type: 'string', required: false },
|
49
|
+
script_post_processor: { type: 'string', required: false },
|
50
|
+
vars: { type: 'hash', required: false, allowed_empty: true },
|
51
|
+
},
|
52
|
+
},
|
53
|
+
metadata: {
|
54
|
+
type: 'hash',
|
55
|
+
required: false,
|
56
|
+
allowed_empty: true,
|
57
|
+
},
|
58
|
+
},
|
59
|
+
}
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -11,7 +11,9 @@ module Vcloud
|
|
11
11
|
return vapp_existing
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
template_name = vapp_config[:vapp_template_name] || vapp_config[:catalog_item]
|
15
|
+
catalog_name = vapp_config[:catalog_name] || vapp_config[:catalog]
|
16
|
+
template = Vcloud::Core::VappTemplate.get(template_name, catalog_name)
|
15
17
|
template_id = template.id
|
16
18
|
|
17
19
|
network_names = extract_vm_networks(vapp_config)
|
@@ -21,21 +23,6 @@ module Vcloud
|
|
21
23
|
vapp
|
22
24
|
end
|
23
25
|
|
24
|
-
def self.provision_schema
|
25
|
-
{
|
26
|
-
type: 'hash',
|
27
|
-
required: true,
|
28
|
-
allowed_empty: false,
|
29
|
-
internals: {
|
30
|
-
name: { type: 'string', required: true, allowed_empty: false },
|
31
|
-
vdc_name: { type: 'string', required: true, allowed_empty: false },
|
32
|
-
catalog: { type: 'string', required: true, allowed_empty: false },
|
33
|
-
catalog_item: { type: 'string', required: true, allowed_empty: false },
|
34
|
-
vm: Vcloud::Launcher::VmOrchestrator.customize_schema,
|
35
|
-
}
|
36
|
-
}
|
37
|
-
end
|
38
|
-
|
39
26
|
def self.extract_vm_networks(config)
|
40
27
|
if (config[:vm] && config[:vm][:network_connections])
|
41
28
|
config[:vm][:network_connections].collect { |h| h[:name] }
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module Vcloud
|
2
2
|
module Launcher
|
3
3
|
class VmOrchestrator
|
4
|
+
|
4
5
|
def initialize fog_vm, vapp
|
5
6
|
vm_id = fog_vm[:href].split('/').last
|
6
7
|
@vm = Core::Vm.new(vm_id, vapp)
|
@@ -23,63 +24,6 @@ module Vcloud
|
|
23
24
|
)
|
24
25
|
end
|
25
26
|
|
26
|
-
def self.customize_schema
|
27
|
-
{
|
28
|
-
type: 'hash',
|
29
|
-
required: false,
|
30
|
-
allowed_empty: false,
|
31
|
-
internals: {
|
32
|
-
network_connections: {
|
33
|
-
type: 'array',
|
34
|
-
required: false,
|
35
|
-
each_element_is: {
|
36
|
-
type: 'hash',
|
37
|
-
internals: {
|
38
|
-
name: { type: 'string', required: true },
|
39
|
-
ip_address: { type: 'ip_address', required: false },
|
40
|
-
},
|
41
|
-
},
|
42
|
-
},
|
43
|
-
storage_profile: { type: 'string', required: false },
|
44
|
-
hardware_config: {
|
45
|
-
type: 'hash',
|
46
|
-
required: false,
|
47
|
-
internals: {
|
48
|
-
cpu: { type: 'string_or_number', required: false },
|
49
|
-
memory: { type: 'string_or_number', required: false },
|
50
|
-
},
|
51
|
-
},
|
52
|
-
extra_disks: {
|
53
|
-
type: 'array',
|
54
|
-
required: false,
|
55
|
-
allowed_empty: false,
|
56
|
-
each_element_is: {
|
57
|
-
type: 'hash',
|
58
|
-
internals: {
|
59
|
-
name: { type: 'string', required: false },
|
60
|
-
size: { type: 'string_or_number', required: false },
|
61
|
-
},
|
62
|
-
},
|
63
|
-
},
|
64
|
-
bootstrap: {
|
65
|
-
type: 'hash',
|
66
|
-
required: false,
|
67
|
-
allowed_empty: false,
|
68
|
-
internals: {
|
69
|
-
script_path: { type: 'string', required: false },
|
70
|
-
script_post_processor: { type: 'string', required: false },
|
71
|
-
vars: { type: 'hash', required: false, allowed_empty: true },
|
72
|
-
},
|
73
|
-
},
|
74
|
-
metadata: {
|
75
|
-
type: 'hash',
|
76
|
-
required: false,
|
77
|
-
allowed_empty: true,
|
78
|
-
},
|
79
|
-
},
|
80
|
-
}
|
81
|
-
end
|
82
|
-
|
83
27
|
end
|
84
28
|
end
|
85
29
|
end
|