def get_inner_objects(vim, base_obj, path, inner_type, properties_to_collect=None, all=False): """Gets the list of inner objects of the type specified.""" client_factory = vim.client.factory base_type = base_obj._type traversal_spec = vutil.build_traversal_spec(client_factory, 'inner', base_type, path, False, []) object_spec = vutil.build_object_spec(client_factory, base_obj, [traversal_spec]) property_spec = vutil.build_property_spec( client_factory, type_=inner_type, properties_to_collect=properties_to_collect, all_properties=all) property_filter_spec = vutil.build_property_filter_spec( client_factory, [property_spec], [object_spec]) options = client_factory.create('ns0:RetrieveOptions') options.maxObjects = CONF.vmware.maximum_objects return vim.RetrievePropertiesEx(vim.service_content.propertyCollector, specSet=[property_filter_spec], options=options)
def _create_property_filter(self, property_collector, config): connection = self.connection vim = connection.vim service_content = vim.service_content client_factory = vim.client.factory if not config.cluster_name: LOG.info("No cluster specified") container = service_content.rootFolder else: container = get_cluster_ref_by_name(connection, config.cluster_name) if not container: LOG.error(_LE("Cannot find cluster with name '{}'").format(config.cluster_name)) exit(2) container_view = connection.invoke_api(vim, 'CreateContainerView', service_content.viewManager, container=container, type=['VirtualMachine'], recursive=True) traversal_spec = vim_util.build_traversal_spec(client_factory, 'traverseEntities', 'ContainerView', 'view', False, None) object_spec = vim_util.build_object_spec(client_factory, container_view, [traversal_spec]) # Only static types work, so we have to get all hardware, still faster than retrieving individual items vm_properties = ['runtime.powerState', 'config.hardware.device'] property_specs = [vim_util.build_property_spec(client_factory, 'VirtualMachine', vm_properties)] property_filter_spec = vim_util.build_property_filter_spec(client_factory, property_specs, [object_spec]) return connection.invoke_api(vim, 'CreateFilter', property_collector, spec=property_filter_spec, partialUpdates=True) # -> PropertyFilter
def _get_datacenter(vim, entity_ref, max_objects=100): """Get the inventory path of a managed entity. :param vim: Vim object :param entity_ref: managed entity reference :return: the datacenter of the entity_ref """ client_factory = vim.client.factory property_collector = vim.service_content.propertyCollector prop_spec = vim_util.build_property_spec(client_factory, 'Datacenter', ['name']) select_set = vim_util.build_selection_spec(client_factory, 'ParentTraversalSpec') select_set = vim_util.build_traversal_spec( client_factory, 'ParentTraversalSpec', 'ManagedEntity', 'parent', False, [select_set]) obj_spec = vim_util.build_object_spec(client_factory, entity_ref, select_set) prop_filter_spec = vim_util.build_property_filter_spec(client_factory, [prop_spec], [obj_spec]) options = client_factory.create('ns0:RetrieveOptions') options.maxObjects = max_objects retrieve_result = vim.RetrievePropertiesEx( property_collector, specSet=[prop_filter_spec], options=options) with vim_util.WithRetrieval(vim, retrieve_result) as objects: for obj in objects: if obj.obj._type == 'Datacenter': return obj.obj
def test_build_traversal_spec(self): client_factory = mock.Mock() sel_spec = mock.Mock() traversal_spec = vim_util.build_traversal_spec(client_factory, 'dc_to_hf', 'Datacenter', 'hostFolder', False, [sel_spec]) self.assertEqual("dc_to_hf", traversal_spec.name) self.assertEqual("hostFolder", traversal_spec.path) self.assertEqual([sel_spec], traversal_spec.selectSet) self.assertFalse(traversal_spec.skip) self.assertEqual("Datacenter", traversal_spec.type)
def get_inner_objects(vim, base_obj, path, inner_type, properties_to_collect=None, all=False): """Gets the list of inner objects of the type specified.""" client_factory = vim.client.factory base_type = base_obj._type traversal_spec = vutil.build_traversal_spec(client_factory, "inner", base_type, path, False, []) object_spec = vutil.build_object_spec(client_factory, base_obj, [traversal_spec]) property_spec = vutil.build_property_spec( client_factory, type_=inner_type, properties_to_collect=properties_to_collect, all_properties=all ) property_filter_spec = vutil.build_property_filter_spec(client_factory, [property_spec], [object_spec]) options = client_factory.create("ns0:RetrieveOptions") options.maxObjects = CONF.vmware.maximum_objects return vim.RetrievePropertiesEx( vim.service_content.propertyCollector, specSet=[property_filter_spec], options=options )
def _get_portgroups(self, max_objects=100): """Get all portgroups on the switch""" vim = self.connection.vim property_collector = vim.service_content.propertyCollector traversal_spec = vim_util.build_traversal_spec( vim.client.factory, "dvs_to_dvpg", "DistributedVirtualSwitch", "portgroup", False, []) object_spec = vim_util.build_object_spec( vim.client.factory, self._dvs, [traversal_spec]) property_spec = vim_util.build_property_spec( vim.client.factory, "DistributedVirtualPortgroup", ["key", "name", "config.configVersion", "customValue", "vm"]) property_filter_spec = vim_util.build_property_filter_spec( vim.client.factory, [property_spec], [object_spec]) options = vim.client.factory.create('ns0:RetrieveOptions') options.maxObjects = max_objects pc_result = vim.RetrievePropertiesEx(property_collector, specSet=[property_filter_spec], options=options) result = [] with vim_util.WithRetrieval(vim, pc_result) as pc_objects: for objContent in pc_objects: props = {prop.name : prop.val for prop in objContent.propSet} props["ref"] = objContent.obj props["configVersion"] = props["config.configVersion"] result.append(props) return result