bosh-bootstrap 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +2 -0
- data/ChangeLog.md +22 -0
- data/Gemfile +4 -0
- data/Guardfile +6 -0
- data/Rakefile +30 -0
- data/bosh-bootstrap.gemspec +2 -1
- data/lib/bosh-bootstrap/cli.rb +39 -19
- data/lib/bosh-bootstrap/commander/remote_server.rb +6 -3
- data/lib/bosh-bootstrap/helpers.rb +1 -0
- data/lib/bosh-bootstrap/helpers/settings_setter.rb +20 -0
- data/lib/bosh-bootstrap/stages/stage_micro_bosh_deploy.rb +4 -2
- data/lib/bosh-bootstrap/stages/stage_micro_bosh_deploy/download_micro_bosh_stemcell +1 -1
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm.rb +3 -1
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_bosh +19 -1
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_bosh_plugins +23 -0
- data/lib/bosh-bootstrap/version.rb +1 -1
- data/spec/assets/.gitkeep +0 -0
- data/spec/assets/bosh/public_stemcells/aws_micro.out +7 -0
- data/spec/functional/.gitkeep +0 -0
- data/spec/spec_helper.rb +39 -0
- data/spec/unit/.gitkeep +0 -0
- data/spec/unit/cli_spec.rb +117 -0
- data/spec/unit/cli_ssh_spec.rb +47 -0
- metadata +45 -5
data/.rspec
ADDED
data/ChangeLog.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# Change Log
|
2
|
+
|
3
|
+
## v0.6
|
4
|
+
|
5
|
+
Highlights:
|
6
|
+
|
7
|
+
* Defaults to downloading latest stemcell (rather than stable, which are getting old now).
|
8
|
+
* Installs the Cloud Foundry plugin for BOSH https://github.com/StarkAndWayne/bosh-cloudfoundry
|
9
|
+
|
10
|
+
Additions:
|
11
|
+
|
12
|
+
* `tmux` - if you have tmux installed, then you can SSH into inception VM with it (thx @mrdavidlang)
|
13
|
+
* started a test suite; its small but growing! (thx @mrdavidlang for getting it started)
|
14
|
+
|
15
|
+
Bug fixes:
|
16
|
+
|
17
|
+
* Fog::SSH uses explicit ssh key that was requested to access inception VM
|
18
|
+
|
19
|
+
Future thoughts:
|
20
|
+
|
21
|
+
* I hate Settingslogic for read-write settings. It's really only a read-only settings DSL. It puts Ruby classes into the YAML. Probably going to rip it out.
|
22
|
+
* I am so sorry I took so long to start writing tests. It always seemed such a hard thing to write tests for. But bosh-cloudfoundry project has had good success with internal tests; so we're migrating those ideas into this project.
|
data/Gemfile
CHANGED
data/Guardfile
ADDED
data/Rakefile
CHANGED
@@ -1 +1,31 @@
|
|
1
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __FILE__)
|
2
|
+
|
3
|
+
require "rubygems"
|
4
|
+
require "bundler"
|
5
|
+
Bundler.setup(:default, :test, :development)
|
6
|
+
|
1
7
|
require "bundler/gem_tasks"
|
8
|
+
|
9
|
+
require "rake/dsl_definition"
|
10
|
+
require "rake"
|
11
|
+
require "rspec/core/rake_task"
|
12
|
+
|
13
|
+
|
14
|
+
if defined?(RSpec)
|
15
|
+
namespace :spec do
|
16
|
+
desc "Run Unit Tests"
|
17
|
+
unit_rspec_task = RSpec::Core::RakeTask.new(:unit) do |t|
|
18
|
+
t.pattern = "spec/unit/**/*_spec.rb"
|
19
|
+
t.rspec_opts = %w(--format progress --color -d)
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "Run Integration Tests"
|
23
|
+
functional_rspec_task = RSpec::Core::RakeTask.new(:functional) do |t|
|
24
|
+
t.pattern = "spec/functional/**/*_spec.rb"
|
25
|
+
t.rspec_opts = %w(--format progress --color)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
desc "Install dependencies and run tests"
|
30
|
+
task :spec => %w(spec:unit spec:functional)
|
31
|
+
end
|
data/bosh-bootstrap.gemspec
CHANGED
data/lib/bosh-bootstrap/cli.rb
CHANGED
@@ -25,7 +25,8 @@ module Bosh::Bootstrap
|
|
25
25
|
method_option :"private-key", :type => :string, :desc => "Local passphrase-less private key path"
|
26
26
|
method_option :"upgrade-deps", :type => :boolean, :desc => "Force upgrade dependencies, packages & gems"
|
27
27
|
method_option :"edge-deployer", :type => :boolean, :desc => "Install bosh deployer from git instead of rubygems"
|
28
|
-
method_option :"
|
28
|
+
method_option :"stable-stemcell", :type => :boolean, :desc => "Use recent stable microbosh stemcell"
|
29
|
+
method_option :"latest-stemcell", :type => :boolean, :desc => "Use latest microbosh stemcell; possibly not tagged stable [default]"
|
29
30
|
method_option :"edge-stemcell", :type => :boolean, :desc => "Create custom stemcell from BOSH git source"
|
30
31
|
def deploy
|
31
32
|
load_deploy_options # from method_options above
|
@@ -61,6 +62,15 @@ module Bosh::Bootstrap
|
|
61
62
|
run_ssh_command_or_open_tunnel(cmd)
|
62
63
|
end
|
63
64
|
|
65
|
+
desc "tmux", "Open an ssh (with tmux) session to the inception VM [do nothing if local machine is inception VM]"
|
66
|
+
long_desc <<-DESC
|
67
|
+
Opens a connection using ssh and attaches to the most recent tmux session;
|
68
|
+
giving you persistance across disconnects.
|
69
|
+
DESC
|
70
|
+
def tmux
|
71
|
+
run_ssh_command_or_open_tunnel(["-t", "tmux attach || tmux new-session"])
|
72
|
+
end
|
73
|
+
|
64
74
|
no_tasks do
|
65
75
|
DEFAULT_INCEPTION_VOLUME_SIZE = 32 # Gb
|
66
76
|
|
@@ -185,7 +195,7 @@ module Bosh::Bootstrap
|
|
185
195
|
save_settings!
|
186
196
|
|
187
197
|
if settings["inception"]["host"]
|
188
|
-
@server = Commander::RemoteServer.new(settings.inception.host)
|
198
|
+
@server = Commander::RemoteServer.new(settings.inception.host, settings.local.private_key_path)
|
189
199
|
confirm "Using inception VM #{settings.inception.username}@#{settings.inception.host}"
|
190
200
|
else
|
191
201
|
@server = Commander::LocalServer.new
|
@@ -202,9 +212,9 @@ module Bosh::Bootstrap
|
|
202
212
|
end
|
203
213
|
|
204
214
|
def deploy_stage_4_prepare_inception_vm
|
205
|
-
unless settings["inception"]["prepared"] && !settings["upgrade_deps"]
|
215
|
+
unless settings["inception"] && settings["inception"]["prepared"] && !settings["upgrade_deps"]
|
206
216
|
header "Stage 4: Preparing the Inception VM"
|
207
|
-
unless
|
217
|
+
unless run_server(Bosh::Bootstrap::Stages::StagePrepareInceptionVm.new(settings).commands)
|
208
218
|
error "Failed to complete Stage 4: Preparing the Inception VM"
|
209
219
|
end
|
210
220
|
# Settings are updated by this stage
|
@@ -219,7 +229,7 @@ module Bosh::Bootstrap
|
|
219
229
|
|
220
230
|
def deploy_stage_5_deploy_micro_bosh
|
221
231
|
header "Stage 5: Deploying micro BOSH"
|
222
|
-
unless
|
232
|
+
unless run_server(Bosh::Bootstrap::Stages::MicroBoshDeploy.new(settings).commands)
|
223
233
|
error "Failed to complete Stage 5: Deploying micro BOSH"
|
224
234
|
end
|
225
235
|
|
@@ -232,7 +242,7 @@ module Bosh::Bootstrap
|
|
232
242
|
sleep 5
|
233
243
|
|
234
244
|
header "Stage 6: Setup bosh"
|
235
|
-
unless
|
245
|
+
unless run_server(Bosh::Bootstrap::Stages::SetupNewBosh.new(settings).commands)
|
236
246
|
error "Failed to complete Stage 6: Setup bosh"
|
237
247
|
end
|
238
248
|
|
@@ -248,7 +258,7 @@ module Bosh::Bootstrap
|
|
248
258
|
def delete_stage_1_target_inception_vm
|
249
259
|
header "Stage 1: Target inception VM to use to delete micro-bosh"
|
250
260
|
if settings["inception"]["host"]
|
251
|
-
@server = Commander::RemoteServer.new(settings.inception.host)
|
261
|
+
@server = Commander::RemoteServer.new(settings.inception.host, settings.local.private_key_path)
|
252
262
|
confirm "Using inception VM #{settings.inception.username}@#{settings.inception.host}"
|
253
263
|
else
|
254
264
|
@server = Commander::LocalServer.new
|
@@ -281,7 +291,8 @@ module Bosh::Bootstrap
|
|
281
291
|
exit "Inception VM has not finished launching; run to complete: #{self.class.banner_base} deploy"
|
282
292
|
end
|
283
293
|
username = 'vcap'
|
284
|
-
|
294
|
+
result = system Escape.shell_command(['ssh', "#{username}@#{host}", cmd].flatten.compact)
|
295
|
+
exit result
|
285
296
|
|
286
297
|
# TODO how to use the specific private_key_path as configured in settings
|
287
298
|
# _, private_key_path = local_ssh_key_paths
|
@@ -319,16 +330,19 @@ module Bosh::Bootstrap
|
|
319
330
|
settings["bosh_git_source"] = options[:"edge-deployer"] # use bosh git repo instead of rubygems
|
320
331
|
|
321
332
|
# determine which micro-bosh stemcell to download/create
|
322
|
-
if options[:"
|
333
|
+
if options[:"stable-stemcell"]
|
334
|
+
settings["micro_bosh_stemcell_type"] = "stable"
|
335
|
+
settings["micro_bosh_stemcell_name"] = nil # force name to be refetched
|
336
|
+
elsif options[:"latest-stemcell"]
|
323
337
|
settings["micro_bosh_stemcell_type"] = "latest"
|
324
338
|
settings["micro_bosh_stemcell_name"] = nil # force name to be refetched
|
325
339
|
elsif options[:"edge-stemcell"]
|
326
340
|
settings["micro_bosh_stemcell_type"] = "custom"
|
327
341
|
settings["micro_bosh_stemcell_name"] = "custom"
|
328
|
-
else
|
329
|
-
# may have already been set from previous deploy run
|
330
|
-
settings["micro_bosh_stemcell_type"] ||= "stable"
|
331
342
|
end
|
343
|
+
# may have already been set from previous deploy run
|
344
|
+
# default to "latest" for both AWS and OpenStack at the moment (no useful stable stemcells)
|
345
|
+
settings["micro_bosh_stemcell_type"] ||= "latest"
|
332
346
|
|
333
347
|
# once a stemcell is downloaded or created; these fields above should
|
334
348
|
# be uploaded with values such as:
|
@@ -913,6 +927,10 @@ module Bosh::Bootstrap
|
|
913
927
|
say "SSH access: ssh -i #{private_key_path} #{settings["inception"]["username"]}@#{settings["inception"]["host"]}"
|
914
928
|
end
|
915
929
|
|
930
|
+
def run_server(server_commands)
|
931
|
+
server.run(server_commands)
|
932
|
+
end
|
933
|
+
|
916
934
|
# Discover/create local passphrase-less SSH keys to allow
|
917
935
|
# communication with Inception VM
|
918
936
|
#
|
@@ -951,12 +969,10 @@ module Bosh::Bootstrap
|
|
951
969
|
# for the target provider (aws, vsphere, openstack)
|
952
970
|
def micro_bosh_stemcell_name
|
953
971
|
@micro_bosh_stemcell_name ||= begin
|
954
|
-
|
955
|
-
|
956
|
-
|
957
|
-
|
958
|
-
else
|
959
|
-
if settings["micro_bosh_stemcell_type"] == "stable"
|
972
|
+
stemcell_filter_tags = ['micro', provider_name]
|
973
|
+
if settings["micro_bosh_stemcell_type"] == "stable"
|
974
|
+
unless openstack?
|
975
|
+
# FIXME remove this if when openstack has its first stable
|
960
976
|
stemcell_filter_tags << "stable" # latest stable micro-bosh stemcell by default
|
961
977
|
end
|
962
978
|
end
|
@@ -974,7 +990,11 @@ module Bosh::Bootstrap
|
|
974
990
|
#
|
975
991
|
# So to get the latest version for the filter tags,
|
976
992
|
# get the Name field, reverse sort, and return the first item
|
977
|
-
|
993
|
+
# Effectively:
|
994
|
+
# `#{bosh_stemcells_cmd} | grep micro | awk '{ print $2 }' | sort -r | head -n 1`.strip
|
995
|
+
stemcell_output = `#{bosh_stemcells_cmd}`
|
996
|
+
say stemcell_output
|
997
|
+
stemcell_output.scan(/[\w.-]+\.tgz/).last
|
978
998
|
end
|
979
999
|
end
|
980
1000
|
|
@@ -4,11 +4,12 @@ require "tempfile"
|
|
4
4
|
class Bosh::Bootstrap::Commander::RemoteServer
|
5
5
|
|
6
6
|
attr_reader :host
|
7
|
+
attr_reader :private_key_path
|
7
8
|
attr_reader :default_username
|
8
9
|
attr_reader :logfile
|
9
10
|
|
10
|
-
def initialize(host, logfile=STDERR)
|
11
|
-
@host, @logfile = host, logfile
|
11
|
+
def initialize(host, private_key_path, logfile=STDERR)
|
12
|
+
@host, @private_key_path, @logfile = host, private_key_path, logfile
|
12
13
|
@default_username = "vcap" # unless overridden by a Command (before vcap exists)
|
13
14
|
end
|
14
15
|
|
@@ -51,6 +52,7 @@ class Bosh::Bootstrap::Commander::RemoteServer
|
|
51
52
|
output =~ /^(.*)\Z/
|
52
53
|
last_line = $1
|
53
54
|
# store output into a settings field, if requested
|
55
|
+
# TODO replace this with SettingsSetting#setting(settings_key, last_line.strip)
|
54
56
|
if settings_key
|
55
57
|
settings_key_portions = settings_key.split(".")
|
56
58
|
parent_key_portions, final_key = settings_key_portions[0..-2], settings_key_portions[-1]
|
@@ -100,7 +102,8 @@ class Bosh::Bootstrap::Commander::RemoteServer
|
|
100
102
|
"bash -lc 'sudo /usr/bin/env PATH=$PATH #{remote_path}'"
|
101
103
|
]
|
102
104
|
script_output = ""
|
103
|
-
|
105
|
+
keys = [private_key_path] # path to local private key being used
|
106
|
+
results = Fog::SSH.new(host, username, keys: keys).run(commands) do |stdout, stderr|
|
104
107
|
[stdout, stderr].flatten.each do |data|
|
105
108
|
logfile << data
|
106
109
|
script_output << data
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# Copyright (c) 2012-2013 Stark & Wayne, LLC
|
2
|
+
|
3
|
+
require "settingslogic"
|
4
|
+
module Bosh; module Bootstrap; module Helpers; end; end; end
|
5
|
+
|
6
|
+
# Set a nested setting with "key1.key2.key3" notation
|
7
|
+
#
|
8
|
+
# Assumes +settings+ contains the settings
|
9
|
+
module Bosh::Bootstrap::Helpers::SettingsSetter
|
10
|
+
def setting(nested_key, value)
|
11
|
+
target_settings_field = settings
|
12
|
+
settings_key_portions = nested_key.split(".")
|
13
|
+
parent_key_portions, final_key = settings_key_portions[0..-2], settings_key_portions[-1]
|
14
|
+
parent_key_portions.each do |key_portion|
|
15
|
+
target_settings_field[key_portion] ||= {}
|
16
|
+
target_settings_field = target_settings_field[key_portion]
|
17
|
+
end
|
18
|
+
target_settings_field[final_key] = value
|
19
|
+
end
|
20
|
+
end
|
@@ -45,14 +45,16 @@ module Bosh::Bootstrap::Stages
|
|
45
45
|
if File.exist?(path)
|
46
46
|
script = File.read(path)
|
47
47
|
if variables.keys.size > 0
|
48
|
+
env_variables = variables.reject { |var| var.is_a?(Symbol) }
|
49
|
+
|
48
50
|
# inject variables into script if its bash script
|
49
51
|
inline_variables = "#!/usr/bin/env bash\n\n"
|
50
|
-
|
52
|
+
env_variables.each { |name, value| inline_variables << "#{name}='#{value}'\n" }
|
51
53
|
script.gsub!("#!/usr/bin/env bash", inline_variables)
|
52
54
|
|
53
55
|
# inject variables into script if its ruby script
|
54
56
|
inline_variables = "#!/usr/bin/env ruby\n\n"
|
55
|
-
|
57
|
+
env_variables.each { |name, value| inline_variables << "ENV['#{name}'] = '#{value}'\n" }
|
56
58
|
script.gsub!("#!/usr/bin/env ruby", inline_variables)
|
57
59
|
end
|
58
60
|
script
|
@@ -107,7 +107,7 @@ if [[ "${MICRO_BOSH_STEMCELL_NAME}" == "custom" ]]; then
|
|
107
107
|
|
108
108
|
cd $BOSH_DIR
|
109
109
|
echo "Creating custom stemcell..."
|
110
|
-
bundle install
|
110
|
+
bundle install
|
111
111
|
bundle exec rake stemcell:micro[$PROVIDER,$MICRO_BOSH_MANIFEST_PATH,$LATEST_BOSH_RELEASE_PATH]
|
112
112
|
|
113
113
|
echo "Copying to stemcells folder..."
|
@@ -18,6 +18,7 @@ module Bosh::Bootstrap::Stages
|
|
18
18
|
server.install "bosh", script("install_bosh",
|
19
19
|
"UPGRADE" => settings[:upgrade_deps],
|
20
20
|
"INSTALL_BOSH_FROM_SOURCE" => settings["bosh_git_source"] || "")
|
21
|
+
server.install "bosh plugins", script("install_bosh_plugins", "UPGRADE" => settings[:upgrade_deps])
|
21
22
|
# use inception VM to generate a salted password (local machine may not have mkpasswd)
|
22
23
|
server.capture_value "salted password", script("convert_salted_password", "PASSWORD" => settings.bosh.password),
|
23
24
|
:settings => settings, :save_output_to_settings_key => "bosh.salted_password"
|
@@ -39,7 +40,8 @@ module Bosh::Bootstrap::Stages
|
|
39
40
|
script = File.read(path)
|
40
41
|
if variables.keys.size > 0
|
41
42
|
inline_variables = "#!/usr/bin/env bash\n\n"
|
42
|
-
variables.
|
43
|
+
env_variables = variables.reject { |var| var.is_a?(Symbol) }
|
44
|
+
env_variables.each { |name, value| inline_variables << "#{name}=#{value}\n" }
|
43
45
|
script.gsub!("#!/usr/bin/env bash", inline_variables)
|
44
46
|
end
|
45
47
|
script
|
@@ -32,7 +32,22 @@ if [[ "${INSTALL_BOSH_FROM_SOURCE}X" != "X" ]]; then
|
|
32
32
|
fi
|
33
33
|
|
34
34
|
bosh_dir=/var/vcap/store/repos/bosh
|
35
|
-
|
35
|
+
projects=(
|
36
|
+
bosh_common
|
37
|
+
blobstore_client
|
38
|
+
bosh_cpi
|
39
|
+
ruby_vcloud_sdk
|
40
|
+
bosh_vcloud_cpi
|
41
|
+
ruby_vim_sdk
|
42
|
+
bosh_vsphere_cpi
|
43
|
+
bosh_aws_cpi
|
44
|
+
agent_client
|
45
|
+
bosh_cli
|
46
|
+
bosh_aws_registry
|
47
|
+
bosh_openstack_registry
|
48
|
+
bosh_deployer
|
49
|
+
)
|
50
|
+
for project in "${projects[@]}"; do
|
36
51
|
cd $bosh_dir/$project/
|
37
52
|
rm -rf pkg
|
38
53
|
bundle install --without=development test
|
@@ -44,6 +59,9 @@ if [[ "${INSTALL_BOSH_FROM_SOURCE}X" != "X" ]]; then
|
|
44
59
|
|
45
60
|
else
|
46
61
|
install_gem bosh_cli
|
62
|
+
# TODO remove this when bosh_deployer starts installing aws-sdk 1.8.1.1 or higher
|
63
|
+
install_gem httparty
|
64
|
+
# end TODO
|
47
65
|
install_gem bosh_deployer
|
48
66
|
fi
|
49
67
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# Install bosh-cloudfoundry BOSH CLI plugin
|
4
|
+
#
|
5
|
+
# Options:
|
6
|
+
# * $UPGRADE - re-install or upgrade gems if already installed
|
7
|
+
|
8
|
+
if [[ $EUID -ne 0 ]]; then
|
9
|
+
echo "ERROR: This script must be run as root" 1>&2
|
10
|
+
exit 1
|
11
|
+
fi
|
12
|
+
|
13
|
+
# Install a gem if $UPGRADE exists or if gem not already installed
|
14
|
+
function install_gem() {
|
15
|
+
gem_name=$1
|
16
|
+
if [[ ("${UPGRADE}X" != "X") || "$(gem list $gem_name | grep $gem_name)X" == "X" ]]; then
|
17
|
+
gem install $gem_name --no-ri --no-rdoc
|
18
|
+
else
|
19
|
+
echo gem $gem_name already installed
|
20
|
+
fi
|
21
|
+
}
|
22
|
+
|
23
|
+
install_gem bosh-cloudfoundry
|
File without changes
|
@@ -0,0 +1,7 @@
|
|
1
|
+
+-----------------------------------+--------------------+
|
2
|
+
| Name | Tags |
|
3
|
+
+-----------------------------------+--------------------+
|
4
|
+
| micro-bosh-stemcell-aws-0.6.4.tgz | aws, micro, stable |
|
5
|
+
| micro-bosh-stemcell-aws-0.7.0.tgz | aws, micro, test |
|
6
|
+
| micro-bosh-stemcell-aws-0.8.1.tgz | aws, micro, test |
|
7
|
+
+-----------------------------------+--------------------+
|
File without changes
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# Copyright (c) 2012-2013 Stark & Wayne, LLC
|
2
|
+
|
3
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", __FILE__)
|
4
|
+
|
5
|
+
require "rubygems"
|
6
|
+
require "bundler"
|
7
|
+
Bundler.setup(:default, :test)
|
8
|
+
|
9
|
+
$:.unshift(File.expand_path("../../lib", __FILE__))
|
10
|
+
|
11
|
+
require "rspec/core"
|
12
|
+
require "bosh-bootstrap"
|
13
|
+
require "bosh-bootstrap/cli"
|
14
|
+
|
15
|
+
def spec_asset(filename)
|
16
|
+
File.expand_path("../assets/#{filename}", __FILE__)
|
17
|
+
end
|
18
|
+
|
19
|
+
def files_match(filename, expected_filename)
|
20
|
+
file = File.read(filename)
|
21
|
+
expected_file = File.read(expected_filename)
|
22
|
+
file.should == expected_file
|
23
|
+
end
|
24
|
+
|
25
|
+
RSpec.configure do |c|
|
26
|
+
c.before(:each) do
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
c.color_enabled = true
|
31
|
+
end
|
32
|
+
|
33
|
+
def get_tmp_file_path(content)
|
34
|
+
tmp_file = File.open(File.join(Dir.mktmpdir, "tmp"), "w")
|
35
|
+
tmp_file.write(content)
|
36
|
+
tmp_file.close
|
37
|
+
|
38
|
+
tmp_file.path
|
39
|
+
end
|
data/spec/unit/.gitkeep
ADDED
File without changes
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# Copyright (c) 2012-2013 Stark & Wayne, LLC
|
2
|
+
|
3
|
+
require File.expand_path("../../spec_helper", __FILE__)
|
4
|
+
|
5
|
+
describe Bosh::Bootstrap do
|
6
|
+
include FileUtils
|
7
|
+
include Bosh::Bootstrap::Helpers::SettingsSetter
|
8
|
+
|
9
|
+
before do
|
10
|
+
ENV['MANIFEST'] = File.expand_path("../../../tmp/test-manifest.yml", __FILE__)
|
11
|
+
rm_rf(ENV['MANIFEST'])
|
12
|
+
@cmd = Bosh::Bootstrap::Cli.new
|
13
|
+
end
|
14
|
+
|
15
|
+
# stub out all stages except a specific one
|
16
|
+
# +stage+ can either be the stage number or name
|
17
|
+
def testing_stage(stage)
|
18
|
+
stage_methods = %w[
|
19
|
+
deploy_stage_1_choose_infrastructure_provider
|
20
|
+
deploy_stage_2_bosh_configuration
|
21
|
+
deploy_stage_3_create_allocate_inception_vm
|
22
|
+
deploy_stage_4_prepare_inception_vm
|
23
|
+
deploy_stage_5_deploy_micro_bosh
|
24
|
+
deploy_stage_6_setup_new_bosh
|
25
|
+
]
|
26
|
+
stage_methods.each do |method|
|
27
|
+
unless method =~ /#{stage}/
|
28
|
+
@cmd.should_receive(method.to_sym)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# used by +SettingsSetter+ to access the settings
|
34
|
+
def settings
|
35
|
+
@cmd.settings
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "deploy" do
|
39
|
+
it "goes through stages" do
|
40
|
+
@cmd.should_receive(:deploy_stage_1_choose_infrastructure_provider)
|
41
|
+
@cmd.should_receive(:deploy_stage_2_bosh_configuration)
|
42
|
+
@cmd.should_receive(:deploy_stage_3_create_allocate_inception_vm)
|
43
|
+
@cmd.should_receive(:deploy_stage_4_prepare_inception_vm)
|
44
|
+
@cmd.should_receive(:deploy_stage_5_deploy_micro_bosh)
|
45
|
+
@cmd.should_receive(:deploy_stage_6_setup_new_bosh)
|
46
|
+
@cmd.deploy
|
47
|
+
end
|
48
|
+
|
49
|
+
it "stage 3 - create inception VM"
|
50
|
+
# do
|
51
|
+
# testing_stage(3)
|
52
|
+
# setting "fog_credentials.provider", "AWS"
|
53
|
+
# @cmd.should_receive(:run_server).and_return(true)
|
54
|
+
# @cmd.deploy
|
55
|
+
# end
|
56
|
+
|
57
|
+
it "stage 4 - prepare inception VM" do
|
58
|
+
testing_stage(4)
|
59
|
+
setting "inception.username", "ubuntu"
|
60
|
+
setting "bosh.password", "UNSALTED"
|
61
|
+
@cmd.should_receive(:run_server).and_return(true)
|
62
|
+
@cmd.deploy
|
63
|
+
end
|
64
|
+
|
65
|
+
it "stage 5 - download stemcell and deploy microbosh" do
|
66
|
+
testing_stage(5)
|
67
|
+
setting "bosh_provider", "aws"
|
68
|
+
setting "micro_bosh_stemcell_name", "micro-bosh-stemcell-aws-0.8.1.tgz"
|
69
|
+
setting "bosh_username", "drnic"
|
70
|
+
setting "bosh_password", "password"
|
71
|
+
setting "bosh.salted_password", "SALTED"
|
72
|
+
setting "bosh.ip_address", "1.2.3.4"
|
73
|
+
setting "bosh.persistent_disk", 16384
|
74
|
+
setting "bosh_resources_cloud_properties", {}
|
75
|
+
setting "bosh_cloud_properties", {}
|
76
|
+
setting "bosh_key_pair.private_key", "PRIVATE_KEY"
|
77
|
+
setting "bosh_key_pair.name", "KEYNAME"
|
78
|
+
@cmd.should_receive(:run_server).and_return(true)
|
79
|
+
@cmd.deploy
|
80
|
+
end
|
81
|
+
|
82
|
+
it "stage 6 - sets up new microbosh" do
|
83
|
+
testing_stage(6)
|
84
|
+
setting "bosh_name", "microbosh-aws-us-east-1"
|
85
|
+
setting "bosh_username", "drnic"
|
86
|
+
setting "bosh_password", "password"
|
87
|
+
setting "bosh.ip_address", "1.2.3.4"
|
88
|
+
@cmd.should_receive(:sleep)
|
89
|
+
@cmd.should_receive(:run_server).and_return(true)
|
90
|
+
@cmd.should_receive(:sh).with("bosh -u drnic -p password target 1.2.3.4")
|
91
|
+
@cmd.should_receive(:sh).with("bosh login drnic password")
|
92
|
+
@cmd.deploy
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "micro_bosh_stemcell_name" do
|
97
|
+
# The +bosh_stemcells_cmd+ has an output that looks like:
|
98
|
+
# +-----------------------------------+--------------------+
|
99
|
+
# | Name | Tags |
|
100
|
+
# +-----------------------------------+--------------------+
|
101
|
+
# | micro-bosh-stemcell-aws-0.6.4.tgz | aws, micro, stable |
|
102
|
+
# | micro-bosh-stemcell-aws-0.7.0.tgz | aws, micro, test |
|
103
|
+
# | micro-bosh-stemcell-aws-0.8.1.tgz | aws, micro, test |
|
104
|
+
# +-----------------------------------+--------------------+
|
105
|
+
#
|
106
|
+
# So to get the latest version for the filter tags,
|
107
|
+
# get the Name field, reverse sort, and return the first item
|
108
|
+
it "should return the latest stable stemcell by default for AWS" do
|
109
|
+
@cmd.settings["bosh_provider"] = "aws"
|
110
|
+
@cmd.should_receive(:`).
|
111
|
+
with("bosh public stemcells --tags micro,aws").
|
112
|
+
and_return(File.read(spec_asset("bosh/public_stemcells/aws_micro.out")))
|
113
|
+
@cmd.micro_bosh_stemcell_name.should == "micro-bosh-stemcell-aws-0.8.1.tgz"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# Copyright (c) 2012-2013 Stark & Wayne, LLC
|
2
|
+
|
3
|
+
require File.expand_path("../../spec_helper", __FILE__)
|
4
|
+
|
5
|
+
# Specs for 'ssh' related behavior. Includes CLI commands:
|
6
|
+
# * ssh
|
7
|
+
# * tmux
|
8
|
+
describe Bosh::Bootstrap do
|
9
|
+
include FileUtils
|
10
|
+
|
11
|
+
before do
|
12
|
+
ENV['MANIFEST'] = File.expand_path("../../../tmp/test-manifest.yml", __FILE__)
|
13
|
+
rm_rf(ENV['MANIFEST'])
|
14
|
+
@cmd = Bosh::Bootstrap::Cli.new
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "ssh" do
|
18
|
+
before do
|
19
|
+
@cmd.settings["inception"] = {}
|
20
|
+
@cmd.settings["inception"]["host"] = "5.5.5.5"
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "normal" do
|
24
|
+
it "launches ssh session" do
|
25
|
+
@cmd.should_receive(:exit)
|
26
|
+
@cmd.should_receive(:system).
|
27
|
+
with("ssh vcap@5.5.5.5")
|
28
|
+
@cmd.ssh
|
29
|
+
end
|
30
|
+
it "runs ssh command" do
|
31
|
+
@cmd.should_receive(:exit)
|
32
|
+
@cmd.should_receive(:system).
|
33
|
+
with("ssh vcap@5.5.5.5 'some command'")
|
34
|
+
@cmd.ssh("some command")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "tmux" do
|
39
|
+
it "launches ssh session" do
|
40
|
+
@cmd.should_receive(:exit)
|
41
|
+
@cmd.should_receive(:system).
|
42
|
+
with("ssh vcap@5.5.5.5 -t 'tmux attach || tmux new-session'")
|
43
|
+
@cmd.tmux
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bosh-bootstrap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-02-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
@@ -140,7 +140,23 @@ dependencies:
|
|
140
140
|
- !ruby/object:Gem::Version
|
141
141
|
version: '0'
|
142
142
|
- !ruby/object:Gem::Dependency
|
143
|
-
name:
|
143
|
+
name: rake
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
150
|
+
type: :development
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
158
|
+
- !ruby/object:Gem::Dependency
|
159
|
+
name: rspec
|
144
160
|
requirement: !ruby/object:Gem::Requirement
|
145
161
|
none: false
|
146
162
|
requirements:
|
@@ -164,7 +180,10 @@ extensions: []
|
|
164
180
|
extra_rdoc_files: []
|
165
181
|
files:
|
166
182
|
- .gitignore
|
183
|
+
- .rspec
|
184
|
+
- ChangeLog.md
|
167
185
|
- Gemfile
|
186
|
+
- Guardfile
|
168
187
|
- LICENSE.txt
|
169
188
|
- README.md
|
170
189
|
- Rakefile
|
@@ -183,6 +202,7 @@ files:
|
|
183
202
|
- lib/bosh-bootstrap/helpers.rb
|
184
203
|
- lib/bosh-bootstrap/helpers/fog_setup.rb
|
185
204
|
- lib/bosh-bootstrap/helpers/settings.rb
|
205
|
+
- lib/bosh-bootstrap/helpers/settings_setter.rb
|
186
206
|
- lib/bosh-bootstrap/stages.rb
|
187
207
|
- lib/bosh-bootstrap/stages/stage_micro_bosh_delete.rb
|
188
208
|
- lib/bosh-bootstrap/stages/stage_micro_bosh_delete/bosh_micro_delete
|
@@ -195,6 +215,7 @@ files:
|
|
195
215
|
- lib/bosh-bootstrap/stages/stage_prepare_inception_vm/create_vcap_user
|
196
216
|
- lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_base_packages
|
197
217
|
- lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_bosh
|
218
|
+
- lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_bosh_plugins
|
198
219
|
- lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_ruby
|
199
220
|
- lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_useful_gems
|
200
221
|
- lib/bosh-bootstrap/stages/stage_prepare_inception_vm/validate_bosh_deployer
|
@@ -209,6 +230,13 @@ files:
|
|
209
230
|
- lib/bosh/providers/aws.rb
|
210
231
|
- lib/bosh/providers/base_provider.rb
|
211
232
|
- lib/bosh/providers/openstack.rb
|
233
|
+
- spec/assets/.gitkeep
|
234
|
+
- spec/assets/bosh/public_stemcells/aws_micro.out
|
235
|
+
- spec/functional/.gitkeep
|
236
|
+
- spec/spec_helper.rb
|
237
|
+
- spec/unit/.gitkeep
|
238
|
+
- spec/unit/cli_spec.rb
|
239
|
+
- spec/unit/cli_ssh_spec.rb
|
212
240
|
homepage: https://github.com/StarkAndWayne/bosh-bootstrap
|
213
241
|
licenses: []
|
214
242
|
post_install_message:
|
@@ -221,12 +249,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
221
249
|
- - ! '>='
|
222
250
|
- !ruby/object:Gem::Version
|
223
251
|
version: '0'
|
252
|
+
segments:
|
253
|
+
- 0
|
254
|
+
hash: 14194851677947465
|
224
255
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
225
256
|
none: false
|
226
257
|
requirements:
|
227
258
|
- - ! '>='
|
228
259
|
- !ruby/object:Gem::Version
|
229
260
|
version: '0'
|
261
|
+
segments:
|
262
|
+
- 0
|
263
|
+
hash: 14194851677947465
|
230
264
|
requirements: []
|
231
265
|
rubyforge_project:
|
232
266
|
rubygems_version: 1.8.24
|
@@ -235,5 +269,11 @@ specification_version: 3
|
|
235
269
|
summary: Now very simple to bootstrap a micro BOSH from a single, local CLI. The bootstrapper
|
236
270
|
first creates an inception VM and then uses bosh_deployer (bosh micro deploy) to
|
237
271
|
deploy micro BOSH from an available stemcell.
|
238
|
-
test_files:
|
239
|
-
|
272
|
+
test_files:
|
273
|
+
- spec/assets/.gitkeep
|
274
|
+
- spec/assets/bosh/public_stemcells/aws_micro.out
|
275
|
+
- spec/functional/.gitkeep
|
276
|
+
- spec/spec_helper.rb
|
277
|
+
- spec/unit/.gitkeep
|
278
|
+
- spec/unit/cli_spec.rb
|
279
|
+
- spec/unit/cli_ssh_spec.rb
|