vcloud-net_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.
- data/.gitignore +2 -0
- data/Gemfile +9 -0
- data/LICENSE.txt +20 -0
- data/README.md +104 -0
- data/Rakefile +29 -0
- data/bin/vcloud-net-launch +44 -0
- data/examples/.fog-example.fog +15 -0
- data/examples/vcloud-net-launch/example-config.yaml +41 -0
- data/features/step_definitions/vcloud-launch_steps.rb +3 -0
- data/features/support/env.rb +16 -0
- data/features/vcloud-net-launch.feature +15 -0
- data/jenkins.sh +13 -0
- data/jenkins_integration_tests.sh +8 -0
- data/lib/vcloud/net_launcher/net_launch.rb +31 -0
- data/lib/vcloud/net_launcher/version.rb +5 -0
- data/lib/vcloud/net_launcher.rb +24 -0
- data/scripts/basic.erb +13 -0
- data/scripts/generate_fog_conf_file.sh +6 -0
- data/spec/erb_helper.rb +11 -0
- data/spec/integration/net_launcher/data/minimum_data_setup.yaml.erb +9 -0
- data/spec/integration/net_launcher/org_vdc_network_spec.rb +151 -0
- data/spec/integration/net_launcher/vcloud_net_launcher_spec.rb +73 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/support/stub_fog_interface.rb +59 -0
- data/vcloud-net_launcher.gemspec +32 -0
- metadata +180 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2014 HM Government (Government Digital Service)
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
7
|
+
the Software without restriction, including without limitation the rights to
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
vCloud Net Launcher
|
2
|
+
===================
|
3
|
+
|
4
|
+
A tool that takes a YAML configuration file describing vCloud networks and configures each of them.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
gem 'vcloud-net_launcher'
|
11
|
+
|
12
|
+
And then execute:
|
13
|
+
|
14
|
+
$ bundle
|
15
|
+
|
16
|
+
Or install it yourself as:
|
17
|
+
|
18
|
+
$ gem install vcloud-net_launcher
|
19
|
+
|
20
|
+
## Usage
|
21
|
+
|
22
|
+
vCloud-tools uses Fog.
|
23
|
+
|
24
|
+
To use it you need a `.fog` file in your home directory.
|
25
|
+
|
26
|
+
For example:
|
27
|
+
|
28
|
+
test:
|
29
|
+
vcloud_director_username: 'username@org_name'
|
30
|
+
vcloud_director_password: 'password'
|
31
|
+
vcloud_director_host: 'host.api.example.com'
|
32
|
+
|
33
|
+
Unfortunately current usage of fog requires the password in this file. Multiple sets of credentials can be specified in the fog file, using the following format:
|
34
|
+
|
35
|
+
test:
|
36
|
+
vcloud_director_username: 'username@org_name'
|
37
|
+
vcloud_director_password: 'password'
|
38
|
+
vcloud_director_host: 'host.api.example.com'
|
39
|
+
|
40
|
+
test2:
|
41
|
+
vcloud_director_username: 'username@org_name'
|
42
|
+
vcloud_director_password: 'password'
|
43
|
+
vcloud_director_host: 'host.api.vendor.net'
|
44
|
+
|
45
|
+
You can then pass the `FOG_CREDENTIAL` environment variable at the start of your command. The value of the `FOG_CREDENTIAL` environment variable is the name of the credential set in your fog file which you wish to use. For instance:
|
46
|
+
|
47
|
+
FOG_CREDENTIAL=test2 vcloud-net-launch node.yaml
|
48
|
+
|
49
|
+
An example configuration file is located in [examples/vcloud-net-launch][example_yaml]
|
50
|
+
|
51
|
+
|
52
|
+
##Supports
|
53
|
+
|
54
|
+
* Configuration of multiple networks
|
55
|
+
* Supports natRouted and isolated network types
|
56
|
+
* Accepts multiple ip address ranges
|
57
|
+
* Defaults
|
58
|
+
* IsShared : false
|
59
|
+
* IpScope -> IsEnabled : true
|
60
|
+
* IpScope -> IsInherited : false
|
61
|
+
|
62
|
+
Limitations
|
63
|
+
|
64
|
+
* Not currently reentrant - if the process errors part of the way through, the previously applied network config
|
65
|
+
will need to be removed from the file before it is corrected and run again.
|
66
|
+
|
67
|
+
## Contributing
|
68
|
+
|
69
|
+
1. Fork it
|
70
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
71
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
72
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
73
|
+
5. Create new Pull Request
|
74
|
+
|
75
|
+
## Other settings
|
76
|
+
|
77
|
+
vCloud Net Launcher uses vCloud Core. If you want to use the latest version of vCloud Core, or a local version, you can export some variables. See the Gemfile for details.
|
78
|
+
|
79
|
+
## Testing
|
80
|
+
|
81
|
+
Default target: `bundle exec rake` runs the integration tests.
|
82
|
+
|
83
|
+
You need access to a suitable vCloud Director organization to run the
|
84
|
+
integration tests. It is not necessarily safe to run them against an existing
|
85
|
+
environment, unless care is taken with the entities being tested.
|
86
|
+
|
87
|
+
The easiest thing to do is create a local shell script called
|
88
|
+
`vcloud_env.sh` and set the contents:
|
89
|
+
|
90
|
+
export FOG\_CREDENTIAL=test
|
91
|
+
export VCLOUD\_VDC\_NAME="Name of the VDC"
|
92
|
+
export VCLOUD\_CATALOG\_NAME="catalog-name"
|
93
|
+
export VCLOUD\_TEMPLATE\_NAME="name-of-template"
|
94
|
+
export VCLOUD\_NETWORK1\_NAME="name-of-primary-network"
|
95
|
+
export VCLOUD\_NETWORK2\_NAME="name-of-secondary-network"
|
96
|
+
export VCLOUD\_NETWORK1\_IP="ip-on-primary-network"
|
97
|
+
export VCLOUD\_NETWORK2\_IP="ip-on-secondary-network"
|
98
|
+
export VCLOUD\_TEST\_STORAGE\_PROFILE="storage-profile-name"
|
99
|
+
export VCLOUD\_EDGE\_GATEWAY="name-of-edge-gateway-in-vdc"
|
100
|
+
|
101
|
+
Then run this before you run the integration tests.
|
102
|
+
|
103
|
+
[example_yaml]: ../examples/vcloud-net-launch/
|
104
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'cucumber/rake/task'
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
|
4
|
+
CUKE_RESULTS = 'results.html'
|
5
|
+
|
6
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
7
|
+
t.cucumber_opts = "features --format html -o #{CUKE_RESULTS} --format pretty --no-source -x"
|
8
|
+
t.fork = false
|
9
|
+
end
|
10
|
+
|
11
|
+
RSpec::Core::RakeTask.new(:spec) do |task|
|
12
|
+
# Set a bogus Fog credential, otherwise it's possible for the unit
|
13
|
+
# tests to accidentially run (and succeed against!) an actual
|
14
|
+
# environment, if Fog connection is not stubbed correctly.
|
15
|
+
ENV['FOG_CREDENTIAL'] = 'random_nonsense_owiejfoweijf'
|
16
|
+
task.pattern = FileList['spec/vcloud/**/*_spec.rb']
|
17
|
+
end
|
18
|
+
|
19
|
+
RSpec::Core::RakeTask.new('integration') do |t|
|
20
|
+
t.pattern = FileList['spec/integration/**/*_spec.rb']
|
21
|
+
end
|
22
|
+
|
23
|
+
task :default => [:integration]
|
24
|
+
|
25
|
+
require "gem_publisher"
|
26
|
+
task :publish_gem do |t|
|
27
|
+
gem = GemPublisher.publish_if_updated("vcloud-net_launcher.gemspec", :rubygems)
|
28
|
+
puts "Published #{gem}" if gem
|
29
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'optparse'
|
6
|
+
require 'methadone'
|
7
|
+
|
8
|
+
require 'vcloud/net_launcher'
|
9
|
+
|
10
|
+
class App
|
11
|
+
include Methadone::Main
|
12
|
+
include Methadone::CLILogging
|
13
|
+
include Vcloud
|
14
|
+
|
15
|
+
main do |net_config_file|
|
16
|
+
NetLauncher::NetLaunch.new.run(net_config_file, options)
|
17
|
+
end
|
18
|
+
|
19
|
+
on("-m", "--mock", "Fog Mock mode enabled")
|
20
|
+
|
21
|
+
arg :net_config_file
|
22
|
+
|
23
|
+
examples_dir = File.absolute_path(
|
24
|
+
File.join(
|
25
|
+
File.dirname(__FILE__),
|
26
|
+
"..",
|
27
|
+
"examples",
|
28
|
+
File.basename(__FILE__),
|
29
|
+
))
|
30
|
+
|
31
|
+
description "
|
32
|
+
vcloud-net-launch takes a configuration describing a vCloud network,
|
33
|
+
and tries to make it a reality.
|
34
|
+
|
35
|
+
See https://github.com/alphagov/vcloud-tools for more info
|
36
|
+
|
37
|
+
Example configuration files can be found in:
|
38
|
+
#{examples_dir}
|
39
|
+
"
|
40
|
+
|
41
|
+
version Vcloud::NetLauncher::VERSION
|
42
|
+
|
43
|
+
go!
|
44
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
p1-production:
|
2
|
+
vcloud_director_username: '<username_from_top_right_of_skyscape_flash_ui>@<org_id_from_url_in_skyscape_flash_ui>'
|
3
|
+
vcloud_director_password: '<your_skyscape_password>'
|
4
|
+
vcloud_director_host: 'vcd.portal.skyscapecloud.com'
|
5
|
+
|
6
|
+
# You can extract this information by logging into skyscape portal
|
7
|
+
performance-platform-production:
|
8
|
+
vcloud_director_username: '<xxx.x.xxxxxx>@<x-x-xx-xxxxxx>'
|
9
|
+
vcloud_director_password: '<your_skyscape_password>'
|
10
|
+
vcloud_director_host: 'vcd.portal.skyscapecloud.com'
|
11
|
+
|
12
|
+
carrenza-preview:
|
13
|
+
vcloud_director_username: '<email>@<org_id>'
|
14
|
+
vcloud_director_password: ''
|
15
|
+
vcloud_director_host: 'myvdc.carrenza.net'
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# This example creates two orgVdcNetworks - one natRouted, the other isolated
|
2
|
+
#
|
3
|
+
# dns settings and ip_ranges are optional
|
4
|
+
#
|
5
|
+
# example-net-isolated-shared has is_shared set, which means that it will be
|
6
|
+
# available across all vDCs in the org (though is 'owned' by 'Our vDC').
|
7
|
+
#
|
8
|
+
---
|
9
|
+
org_vdc_networks:
|
10
|
+
|
11
|
+
- name: example-net-routed-1
|
12
|
+
description: "Frontend example network"
|
13
|
+
vdc_name: 'Our vDC'
|
14
|
+
fence_mode: natRouted
|
15
|
+
edge_gateway: Gateway-FRONTEND
|
16
|
+
netmask: 255.255.255.0
|
17
|
+
gateway: 192.0.2.1
|
18
|
+
dns1: 8.8.8.8
|
19
|
+
dns2: 8.8.4.4
|
20
|
+
dns_suffix: testing.example.com
|
21
|
+
ip_ranges:
|
22
|
+
- start_address: 192.0.2.11
|
23
|
+
end_address: 192.0.2.40
|
24
|
+
- start_address: 192.0.2.101
|
25
|
+
end_address: 192.0.2.140
|
26
|
+
|
27
|
+
- name: example-net-isolated-shared
|
28
|
+
vdc_name: 'Our vDC'
|
29
|
+
fence_mode: isolated
|
30
|
+
is_shared: true
|
31
|
+
netmask: 255.255.255.0
|
32
|
+
gateway: 198.51.100.1
|
33
|
+
dns1: 8.8.8.8
|
34
|
+
dns2: 8.8.4.4
|
35
|
+
dns_suffix: testing.example.com
|
36
|
+
ip_ranges:
|
37
|
+
- start_address: 198.51.100.11
|
38
|
+
end_address: 198.51.100.40
|
39
|
+
- start_address: 198.51.100.101
|
40
|
+
end_address: 198.51.100.140
|
41
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'aruba/cucumber'
|
2
|
+
require 'methadone/cucumber'
|
3
|
+
|
4
|
+
ENV['PATH'] = "#{File.expand_path(File.dirname(__FILE__) + '/../../bin')}#{File::PATH_SEPARATOR}#{ENV['PATH']}"
|
5
|
+
LIB_DIR = File.join(File.expand_path(File.dirname(__FILE__)),'..','..','lib')
|
6
|
+
|
7
|
+
Before do
|
8
|
+
# Using "announce" causes massive warnings on 1.9.2
|
9
|
+
@puts = true
|
10
|
+
@original_rubylib = ENV['RUBYLIB']
|
11
|
+
ENV['RUBYLIB'] = LIB_DIR + File::PATH_SEPARATOR + ENV['RUBYLIB'].to_s
|
12
|
+
end
|
13
|
+
|
14
|
+
After do
|
15
|
+
ENV['RUBYLIB'] = @original_rubylib
|
16
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Feature: "vcloud-net-launch" works as a useful command-line tool
|
2
|
+
In order to use "vcloud-net-launch" from the CLI
|
3
|
+
I want to have it behave like a typical Unix tool
|
4
|
+
So I don't get surpised
|
5
|
+
|
6
|
+
Scenario: Common arguments work
|
7
|
+
When I get help for "vcloud-net-launch"
|
8
|
+
Then the exit status should be 0
|
9
|
+
And the banner should be present
|
10
|
+
And the banner should document that this app takes options
|
11
|
+
And the following options should be documented:
|
12
|
+
|--version|
|
13
|
+
|--mock|
|
14
|
+
And the banner should document that this app's arguments are:
|
15
|
+
|net_config_file|
|
data/jenkins.sh
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/bin/bash -x
|
2
|
+
set -e
|
3
|
+
bundle install --path "${HOME}/bundles/${JOB_NAME}"
|
4
|
+
# commented out for now as there are no unit tests
|
5
|
+
# and rake aefault is currently integration test
|
6
|
+
# bundle exec rake
|
7
|
+
|
8
|
+
./scripts/generate_fog_conf_file.sh
|
9
|
+
export FOG_RC=fog_integration_test.config
|
10
|
+
bundle exec rake integration
|
11
|
+
rm fog_integration_test.config
|
12
|
+
|
13
|
+
bundle exec rake publish_gem
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'fog'
|
2
|
+
|
3
|
+
module Vcloud
|
4
|
+
module NetLauncher
|
5
|
+
class NetLaunch
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@config_loader = Vcloud::Core::ConfigLoader.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def run(config_file = nil, options = {})
|
12
|
+
config = @config_loader.load_config(config_file)
|
13
|
+
|
14
|
+
if options[:mock] || ENV['FOG_MOCK']
|
15
|
+
::Fog.mock!
|
16
|
+
end
|
17
|
+
|
18
|
+
config[:org_vdc_networks].each do |net_config|
|
19
|
+
net_config[:fence_mode] ||= 'isolated'
|
20
|
+
Vcloud::NetLauncher.logger.info("Provisioning orgVdcNetwork #{net_config[:name]}.")
|
21
|
+
begin
|
22
|
+
net = Vcloud::Core::OrgVdcNetwork.provision(net_config)
|
23
|
+
rescue RuntimeError => e
|
24
|
+
Vcloud::NetLauncher.logger.error("Could not provision orgVdcNetwork: #{e.message}")
|
25
|
+
raise
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'json'
|
4
|
+
require 'yaml'
|
5
|
+
require 'csv'
|
6
|
+
require 'open3'
|
7
|
+
require 'pp'
|
8
|
+
|
9
|
+
require 'vcloud/net_launcher/version'
|
10
|
+
|
11
|
+
require 'vcloud/fog'
|
12
|
+
require 'vcloud/core'
|
13
|
+
|
14
|
+
require 'vcloud/net_launcher/net_launch'
|
15
|
+
|
16
|
+
module Vcloud
|
17
|
+
module NetLauncher
|
18
|
+
|
19
|
+
def self.logger
|
20
|
+
@logger ||= Logger.new(STDOUT)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
data/scripts/basic.erb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
(
|
4
|
+
echo "============================================================"
|
5
|
+
echo "in ${1}:"
|
6
|
+
echo "vapp_name: <%= vapp_name -%>"
|
7
|
+
echo "role: <%= vars[:role] -%>"
|
8
|
+
echo "environment: <%= vars[:environment] -%>"
|
9
|
+
echo
|
10
|
+
env
|
11
|
+
) >> /PREAMBLE_OUT
|
12
|
+
|
13
|
+
|
data/spec/erb_helper.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
class ErbHelper
|
2
|
+
def self.convert_erb_template_to_yaml test_namespace, input_erb_config
|
3
|
+
input_erb_config = input_erb_config
|
4
|
+
e = ERB.new(File.open(input_erb_config).read)
|
5
|
+
output_yaml_config = File.join(File.dirname(input_erb_config), "output_#{Time.now.strftime('%s')}.yaml")
|
6
|
+
File.open(output_yaml_config, 'w') { |f|
|
7
|
+
f.write e.result(OpenStruct.new(test_namespace).instance_eval { binding })
|
8
|
+
}
|
9
|
+
output_yaml_config
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,151 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pp'
|
3
|
+
|
4
|
+
describe Vcloud::Core::OrgVdcNetwork do
|
5
|
+
|
6
|
+
context "natRouted network" do
|
7
|
+
|
8
|
+
before(:all) do
|
9
|
+
test_data = define_test_data
|
10
|
+
@config = {
|
11
|
+
:name => test_data[:name],
|
12
|
+
:description => "Integration Test network #{@name}",
|
13
|
+
:vdc_name => test_data[:vdc_name],
|
14
|
+
:fence_mode => 'natRouted',
|
15
|
+
:edge_gateway => test_data[:edge_gateway_name],
|
16
|
+
:gateway => '10.88.11.1',
|
17
|
+
:netmask => '255.255.255.0',
|
18
|
+
:dns1 => '8.8.8.8',
|
19
|
+
:dns2 => '8.8.4.4',
|
20
|
+
:ip_ranges => [
|
21
|
+
{ :start_address => '10.88.11.100',
|
22
|
+
:end_address => '10.88.11.150' },
|
23
|
+
{ :start_address => '10.88.11.200',
|
24
|
+
:end_address => '10.88.11.250' },
|
25
|
+
],
|
26
|
+
}
|
27
|
+
@net = Vcloud::Core::OrgVdcNetwork.provision(@config)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should be an OrgVdcNetwork' do
|
31
|
+
expect(@net.class).to be(Vcloud::Core::OrgVdcNetwork)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should have an id' do
|
35
|
+
expect(@net.id).to match(/^[0-9a-f-]+$/)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should have a name' do
|
39
|
+
expect(@net.name) == @config[:name]
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should have a :gateway attribute' do
|
43
|
+
expect(@net.vcloud_attributes[:gateway]) == @config[:gateway]
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should have a :netmask attribute' do
|
47
|
+
expect(@net.vcloud_attributes[:gateway]) == @config[:netmask]
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should have a :dns1 attribute' do
|
51
|
+
expect(@net.vcloud_attributes[:dns1]) == @config[:dns1]
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should have a :dns2 attribute' do
|
55
|
+
expect(@net.vcloud_attributes[:dns2]) == @config[:dns2]
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should have an :ip_ranges attribute' do
|
59
|
+
expect(@net.vcloud_attributes[:ip_ranges]) == [
|
60
|
+
{:start_address=>"10.88.11.200", :end_address=>"10.88.11.250"},
|
61
|
+
{:start_address=>"10.88.11.100", :end_address=>"10.88.11.150"}
|
62
|
+
]
|
63
|
+
end
|
64
|
+
|
65
|
+
after(:all) do
|
66
|
+
unless ENV['VCLOUD_TOOLS_RSPEC_NO_DELETE_ORG_VDC_NETWORK']
|
67
|
+
Vcloud::Fog::ServiceInterface.new.delete_network(@net.id) if @net
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
context "isolated network" do
|
74
|
+
|
75
|
+
before(:all) do
|
76
|
+
test_data = define_test_data
|
77
|
+
@config = {
|
78
|
+
:name => test_data[:name],
|
79
|
+
:description => "Integration Test network #{@name}",
|
80
|
+
:vdc_name => test_data[:vdc_name],
|
81
|
+
:fence_mode => 'isolated',
|
82
|
+
:gateway => '10.88.11.1',
|
83
|
+
:netmask => '255.255.255.0',
|
84
|
+
:dns1 => '8.8.8.8',
|
85
|
+
:dns2 => '8.8.4.4',
|
86
|
+
:ip_ranges => [
|
87
|
+
{ :start_address => '10.88.11.100',
|
88
|
+
:end_address => '10.88.11.150' },
|
89
|
+
{ :start_address => '10.88.11.200',
|
90
|
+
:end_address => '10.88.11.250' },
|
91
|
+
],
|
92
|
+
}
|
93
|
+
@net = Vcloud::Core::OrgVdcNetwork.provision(@config)
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'should be an OrgVdcNetwork' do
|
97
|
+
expect(@net.class).to be(Vcloud::Core::OrgVdcNetwork)
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'should have an id' do
|
101
|
+
expect(@net.id).to match(/^[0-9a-f-]+$/)
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'should have a name' do
|
105
|
+
expect(@net.name) == @config[:name]
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'should have a :gateway attribute' do
|
109
|
+
expect(@net.vcloud_attributes[:gateway]) == @config[:gateway]
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'should have a :netmask attribute' do
|
113
|
+
expect(@net.vcloud_attributes[:gateway]) == @config[:netmask]
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'should have a :dns1 attribute' do
|
117
|
+
expect(@net.vcloud_attributes[:dns1]) == @config[:dns1]
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'should have a :dns2 attribute' do
|
121
|
+
expect(@net.vcloud_attributes[:dns2]) == @config[:dns2]
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'should have an :ip_ranges attribute' do
|
125
|
+
expect(@net.vcloud_attributes[:ip_ranges]) == [
|
126
|
+
{:start_address=>"10.88.11.200", :end_address=>"10.88.11.250"},
|
127
|
+
{:start_address=>"10.88.11.100", :end_address=>"10.88.11.150"}
|
128
|
+
]
|
129
|
+
end
|
130
|
+
|
131
|
+
after(:all) do
|
132
|
+
unless ENV['VCLOUD_TOOLS_RSPEC_NO_DELETE_ORG_VDC_NETWORK']
|
133
|
+
Vcloud::Fog::ServiceInterface.new.delete_network(@net.id) if @net
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
def define_test_data
|
140
|
+
[ 'VCLOUD_VDC_NAME', 'VCLOUD_EDGE_GATEWAY' ].each do |n|
|
141
|
+
raise "Need #{n} set" unless ENV[n]
|
142
|
+
end
|
143
|
+
{
|
144
|
+
:name => "orgVdcNetwork-vcloud-tools-tests #{Time.now.strftime('%s')}",
|
145
|
+
:vdc_name => ENV['VCLOUD_VDC_NAME'],
|
146
|
+
:edge_gateway_name => ENV['VCLOUD_EDGE_GATEWAY'],
|
147
|
+
}
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pp'
|
3
|
+
require 'erb'
|
4
|
+
|
5
|
+
module Vcloud
|
6
|
+
module NetLauncher
|
7
|
+
describe NetLaunch do
|
8
|
+
|
9
|
+
context 'with minimum input setup' do
|
10
|
+
|
11
|
+
it 'should create an isolated network' do
|
12
|
+
test_data = default_test_data('isolated')
|
13
|
+
@minimum_data_yaml = generate_data_file(test_data)
|
14
|
+
|
15
|
+
Vcloud::NetLauncher::NetLaunch.new.run(@minimum_data_yaml)
|
16
|
+
|
17
|
+
@found_networks = find_network(test_data[:network_name])
|
18
|
+
@found_networks.length.should == 1
|
19
|
+
provisioned_network = @found_networks[0]
|
20
|
+
provisioned_network[:gateway].should == test_data[:gateway]
|
21
|
+
provisioned_network[:netmask].should == test_data[:netmask]
|
22
|
+
provisioned_network[:isLinked].should == 'false'
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should create an nat routed network' do
|
26
|
+
test_data = default_test_data('natRouted')
|
27
|
+
test_data[:edgeGateway] = ENV['VCLOUD_EDGE_GATEWAY'] #only needed for natRouted networks
|
28
|
+
@minimum_data_yaml = generate_data_file(test_data)
|
29
|
+
|
30
|
+
Vcloud::NetLauncher::NetLaunch.new.run(@minimum_data_yaml)
|
31
|
+
|
32
|
+
@found_networks = find_network(test_data[:network_name])
|
33
|
+
|
34
|
+
@found_networks.length.should == 1
|
35
|
+
provisioned_network = @found_networks[0]
|
36
|
+
provisioned_network[:gateway].should == test_data[:gateway]
|
37
|
+
provisioned_network[:netmask].should == test_data[:netmask]
|
38
|
+
provisioned_network[:isLinked].should == 'true'
|
39
|
+
end
|
40
|
+
|
41
|
+
after(:each) do
|
42
|
+
unless ENV['VCLOUD_TOOLS_RSPEC_NO_DELETE_VAPP']
|
43
|
+
File.delete @minimum_data_yaml
|
44
|
+
fog_interface = Vcloud::Fog::ServiceInterface.new
|
45
|
+
provisioned_network_id = @found_networks[0][:href].split('/').last
|
46
|
+
fog_interface.delete_network(provisioned_network_id).should == true
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
def default_test_data(type)
|
53
|
+
{
|
54
|
+
network_name: "vapp-vcloud-tools-tests-#{Time.now.strftime('%s')}",
|
55
|
+
vdc_name: ENV['VCLOUD_VDC_NAME'],
|
56
|
+
fence_mode: type,
|
57
|
+
netmask: '255.255.255.0',
|
58
|
+
gateway: '192.0.2.1',
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
def find_network(network_name)
|
63
|
+
query = Vcloud::QueryRunner.new()
|
64
|
+
query.run('orgNetwork', :filter => "name==#{network_name}")
|
65
|
+
end
|
66
|
+
|
67
|
+
def generate_data_file(test_data)
|
68
|
+
minimum_data_erb = File.join(File.dirname(__FILE__), 'data/minimum_data_setup.yaml.erb')
|
69
|
+
ErbHelper.convert_erb_template_to_yaml(test_data, minimum_data_erb)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -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,32 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
lib = File.expand_path('../lib/', __FILE__)
|
4
|
+
$LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
require 'vcloud/net_launcher/version'
|
7
|
+
|
8
|
+
Gem::Specification.new do |s|
|
9
|
+
s.name = 'vcloud-net_launcher'
|
10
|
+
s.version = Vcloud::NetLauncher::VERSION
|
11
|
+
s.authors = ['Anna Shipman']
|
12
|
+
s.email = ['anna.shipman@digital.cabinet-office.gov.uk']
|
13
|
+
s.summary = 'Tool to launch and configure vCloud networks'
|
14
|
+
s.description = 'Tool to launch and configure vCloud networks. Uses vcloud-core.'
|
15
|
+
s.homepage = 'http://github.com/alphagov/vcloud-net_launcher'
|
16
|
+
s.license = 'MIT'
|
17
|
+
|
18
|
+
s.files = `git ls-files`.split($/)
|
19
|
+
s.executables = s.files.grep(%r{^bin/}) {|f| File.basename(f)}
|
20
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
21
|
+
s.require_paths = ['lib']
|
22
|
+
|
23
|
+
s.required_ruby_version = '>= 1.9.2'
|
24
|
+
|
25
|
+
s.add_runtime_dependency 'vcloud-core', '>= 0.0.9'
|
26
|
+
s.add_runtime_dependency 'methadone'
|
27
|
+
s.add_development_dependency 'rake'
|
28
|
+
s.add_development_dependency 'rspec', '~> 2.14.1'
|
29
|
+
s.add_development_dependency 'cucumber', '~> 1.3.10'
|
30
|
+
s.add_development_dependency 'gem_publisher', '1.2.0'
|
31
|
+
end
|
32
|
+
|
metadata
ADDED
@@ -0,0 +1,180 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vcloud-net_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-03-24 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: vcloud-core
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.0.9
|
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.0.9
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: methadone
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
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'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
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'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 2.14.1
|
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: 2.14.1
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: cucumber
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 1.3.10
|
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.3.10
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: gem_publisher
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - '='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 1.2.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: 1.2.0
|
110
|
+
description: Tool to launch and configure vCloud networks. Uses vcloud-core.
|
111
|
+
email:
|
112
|
+
- anna.shipman@digital.cabinet-office.gov.uk
|
113
|
+
executables:
|
114
|
+
- vcloud-net-launch
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- .gitignore
|
119
|
+
- Gemfile
|
120
|
+
- LICENSE.txt
|
121
|
+
- README.md
|
122
|
+
- Rakefile
|
123
|
+
- bin/vcloud-net-launch
|
124
|
+
- examples/.fog-example.fog
|
125
|
+
- examples/vcloud-net-launch/example-config.yaml
|
126
|
+
- features/step_definitions/vcloud-launch_steps.rb
|
127
|
+
- features/support/env.rb
|
128
|
+
- features/vcloud-net-launch.feature
|
129
|
+
- jenkins.sh
|
130
|
+
- jenkins_integration_tests.sh
|
131
|
+
- lib/vcloud/net_launcher.rb
|
132
|
+
- lib/vcloud/net_launcher/net_launch.rb
|
133
|
+
- lib/vcloud/net_launcher/version.rb
|
134
|
+
- scripts/basic.erb
|
135
|
+
- scripts/generate_fog_conf_file.sh
|
136
|
+
- spec/erb_helper.rb
|
137
|
+
- spec/integration/net_launcher/data/minimum_data_setup.yaml.erb
|
138
|
+
- spec/integration/net_launcher/org_vdc_network_spec.rb
|
139
|
+
- spec/integration/net_launcher/vcloud_net_launcher_spec.rb
|
140
|
+
- spec/spec_helper.rb
|
141
|
+
- spec/support/stub_fog_interface.rb
|
142
|
+
- vcloud-net_launcher.gemspec
|
143
|
+
homepage: http://github.com/alphagov/vcloud-net_launcher
|
144
|
+
licenses:
|
145
|
+
- MIT
|
146
|
+
post_install_message:
|
147
|
+
rdoc_options: []
|
148
|
+
require_paths:
|
149
|
+
- lib
|
150
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
151
|
+
none: false
|
152
|
+
requirements:
|
153
|
+
- - ! '>='
|
154
|
+
- !ruby/object:Gem::Version
|
155
|
+
version: 1.9.2
|
156
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
157
|
+
none: false
|
158
|
+
requirements:
|
159
|
+
- - ! '>='
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
version: '0'
|
162
|
+
segments:
|
163
|
+
- 0
|
164
|
+
hash: -783879997107424928
|
165
|
+
requirements: []
|
166
|
+
rubyforge_project:
|
167
|
+
rubygems_version: 1.8.23
|
168
|
+
signing_key:
|
169
|
+
specification_version: 3
|
170
|
+
summary: Tool to launch and configure vCloud networks
|
171
|
+
test_files:
|
172
|
+
- features/step_definitions/vcloud-launch_steps.rb
|
173
|
+
- features/support/env.rb
|
174
|
+
- features/vcloud-net-launch.feature
|
175
|
+
- spec/erb_helper.rb
|
176
|
+
- spec/integration/net_launcher/data/minimum_data_setup.yaml.erb
|
177
|
+
- spec/integration/net_launcher/org_vdc_network_spec.rb
|
178
|
+
- spec/integration/net_launcher/vcloud_net_launcher_spec.rb
|
179
|
+
- spec/spec_helper.rb
|
180
|
+
- spec/support/stub_fog_interface.rb
|