knife-skeleton 0.1.0 → 0.2.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.
- checksums.yaml +5 -13
- data/README.md +2 -31
- data/files/Gemfile +0 -1
- data/lib/chef/knife/cookbook_create_extension.rb +330 -0
- data/lib/knife_skeleton/version.rb +1 -1
- data/spec/chef/knife/{knife_skeleton_create_spec.rb → knife_cookbook_create_extension_spec.rb} +3 -3
- data/templates/attributes/default.rb.erb +1 -1
- data/templates/test/integration/default/serverspec/spec_helper.rb.erb +2 -18
- metadata +13 -14
- data/lib/chef/knife/skeleton_create.rb +0 -354
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
NjZjODkyM2NhYWNiMzQ2ZGIzN2IxMThjNTgxNDI1NTA3NzAzMGJiYg==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9e21bf5141891cd7df596fa29fb4e3eaace5db13
|
4
|
+
data.tar.gz: 2606421903e6d939ec21d5cab9d2b117b4ee037c
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
MzZjYTcxYmYxNjdjZjkzOWM1ZTVjYmE2YTBhZTkxMDM4ZjQxN2QwNjNiNjMx
|
11
|
-
MmEyNGI2MzY0NjBkMTg3NjRiZDA1ZDJkMzg4NjllODFhMTA0ZGU=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
NDAyYjJlOTgxNTVkNzI4N2UyNjE4MGE0MjdkOThjMWY4MzI2ZmZlODJkNjcz
|
14
|
-
OTEzNzA2OGY5MjRhMzJmZDQxZGZlMzRhMzIwZGIyMmY0YWRlODJkYzc5OThi
|
15
|
-
MDY0NjRlY2VhYmMxOTk1MDJiOTYwYjQwYzk0MDdjYTZjOTM5YWE=
|
6
|
+
metadata.gz: 86aef585240e3d1cba71f0eea5888a6f6304b5847eb6711cd08e945ebc970c209b8812b66e977d37f187c875f5f523a531763e74746ae130e51282786fefa785
|
7
|
+
data.tar.gz: ce1f1d4ca6ea9b7af009e99d95bb82e2fb7025356b6bab26882468079d8c7122177fcb374c09e080bd1783b9efa980f5c7a7289362ec05fbbc97f47586bcdc7e
|
data/README.md
CHANGED
@@ -23,38 +23,9 @@ rake install
|
|
23
23
|
|
24
24
|
##Usage
|
25
25
|
|
26
|
-
|
27
|
-
$ knife skeleton create -h
|
28
|
-
knife skeleton create COOKOOK (options)
|
29
|
-
-s, --server-url URL Chef Server URL
|
30
|
-
--chef-zero-port PORT Port to start chef-zero on
|
31
|
-
-k, --key KEY API Client Key
|
32
|
-
--[no-]color Use colored output, defaults to false on Windows, true otherwise
|
33
|
-
-c, --config CONFIG The configuration file to use
|
34
|
-
-C, --copyright COPYRIGHT Name of Copyright holder
|
35
|
-
-m, --email EMAIL Email address of cookbook maintainer
|
36
|
-
-I, --license LICENSE License apachev2, gplv2, gplv3, mit or none
|
37
|
-
-o, --cookbook-path PATH The directory where the cookbook will be created
|
38
|
-
--defaults Accept default values for all questions
|
39
|
-
-d, --disable-editing Do not open EDITOR, just accept the data as is
|
40
|
-
-e, --editor EDITOR Set the editor to use for interactive commands
|
41
|
-
-E, --environment ENVIRONMENT Set the Chef environment
|
42
|
-
-F, --format FORMAT Which format to use for output
|
43
|
-
-z, --local-mode Point knife commands at local repository instead of server
|
44
|
-
-u, --user USER API Client Username
|
45
|
-
--print-after Show the data after a destructive operation
|
46
|
-
-r, --readme-format FORMAT Format of the README file, supported formats are 'md', 'rdoc' and 'txt'
|
47
|
-
-V, --verbose More verbose output. Use twice for max verbosity
|
48
|
-
-v, --version Show chef version
|
49
|
-
-y, --yes Say yes to all prompts for confirmation
|
50
|
-
-h, --help Show this message
|
51
|
-
```
|
52
|
-
|
53
|
-
Create your cookbook
|
26
|
+
There is no usage instructions! Simply having knife-skeleton installed will automatically override Chef's default `cookbook create` command.
|
54
27
|
|
55
|
-
|
56
|
-
knife skeleton create my-cookbook -o /tmp/cookbooks
|
57
|
-
```
|
28
|
+
`knife cookbook create COOKBOOK`
|
58
29
|
|
59
30
|
## License and Authors
|
60
31
|
|
data/files/Gemfile
CHANGED
@@ -0,0 +1,330 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'chef/knife/cookbook_create'
|
3
|
+
require 'pathname'
|
4
|
+
require 'knife_skeleton/template'
|
5
|
+
|
6
|
+
class Chef
|
7
|
+
class Knife
|
8
|
+
# Cookbook class
|
9
|
+
class CookbookCreate < Chef::Knife
|
10
|
+
banner 'knife skeleton create COOKOOK (options)'
|
11
|
+
|
12
|
+
option(:cookbook_path,
|
13
|
+
short: '-o PATH',
|
14
|
+
long: '--cookbook-path PATH',
|
15
|
+
description: <<-eos
|
16
|
+
The directory where the cookbook will be created
|
17
|
+
eos
|
18
|
+
)
|
19
|
+
|
20
|
+
option(:readme_format,
|
21
|
+
short: '-r FORMAT',
|
22
|
+
long: '--readme-format FORMAT',
|
23
|
+
description: <<-eos
|
24
|
+
Format of the README file, supported formats are 'md', 'rdoc' and 'txt'
|
25
|
+
eos
|
26
|
+
)
|
27
|
+
option(:cookbook_license,
|
28
|
+
short: '-I LICENSE',
|
29
|
+
long: '--license LICENSE',
|
30
|
+
description: <<-eos
|
31
|
+
License apachev2, gplv2, gplv3, mit or none
|
32
|
+
eos
|
33
|
+
)
|
34
|
+
option(:cookbook_copyright,
|
35
|
+
short: '-C COPYRIGHT',
|
36
|
+
long: '--copyright COPYRIGHT',
|
37
|
+
description: <<-eos
|
38
|
+
Name of Copyright holder
|
39
|
+
eos
|
40
|
+
)
|
41
|
+
option(:cookbook_email,
|
42
|
+
short: '-m EMAIL',
|
43
|
+
long: '--email EMAIL',
|
44
|
+
description: <<-eos
|
45
|
+
Email address of cookbook maintainer
|
46
|
+
eos
|
47
|
+
)
|
48
|
+
|
49
|
+
# Public: Knife skeleton create runner
|
50
|
+
#
|
51
|
+
# @return [Void]
|
52
|
+
#
|
53
|
+
def run
|
54
|
+
self.config = Chef::Config.merge!(config)
|
55
|
+
if @name_args.length < 1
|
56
|
+
show_usage
|
57
|
+
ui.fatal('You must specify a cookbook name')
|
58
|
+
exit 1
|
59
|
+
end
|
60
|
+
|
61
|
+
if parameter_empty?(config[:cookbook_path])
|
62
|
+
fail ArgumentError, <<-eos
|
63
|
+
Default cookbook_path is not specified in the
|
64
|
+
knife.rb config file, and a value to -o is
|
65
|
+
not provided. Nowhere to write the new cookbook to.
|
66
|
+
eos
|
67
|
+
end
|
68
|
+
|
69
|
+
params = {
|
70
|
+
cookbook_path: File.expand_path(Array(config[:cookbook_path]).first),
|
71
|
+
cookbook_name: @name_args.first,
|
72
|
+
copyright: cookbook_copyright,
|
73
|
+
email: cookbook_email,
|
74
|
+
license: cookbook_license,
|
75
|
+
license_name: cookbook_license_name,
|
76
|
+
readme_format: cookbook_readme_format
|
77
|
+
}
|
78
|
+
|
79
|
+
create_cookbook_directories(
|
80
|
+
params[:cookbook_path],
|
81
|
+
params[:cookbook_name]
|
82
|
+
)
|
83
|
+
create_cookbook_files(params[:cookbook_path], params[:cookbook_name])
|
84
|
+
create_cookbook_templates(params)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Public: Retrieve license name
|
88
|
+
#
|
89
|
+
# Examples:
|
90
|
+
#
|
91
|
+
# # With mit license
|
92
|
+
# cookbook_license_name
|
93
|
+
# # => 'MIT'
|
94
|
+
# # With apachev2 license
|
95
|
+
# cookbook_license_name
|
96
|
+
# # => 'Apache 2.0'
|
97
|
+
# # With gplv3 license
|
98
|
+
# cookbook_license_name
|
99
|
+
# # => 'GNU Public LIcense 3.0'
|
100
|
+
#
|
101
|
+
# @return [String]
|
102
|
+
#
|
103
|
+
def cookbook_license_name
|
104
|
+
case cookbook_license
|
105
|
+
when 'apachev2'
|
106
|
+
'Apache 2.0'
|
107
|
+
when 'gplv2'
|
108
|
+
'GNU Public License 2.0'
|
109
|
+
when 'gplv3'
|
110
|
+
'GNU Public License 3.0'
|
111
|
+
when 'mit'
|
112
|
+
'MIT'
|
113
|
+
when 'none'
|
114
|
+
'All rights reserved'
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
# Create cookbook directories
|
119
|
+
#
|
120
|
+
# Examples:
|
121
|
+
#
|
122
|
+
# create_cookbook_directories('/tmp', 'my-cookbook')
|
123
|
+
#
|
124
|
+
# @param [String] cookbook_path Cookbook path
|
125
|
+
# @param [String] cookbook_name Cookbook name
|
126
|
+
# @return [Void]
|
127
|
+
#
|
128
|
+
def create_cookbook_directories(cookbook_path, cookbook_name)
|
129
|
+
ui.msg("** Create cookbook #{cookbook_name} into #{cookbook_path}")
|
130
|
+
|
131
|
+
%w(
|
132
|
+
attributes
|
133
|
+
definitions
|
134
|
+
libraries
|
135
|
+
providers
|
136
|
+
recipes
|
137
|
+
resources
|
138
|
+
spec
|
139
|
+
files/default
|
140
|
+
templates/default
|
141
|
+
test/integration/default/serverspec).each do |dir|
|
142
|
+
FileUtils.mkdir_p(File.join(
|
143
|
+
cookbook_path,
|
144
|
+
cookbook_name,
|
145
|
+
dir))
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
# Create cookbook files from templates
|
150
|
+
#
|
151
|
+
# Examples:
|
152
|
+
#
|
153
|
+
# create_cookbook_templates({ cookbook_path: '/tmp', title: 'GoT' })
|
154
|
+
#
|
155
|
+
# @params [Hash] params An Hash of parameters to use for binding template
|
156
|
+
# @return [Void]
|
157
|
+
#
|
158
|
+
def create_cookbook_templates(params)
|
159
|
+
params[:license_content] = File.read(File.join(files_directory,
|
160
|
+
'licenses',
|
161
|
+
params[:license])
|
162
|
+
) if params[:license] != 'none'
|
163
|
+
|
164
|
+
params[:license_content] = '' unless params[:license] != 'none'
|
165
|
+
|
166
|
+
%W(
|
167
|
+
metadata.rb
|
168
|
+
CHANGELOG.#{params[:readme_format]}
|
169
|
+
README.#{params[:readme_format]}
|
170
|
+
.kitchen.yml
|
171
|
+
attributes/default.rb
|
172
|
+
recipes/default.rb
|
173
|
+
spec/default_spec.rb
|
174
|
+
spec/spec_helper.rb
|
175
|
+
test/integration/default/serverspec/spec_helper.rb
|
176
|
+
test/integration/default/serverspec/default_spec.rb
|
177
|
+
).each do |file_name|
|
178
|
+
render_template(file_name, params)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
# Copy all files into the cookbook
|
183
|
+
#
|
184
|
+
# Examples:
|
185
|
+
#
|
186
|
+
# create_cookbook_files('/tmp', 'my-cookbook')
|
187
|
+
#
|
188
|
+
# @param [String] cookbook_path Cookbook path
|
189
|
+
# @param [String] cookbook_name Cookbook name
|
190
|
+
# @return [Void]
|
191
|
+
#
|
192
|
+
def create_cookbook_files(cookbook_path, cookbook_name)
|
193
|
+
%w(
|
194
|
+
Berksfile
|
195
|
+
Gemfile
|
196
|
+
.gitignore
|
197
|
+
.rubocop.yml
|
198
|
+
.travis.yml
|
199
|
+
Strainerfile
|
200
|
+
).each do |file_name|
|
201
|
+
copy_file(cookbook_path, cookbook_name, file_name)
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
# Copy files
|
206
|
+
#
|
207
|
+
# Examples:
|
208
|
+
#
|
209
|
+
# copy_file('/tmp', '/cookbooks', 'my-cookbook', 'README.md')
|
210
|
+
#
|
211
|
+
# @param [String] cookbook_path Cookbook path
|
212
|
+
# @param [String] cookbook_name Cookbook name
|
213
|
+
# @param [String] file_name File name to used without erb extension
|
214
|
+
# @return [Void]
|
215
|
+
#
|
216
|
+
def copy_file(cookbook_path, cookbook_name, file_name)
|
217
|
+
dst = File.join(cookbook_path,
|
218
|
+
cookbook_name,
|
219
|
+
file_name)
|
220
|
+
|
221
|
+
if File.exist?(dst)
|
222
|
+
ui.warn("'#{file_name}' already exists")
|
223
|
+
else
|
224
|
+
ui.msg("** Create '#{file_name}'")
|
225
|
+
FileUtils.cp(File
|
226
|
+
.join(
|
227
|
+
files_directory,
|
228
|
+
file_name.gsub(/^\./, '')),
|
229
|
+
dst)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
# Render template
|
234
|
+
#
|
235
|
+
# Examples:
|
236
|
+
#
|
237
|
+
# render_template('/tmp', 'my-file.rb', { title: 'GoT' })
|
238
|
+
#
|
239
|
+
# @param [String] file_name File name to used without erb extension
|
240
|
+
# @param [Hash] params Binding parameters
|
241
|
+
# @return [void]
|
242
|
+
#
|
243
|
+
def render_template(file_name, params)
|
244
|
+
dst = File.join(params[:cookbook_path],
|
245
|
+
params[:cookbook_name],
|
246
|
+
file_name)
|
247
|
+
|
248
|
+
if File.exist?(dst)
|
249
|
+
ui.warn("'#{file_name}' already exists")
|
250
|
+
else
|
251
|
+
ui.msg("** Create '#{file_name}'")
|
252
|
+
File.open(dst, 'w+') do |file|
|
253
|
+
file.write(KnifeSkeleton::Template
|
254
|
+
.render(File.read(File.join(
|
255
|
+
templates_directory,
|
256
|
+
file_name + '.erb')),
|
257
|
+
params))
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
# Test if parameter is empty
|
263
|
+
#
|
264
|
+
# Examples:
|
265
|
+
#
|
266
|
+
# parameter_empty?('my string')
|
267
|
+
# # => false
|
268
|
+
# parameter_empty?('')
|
269
|
+
# # => true
|
270
|
+
#
|
271
|
+
# @param [Mixed] parameter The tested parameter
|
272
|
+
# @return [String]
|
273
|
+
#
|
274
|
+
def parameter_empty?(parameter)
|
275
|
+
parameter.nil? || parameter.empty?
|
276
|
+
end
|
277
|
+
|
278
|
+
# Get cookbook copyright
|
279
|
+
#
|
280
|
+
# @return [String]
|
281
|
+
#
|
282
|
+
def cookbook_copyright
|
283
|
+
config[:cookbook_copyright] || 'YOUR_COMPANY_NAME'
|
284
|
+
end
|
285
|
+
|
286
|
+
# Get maintener email
|
287
|
+
#
|
288
|
+
# @return [String]
|
289
|
+
#
|
290
|
+
def cookbook_email
|
291
|
+
config[:cookbook_email] || 'YOUR_EMAIL'
|
292
|
+
end
|
293
|
+
|
294
|
+
# Get license name
|
295
|
+
#
|
296
|
+
# @return [String]
|
297
|
+
#
|
298
|
+
def cookbook_license
|
299
|
+
((config[:cookbook_license] != 'false') &&
|
300
|
+
config[:cookbook_license]) || 'none'
|
301
|
+
end
|
302
|
+
|
303
|
+
# Get readme format
|
304
|
+
#
|
305
|
+
# @return [String]
|
306
|
+
#
|
307
|
+
def cookbook_readme_format
|
308
|
+
((config[:readme_format] != 'false') && config[:readme_format]) || 'md'
|
309
|
+
end
|
310
|
+
|
311
|
+
# Get files directory
|
312
|
+
#
|
313
|
+
# @return [String]
|
314
|
+
#
|
315
|
+
def files_directory
|
316
|
+
File.expand_path('../../../../files',
|
317
|
+
Pathname.new(__FILE__).realpath)
|
318
|
+
end
|
319
|
+
|
320
|
+
# Get templates directory
|
321
|
+
#
|
322
|
+
# @return [String]
|
323
|
+
#
|
324
|
+
def templates_directory
|
325
|
+
File.expand_path('../../../../templates',
|
326
|
+
Pathname.new(__FILE__).realpath)
|
327
|
+
end
|
328
|
+
end
|
329
|
+
end
|
330
|
+
end
|
data/spec/chef/knife/{knife_skeleton_create_spec.rb → knife_cookbook_create_extension_spec.rb}
RENAMED
@@ -1,13 +1,13 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
require 'spec_helper'
|
3
|
-
require 'chef/knife/
|
3
|
+
require 'chef/knife/cookbook_create_extension'
|
4
4
|
require 'fakefs/spec_helpers'
|
5
5
|
|
6
|
-
describe Knife::
|
6
|
+
describe Chef::Knife::CookbookCreate do
|
7
7
|
include FakeFS::SpecHelpers
|
8
8
|
|
9
9
|
before(:each) do
|
10
|
-
@knife = Knife::
|
10
|
+
@knife = Chef::Knife::CookbookCreate.new
|
11
11
|
@knife.config = {}
|
12
12
|
@knife.name_args = ['foobar']
|
13
13
|
@stdout = StringIO.new
|
@@ -2,21 +2,5 @@
|
|
2
2
|
|
3
3
|
require 'serverspec'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
begin
|
9
|
-
require 'rspec_junit_formatter'
|
10
|
-
rescue LoadError
|
11
|
-
require 'rubygems/dependency_installer'
|
12
|
-
Gem::DependencyInstaller.new.install('rspec_junit_formatter')
|
13
|
-
require 'rspec_junit_formatter'
|
14
|
-
end
|
15
|
-
|
16
|
-
RSpec.configure do |c|
|
17
|
-
c.before :all do
|
18
|
-
c.os = backend(Serverspec::Commands::Base).check_os
|
19
|
-
end
|
20
|
-
c.path = '/sbin:/usr/sbin:/usr/bin:/bin'
|
21
|
-
c.add_formatter 'RspecJunitFormatter', '/tmp/kitchen.xml'
|
22
|
-
end
|
5
|
+
set :backend, :exec
|
6
|
+
set :path, '$PATH:/sbin:/usr/sbin:/usr/bin:/bin'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knife-skeleton
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pierre Rambaud
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-10-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: chef
|
@@ -99,21 +99,19 @@ dependencies:
|
|
99
99
|
name: fakefs
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
101
101
|
requirements:
|
102
|
-
- -
|
102
|
+
- - '>='
|
103
103
|
- !ruby/object:Gem::Version
|
104
104
|
version: 0.5.3
|
105
105
|
type: :development
|
106
106
|
prerelease: false
|
107
107
|
version_requirements: !ruby/object:Gem::Requirement
|
108
108
|
requirements:
|
109
|
-
- -
|
109
|
+
- - '>='
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: 0.5.3
|
112
|
-
description:
|
113
|
-
|
112
|
+
description: |
|
113
|
+
Knife plugin to create skeleton with rubocop, chefspec, kitchen,
|
114
114
|
strainer, etc...
|
115
|
-
|
116
|
-
'
|
117
115
|
email:
|
118
116
|
- pierre.rambaud@numergy.com
|
119
117
|
- antoine.rouyer@numergy.com
|
@@ -139,10 +137,10 @@ files:
|
|
139
137
|
- files/rubocop.yml
|
140
138
|
- files/travis.yml
|
141
139
|
- knife_skeleton.gemspec
|
142
|
-
- lib/chef/knife/
|
140
|
+
- lib/chef/knife/cookbook_create_extension.rb
|
143
141
|
- lib/knife_skeleton/template.rb
|
144
142
|
- lib/knife_skeleton/version.rb
|
145
|
-
- spec/chef/knife/
|
143
|
+
- spec/chef/knife/knife_cookbook_create_extension_spec.rb
|
146
144
|
- spec/knife_skeleton/template_spec.rb
|
147
145
|
- spec/spec_helper.rb
|
148
146
|
- templates/.kitchen.yml.erb
|
@@ -169,22 +167,23 @@ require_paths:
|
|
169
167
|
- lib
|
170
168
|
required_ruby_version: !ruby/object:Gem::Requirement
|
171
169
|
requirements:
|
172
|
-
- -
|
170
|
+
- - '>='
|
173
171
|
- !ruby/object:Gem::Version
|
174
172
|
version: '0'
|
175
173
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
176
174
|
requirements:
|
177
|
-
- -
|
175
|
+
- - '>='
|
178
176
|
- !ruby/object:Gem::Version
|
179
177
|
version: '0'
|
180
178
|
requirements: []
|
181
179
|
rubyforge_project:
|
182
|
-
rubygems_version: 2.
|
180
|
+
rubygems_version: 2.0.14
|
183
181
|
signing_key:
|
184
182
|
specification_version: 4
|
185
183
|
summary: Knife plugin to create skeleton with rubocop, chefspec, kitchen, strainer,
|
186
184
|
etc...
|
187
185
|
test_files:
|
188
|
-
- spec/chef/knife/
|
186
|
+
- spec/chef/knife/knife_cookbook_create_extension_spec.rb
|
189
187
|
- spec/knife_skeleton/template_spec.rb
|
190
188
|
- spec/spec_helper.rb
|
189
|
+
has_rdoc:
|
@@ -1,354 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
require 'chef/knife'
|
3
|
-
require 'pathname'
|
4
|
-
require 'knife_skeleton/template'
|
5
|
-
|
6
|
-
module Knife
|
7
|
-
# Cookbook class
|
8
|
-
class SkeletonCreate < Chef::Knife
|
9
|
-
banner 'knife skeleton create COOKOOK (options)'
|
10
|
-
|
11
|
-
option :cookbook_path,
|
12
|
-
short: '-o PATH',
|
13
|
-
long: '--cookbook-path PATH',
|
14
|
-
description: <<-eos
|
15
|
-
The directory where the cookbook will be created
|
16
|
-
eos
|
17
|
-
|
18
|
-
option :readme_format,
|
19
|
-
short: '-r FORMAT',
|
20
|
-
long: '--readme-format FORMAT',
|
21
|
-
description: <<-eos
|
22
|
-
Format of the README file, supported formats are 'md', 'rdoc' and 'txt'
|
23
|
-
eos
|
24
|
-
|
25
|
-
option :cookbook_license,
|
26
|
-
short: '-I LICENSE',
|
27
|
-
long: '--license LICENSE',
|
28
|
-
description: <<-eos
|
29
|
-
License apachev2, gplv2, gplv3, mit or none
|
30
|
-
eos
|
31
|
-
|
32
|
-
option :cookbook_copyright,
|
33
|
-
short: '-C COPYRIGHT',
|
34
|
-
long: '--copyright COPYRIGHT',
|
35
|
-
description: <<-eos
|
36
|
-
Name of Copyright holder
|
37
|
-
eos
|
38
|
-
|
39
|
-
option :cookbook_email,
|
40
|
-
short: '-m EMAIL',
|
41
|
-
long: '--email EMAIL',
|
42
|
-
description: <<-eos
|
43
|
-
Email address of cookbook maintainer
|
44
|
-
eos
|
45
|
-
|
46
|
-
# Public: Knife skeleton create runner
|
47
|
-
#
|
48
|
-
# @return [Void]
|
49
|
-
#
|
50
|
-
def run
|
51
|
-
self.config = Chef::Config.merge!(config)
|
52
|
-
if @name_args.length < 1
|
53
|
-
show_usage
|
54
|
-
ui.fatal('You must specify a cookbook name')
|
55
|
-
exit 1
|
56
|
-
end
|
57
|
-
|
58
|
-
if parameter_empty?(config[:cookbook_path])
|
59
|
-
fail ArgumentError, <<-eos
|
60
|
-
Default cookbook_path is not specified in the
|
61
|
-
knife.rb config file, and a value to -o is
|
62
|
-
not provided. Nowhere to write the new cookbook to.
|
63
|
-
eos
|
64
|
-
end
|
65
|
-
|
66
|
-
params = {
|
67
|
-
cookbook_path: File.expand_path(Array(config[:cookbook_path]).first),
|
68
|
-
cookbook_name: @name_args.first,
|
69
|
-
copyright: cookbook_copyright,
|
70
|
-
email: cookbook_email,
|
71
|
-
license: cookbook_license,
|
72
|
-
license_name: cookbook_license_name,
|
73
|
-
readme_format: cookbook_readme_format
|
74
|
-
}
|
75
|
-
|
76
|
-
create_cookbook_directories(
|
77
|
-
params[:cookbook_path],
|
78
|
-
params[:cookbook_name]
|
79
|
-
)
|
80
|
-
create_cookbook_files(params[:cookbook_path], params[:cookbook_name])
|
81
|
-
create_cookbook_templates(params)
|
82
|
-
end
|
83
|
-
|
84
|
-
# Public: Retrieve license name
|
85
|
-
#
|
86
|
-
# Examples:
|
87
|
-
#
|
88
|
-
# # With mit license
|
89
|
-
# cookbook_license_name
|
90
|
-
# # => 'MIT'
|
91
|
-
# # With apachev2 license
|
92
|
-
# cookbook_license_name
|
93
|
-
# # => 'Apache 2.0'
|
94
|
-
# # With gplv3 license
|
95
|
-
# cookbook_license_name
|
96
|
-
# # => 'GNU Public LIcense 3.0'
|
97
|
-
#
|
98
|
-
# @return [String]
|
99
|
-
#
|
100
|
-
def cookbook_license_name
|
101
|
-
case cookbook_license
|
102
|
-
when 'apachev2'
|
103
|
-
'Apache 2.0'
|
104
|
-
when 'gplv2'
|
105
|
-
'GNU Public License 2.0'
|
106
|
-
when 'gplv3'
|
107
|
-
'GNU Public License 3.0'
|
108
|
-
when 'mit'
|
109
|
-
'MIT'
|
110
|
-
when 'none'
|
111
|
-
'All rights reserved'
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
# Create cookbook directories
|
116
|
-
#
|
117
|
-
# Examples:
|
118
|
-
#
|
119
|
-
# create_cookbook_directories('/tmp', 'my-cookbook')
|
120
|
-
#
|
121
|
-
# @param [String] cookbook_path Cookbook path
|
122
|
-
# @param [String] cookbook_name Cookbook name
|
123
|
-
# @return [Void]
|
124
|
-
#
|
125
|
-
def create_cookbook_directories(cookbook_path, cookbook_name)
|
126
|
-
ui.msg("** Create cookbook #{cookbook_name} into #{cookbook_path}")
|
127
|
-
|
128
|
-
%w(
|
129
|
-
attributes
|
130
|
-
definitions
|
131
|
-
libraries
|
132
|
-
providers
|
133
|
-
recipes
|
134
|
-
resources
|
135
|
-
spec
|
136
|
-
files/default
|
137
|
-
templates/default
|
138
|
-
test/integration/default/serverspec).each do |dir|
|
139
|
-
FileUtils.mkdir_p(
|
140
|
-
File.join(
|
141
|
-
cookbook_path,
|
142
|
-
cookbook_name,
|
143
|
-
dir
|
144
|
-
)
|
145
|
-
)
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
# Create cookbook files from templates
|
150
|
-
#
|
151
|
-
# Examples:
|
152
|
-
#
|
153
|
-
# create_cookbook_templates({ cookbook_path: '/tmp', title: 'GoT' })
|
154
|
-
#
|
155
|
-
# @params [Hash] params An Hash of parameters to use for binding template
|
156
|
-
# @return [Void]
|
157
|
-
#
|
158
|
-
def create_cookbook_templates(params)
|
159
|
-
params[:license_content] = File.read(
|
160
|
-
File.join(
|
161
|
-
files_directory,
|
162
|
-
'licenses',
|
163
|
-
params[:license]
|
164
|
-
)
|
165
|
-
) if params[:license] != 'none'
|
166
|
-
|
167
|
-
params[:license_content] = '' unless params[:license] != 'none'
|
168
|
-
|
169
|
-
%W(
|
170
|
-
metadata.rb
|
171
|
-
CHANGELOG.#{params[:readme_format]}
|
172
|
-
README.#{params[:readme_format]}
|
173
|
-
.kitchen.yml
|
174
|
-
attributes/default.rb
|
175
|
-
recipes/default.rb
|
176
|
-
spec/default_spec.rb
|
177
|
-
spec/spec_helper.rb
|
178
|
-
test/integration/default/serverspec/spec_helper.rb
|
179
|
-
test/integration/default/serverspec/default_spec.rb
|
180
|
-
).each do |file_name|
|
181
|
-
render_template(file_name, params)
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
# Copy all files into the cookbook
|
186
|
-
#
|
187
|
-
# Examples:
|
188
|
-
#
|
189
|
-
# create_cookbook_files('/tmp', 'my-cookbook')
|
190
|
-
#
|
191
|
-
# @param [String] cookbook_path Cookbook path
|
192
|
-
# @param [String] cookbook_name Cookbook name
|
193
|
-
# @return [Void]
|
194
|
-
#
|
195
|
-
def create_cookbook_files(
|
196
|
-
cookbook_path,
|
197
|
-
cookbook_name
|
198
|
-
)
|
199
|
-
%w(
|
200
|
-
Berksfile
|
201
|
-
Gemfile
|
202
|
-
.gitignore
|
203
|
-
.rubocop.yml
|
204
|
-
.travis.yml
|
205
|
-
Strainerfile
|
206
|
-
).each do |file_name|
|
207
|
-
copy_file(cookbook_path, cookbook_name, file_name)
|
208
|
-
end
|
209
|
-
end
|
210
|
-
|
211
|
-
# Copy files
|
212
|
-
#
|
213
|
-
# Examples:
|
214
|
-
#
|
215
|
-
# copy_file('/tmp', '/cookbooks', 'my-cookbook', 'README.md')
|
216
|
-
#
|
217
|
-
# @param [String] cookbook_path Cookbook path
|
218
|
-
# @param [String] cookbook_name Cookbook name
|
219
|
-
# @param [String] file_name File name to used without erb extension
|
220
|
-
# @return [Void]
|
221
|
-
#
|
222
|
-
def copy_file(cookbook_path, cookbook_name, file_name)
|
223
|
-
dst = File.join(
|
224
|
-
cookbook_path,
|
225
|
-
cookbook_name,
|
226
|
-
file_name
|
227
|
-
)
|
228
|
-
|
229
|
-
if File.exist?(dst)
|
230
|
-
ui.warn("'#{file_name}' already exists")
|
231
|
-
else
|
232
|
-
ui.msg("** Create '#{file_name}'")
|
233
|
-
FileUtils.cp(
|
234
|
-
File.join(
|
235
|
-
files_directory,
|
236
|
-
file_name.gsub(/^\./, '')
|
237
|
-
),
|
238
|
-
dst
|
239
|
-
)
|
240
|
-
end
|
241
|
-
end
|
242
|
-
|
243
|
-
# Render template
|
244
|
-
#
|
245
|
-
# Examples:
|
246
|
-
#
|
247
|
-
# render_template('/tmp', 'my-file.rb', { title: 'GoT' })
|
248
|
-
#
|
249
|
-
# @param [String] file_name File name to used without erb extension
|
250
|
-
# @param [Hash] params Binding parameters
|
251
|
-
# @return [void]
|
252
|
-
#
|
253
|
-
def render_template(file_name, params)
|
254
|
-
dst = File.join(
|
255
|
-
params[:cookbook_path],
|
256
|
-
params[:cookbook_name],
|
257
|
-
file_name
|
258
|
-
)
|
259
|
-
|
260
|
-
if File.exist?(dst)
|
261
|
-
ui.warn("'#{file_name}' already exists")
|
262
|
-
else
|
263
|
-
ui.msg("** Create '#{file_name}'")
|
264
|
-
File.open(
|
265
|
-
dst,
|
266
|
-
'w+'
|
267
|
-
) do |file|
|
268
|
-
file.write(
|
269
|
-
KnifeSkeleton::Template.render(
|
270
|
-
File.read(
|
271
|
-
File.join(
|
272
|
-
templates_directory,
|
273
|
-
file_name + '.erb'
|
274
|
-
)
|
275
|
-
),
|
276
|
-
params
|
277
|
-
)
|
278
|
-
)
|
279
|
-
end
|
280
|
-
end
|
281
|
-
end
|
282
|
-
|
283
|
-
# Test if parameter is empty
|
284
|
-
#
|
285
|
-
# Examples:
|
286
|
-
#
|
287
|
-
# parameter_empty?('my string')
|
288
|
-
# # => false
|
289
|
-
# parameter_empty?('')
|
290
|
-
# # => true
|
291
|
-
#
|
292
|
-
# @param [Mixed] parameter The tested parameter
|
293
|
-
# @return [String]
|
294
|
-
#
|
295
|
-
def parameter_empty?(parameter)
|
296
|
-
parameter.nil? || parameter.empty?
|
297
|
-
end
|
298
|
-
|
299
|
-
# Get cookbook copyright
|
300
|
-
#
|
301
|
-
# @return [String]
|
302
|
-
#
|
303
|
-
def cookbook_copyright
|
304
|
-
config[:cookbook_copyright] || 'YOUR_COMPANY_NAME'
|
305
|
-
end
|
306
|
-
|
307
|
-
# Get maintener email
|
308
|
-
#
|
309
|
-
# @return [String]
|
310
|
-
#
|
311
|
-
def cookbook_email
|
312
|
-
config[:cookbook_email] || 'YOUR_EMAIL'
|
313
|
-
end
|
314
|
-
|
315
|
-
# Get license name
|
316
|
-
#
|
317
|
-
# @return [String]
|
318
|
-
#
|
319
|
-
def cookbook_license
|
320
|
-
((config[:cookbook_license] != 'false') &&
|
321
|
-
config[:cookbook_license]) || 'none'
|
322
|
-
end
|
323
|
-
|
324
|
-
# Get readme format
|
325
|
-
#
|
326
|
-
# @return [String]
|
327
|
-
#
|
328
|
-
def cookbook_readme_format
|
329
|
-
((config[:readme_format] != 'false') && config[:readme_format]) || 'md'
|
330
|
-
end
|
331
|
-
|
332
|
-
# Get files directory
|
333
|
-
#
|
334
|
-
# @return [String]
|
335
|
-
#
|
336
|
-
def files_directory
|
337
|
-
File.expand_path(
|
338
|
-
'../../../../files',
|
339
|
-
Pathname.new(__FILE__).realpath
|
340
|
-
)
|
341
|
-
end
|
342
|
-
|
343
|
-
# Get templates directory
|
344
|
-
#
|
345
|
-
# @return [String]
|
346
|
-
#
|
347
|
-
def templates_directory
|
348
|
-
File.expand_path(
|
349
|
-
'../../../../templates',
|
350
|
-
Pathname.new(__FILE__).realpath
|
351
|
-
)
|
352
|
-
end
|
353
|
-
end
|
354
|
-
end
|