spiceweasel 2.5.1 → 2.6.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 +8 -8
- data/README.md +6 -2
- data/lib/spiceweasel/cli.rb +17 -1
- data/lib/spiceweasel/clusters.rb +5 -1
- data/lib/spiceweasel/nodes.rb +116 -35
- data/lib/spiceweasel/version.rb +1 -1
- data/spec/bin/chef_client_spec.rb +4 -4
- data/spec/bin/google_spec.rb +105 -0
- data/spec/bin/kvm_spec.rb +1 -0
- data/spec/bin/node_spec.rb +108 -0
- data/spec/bin/spiceweasel_spec.rb +20 -4
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MDZhOGZjMDFmZjhhZTQ2ZTAwYmU0NmQyNzNjNTczNWE0MDIyZjVjOA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MGNjYWFiMzVjODZjMzAwYTdmMGYyMDM5ZTBhZmRmYjM0MzEwODg0NQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MjY5YjBhOGRlNmViZjk3MGVmNDg3MjA1NjBmNTI0MGU4NmM3NzYwZjdhNzU3
|
10
|
+
Mzc4M2Q0OGFhNTJjMzNkZDE5NjZkNWJhMzIyOTVkNjg4OTIyYTI3NzViYjQy
|
11
|
+
MGM0NTE5NzNjY2I4ZmE1NmMzYmNlNjYwZDhiNTU4MmM0NjAxZWE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MDkzOWM4NmExM2E3YTQ5ZDdmZTA2OTAxNDljYTNjNmI3NzNiYzk4OTIyZTQ3
|
14
|
+
Y2Q0MWY3NGRkMjBmMjMyY2ZiZjZjOGM5MWE0ODYwOTA4ZTNlMzMxN2FhZWVm
|
15
|
+
YWY5MDY3NjVmZWE1YTNhYzIwMjhlNDczOTMyYzAwMTMyNjNkMmE=
|
data/README.md
CHANGED
@@ -179,7 +179,7 @@ knife bootstrap windows ssh winboxC -x Administrator -P 'super_secret_password'
|
|
179
179
|
|
180
180
|
### Providers ###
|
181
181
|
|
182
|
-
The following knife plugins are currently supported as providers: `bluebox, clodo, cs, ec2, gandi, hp, joyent, lxc, openstack, rackspace, slicehost, terremark, vagrant, voxel` and `vsphere`.
|
182
|
+
The following knife plugins are currently supported as providers: `bluebox, clodo, cs, digital_ocean, ec2, gandi, google, hp, joyent, kvm, linode, lxc, openstack, rackspace, slicehost, terremark, vagrant, voxel` and `vsphere`.
|
183
183
|
|
184
184
|
### Bulk node creation ###
|
185
185
|
|
@@ -202,7 +202,7 @@ which generates nodes named "webserver1", "webserver2" and "webserver3".
|
|
202
202
|
|
203
203
|
## Clusters ##
|
204
204
|
|
205
|
-
Clusters are not a type supported by Chef, this is a logical construct added by Spiceweasel to enable managing sets of infrastructure together. The `clusters` section is a special case of `nodes`, where each member of the named cluster in the manifest will be put in the same Environment to ensure that the entire cluster may be created
|
205
|
+
Clusters are not a type supported by Chef, this is a logical construct added by Spiceweasel to enable managing sets of infrastructure together. The `clusters` section is a special case of `nodes`, where each member of the named cluster in the manifest will be put in the same Environment to ensure that the entire cluster (every node in the Environment) may be **created** and **destroyed** in sync. The node syntax is the same as that under `nodes`, the only addition is the cluster name.
|
206
206
|
|
207
207
|
```
|
208
208
|
clusters:
|
@@ -340,6 +340,10 @@ When run in a chef repository, this will print a new YAML manifest that may be u
|
|
340
340
|
|
341
341
|
Print the currently-supported usage options for spiceweasel.
|
342
342
|
|
343
|
+
## --node-only ##
|
344
|
+
|
345
|
+
Loads from JSON or creates nodes on the server without bootstrapping, useful for pre-creating nodes. If you specify a run list with the node, it will override any run list specified within the JSON file.
|
346
|
+
|
343
347
|
## --novalidation ##
|
344
348
|
|
345
349
|
Disable validation ensuring existence of the cookbooks, environments, roles, data bags and nodes in infrastructure file.
|
data/lib/spiceweasel/cli.rb
CHANGED
@@ -114,6 +114,11 @@ module Spiceweasel
|
|
114
114
|
:description => "Set the log file location, defaults to STDOUT",
|
115
115
|
:proc => nil
|
116
116
|
|
117
|
+
option :node_only,
|
118
|
+
:long => '--node-only',
|
119
|
+
:description => 'Create node(s) on the server, do not bootstrap',
|
120
|
+
:boolean => false
|
121
|
+
|
117
122
|
option :novalidation,
|
118
123
|
:long => '--novalidation',
|
119
124
|
:description => 'Disable validation',
|
@@ -172,7 +177,7 @@ module Spiceweasel
|
|
172
177
|
if Spiceweasel::Config[:extractlocal] || Spiceweasel::Config[:extractjson] || Spiceweasel::Config[:extractyaml]
|
173
178
|
manifest = Spiceweasel::ExtractLocal.parse_objects
|
174
179
|
else
|
175
|
-
manifest = parse_and_validate_input(
|
180
|
+
manifest = parse_and_validate_input(get_manifest())
|
176
181
|
if Spiceweasel::Config[:clusterfile]
|
177
182
|
# if we have a cluster file, override any nodes or clusters in the original manifest
|
178
183
|
manifest['nodes'] = manifest['clusters'] = {}
|
@@ -296,6 +301,17 @@ module Spiceweasel
|
|
296
301
|
output
|
297
302
|
end
|
298
303
|
|
304
|
+
# find the .rb/.json/.yml file from the ARGV that isn't the clusterfile
|
305
|
+
def get_manifest()
|
306
|
+
ARGV.each do |arg|
|
307
|
+
if arg =~ /\.json$|\.rb$|\.yml$/
|
308
|
+
unless ARGV[ARGV.find_index(arg)-1].eql?('--cluster-file')
|
309
|
+
return arg
|
310
|
+
end
|
311
|
+
end
|
312
|
+
end
|
313
|
+
end
|
314
|
+
|
299
315
|
def process_manifest(manifest)
|
300
316
|
berksfile = Berksfile.new(manifest['berksfile']) if manifest.include?('berksfile')
|
301
317
|
if berksfile
|
data/lib/spiceweasel/clusters.rb
CHANGED
@@ -46,7 +46,11 @@ module Spiceweasel
|
|
46
46
|
# let's reuse the Nodes logic
|
47
47
|
nodes = Spiceweasel::Nodes.new(cluster[environment], cookbooks, environments, roles, knifecommands)
|
48
48
|
@create.concat(nodes.create)
|
49
|
-
|
49
|
+
#what about providers??
|
50
|
+
nodes.delete.each do |del|
|
51
|
+
@delete << del unless del.to_s =~ /^knife client|^knife node/
|
52
|
+
end
|
53
|
+
@delete << "for N in $(knife node list -E #{environment}); do knife client delete $N -y; knife node delete $N -y; done"
|
50
54
|
end
|
51
55
|
|
52
56
|
def validate_environment(options, cluster, environments)
|
data/lib/spiceweasel/nodes.rb
CHANGED
@@ -21,7 +21,7 @@ module Spiceweasel
|
|
21
21
|
|
22
22
|
include CommandHelper
|
23
23
|
|
24
|
-
PROVIDERS = %w{bluebox clodo cs ec2 gandi hp joyent kvm lxc openstack rackspace slicehost terremark vagrant voxel vsphere}
|
24
|
+
PROVIDERS = %w{bluebox clodo cs digital_ocean ec2 gandi google hp joyent kvm linode lxc openstack rackspace slicehost terremark vagrant voxel vsphere}
|
25
25
|
|
26
26
|
attr_reader :create, :delete
|
27
27
|
|
@@ -53,14 +53,13 @@ module Spiceweasel
|
|
53
53
|
end
|
54
54
|
if Spiceweasel::Config[:chefclient]
|
55
55
|
chefclient.push(process_chef_client(names, options, run_list))
|
56
|
+
elsif Spiceweasel::Config[:node_only]
|
57
|
+
process_nodes_only(names, options, run_list, create_command_options)
|
56
58
|
else #create/delete
|
57
59
|
#provider support
|
58
60
|
if PROVIDERS.member?(names[0])
|
59
|
-
count = 1
|
60
|
-
|
61
|
-
count = names[1]
|
62
|
-
end
|
63
|
-
process_providers(names[0], count, node[name]['name'], options, run_list, create_command_options, knifecommands)
|
61
|
+
count = names.length == 2 ? names[1] : 1
|
62
|
+
process_providers(names, count, node[name]['name'], options, run_list, create_command_options, knifecommands)
|
64
63
|
elsif names[0].start_with?("windows_")
|
65
64
|
#windows node bootstrap support
|
66
65
|
protocol = names.shift.split('_') #split on 'windows_ssh' etc
|
@@ -92,7 +91,8 @@ module Spiceweasel
|
|
92
91
|
delete_command("knife node#{Spiceweasel::Config[:knife_options]} bulk delete .* -y")
|
93
92
|
end
|
94
93
|
#remove repeats in chefclient and push into create_command
|
95
|
-
chefclient.flatten.each_with_index {|x,i| create_command(x, create_command_options) unless x.eql?(chefclient[i-1])}
|
94
|
+
chefclient.flatten.each_with_index {|x,i| create_command(x, create_command_options) unless x.eql?(chefclient[i-1])} if Spiceweasel::Config[:chefclient]
|
95
|
+
#nodeonly
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
@@ -131,48 +131,124 @@ module Spiceweasel
|
|
131
131
|
end
|
132
132
|
end
|
133
133
|
|
134
|
+
# handle --nodes-only
|
135
|
+
def process_nodes_only(names, options, run_list, create_command_options)
|
136
|
+
nodenames = []
|
137
|
+
if PROVIDERS.member?(names[0])
|
138
|
+
count = names.length == 2 ? names[1] : 1
|
139
|
+
options.split().each do |opt|
|
140
|
+
if opt =~ /^-N|^--node-name/
|
141
|
+
optname = opt.sub(/-N|--node-name/,'').lstrip
|
142
|
+
optname = options.split[options.split.find_index(opt)+1] if optname.empty?
|
143
|
+
count.to_i.times do |i|
|
144
|
+
nodenames.push(optname.gsub(/\{\{n\}\}/, (i + 1).to_s))
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
elsif names[0].start_with?("windows_")
|
149
|
+
nodenames.push(names[1..-1])
|
150
|
+
else #standard nodes
|
151
|
+
nodenames.push(names)
|
152
|
+
end
|
153
|
+
nodenames.flatten.each do |node|
|
154
|
+
if File.directory?("nodes/")
|
155
|
+
if File.exists?("nodes/#{node}.json")
|
156
|
+
validate_node_file(node) unless Spiceweasel::Config[:novalidation]
|
157
|
+
servercommand = "knife node from file #{node}.json #{Spiceweasel::Config[:knife_options]}".rstrip
|
158
|
+
else
|
159
|
+
STDERR.puts "'nodes/#{node}.json' not found, unable to validate or load node. Using 'knife node create' instead."
|
160
|
+
servercommand = "knife node create -d #{node} #{Spiceweasel::Config[:knife_options]}".rstrip
|
161
|
+
end
|
162
|
+
else
|
163
|
+
STDERR.puts "'nodes' directory not found, unable to validate or load nodes. Using 'knife node create' instead."
|
164
|
+
servercommand = "knife node create -d #{node} #{Spiceweasel::Config[:knife_options]}".rstrip
|
165
|
+
end
|
166
|
+
create_command(servercommand, create_command_options)
|
167
|
+
create_command("knife node run_list set #{node} '#{run_list}'", create_command_options) unless run_list.empty?
|
168
|
+
delete_command("knife node#{Spiceweasel::Config[:knife_options]} delete #{node} -y")
|
169
|
+
delete_command("knife client#{Spiceweasel::Config[:knife_options]} delete #{node} -y")
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
# validate individual node files
|
174
|
+
def validate_node_file(name)
|
175
|
+
# read in the file
|
176
|
+
node = Chef::JSONCompat.from_json(IO.read("nodes/#{name}.json"))
|
177
|
+
# check the node name vs. contents of the file
|
178
|
+
if(node['name'] != name)
|
179
|
+
STDERR.puts "ERROR: Node '#{name}' listed in the manifest does not match the name '#{node['name']}' within the nodes/#{name}.json file."
|
180
|
+
exit(-1)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
134
184
|
#manage all the provider logic
|
135
|
-
def process_providers(
|
136
|
-
|
185
|
+
def process_providers(names, count, name, options, run_list, create_command_options, knifecommands)
|
186
|
+
provider = names[0]
|
187
|
+
validate_provider(provider, names, count, options, knifecommands) unless Spiceweasel::Config[:novalidation]
|
137
188
|
provided_names = []
|
138
|
-
if
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
189
|
+
if name.nil? && options.split.index('-N') #pull this out for deletes
|
190
|
+
name = options.split[options.split.index('-N')+1]
|
191
|
+
count.to_i.times {|i| provided_names << name.gsub('{{n}}', (i + 1).to_s)} if name
|
192
|
+
end
|
193
|
+
# google can have names or numbers
|
194
|
+
if provider.eql?('google') && names[1].to_i == 0
|
195
|
+
names[1..-1].each do |gname|
|
196
|
+
server = "knife google#{Spiceweasel::Config[:knife_options]} server create #{gname} #{options}"
|
197
|
+
server += " -r '#{run_list}'" unless run_list.empty?
|
198
|
+
create_command(server, create_command_options)
|
199
|
+
provided_names << gname
|
146
200
|
end
|
147
|
-
parallel += " -r '#{run_list}'" unless run_list.empty?
|
148
|
-
parallel += "\""
|
149
|
-
create_command(parallel, create_command_options)
|
150
201
|
else
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
202
|
+
if Spiceweasel::Config[:parallel]
|
203
|
+
parallel = "seq #{count} | parallel -u -j 0 -v \""
|
204
|
+
if provider.eql?('vsphere')
|
205
|
+
parallel += "knife #{provider}#{Spiceweasel::Config[:knife_options]} vm clone #{options}".gsub(/\{\{n\}\}/, '{}')
|
206
|
+
elsif provider.eql?('kvm')
|
207
|
+
parallel += "knife #{provider}#{Spiceweasel::Config[:knife_options]} vm create #{options}".gsub(/\{\{n\}\}/, '{}')
|
208
|
+
elsif provider.eql?('digital_ocean')
|
209
|
+
parallel += "knife #{provider}#{Spiceweasel::Config[:knife_options]} droplet create #{options}".gsub(/\{\{n\}\}/, '{}')
|
210
|
+
elsif provider.eql?('google')
|
211
|
+
parallel += "knife #{provider}#{Spiceweasel::Config[:knife_options]} server create #{name} #{options}".gsub(/\{\{n\}\}/, '{}')
|
156
212
|
else
|
157
|
-
|
213
|
+
parallel += "knife #{provider}#{Spiceweasel::Config[:knife_options]} server create #{options}".gsub(/\{\{n\}\}/, '{}')
|
214
|
+
end
|
215
|
+
parallel += " -r '#{run_list}'" unless run_list.empty?
|
216
|
+
parallel += "\""
|
217
|
+
create_command(parallel, create_command_options)
|
218
|
+
else
|
219
|
+
count.to_i.times do |i|
|
220
|
+
if provider.eql?('vsphere')
|
221
|
+
server = "knife #{provider}#{Spiceweasel::Config[:knife_options]} vm clone #{options}".gsub(/\{\{n\}\}/, (i + 1).to_s)
|
222
|
+
elsif provider.eql?('kvm')
|
223
|
+
server = "knife #{provider}#{Spiceweasel::Config[:knife_options]} vm create #{options}".gsub(/\{\{n\}\}/, (i + 1).to_s)
|
224
|
+
elsif provider.eql?('digital_ocean')
|
225
|
+
server = "knife #{provider}#{Spiceweasel::Config[:knife_options]} droplet create #{options}".gsub(/\{\{n\}\}/, (i + 1).to_s)
|
226
|
+
elsif provider.eql?('google')
|
227
|
+
server = "knife #{provider}#{Spiceweasel::Config[:knife_options]} server create #{name} #{options}".gsub(/\{\{n\}\}/, (i + 1).to_s)
|
228
|
+
else
|
229
|
+
server = "knife #{provider}#{Spiceweasel::Config[:knife_options]} server create #{options}".gsub(/\{\{n\}\}/, (i + 1).to_s)
|
230
|
+
end
|
231
|
+
server += " -r '#{run_list}'" unless run_list.empty?
|
232
|
+
create_command(server, create_command_options)
|
158
233
|
end
|
159
|
-
server += " -r '#{run_list}'" unless run_list.empty?
|
160
|
-
provided_names << name.gsub('{{n}}', (i + 1).to_s) if name
|
161
|
-
create_command(server, create_command_options)
|
162
234
|
end
|
163
235
|
end
|
164
|
-
if Spiceweasel::Config[:bulkdelete] && provided_names.empty?
|
236
|
+
if Spiceweasel::Config[:bulkdelete] && provided_names.empty?
|
165
237
|
if ['kvm','vsphere'].member?(provider)
|
166
238
|
delete_command("knife node#{Spiceweasel::Config[:knife_options]} list | xargs knife #{provider} vm delete -y")
|
239
|
+
elsif ['digital_ocean'].member?(provider)
|
240
|
+
delete_command("knife node#{Spiceweasel::Config[:knife_options]} list | xargs knife #{provider} droplet destroy -y")
|
167
241
|
else
|
168
242
|
delete_command("knife node#{Spiceweasel::Config[:knife_options]} list | xargs knife #{provider} server delete -y")
|
169
243
|
end
|
170
244
|
else
|
171
245
|
provided_names.each do |p_name|
|
172
246
|
if ['kvm','vsphere'].member?(provider)
|
173
|
-
delete_command("knife #{provider} vm delete
|
247
|
+
delete_command("knife #{provider} vm delete #{p_name} -y")
|
248
|
+
elsif ['digital_ocean'].member?(provider)
|
249
|
+
delete_command("knife #{provider} droplet destroy #{p_name} -y")
|
174
250
|
else
|
175
|
-
delete_command("knife #{provider} server delete
|
251
|
+
delete_command("knife #{provider} server delete #{p_name} -y")
|
176
252
|
end
|
177
253
|
delete_command("knife node#{Spiceweasel::Config[:knife_options]} delete #{p_name} -y")
|
178
254
|
delete_command("knife client#{Spiceweasel::Config[:knife_options]} delete #{p_name} -y")
|
@@ -181,11 +257,17 @@ module Spiceweasel
|
|
181
257
|
end
|
182
258
|
|
183
259
|
#check that the knife plugin is installed
|
184
|
-
def validate_provider(provider, knifecommands)
|
260
|
+
def validate_provider(provider, names, count, options, knifecommands)
|
185
261
|
unless knifecommands.index {|x| x.start_with?("knife #{provider}")}
|
186
262
|
STDERR.puts "ERROR: 'knife #{provider}' is not a currently installed plugin for knife."
|
187
263
|
exit(-1)
|
188
264
|
end
|
265
|
+
if provider.eql?('google')
|
266
|
+
if names[1].to_i != 0 && !options.split.member?('-N')
|
267
|
+
STDERR.puts "ERROR: 'knife google' currently requires providing a name. Please use -N within the options."
|
268
|
+
exit(-1)
|
269
|
+
end
|
270
|
+
end
|
189
271
|
end
|
190
272
|
|
191
273
|
def process_chef_client(names, options, run_list)
|
@@ -300,8 +382,7 @@ module Spiceweasel
|
|
300
382
|
if opt =~ /^-N$|^--node-name$/
|
301
383
|
value = '-N'
|
302
384
|
else
|
303
|
-
opt.sub!(/-N/,'') if opt =~ /^-N/
|
304
|
-
opt.sub!(/--node-name/,'') if opt =~ /^--node-name/
|
385
|
+
opt.sub!(/-N|--node-name/,'') if opt =~ /^-N|^--node-name/
|
305
386
|
names = [opt.gsub(/{{n}}/, '*')]
|
306
387
|
value = nil
|
307
388
|
end
|
data/lib/spiceweasel/version.rb
CHANGED
@@ -20,11 +20,11 @@ knife ssh 'chef_environment:amazon and role:webserver and recipe:mysql\\:\\:clie
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it "test chef-client in 2.5, json" do
|
23
|
-
`#{@spiceweasel_binary} --
|
23
|
+
`#{@spiceweasel_binary} --chef-client examples/example.json --novalidation`.should == @expected_output
|
24
24
|
end
|
25
25
|
|
26
26
|
it "test chef-client in 2.5, rb" do
|
27
|
-
`#{@spiceweasel_binary} --novalidation --chef-client
|
27
|
+
`#{@spiceweasel_binary} examples/example.rb --novalidation --chef-client`.should == @expected_output
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -47,11 +47,11 @@ knife ssh 'chef_environment:qa and role:webserver and recipe:mysql\\:\\:client'
|
|
47
47
|
end
|
48
48
|
|
49
49
|
it "test chef-client with --cluster-file in 2.5, json" do
|
50
|
-
`#{@spiceweasel_binary} --
|
50
|
+
`#{@spiceweasel_binary} --cluster-file examples/cluster-file-example.yml --novalidation examples/example.json --chef-client`.should == @expected_output
|
51
51
|
end
|
52
52
|
|
53
53
|
it "test chef-client with --cluster-file in 2.5, rb" do
|
54
|
-
`#{@spiceweasel_binary} --novalidation --chef-client --cluster-file examples/cluster-file-example.yml
|
54
|
+
`#{@spiceweasel_binary} --novalidation --chef-client examples/example.rb --cluster-file examples/cluster-file-example.yml`.should == @expected_output
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
@@ -0,0 +1,105 @@
|
|
1
|
+
describe 'testing 2.6 google' do
|
2
|
+
before(:each) do
|
3
|
+
@expected_output = <<-OUTPUT
|
4
|
+
knife cookbook delete apache2 -a -y
|
5
|
+
knife environment delete qa -y
|
6
|
+
knife role delete base -y
|
7
|
+
knife role delete webserver -y
|
8
|
+
knife google server delete gmas1 -y
|
9
|
+
knife node delete gmas1 -y
|
10
|
+
knife client delete gmas1 -y
|
11
|
+
knife google server delete gdef1 -y
|
12
|
+
knife node delete gdef1 -y
|
13
|
+
knife client delete gdef1 -y
|
14
|
+
knife google server delete gdef2 -y
|
15
|
+
knife node delete gdef2 -y
|
16
|
+
knife client delete gdef2 -y
|
17
|
+
knife google server delete aaa -y
|
18
|
+
knife node delete aaa -y
|
19
|
+
knife client delete aaa -y
|
20
|
+
knife google server delete bbb -y
|
21
|
+
knife node delete bbb -y
|
22
|
+
knife client delete bbb -y
|
23
|
+
knife google server delete ccc -y
|
24
|
+
knife node delete ccc -y
|
25
|
+
knife client delete ccc -y
|
26
|
+
knife google server delete foo -y
|
27
|
+
knife google server delete bar -y
|
28
|
+
knife google server delete g-qa1 -y
|
29
|
+
knife google server delete g-qa2 -y
|
30
|
+
for N in $(knife node list -E qa); do knife client delete $N -y; knife node delete $N -y; done
|
31
|
+
knife cookbook upload apache2
|
32
|
+
knife environment from file qa.rb
|
33
|
+
knife role from file base.rb webserver.rb
|
34
|
+
knife google server create gmas1 -m n1-standard-1 -I debian-7-wheezy-v20130723 -Z us-central2-a -i ~/.ssh/id_rsa -x jdoe -N gmas1 -r 'role[base]'
|
35
|
+
knife google server create gdef1 -m n1-standard-1 -I debian-7-wheezy-v20130723 -Z us-central2-a -i ~/.ssh/id_rsa -x jdoe -N gdef1 -r 'role[base]'
|
36
|
+
knife google server create gdef2 -m n1-standard-1 -I debian-7-wheezy-v20130723 -Z us-central2-a -i ~/.ssh/id_rsa -x jdoe -N gdef2 -r 'role[base]'
|
37
|
+
knife google server create aaa -E qa -m n1-standard-1 -I debian-7-wheezy-v20130723 -Z us-central2-a -i ~/.ssh/id_rsa -x jdoe -r 'role[mysql]'
|
38
|
+
knife google server create bbb -E qa -m n1-standard-1 -I debian-7-wheezy-v20130723 -Z us-central2-a -i ~/.ssh/id_rsa -x jdoe -r 'role[mysql]'
|
39
|
+
knife google server create ccc -E qa -m n1-standard-1 -I debian-7-wheezy-v20130723 -Z us-central2-a -i ~/.ssh/id_rsa -x jdoe -r 'role[mysql]'
|
40
|
+
knife google server create foo -m n1-standard-1 -I debian-7-wheezy-v20130723 -Z us-central2-a -i ~/.ssh/id_rsa -x jdoe -E qa -r 'role[mysql]'
|
41
|
+
knife google server create bar -m n1-standard-1 -I debian-7-wheezy-v20130723 -Z us-central2-a -i ~/.ssh/id_rsa -x jdoe -E qa -r 'role[mysql]'
|
42
|
+
knife google server create g-qa1 -m n1-standard-1 -I debian-7-wheezy-v20130723 -Z us-central2-a -i ~/.ssh/id_rsa -x jdoe -N g-qa1 -E qa -r 'role[mysql]'
|
43
|
+
knife google server create g-qa2 -m n1-standard-1 -I debian-7-wheezy-v20130723 -Z us-central2-a -i ~/.ssh/id_rsa -x jdoe -N g-qa2 -E qa -r 'role[mysql]'
|
44
|
+
OUTPUT
|
45
|
+
|
46
|
+
@spiceweasel_binary = File.join(File.dirname(__FILE__), *%w[.. .. bin spiceweasel])
|
47
|
+
end
|
48
|
+
|
49
|
+
it "test knife-google functionality from 2.6" do
|
50
|
+
`#{@spiceweasel_binary} -r --novalidation examples/google-example.yml`.should == @expected_output
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
describe 'testing 2.6 google --parallel' do
|
56
|
+
before(:each) do
|
57
|
+
@expected_output = <<-OUTPUT
|
58
|
+
knife cookbook delete apache2 -a -y
|
59
|
+
knife environment delete qa -y
|
60
|
+
knife role delete base -y
|
61
|
+
knife role delete webserver -y
|
62
|
+
knife google server delete gmas1 -y
|
63
|
+
knife node delete gmas1 -y
|
64
|
+
knife client delete gmas1 -y
|
65
|
+
knife google server delete gdef1 -y
|
66
|
+
knife node delete gdef1 -y
|
67
|
+
knife client delete gdef1 -y
|
68
|
+
knife google server delete gdef2 -y
|
69
|
+
knife node delete gdef2 -y
|
70
|
+
knife client delete gdef2 -y
|
71
|
+
knife google server delete aaa -y
|
72
|
+
knife node delete aaa -y
|
73
|
+
knife client delete aaa -y
|
74
|
+
knife google server delete bbb -y
|
75
|
+
knife node delete bbb -y
|
76
|
+
knife client delete bbb -y
|
77
|
+
knife google server delete ccc -y
|
78
|
+
knife node delete ccc -y
|
79
|
+
knife client delete ccc -y
|
80
|
+
knife google server delete foo -y
|
81
|
+
knife google server delete bar -y
|
82
|
+
knife google server delete g-qa1 -y
|
83
|
+
knife google server delete g-qa2 -y
|
84
|
+
for N in $(knife node list -E qa); do knife client delete $N -y; knife node delete $N -y; done
|
85
|
+
knife cookbook upload apache2
|
86
|
+
knife environment from file qa.rb
|
87
|
+
knife role from file base.rb webserver.rb
|
88
|
+
seq 1 | parallel -u -j 0 -v "knife google server create gmas{} -m n1-standard-1 -I debian-7-wheezy-v20130723 -Z us-central2-a -i ~/.ssh/id_rsa -x jdoe -N gmas{} -r 'role[base]'"
|
89
|
+
seq 2 | parallel -u -j 0 -v "knife google server create gdef{} -m n1-standard-1 -I debian-7-wheezy-v20130723 -Z us-central2-a -i ~/.ssh/id_rsa -x jdoe -N gdef{} -r 'role[base]'"
|
90
|
+
knife google server create aaa -E qa -m n1-standard-1 -I debian-7-wheezy-v20130723 -Z us-central2-a -i ~/.ssh/id_rsa -x jdoe -r 'role[mysql]'
|
91
|
+
knife google server create bbb -E qa -m n1-standard-1 -I debian-7-wheezy-v20130723 -Z us-central2-a -i ~/.ssh/id_rsa -x jdoe -r 'role[mysql]'
|
92
|
+
knife google server create ccc -E qa -m n1-standard-1 -I debian-7-wheezy-v20130723 -Z us-central2-a -i ~/.ssh/id_rsa -x jdoe -r 'role[mysql]'
|
93
|
+
knife google server create foo -m n1-standard-1 -I debian-7-wheezy-v20130723 -Z us-central2-a -i ~/.ssh/id_rsa -x jdoe -E qa -r 'role[mysql]'
|
94
|
+
knife google server create bar -m n1-standard-1 -I debian-7-wheezy-v20130723 -Z us-central2-a -i ~/.ssh/id_rsa -x jdoe -E qa -r 'role[mysql]'
|
95
|
+
seq 2 | parallel -u -j 0 -v "knife google server create g-qa{} -m n1-standard-1 -I debian-7-wheezy-v20130723 -Z us-central2-a -i ~/.ssh/id_rsa -x jdoe -N g-qa{} -E qa -r 'role[mysql]'"
|
96
|
+
OUTPUT
|
97
|
+
|
98
|
+
@spiceweasel_binary = File.join(File.dirname(__FILE__), *%w[.. .. bin spiceweasel])
|
99
|
+
end
|
100
|
+
|
101
|
+
it "test knife-google functionality from 2.6" do
|
102
|
+
`#{@spiceweasel_binary} --parallel -r --novalidation examples/google-example.yml`.should == @expected_output
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
data/spec/bin/kvm_spec.rb
CHANGED
@@ -8,6 +8,7 @@ knife node delete winboxA -y
|
|
8
8
|
knife client delete winboxA -y
|
9
9
|
knife node delete winboxB -y
|
10
10
|
knife client delete winboxB -y
|
11
|
+
for N in $(knife node list -E qa); do knife client delete $N -y; knife node delete $N -y; done
|
11
12
|
knife cookbook upload apache2
|
12
13
|
knife environment from file qa.rb
|
13
14
|
knife role from file base.rb
|
@@ -0,0 +1,108 @@
|
|
1
|
+
describe 'testing 2.6' do
|
2
|
+
before(:each) do
|
3
|
+
@expected_output = <<-OUTPUT
|
4
|
+
knife node delete serverA -y
|
5
|
+
knife client delete serverA -y
|
6
|
+
knife node delete serverB -y
|
7
|
+
knife client delete serverB -y
|
8
|
+
knife node delete serverC -y
|
9
|
+
knife client delete serverC -y
|
10
|
+
knife linode server delete db1 -y
|
11
|
+
knife node delete db1 -y
|
12
|
+
knife client delete db1 -y
|
13
|
+
knife linode server delete db2 -y
|
14
|
+
knife node delete db2 -y
|
15
|
+
knife client delete db2 -y
|
16
|
+
knife linode server delete db3 -y
|
17
|
+
knife node delete db3 -y
|
18
|
+
knife client delete db3 -y
|
19
|
+
knife node delete winboxA -y
|
20
|
+
knife client delete winboxA -y
|
21
|
+
knife node delete winboxB -y
|
22
|
+
knife client delete winboxB -y
|
23
|
+
knife node delete winboxC -y
|
24
|
+
knife client delete winboxC -y
|
25
|
+
knife digital_ocean droplet destroy DOmysql -y
|
26
|
+
knife digital_ocean droplet destroy DOweb1 -y
|
27
|
+
knife digital_ocean droplet destroy DOweb2 -y
|
28
|
+
knife digital_ocean droplet destroy DOweb3 -y
|
29
|
+
for N in $(knife node list -E digital); do knife client delete $N -y; knife node delete $N -y; done
|
30
|
+
knife bootstrap serverA --identity-file ~/.ssh/mray.pem --ssh-user user --sudo --no-host-key-verify --ssh-port 22 -r 'role[base]'
|
31
|
+
knife bootstrap serverB -E development -i ~/.ssh/mray.pem -x user --sudo -r 'role[base]'
|
32
|
+
knife bootstrap serverC -E development -i ~/.ssh/mray.pem -x user --sudo -r 'role[base]'
|
33
|
+
knife linode server create --image 49 -E qa --flavor 2 -N db1 -r 'recipe[mysql],role[monitoring]'
|
34
|
+
knife linode server create --image 49 -E qa --flavor 2 -N db2 -r 'recipe[mysql],role[monitoring]'
|
35
|
+
knife linode server create --image 49 -E qa --flavor 2 -N db3 -r 'recipe[mysql],role[monitoring]'
|
36
|
+
knife bootstrap windows winrm winboxA -x Administrator -P 'super_secret_password' -r 'role[base],role[iisserver]'
|
37
|
+
knife bootstrap windows ssh winboxB -x Administrator -P 'super_secret_password'
|
38
|
+
knife bootstrap windows ssh winboxC -x Administrator -P 'super_secret_password'
|
39
|
+
knife digital_ocean droplet create -S mray -i ~/.ssh/mray.pem -x ubuntu -I ami-8af0f326 -f m1.medium -N DOmysql -E digital -r 'role[mysql]'
|
40
|
+
knife digital_ocean droplet create -S mray -i ~/.ssh/mray.pem -x ubuntu -I ami-7000f019 -f m1.small -N DOweb1 -E digital -r 'role[webserver],recipe[mysql::client]'
|
41
|
+
knife digital_ocean droplet create -S mray -i ~/.ssh/mray.pem -x ubuntu -I ami-7000f019 -f m1.small -N DOweb2 -E digital -r 'role[webserver],recipe[mysql::client]'
|
42
|
+
knife digital_ocean droplet create -S mray -i ~/.ssh/mray.pem -x ubuntu -I ami-7000f019 -f m1.small -N DOweb3 -E digital -r 'role[webserver],recipe[mysql::client]'
|
43
|
+
OUTPUT
|
44
|
+
@spiceweasel_binary = File.join(File.dirname(__FILE__), *%w[.. .. bin spiceweasel])
|
45
|
+
end
|
46
|
+
|
47
|
+
it "test for cluster deletion and digital_ocean and linode in 2.6" do
|
48
|
+
`#{@spiceweasel_binary} --rebuild --novalidation examples/node-example.yml`.should == @expected_output
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
describe 'testing 2.6 --node-only' do
|
54
|
+
before(:each) do
|
55
|
+
@expected_output = <<-OUTPUT
|
56
|
+
knife node delete serverA -y
|
57
|
+
knife client delete serverA -y
|
58
|
+
knife node delete serverB -y
|
59
|
+
knife client delete serverB -y
|
60
|
+
knife node delete serverC -y
|
61
|
+
knife client delete serverC -y
|
62
|
+
knife node delete db1 -y
|
63
|
+
knife client delete db1 -y
|
64
|
+
knife node delete db2 -y
|
65
|
+
knife client delete db2 -y
|
66
|
+
knife node delete db3 -y
|
67
|
+
knife client delete db3 -y
|
68
|
+
knife node delete winboxA -y
|
69
|
+
knife client delete winboxA -y
|
70
|
+
knife node delete winboxB -y
|
71
|
+
knife client delete winboxB -y
|
72
|
+
knife node delete winboxC -y
|
73
|
+
knife client delete winboxC -y
|
74
|
+
for N in $(knife node list -E digital); do knife client delete $N -y; knife node delete $N -y; done
|
75
|
+
knife node create -d serverA
|
76
|
+
knife node run_list set serverA 'role[base]'
|
77
|
+
knife node create -d serverB
|
78
|
+
knife node run_list set serverB 'role[base]'
|
79
|
+
knife node create -d serverC
|
80
|
+
knife node run_list set serverC 'role[base]'
|
81
|
+
knife node create -d db1
|
82
|
+
knife node run_list set db1 'recipe[mysql],role[monitoring]'
|
83
|
+
knife node create -d db2
|
84
|
+
knife node run_list set db2 'recipe[mysql],role[monitoring]'
|
85
|
+
knife node create -d db3
|
86
|
+
knife node run_list set db3 'recipe[mysql],role[monitoring]'
|
87
|
+
knife node create -d winboxA
|
88
|
+
knife node run_list set winboxA 'role[base],role[iisserver]'
|
89
|
+
knife node create -d winboxB
|
90
|
+
knife node create -d winboxC
|
91
|
+
knife node create -d DOmysql
|
92
|
+
knife node run_list set DOmysql 'role[mysql]'
|
93
|
+
knife node create -d DOweb1
|
94
|
+
knife node run_list set DOweb1 'role[webserver],recipe[mysql::client]'
|
95
|
+
knife node create -d DOweb2
|
96
|
+
knife node run_list set DOweb2 'role[webserver],recipe[mysql::client]'
|
97
|
+
knife node create -d DOweb3
|
98
|
+
knife node run_list set DOweb3 'role[webserver],recipe[mysql::client]'
|
99
|
+
OUTPUT
|
100
|
+
|
101
|
+
@spiceweasel_binary = File.join(File.dirname(__FILE__), *%w[.. .. bin spiceweasel])
|
102
|
+
end
|
103
|
+
|
104
|
+
it "tests node deletion and creation using --node-only" do
|
105
|
+
`#{@spiceweasel_binary} --node-only --rebuild --novalidation examples/node-example.yml`.should == @expected_output
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
@@ -22,12 +22,22 @@ knife node delete serverB -y
|
|
22
22
|
knife client delete serverB -y
|
23
23
|
knife node delete serverC -y
|
24
24
|
knife client delete serverC -y
|
25
|
+
knife rackspace server delete db1 -y
|
26
|
+
knife node delete db1 -y
|
27
|
+
knife client delete db1 -y
|
28
|
+
knife rackspace server delete db2 -y
|
29
|
+
knife node delete db2 -y
|
30
|
+
knife client delete db2 -y
|
31
|
+
knife rackspace server delete db3 -y
|
32
|
+
knife node delete db3 -y
|
33
|
+
knife client delete db3 -y
|
25
34
|
knife node delete winboxA -y
|
26
35
|
knife client delete winboxA -y
|
27
36
|
knife node delete winboxB -y
|
28
37
|
knife client delete winboxB -y
|
29
38
|
knife node delete winboxC -y
|
30
39
|
knife client delete winboxC -y
|
40
|
+
for N in $(knife node list -E amazon); do knife client delete $N -y; knife node delete $N -y; done
|
31
41
|
knife cookbook upload apache2
|
32
42
|
knife cookbook upload apt --freeze
|
33
43
|
knife cookbook upload mysql ntp
|
@@ -97,7 +107,15 @@ knife node delete serverB -y
|
|
97
107
|
knife client delete serverB -y
|
98
108
|
knife node delete serverC -y
|
99
109
|
knife client delete serverC -y
|
100
|
-
knife
|
110
|
+
knife rackspace server delete db1 -y
|
111
|
+
knife node delete db1 -y
|
112
|
+
knife client delete db1 -y
|
113
|
+
knife rackspace server delete db2 -y
|
114
|
+
knife node delete db2 -y
|
115
|
+
knife client delete db2 -y
|
116
|
+
knife rackspace server delete db3 -y
|
117
|
+
knife node delete db3 -y
|
118
|
+
knife client delete db3 -y
|
101
119
|
knife node delete winboxA -y
|
102
120
|
knife client delete winboxA -y
|
103
121
|
knife node delete winboxB -y
|
@@ -105,9 +123,7 @@ knife client delete winboxB -y
|
|
105
123
|
knife node delete winboxC -y
|
106
124
|
knife client delete winboxC -y
|
107
125
|
knife node bulk delete .* -y
|
108
|
-
knife node list
|
109
|
-
knife node list | xargs knife ec2 server delete -y
|
110
|
-
knife node bulk delete .* -y
|
126
|
+
for N in $(knife node list -E amazon); do knife client delete $N -y; knife node delete $N -y; done
|
111
127
|
OUTPUT
|
112
128
|
|
113
129
|
@spiceweasel_binary = File.join(File.dirname(__FILE__), *%w[.. .. bin spiceweasel])
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spiceweasel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Ray
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-07
|
11
|
+
date: 2013-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yajl-ruby
|
@@ -180,9 +180,11 @@ files:
|
|
180
180
|
- lib/spiceweasel/version.rb
|
181
181
|
- lib/spiceweasel.rb
|
182
182
|
- spec/bin/chef_client_spec.rb
|
183
|
+
- spec/bin/google_spec.rb
|
183
184
|
- spec/bin/joyent-vsphere_spec.rb
|
184
185
|
- spec/bin/knife_spec.rb
|
185
186
|
- spec/bin/kvm_spec.rb
|
187
|
+
- spec/bin/node_spec.rb
|
186
188
|
- spec/bin/spiceweasel_spec.rb
|
187
189
|
homepage: https://github.com/mattray/spiceweasel
|
188
190
|
licenses:
|
@@ -210,7 +212,9 @@ specification_version: 4
|
|
210
212
|
summary: CLI for generating Chef knife commands from a simple JSON or YAML file.
|
211
213
|
test_files:
|
212
214
|
- spec/bin/chef_client_spec.rb
|
215
|
+
- spec/bin/google_spec.rb
|
213
216
|
- spec/bin/joyent-vsphere_spec.rb
|
214
217
|
- spec/bin/knife_spec.rb
|
215
218
|
- spec/bin/kvm_spec.rb
|
219
|
+
- spec/bin/node_spec.rb
|
216
220
|
- spec/bin/spiceweasel_spec.rb
|