bosh-bootstrap 0.10.2 → 0.11.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.
Files changed (162) hide show
  1. data/.rspec +1 -0
  2. data/.travis.yml +0 -1
  3. data/ChangeLog.md +23 -4
  4. data/Gemfile +5 -2
  5. data/Guardfile +2 -0
  6. data/README.md +209 -197
  7. data/TODO.md +55 -0
  8. data/bosh-bootstrap.gemspec +5 -12
  9. data/lib/bosh/cli/commands/bootstrap.rb +42 -0
  10. data/lib/bosh-bootstrap/cli/commands/delete.rb +26 -0
  11. data/lib/bosh-bootstrap/cli/commands/deploy.rb +89 -0
  12. data/lib/bosh-bootstrap/cli/commands/ssh.rb +32 -0
  13. data/lib/bosh-bootstrap/cli/helpers/bundle.rb +12 -0
  14. data/lib/bosh-bootstrap/cli/helpers/interactions.rb +15 -0
  15. data/lib/bosh-bootstrap/cli/helpers/settings.rb +61 -0
  16. data/lib/bosh-bootstrap/cli/helpers.rb +11 -0
  17. data/lib/bosh-bootstrap/key_pair.rb +21 -0
  18. data/lib/bosh-bootstrap/microbosh.rb +74 -0
  19. data/lib/bosh-bootstrap/microbosh_providers/aws.rb +104 -0
  20. data/lib/bosh-bootstrap/microbosh_providers/base.rb +50 -0
  21. data/lib/bosh-bootstrap/microbosh_providers/openstack.rb +61 -0
  22. data/lib/bosh-bootstrap/microbosh_providers/vsphere.rb +78 -0
  23. data/lib/bosh-bootstrap/microbosh_providers.rb +11 -0
  24. data/lib/bosh-bootstrap/network.rb +33 -0
  25. data/lib/bosh-bootstrap/network_providers/aws.rb +28 -0
  26. data/lib/bosh-bootstrap/network_providers/dummy.rb +10 -0
  27. data/lib/bosh-bootstrap/network_providers/openstack.rb +28 -0
  28. data/lib/bosh-bootstrap/network_providers.rb +11 -0
  29. data/lib/bosh-bootstrap/version.rb +1 -1
  30. data/lib/bosh-bootstrap.rb +3 -4
  31. data/spec/assets/microbosh_yml/micro_bosh.aws_ec2.yml +37 -0
  32. data/spec/assets/microbosh_yml/micro_bosh.aws_vpc.yml +39 -0
  33. data/spec/assets/microbosh_yml/micro_bosh.openstack.yml +30 -0
  34. data/spec/assets/microbosh_yml/micro_bosh.vsphere.yml +34 -0
  35. data/spec/integration/aws/aws_ec2_basic_spec.rb +39 -0
  36. data/spec/integration/aws/aws_helpers.rb +8 -61
  37. data/spec/spec_helper.rb +8 -3
  38. data/spec/support/capture_stdout.rb +18 -0
  39. data/spec/unit/cli/bootstrap_spec.rb +41 -0
  40. data/spec/unit/commands/delete_spec.rb +20 -0
  41. data/spec/unit/commands/deploy_spec.rb +64 -0
  42. data/spec/unit/commands/ssh_spec.rb +19 -0
  43. data/spec/unit/key_pair_spec.rb +13 -0
  44. data/spec/unit/microbosh_providers/aws_spec.rb +68 -0
  45. data/spec/unit/microbosh_providers/openstack_spec.rb +27 -0
  46. data/spec/unit/microbosh_providers/vsphere_spec.rb +42 -0
  47. data/spec/unit/microbosh_spec.rb +27 -0
  48. data/spec/unit/network_providers/aws_spec.rb +29 -0
  49. data/spec/unit/network_providers/openstack_spec.rb +29 -0
  50. data/spec/unit/network_spec.rb +17 -0
  51. metadata +71 -235
  52. data/CleanupCi.md +0 -8
  53. data/bin/bosh-bootstrap +0 -8
  54. data/docs/README.md +0 -3
  55. data/docs/devstack-openstack-tutorial.md +0 -215
  56. data/lib/bosh/providers/README.md +0 -5
  57. data/lib/bosh/providers/aws.rb +0 -258
  58. data/lib/bosh/providers/base_provider.rb +0 -48
  59. data/lib/bosh/providers/openstack.rb +0 -79
  60. data/lib/bosh/providers.rb +0 -21
  61. data/lib/bosh-bootstrap/cli.rb +0 -1347
  62. data/lib/bosh-bootstrap/commander/README.md +0 -47
  63. data/lib/bosh-bootstrap/commander/command.rb +0 -25
  64. data/lib/bosh-bootstrap/commander/commands.rb +0 -80
  65. data/lib/bosh-bootstrap/commander/local_server.rb +0 -68
  66. data/lib/bosh-bootstrap/commander/remote_script_command.rb +0 -51
  67. data/lib/bosh-bootstrap/commander/remote_server.rb +0 -137
  68. data/lib/bosh-bootstrap/commander/upload_command.rb +0 -17
  69. data/lib/bosh-bootstrap/commander.rb +0 -9
  70. data/lib/bosh-bootstrap/helpers/fog_setup.rb +0 -50
  71. data/lib/bosh-bootstrap/helpers/settings.rb +0 -99
  72. data/lib/bosh-bootstrap/helpers/settings_setter.rb +0 -41
  73. data/lib/bosh-bootstrap/helpers.rb +0 -3
  74. data/lib/bosh-bootstrap/stages/stage_micro_bosh_delete/bosh_micro_delete +0 -19
  75. data/lib/bosh-bootstrap/stages/stage_micro_bosh_delete.rb +0 -90
  76. data/lib/bosh-bootstrap/stages/stage_micro_bosh_deploy/bosh_micro_deploy +0 -79
  77. data/lib/bosh-bootstrap/stages/stage_micro_bosh_deploy/install_key_pair_for_user +0 -23
  78. data/lib/bosh-bootstrap/stages/stage_micro_bosh_deploy.rb +0 -146
  79. data/lib/bosh-bootstrap/stages/stage_micro_bosh_download/download_micro_bosh_stemcell +0 -93
  80. data/lib/bosh-bootstrap/stages/stage_micro_bosh_download.rb +0 -139
  81. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/configure_git +0 -25
  82. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/create_vcap_user +0 -79
  83. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_base_packages +0 -30
  84. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_bosh +0 -11
  85. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_bosh_plugins +0 -25
  86. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_hub +0 -26
  87. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_ruby +0 -30
  88. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/install_useful_gems +0 -29
  89. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm/validate_bosh_deployer +0 -18
  90. data/lib/bosh-bootstrap/stages/stage_prepare_inception_vm.rb +0 -69
  91. data/lib/bosh-bootstrap/stages/stage_salted_password/convert_salted_password +0 -11
  92. data/lib/bosh-bootstrap/stages/stage_salted_password.rb +0 -51
  93. data/lib/bosh-bootstrap/stages/stage_setup_new_bosh/setup_bosh_user +0 -29
  94. data/lib/bosh-bootstrap/stages/stage_setup_new_bosh.rb +0 -51
  95. data/lib/bosh-bootstrap/stages/stage_validate_inception_vm/validate_ubuntu +0 -6
  96. data/lib/bosh-bootstrap/stages/stage_validate_inception_vm.rb +0 -39
  97. data/lib/bosh-bootstrap/stages.rb +0 -10
  98. data/spec/assets/bosh/public_stemcells/aws_micro.out +0 -7
  99. data/spec/assets/micro_bosh_yml/micro_bosh.aws_ec2.yml +0 -35
  100. data/spec/assets/micro_bosh_yml/micro_bosh.aws_vpc.yml +0 -37
  101. data/spec/integration/aws/aws_basic_spec.rb +0 -39
  102. data/spec/integration/aws/aws_edge_prebuilt_ami_spec.rb +0 -46
  103. data/spec/integration/aws/aws_edge_prebuilt_spec.rb +0 -46
  104. data/spec/integration/aws/aws_edge_spec.rb +0 -45
  105. data/spec/unit/aws_spec.rb +0 -177
  106. data/spec/unit/bosh/providers/aws_spec.rb +0 -174
  107. data/spec/unit/cli_spec.rb +0 -134
  108. data/spec/unit/cli_ssh_spec.rb +0 -95
  109. data/spec/unit/cli_upgrade_inception_spec.rb +0 -29
  110. data/spec/unit/settings_setter_spec.rb +0 -29
  111. data/vendor/cache/POpen4-0.1.4.gem +0 -0
  112. data/vendor/cache/Platform-0.4.0.gem +0 -0
  113. data/vendor/cache/activesupport-3.2.8.gem +0 -0
  114. data/vendor/cache/awesome_print-1.1.0.gem +0 -0
  115. data/vendor/cache/aws-s3-0.6.3.gem +0 -0
  116. data/vendor/cache/blobstore_client-0.4.0.gem +0 -0
  117. data/vendor/cache/bosh_cli-1.0.3.gem +0 -0
  118. data/vendor/cache/bosh_common-0.5.4.gem +0 -0
  119. data/vendor/cache/builder-3.2.0.gem +0 -0
  120. data/vendor/cache/coderay-1.0.8.gem +0 -0
  121. data/vendor/cache/diff-lcs-1.1.3.gem +0 -0
  122. data/vendor/cache/escape-0.0.4.gem +0 -0
  123. data/vendor/cache/excon-0.20.1.gem +0 -0
  124. data/vendor/cache/fog-1.8.0.gem +0 -0
  125. data/vendor/cache/formatador-0.2.4.gem +0 -0
  126. data/vendor/cache/guard-1.6.2.gem +0 -0
  127. data/vendor/cache/guard-rspec-2.4.0.gem +0 -0
  128. data/vendor/cache/highline-1.6.18.gem +0 -0
  129. data/vendor/cache/httpclient-2.2.4.gem +0 -0
  130. data/vendor/cache/i18n-0.6.1.gem +0 -0
  131. data/vendor/cache/json_pure-1.6.8.gem +0 -0
  132. data/vendor/cache/listen-0.7.2.gem +0 -0
  133. data/vendor/cache/log4r-1.1.10.gem +0 -0
  134. data/vendor/cache/lumberjack-1.0.2.gem +0 -0
  135. data/vendor/cache/method_source-0.8.1.gem +0 -0
  136. data/vendor/cache/mime-types-1.22.gem +0 -0
  137. data/vendor/cache/multi_json-1.1.0.gem +0 -0
  138. data/vendor/cache/net-scp-1.0.4.gem +0 -0
  139. data/vendor/cache/net-ssh-2.2.2.gem +0 -0
  140. data/vendor/cache/net-ssh-gateway-1.1.0.gem +0 -0
  141. data/vendor/cache/netaddr-1.5.0.gem +0 -0
  142. data/vendor/cache/nokogiri-1.5.9.gem +0 -0
  143. data/vendor/cache/open4-1.3.0.gem +0 -0
  144. data/vendor/cache/progressbar-0.9.2.gem +0 -0
  145. data/vendor/cache/pry-0.9.11.4-java.gem +0 -0
  146. data/vendor/cache/pry-0.9.11.4.gem +0 -0
  147. data/vendor/cache/rake-10.0.3.gem +0 -0
  148. data/vendor/cache/rb-fsevent-0.9.3.gem +0 -0
  149. data/vendor/cache/redcard-1.0.0.gem +0 -0
  150. data/vendor/cache/rspec-2.12.0.gem +0 -0
  151. data/vendor/cache/rspec-core-2.12.2.gem +0 -0
  152. data/vendor/cache/rspec-expectations-2.12.1.gem +0 -0
  153. data/vendor/cache/rspec-mocks-2.12.2.gem +0 -0
  154. data/vendor/cache/ruby-atmos-pure-1.0.5.gem +0 -0
  155. data/vendor/cache/ruby-hmac-0.4.0.gem +0 -0
  156. data/vendor/cache/settingslogic-2.0.9.gem +0 -0
  157. data/vendor/cache/slop-3.4.3.gem +0 -0
  158. data/vendor/cache/spoon-0.0.1.gem +0 -0
  159. data/vendor/cache/terminal-table-1.4.5.gem +0 -0
  160. data/vendor/cache/thor-0.17.0.gem +0 -0
  161. data/vendor/cache/uuidtools-2.1.3.gem +0 -0
  162. data/vendor/cache/xml-simple-1.1.2.gem +0 -0
@@ -1,47 +0,0 @@
1
- # Bosh::Bootstrap::Commander
2
-
3
- The sequence of commands that are run on an Inception VM can be either invoked locally on the Inception VM or from a remote machine. The `Commander` provides a DSL for describing the commands to be run and allows them to be sequentially run against a local or remote server.
4
-
5
- Remote servers are accessed via SSH commands.
6
-
7
- Example commands:
8
- ``` ruby
9
- commands = Bosh::Bootstrap::Commander::Commands.new do |server|
10
- server.create "vcap user", <<-BASH
11
- #!/usr/bin/env bash
12
-
13
- groupadd vcap
14
- useradd vcap -m -g vcap
15
- mkdir -p /home/vcap/.ssh
16
- chown -R vcap:vcap /home/vcap/.ssh
17
- BASH
18
-
19
- server.install "rvm & ruby", <<-BASH
20
- #!/usr/bin/env bash
21
-
22
- if [[ -x rvm ]]
23
- then
24
- rvm get stable
25
- else
26
- curl -L get.rvm.io | bash -s stable
27
- source /etc/profile.d/rvm.sh
28
- fi
29
- command rvm install 1.9.3 # oh god this takes a long time
30
- rvm 1.9.3
31
- rvm alias create default 1.9.3
32
- BASH
33
- end
34
-
35
- @local_machine.run(commands)
36
- @server.run(commands)
37
- ```
38
-
39
- There is a set of predefined command methods which give nicer text output. You can also invoke any method upon `server` and it will be supported as the command name. The name of the method invoked is semantically meaningless; it is a convenience.
40
-
41
- * `assign`
42
- * `create`
43
- * `download`
44
- * `install`
45
- * `provision`
46
- * `store`
47
- * `validate`
@@ -1,25 +0,0 @@
1
- # A single command/script to be run on a local/remote server
2
- # For the display, it has an active ("installing") and
3
- # past tense ("installed") verb and a noub/description ("packages")
4
- module Bosh::Bootstrap::Commander
5
- class Command
6
- attr_reader :command # verb e.g. "install"
7
- attr_reader :description # noun phrase, e.g. "packages"
8
-
9
- attr_reader :full_present_tense # e.g. "installing packages"
10
- attr_reader :full_past_tense # e.g. "installed packages"
11
-
12
- def initialize(command, description, full_present_tense=nil, full_past_tense=nil)
13
- @command = command
14
- @description = description
15
- @full_present_tense = full_present_tense || "#{command} #{description}"
16
- @full_past_tense = full_past_tense || "#{command} #{description}"
17
- end
18
-
19
- # Invoke this command (subclass) to call back upon
20
- # +server+ to perform a server helper
21
- def perform(server)
22
- raise "please implement this method to call back upon `server`"
23
- end
24
- end
25
- end
@@ -1,80 +0,0 @@
1
- module Bosh::Bootstrap::Commander
2
- class Commands
3
- attr_reader :commands
4
-
5
- def initialize(&block)
6
- @commands = []
7
- yield self
8
- end
9
-
10
- def upload_file(target_path, file_contents)
11
- @commands << UploadCommand.new(target_path, file_contents)
12
- end
13
-
14
- #
15
- # Generic remote script commands with custom phrases
16
- #
17
-
18
- def assign(description, script, options={})
19
- @commands << RemoteScriptCommand.new(
20
- "assign", description, script,
21
- "assigning #{description}", "assigned #{description}", options)
22
- end
23
-
24
- # Runs a script on target server, and stores the (stripped) STDOUT into
25
- # settings.
26
- #
27
- # Usage:
28
- # server.capture_value "salted password", script("convert_salted_password", "PASSWORD" => settings.bosh.password),
29
- # :settings => "bosh.salted_password"
30
- #
31
- # Would store the returned STDOUT into settings[:bosh][:salted_password]
32
- def capture_value(description, script, options)
33
- @commands << RemoteScriptCommand.new(
34
- "capture value", description, script,
35
- "captures value of #{description}", "captured value of #{description}", options)
36
- end
37
-
38
- def create(description, script, options={})
39
- @commands << RemoteScriptCommand.new(
40
- "create", description, script,
41
- "creating #{description}", "created #{description}", options)
42
- end
43
-
44
- def download(description, script, options={})
45
- @commands << RemoteScriptCommand.new(
46
- "download", description, script,
47
- "downloading #{description}", "downloaded #{description}", options)
48
- end
49
-
50
- def install(description, script, options={})
51
- @commands << RemoteScriptCommand.new(
52
- "install", description, script,
53
- "installing #{description}", "installed #{description}", options)
54
- end
55
-
56
- def provision(description, script, options={})
57
- @commands << RemoteScriptCommand.new(
58
- "provision", description, script,
59
- "provisioning #{description}", "provisioned #{description}", options)
60
- end
61
-
62
- def store(description, script, options={})
63
- @commands << RemoteScriptCommand.new(
64
- "store", description, script,
65
- "storing #{description}", "stored #{description}", options)
66
- end
67
-
68
- def validate(description, script, options={})
69
- @commands << RemoteScriptCommand.new(
70
- "validate", description, script,
71
- "validating #{description}", "validated #{description}", options)
72
- end
73
-
74
- # catch-all for commands with generic active/past tense phrases
75
- def method_missing(command, *args, &blk)
76
- description, script = args[0..1]
77
- @commands << RemoteScriptCommand.new(command.to_s, description, script)
78
- end
79
- end
80
- end
@@ -1,68 +0,0 @@
1
- require "popen4"
2
-
3
- class Bosh::Bootstrap::Commander::LocalServer
4
- attr_reader :logfile
5
-
6
- def initialize(logfile=STDERR)
7
- @logfile = logfile
8
- end
9
-
10
- # Execute the +Command+ objects, in sequential order
11
- # upon the local server
12
- # +commands+ is a +Commands+ container
13
- #
14
- # Returns false once any subcommand fails to execute successfully
15
- def run(commands)
16
- commands.commands.each do |command|
17
- puts command.full_present_tense
18
- if command.perform(self)
19
- Thor::Base.shell.new.say "Successfully #{command.full_past_tense}", :green
20
- else
21
- Thor::Base.shell.new.say_status "error", "#{command.full_present_tense}", :red
22
- return false
23
- end
24
- end
25
- end
26
-
27
- #
28
- # Commands performed on local server
29
- # These map to Command subclasses, which then callback to these
30
- # local server specific implementations
31
- #
32
-
33
- # Run a script
34
- def run_script(command, script, options={})
35
- command.as_file do |execution_command|
36
- `chmod +x #{execution_command}`
37
- status = POpen4::popen4(execution_command) do |stdout, stderr, stdin, pid|
38
- out = stdout.read
39
- logfile.puts out unless out.strip == ""
40
- err = stderr.read
41
- if err.strip != ""
42
- logfile.puts err
43
- STDERR.puts err if logfile != STDERR
44
- end
45
- logfile.flush
46
- end
47
- status.success?
48
- end
49
- rescue StandardError => e
50
- logfile.puts e.message
51
- false
52
- end
53
-
54
- # Upload a file (put a file into local filesystem)
55
- def upload_file(command, path, contents, upload_as_user=nil)
56
- basedir = File.dirname(path)
57
- unless File.directory?(basedir)
58
- logfile.puts "creating micro-bosh manifest folder: #{basedir}"
59
- FileUtils.mkdir_p(basedir)
60
- end
61
- logfile.puts "creating micro-bosh manifest: #{path}"
62
- File.open(path, "w") { |file| file << contents }
63
- true
64
- rescue StandardError => e
65
- logfile.puts e.message
66
- false
67
- end
68
- end
@@ -1,51 +0,0 @@
1
- # A single command/script to be run on a local/remote server
2
- # For the display, it has an active ("installing") and
3
- # past tense ("installed") verb and a noub/description ("packages")
4
- module Bosh::Bootstrap::Commander
5
- class RemoteScriptCommand < Command
6
- attr_reader :command # verb e.g. "install"
7
- attr_reader :description # noun phrase, e.g. "packages"
8
- attr_reader :script
9
-
10
- attr_reader :full_present_tense # e.g. "installing packages"
11
- attr_reader :full_past_tense # e.g. "installed packages"
12
-
13
- # Optional:
14
- attr_reader :ssh_username # e.g. ubuntu or vcap
15
- attr_reader :run_as_root
16
- attr_reader :settings # settings manifest (result of script might get stored back)
17
- attr_reader :save_output_to_settings_key # e.g. bosh.salted_password
18
-
19
- def initialize(command, description, script, full_present_tense=nil, full_past_tense=nil, options={})
20
- super(command, description, full_present_tense, full_past_tense)
21
- @script = script
22
- @ssh_username = options[:ssh_username]
23
- @run_as_root = options[:run_as_root]
24
- @settings = options[:settings]
25
- @save_output_to_settings_key = options[:save_output_to_settings_key]
26
- end
27
-
28
- # Invoke this command to call back upon +server.run_script+
29
- def perform(server)
30
- server.run_script(self, script,
31
- ssh_username: ssh_username, run_as_root: run_as_root,
32
- settings: settings, save_output_to_settings_key: save_output_to_settings_key)
33
- end
34
-
35
- # Provide a filename that represents this Command
36
- def to_filename
37
- @to_filename ||= "#{command} #{description}".gsub(/\W+/, '_')
38
- end
39
-
40
- # Stores the script on the local filesystem in a temporary directory
41
- # Returns path
42
- def as_file(&block)
43
- tmpdir = ENV['TMPDIR'] || "/tmp"
44
- script_path = File.join(tmpdir, to_filename)
45
- File.open(script_path, "w") do |f|
46
- f << @script
47
- end
48
- yield script_path
49
- end
50
- end
51
- end
@@ -1,137 +0,0 @@
1
- require "net/scp"
2
- require "tempfile"
3
-
4
- class Bosh::Bootstrap::Commander::RemoteServer
5
-
6
- attr_reader :host
7
- attr_reader :private_key_path
8
- attr_reader :default_ssh_username
9
- attr_reader :logfile
10
-
11
- def initialize(host, private_key_path, logfile=STDERR)
12
- @host, @private_key_path, @logfile = host, private_key_path, logfile
13
- @default_ssh_username = "vcap" # unless overridden by a Command (before vcap exists)
14
- end
15
-
16
- # Execute the +Command+ objects, in sequential order
17
- # upon the local server
18
- # +commands+ is a +Commands+ container
19
- #
20
- # Returns false once any subcommand fails to execute successfully
21
- def run(commands)
22
- commands.commands.each do |command|
23
- puts command.full_present_tense
24
- if command.perform(self)
25
- Thor::Base.shell.new.say "Successfully #{command.full_past_tense}", :green
26
- else
27
- Thor::Base.shell.new.say_status "error", "#{command.full_present_tense}", :red
28
- return false
29
- end
30
- end
31
- end
32
-
33
- #
34
- # Commands performed on remote server
35
- # These map to Command subclasses, which then callback to these
36
- # remote server specific implementations
37
- #
38
-
39
- # Run a script
40
- #
41
- # Uploads it to the remote server, makes it executable, then executes
42
- # Stores the last line of stripped STDOUT/STDERR into a settings field,
43
- # if :settings & :save_output_to_settings_key => "x.y.z" provided
44
- def run_script(command, script, options={})
45
- ssh_username = options[:ssh_username] || default_ssh_username
46
- run_as_root = options[:run_as_root]
47
- settings = options[:settings]
48
- settings_key = options[:save_output_to_settings_key]
49
-
50
- remote_path = remote_tmp_script_path(command)
51
- upload_file(command, remote_path, script, ssh_username)
52
- output, status = run_remote_script(remote_path, ssh_username, run_as_root)
53
- output =~ /^(.*)\Z/
54
- last_line = $1
55
- # store output into a settings field, if requested
56
- # TODO replace this with SettingsSetting#setting(settings_key, last_line.strip)
57
-
58
- puts "Last line of script: #{last_line}"
59
- puts "Storing to settings_key #{settings_key}" if settings_key
60
- if settings_key
61
- settings_key_portions = settings_key.split(".")
62
- parent_key_portions, final_key = settings_key_portions[0..-2], settings_key_portions[-1]
63
- target_settings_field = settings
64
- parent_key_portions.each do |key_portion|
65
- target_settings_field[key_portion] ||= {}
66
- target_settings_field = target_settings_field[key_portion]
67
- end
68
- target_settings_field[final_key] = last_line.strip
69
- end
70
-
71
- status
72
- rescue StandardError => e
73
- logfile.puts e.message
74
- false
75
- end
76
-
77
- # Upload a file (put a file into the remote server's filesystem)
78
- def upload_file(command, remote_path, contents, ssh_username=nil)
79
- upload_as_user = ssh_username || default_ssh_username
80
- run_remote_command("mkdir -p #{File.dirname(remote_path)}", upload_as_user)
81
- Tempfile.open("remote_script") do |file|
82
- file << contents
83
- file.flush
84
- logfile.puts "uploading #{remote_path} to Inception VM"
85
- Net::SCP.upload!(host, upload_as_user, file.path, remote_path, ssh: { keys: private_keys })
86
- end
87
- true
88
- rescue StandardError => e
89
- logfile.puts "ERROR running upload_file(#{command.class}, '#{remote_path}', ...)"
90
- logfile.puts e.message
91
- logfile.puts e.backtrace
92
- false
93
- end
94
-
95
- private
96
- def remote_tmp_script_path(command)
97
- "/tmp/remote_script_#{command.to_filename}"
98
- end
99
-
100
- # Makes +remote_path+ executable, then runs it
101
- # Returns:
102
- # * a String of all STDOUT/STDERR; which is also appended to +logfile+
103
- # * status (true = success)
104
- #
105
- # TODO catch exceptions http://learnonthejob.blogspot.com/2010/08/exception-handling-for-netssh.html
106
- def run_remote_script(remote_path, ssh_username, run_as_root)
107
- sudo = run_as_root ? "sudo " : ""
108
- commands = [
109
- "chmod +x #{remote_path}",
110
- "bash -lc '#{sudo}/usr/bin/env PATH=$PATH #{remote_path}'"
111
- ]
112
- script_output = ""
113
- results = Fog::SSH.new(host, ssh_username, keys: private_keys).run(commands) do |stdout, stderr|
114
- [stdout, stderr].flatten.each do |data|
115
- logfile << data
116
- script_output << data
117
- end
118
- end
119
- result = results.last
120
- result_success = result.status == 0
121
- [script_output, result_success]
122
- end
123
-
124
- def run_remote_command(command, username)
125
- Net::SSH.start(host, username, keys: private_keys) do |ssh|
126
- ssh.exec!("bash -lc '#{command}'") do |channel, stream, data|
127
- logfile << data
128
- end
129
- end
130
- end
131
-
132
- # path to local private key being used
133
- def private_keys
134
- [private_key_path]
135
- end
136
-
137
- end
@@ -1,17 +0,0 @@
1
- # A single command/script to be run on a local/remote server
2
- # For the display, it has an active ("installing") and
3
- # past tense ("installed") verb and a noub/description ("packages")
4
- module Bosh::Bootstrap::Commander
5
- class UploadCommand < Command
6
- def initialize(target_path, file_contents)
7
- super("upload", "file", "uploading file", "uploaded file")
8
- @target_path = target_path
9
- @file_contents = file_contents
10
- end
11
-
12
- # Invoke this command to call back upon +server.upload_file+
13
- def perform(server)
14
- server.upload_file(self, @target_path, @file_contents)
15
- end
16
- end
17
- end
@@ -1,9 +0,0 @@
1
- module Bosh::Bootstrap::Commander
2
- end
3
-
4
- require "bosh-bootstrap/commander/command"
5
- require "bosh-bootstrap/commander/remote_script_command"
6
- require "bosh-bootstrap/commander/upload_command"
7
- require "bosh-bootstrap/commander/commands"
8
- require "bosh-bootstrap/commander/local_server"
9
- require "bosh-bootstrap/commander/remote_server"
@@ -1,50 +0,0 @@
1
- # Copyright (c) 2012-2013 Stark & Wayne, LLC
2
-
3
- require "fog"
4
- module Bosh; module Bootstrap; module Helpers; end; end; end
5
-
6
- # A collection of methods related to getting fog_compute
7
- # credentials for creating the inception VM
8
- # and to provide to the MicroBOSH for its uses.
9
- #
10
- # Attempts to look in +settings.fog_path+ to see if there is a .fog file.
11
- module Bosh::Bootstrap::Helpers::FogSetup
12
-
13
- # fog connection object to Compute tasks (VMs, IP addresses)
14
- def fog_compute
15
- @fog_compute ||= begin
16
- # Fog::Compute.new requires Hash with keys that are symbols
17
- # but Settings converts all keys to strings
18
- # So create a version of settings.fog_credentials with symbol keys
19
- credentials_with_symbols = settings.fog_credentials.inject({}) do |creds, key_pair|
20
- key, value = key_pair
21
- creds[key.to_sym] = value
22
- creds
23
- end
24
- Fog::Compute.new(credentials_with_symbols)
25
- end
26
- end
27
-
28
- def reset_fog_compute
29
- @fog_compute = nil
30
- @provider = nil # in cli.rb - I don't like this; need one wrapper for all CPI/compute calls
31
- # or don't create fog_compute until we know all IaaS details
32
- end
33
-
34
- def fog_config
35
- @fog_config ||= begin
36
- if File.exists?(fog_config_path)
37
- say "Found infrastructure API credentials at #{fog_config_path} (override with --fog)"
38
- YAML.load_file(fog_config_path)
39
- else
40
- say "No existing #{fog_config_path} fog configuration file", :yellow
41
- {}
42
- end
43
- end
44
- end
45
-
46
- def fog_config_path
47
- settings.fog_path
48
- end
49
-
50
- end
@@ -1,99 +0,0 @@
1
- # Copyright (c) 2012-2013 Stark & Wayne, LLC
2
-
3
- require "settingslogic"
4
- module Bosh; module Bootstrap; module Helpers; end; end; end
5
-
6
- # Helper methods for loading/saving settings
7
- module Bosh::Bootstrap::Helpers::Settings
8
-
9
- # Previously selected settings are stored in a YAML manifest
10
- # Protects the manifest file with user-only priveleges
11
- def settings
12
- @settings ||= begin
13
- FileUtils.mkdir_p(File.dirname(settings_path))
14
- unless File.exists?(settings_path)
15
- File.open(settings_path, "w") do |file|
16
- file << {}.to_yaml
17
- end
18
- end
19
- FileUtils.chmod 0600, settings_path
20
- Settingslogic.new(settings_path)
21
- end
22
- end
23
-
24
- def save_settings!
25
- File.open(settings_path, "w") do |file|
26
- raw_settings_yaml = settings.to_yaml.gsub(" !ruby/hash:Settingslogic", "")
27
- file << raw_settings_yaml
28
- end
29
- @settings = nil # force to reload & recreate helper methods
30
- end
31
-
32
- # the base directory for holding the manifest settings file
33
- # and private keys
34
- #
35
- # Defaults to ~/.bosh_bootstrap; and can be overridden with either:
36
- # * $SETTINGS - to a folder (supported method)
37
- # * $MANIFEST - to a folder (unsupported)
38
- # * $MANIFEST - to a specific file; but uses its parent dir (unsupported, backwards compatibility)
39
- def settings_dir
40
- @settings_dir ||= begin
41
- settings_dir = ENV["SETTINGS"] if ENV["SETTINGS"]
42
- settings_dir ||= ENV["MANIFEST"] if ENV["MANIFEST"]
43
- settings_dir = File.dirname(settings_dir) if settings_dir && File.file?(settings_dir)
44
- settings_dir ||= "~/.bosh_bootstrap"
45
- File.expand_path(settings_dir)
46
- end
47
- end
48
-
49
- def settings_path
50
- File.join(settings_dir, "manifest.yml")
51
- end
52
-
53
- def settings_ssh_dir
54
- File.join(settings_dir, "ssh")
55
- end
56
-
57
- def backup_current_settings_file
58
- backup_path = "#{settings_path}.bak"
59
- FileUtils.cp_r(settings_path, backup_path)
60
- end
61
-
62
- def migrate_old_settings
63
- if migrate_old_ssh_keys?
64
- say "Upgrading settings manifest file:"
65
- backup_current_settings_file
66
- end
67
- migrate_old_ssh_keys
68
- end
69
-
70
- # Do we need to migrate old ssh keys to new settings format?
71
- def migrate_old_ssh_keys?
72
- settings["local"] && settings["local"]["private_key_path"]
73
- end
74
-
75
- # Migrate this old data
76
- # local:
77
- # public_key_path: /Users/drnic/.ssh/id_rsa.pub
78
- # private_key_path: /Users/drnic/.ssh/id_rsa
79
- # into new format:
80
- # inception:
81
- # local_private_key_path: ~/.bosh_bootstrap/ssh/inception (copy of settings.local.private_key_path)
82
- # key_pair:
83
- # name: <name of provider key_pair used when provisioning inception VM>
84
- # private_key: <contents of settings.local.private_key_path file>
85
- # public_key: <contents of settings.local.public_key_path file>
86
- def migrate_old_ssh_keys
87
- if migrate_old_ssh_keys?
88
- say "-> migrating to cache private key for inception VM..."
89
- inception_vm_private_key_path # to setup the path in settings
90
- settings["inception"]["key_pair"] ||= {}
91
- settings["inception"]["key_pair"]["name"] = "fog_default"
92
- settings["inception"]["key_pair"]["private_key"] = File.read(settings["local"]["private_key_path"]).strip
93
- settings["inception"]["key_pair"]["public_key"] = File.read(settings["local"]["public_key_path"]).strip
94
- settings.delete("local")
95
- save_settings!
96
- end
97
- end
98
-
99
- end
@@ -1,41 +0,0 @@
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
-
11
- # Let's you navigate to a nested setting, do something with it,
12
- # and then saves any changes to settings.
13
- # Usage:
14
- # with_setting "inception" { |s| s["host"] = "1.2.3.4" }
15
- # with_setting "a.b.c" { |s| s["value"] = "1.2.3.4" }
16
- def with_setting(nested_key, &block)
17
- target_settings_field = settings
18
- settings_key_portions = nested_key.split(".")
19
- parent_key_portions, final_key = settings_key_portions[0..-2], settings_key_portions[-1]
20
- parent_key_portions.each do |key_portion|
21
- target_settings_field[key_portion] ||= {}
22
- target_settings_field = target_settings_field[key_portion]
23
- end
24
-
25
- target_settings_field[final_key] ||= {}
26
- yield target_settings_field[final_key]
27
- save_settings!
28
- end
29
-
30
- def setting(nested_key, value)
31
- target_settings_field = settings
32
- settings_key_portions = nested_key.split(".")
33
- parent_key_portions, final_key = settings_key_portions[0..-2], settings_key_portions[-1]
34
- parent_key_portions.each do |key_portion|
35
- target_settings_field[key_portion] ||= {}
36
- target_settings_field = target_settings_field[key_portion]
37
- end
38
- target_settings_field[final_key] = value
39
- end
40
-
41
- end
@@ -1,3 +0,0 @@
1
- require "bosh-bootstrap/helpers/settings"
2
- require "bosh-bootstrap/helpers/settings_setter"
3
- require "bosh-bootstrap/helpers/fog_setup"
@@ -1,19 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- # Deletes a micro BOSH using "bosh micro delete"
4
- #
5
- # Required:
6
- # * $BOSH_NAME - name of bosh deployment
7
- # (thus /var/vcap/store/microboshes/deployments/$BOSH_NAME/micro_bosh.yml exists)
8
-
9
- set -e # exit immediately if a simple command exits with a non-zero status
10
- set -u # report the usage of uninitialized variables
11
-
12
- # TODO in preparation for http://reviews.cloudfoundry.org/#/c/11976/
13
- export COLUMNS=80 # force a small width for progress bar
14
-
15
- cd /var/vcap/store/microboshes/deployments/
16
- bosh -n micro deployment $BOSH_NAME
17
-
18
- echo "Deleting deployment of micro BOSH $BOSH_NAME"
19
- bosh -n micro delete