diff --git a/lib/chef/knife/search_helper.rb b/lib/chef/knife/search_helper.rb new file mode 100644 index 00000000..970fed21 --- /dev/null +++ b/lib/chef/knife/search_helper.rb @@ -0,0 +1,41 @@ +# Some helpers for faster searching of the inventory +module SearchHelper + # Retrieves all the VM objects and returns their ObjectContents + # Note that since it's a ObjectContent coming back, the individual + # object's [] will return only the properties you asked for + # and `#obj` will return the actual object (but make a call to the server) + # param [Array] properties to retrieve + # @return [Array] + def get_all_vm_objects(properties = ['name']) + pc = vim_connection.serviceInstance.content.propertyCollector + viewmgr = vim_connection.serviceInstance.content.viewManager + root_folder = vim_connection.serviceInstance.content.rootFolder + vmview = viewmgr.CreateContainerView(container: root_folder, + type: ['VirtualMachine'], + recursive: true) + + filter_spec = RbVmomi::VIM.PropertyFilterSpec( + objectSet: [ + obj: vmview, + skip: true, + selectSet: [ + RbVmomi::VIM.TraversalSpec( + name: 'traverseEntities', + type: 'ContainerView', + path: 'view', + skip: false + ) + ] + ], + propSet: [ + { type: 'VirtualMachine', pathSet: properties } + ] + ) + pc.RetrieveProperties(specSet: [filter_spec]) + end + + def get_vm_by_name(vmname) + vm = get_all_vm_objects.detect { |r| r['name'] == vmname } + vm ? vm.obj : nil + end +end diff --git a/lib/chef/knife/vsphere_vm_disk_list.rb b/lib/chef/knife/vsphere_vm_disk_list.rb index e03b456f..312ad5be 100644 --- a/lib/chef/knife/vsphere_vm_disk_list.rb +++ b/lib/chef/knife/vsphere_vm_disk_list.rb @@ -1,9 +1,12 @@ require 'chef/knife' require 'chef/knife/base_vsphere_command' +require 'chef/knife/search_helper' # List the disks attached to a VM # VsphereVmdisklist extends the BaseVspherecommand class Chef::Knife::VsphereVmDiskList < Chef::Knife::BaseVsphereCommand + include SearchHelper + banner 'knife vsphere vm disk list VMNAME' common_options @@ -18,9 +21,7 @@ def run fatal_exit 'You must specify a virtual machine name' end - vim_connection - vm = get_vm(vmname) - fatal_exit "Could not find #{vmname}" unless vm + vm = get_vm_by_name(vmname) || fatal_exit("Could not find #{vmname}") disks = vm.config.hardware.device.select do |device| device.is_a? RbVmomi::VIM::VirtualDisk