sambot 0.1.158 → 0.1.159

Sign up to get free protection for your applications and to get access to all the features.
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