bosh-bootstrap 0.5.1 → 0.6.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/.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
|