knife-vsphere 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5c6db46d0b70790bceee7a18c1649d07e5880bd5
4
+ data.tar.gz: 75f42827a15800b4fef78a8f4db71205c86329c3
5
+ SHA512:
6
+ metadata.gz: 5a90ce096ba9a99b1a943d6939aa21df37f7614092c4301f9fffb5ea8ee454567afb3ce555ea29a259b52a3e0ea3d8164e97931aa66ed989db9dce612bc97bdf
7
+ data.tar.gz: 5bc6f5f732f1f5bbca00a88d4a3f27f6f430b847ed33685294e6b32dad791e65e309ac4fc2c10dcf90e6b3dafe3a5cbfd6e506538ef19f8871d4ff1c2fefb63f
@@ -6,6 +6,7 @@
6
6
 
7
7
  require 'chef/knife'
8
8
  require 'rbvmomi'
9
+ require 'base64'
9
10
 
10
11
  # Base class for vsphere knife commands
11
12
  class Chef
@@ -101,10 +102,12 @@ class Chef
101
102
  :proxyPort => get_config(:proxy_port)
102
103
  }
103
104
 
104
- # Grab the password from the command line
105
- # if tt is not in the config file
106
- if not conn_opts[:password]
105
+ if !conn_opts[:password]
106
+ # Password is not in the config file - grab it
107
+ # from the command line
107
108
  conn_opts[:password] = get_password
109
+ elsif conn_opts[:password].start_with?('base64:')
110
+ conn_opts[:password] = Base64.decode64(conn_opts[:password][7..-1]).chomp
108
111
  end
109
112
 
110
113
  # opt :debug, "Log SOAP messages", :short => 'd', :default => (ENV['RBVMOMI_DEBUG'] || false)
@@ -204,7 +207,7 @@ class Chef
204
207
  if baseEntity.is_a? RbVmomi::VIM::Folder
205
208
  baseEntity = baseEntity.childEntity.find { |f| f.name == entityArrItem } or
206
209
  abort "no such pool #{poolName} while looking for #{entityArrItem}"
207
- elsif baseEntity.is_a? RbVmomi::VIM::ClusterComputeResource or baseEntity.is_a? RbVmomi::VIM::ComputeResource
210
+ elsif baseEntity.is_a? RbVmomi::VIM::ClusterComputeResource or baseEntity.is_a? RbVmomi::VIM::ComputeResource
208
211
  baseEntity = baseEntity.resourcePool.resourcePool.find { |f| f.name == entityArrItem } or
209
212
  abort "no such pool #{poolName} while looking for #{entityArrItem}"
210
213
  elsif baseEntity.is_a? RbVmomi::VIM::ResourcePool
@@ -273,7 +276,7 @@ class Chef
273
276
  end
274
277
 
275
278
  def find_datastorecluster(dsName, folder = nil)
276
- if ! folder
279
+ if ! folder
277
280
  dc = get_datacenter
278
281
  folder = dc.datastoreFolder
279
282
  end
@@ -1,30 +1,30 @@
1
- #
2
- # Author:: Ezra Pagel (<ezra@cpan.org>)
3
- # License:: Apache License, Version 2.0
4
- #
5
- require 'chef/knife'
6
- require 'chef/knife/base_vsphere_command'
7
-
8
- # Lists all vm folders
9
- class Chef::Knife::VsphereFolderList < Chef::Knife::BaseVsphereCommand
10
-
11
- banner "knife vsphere folder list"
12
-
13
- get_common_options
14
-
15
- def traverse_folders(folder, indent_level)
16
-
17
- puts "#{" " * indent_level} #{ui.color("Folder", :cyan)}: " + folder.name
18
-
19
- folders = find_all_in_folder(folder, RbVmomi::VIM::Folder)
20
- folders.each do |child|
21
- traverse_folders(child, indent_level + 1)
22
- end
23
- end
24
-
25
- def run
26
- vim = get_vim_connection
27
- baseFolder = find_folder(get_config(:folder));
28
- traverse_folders(baseFolder, 0)
29
- end
30
- end
1
+ #
2
+ # Author:: Ezra Pagel (<ezra@cpan.org>)
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ require 'chef/knife'
6
+ require 'chef/knife/base_vsphere_command'
7
+
8
+ # Lists all vm folders
9
+ class Chef::Knife::VsphereFolderList < Chef::Knife::BaseVsphereCommand
10
+
11
+ banner "knife vsphere folder list"
12
+
13
+ get_common_options
14
+
15
+ def traverse_folders(folder, indent_level)
16
+
17
+ puts "#{" " * indent_level} #{ui.color("Folder", :cyan)}: " + folder.name
18
+
19
+ folders = find_all_in_folder(folder, RbVmomi::VIM::Folder)
20
+ folders.each do |child|
21
+ traverse_folders(child, indent_level + 1)
22
+ end
23
+ end
24
+
25
+ def run
26
+ vim = get_vim_connection
27
+ baseFolder = find_folder(get_config(:folder));
28
+ traverse_folders(baseFolder, 0)
29
+ end
30
+ end
@@ -15,8 +15,10 @@ class Chef::Knife::VspherePoolList < Chef::Knife::BaseVsphereCommand
15
15
  def traverse_folders(folder)
16
16
  return if folder.is_a? RbVmomi::VIM::VirtualApp
17
17
 
18
- puts "#{ui.color("Pool", :cyan)}: "+(folder.path[3..-1].map { |x| x[1] }.* '/') if
19
- folder.is_a? RbVmomi::VIM::ResourcePool
18
+ if folder.is_a? RbVmomi::VIM::ResourcePool
19
+ pools = folder.path[3..-1].reject { |p| p.last == "Resources" }
20
+ puts "#{ui.color("Pool", :cyan)}: " + pools.map(&:last).join('/')
21
+ end
20
22
 
21
23
  folders = find_all_in_folder(folder, RbVmomi::VIM::ManagedObject) || []
22
24
  folders.each do |child|
@@ -1,32 +1,32 @@
1
- #
2
- # Author:: Ezra Pagel (<ezra@cpan.org>)
3
- # License:: Apache License, Version 2.0
4
- #
5
-
6
- require 'chef/knife'
7
- require 'chef/knife/base_vsphere_command'
8
-
9
- # Lists all known VM templates in the configured datacenter
10
- class Chef::Knife::VsphereTemplateList < Chef::Knife::BaseVsphereCommand
11
-
12
- banner "knife vsphere template list"
13
-
14
- get_common_options
15
-
16
- def run
17
-
18
- $stdout.sync = true
19
- $stderr.sync = true
20
-
21
- vim = get_vim_connection
22
-
23
- baseFolder = find_folder(get_config(:folder));
24
-
25
- vms = find_all_in_folder(baseFolder, RbVmomi::VIM::VirtualMachine).
26
- select { |v| !v.config.nil? && v.config.template == true }
27
-
28
- vms.each do |vm|
29
- puts "#{ui.color("Template Name", :cyan)}: #{vm.name}"
30
- end
31
- end
32
- end
1
+ #
2
+ # Author:: Ezra Pagel (<ezra@cpan.org>)
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+
6
+ require 'chef/knife'
7
+ require 'chef/knife/base_vsphere_command'
8
+
9
+ # Lists all known VM templates in the configured datacenter
10
+ class Chef::Knife::VsphereTemplateList < Chef::Knife::BaseVsphereCommand
11
+
12
+ banner "knife vsphere template list"
13
+
14
+ get_common_options
15
+
16
+ def run
17
+
18
+ $stdout.sync = true
19
+ $stderr.sync = true
20
+
21
+ vim = get_vim_connection
22
+
23
+ baseFolder = find_folder(get_config(:folder));
24
+
25
+ vms = find_all_in_folder(baseFolder, RbVmomi::VIM::VirtualMachine).
26
+ select { |v| !v.config.nil? && v.config.template == true }
27
+
28
+ vms.each do |vm|
29
+ puts "#{ui.color("Template Name", :cyan)}: #{vm.name}"
30
+ end
31
+ end
32
+ end
@@ -74,8 +74,8 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
74
74
  :description => "String of data to pass to the plugin. Use any format you wish."
75
75
 
76
76
  option :customization_vlan,
77
- :long => "--cvlan CUST_VLAN",
78
- :description => "VLAN name for network adapter to join"
77
+ :long => "--cvlan CUST_VLANS",
78
+ :description => "Comma-delimited list of VLAN names for network adapters to join"
79
79
 
80
80
  option :customization_ips,
81
81
  :long => "--cips CUST_IPS",
@@ -190,8 +190,8 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
190
190
 
191
191
  option :secret_file,
192
192
  :long => "--secret-file SECRET_FILE",
193
- :description => "A file containing the secret key to use to encrypt data bag item values"
194
- $default[:secret_file] = ''
193
+ :description => "A file containing the secret key to use to encrypt data bag item values",
194
+ :proc => lambda { |secret_file| Chef::Config[:knife][:secret_file] = secret_file }
195
195
 
196
196
  option :hint,
197
197
  :long => "--hint HINT_NAME[=HINT_FILE]",
@@ -379,18 +379,23 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
379
379
  end
380
380
 
381
381
  if get_config(:customization_vlan)
382
- network = find_network(get_config(:customization_vlan))
383
- card = src_config.hardware.device.grep(RbVmomi::VIM::VirtualEthernetCard).first or
384
- abort "Can't find source network card to customize"
385
- begin
386
- switch_port = RbVmomi::VIM.DistributedVirtualSwitchPortConnection(:switchUuid => network.config.distributedVirtualSwitch.uuid, :portgroupKey => network.key)
387
- card.backing.port = switch_port
388
- rescue
389
- # not connected to a distibuted switch?
390
- card.backing = RbVmomi::VIM::VirtualEthernetCardNetworkBackingInfo(:network => network, :deviceName => network.name)
382
+ vlan_list = get_config(:customization_vlan).split(',')
383
+ networks = vlan_list.map { |vlan| find_network(vlan) }
384
+
385
+ cards = src_config.hardware.device.grep(RbVmomi::VIM::VirtualEthernetCard)
386
+
387
+ networks.each_with_index do |network, index|
388
+ card = cards[index] or abort "Can't find source network card to customize for vlan #{vlan_list[index]}"
389
+ begin
390
+ switch_port = RbVmomi::VIM.DistributedVirtualSwitchPortConnection(:switchUuid => network.config.distributedVirtualSwitch.uuid, :portgroupKey => network.key)
391
+ card.backing.port = switch_port
392
+ rescue
393
+ # not connected to a distibuted switch?
394
+ card.backing = RbVmomi::VIM::VirtualEthernetCardNetworkBackingInfo(:network => network, :deviceName => network.name)
395
+ end
396
+ dev_spec = RbVmomi::VIM.VirtualDeviceConfigSpec(:device => card, :operation => "edit")
397
+ clone_spec.config.deviceChange.push dev_spec
391
398
  end
392
- dev_spec = RbVmomi::VIM.VirtualDeviceConfigSpec(:device => card, :operation => "edit")
393
- clone_spec.config.deviceChange.push dev_spec
394
399
  end
395
400
 
396
401
  if get_config(:customization_spec)
@@ -495,15 +500,15 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
495
500
  end
496
501
 
497
502
  # Generates a CustomizationAdapterMapping (currently only single IPv4 address) object
498
- # @param ip [String] Any static IP address to use, otherwise DHCP
503
+ # @param ip [String] Any static IP address to use, or "dhcp" for DHCP
499
504
  # @param gw [String] If static, the gateway for the interface, otherwise network address + 1 will be used
500
505
  # @return [RbVmomi::VIM::CustomizationIPSettings]
501
506
  def generate_adapter_map (ip=nil, gw=nil, dns1=nil, dns2=nil, domain=nil)
502
507
 
503
508
  settings = RbVmomi::VIM.CustomizationIPSettings
504
509
 
505
- if ip.nil?
506
- settings.ip = RbVmomi::VIM::CustomizationDhcpIpGenerator
510
+ if ip.nil? || ip.downcase == "dhcp"
511
+ settings.ip = RbVmomi::VIM::CustomizationDhcpIpGenerator.new
507
512
  else
508
513
  cidr_ip = NetAddr::CIDR.create(ip)
509
514
  settings.ip = RbVmomi::VIM::CustomizationFixedIp(:ipAddress => cidr_ip.ip)
@@ -1,61 +1,61 @@
1
- #
2
- # Author:: Ezra Pagel (<ezra@cpan.org>)
3
- # License:: Apache License, Version 2.0
4
- #
5
- require 'chef/knife'
6
- require 'chef/knife/base_vsphere_command'
7
-
8
- # Lists all known virtual machines in the configured datacenter
9
- class Chef::Knife::VsphereVmList < Chef::Knife::BaseVsphereCommand
10
-
11
- banner "knife vsphere vm list"
12
-
13
- get_common_options
14
-
15
- option :recursive,
16
- :long => "--recursive",
17
- :short => "-r",
18
- :description => "Recurse into sub-folders"
19
-
20
- def traverse_folders(folder, is_top = false, recurse = false)
21
-
22
- vms = find_all_in_folder(folder, RbVmomi::VIM::VirtualMachine).select {|v| v.config && !v.config.template }
23
- if vms.any?
24
- puts "#{ui.color("Folder", :cyan)}: "+(folder.path[3..-1].map { |x| x[1] }.* '/')
25
- vms.each { |v| print_vm(v) }
26
- elsif is_top
27
- puts "#{ui.color("No VMs", :cyan)}"
28
- end
29
-
30
- if (recurse)
31
- folders = find_all_in_folder(folder, RbVmomi::VIM::Folder)
32
- folders.each do |child|
33
- traverse_folders(child, false, recurse)
34
- end
35
- end
36
-
37
- end
38
-
39
- def print_vm(vm)
40
- state = case vm.runtime.powerState
41
- when PsOn
42
- ui.color("on", :green)
43
- when PsOff
44
- ui.color("off", :red)
45
- when PsSuspended
46
- ui.color("suspended", :yellow)
47
- end
48
- puts "\t#{ui.color("VM Name:", :cyan)} #{vm.name}"
49
- "\t\t#{ui.color("IP:", :magenta)} #{vm.guest.ipAddress}"
50
- "\t\t#{ui.color("RAM:", :magenta)} #{vm.summary.config.memorySizeMB}"
51
- "\t\t#{ui.color("State:", :cyan)} #{state}"
52
- end
53
-
54
- def run
55
- vim = get_vim_connection
56
- baseFolder = find_folder(get_config(:folder));
57
- recurse = get_config(:recursive)
58
- is_top = true
59
- traverse_folders(baseFolder, is_top, recurse)
60
- end
61
- end
1
+ #
2
+ # Author:: Ezra Pagel (<ezra@cpan.org>)
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ require 'chef/knife'
6
+ require 'chef/knife/base_vsphere_command'
7
+
8
+ # Lists all known virtual machines in the configured datacenter
9
+ class Chef::Knife::VsphereVmList < Chef::Knife::BaseVsphereCommand
10
+
11
+ banner "knife vsphere vm list"
12
+
13
+ get_common_options
14
+
15
+ option :recursive,
16
+ :long => "--recursive",
17
+ :short => "-r",
18
+ :description => "Recurse into sub-folders"
19
+
20
+ def traverse_folders(folder, is_top = false, recurse = false)
21
+
22
+ vms = find_all_in_folder(folder, RbVmomi::VIM::VirtualMachine).select {|v| v.config && !v.config.template }
23
+ if vms.any?
24
+ puts "#{ui.color("Folder", :cyan)}: "+(folder.path[3..-1].map { |x| x[1] }.* '/')
25
+ vms.each { |v| print_vm(v) }
26
+ elsif is_top
27
+ puts "#{ui.color("No VMs", :cyan)}"
28
+ end
29
+
30
+ if (recurse)
31
+ folders = find_all_in_folder(folder, RbVmomi::VIM::Folder)
32
+ folders.each do |child|
33
+ traverse_folders(child, false, recurse)
34
+ end
35
+ end
36
+
37
+ end
38
+
39
+ def print_vm(vm)
40
+ state = case vm.runtime.powerState
41
+ when PsOn
42
+ ui.color("on", :green)
43
+ when PsOff
44
+ ui.color("off", :red)
45
+ when PsSuspended
46
+ ui.color("suspended", :yellow)
47
+ end
48
+ puts "\t#{ui.color("VM Name:", :cyan)} #{vm.name}"
49
+ "\t\t#{ui.color("IP:", :magenta)} #{vm.guest.ipAddress}"
50
+ "\t\t#{ui.color("RAM:", :magenta)} #{vm.summary.config.memorySizeMB}"
51
+ "\t\t#{ui.color("State:", :cyan)} #{state}"
52
+ end
53
+
54
+ def run
55
+ vim = get_vim_connection
56
+ baseFolder = find_folder(get_config(:folder));
57
+ recurse = get_config(:recursive)
58
+ is_top = true
59
+ traverse_folders(baseFolder, is_top, recurse)
60
+ end
61
+ end
@@ -1,4 +1,4 @@
1
1
  module KnifeVsphere
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.1"
3
3
  end
4
4
 
metadata CHANGED
@@ -1,123 +1,105 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-vsphere
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
5
- prerelease:
4
+ version: 1.0.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Ezra Pagel
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-12-30 00:00:00.000000000 Z
11
+ date: 2015-03-19 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: netaddr
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ~>
16
+ requirements: &1
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: 1.5.0
19
+ version: '1.5'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ~>
28
- - !ruby/object:Gem::Version
29
- version: 1.5.0
23
+ requirements: *1
30
24
  - !ruby/object:Gem::Dependency
31
25
  name: chef
32
26
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
- requirements:
35
- - - ! '>='
27
+ requirements: &2
28
+ - - ">="
36
29
  - !ruby/object:Gem::Version
37
30
  version: 0.10.0
38
31
  type: :runtime
39
32
  prerelease: false
40
33
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ! '>='
44
- - !ruby/object:Gem::Version
45
- version: 0.10.0
34
+ requirements: *2
46
35
  - !ruby/object:Gem::Dependency
47
36
  name: rbvmomi
48
37
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - ~>
38
+ requirements: &3
39
+ - - "~>"
52
40
  - !ruby/object:Gem::Version
53
- version: 1.5.1
41
+ version: '1.8'
54
42
  type: :runtime
55
43
  prerelease: false
56
44
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ~>
60
- - !ruby/object:Gem::Version
61
- version: 1.5.1
45
+ requirements: *3
62
46
  description: VMware vSphere Support for Chef's Knife Command
63
47
  email: ezra@cpan.org
64
48
  executables: []
65
49
  extensions: []
66
50
  extra_rdoc_files: []
67
51
  files:
68
- - lib/chef/knife/vsphere_vm_query.rb
52
+ - lib/chef/knife/base_vsphere_command.rb
53
+ - lib/chef/knife/vshpere_vm_migrate.rb
54
+ - lib/chef/knife/vshpere_vm_move.rb
55
+ - lib/chef/knife/vshpere_vm_net.rb
69
56
  - lib/chef/knife/vsphere_cpu_ratio.rb
57
+ - lib/chef/knife/vsphere_customization_list.rb
58
+ - lib/chef/knife/vsphere_datastore_list.rb
59
+ - lib/chef/knife/vsphere_datastore_maxfree.rb
70
60
  - lib/chef/knife/vsphere_datastorecluster_list.rb
71
61
  - lib/chef/knife/vsphere_datastorecluster_maxfree.rb
72
- - lib/chef/knife/vshpere_vm_migrate.rb
73
- - lib/chef/knife/vsphere_vm_property_get.rb
74
- - lib/chef/knife/vsphere_vm_state.rb
75
- - lib/chef/knife/vshpere_vm_net.rb
76
- - lib/chef/knife/vsphere_vm_execute.rb
62
+ - lib/chef/knife/vsphere_folder_list.rb
77
63
  - lib/chef/knife/vsphere_hosts_list.rb
78
- - lib/chef/knife/vsphere_vm_snapshot.rb
79
- - lib/chef/knife/vsphere_vm_toolsconfig.rb
80
- - lib/chef/knife/vsphere_vm_markastemplate.rb
81
- - lib/chef/knife/vsphere_vm_clone.rb
82
- - lib/chef/knife/base_vsphere_command.rb
83
- - lib/chef/knife/vsphere_vm_vmdk_add.rb
84
- - lib/chef/knife/vsphere_customization_list.rb
64
+ - lib/chef/knife/vsphere_pool_list.rb
65
+ - lib/chef/knife/vsphere_pool_query.rb
85
66
  - lib/chef/knife/vsphere_template_list.rb
86
- - lib/chef/knife/vsphere_vm_delete.rb
87
- - lib/chef/knife/vsphere_datastore_list.rb
88
- - lib/chef/knife/vsphere_vm_config.rb
89
67
  - lib/chef/knife/vsphere_vlan_list.rb
90
- - lib/chef/knife/vsphere_datastore_maxfree.rb
68
+ - lib/chef/knife/vsphere_vm_clone.rb
69
+ - lib/chef/knife/vsphere_vm_config.rb
70
+ - lib/chef/knife/vsphere_vm_delete.rb
71
+ - lib/chef/knife/vsphere_vm_execute.rb
91
72
  - lib/chef/knife/vsphere_vm_list.rb
92
- - lib/chef/knife/vsphere_pool_query.rb
93
- - lib/chef/knife/vshpere_vm_move.rb
94
- - lib/chef/knife/vsphere_pool_list.rb
95
- - lib/chef/knife/vsphere_folder_list.rb
73
+ - lib/chef/knife/vsphere_vm_markastemplate.rb
74
+ - lib/chef/knife/vsphere_vm_property_get.rb
96
75
  - lib/chef/knife/vsphere_vm_property_set.rb
76
+ - lib/chef/knife/vsphere_vm_query.rb
77
+ - lib/chef/knife/vsphere_vm_snapshot.rb
78
+ - lib/chef/knife/vsphere_vm_state.rb
79
+ - lib/chef/knife/vsphere_vm_toolsconfig.rb
80
+ - lib/chef/knife/vsphere_vm_vmdk_add.rb
97
81
  - lib/knife-vsphere/version.rb
98
82
  homepage: http://github.com/ezrapagel/knife-vsphere
99
83
  licenses:
100
84
  - Apache
85
+ metadata: {}
101
86
  post_install_message:
102
87
  rdoc_options: []
103
88
  require_paths:
104
89
  - lib
105
90
  required_ruby_version: !ruby/object:Gem::Requirement
106
- none: false
107
91
  requirements:
108
- - - ! '>='
92
+ - &4
93
+ - ">="
109
94
  - !ruby/object:Gem::Version
110
95
  version: '0'
111
96
  required_rubygems_version: !ruby/object:Gem::Requirement
112
- none: false
113
97
  requirements:
114
- - - ! '>='
115
- - !ruby/object:Gem::Version
116
- version: '0'
98
+ - *4
117
99
  requirements: []
118
100
  rubyforge_project:
119
- rubygems_version: 1.8.23
101
+ rubygems_version: 2.2.2
120
102
  signing_key:
121
- specification_version: 3
103
+ specification_version: 4
122
104
  summary: vSphere Support for Knife
123
105
  test_files: []