def get_host_details(self, host): """Get Nova capabilities of a single host :param host: UUID or name of nova-compute host :return: Dict of capabilities or raise HostNotFound """ try: hypervisor = self.nova.hypervisors.get(host) except nova_exception.NotFound: try: hypervisors_list = self.nova.hypervisors.search(host) except nova_exception.NotFound: raise manager_exceptions.HostNotFound(host=host) if len(hypervisors_list) > 1: raise manager_exceptions.MultipleHostsFound(host) else: hypervisor_id = hypervisors_list[0].id # NOTE(sbauza): No need to catch the exception as we're sure # that the hypervisor exists hypervisor = self.nova.hypervisors.get(hypervisor_id) try: return { 'id': hypervisor.id, 'hypervisor_hostname': hypervisor.hypervisor_hostname, 'service_name': hypervisor.service['host'], 'vcpus': hypervisor.vcpus, 'cpu_info': hypervisor.cpu_info, 'hypervisor_type': hypervisor.hypervisor_type, 'hypervisor_version': hypervisor.hypervisor_version, 'memory_mb': hypervisor.memory_mb, 'local_gb': hypervisor.local_gb } except AttributeError: raise manager_exceptions.InvalidHost(host=host)
def get_host_details(self, host): """Get Nova capabilities of a single host :param host: UUID, ID or name of nova-compute host :return: Dict of capabilities or raise HostNotFound """ try: # NOTE(tetsuro): Only id (microversion < 2.53) or uuid # (microversion >= 2.53) is acceptable for the # `novaclient.hypervisors.get` argument. The invalid arguments # result in NotFound exception for microversion < 2.53 and # BadRequest exception for microversion >= 2.53 hypervisor = self.nova.hypervisors.get(host) except (nova_exception.NotFound, nova_exception.BadRequest): # Name (not id or uuid) is given for the `host` parameter. try: hypervisors_list = self.nova.hypervisors.search(host) except nova_exception.NotFound: raise manager_exceptions.HostNotFound(host=host) if len(hypervisors_list) > 1: raise manager_exceptions.MultipleHostsFound(host=host) else: hypervisor_id = hypervisors_list[0].id # NOTE(sbauza): No need to catch the exception as we're sure # that the hypervisor exists hypervisor = self.nova.hypervisors.get(hypervisor_id) az_name = '' if CONF.nova.az_aware: host_name = hypervisor.service['host'] for zone in self.nova.availability_zones.list(detailed=True): if (zone.hosts and host_name in zone.hosts and 'nova-compute' in zone.hosts[host_name]): az_name = zone.zoneName try: # NOTE(tetsuro): compute API microversion 2.28 changes cpu_info # from string to object cpu_info = str(hypervisor.cpu_info) return { 'id': hypervisor.id, 'availability_zone': az_name, 'hypervisor_hostname': hypervisor.hypervisor_hostname, 'service_name': hypervisor.service['host'], 'vcpus': hypervisor.vcpus, 'cpu_info': cpu_info, 'hypervisor_type': hypervisor.hypervisor_type, 'hypervisor_version': hypervisor.hypervisor_version, 'memory_mb': hypervisor.memory_mb, 'local_gb': hypervisor.local_gb } except AttributeError: raise manager_exceptions.InvalidHost(host=host)
def create_computehost(self, host_values): # TODO(sbauza): # - Exception handling for HostNotFound host_id = host_values.pop('id', None) host_name = host_values.pop('name', None) try: trust_id = host_values.pop('trust_id') except KeyError: raise manager_ex.MissingTrustId() host_ref = host_id or host_name if host_ref is None: raise manager_ex.InvalidHost(host=host_values) with trusts.create_ctx_from_trust(trust_id): inventory = nova.NovaInventory() servers = inventory.get_servers_per_host(host_ref) if servers: raise manager_ex.HostHavingServers(host=host_ref, servers=servers) host_details = inventory.get_host_details(host_ref) # NOTE(sbauza): Only last duplicate name for same extra capability # will be stored to_store = set(host_values.keys()) - set(host_details.keys()) extra_capabilities_keys = to_store extra_capabilities = dict( (key, host_values[key]) for key in extra_capabilities_keys ) if any([len(key) > 64 for key in extra_capabilities_keys]): raise manager_ex.ExtraCapabilityTooLong() self.placement_client.create_reservation_provider( host_details['hypervisor_hostname']) pool = nova.ReservationPool() pool.add_computehost(self.freepool_name, host_details['service_name']) host = None cantaddextracapability = [] try: if trust_id: host_details.update({'trust_id': trust_id}) host = db_api.host_create(host_details) except db_ex.BlazarDBException as e: # We need to rollback # TODO(sbauza): Investigate use of Taskflow for atomic # transactions pool.remove_computehost(self.freepool_name, host_details['service_name']) self.placement_client.delete_reservation_provider( host_details['hypervisor_hostname']) raise e for key in extra_capabilities: values = {'computehost_id': host['id'], 'capability_name': key, 'capability_value': extra_capabilities[key], } try: db_api.host_extra_capability_create(values) except db_ex.BlazarDBException: cantaddextracapability.append(key) if cantaddextracapability: raise manager_ex.CantAddExtraCapability( keys=cantaddextracapability, host=host['id']) return self.get_computehost(host['id'])