bosh-bootstrap 0.10.2 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +1 -0
- data/.travis.yml +0 -1
- data/ChangeLog.md +23 -4
- data/Gemfile +5 -2
- data/Guardfile +2 -0
- data/README.md +209 -197
- data/TODO.md +55 -0
- data/bosh-bootstrap.gemspec +5 -12
- data/lib/bosh/cli/commands/bootstrap.rb +42 -0
- data/lib/bosh-bootstrap/cli/commands/delete.rb +26 -0
- data/lib/bosh-bootstrap/cli/commands/deploy.rb +89 -0
- data/lib/bosh-bootstrap/cli/commands/ssh.rb +32 -0
- data/lib/bosh-bootstrap/cli/helpers/bundle.rb +12 -0
- data/lib/bosh-bootstrap/cli/helpers/interactions.rb +15 -0
- data/lib/bosh-bootstrap/cli/helpers/settings.rb +61 -0
- data/lib/bosh-bootstrap/cli/helpers.rb +11 -0
- data/lib/bosh-bootstrap/key_pair.rb +21 -0
- data/lib/bosh-bootstrap/microbosh.rb +74 -0
- data/lib/bosh-bootstrap/microbosh_providers/aws.rb +104 -0
- data/lib/bosh-bootstrap/microbosh_providers/base.rb +50 -0
- data/lib/bosh-bootstrap/microbosh_providers/openstack.rb +61 -0
- data/lib/bosh-bootstrap/microbosh_providers/vsphere.rb +78 -0
- data/lib/bosh-bootstrap/microbosh_providers.rb +11 -0
- data/lib/bosh-bootstrap/network.rb +33 -0
- data/lib/bosh-bootstrap/network_providers/aws.rb +28 -0
- data/lib/bosh-bootstrap/network_providers/dummy.rb +10 -0
- data/lib/bosh-bootstrap/network_providers/openstack.rb +28 -0
- data/lib/bosh-bootstrap/network_providers.rb +11 -0
- data/lib/bosh-bootstrap/version.rb +1 -1
- data/lib/bosh-bootstrap.rb +3 -4
- data/spec/assets/microbosh_yml/micro_bosh.aws_ec2.yml +37 -0
- data/spec/assets/microbosh_yml/micro_bosh.aws_vpc.yml +39 -0
- data/spec/assets/microbosh_yml/micro_bosh.openstack.yml +30 -0
- data/spec/assets/microbosh_yml/micro_bosh.vsphere.yml +34 -0
- data/spec/integration/aws/aws_ec2_basic_spec.rb +39 -0
- data/spec/integration/aws/aws_helpers.rb +8 -61
- data/spec/spec_helper.rb +8 -3
- data/spec/support/capture_stdout.rb +18 -0
- data/spec/unit/cli/bootstrap_spec.rb +41 -0
- data/spec/unit/commands/delete_spec.rb +20 -0
- data/spec/unit/commands/deploy_spec.rb +64 -0
- data/spec/unit/commands/ssh_spec.rb +19 -0
- data/spec/unit/key_pair_spec.rb +13 -0
- data/spec/unit/microbosh_providers/aws_spec.rb +68 -0
- data/spec/unit/microbosh_providers/openstack_spec.rb +27 -0
- data/spec/unit/microbosh_providers/vsphere_spec.rb +42 -0
- data/spec/unit/microbosh_spec.rb +27 -0
- data/spec/unit/network_providers/aws_spec.rb +29 -0
- data/spec/unit/network_providers/openstack_spec.rb +29 -0
- data/spec/unit/network_spec.rb +17 -0
- metadata +71 -235
- data/CleanupCi.md +0 -8
- data/bin/bosh-bootstrap +0 -8
- data/docs/README.md +0 -3
- data/docs/devstack-openstack-tutorial.md +0 -215
- data/lib/bosh/providers/README.md +0 -5
- data/lib/bosh/providers/aws.rb +0 -258
- data/lib/bosh/providers/base_provider.rb +0 -48
- data/lib/bosh/providers/openstack.rb +0 -79
- data/lib/bosh/providers.rb +0 -21
- data/lib/bosh-bootstrap/cli.rb +0 -1347
- data/lib/bosh-bootstrap/commander/README.md +0 -47
- data/lib/bosh-bootstrap/commander/command.rb +0 -25
- data/lib/bosh-bootstrap/commander/commands.rb +0 -80
- data/lib/bosh-bootstrap/commander/local_server.rb +0 -68
- data/lib/bosh-bootstrap/commander/remote_script_command.rb +0 -51
- data/lib/bosh-bootstrap/commander/remote_server.rb +0 -137
- data/lib/bosh-bootstrap/commander/upload_command.rb +0 -17
- data/lib/bosh-bootstrap/commander.rb +0 -9
- data/lib/bosh-bootstrap/helpers/fog_setup.rb +0 -50
- data/lib/bosh-bootstrap/helpers/settings.rb +0 -99
- data/lib/bosh-bootstrap/helpers/settings_setter.rb +0 -41
- data/lib/bosh-bootstrap/helpers.rb +0 -3
- data/lib/bosh-bootstrap/stages/stage_micro_bosh_delete/bosh_micro_delete +0 -19
- data/lib/bosh-bootstrap/stages/stage_micro_bosh_delete.rb +0 -90
- data/lib/bosh-bootstrap/stages/stage_micro_bosh_deploy/bosh_micro_deploy +0 -79
- data/lib/bosh-bootstrap/stages/stage_micro_bosh_deploy/install_key_pair_for_user +0 -23
- data/lib/bosh-bootstrap/stages/stage_micro_bosh_deploy.rb +0 -146
- data/lib/bosh-bootstrap/stages/stage_micro_bosh_download/download_micro_bosh_stemcell +0 -93
- data/lib/bosh-bootstrap/stages/stage_micro_bosh_download.rb +0 -139
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/configure_git +0 -25
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/create_vcap_user +0 -79
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_base_packages +0 -30
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_bosh +0 -11
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_bosh_plugins +0 -25
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_hub +0 -26
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_ruby +0 -30
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_useful_gems +0 -29
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/validate_bosh_deployer +0 -18
- data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm.rb +0 -69
- data/lib/bosh-bootstrap/stages/stage_salted_password/convert_salted_password +0 -11
- data/lib/bosh-bootstrap/stages/stage_salted_password.rb +0 -51
- data/lib/bosh-bootstrap/stages/stage_setup_new_bosh/setup_bosh_user +0 -29
- data/lib/bosh-bootstrap/stages/stage_setup_new_bosh.rb +0 -51
- data/lib/bosh-bootstrap/stages/stage_validate_inception_vm/validate_ubuntu +0 -6
- data/lib/bosh-bootstrap/stages/stage_validate_inception_vm.rb +0 -39
- data/lib/bosh-bootstrap/stages.rb +0 -10
- data/spec/assets/bosh/public_stemcells/aws_micro.out +0 -7
- data/spec/assets/micro_bosh_yml/micro_bosh.aws_ec2.yml +0 -35
- data/spec/assets/micro_bosh_yml/micro_bosh.aws_vpc.yml +0 -37
- data/spec/integration/aws/aws_basic_spec.rb +0 -39
- data/spec/integration/aws/aws_edge_prebuilt_ami_spec.rb +0 -46
- data/spec/integration/aws/aws_edge_prebuilt_spec.rb +0 -46
- data/spec/integration/aws/aws_edge_spec.rb +0 -45
- data/spec/unit/aws_spec.rb +0 -177
- data/spec/unit/bosh/providers/aws_spec.rb +0 -174
- data/spec/unit/cli_spec.rb +0 -134
- data/spec/unit/cli_ssh_spec.rb +0 -95
- data/spec/unit/cli_upgrade_inception_spec.rb +0 -29
- data/spec/unit/settings_setter_spec.rb +0 -29
- data/vendor/cache/POpen4-0.1.4.gem +0 -0
- data/vendor/cache/Platform-0.4.0.gem +0 -0
- data/vendor/cache/activesupport-3.2.8.gem +0 -0
- data/vendor/cache/awesome_print-1.1.0.gem +0 -0
- data/vendor/cache/aws-s3-0.6.3.gem +0 -0
- data/vendor/cache/blobstore_client-0.4.0.gem +0 -0
- data/vendor/cache/bosh_cli-1.0.3.gem +0 -0
- data/vendor/cache/bosh_common-0.5.4.gem +0 -0
- data/vendor/cache/builder-3.2.0.gem +0 -0
- data/vendor/cache/coderay-1.0.8.gem +0 -0
- data/vendor/cache/diff-lcs-1.1.3.gem +0 -0
- data/vendor/cache/escape-0.0.4.gem +0 -0
- data/vendor/cache/excon-0.20.1.gem +0 -0
- data/vendor/cache/fog-1.8.0.gem +0 -0
- data/vendor/cache/formatador-0.2.4.gem +0 -0
- data/vendor/cache/guard-1.6.2.gem +0 -0
- data/vendor/cache/guard-rspec-2.4.0.gem +0 -0
- data/vendor/cache/highline-1.6.18.gem +0 -0
- data/vendor/cache/httpclient-2.2.4.gem +0 -0
- data/vendor/cache/i18n-0.6.1.gem +0 -0
- data/vendor/cache/json_pure-1.6.8.gem +0 -0
- data/vendor/cache/listen-0.7.2.gem +0 -0
- data/vendor/cache/log4r-1.1.10.gem +0 -0
- data/vendor/cache/lumberjack-1.0.2.gem +0 -0
- data/vendor/cache/method_source-0.8.1.gem +0 -0
- data/vendor/cache/mime-types-1.22.gem +0 -0
- data/vendor/cache/multi_json-1.1.0.gem +0 -0
- data/vendor/cache/net-scp-1.0.4.gem +0 -0
- data/vendor/cache/net-ssh-2.2.2.gem +0 -0
- data/vendor/cache/net-ssh-gateway-1.1.0.gem +0 -0
- data/vendor/cache/netaddr-1.5.0.gem +0 -0
- data/vendor/cache/nokogiri-1.5.9.gem +0 -0
- data/vendor/cache/open4-1.3.0.gem +0 -0
- data/vendor/cache/progressbar-0.9.2.gem +0 -0
- data/vendor/cache/pry-0.9.11.4-java.gem +0 -0
- data/vendor/cache/pry-0.9.11.4.gem +0 -0
- data/vendor/cache/rake-10.0.3.gem +0 -0
- data/vendor/cache/rb-fsevent-0.9.3.gem +0 -0
- data/vendor/cache/redcard-1.0.0.gem +0 -0
- data/vendor/cache/rspec-2.12.0.gem +0 -0
- data/vendor/cache/rspec-core-2.12.2.gem +0 -0
- data/vendor/cache/rspec-expectations-2.12.1.gem +0 -0
- data/vendor/cache/rspec-mocks-2.12.2.gem +0 -0
- data/vendor/cache/ruby-atmos-pure-1.0.5.gem +0 -0
- data/vendor/cache/ruby-hmac-0.4.0.gem +0 -0
- data/vendor/cache/settingslogic-2.0.9.gem +0 -0
- data/vendor/cache/slop-3.4.3.gem +0 -0
- data/vendor/cache/spoon-0.0.1.gem +0 -0
- data/vendor/cache/terminal-table-1.4.5.gem +0 -0
- data/vendor/cache/thor-0.17.0.gem +0 -0
- data/vendor/cache/uuidtools-2.1.3.gem +0 -0
- data/vendor/cache/xml-simple-1.1.2.gem +0 -0
data/TODO.md
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
## Known issues
|
2
|
+
|
3
|
+
* target & create user after deployment
|
4
|
+
* upgrade (if its already running successfully; else delete & redeploy)
|
5
|
+
* multiple deployments
|
6
|
+
* bosh name (currently fixed at test-bosh)
|
7
|
+
* ~/.microbosh folder is singular
|
8
|
+
|
9
|
+
### Display status
|
10
|
+
|
11
|
+
```
|
12
|
+
$ ~/.microbosh/deployments
|
13
|
+
$ bundle exec bosh micro status
|
14
|
+
Stemcell CID ami-53137a3a
|
15
|
+
Stemcell name ami-53137a3a
|
16
|
+
VM CID i-78046912
|
17
|
+
Disk CID vol-cebe9196
|
18
|
+
Micro BOSH CID bm-2b31bf69-b676-4db1-a084-fd1ac49377ac
|
19
|
+
Deployment /Users/drnic/.microbosh/deployments/test-bosh/micro_bosh.yml
|
20
|
+
Target https://107.21.94.132:25555
|
21
|
+
```
|
22
|
+
### Create user
|
23
|
+
|
24
|
+
Collect user/password at start of process; then target & create user at the end
|
25
|
+
|
26
|
+
```
|
27
|
+
bosh -u admin -p admin target https://107.21.94.132:25555
|
28
|
+
bosh -u admin -p admin create user drnic PASSWORD (do not display password)
|
29
|
+
```
|
30
|
+
|
31
|
+
## Multiple deployments
|
32
|
+
|
33
|
+
* bosh name (currently fixed at test-bosh)
|
34
|
+
* ~/.microbosh folder is singular
|
35
|
+
|
36
|
+
## Bonus
|
37
|
+
|
38
|
+
* AWS/us-east-1 - upload light stemcell
|
39
|
+
* Others - upload normal base stemcell
|
40
|
+
|
41
|
+
## Validations
|
42
|
+
|
43
|
+
If using stemcells, then must be Ubuntu with following packages installed:
|
44
|
+
|
45
|
+
* libsqlite3-dev
|
46
|
+
* genisoimage
|
47
|
+
|
48
|
+
* IP address - like key pair, check that its still available else create new one
|
49
|
+
|
50
|
+
How can we validate that there is enough disk space to download & prepare the stemcell?
|
51
|
+
|
52
|
+
### AWS
|
53
|
+
|
54
|
+
* check if this server is in AWS & same region as target region, else only use AMIs (and switch to us-east-1)
|
55
|
+
|
data/bosh-bootstrap.gemspec
CHANGED
@@ -8,10 +8,9 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.version = Bosh::Bootstrap::VERSION
|
9
9
|
gem.authors = ["Dr Nic Williams"]
|
10
10
|
gem.email = ["drnicwilliams@gmail.com"]
|
11
|
-
gem.description = %q{Bootstrap a micro
|
11
|
+
gem.description = %q{Bootstrap a micro bosh universe from one CLI}
|
12
12
|
gem.summary = <<-EOS
|
13
|
-
bosh-bootstrap
|
14
|
-
automatically get a microbosh (and an inception VM) deployed on either
|
13
|
+
bosh-bootstrap configures and deploys a microbosh deployed on either
|
15
14
|
AWS or OpenStack.
|
16
15
|
EOS
|
17
16
|
gem.homepage = "https://github.com/StarkAndWayne/bosh-bootstrap"
|
@@ -23,17 +22,11 @@ EOS
|
|
23
22
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
24
23
|
gem.require_paths = ["lib"]
|
25
24
|
|
26
|
-
gem.add_dependency "
|
27
|
-
gem.add_dependency "
|
28
|
-
gem.add_dependency "settingslogic"
|
29
|
-
gem.add_dependency "POpen4"
|
30
|
-
gem.add_dependency "net-ssh", "~> 2.2.1"
|
31
|
-
gem.add_dependency "net-scp", "~> 1.0.4"
|
32
|
-
gem.add_dependency "fog", "~>1.8.0"
|
33
|
-
gem.add_dependency "escape"
|
25
|
+
gem.add_dependency "cyoi"
|
26
|
+
gem.add_dependency "readwritesettings", "~> 3.0"
|
34
27
|
gem.add_dependency "redcard"
|
35
28
|
gem.add_dependency "bosh_cli"
|
36
29
|
gem.add_development_dependency "rake"
|
37
30
|
gem.add_development_dependency "rspec"
|
38
|
-
gem.add_development_dependency "
|
31
|
+
gem.add_development_dependency "fakeweb"
|
39
32
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# Copyright (c) 2012-2013 Stark & Wayne, LLC
|
2
|
+
|
3
|
+
require "bosh-bootstrap"
|
4
|
+
|
5
|
+
module Bosh::Cli::Command
|
6
|
+
class Bootstrap < Base
|
7
|
+
usage "bootstrap"
|
8
|
+
desc "show bootstrap sub-commands"
|
9
|
+
def help
|
10
|
+
say("bosh bootstrap sub-commands:")
|
11
|
+
nl
|
12
|
+
cmds = Bosh::Cli::Config.commands.values.find_all {|c|
|
13
|
+
c.usage =~ /^bootstrap/
|
14
|
+
}
|
15
|
+
Bosh::Cli::Command::Help.list_commands(cmds)
|
16
|
+
end
|
17
|
+
|
18
|
+
usage "bootstrap deploy"
|
19
|
+
desc "Configure and bootstrap a micro bosh; or deploy/upgrade existing Micro Bosh"
|
20
|
+
def deploy
|
21
|
+
require "bosh-bootstrap/cli/commands/deploy"
|
22
|
+
deploy_cmd = Bosh::Bootstrap::Cli::Commands::Deploy.new
|
23
|
+
deploy_cmd.perform
|
24
|
+
end
|
25
|
+
|
26
|
+
usage "bootstrap ssh"
|
27
|
+
desc "SSH into micro bosh"
|
28
|
+
def ssh
|
29
|
+
require "bosh-bootstrap/cli/commands/ssh"
|
30
|
+
cmd = Bosh::Bootstrap::Cli::Commands::SSH.new
|
31
|
+
cmd.perform
|
32
|
+
end
|
33
|
+
|
34
|
+
usage "bootstrap delete"
|
35
|
+
desc "Delete existing Micro Bosh (does not delete any bosh deployments running)"
|
36
|
+
def delete
|
37
|
+
require "bosh-bootstrap/cli/commands/delete"
|
38
|
+
cmd = Bosh::Bootstrap::Cli::Commands::Delete.new
|
39
|
+
cmd.perform
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# Copyright (c) 2012-2013 Stark & Wayne, LLC
|
2
|
+
|
3
|
+
module Bosh; module Bootstrap; module Cli; module Commands; end; end; end; end
|
4
|
+
|
5
|
+
require "bosh-bootstrap/cli/helpers"
|
6
|
+
|
7
|
+
# Runs SSH to the microbosh server
|
8
|
+
class Bosh::Bootstrap::Cli::Commands::Delete
|
9
|
+
include Bosh::Bootstrap::Cli::Helpers
|
10
|
+
|
11
|
+
def perform
|
12
|
+
chdir(deployment_dir) do
|
13
|
+
bundle "exec bosh -n micro deployment #{bosh_name}"
|
14
|
+
bundle "exec bosh -n micro delete"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
def bosh_name
|
20
|
+
settings.bosh.name
|
21
|
+
end
|
22
|
+
|
23
|
+
def deployment_dir
|
24
|
+
File.join(settings_dir, "deployments")
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module Bosh; module Bootstrap; module Cli; module Commands; end; end; end; end
|
2
|
+
|
3
|
+
require "cyoi/cli/provider"
|
4
|
+
require "cyoi/cli/address"
|
5
|
+
require "cyoi/cli/key_pair"
|
6
|
+
require "bosh-bootstrap/cli/helpers"
|
7
|
+
require "bosh-bootstrap/microbosh"
|
8
|
+
|
9
|
+
class Bosh::Bootstrap::Cli::Commands::Deploy
|
10
|
+
include Bosh::Bootstrap::Cli::Helpers
|
11
|
+
|
12
|
+
# * select_provider
|
13
|
+
# * select_or_provision_public_networking # public_ip or ip/network/gateway
|
14
|
+
# * select_public_image_or_download_stemcell # download if stemcell
|
15
|
+
# * create_microbosh_manifest
|
16
|
+
# * microbosh_deploy
|
17
|
+
def perform
|
18
|
+
settings.set_default("bosh.name", "firstbosh")
|
19
|
+
save_settings!
|
20
|
+
|
21
|
+
select_provider
|
22
|
+
select_or_provision_public_networking
|
23
|
+
setup_keypair
|
24
|
+
select_public_image_or_download_stemcell
|
25
|
+
perform_microbosh_deploy
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
def select_provider
|
30
|
+
provider = Cyoi::Cli::Provider.new([settings_dir])
|
31
|
+
provider.execute!
|
32
|
+
reload_settings!
|
33
|
+
end
|
34
|
+
|
35
|
+
def provider_client
|
36
|
+
@provider_client ||= Cyoi::Providers.provider_client(settings.provider)
|
37
|
+
end
|
38
|
+
|
39
|
+
# public_ip or ip/network/gateway
|
40
|
+
def select_or_provision_public_networking
|
41
|
+
address = Cyoi::Cli::Address.new([settings_dir])
|
42
|
+
address.execute!
|
43
|
+
reload_settings!
|
44
|
+
|
45
|
+
# TODO why passing provider_client rather than a Cyoi::Cli::Network object?
|
46
|
+
network = Bosh::Bootstrap::Network.new(settings.provider.name, provider_client)
|
47
|
+
network.deploy
|
48
|
+
end
|
49
|
+
|
50
|
+
def setup_keypair
|
51
|
+
key_pair_name = settings.exists?("key_pair.name") || settings.bosh.name
|
52
|
+
cli = Cyoi::Cli::KeyPair.new([key_pair_name, settings_dir])
|
53
|
+
cli.execute!
|
54
|
+
reload_settings!
|
55
|
+
|
56
|
+
key_pair = Bosh::Bootstrap::KeyPair.new(settings_dir, settings.key_pair.name, settings.key_pair.private_key)
|
57
|
+
key_pair.execute!
|
58
|
+
settings.set("key_pair.path", key_pair.path)
|
59
|
+
end
|
60
|
+
|
61
|
+
# TODO should this go inside Microbosh, like NetworkProvider is to Network?
|
62
|
+
def microbosh_provider
|
63
|
+
@microbosh_provider ||= begin
|
64
|
+
provider_name = settings.provider.name
|
65
|
+
require "bosh-bootstrap/microbosh_providers/#{provider_name}"
|
66
|
+
klass = Bosh::Bootstrap::MicroboshProviders.provider_class(provider_name)
|
67
|
+
klass.new(File.join(settings_dir, "deployments/#{settings.bosh.name}/micro_bosh.yml"), settings)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# download if stemcell
|
72
|
+
def select_public_image_or_download_stemcell
|
73
|
+
print "Determining stemcell image/file to use... "
|
74
|
+
stemcell = microbosh_provider.stemcell
|
75
|
+
while (stemcell || "").size == 0
|
76
|
+
puts "failed. Retrying..."
|
77
|
+
print "Determining stemcell image/file to use... "
|
78
|
+
stemcell = microbosh_provider.stemcell
|
79
|
+
end
|
80
|
+
settings.set("bosh.stemcell", stemcell)
|
81
|
+
puts settings.bosh.stemcell
|
82
|
+
end
|
83
|
+
|
84
|
+
def perform_microbosh_deploy
|
85
|
+
settings.set("bosh.persistent_disk", 16384)
|
86
|
+
@microbosh ||= Bosh::Bootstrap::Microbosh.new(settings_dir, microbosh_provider)
|
87
|
+
@microbosh.deploy(settings)
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# Copyright (c) 2012-2013 Stark & Wayne, LLC
|
2
|
+
|
3
|
+
module Bosh; module Bootstrap; module Cli; module Commands; end; end; end; end
|
4
|
+
|
5
|
+
require "bosh-bootstrap/cli/helpers"
|
6
|
+
|
7
|
+
# for the #sh helper
|
8
|
+
require "rake"
|
9
|
+
require "rake/file_utils"
|
10
|
+
|
11
|
+
# Runs SSH to the microbosh server
|
12
|
+
class Bosh::Bootstrap::Cli::Commands::SSH
|
13
|
+
include Bosh::Bootstrap::Cli::Helpers
|
14
|
+
include FileUtils
|
15
|
+
|
16
|
+
def perform
|
17
|
+
sh "ssh -i #{private_key_path} #{user}@#{host}"
|
18
|
+
end
|
19
|
+
|
20
|
+
protected
|
21
|
+
def user
|
22
|
+
"vcap"
|
23
|
+
end
|
24
|
+
|
25
|
+
def host
|
26
|
+
settings.address.ip
|
27
|
+
end
|
28
|
+
|
29
|
+
def private_key_path
|
30
|
+
File.expand_path(settings.key_pair.path)
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "highline"
|
2
|
+
|
3
|
+
module Bosh::Bootstrap::Cli::Helpers::Interactions
|
4
|
+
def cyan; "\033[36m" end
|
5
|
+
def clear; "\033[0m" end
|
6
|
+
def bold; "\033[1m" end
|
7
|
+
def red; "\033[31m" end
|
8
|
+
def green; "\033[32m" end
|
9
|
+
def yellow; "\033[33m" end
|
10
|
+
|
11
|
+
# Helper to access HighLine for ask & menu prompts
|
12
|
+
def hl
|
13
|
+
@hl ||= HighLine.new(@stdin, @stdout)
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require "readwritesettings"
|
2
|
+
require "fileutils"
|
3
|
+
|
4
|
+
module Bosh::Bootstrap::Cli::Helpers::Settings
|
5
|
+
include FileUtils
|
6
|
+
|
7
|
+
# The base directory for holding the manifest settings file
|
8
|
+
# and private keys
|
9
|
+
#
|
10
|
+
# Defaults to ~/.bosh_inception; and can be overridden with either:
|
11
|
+
# * $SETTINGS - to a folder (supported method)
|
12
|
+
def settings_dir
|
13
|
+
@settings_dir ||= File.expand_path(ENV["SETTINGS"] || "~/.microbosh")
|
14
|
+
end
|
15
|
+
|
16
|
+
def settings_dir=(settings_dir)
|
17
|
+
@settings_dir = File.expand_path(settings_dir)
|
18
|
+
reload_settings!
|
19
|
+
end
|
20
|
+
|
21
|
+
def settings_ssh_dir
|
22
|
+
File.join(settings_dir, "ssh")
|
23
|
+
end
|
24
|
+
|
25
|
+
def settings_path
|
26
|
+
@settings_path ||= File.join(settings_dir, "settings.yml")
|
27
|
+
end
|
28
|
+
|
29
|
+
def settings
|
30
|
+
@settings ||= begin
|
31
|
+
unless File.exists?(settings_path)
|
32
|
+
mkdir_p(settings_dir)
|
33
|
+
File.open(settings_path, "w") { |file| file << "--- {}" }
|
34
|
+
end
|
35
|
+
chmod(0600, settings_path)
|
36
|
+
chmod(0700, settings_ssh_dir) if File.directory?(settings_ssh_dir)
|
37
|
+
ReadWriteSettings.new(settings_path)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Set a nested setting with "key1.key2.key3" notation
|
42
|
+
def setting(nested_key, value)
|
43
|
+
settings.set(nested_key, value)
|
44
|
+
save_settings!
|
45
|
+
end
|
46
|
+
|
47
|
+
# Saves current nested ReadWriteSettings into pure Hash-based YAML file
|
48
|
+
# Recreates accessors on ReadWriteSettings object (since something has changed)
|
49
|
+
def save_settings!
|
50
|
+
File.open(settings_path, "w") { |f| f << settings.to_nested_hash.to_yaml }
|
51
|
+
settings.create_accessors!
|
52
|
+
end
|
53
|
+
|
54
|
+
def reload_settings!
|
55
|
+
@settings = nil
|
56
|
+
settings
|
57
|
+
end
|
58
|
+
|
59
|
+
def migrate_old_settings
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Bosh; module Bootstrap; module Cli; module Helpers; end; end; end; end
|
2
|
+
|
3
|
+
require "bosh-bootstrap/cli/helpers/bundle"
|
4
|
+
require "bosh-bootstrap/cli/helpers/interactions"
|
5
|
+
require "bosh-bootstrap/cli/helpers/settings"
|
6
|
+
|
7
|
+
module Bosh::Bootstrap::Cli::Helpers
|
8
|
+
include Bosh::Bootstrap::Cli::Helpers::Bundle
|
9
|
+
include Bosh::Bootstrap::Cli::Helpers::Interactions
|
10
|
+
include Bosh::Bootstrap::Cli::Helpers::Settings
|
11
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Bosh::Bootstrap::KeyPair
|
2
|
+
include FileUtils
|
3
|
+
|
4
|
+
attr_reader :base_path, :keyname, :private_key
|
5
|
+
|
6
|
+
def initialize(base_path, keyname, private_key)
|
7
|
+
@base_path, @keyname, @private_key = base_path, keyname, private_key
|
8
|
+
end
|
9
|
+
|
10
|
+
def execute!
|
11
|
+
mkdir_p(File.dirname(path))
|
12
|
+
chmod(0700, File.dirname(path))
|
13
|
+
|
14
|
+
File.open(path, "w") { |file| file << private_key }
|
15
|
+
chmod(0600, path)
|
16
|
+
end
|
17
|
+
|
18
|
+
def path
|
19
|
+
@path ||= File.join(base_path, "ssh", keyname)
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require "bosh-bootstrap/microbosh_providers"
|
2
|
+
require "bosh-bootstrap/cli/helpers"
|
3
|
+
|
4
|
+
# Configures and deploys (or re-deploys) a micro bosh.
|
5
|
+
# A "micro bosh" is a single VM containing all necessary parts of bosh
|
6
|
+
# and is deployed from the terminal; rather than from another bosh.
|
7
|
+
#
|
8
|
+
# Usage:
|
9
|
+
# microbosh = Bosh::Bootstrap::Microbosh.new(project_path)
|
10
|
+
# settings = ReadWriteSettings.new({
|
11
|
+
# "provider" => {"name" => "aws", "credentials" => {...}},
|
12
|
+
# "address" => {"ip" => "1.2.3.4"},
|
13
|
+
# "bosh" => {
|
14
|
+
# "name" => "test-bosh",
|
15
|
+
# "stemcell" => "ami-123456",
|
16
|
+
# "salted_password" => "452435hjg2345hjg2435ghk3452"
|
17
|
+
# }
|
18
|
+
# })
|
19
|
+
# microbosh.deploy("aws", settings)
|
20
|
+
class Bosh::Bootstrap::Microbosh
|
21
|
+
include FileUtils
|
22
|
+
include Bosh::Bootstrap::Cli::Helpers::Bundle
|
23
|
+
|
24
|
+
attr_reader :base_path
|
25
|
+
attr_reader :provider
|
26
|
+
attr_reader :bosh_name
|
27
|
+
attr_reader :deployments_dir
|
28
|
+
attr_reader :manifest_yml
|
29
|
+
|
30
|
+
def initialize(base_path, provider)
|
31
|
+
@base_path = base_path
|
32
|
+
@provider = provider
|
33
|
+
end
|
34
|
+
|
35
|
+
def deploy(settings)
|
36
|
+
@bosh_name = settings.bosh.name
|
37
|
+
@deployments_dir = File.join(base_path, "deployments")
|
38
|
+
@manifest_yml = File.join(deployments_dir, bosh_name, "micro_bosh.yml")
|
39
|
+
mkdir_p(File.dirname(manifest_yml))
|
40
|
+
chdir(base_path) do
|
41
|
+
setup_base_path
|
42
|
+
create_microbosh_yml(settings)
|
43
|
+
deploy_or_update(settings.bosh.name, settings.bosh.stemcell)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
protected
|
48
|
+
def setup_base_path
|
49
|
+
gempath = File.expand_path("../../..", __FILE__)
|
50
|
+
pwd = File.expand_path(".")
|
51
|
+
File.open("Gemfile", "w") do |f|
|
52
|
+
f << <<-RUBY
|
53
|
+
source 'https://rubygems.org'
|
54
|
+
source 'https://s3.amazonaws.com/bosh-jenkins-gems/'
|
55
|
+
|
56
|
+
gem "bosh-bootstrap", path: "#{gempath}"
|
57
|
+
gem "bosh_cli_plugin_micro"
|
58
|
+
RUBY
|
59
|
+
end
|
60
|
+
rm_rf "Gemfile.lock"
|
61
|
+
bundle "install"
|
62
|
+
end
|
63
|
+
|
64
|
+
def create_microbosh_yml(settings)
|
65
|
+
provider.create_microbosh_yml(settings)
|
66
|
+
end
|
67
|
+
|
68
|
+
def deploy_or_update(bosh_name, stemcell)
|
69
|
+
chdir("deployments") do
|
70
|
+
bundle "exec bosh micro deployment", bosh_name
|
71
|
+
bundle "exec bosh -n micro deploy", stemcell
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require "bosh-bootstrap/microbosh_providers/base"
|
2
|
+
|
3
|
+
module Bosh::Bootstrap::MicroboshProviders
|
4
|
+
class AWS < Base
|
5
|
+
# if us-east-1 -> ami
|
6
|
+
# if not running in target aws region -> error "Must either use us-east-1 or run 'bosh bootstrap deploy' within target AWS region"
|
7
|
+
# else download stemcell & return path
|
8
|
+
def stemcell
|
9
|
+
unless settings.exists?("bosh.stemcell")
|
10
|
+
if ami_region?
|
11
|
+
fetch_ami
|
12
|
+
else
|
13
|
+
download_stemcell
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_hash
|
19
|
+
super.merge({
|
20
|
+
"network"=>{"type"=>"dynamic", "vip"=>public_ip},
|
21
|
+
"resources"=>
|
22
|
+
{"persistent_disk"=>persistent_disk,
|
23
|
+
"cloud_properties"=>resources_cloud_properties},
|
24
|
+
"cloud"=>
|
25
|
+
{"plugin"=>"aws",
|
26
|
+
"properties"=>
|
27
|
+
{"aws"=>cloud_properties}},
|
28
|
+
"apply_spec"=>
|
29
|
+
{"agent"=>
|
30
|
+
{"blobstore"=>{"address"=>public_ip},
|
31
|
+
"nats"=>{"address"=>public_ip}},
|
32
|
+
"properties"=>{"aws_registry"=>{"address"=>public_ip}}}})
|
33
|
+
end
|
34
|
+
|
35
|
+
def persistent_disk
|
36
|
+
settings.bosh.persistent_disk
|
37
|
+
end
|
38
|
+
|
39
|
+
def resources_cloud_properties
|
40
|
+
{"instance_type"=>"m1.medium"}
|
41
|
+
end
|
42
|
+
|
43
|
+
def cloud_properties
|
44
|
+
{"access_key_id"=>settings.provider.credentials.aws_access_key_id,
|
45
|
+
"secret_access_key"=>settings.provider.credentials.aws_secret_access_key,
|
46
|
+
"region"=>settings.provider.region,
|
47
|
+
"ec2_endpoint"=>"ec2.#{settings.provider.region}.amazonaws.com",
|
48
|
+
"default_security_groups"=>security_groups,
|
49
|
+
"default_key_name"=>microbosh_name,
|
50
|
+
"ec2_private_key"=>private_key_path}
|
51
|
+
end
|
52
|
+
|
53
|
+
def security_groups
|
54
|
+
["ssh",
|
55
|
+
"bosh_agent_http",
|
56
|
+
"bosh_nats_server",
|
57
|
+
"bosh_blobstore",
|
58
|
+
"bosh_director",
|
59
|
+
"bosh_registry"]
|
60
|
+
end
|
61
|
+
|
62
|
+
def aws_region
|
63
|
+
settings.provider.region
|
64
|
+
end
|
65
|
+
|
66
|
+
# only us-east-1 has AMIs published currently
|
67
|
+
def ami_region?
|
68
|
+
aws_region == "us-east-1"
|
69
|
+
end
|
70
|
+
|
71
|
+
def aws_jenkins_bucket
|
72
|
+
"bosh-jenkins-artifacts"
|
73
|
+
end
|
74
|
+
|
75
|
+
def fetch_ami
|
76
|
+
Net::HTTP.get("#{aws_jenkins_bucket}.s3.amazonaws.com", ami_uri_path(aws_region)).strip
|
77
|
+
end
|
78
|
+
|
79
|
+
def ami_uri_path(region)
|
80
|
+
"/last_successful_micro-bosh-stemcell-aws_ami_#{region}"
|
81
|
+
end
|
82
|
+
|
83
|
+
def stemcell_uri
|
84
|
+
"http://#{aws_jenkins_bucket}.s3.amazonaws.com/last_successful_micro-bosh-stemcell-aws.tgz"
|
85
|
+
end
|
86
|
+
|
87
|
+
# downloads latest stemcell & returns path
|
88
|
+
def download_stemcell
|
89
|
+
mkdir_p(stemcell_dir)
|
90
|
+
chdir(stemcell_dir) do
|
91
|
+
stemcell_path = File.expand_path(File.basename(stemcell_uri))
|
92
|
+
unless File.exists?(stemcell_path)
|
93
|
+
sh "curl -O '#{stemcell_uri}'"
|
94
|
+
end
|
95
|
+
return stemcell_path
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def stemcell_dir
|
100
|
+
File.dirname(manifest_path)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
Bosh::Bootstrap::MicroboshProviders.register_provider("aws", Bosh::Bootstrap::MicroboshProviders::AWS)
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require "bosh-bootstrap/microbosh_providers"
|
2
|
+
|
3
|
+
# for the #sh helper
|
4
|
+
require "rake"
|
5
|
+
require "rake/file_utils"
|
6
|
+
|
7
|
+
class Bosh::Bootstrap::MicroboshProviders::Base
|
8
|
+
include FileUtils
|
9
|
+
|
10
|
+
attr_reader :manifest_path
|
11
|
+
attr_reader :settings
|
12
|
+
|
13
|
+
def initialize(manifest_path, settings)
|
14
|
+
@manifest_path = manifest_path
|
15
|
+
@settings = settings.is_a?(Hash) ? ReadWriteSettings.new(settings) : settings
|
16
|
+
raise "@settings must be ReadWriteSettings (or Hash)" unless @settings.is_a?(ReadWriteSettings)
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_microbosh_yml(settings)
|
20
|
+
@settings = settings.is_a?(Hash) ? ReadWriteSettings.new(settings) : settings
|
21
|
+
raise "@settings must be ReadWriteSettings (or Hash)" unless @settings.is_a?(ReadWriteSettings)
|
22
|
+
mkdir_p(File.dirname(manifest_path))
|
23
|
+
File.open(manifest_path, "w") do |f|
|
24
|
+
f << self.to_hash.to_yaml
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_hash
|
29
|
+
{"name"=>microbosh_name,
|
30
|
+
"logging"=>{"level"=>"DEBUG"}
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
def microbosh_name
|
35
|
+
settings.bosh.name
|
36
|
+
end
|
37
|
+
|
38
|
+
def salted_password
|
39
|
+
# BCrypt::Password.create(settings.bosh.password).to_s.force_encoding("UTF-8")
|
40
|
+
settings.bosh.salted_password
|
41
|
+
end
|
42
|
+
|
43
|
+
def public_ip
|
44
|
+
settings.address.ip
|
45
|
+
end
|
46
|
+
|
47
|
+
def private_key_path
|
48
|
+
settings.key_pair.path
|
49
|
+
end
|
50
|
+
end
|