chef-dk 0.3.5 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +4 -4
  3. data/README.md +4 -4
  4. data/lib/chef-dk/builtin_commands.rb +4 -0
  5. data/lib/chef-dk/chef_runner.rb +7 -1
  6. data/lib/chef-dk/command/exec.rb +9 -0
  7. data/lib/chef-dk/command/export.rb +132 -0
  8. data/lib/chef-dk/command/generator_commands.rb +1 -1
  9. data/lib/chef-dk/command/generator_commands/app.rb +8 -0
  10. data/lib/chef-dk/command/generator_commands/base.rb +46 -4
  11. data/lib/chef-dk/command/generator_commands/cookbook.rb +8 -0
  12. data/lib/chef-dk/command/generator_commands/cookbook_code_file.rb +1 -0
  13. data/lib/chef-dk/command/push.rb +3 -6
  14. data/lib/chef-dk/command/shell_init.rb +28 -5
  15. data/lib/chef-dk/command/update.rb +106 -0
  16. data/lib/chef-dk/command/verify.rb +72 -0
  17. data/lib/chef-dk/component_test.rb +12 -1
  18. data/lib/chef-dk/configurable.rb +52 -0
  19. data/lib/chef-dk/cookbook_metadata.rb +10 -1
  20. data/lib/chef-dk/cookbook_profiler/git.rb +1 -1
  21. data/lib/chef-dk/exceptions.rb +17 -2
  22. data/lib/chef-dk/helpers.rb +2 -2
  23. data/lib/chef-dk/policyfile/community_cookbook_source.rb +1 -1
  24. data/lib/chef-dk/policyfile/dsl.rb +7 -0
  25. data/lib/chef-dk/policyfile/uploader.rb +25 -4
  26. data/lib/chef-dk/policyfile_compiler.rb +21 -1
  27. data/lib/chef-dk/policyfile_lock.rb +5 -0
  28. data/lib/chef-dk/policyfile_services/export_repo.rb +194 -0
  29. data/lib/chef-dk/policyfile_services/install.rb +8 -2
  30. data/lib/chef-dk/policyfile_services/push.rb +4 -1
  31. data/lib/chef-dk/service_exceptions.rb +6 -0
  32. data/lib/chef-dk/skeletons/code_generator/files/default/Berksfile +1 -1
  33. data/lib/chef-dk/skeletons/code_generator/files/default/repo/README.md +1 -1
  34. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/README.md +1 -1
  35. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/README.md +2 -2
  36. data/lib/chef-dk/skeletons/code_generator/files/default/serverspec_spec_helper.rb +3 -0
  37. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper.rb +1 -7
  38. data/lib/chef-dk/skeletons/code_generator/metadata.rb +1 -1
  39. data/lib/chef-dk/skeletons/code_generator/recipes/app.rb +31 -1
  40. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook.rb +32 -2
  41. data/lib/chef-dk/skeletons/code_generator/recipes/recipe.rb +18 -0
  42. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe.rb.erb +5 -0
  43. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe_spec.rb.erb +23 -0
  44. data/lib/chef-dk/skeletons/code_generator/templates/default/serverspec_default_spec.rb.erb +12 -0
  45. data/lib/chef-dk/version.rb +1 -1
  46. data/lib/kitchen/provisioner/policyfile_zero.rb +149 -0
  47. data/spec/shared/a_file_generator.rb +1 -0
  48. data/spec/shared/command_with_ui_object.rb +11 -0
  49. data/spec/shared/custom_generator_cookbook.rb +117 -0
  50. data/spec/unit/chef_runner_spec.rb +26 -0
  51. data/spec/unit/command/exec_spec.rb +46 -5
  52. data/spec/unit/command/export_spec.rb +176 -0
  53. data/spec/unit/command/generator_commands/app_spec.rb +38 -0
  54. data/spec/unit/command/generator_commands/cookbook_spec.rb +37 -28
  55. data/spec/unit/command/generator_commands/recipe_spec.rb +4 -2
  56. data/spec/unit/command/install_spec.rb +3 -6
  57. data/spec/unit/command/push_spec.rb +3 -6
  58. data/spec/unit/command/shell_init_spec.rb +77 -49
  59. data/spec/unit/command/update_spec.rb +155 -0
  60. data/spec/unit/command/verify_spec.rb +22 -7
  61. data/spec/unit/cookbook_metadata_spec.rb +44 -8
  62. data/spec/unit/cookbook_profiler/git_spec.rb +12 -0
  63. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +1 -1
  64. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +1 -1
  65. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +1 -1
  66. data/spec/unit/fixtures/cookbooks_api/small_universe.json +667 -667
  67. data/spec/unit/fixtures/cookbooks_api/universe.json +1 -1
  68. data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +1 -1
  69. data/spec/unit/fixtures/example_cookbook/Berksfile +1 -1
  70. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -0
  71. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -0
  72. data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -0
  73. data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -0
  74. data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -0
  75. data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -0
  76. data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -0
  77. data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -0
  78. data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -0
  79. data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -0
  80. data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -0
  81. data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -0
  82. data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -0
  83. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +1 -1
  84. data/spec/unit/policyfile/community_cookbook_source_spec.rb +2 -2
  85. data/spec/unit/policyfile/cookbook_location_specification_spec.rb +3 -3
  86. data/spec/unit/policyfile/uploader_spec.rb +61 -25
  87. data/spec/unit/policyfile_demands_spec.rb +47 -0
  88. data/spec/unit/policyfile_evaluation_spec.rb +1 -1
  89. data/spec/unit/policyfile_lock_build_spec.rb +60 -3
  90. data/spec/unit/policyfile_services/export_repo_spec.rb +321 -0
  91. data/spec/unit/policyfile_services/install_spec.rb +20 -1
  92. data/spec/unit/policyfile_services/push_spec.rb +36 -9
  93. metadata +53 -38
  94. data/lib/chef-dk/skeletons/code_generator/files/default/converge_spec.rb +0 -9
  95. data/lib/chef-dk/skeletons/code_generator/templates/default/default_recipe.rb.erb +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 15ddf96556ab7bfa73a009627a4bee13f83bada0
4
- data.tar.gz: c3f5519baae22cf7d471a49ed968ebebbc826ad1
3
+ metadata.gz: dc8cebdbcdaa5a3c3f4e2b3bf18fc1c3caca8843
4
+ data.tar.gz: 9f57e9e37cf5b66823e9a6e3f6470afb369177fe
5
5
  SHA512:
6
- metadata.gz: f4a7492bafe9715b38a62f86b9ce94ed15bd002663f87624989d36e8f9006f05c662b58fd7169fd3c7ce7ea199d53c86fa128451f5c7a95dad653db468f61c0c
7
- data.tar.gz: 86a69277b0e3c9ce1c132c9abc6ed58a2d4d48fd7083247bb65427361afd52bc86bff1ec529fbe5e4244650cf789909c8725b85cc10b039ff0c0054dc6e4acec
6
+ metadata.gz: 0f3578a7438281d5360cc4278e16e424e84c1dcec4f7087a8d9ce9dbbecd8a0e74c3b67d5fde04128bf58ee7815a21f3a48e12d444241928f2f2dd75cc1dc082
7
+ data.tar.gz: e2e691462cb8febe46e0fec9d07f5f6f21e1bfc73bb89c7bb7556e475253f25ad75f521521cdd523f61c62ceaa3ab7323aead451a568c5339e9bd64c0ca61e21
@@ -174,7 +174,7 @@ We frequently make `alpha` and `beta` releases with version numbers that look li
174
174
  We do a `Minor` release approximately every 3 months and `Patch` releases on a when-needed
175
175
  basis for regressions, significant bugs, and security issues.
176
176
 
177
- Announcements of releases are available on [Chef Blog](http://www.getchef.com/blog) when they are
177
+ Announcements of releases are available on [Chef Blog](https://www.chef.io/blog/) when they are
178
178
  available.
179
179
 
180
180
  ## Chef Community
@@ -187,6 +187,6 @@ Chef is made possible by a strong community of developers and system administrat
187
187
 
188
188
  Also here are some additional pointers to some awesome Chef content:
189
189
 
190
- * [Chef Docs](http://docs.opscode.com/)
191
- * [Learn Chef](https://learnchef.opscode.com/)
192
- * [Chef Inc](http://www.getchef.com/)
190
+ * [Chef Docs](https://docs.chef.io/)
191
+ * [Learn Chef](https://learn.chef.io/)
192
+ * [Chef Inc](https://www.chef.io/)
data/README.md CHANGED
@@ -219,10 +219,10 @@ dpkg -P chefdk
219
219
  - - -
220
220
 
221
221
  [Berkshelf]: http://berkshelf.com "Berkshelf"
222
- [Chef]: https://www.getchef.com "Chef"
223
- [ChefDK]: https://www.getchef.com/downloads/chef-dk "Chef Development Kit"
224
- [Chef Documentation]: http://docs.opscode.com "Chef Documentation"
222
+ [Chef]: https://www.chef.io "Chef"
223
+ [ChefDK]: https://www.chef.io/downloads/chef-dk "Chef Development Kit"
224
+ [Chef Documentation]: http://docs.chef.io "Chef Documentation"
225
225
  [ChefSpec]: http://chefspec.org "ChefSpec"
226
226
  [Foodcritic]: http://foodcritic.io "Foodcritic"
227
- [Learn Chef]: http://learn.getchef.com "Learn Chef"
227
+ [Learn Chef]: http://learn.chef.io "Learn Chef"
228
228
  [Test Kitchen]: http://kitchen.ci "Test Kitchen"
@@ -29,7 +29,11 @@ ChefDK.commands do |c|
29
29
 
30
30
  c.builtin "install", :Install, desc: "Install cookbooks from a Policyfile and generate a locked cookbook set"
31
31
 
32
+ c.builtin "update", :Update, desc: "Updates a Policyfile.lock.json with latest run_list and cookbooks"
33
+
32
34
  c.builtin "push", :Push, desc: "Push a local policy lock to a policy group on the server"
33
35
 
36
+ c.builtin "export", :Export, desc: "Export a policy lock as a Chef Zero code repo"
37
+
34
38
  c.builtin "verify", :Verify, desc: "Test the embedded ChefDK applications"
35
39
  end
@@ -15,6 +15,7 @@
15
15
  # limitations under the License.
16
16
  #
17
17
 
18
+ require 'chef-dk/exceptions'
18
19
  require 'chef'
19
20
 
20
21
  module ChefDK
@@ -25,7 +26,7 @@ module ChefDK
25
26
  attr_reader :run_list
26
27
 
27
28
  def initialize(cookbook_path, run_list)
28
- @cookbook_path = cookbook_path
29
+ @cookbook_path = File.expand_path(cookbook_path)
29
30
  @run_list = run_list
30
31
  @formatter = nil
31
32
  @ohai = nil
@@ -34,6 +35,11 @@ module ChefDK
34
35
  def converge
35
36
  configure
36
37
  Chef::Runner.new(run_context).converge
38
+ rescue Chef::Exceptions::CookbookNotFound => e
39
+ message = "Could not find cookbook(s) to satisfy run list #{run_list.inspect} in #{cookbook_path}"
40
+ raise CookbookNotFound.new(message, e)
41
+ rescue => e
42
+ raise ChefConvergeError.new("Chef failed to converge: #{e}", e)
37
43
  end
38
44
 
39
45
  def run_context
@@ -30,6 +30,15 @@ module ChefDK
30
30
  exec(*params)
31
31
  raise "Exec failed without an exception, your ruby is buggy" # should never get here
32
32
  end
33
+
34
+ def needs_version?(params)
35
+ # Force version to get passed down to command
36
+ false
37
+ end
38
+
39
+ def needs_help?(params)
40
+ ['-h', '--help'].include? params[0]
41
+ end
33
42
  end
34
43
  end
35
44
  end
@@ -0,0 +1,132 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2014 Chef Software Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require 'chef-dk/command/base'
19
+ require 'chef-dk/ui'
20
+ require 'chef-dk/policyfile_services/export_repo'
21
+ require 'chef-dk/configurable'
22
+
23
+ module ChefDK
24
+ module Command
25
+
26
+ class Export < Base
27
+
28
+ include Configurable
29
+
30
+ banner(<<-E)
31
+ Usage: chef export [ POLICY_FILE ] DESTINATION_DIRECTORY [options]
32
+
33
+ `chef export` creates a Chef Zero compatible Chef repository containing the
34
+ cookbooks described in a Policyfile.lock.json. Once the exported repo is copied
35
+ to the target machine, you can apply the policy to the machine with
36
+ `chef-client -z`. You will need at least the following config:
37
+
38
+ use_policyfile true
39
+ deployment_group '$POLICY_NAME-local'
40
+ versioned_cookbooks true
41
+
42
+ The Policyfile feature is incomplete and beta quality. See our detailed README
43
+ for more information.
44
+
45
+ https://github.com/opscode/chef-dk/blob/master/POLICYFILE_README.md
46
+
47
+ Options:
48
+
49
+ E
50
+
51
+ option :force,
52
+ short: "-f",
53
+ long: "--force",
54
+ description: "If the DESTINATION_DIRECTORY is not empty, remove its content.",
55
+ default: false,
56
+ boolean: true
57
+
58
+ option :debug,
59
+ short: "-D",
60
+ long: "--debug",
61
+ description: "Enable stacktraces and other debug output",
62
+ default: false
63
+
64
+ attr_reader :policyfile_relative_path
65
+ attr_reader :export_dir
66
+
67
+ attr_accessor :ui
68
+
69
+ def initialize(*args)
70
+ super
71
+ @push = nil
72
+ @ui = nil
73
+ @policyfile_relative_path = nil
74
+ @export_dir = nil
75
+ @chef_config = nil
76
+ @ui = UI.new
77
+ end
78
+
79
+ def run(params = [])
80
+ return 1 unless apply_params!(params)
81
+ export_service.run
82
+ ui.msg("Exported policy '#{export_service.policyfile_lock.name}' to #{export_dir}")
83
+ 0
84
+ rescue ExportDirNotEmpty => e
85
+ ui.err("ERROR: " + e.message)
86
+ ui.err("Use --force to force export")
87
+ 1
88
+ rescue PolicyfileServiceError => e
89
+ handle_error(e)
90
+ 1
91
+ end
92
+
93
+ def debug?
94
+ !!config[:debug]
95
+ end
96
+
97
+ def export_service
98
+ @export_service ||= PolicyfileServices::ExportRepo.new(policyfile: policyfile_relative_path,
99
+ export_dir: export_dir,
100
+ root_dir: Dir.pwd,
101
+ force: config[:force])
102
+ end
103
+
104
+ def handle_error(error)
105
+ ui.err("Error: #{error.message}")
106
+ if error.respond_to?(:reason)
107
+ ui.err("Reason: #{error.reason}")
108
+ ui.err("")
109
+ ui.err(error.extended_error_info) if debug?
110
+ ui.err(error.cause.backtrace.join("\n")) if debug?
111
+ end
112
+ end
113
+
114
+ def apply_params!(params)
115
+ remaining_args = parse_options(params)
116
+ case remaining_args.size
117
+ when 1
118
+ @export_dir = remaining_args[0]
119
+ when 2
120
+ @policyfile_relative_path, @export_dir = remaining_args
121
+ else
122
+ ui.err(banner)
123
+ return false
124
+ end
125
+ true
126
+ end
127
+
128
+ end
129
+ end
130
+ end
131
+
132
+
@@ -55,7 +55,7 @@ module ChefDK
55
55
  :short => "-g GENERATOR_COOKBOOK_PATH",
56
56
  :long => "--generator-cookbook GENERATOR_COOKBOOK_PATH",
57
57
  :description => "Use GENERATOR_COOKBOOK_PATH for the code_generator cookbook",
58
- :default => File.expand_path("../../skeletons", __FILE__),
58
+ :default => nil,
59
59
  :proc => Proc.new { |s| File.expand_path(s) },
60
60
  :on => :tail
61
61
 
@@ -49,6 +49,9 @@ module ChefDK
49
49
  msg(banner)
50
50
  1
51
51
  end
52
+ rescue ChefDK::ChefRunnerError => e
53
+ err("ERROR: #{e}")
54
+ 1
52
55
  end
53
56
 
54
57
  def setup_context
@@ -57,12 +60,17 @@ module ChefDK
57
60
  Generator.add_attr_to_context(:app_name, app_name)
58
61
  Generator.add_attr_to_context(:cookbook_root, cookbook_root)
59
62
  Generator.add_attr_to_context(:cookbook_name, cookbook_name)
63
+ Generator.add_attr_to_context(:recipe_name, recipe_name)
60
64
  end
61
65
 
62
66
  def recipe
63
67
  "app"
64
68
  end
65
69
 
70
+ def recipe_name
71
+ "default"
72
+ end
73
+
66
74
  def app_name
67
75
  File.basename(app_full_path)
68
76
  end
@@ -15,6 +15,7 @@
15
15
  # limitations under the License.
16
16
  #
17
17
 
18
+ require 'chef-dk/configurable'
18
19
  require 'chef-dk/command/generator_commands'
19
20
 
20
21
  module ChefDK
@@ -31,6 +32,8 @@ module ChefDK
31
32
  # chef-dk/skeletons/code_generator.
32
33
  class Base < Command::Base
33
34
 
35
+ include Configurable
36
+
34
37
  attr_reader :params
35
38
 
36
39
  options.merge!(SharedGeneratorOptions.options)
@@ -38,19 +41,26 @@ module ChefDK
38
41
  def initialize(params)
39
42
  super()
40
43
  @params = params
44
+
45
+ @generator_cookbook_path = nil
46
+ @generator_cookbook_name = nil
41
47
  end
42
48
 
43
49
  # An instance of ChefRunner. Calling ChefRunner#converge will trigger
44
50
  # convergence and generate the desired code.
45
51
  def chef_runner
46
- @chef_runner ||= ChefRunner.new(generator_cookbook_path, ["code_generator::#{recipe}"])
52
+ @chef_runner ||= ChefRunner.new(generator_cookbook_path, ["recipe[#{generator_cookbook_name}::#{recipe}]"])
47
53
  end
48
54
 
49
55
  # Path to the directory where the code_generator cookbook is located.
50
- # For now, this is hard coded to the 'skeletons' directory in this
51
- # repo.
52
56
  def generator_cookbook_path
53
- config[:generator_cookbook]
57
+ detect_generator_cookbook_name_and_path! unless @generator_cookbook_path
58
+ @generator_cookbook_path
59
+ end
60
+
61
+ def generator_cookbook_name
62
+ detect_generator_cookbook_name_and_path! unless @generator_cookbook_name
63
+ @generator_cookbook_name
54
64
  end
55
65
 
56
66
  # Sets git related generator_context values.
@@ -73,6 +83,38 @@ module ChefDK
73
83
  paths = path.split(File::PATH_SEPARATOR)
74
84
  paths.any? {|bin_path| File.exist?(File.join(bin_path, "git#{RbConfig::CONFIG['EXEEXT']}"))}
75
85
  end
86
+
87
+ private
88
+
89
+ # Inspects the `config[:generator_cookbook]` option to determine the
90
+ # generator_cookbook_name and generator_cookbook_path. There are two
91
+ # supported ways this can work:
92
+ #
93
+ # * `config[:generator_cookbook]` is the full path to the generator
94
+ # cookbook. In this case, the last path component is the cookbook name,
95
+ # and the parent directory is the cookbook path
96
+ # * `config[:generator_cookbook]` is the path to a directory that
97
+ # contains a cookbook named "code_generator" (DEPRECATED). This is how
98
+ # the `--generator-cookbook` feature was originally written, so we
99
+ # support this for backwards compatibility. This way has poor UX and
100
+ # we'd like to get rid of it, so a warning is printed in this case.
101
+ def detect_generator_cookbook_name_and_path!
102
+ given_path = generator_cookbook_option
103
+ code_generator_subdir = File.join(given_path, "code_generator")
104
+ if File.directory?(code_generator_subdir)
105
+ @generator_cookbook_name = "code_generator"
106
+ @generator_cookbook_path = given_path
107
+ err("WARN: Please configure the generator cookbook by giving the full path to the desired cookbook (like '#{code_generator_subdir}')")
108
+ else
109
+ @generator_cookbook_name = File.basename(given_path)
110
+ @generator_cookbook_path = File.dirname(given_path)
111
+ end
112
+ end
113
+
114
+ def generator_cookbook_option
115
+ config[:generator_cookbook] || chefdk_config.generator_cookbook
116
+ end
117
+
76
118
  end
77
119
  end
78
120
  end
@@ -52,6 +52,9 @@ module ChefDK
52
52
  msg(banner)
53
53
  1
54
54
  end
55
+ rescue ChefDK::ChefRunnerError => e
56
+ err("ERROR: #{e}")
57
+ 1
55
58
  end
56
59
 
57
60
  def setup_context
@@ -59,12 +62,17 @@ module ChefDK
59
62
  Generator.add_attr_to_context(:skip_git_init, cookbook_path_in_git_repo?)
60
63
  Generator.add_attr_to_context(:cookbook_root, cookbook_root)
61
64
  Generator.add_attr_to_context(:cookbook_name, cookbook_name)
65
+ Generator.add_attr_to_context(:recipe_name, recipe_name)
62
66
  end
63
67
 
64
68
  def recipe
65
69
  "cookbook"
66
70
  end
67
71
 
72
+ def recipe_name
73
+ "default"
74
+ end
75
+
68
76
  def cookbook_name
69
77
  File.basename(cookbook_full_path)
70
78
  end
@@ -58,6 +58,7 @@ module ChefDK
58
58
  Generator.add_attr_to_context(:cookbook_root, cookbook_root)
59
59
  Generator.add_attr_to_context(:cookbook_name, cookbook_name)
60
60
  Generator.add_attr_to_context(:new_file_basename, new_file_basename)
61
+ Generator.add_attr_to_context(:recipe_name, new_file_basename)
61
62
  end
62
63
 
63
64
  def cookbook_root
@@ -18,12 +18,15 @@
18
18
  require 'chef-dk/command/base'
19
19
  require 'chef-dk/ui'
20
20
  require 'chef-dk/policyfile_services/push'
21
+ require 'chef-dk/configurable'
21
22
 
22
23
  module ChefDK
23
24
  module Command
24
25
 
25
26
  class Push < Base
26
27
 
28
+ include Configurable
29
+
27
30
  banner(<<-E)
28
31
  Usage: chef push POLICY_GROUP [ POLICY_FILE ] [options]
29
32
 
@@ -80,12 +83,6 @@ E
80
83
  !!config[:debug]
81
84
  end
82
85
 
83
- def chef_config
84
- return @chef_config if @chef_config
85
- Chef::WorkstationConfigLoader.new(config[:config_file]).load
86
- @chef_config = Chef::Config
87
- end
88
-
89
86
  def push
90
87
  @push ||= PolicyfileServices::Push.new(policyfile: policyfile_relative_path,
91
88
  ui: ui,
@@ -22,7 +22,7 @@ module ChefDK
22
22
  module Command
23
23
  class ShellInit < ChefDK::Command::Base
24
24
 
25
- SUPPORTED_SHELLS = %w[ bash zsh sh ].map(&:freeze).freeze
25
+ SUPPORTED_SHELLS = %w[ bash zsh sh powershell posh].map(&:freeze).freeze
26
26
 
27
27
  banner(<<-HELP)
28
28
  Usage: chef shell-init
@@ -32,11 +32,17 @@ ruby.
32
32
 
33
33
  To enable for just the current shell session:
34
34
 
35
- eval "$(chef shell-init SHELL_NAME)"
35
+ In sh, bash, and zsh:
36
+ eval "$(chef shell-init SHELL_NAME)"
37
+ In Powershell:
38
+ chef shell-init powershell | Invoke-Expression
36
39
 
37
40
  To permanently enable:
38
41
 
39
- echo 'eval "$(chef shell-init SHELL_NAME)"' >> ~/.YOUR_SHELL_RC_FILE
42
+ In sh, bash, and zsh:
43
+ echo 'eval "$(chef shell-init SHELL_NAME)"' >> ~/.YOUR_SHELL_RC_FILE
44
+ In Powershell
45
+ "chef shell-init powershell | Invoke-Expression" >> $PROFILE
40
46
 
41
47
  OPTIONS:
42
48
 
@@ -67,12 +73,29 @@ HELP
67
73
 
68
74
  env = omnibus_env.dup
69
75
  path = env.delete("PATH")
70
- msg("export PATH=#{path}")
76
+ export(shell_name, "PATH", path)
71
77
  env.each do |var_name, value|
72
- msg("export #{var_name}=#{value}")
78
+ export(shell_name, var_name, value)
73
79
  end
74
80
  0
75
81
  end
82
+
83
+ def export(shell, var, val)
84
+ case shell
85
+ when 'sh', 'bash', 'zsh'
86
+ posix_shell_export(var, val)
87
+ when 'powershell', 'posh'
88
+ powershell_export(var, val)
89
+ end
90
+ end
91
+
92
+ def posix_shell_export(var, val)
93
+ msg("export #{var}=\"#{val}\"")
94
+ end
95
+
96
+ def powershell_export(var, val)
97
+ msg("$env:#{var}=\"#{val}\"")
98
+ end
76
99
  end
77
100
  end
78
101
  end