chef-cli 5.0.1 → 5.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (23) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +15 -0
  3. data/lib/chef-cli/command/generate.rb +5 -3
  4. data/lib/chef-cli/command/generator_commands/cookbook.rb +14 -1
  5. data/lib/chef-cli/command/generator_commands/recipe.rb +7 -0
  6. data/lib/chef-cli/skeletons/code_generator/recipes/cookbook.rb +12 -4
  7. data/lib/chef-cli/skeletons/code_generator/recipes/recipe.rb +11 -3
  8. data/lib/chef-cli/skeletons/code_generator/templates/default/recipe.yml.erb +18 -0
  9. data/lib/chef-cli/version.rb +1 -1
  10. data/spec/unit/command/generate_spec.rb +7 -0
  11. data/spec/unit/command/generator_commands/cookbook_spec.rb +49 -195
  12. data/spec/unit/command/generator_commands/recipe_spec.rb +34 -0
  13. metadata +3 -13
  14. data/lib/chef-cli/command/generator_commands/build_cookbook.rb +0 -126
  15. data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/README.md +0 -146
  16. data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/kitchen.yml +0 -21
  17. data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/test-fixture-recipe.rb +0 -8
  18. data/lib/chef-cli/skeletons/code_generator/files/default/delivery-config.json +0 -17
  19. data/lib/chef-cli/skeletons/code_generator/recipes/build_cookbook.rb +0 -175
  20. data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/Berksfile.erb +0 -7
  21. data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/metadata.rb.erb +0 -10
  22. data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/recipe.rb.erb +0 -9
  23. data/spec/unit/command/generator_commands/build_cookbook_spec.rb +0 -377
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '08825f8c8c80fbf8119e1108de938d1dbe3c108309dfefb4f3454ac9fee3397d'
4
- data.tar.gz: b3327078e2ee12265d9aabbeab42c9b510adfb1dad6a17cef3b9b8951239030f
3
+ metadata.gz: a13b7fe5a79e96a77dbe15637e0c7049ba7a2b1497c9b51ae1a8512dde66173e
4
+ data.tar.gz: cfa51c708cf8c115755dc5e243f6ac08b658bb71cb9dd4b015d8738de229ae26
5
5
  SHA512:
6
- metadata.gz: 2b579beed9b27e92883fd1990a8de48c36a04d947ff6eed0a01df1bd49c38b3d325cad36dcf1eb8801e6107f6fd3dbaa8b2d8afb29bd51618a9dab5861883d58
7
- data.tar.gz: 14a6e42f8b8b24d731639ba48eb16b3dae8de21d35adce5f9bda99d59b1ad47accdd4686c883183328573ee04e14fddf114960705f930d110e490beaa017080a
6
+ metadata.gz: 974da449a8873d332523b92a0a263f675d80bd8b378317e645f80ea2bc5bdcff5fb476a038e7ce41268e1c88222d2625695aef90bf7311ddf2c7972b001c99f2
7
+ data.tar.gz: 6a3504dc2d8f14b4a1ad63085fb74661c18e89d78551c0d2fd65efdb392c588277fd9202bbada3c09471290743c1eee389268008b6d132d926a958b035024ffe
data/Gemfile CHANGED
@@ -10,6 +10,21 @@ group :test do
10
10
  gem "cookstyle", "=7.7.2" # this forces dependabot PRs to open which triggers cookstyle CI on the chef generate command
11
11
  gem "chefstyle", "=1.6.2"
12
12
  gem "test-kitchen", ">= 2.11.1"
13
+
14
+ if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.6")
15
+ gem "chef-zero", "~> 14"
16
+ gem "chef", "~> 15"
17
+ gem "chef-utils", "=16.6.14"
18
+ end
19
+ if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.7")
20
+ gem "ohai", "~> 16"
21
+ end
22
+ end
23
+
24
+ group :development do
25
+ gem "pry"
26
+ gem "pry-byebug"
27
+ gem "rb-readline"
13
28
  end
14
29
 
15
30
  group :profile do
@@ -29,7 +29,6 @@ require_relative "generator_commands/template"
29
29
  require_relative "generator_commands/repo"
30
30
  require_relative "generator_commands/policyfile"
31
31
  require_relative "generator_commands/generator_generator"
32
- require_relative "generator_commands/build_cookbook"
33
32
  require_relative "../dist"
34
33
 
35
34
  module ChefCLI
@@ -56,7 +55,7 @@ module ChefCLI
56
55
  generator(:repo, :Repo, "Generate a #{ChefCLI::Dist::INFRA_PRODUCT} code repository")
57
56
  generator(:policyfile, :Policyfile, "Generate a Policyfile for use with the install/push commands")
58
57
  generator(:generator, :GeneratorGenerator, "Copy #{ChefCLI::Dist::PRODUCT}'s generator cookbook so you can customize it")
59
- generator(:'build-cookbook', :BuildCookbook, "Generate a build cookbook for use with #{ChefCLI::Dist::WORKFLOW}")
58
+ generator(:'build-cookbook', :BuildCookbook, "DEPRECATED: Generate a build cookbook for use with #{ChefCLI::Dist::WORKFLOW}")
60
59
 
61
60
  def self.banner_headline
62
61
  <<~E
@@ -83,6 +82,10 @@ module ChefCLI
83
82
  end
84
83
 
85
84
  def run(params)
85
+ if params[0] == "build-cookbook"
86
+ warn "[DEPRECATION] Chef Workflow (Delivery) is end of life (EOL) as of December 31, 2020 and this generator subcommand has been removed".freeze
87
+ return 1
88
+ end
86
89
  if ( generator_spec = generator_for(params[0]) )
87
90
  params.shift
88
91
  generator = GeneratorCommands.build(generator_spec.class_name, params)
@@ -118,7 +121,6 @@ module ChefCLI
118
121
  def have_generator?(name)
119
122
  self.class.generators.map { |g| g.name.to_s }.include?(name)
120
123
  end
121
-
122
124
  end
123
125
  end
124
126
  end
@@ -76,6 +76,13 @@ module ChefCLI
76
76
  boolean: true,
77
77
  default: false
78
78
 
79
+ option :yaml,
80
+ short: "-y",
81
+ long: "--yaml",
82
+ description: "Generate a cookbook with YAML Recipe configuration file as the default.",
83
+ boolean: true,
84
+ default: nil
85
+
79
86
  option :pipeline,
80
87
  long: "--pipeline PIPELINE",
81
88
  description: "Use PIPELINE to set target branch to something other than master for the #{ChefCLI::Dist::WORKFLOW} build_cookbook",
@@ -111,6 +118,7 @@ module ChefCLI
111
118
  end
112
119
 
113
120
  def emit_post_create_message
121
+ default_recipe_file = yaml ? "default.yml" : "default.rb"
114
122
  if have_delivery_config?
115
123
  msg("Your cookbook is ready. To setup the pipeline, type `cd #{cookbook_name_or_path}`, then run `delivery init`")
116
124
  else
@@ -120,7 +128,7 @@ module ChefCLI
120
128
  msg("\nWhy not start by writing an InSpec test? Tests for the default recipe are stored at:\n")
121
129
  msg("test/integration/default/default_test.rb")
122
130
  msg("\nIf you'd prefer to dive right in, the default recipe can be found at:")
123
- msg("\nrecipes/default.rb\n")
131
+ msg("\nrecipes/#{default_recipe_file}\n")
124
132
  end
125
133
  end
126
134
 
@@ -147,6 +155,7 @@ module ChefCLI
147
155
  Generator.add_attr_to_context(:pipeline, pipeline)
148
156
  Generator.add_attr_to_context(:kitchen, kitchen)
149
157
  Generator.add_attr_to_context(:vscode_dir, create_vscode_dir?)
158
+ Generator.add_attr_to_context(:yaml, yaml)
150
159
  end
151
160
 
152
161
  def kitchen
@@ -157,6 +166,10 @@ module ChefCLI
157
166
  config[:pipeline]
158
167
  end
159
168
 
169
+ def yaml
170
+ config[:yaml]
171
+ end
172
+
160
173
  def policy_name
161
174
  cookbook_name
162
175
  end
@@ -26,6 +26,13 @@ module ChefCLI
26
26
 
27
27
  banner "Usage: #{ChefCLI::Dist::EXEC} generate recipe [path/to/cookbook] NAME [options]"
28
28
 
29
+ option :yaml,
30
+ short: "-y",
31
+ long: "--yaml",
32
+ description: "Generate recipe using YAML configuration format.",
33
+ boolean: true,
34
+ default: nil
35
+
29
36
  options.merge!(SharedGeneratorOptions.options)
30
37
 
31
38
  def recipe
@@ -117,10 +117,18 @@ end
117
117
  # Recipes
118
118
  directory "#{cookbook_dir}/recipes"
119
119
 
120
- template "#{cookbook_dir}/recipes/default.rb" do
121
- source 'recipe.rb.erb'
122
- helpers(ChefCLI::Generator::TemplateHelper)
123
- action :create_if_missing
120
+ if context.yaml
121
+ template "#{cookbook_dir}/recipes/default.yml" do
122
+ source 'recipe.yml.erb'
123
+ helpers(ChefCLI::Generator::TemplateHelper)
124
+ action :create_if_missing
125
+ end
126
+ else
127
+ template "#{cookbook_dir}/recipes/default.rb" do
128
+ source 'recipe.rb.erb'
129
+ helpers(ChefCLI::Generator::TemplateHelper)
130
+ action :create_if_missing
131
+ end
124
132
  end
125
133
 
126
134
  # the same will be done below if workflow was enabled so avoid double work and skip this
@@ -1,6 +1,7 @@
1
1
  context = ChefCLI::Generator.context
2
2
  cookbook_dir = File.join(context.cookbook_root, context.cookbook_name)
3
3
  recipe_path = File.join(cookbook_dir, 'recipes', "#{context.new_file_basename}.rb")
4
+ recipe_path_yml = File.join(cookbook_dir, 'recipes', "#{context.new_file_basename}.yml")
4
5
  spec_helper_path = File.join(cookbook_dir, 'spec', 'spec_helper.rb')
5
6
  spec_dir = File.join(cookbook_dir, 'spec', 'unit', 'recipes')
6
7
  spec_path = File.join(spec_dir, "#{context.new_file_basename}_spec.rb")
@@ -44,7 +45,14 @@ template inspec_path do
44
45
  end
45
46
 
46
47
  # Recipe
47
- template recipe_path do
48
- source 'recipe.rb.erb'
49
- helpers(ChefCLI::Generator::TemplateHelper)
48
+ if context.yaml
49
+ template recipe_path_yml do
50
+ source 'recipe.yml.erb'
51
+ helpers(ChefCLI::Generator::TemplateHelper)
52
+ end
53
+ else
54
+ template recipe_path do
55
+ source 'recipe.rb.erb'
56
+ helpers(ChefCLI::Generator::TemplateHelper)
57
+ end
50
58
  end
@@ -0,0 +1,18 @@
1
+ #
2
+ # Cookbook:: <%= cookbook_name %>
3
+ # Recipe:: <%= recipe_name %>
4
+ #
5
+ <%= license_description('#') %>
6
+
7
+ ---
8
+ resources:
9
+ # Example Syntax
10
+ # Additional snippets are available using the Chef Infra Extension for Visual Studio Code
11
+ # - type: file
12
+ # name: '/path/to/file'
13
+ # content: 'content'
14
+ # owner: 'root'
15
+ # group: 'root'
16
+ # mode: '0755'
17
+ # action:
18
+ # - create
@@ -16,5 +16,5 @@
16
16
  #
17
17
 
18
18
  module ChefCLI
19
- VERSION = "5.0.1".freeze
19
+ VERSION = "5.1.0".freeze
20
20
  end
@@ -138,5 +138,12 @@ describe ChefCLI::Command::Generate do
138
138
 
139
139
  end
140
140
 
141
+ describe "When build-cookbookis given as subcommand" do
142
+ it "shows deprecation warning when" do
143
+ result = generate.run(%w{build-cookbook example})
144
+ expect(result).to eq(1)
145
+ end
146
+ end
147
+
141
148
  end
142
149
  end
@@ -189,201 +189,6 @@ describe ChefCLI::Command::GeneratorCommands::Cookbook do
189
189
  end
190
190
  end
191
191
 
192
- context "when passed workflow option" do
193
-
194
- context "generates a workflow (delivery) cookbook" do
195
-
196
- let(:argv) { %w{new_cookbook --workflow} }
197
-
198
- let(:dot_delivery) { File.join(tempdir, "new_cookbook", ".delivery") }
199
-
200
- before do
201
- Dir.chdir(tempdir) do
202
- allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
203
- expect(cookbook_generator.run).to eq(0)
204
- end
205
- end
206
-
207
- describe "when passed without --specs subcommand .delivery/project.toml" do
208
-
209
- let(:file) { File.join(tempdir, "new_cookbook", ".delivery", "project.toml") }
210
-
211
- let(:expected_content) do
212
- <<~PROJECT_DOT_TOML
213
- # Delivery for Local Phases Execution
214
- #
215
- # This file allows you to execute test phases locally on a workstation or
216
- # in a CI pipeline. The delivery-cli will read this file and execute the
217
- # command(s) that are configured for each phase. You can customize them
218
- # by just modifying the phase key on this file.
219
- #
220
- # By default these phases are configured for Cookbook Workflow only
221
- #
222
-
223
- [local_phases]
224
- unit = "echo skipping unit phase."
225
- lint = "chef exec cookstyle"
226
- # foodcritic has been deprecated in favor of cookstyle so we skip the syntax
227
- # phase now.
228
- syntax = "echo skipping syntax phase. Use lint phase instead."
229
- provision = "chef exec kitchen create"
230
- deploy = "chef exec kitchen converge"
231
- smoke = "chef exec kitchen verify"
232
- # The functional phase is optional, you can define it by uncommenting
233
- # the line below and running the command: `delivery local functional`
234
- # functional = ""
235
- cleanup = "chef exec kitchen destroy"
236
-
237
- # Remote project.toml file
238
- #
239
- # Instead of the local phases above, you may specify a remote URI location for
240
- # the `project.toml` file. This is useful for teams that wish to centrally
241
- # manage the behavior of the `delivery local` command across many different
242
- # projects.
243
- #
244
- # remote_file = "https://url/project.toml"
245
- PROJECT_DOT_TOML
246
- end
247
-
248
- it "exists with default config for Cookbook Workflow" do
249
- expect(IO.read(file)).to eq(expected_content)
250
- end
251
-
252
- end
253
-
254
- describe "when passed with --specs subcommand .delivery/project.toml" do
255
-
256
- let(:argv) { %w{new_cookbook --workflow --specs} }
257
-
258
- let(:file) { File.join(tempdir, "new_cookbook", ".delivery", "project.toml") }
259
-
260
- let(:expected_content) do
261
- <<~PROJECT_DOT_TOML
262
- # Delivery for Local Phases Execution
263
- #
264
- # This file allows you to execute test phases locally on a workstation or
265
- # in a CI pipeline. The delivery-cli will read this file and execute the
266
- # command(s) that are configured for each phase. You can customize them
267
- # by just modifying the phase key on this file.
268
- #
269
- # By default these phases are configured for Cookbook Workflow only
270
- #
271
-
272
- [local_phases]
273
- unit = "chef exec rspec spec/"
274
- lint = "chef exec cookstyle"
275
- # foodcritic has been deprecated in favor of cookstyle so we skip the syntax
276
- # phase now.
277
- syntax = "echo skipping syntax phase. Use lint phase instead."
278
- provision = "chef exec kitchen create"
279
- deploy = "chef exec kitchen converge"
280
- smoke = "chef exec kitchen verify"
281
- # The functional phase is optional, you can define it by uncommenting
282
- # the line below and running the command: `delivery local functional`
283
- # functional = ""
284
- cleanup = "chef exec kitchen destroy"
285
-
286
- # Remote project.toml file
287
- #
288
- # Instead of the local phases above, you may specify a remote URI location for
289
- # the `project.toml` file. This is useful for teams that wish to centrally
290
- # manage the behavior of the `delivery local` command across many different
291
- # projects.
292
- #
293
- # remote_file = "https://url/project.toml"
294
- PROJECT_DOT_TOML
295
- end
296
-
297
- it "exists with default config for Cookbook Workflow" do
298
- expect(IO.read(file)).to eq(expected_content)
299
- end
300
-
301
- end
302
-
303
- end
304
-
305
- context "when no delivery CLI configuration is present" do
306
-
307
- let(:argv) { %w{new_cookbook --workflow} }
308
-
309
- it "detects no delivery config" do
310
- Dir.chdir(tempdir) do
311
- expect(cookbook_generator.have_delivery_config?).to be(false)
312
- end
313
- end
314
-
315
- it "emits concise output" do
316
- Dir.chdir(tempdir) do
317
- allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
318
- expect(cookbook_generator.run).to eq(0)
319
- end
320
-
321
- expected = <<~OUTPUT
322
- Generating cookbook new_cookbook
323
- - Ensuring correct cookbook content
324
- - Committing cookbook files to git
325
-
326
- #{non_delivery_breadcrumb}
327
- OUTPUT
328
-
329
- actual = stdout_io.string
330
-
331
- # the formatter will add escape sequences to turn off any colors
332
- actual.gsub!("\e[0m", "")
333
- expect(actual).to eq(expected)
334
- end
335
- end
336
-
337
- context "when a delivery CLI config is present" do
338
-
339
- # Setup a situation like this:
340
- # there is a dir for the delivery organization with the
341
- # `.delivery/cli.toml` in it. Inside that is another dir (maybe IRL this
342
- # would be "cookbooks"), then we create the cookbook inside that.
343
-
344
- let(:argv) { %w{new_cookbook --workflow} }
345
-
346
- let(:tempdir_subdir) { File.join(tempdir, "subdirectory") }
347
-
348
- let(:dot_delivery_dir) { File.join(tempdir, ".delivery") }
349
-
350
- let(:dot_delivery_cli_toml) { File.join(dot_delivery_dir, "cli.toml") }
351
-
352
- before do
353
- Dir.mkdir(tempdir_subdir)
354
- Dir.mkdir(dot_delivery_dir)
355
- FileUtils.touch(dot_delivery_cli_toml)
356
- end
357
-
358
- it "detects the delivery config" do
359
- Dir.chdir(tempdir_subdir) do
360
- expect(cookbook_generator.have_delivery_config?).to be(true)
361
- end
362
- end
363
-
364
- it "emits concise output" do
365
- Dir.chdir(tempdir) do
366
- allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
367
- expect(cookbook_generator.run).to eq(0)
368
- end
369
-
370
- expected = <<~OUTPUT
371
- Generating cookbook new_cookbook
372
- - Ensuring correct cookbook content
373
- - Committing cookbook files to git
374
-
375
- Your cookbook is ready. To setup the pipeline, type `cd new_cookbook`, then run `delivery init`
376
- OUTPUT
377
-
378
- actual = stdout_io.string
379
-
380
- # the formatter will add escape sequences to turn off any colors
381
- actual.gsub!("\e[0m", "")
382
- expect(actual).to eq(expected)
383
- end
384
- end
385
- end
386
-
387
192
  context "when given the specs flag" do
388
193
 
389
194
  let(:argv) { %w{ new_cookbook --specs } }
@@ -615,6 +420,55 @@ describe ChefCLI::Command::GeneratorCommands::Cookbook do
615
420
 
616
421
  end
617
422
 
423
+ context "when YAML recipe flag is passed" do
424
+
425
+ let(:argv) { %w{new_cookbook --yaml} }
426
+
427
+ describe "recipes/default.yml" do
428
+ let(:file) { File.join(tempdir, "new_cookbook", "recipes", "default.yml") }
429
+
430
+ let(:expected_content_header) do
431
+ <<~DEFAULT_YML_HEADER
432
+ #
433
+ # Cookbook:: new_cookbook
434
+ # Recipe:: default
435
+ #
436
+ DEFAULT_YML_HEADER
437
+ end
438
+
439
+ let(:expected_content) do
440
+ <<~DEFAULT_YML_CONTENT
441
+ ---
442
+ resources:
443
+ # Example Syntax
444
+ # Additional snippets are available using the Chef Infra Extension for Visual Studio Code
445
+ # - type: file
446
+ # name: '/path/to/file'
447
+ # content: 'content'
448
+ # owner: 'root'
449
+ # group: 'root'
450
+ # mode: '0755'
451
+ # action:
452
+ # - create
453
+ DEFAULT_YML_CONTENT
454
+ end
455
+
456
+ before do
457
+ Dir.chdir(tempdir) do
458
+ allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
459
+ expect(cookbook_generator.run).to eq(0)
460
+ end
461
+ end
462
+
463
+ it "has a default.yml file with template contents" do
464
+ expect(IO.read(file)).to match(expected_content_header)
465
+ expect(IO.read(file)).to match(expected_content)
466
+ end
467
+
468
+ end
469
+
470
+ end
471
+
618
472
  context "when configured for Berkshelf" do
619
473
 
620
474
  let(:argv) { %w{new_cookbook --berks} }