sambot 0.1.158 → 0.1.159

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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/lib/sambot.rb +1 -0
  3. data/lib/sambot/base_command.rb +1 -24
  4. data/lib/sambot/chef/cookbook.rb +32 -54
  5. data/lib/sambot/chef/generator.rb +28 -38
  6. data/lib/sambot/chef/hooks.rb +4 -2
  7. data/lib/sambot/chef/kitchen.rb +33 -42
  8. data/lib/sambot/chef/metadata.rb +14 -14
  9. data/lib/sambot/cli.rb +22 -19
  10. data/lib/sambot/config.rb +59 -4
  11. data/lib/sambot/docs/bump.txt +1 -0
  12. data/lib/sambot/docs/{generate.txt → create.txt} +0 -0
  13. data/lib/sambot/fs.rb +33 -0
  14. data/lib/sambot/runtime.rb +13 -29
  15. data/lib/sambot/template.rb +22 -1
  16. data/lib/sambot/templates/.config.yml.erb +7 -7
  17. data/lib/sambot/{docs/configure.txt → templates/.consul.yml} +0 -0
  18. data/lib/sambot/templates/.vault.yml +0 -0
  19. data/lib/sambot/templates/README.md +0 -0
  20. data/lib/sambot/templates/Vagrantfile.erb +7 -5
  21. data/lib/sambot/templates/attributes/default.rb +0 -0
  22. data/lib/sambot/templates/{gcp_bootstrap.ps1.erb → bootstrap_scripts/google/bootstrap.ps1.erb} +0 -0
  23. data/lib/sambot/templates/{gcp_bootstrap.sh.erb → bootstrap_scripts/google/bootstrap.sh.erb} +0 -1
  24. data/lib/sambot/templates/bootstrap_scripts/local/sidecar_vault/bootstrap.ps1.erb +33 -0
  25. data/lib/sambot/templates/bootstrap_scripts/local/sidecar_vault/bootstrap.sh.erb +34 -0
  26. data/lib/sambot/templates/{local_bootstrap.ps1 → bootstrap_scripts/local/standalone_vault/bootstrap.ps1.erb} +0 -0
  27. data/lib/sambot/templates/{local_bootstrap.sh → bootstrap_scripts/local/standalone_vault/bootstrap.sh.erb} +0 -0
  28. data/lib/sambot/templates/{pre-commit → git_hooks/pre-commit} +0 -0
  29. data/lib/sambot/templates/{pre-push → git_hooks/pre-push} +0 -0
  30. data/lib/sambot/templates/local/vault/helper.rb +11 -0
  31. data/lib/sambot/templates/recipes/configure.rb.erb +0 -0
  32. data/lib/sambot/templates/recipes/default.rb.erb +0 -0
  33. data/lib/sambot/templates/recipes/install.rb.erb +0 -0
  34. data/lib/sambot/templates/spec/spec_helper.rb +2 -0
  35. data/lib/sambot/templates/test/default_test.rb +0 -0
  36. data/lib/sambot/templates/{.kitchen.gcp.yml.erb → test_kitchen/google.yml.erb} +0 -0
  37. data/lib/sambot/templates/{.kitchen.yml.erb → test_kitchen/local.yml.erb} +2 -2
  38. data/lib/sambot/templates/{.kitchen.rackspace.yml.erb → test_kitchen/rackspace.yml.erb} +5 -5
  39. data/lib/sambot/ui.rb +12 -6
  40. data/lib/sambot/version.rb +1 -1
  41. metadata +26 -17
  42. data/lib/sambot/commands/cookbook_cmd.rb +0 -44
  43. data/lib/sambot/docs/start.txt +0 -21
  44. data/lib/sambot/docs/stop.txt +0 -7
  45. data/lib/sambot/workflow/dns.rb +0 -43
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 139b18279e241ac46116915b26deb81f1580d678
4
- data.tar.gz: b52f85c301c1fd55f479f8bc0c9a1faa16f53461
3
+ metadata.gz: f27feb0c87f9680b1441083a5226c3c45f34949d
4
+ data.tar.gz: 137d801be27d2a4331845631e71e4f7d2cdaf052
5
5
  SHA512:
6
- metadata.gz: 5cf99d7d524a275da20dcf8a185243da2fe8a6f11a234190dcdf2b54adec6e40c53cdf97b957cbaca6b5260c8b7f402c18702fb77c795348cf097059a52444ce
7
- data.tar.gz: 3e38b01a1a55544203a6e83953523a17ba6634c0946aedca87becc807d22838be3e2b6aa550ca42f6476e064a1af7de6263174748f147c1af482deb0a70ab1b2
6
+ metadata.gz: 49a6f7111b10455d4067fde52cabf814912f5ede523ccc9226d81a92892dbc846c7ea62c513e496aff3b533a2dfc5e1b769506f21f64a153018304858bf5835d
7
+ data.tar.gz: c7197211b5b94c3d0d8dd2898525d7f10738d8f6583523a685f728b16fde7d15860d1ecd5d46128903bc3730fa8b3f1d637a4190a976b8f01082def49ad8d480
data/lib/sambot.rb CHANGED
@@ -6,6 +6,7 @@ require_relative 'sambot/ui'
6
6
  require_relative 'sambot/runtime'
7
7
  require_relative 'sambot/version'
8
8
  require_relative 'sambot/template'
9
+ require_relative 'sambot/fs'
9
10
 
10
11
  require_relative 'sambot/chef/kitchen'
11
12
  require_relative 'sambot/chef/metadata'
@@ -62,36 +62,13 @@ module Sambot
62
62
 
63
63
  no_commands do
64
64
 
65
- def missing_credentials(need_dev_credentials, need_sudo_password)
66
- return true if need_dev_credentials && (!ENV['SAMBOT_DEV_USERNAME'] && !ENV['SAMBOT_DEV_PASSWORD'])
67
- return need_sudo_password && !ENV['SAMBOT_SUDO_PASSWORD']
68
- end
69
-
70
- def execute(need_dev_credentials: false, need_sudo_password: false)
71
- if missing_credentials(need_dev_credentials, need_sudo_password)
72
- UI.info("Sambot will need to make some secure operations on your behalf. You can provide your credentials below or set them as environment variables:")
73
- end
74
- if need_dev_credentials && !ENV['SAMBOT_DEV_USERNAME']
75
- ENV['SAMBOT_DEV_USERNAME'] = UI.ask("No environment variable SAMBOT_DEV_USERNAME found. Please provide your DEV/QE AD username: ")
76
- end
77
- if need_dev_credentials && !ENV['SAMBOT_DEV_PASSWORD']
78
- ENV['SAMBOT_DEV_PASSWORD'] = UI.ask_password("No environment variable SAMBOT_DEV_PASSWORD found. Please provide your DEV/QE AD password: ")
79
- puts "\n"
80
- end
81
- if need_sudo_password && !ENV['SAMBOT_SUDO_PASSWORD']
82
- ENV['SAMBOT_SUDO_PASSWORD'] = UI.ask_password("No environment variable SAMBOT_SUDO_PASSWORD found. Please provide your sudo password - this is required for operations such as setting up your local SSH tunnels: ")
83
- puts "\n"
84
- end
65
+ def execute()
85
66
  Runtime.ensure_latest
86
67
  yield
87
68
  rescue ApplicationError => e
88
69
  UI.error(e.message)
89
70
  end
90
71
 
91
- def config
92
- Config.new.read
93
- end
94
-
95
72
  def self.docs(path)
96
73
  File.read(File.join(File.dirname(__FILE__), '/docs', path + '.txt'))
97
74
  end
@@ -7,87 +7,65 @@ module Sambot
7
7
  module Chef
8
8
  class Cookbook
9
9
 
10
- ESSENTIAL_FILES = [
11
- '.config.yml',
12
- 'recipes',
13
- 'README.md'
14
- ].freeze
15
-
16
10
  GENERATED_FILES = {
17
11
  'teamcity.sh.erb': {eruby: true, dest: 'teamcity.sh', platform: [:windows, :centos]},
18
12
  'chefignore': {eruby: false, dest: 'chefignore', platform: [:windows, :centos]},
19
13
  'Berksfile': {eruby: false, dest: 'Berksfile', platform: [:windows, :centos]},
20
14
  '.rubocop.yml': {eruby: false, dest: '.rubocop.yml', platform: [:windows, :centos]},
21
15
  '.gitignore.sample': {eruby: false, dest: '.gitignore', platform: [:windows, :centos]},
22
- 'local_bootstrap.sh': {eruby: false, dest: 'local_bootstrap.sh', platform: [:centos]},
23
- 'local_bootstrap.ps1': {eruby: false, dest: 'local_bootstrap.ps1', platform: [:windows]},
24
- 'gcp_bootstrap.sh.erb': {eruby: true, dest: 'gcp_bootstrap.sh', platform: [:centos]},
25
- 'gcp_bootstrap.ps1.erb': {eruby: true, dest: 'gcp_bootstrap.ps1', platform: [:windows]},
26
16
  'Vagrantfile.erb': {eruby: false, dest: 'Vagrantfile.erb', platform: [:windows, :centos]},
27
17
  'winrm_config': {eruby: false, dest: 'winrm_config', platform: [:windows]}
28
18
  }
29
19
 
30
- CHEF_ARTEFACTS = ['Berksfile.lock']
31
-
32
- KITCHEN_FILES_PATTERN = '\.kitchen*\.yml'
33
-
34
20
  class << self
35
21
 
36
- def build(config)
37
- Generator.from_templates(config, ESSENTIAL_FILES, GENERATED_FILES)
38
- Kitchen.setup(config)
22
+ def build(config, cloud, vault_setup = nil)
23
+ create_files(config)
24
+ Generator.from_templates(config, cloud, vault_setup, GENERATED_FILES)
25
+ Kitchen.setup(cloud, config)
39
26
  Metadata.generate(config)
40
27
  Hooks.copy()
41
28
  UI.info('The cookbook has been successfully built.')
42
29
  end
43
30
 
31
+ def bump()
32
+ new_version = Config.bump_version
33
+ UI.info("You have bumped the version of this cookbook to #{new_version}.")
34
+ end
35
+
44
36
  def clean()
45
37
  UI.info('Removing all generated files from this cookbook.')
46
- targets = ['metadata.rb', 'Berksfile.lock'] + GENERATED_FILES.map{ |key, val| val[:dest]} + Dir.glob(KITCHEN_FILES_PATTERN) - ['.gitignore']
47
- targets.each { |file| delete(file) }
38
+ targets = GENERATED_FILES.map{ |key, val| val[:dest]} - ['.gitignore']
39
+ targets.each { |file| Sambot::FS.delete(file) }
40
+ Sambot::FS.delete('bootstrap.sh')
41
+ Sambot::FS.delete('bootstrap.ps1')
42
+ Metadata.clean
43
+ Kitchen.clean
48
44
  UI.info('The cookbook has been successfully cleaned.')
49
45
  end
50
46
 
51
- def bump()
52
- new_version = Config.new.bump_version
53
- UI.info("You have bumped the version of this cookbook to #{new_version}.")
54
- end
55
-
56
- def generate(config)
57
- Git.init(config[:name])
58
- Dir.chdir(config[:name]) do
59
- ['test', 'spec', 'recipes', 'attributes'].each {|target| FileUtils.mkdir(target) }
60
- Dir.chdir('attributes') do
61
- FileUtils.touch('default.rb')
62
- end
63
- Dir.chdir('recipes') do
64
- FileUtils.touch('install.rb')
65
- FileUtils.touch('configure.rb')
66
- FileUtils.touch('default.rb')
67
- end
68
- Dir.chdir('test') do
69
- FileUtils.touch('default_test.rb')
70
- end
71
- Dir.chdir('spec') do
72
- File.write('spec_helper.rb', <<-EOT)
73
- require 'chefspec'
74
- require 'chefspec/berkshelf'
75
- EOT
76
- FileUtils.touch('default_spec.rb')
77
- end
78
- FileUtils.touch('README.md')
79
- Template.new('.config.yml.erb').write(config, '.config.yml')
80
- UI.debug("./.config.yml has been added to the cookbook.")
47
+ def create(config)
48
+ Git.init(config.name)
49
+ Dir.chdir(config.name) do
50
+ create_files(config)
81
51
  end
82
- UI.info('The cookbook has been successfully generated.')
52
+ UI.info('The cookbook has been successfully created.')
83
53
  end
84
54
 
85
55
  private
86
56
 
87
- def delete(filename)
88
- return unless File.exist?(filename)
89
- File.delete(filename)
90
- UI.debug("./#{filename} has been removed.")
57
+ def create_files(config)
58
+ ['spec', 'test', 'attributes', '.vault.yml', '.consul.yml', 'local', 'README.md'].each { |resource| FS.copy(resource) }
59
+ ['recipes', 'libraries', 'resources', 'files', 'templates'].each { |target| FS.mkdir(target) }
60
+ Dir.chdir('recipes') do
61
+ Template.new('recipes/install.rb.erb').write({config: config}, 'install.rb') unless FS.exist?('install.rb')
62
+ Template.new('recipes/configure.rb.erb').write({config: config}, 'configure.rb') unless FS.exist?('configure.rb')
63
+ Template.new('recipes/default.rb.erb').write({config: config}, 'default.rb') unless FS.exist?('default.rb')
64
+ end
65
+ unless FS.exist?('.config.yml')
66
+ Template.new('.config.yml.erb').write({config: config}, '.config.yml')
67
+ UI.debug("./.config.yml has been added to the cookbook.")
68
+ end
91
69
  end
92
70
 
93
71
  end
@@ -5,27 +5,32 @@ module Sambot
5
5
  module Chef
6
6
  class Generator
7
7
 
8
- def self.from_templates(config, cookbook_essentials, cookbook_generated_files)
9
- platforms = config[:platforms] if config.has_key?(:platforms)
10
- platforms = config['platforms'] if config.has_key?('platforms')
11
- cookbook_essentials.each { |path| exists!(path) } if cookbook_essentials
12
- cookbook_generated_files.each do |template_name, opts|
13
- generate_from_template(template_name.to_s, opts, platforms)
14
- end
15
- override_bootstrap_mechanism(config['bootstrap']) if config['bootstrap']
8
+ def self.from_templates(config, cloud, vault_setup, generated_files)
9
+ generated_files.each { |template_name, opts| generate_from_template(template_name.to_s, opts, config) }
10
+ generate_bootstrap_scripts(config, cloud, vault_setup)
16
11
  end
17
12
 
18
13
  private
19
14
 
20
- def self.override_bootstrap_mechanism(config)
21
- if config['centos']
22
- raise ApplicationError, "The file #{config['centos']} does not exist" unless File.exist?(config['centos'])
23
- FileUtils.cp(config['centos'], 'bootstrap.sh')
24
- end
25
- if config['windows']
26
- raise ApplicationError, "The file #{config['centos']} does not exist" unless File.exist?(config['windows'])
27
- FileUtils.cp(config['windows'], 'bootstrap.ps1')
28
- end
15
+ def self.bootstrap_centos(path)
16
+ generate_bootstrap_from_template('bootstrap.sh', path, 'sh')
17
+ end
18
+
19
+ def self.bootstrap_windows(path)
20
+ generate_bootstrap_from_template('bootstrap.ps1', path, 'ps1')
21
+ end
22
+
23
+ def self.bootstrap(config, path)
24
+ bootstrap_centos(path) if config.runs_on_centos?
25
+ bootstrap_windows(path) if config.runs_on_windows?
26
+ end
27
+
28
+ def self.generate_bootstrap_from_template(dest, path, suffix)
29
+ Template.new("bootstrap_scripts/#{path}/bootstrap.#{suffix}.erb").process({eruby: true, dest: "bootstrap.#{suffix}"})
30
+ end
31
+
32
+ def self.generate_bootstrap_scripts(config, cloud, vault_setup)
33
+ cloud != 'local'? bootstrap(config, cloud) : bootstrap(config, "local/#{vault_setup}_vault")
29
34
  end
30
35
 
31
36
  def self.exists!(path)
@@ -33,36 +38,21 @@ module Sambot
33
38
  raise ApplicationError, "The file or directory #{path} was not found in the current directory."
34
39
  end
35
40
 
36
- def self.generate_from_template(template_file, opts, platforms)
37
- UI.debug("Processing #{template_file} with opts #{opts.inspect} on platform #{platforms}")
41
+ def self.generate_from_template(template_file, opts, config)
42
+ UI.debug("Processing #{template_file} with opts #{opts.inspect} on platform #{config.available_platforms}")
38
43
  template = Template.new(template_file)
39
- if valid_platform?(opts, platforms)
40
- File.delete(opts[:dest]) if File.exist?(opts[:dest])
41
- if opts[:eruby]
42
- UI.debug("Parsing #{template.path} using Erubis")
43
- template.write({}, opts[:dest])
44
- else
45
- FileUtils.cp(template.path, opts[:dest].to_s)
46
- end
47
- if File.executable?(template.path)
48
- UI.debug("Making #{opts[:dest]} executable")
49
- make_executable(template.path, opts[:dest])
50
- end
44
+ if valid_platform?(opts, config)
45
+ template.process(opts)
51
46
  UI.debug("#{opts[:dest]} has been added to the cookbook.")
52
47
  end
53
48
  end
54
49
 
55
- def self.valid_platform?(opts, platforms)
50
+ def self.valid_platform?(opts, config)
56
51
  targets = opts[:platform].map { |x| x.to_s}
57
- result = targets & platforms
52
+ result = targets & config.available_platforms
58
53
  result.size > 0
59
54
  end
60
55
 
61
- def self.make_executable(file, working_path)
62
- current_mask = File.stat(file).mode
63
- new_mask = current_mask | '0000000000000001'.to_i(2)
64
- File.chmod(new_mask, working_path)
65
- end
66
56
  end
67
57
  end
68
58
  end
@@ -4,10 +4,12 @@ module Sambot
4
4
  module Chef
5
5
  class Hooks
6
6
 
7
+ SCRIPTS = ['pre-push', 'pre-commit']
8
+
7
9
  def self.copy
8
- ['pre-push', 'pre-commit'].each do |hook|
10
+ SCRIPTS.each do |hook|
9
11
  working_path = ".git/hooks/#{hook}"
10
- template_path = Template.new(hook).path
12
+ template_path = Template.new("git_hooks/#{hook}").path
11
13
  File.delete(working_path) if File.exist?(working_path)
12
14
  FileUtils.cp(template_path, working_path)
13
15
  UI.debug("The #{hook} Git hook has been added to the cookbook.")
@@ -4,68 +4,59 @@ module Sambot
4
4
  module Chef
5
5
  class Kitchen
6
6
 
7
- LOCAL = '.kitchen.yml'
8
- GCP = '.kitchen.gcp.yml'
9
- RACKSPACE = '.kitchen.rackspace.yml'
10
-
11
7
  class << self
12
8
 
13
- def setup(config)
14
- files = generate_yml(config['name'], config['platforms'], config['suites'])
15
- files.each do |filename, contents|
16
- File.write(filename.to_s, contents)
17
- UI.debug("#{filename.to_s} has been added to the cookbook.")
18
- end
9
+ GENERATED_FILE = '.kitchen.yml'
10
+
11
+ def setup(cloud, config)
12
+ contents = generate_yml(cloud, config.name, config.available_platforms, config.suites)
13
+ File.write(GENERATED_FILE, contents)
14
+ UI.debug("#{GENERATED_FILE} has been added to the cookbook.")
19
15
  end
20
16
 
21
- def generate_yml(cookbook_name, platforms, suites = nil)
17
+ def clean
18
+ FS.delete(GENERATED_FILE)
19
+ end
20
+
21
+ def generate_yml(cloud, cookbook_name, platforms, suites = nil)
22
22
  raise ApplicationError, 'Missing platforms when trying to generate Test-Kitchen YAML.' unless platforms
23
23
  raise ApplicationError, 'Missing cookbook name when trying to generate Test-Kitchen YAML.' unless cookbook_name
24
- test_kitchen_configs = {
25
- "#{LOCAL}": read_template(LOCAL, cookbook_name, platforms),
26
- "#{GCP}": read_template(GCP, cookbook_name, platforms),
27
- "#{RACKSPACE}": read_template(RACKSPACE, cookbook_name, platforms)
28
- }
29
- test_kitchen_configs.each do |key, value|
30
- if suites
31
- value['suites'] = Marshal.load(Marshal.dump(suites))
32
- case key.to_s
33
- when LOCAL
34
- add_platform_identifier(value, 'LOCAL')
35
- when GCP
36
- add_platform_identifier(value, 'GCP')
37
- when RACKSPACE
38
- add_platform_identifier(value, 'RACKSPACE')
39
- end
40
- end
41
- test_kitchen_configs[key] = value.to_yaml
24
+ template = read_template(cloud, cookbook_name, platforms)
25
+ if suites
26
+ template['suites'] = Marshal.load(Marshal.dump(suites))
27
+ add_platform_identifier(template, cloud)
42
28
  end
43
- test_kitchen_configs
29
+ template.to_yaml
44
30
  end
45
31
 
46
32
  private
47
33
 
34
+ # Adds attributes to each test suite that is only applicable to testing
35
+ # environments. These are things like controlling how Vault token
36
+ # renewal works and specifying the cloud platform.
48
37
  def add_platform_identifier(value, platform)
49
- value['suites'].each do |config|
50
- config['run_list'] = handle_customized_runlists(config, platform)
51
- config['attributes'] = config['attributes'] || {}
52
- config['attributes']['cloud_platform'] = platform
53
- config['attributes']['vault'] = config['attributes']['vault'] || {}
54
- config['attributes']['vault']['exec_renew'] = false
38
+ value['suites'].each do |suite|
39
+ suite['run_list'] = handle_customized_runlists(suite, platform)
40
+ suite['attributes'] = suite['attributes'] || {}
41
+ suite['attributes']['cloud_platform'] = platform
42
+ suite['attributes']['vault'] = suite['attributes']['vault'] || {}
43
+ suite['attributes']['vault']['exec_renew'] = false
55
44
  end
56
45
  end
57
46
 
47
+ # Provides the ability to have a different run-list for different clouds.
48
+ # This only works for the 'local' cloud and the 'dev' clouds i.e. Rackspace
49
+ # and Google.
58
50
  def handle_customized_runlists(config, platform)
59
51
  runlist = config['run_list']
60
52
  return runlist if runlist.is_a?(Array)
61
- platform == 'LOCAL' ? runlist['local'] : runlist['dev']
53
+ platform == 'local' ? runlist['local'] : runlist['dev']
62
54
  end
63
55
 
64
- def read_template(template, cookbook_name, platforms)
65
- result = Template.new("#{template}.erb").evaluate({platforms: platforms}, {:pattern => '<!--% %-->'}) do |contents|
66
- contents.gsub(/@@cookbook_name@@/, cookbook_name)
67
- end
68
- YAML.load(result.gsub(/\_@/, '<%=').gsub(/@\_/, '%>'))
56
+ def read_template(cloud, cookbook_name, platforms)
57
+ ctx = {platforms: platforms, name: cookbook_name}
58
+ result = Template.new("test_kitchen/#{cloud}.yml.erb").evaluate(ctx, {:pattern => '<!--% %-->'})
59
+ YAML.load(result)
69
60
  end
70
61
 
71
62
  end
@@ -8,27 +8,27 @@ module Sambot
8
8
 
9
9
  class << self
10
10
 
11
+ GENERATED_FILES = ['metadata.rb', 'Berksfile.lock']
12
+
13
+ def clean
14
+ GENERATED_FILES.each do |filename|
15
+ FS.delete(filename)
16
+ end
17
+ end
18
+
11
19
  def generate(config, dest = 'metadata.rb')
12
20
  write({
13
- 'cookbook_name' => config['name'],
14
- 'cookbook_platforms' => config['platforms'],
15
- 'cookbook_version' => config['version'],
16
- 'cookbook_description' => config['description'],
17
- 'cookbook_dependencies' => map_dependencies(config),
18
- 'cookbook_gems' => config['gems'] || [],
21
+ 'cookbook_name' => config.name,
22
+ 'cookbook_platforms' => config.available_platforms,
23
+ 'cookbook_version' => config.version,
24
+ 'cookbook_description' => config.description,
25
+ 'cookbook_dependencies' => config.dependencies,
26
+ 'cookbook_gems' => config.gems,
19
27
  }, dest)
20
28
  end
21
29
 
22
30
  private
23
31
 
24
- def map_dependencies(config)
25
- config['dependencies'] ? config['dependencies'].map { |x| transform_hashes(x) } : []
26
- end
27
-
28
- def transform_hashes(obj)
29
- obj.is_a?(Hash) ? "#{obj.keys.first}', '#{obj.values.first}" : obj
30
- end
31
-
32
32
  def write(ctx, dest)
33
33
  template = Sambot::Template.new('metadata.rb.erb').write(ctx, dest)
34
34
  UI.debug("A new metadata.rb file has been generated.")
data/lib/sambot/cli.rb CHANGED
@@ -1,41 +1,51 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'base_command'
4
- require_relative 'commands/cookbook_cmd'
5
4
 
6
5
  module Sambot
7
6
  class CLI < BaseCommand
8
7
 
9
- desc 'cookbook', 'Manage Chef cookbooks'
10
- subcommand 'cookbook', Sambot::Commands::CookbookCmd
11
-
12
8
  desc 'clean', 'Remove all generated build files from a Chef cookbook'
13
9
  def clean
14
10
  execute { Chef::Cookbook.clean() }
15
11
  end
16
12
 
17
- desc 'clean', 'Bump the patch version of a cookbook'
13
+ desc 'bump', 'Bump the patch version of a cookbook'
18
14
  def bump
19
15
  execute { Chef::Cookbook.bump() }
20
16
  end
21
17
 
22
18
  desc 'build', 'Builds a Chef cookbook from its configuration file'
19
+ option :local, :type => :boolean
20
+ option :google, :type => :boolean
21
+ option :rackspace, :type => :boolean
22
+ option :vault, :type => :string, :default => 'standalone'
23
23
  def build
24
- execute { Chef::Cookbook.build(config) }
24
+ execute do
25
+ cloud = nil
26
+ cloud = 'local' if options[:local]
27
+ cloud = 'google' if options[:google]
28
+ cloud = 'rackspace' if options[:rackspace]
29
+ unless cloud
30
+ UI.error('Please select which environment this is building for using one of the following flags: --local, --rackspace or --google')
31
+ exit
32
+ end
33
+ Chef::Cookbook.build(Config.read, cloud, options[:vault])
34
+ end
25
35
  end
26
36
 
27
- desc 'generate', 'Creates a new Chef cookbook'
28
- def generate
37
+ desc 'create', 'Creates a new Chef cookbook'
38
+ def create
29
39
  execute do
30
- config = {
40
+ opts = {
31
41
  name: ask(' What is the name of this cookbook?'),
32
42
  type: ask(' What type of cookbook will this be?', :limited_to => ['wrapper', 'role']),
33
43
  platforms: ask(' What operating system will this cookbook run on?', :limited_to => ['windows', 'centos', 'both']),
34
44
  description: ask(' What does this cookbook do?')
35
45
  }
36
- config[:identifier] = ask(' What will be the unique machiner identifier for this role cookbook?') if config[:type] == 'role'
37
- config[:platforms] = config[:platforms] == 'both' ? ['centos', 'windows'] : [config[:platforms]]
38
- Chef::Cookbook.generate(config)
46
+ opts[:identifier] = ask(' What will be the unique machiner identifier for this role cookbook?') if opts[:type] == 'role'
47
+ opts[:platforms] = opts[:platforms] == 'both' ? ['centos', 'windows'] : [opts[:platforms]]
48
+ Chef::Cookbook.create(Config.new(opts))
39
49
  end
40
50
  end
41
51
 
@@ -44,12 +54,5 @@ module Sambot
44
54
  execute { puts "##teamcity[buildNumber '#{config['version'].to_s}']" }
45
55
  end
46
56
 
47
- desc 'configure', 'Sets up an engineering workstation'
48
- def configure
49
- execute(need_dev_credentials: true, need_sudo_password: true) do
50
- Workflow::Workstation.configure(ENV['SAMBOT_DEV_PASSWORD'])
51
- end
52
- end
53
-
54
57
  end
55
58
  end