knife-xenserver 1.2.3 → 1.3.1
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 +7 -0
- data/CHANGELOG.md +14 -0
- data/lib/chef/knife/xenserver_host_list.rb +41 -0
- data/lib/chef/knife/xenserver_sr_create.rb +99 -0
- data/lib/chef/knife/xenserver_sr_list.rb +72 -0
- data/lib/chef/knife/xenserver_vm_create.rb +75 -10
- data/lib/knife-xenserver/version.rb +1 -1
- metadata +30 -40
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0a21012f437a6b7241b41a04ae171ce86c27ed40
|
4
|
+
data.tar.gz: 625142e1c88af7d2268efd3dd823cdaa7e83969a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 97caa51eb4b6bbf79f02f25cf3576b5ccd30a416c2d795954e586c5007987dd73c92e06a3f92c902f1a7d482d43e2ac94e5378230f1d1c48d929805a031484f5
|
7
|
+
data.tar.gz: b68b1bddf3c70ca6862af78b388ac6acc58f6ca16c9a2093fbd626a1dd5a3ea7f826ce524a76b6245855c8b2a75a4fe41f010beda448b02db6eb910c687ca756
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
# 1.3.1 - Thy 06 Jun 2013
|
2
|
+
|
3
|
+
* Fixing some --extra-vdis parsing issues
|
4
|
+
* Fix nasty bug while trying to roll back destroying the created VM
|
5
|
+
|
6
|
+
# 1.3.0 - Thy 06 Jun 2013
|
7
|
+
|
8
|
+
* New **sr list** command to list storage repositories.
|
9
|
+
* Experimental **sr create** command to create a Storage Repository.
|
10
|
+
* The **vm create** command now supports --extra-vdis option to
|
11
|
+
create additional VDIs and attach them to the VM.
|
12
|
+
* New **host list** command: currently lists UUID only.
|
13
|
+
|
14
|
+
|
1
15
|
# 1.2.3 - Fri 07 Dec 2012
|
2
16
|
|
3
17
|
* Drop alchemist gem, fixing some compat issues with some ruby 1.9
|
@@ -0,0 +1,41 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Sergio Rubio (<rubiojr@frameos.org>)
|
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/knife/xenserver_base'
|
19
|
+
|
20
|
+
class Chef
|
21
|
+
class Knife
|
22
|
+
class XenserverHostList < Knife
|
23
|
+
|
24
|
+
include Knife::XenserverBase
|
25
|
+
|
26
|
+
banner "knife xenserver host list (options)"
|
27
|
+
|
28
|
+
def run
|
29
|
+
hosts = connection.hosts
|
30
|
+
table = table do |t|
|
31
|
+
t.headings = %w{NAME UUID}
|
32
|
+
hosts.each do |host|
|
33
|
+
t << [host.name, host.uuid]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
puts table if !hosts.empty?
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Sergio Rubio (<rubiojr@frameos.org>)
|
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/knife/xenserver_base'
|
19
|
+
require 'resolv'
|
20
|
+
|
21
|
+
class Chef
|
22
|
+
class Knife
|
23
|
+
class XenserverSrCreate < Knife
|
24
|
+
|
25
|
+
include Knife::XenserverBase
|
26
|
+
|
27
|
+
banner "knife xenserver sr create (options)"
|
28
|
+
|
29
|
+
option :sr_name,
|
30
|
+
:long => "--sr-name NAME",
|
31
|
+
:description => "The Storage Repository name"
|
32
|
+
|
33
|
+
option :sr_type,
|
34
|
+
:long => "--sr-type TYPE",
|
35
|
+
:description => "The Storage Repository type (ext|lvm)"
|
36
|
+
|
37
|
+
option :sr_device,
|
38
|
+
:long => "--sr-device PATH",
|
39
|
+
:description => "Block device path in host"
|
40
|
+
|
41
|
+
option :sr_host,
|
42
|
+
:long => "--sr-host UUID",
|
43
|
+
:description => "Host where the Storage Repository will be created"
|
44
|
+
|
45
|
+
def run
|
46
|
+
sr_name = config[:sr_name]
|
47
|
+
if not sr_name
|
48
|
+
ui.error("Invalid Storage Repository name (--sr-name)")
|
49
|
+
exit 1
|
50
|
+
end
|
51
|
+
|
52
|
+
sr_type = config[:sr_type]
|
53
|
+
if not sr_type
|
54
|
+
ui.error("Invalid Storage Repository type (--sr-type)")
|
55
|
+
exit 1
|
56
|
+
end
|
57
|
+
|
58
|
+
sr_device = config[:sr_device]
|
59
|
+
if not sr_device
|
60
|
+
ui.error("Invalid Storage Repository device (--sr-device)")
|
61
|
+
exit 1
|
62
|
+
end
|
63
|
+
|
64
|
+
hosts = connection.hosts
|
65
|
+
sr_host = config[:sr_host]
|
66
|
+
if sr_host.nil? and hosts.size > 1
|
67
|
+
if not sr_host
|
68
|
+
ui.error("More than one host found in the pool.")
|
69
|
+
ui.error("--sr-host parameter is mandatory")
|
70
|
+
exit 1
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
if sr_host
|
75
|
+
# Find the host in the pool
|
76
|
+
host = connection.hosts.find { |h| h.uuid == sr_host }
|
77
|
+
else
|
78
|
+
# We only have one hosts
|
79
|
+
host = hosts.first
|
80
|
+
end
|
81
|
+
|
82
|
+
# The given host was not found in the pool
|
83
|
+
if host.nil?
|
84
|
+
ui.error "Host #{sr_host} not found in the pool"
|
85
|
+
exit 1
|
86
|
+
end
|
87
|
+
|
88
|
+
dconfig = { :device => sr_device }
|
89
|
+
puts "Creating SR #{sr_name.yellow} in host #{host.name} (#{sr_type}, #{sr_device})..."
|
90
|
+
vm = connection.storage_repositories.create :name => sr_name,
|
91
|
+
:host => host,
|
92
|
+
:device_config => dconfig,
|
93
|
+
:type => sr_type
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Sergio Rubio (<rubiojr@frameos.org>)
|
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/knife/xenserver_base'
|
19
|
+
|
20
|
+
class Chef
|
21
|
+
class Knife
|
22
|
+
class XenserverSrList < Knife
|
23
|
+
|
24
|
+
include Knife::XenserverBase
|
25
|
+
|
26
|
+
banner "knife xenserver sr list (options)"
|
27
|
+
|
28
|
+
option :sr_type,
|
29
|
+
:long => "--sr-types",
|
30
|
+
:description => "List only the types specified (comma separated types)",
|
31
|
+
:default => 'ext,lvm'
|
32
|
+
|
33
|
+
option :numeric_utilisation,
|
34
|
+
:long => "--[no-]numeric-utilisation",
|
35
|
+
:description => "Print SR utilisation in bytes",
|
36
|
+
:default => false,
|
37
|
+
:boolean => true
|
38
|
+
|
39
|
+
def run
|
40
|
+
# Finding the current host (the one we used to get the connection)
|
41
|
+
#xshost = config[:xenserver_host] || Chef::Config[:knife][:xenserver_host]
|
42
|
+
#address = Resolv.getaddress xshost
|
43
|
+
#host = connection.hosts.find { |h| h.address == address }
|
44
|
+
|
45
|
+
# Storage Repositories belong to the pool,
|
46
|
+
# There's no way to list host storage repositories AFAIK
|
47
|
+
repositories = connection.storage_repositories
|
48
|
+
table = table do |t|
|
49
|
+
t.headings = %w{NAME TYPE UTILISATION UUID}
|
50
|
+
valid_types = config[:sr_type].split(',').map { |t| t.strip }
|
51
|
+
repositories.each do |sr|
|
52
|
+
# we only list LVM and EXT repositories by default
|
53
|
+
next unless valid_types.include? sr.type
|
54
|
+
if config[:numeric_utilisation]
|
55
|
+
utilisation = sr.physical_utilisation
|
56
|
+
else
|
57
|
+
if sr.physical_size.to_i > 0
|
58
|
+
utilisation = (sr.physical_utilisation.to_i * 100)/sr.physical_size.to_f * 100
|
59
|
+
utilisation = "%.2f%" % utilisation
|
60
|
+
else
|
61
|
+
utilisation = "100%"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
t << [sr.name, sr.type, utilisation, sr.uuid]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
puts table if !repositories.empty?
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -158,6 +158,10 @@ class Chef
|
|
158
158
|
:long => '--vm-domain DOMAIN',
|
159
159
|
:description => 'DOMAIN of host to set in xenstore'
|
160
160
|
|
161
|
+
option :extra_vdis,
|
162
|
+
:long => '--extra-vdis "SR name":size1[,"SR NAME":size2,..]',
|
163
|
+
:description => 'Create and attach additional VDIs (size in MB)'
|
164
|
+
|
161
165
|
def tcp_test_ssh(hostname)
|
162
166
|
tcp_socket = TCPSocket.new(hostname, 22)
|
163
167
|
readable = IO.select([tcp_socket], nil, nil, 5)
|
@@ -181,14 +185,12 @@ class Chef
|
|
181
185
|
$stdout.sync = true
|
182
186
|
|
183
187
|
unless config[:vm_template]
|
184
|
-
|
185
|
-
exit 1
|
188
|
+
raise "You have not provided a valid template name. (--vm-template)"
|
186
189
|
end
|
187
190
|
|
188
191
|
vm_name = config[:vm_name]
|
189
192
|
if not vm_name
|
190
|
-
|
191
|
-
exit 1
|
193
|
+
raise "Invalid Virtual Machine name (--vm-name)"
|
192
194
|
end
|
193
195
|
|
194
196
|
unless config[:vm_gateway]
|
@@ -207,8 +209,7 @@ class Chef
|
|
207
209
|
end
|
208
210
|
|
209
211
|
if template.nil?
|
210
|
-
|
211
|
-
exit 1
|
212
|
+
raise "Template #{config[:vm_template]} not found."
|
212
213
|
end
|
213
214
|
|
214
215
|
puts "Creating VM #{config[:vm_name].yellow}..."
|
@@ -217,6 +218,9 @@ class Chef
|
|
217
218
|
vm = connection.servers.new :name => config[:vm_name],
|
218
219
|
:template_name => config[:vm_template]
|
219
220
|
vm.save :auto_start => false
|
221
|
+
# Useful for the global exception handler
|
222
|
+
@created_vm = vm
|
223
|
+
|
220
224
|
if not config[:keep_template_networks]
|
221
225
|
vm.vifs.each do |vif|
|
222
226
|
vif.destroy
|
@@ -246,7 +250,10 @@ class Chef
|
|
246
250
|
if config[:vm_tags]
|
247
251
|
vm.set_attribute 'tags', config[:vm_tags].split(',')
|
248
252
|
end
|
253
|
+
|
249
254
|
vm.provision
|
255
|
+
# Create additional VDIs (virtual disks)
|
256
|
+
create_extra_vdis(vm)
|
250
257
|
vm.start
|
251
258
|
vm.reload
|
252
259
|
|
@@ -287,8 +294,7 @@ class Chef
|
|
287
294
|
timeout -= 1
|
288
295
|
if timeout == 0
|
289
296
|
puts
|
290
|
-
|
291
|
-
exit 1
|
297
|
+
raise "Timeout trying to reach the VM. Couldn't find the IP address."
|
292
298
|
end
|
293
299
|
end
|
294
300
|
print "\n#{ui.color("Waiting for sshd... ", :magenta)}"
|
@@ -332,6 +338,66 @@ class Chef
|
|
332
338
|
bootstrap.config[:ssh_password] = config[:ssh_password]
|
333
339
|
bootstrap
|
334
340
|
end
|
341
|
+
|
342
|
+
def create_extra_vdis(vm)
|
343
|
+
# Return if no extra VDIs were specified
|
344
|
+
return unless config[:extra_vdis]
|
345
|
+
count = 0
|
346
|
+
|
347
|
+
vdis = config[:extra_vdis].strip.chomp.split(',')
|
348
|
+
vdis.each do |vdi|
|
349
|
+
count += 1
|
350
|
+
# if options is "Storage Repository":size
|
351
|
+
if vdi =~ /.*:.*/
|
352
|
+
sr, size = vdi.split(':')
|
353
|
+
else #only size was specified
|
354
|
+
sr = nil
|
355
|
+
size = vdi
|
356
|
+
end
|
357
|
+
unless size =~ /^\d+$/
|
358
|
+
raise "Invalid VDI size. Not numeric."
|
359
|
+
end
|
360
|
+
# size in bytes
|
361
|
+
bsize = size.to_i * 1024 * 1024
|
362
|
+
|
363
|
+
# If the storage repository has been omitted,
|
364
|
+
# use the default SR from the first pool, othewise
|
365
|
+
# find the SR required
|
366
|
+
if sr.nil?
|
367
|
+
sr = connection.pools.first.default_sr
|
368
|
+
ui.warn "No storage repository defined for extra VDI #{count}."
|
369
|
+
ui.warn "Using default SR from Pool: #{sr.name}"
|
370
|
+
else
|
371
|
+
found = connection.storage_repositories.find { |s| s.name == sr }
|
372
|
+
unless found
|
373
|
+
raise "Storage Repository #{sr} not available"
|
374
|
+
end
|
375
|
+
sr = found
|
376
|
+
end
|
377
|
+
|
378
|
+
# Name of the VDI
|
379
|
+
name = "#{config[:vm_name]}-extra-vdi-#{count}"
|
380
|
+
|
381
|
+
puts "Creating extra VDI (#{size} MB, #{name}, #{sr.name || 'Default SR'})"
|
382
|
+
vdi = connection.vdis.create :name => name,
|
383
|
+
:storage_repository => sr,
|
384
|
+
:description => name,
|
385
|
+
:virtual_size => bsize.to_s
|
386
|
+
|
387
|
+
begin
|
388
|
+
# Attach the VBD
|
389
|
+
connection.vbds.create :server => vm,
|
390
|
+
:vdi => vdi,
|
391
|
+
:userdevice => count.to_s,
|
392
|
+
:bootable => false
|
393
|
+
rescue => e
|
394
|
+
ui.error "Could not attach the VBD to the server"
|
395
|
+
# Try to destroy the VDI
|
396
|
+
vdi.destroy rescue nil
|
397
|
+
raise e
|
398
|
+
end
|
399
|
+
end
|
400
|
+
end
|
335
401
|
|
336
402
|
def create_nics(networks, macs, vm)
|
337
403
|
net_arr = networks.split(/,/).map { |x| { :network => x } }
|
@@ -349,8 +415,7 @@ class Chef
|
|
349
415
|
nics.each do |n|
|
350
416
|
net = networks.find { |net| net.name == n[:network] }
|
351
417
|
if net.nil?
|
352
|
-
|
353
|
-
exit 1
|
418
|
+
raise "Network #{n[:network]} not found"
|
354
419
|
end
|
355
420
|
nic_count += 1
|
356
421
|
c = {
|
metadata
CHANGED
@@ -1,96 +1,85 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knife-xenserver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
version: 1.2.3
|
4
|
+
version: 1.3.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Sergio Rubio
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-06-11 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
|
-
|
14
|
+
name: terminal-table
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
20
|
+
type: :runtime
|
22
21
|
prerelease: false
|
23
22
|
version_requirements: !ruby/object:Gem::Requirement
|
24
|
-
none: false
|
25
23
|
requirements:
|
26
|
-
- -
|
24
|
+
- - '>='
|
27
25
|
- !ruby/object:Gem::Version
|
28
26
|
version: '0'
|
29
|
-
name: terminal-table
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
|
-
|
28
|
+
name: chef
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0.10'
|
34
|
+
type: :runtime
|
38
35
|
prerelease: false
|
39
36
|
version_requirements: !ruby/object:Gem::Requirement
|
40
|
-
none: false
|
41
37
|
requirements:
|
42
|
-
- -
|
38
|
+
- - '>='
|
43
39
|
- !ruby/object:Gem::Version
|
44
40
|
version: '0.10'
|
45
|
-
name: chef
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
|
-
|
42
|
+
name: fog
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '1.4'
|
48
|
+
type: :runtime
|
54
49
|
prerelease: false
|
55
50
|
version_requirements: !ruby/object:Gem::Requirement
|
56
|
-
none: false
|
57
51
|
requirements:
|
58
|
-
- -
|
52
|
+
- - '>='
|
59
53
|
- !ruby/object:Gem::Version
|
60
54
|
version: '1.4'
|
61
|
-
name: fog
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
|
-
|
56
|
+
name: colored
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - '>='
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
62
|
+
type: :runtime
|
70
63
|
prerelease: false
|
71
64
|
version_requirements: !ruby/object:Gem::Requirement
|
72
|
-
none: false
|
73
65
|
requirements:
|
74
|
-
- -
|
66
|
+
- - '>='
|
75
67
|
- !ruby/object:Gem::Version
|
76
68
|
version: '0'
|
77
|
-
name: colored
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
|
-
|
70
|
+
name: uuidtools
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
|
-
- -
|
73
|
+
- - '>='
|
84
74
|
- !ruby/object:Gem::Version
|
85
75
|
version: '0'
|
76
|
+
type: :runtime
|
86
77
|
prerelease: false
|
87
78
|
version_requirements: !ruby/object:Gem::Requirement
|
88
|
-
none: false
|
89
79
|
requirements:
|
90
|
-
- -
|
80
|
+
- - '>='
|
91
81
|
- !ruby/object:Gem::Version
|
92
82
|
version: '0'
|
93
|
-
name: uuidtools
|
94
83
|
description: XenServer Support for Chef's Knife Command
|
95
84
|
email:
|
96
85
|
- rubiojr@frameos.org
|
@@ -107,7 +96,10 @@ files:
|
|
107
96
|
- README.md
|
108
97
|
- knife-xenserver.gemspec
|
109
98
|
- lib/chef/knife/xenserver_base.rb
|
99
|
+
- lib/chef/knife/xenserver_host_list.rb
|
110
100
|
- lib/chef/knife/xenserver_network_list.rb
|
101
|
+
- lib/chef/knife/xenserver_sr_create.rb
|
102
|
+
- lib/chef/knife/xenserver_sr_list.rb
|
111
103
|
- lib/chef/knife/xenserver_template_create.rb
|
112
104
|
- lib/chef/knife/xenserver_template_list.rb
|
113
105
|
- lib/chef/knife/xenserver_vm_create.rb
|
@@ -119,27 +111,25 @@ files:
|
|
119
111
|
- vendor/fog/lib/fog/xenserver/requests/compute/add_attribute.rb
|
120
112
|
homepage: http://github.com/rubiojr/knife-xenserver
|
121
113
|
licenses: []
|
114
|
+
metadata: {}
|
122
115
|
post_install_message:
|
123
116
|
rdoc_options: []
|
124
117
|
require_paths:
|
125
118
|
- lib
|
126
119
|
required_ruby_version: !ruby/object:Gem::Requirement
|
127
|
-
none: false
|
128
120
|
requirements:
|
129
|
-
- -
|
121
|
+
- - '>='
|
130
122
|
- !ruby/object:Gem::Version
|
131
123
|
version: '0'
|
132
124
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
|
-
none: false
|
134
125
|
requirements:
|
135
|
-
- -
|
126
|
+
- - '>='
|
136
127
|
- !ruby/object:Gem::Version
|
137
128
|
version: '0'
|
138
129
|
requirements: []
|
139
130
|
rubyforge_project:
|
140
|
-
rubygems_version:
|
131
|
+
rubygems_version: 2.0.2
|
141
132
|
signing_key:
|
142
|
-
specification_version:
|
133
|
+
specification_version: 4
|
143
134
|
summary: XenServer Support for Chef's Knife Command
|
144
135
|
test_files: []
|
145
|
-
has_rdoc: true
|