def _check_hyperthread(self): src = self._get_compute_info(self.source) dest = self._get_compute_info(self.destination) source_numa = jsonutils.loads(src.numa_topology) dest_numa = jsonutils.loads(dest.numa_topology) source_numa = hwutils.convert_host_numa_topology(source_numa) dest_numa = hwutils.convert_host_numa_topology(dest_numa) if operator.xor(hwutils.is_host_enable_hyperthread(source_numa), hwutils.is_host_enable_hyperthread(dest_numa)): raise exception.MigrationPreCheckError( reason="src and dest have different hyperthreading.")
def host_passes(self, host_state, filter_properties): """CpuBindFilter The instance numa topology is like: {u'instance_uuid': u'786d1430-dfe2-4423-8522-4a5394715b32', u'cells': [{u'cpuset': [0], u'id': 0, u'memory': 256}, {u'cpuset': [1,2,3], u'id': 1, u'memory': 768 }], u'id': 122} """ inst_prop = filter_properties['request_spec'].get( 'instance_properties') inst_numa_top = inst_prop.get('numa_topology') if inst_prop else None # get the pagesize from instance_type instance_type = filter_properties['request_spec'].get( 'instance_type', None) pagesize = None if instance_type: pagesize = instance_type.get('extra_specs', {}).get("hw:mem_page_size", None) if inst_numa_top: inst_numa_top = utils.convert_inst_numa_topology(inst_numa_top) vcpus = filter_properties.get('instance_type').get('vcpus') mem = filter_properties.get('instance_type').get('memory_mb') enable_bind, enable_ht, any_mode, numa_opts = \ utils.get_inst_affinity_mask(filter_properties) request_spec = filter_properties['request_spec'] host_numa_top = copy.deepcopy( jsonutils.loads(host_state.numa_topology or '{}')) if host_numa_top and host_numa_top.get('nova_object.data'): host_numa_top = utils.convert_host_numa_topology(host_numa_top) elif numa_opts or enable_bind or not any_mode or pagesize: LOG.debug('Host %s don\'t support numa,don\'t pass', host_state.host) LOG.debug('options:enable_bind(%s), any_mode(%s), numa_opts(%s), ' 'pagesize(%s)' % (enable_bind, any_mode, numa_opts, pagesize)) return False else: LOG.debug('Host %s don\'t support numa, pass', host_state.host) return True context = filter_properties['context'].elevated() hw_instance_extras = objects.HuaweiInstanceExtra.get_by_host( context, host_state.host) instance_uuids = request_spec.get('instance_uuids', []) instance_uuid = instance_uuids[0] if instance_uuids else None if utils.is_host_numa_confict(hw_instance_extras, numa_opts, instance_uuid): LOG.debug( 'Numa instance cannot booted with non-numa ' 'instance in host %s', host_state.host) return False if utils.is_any_node_confict(hw_instance_extras, any_mode, instance_uuid): LOG.debug( 'any-mode instance cannot booted with non-any-mode ' 'instance in host %s', host_state.host) return False if (enable_bind, any_mode, numa_opts) == (False, True, 0) and not pagesize: LOG.debug('Cpubindfilter passed, enable_bind(%s), any_mode(%s),' ' numa_opts(%s)' % (enable_bind, any_mode, numa_opts)) return True if not host_state.numa_topology: LOG.info( "No numa topology info of host: %s found, cpu bind " "filter failed", host_state.host) return False # when a numa vm migrate from host1 to host2, and host1 is empty # if you want to forbid to create a no-numa vm in host1 # call this function earlier hw_instance_extras = \ utils._extend_hw_instance_extra(context, host_state.host) utils.update_numa_topo_bind_info(host_numa_top, hw_instance_extras, any_mode, instance_uuid) LOG.debug( "CpuBindFilter trying to filter instance: %(instance_uuid)s," " with host_numa_top:%(host_numa_top)s of host:%(host)s", { "instance_uuid": instance_uuid, "host_numa_top": host_numa_top, "host": host_state.host }) enable_evs = utils.get_evs_affinity(filter_properties) sriov_numa_id = None evs_numa_id = None if numa_opts == 2: try: sriov_numa_id = utils.get_numa_id_with_vf_request( host_state, filter_properties) except exception.NovaException as ex: LOG.info(ex.format_message()) return False if enable_evs: try: evs_numa_id = utils.get_specific_numa(host_state, filter_properties) except exception.NovaException as error: # if catch the exception, the host is not suitable for creating # evs instances. LOG.debug(error.format_message()) return False if sriov_numa_id and enable_evs and sriov_numa_id != evs_numa_id: LOG.info("Both EVS Numa and IO Numa are specified, But SRIOV" "(node:%s) and EVS(node:%s) devices are not in one " "numa cell." % (sriov_numa_id, evs_numa_id)) return False specific_numa_id = sriov_numa_id or evs_numa_id try: if inst_numa_top and not numa_opts: request_spec = filter_properties.get('request_spec', {}) instance = request_spec.get('instance_properties', {}) fitted_inst_numas = utils.get_fitted_inst_numas( instance, host_state) utils.pin_vcpu_with_inst_numa(enable_bind, enable_ht, any_mode, fitted_inst_numas, host_numa_top) else: utils.pin_vcpu(enable_bind, enable_ht, any_mode, vcpus, mem, host_numa_top, numa_opts, numa_id=specific_numa_id, pagesize=pagesize, host_state=host_state) except exception.NovaException as ex: LOG.debug(ex.format_message()) return False return True
def host_passes(self, host_state, filter_properties): """CpuBindFilter The instance numa topology is like: {u'instance_uuid': u'786d1430-dfe2-4423-8522-4a5394715b32', u'cells': [{u'cpuset': [0], u'id': 0, u'memory': 256}, {u'cpuset': [1,2,3], u'id': 1, u'memory': 768 }], u'id': 122} """ inst_prop = filter_properties['request_spec'].get( 'instance_properties') inst_numa_top = inst_prop.get('numa_topology') if inst_prop else None # get the pagesize from instance_type instance_type = filter_properties['request_spec'].get( 'instance_type', None) pagesize = None if instance_type: pagesize = instance_type.get('extra_specs', {}).get( "hw:mem_page_size", None) if inst_numa_top: inst_numa_top = utils.convert_inst_numa_topology(inst_numa_top) vcpus = filter_properties.get('instance_type').get('vcpus') mem = filter_properties.get('instance_type').get('memory_mb') enable_bind, enable_ht, any_mode, numa_opts = \ utils.get_inst_affinity_mask(filter_properties) request_spec = filter_properties['request_spec'] host_numa_top = copy.deepcopy(jsonutils.loads( host_state.numa_topology or '{}')) if host_numa_top and host_numa_top.get('nova_object.data'): host_numa_top = utils.convert_host_numa_topology( host_numa_top) elif numa_opts or enable_bind or not any_mode or pagesize: LOG.debug('Host %s don\'t support numa,don\'t pass', host_state.host) LOG.debug('options:enable_bind(%s), any_mode(%s), numa_opts(%s), ' 'pagesize(%s)' % (enable_bind, any_mode, numa_opts, pagesize)) return False else: LOG.debug('Host %s don\'t support numa, pass', host_state.host) return True context = filter_properties['context'].elevated() hw_instance_extras = objects.HuaweiInstanceExtra.get_by_host( context, host_state.host) instance_uuids = request_spec.get('instance_uuids', []) instance_uuid = instance_uuids[0] if instance_uuids else None if utils.is_host_numa_confict(hw_instance_extras, numa_opts, instance_uuid): LOG.debug('Numa instance cannot booted with non-numa ' 'instance in host %s', host_state.host) return False if utils.is_any_node_confict(hw_instance_extras, any_mode, instance_uuid): LOG.debug('any-mode instance cannot booted with non-any-mode ' 'instance in host %s', host_state.host) return False if (enable_bind, any_mode, numa_opts) == ( False, True, 0) and not pagesize: LOG.debug('Cpubindfilter passed, enable_bind(%s), any_mode(%s),' ' numa_opts(%s)' % (enable_bind, any_mode, numa_opts)) return True if not host_state.numa_topology: LOG.info("No numa topology info of host: %s found, cpu bind " "filter failed", host_state.host) return False # when a numa vm migrate from host1 to host2, and host1 is empty # if you want to forbid to create a no-numa vm in host1 # call this function earlier hw_instance_extras = \ utils._extend_hw_instance_extra(context, host_state.host) utils.update_numa_topo_bind_info(host_numa_top, hw_instance_extras, any_mode, instance_uuid) LOG.debug("CpuBindFilter trying to filter instance: %(instance_uuid)s," " with host_numa_top:%(host_numa_top)s of host:%(host)s", {"instance_uuid": instance_uuid, "host_numa_top": host_numa_top, "host": host_state.host}) enable_evs = utils.get_evs_affinity(filter_properties) sriov_numa_id = None evs_numa_id = None if numa_opts == 2: try: sriov_numa_id = utils.get_numa_id_with_vf_request( host_state, filter_properties) except exception.NovaException as ex: LOG.info(ex.format_message()) return False if enable_evs: try: evs_numa_id = utils.get_specific_numa(host_state, filter_properties) except exception.NovaException as error: # if catch the exception, the host is not suitable for creating # evs instances. LOG.debug(error.format_message()) return False if sriov_numa_id and enable_evs and sriov_numa_id != evs_numa_id: LOG.info("Both EVS Numa and IO Numa are specified, But SRIOV" "(node:%s) and EVS(node:%s) devices are not in one " "numa cell." % (sriov_numa_id, evs_numa_id)) return False specific_numa_id = sriov_numa_id or evs_numa_id try: if inst_numa_top and not numa_opts: request_spec = filter_properties.get('request_spec', {}) instance = request_spec.get('instance_properties', {}) fitted_inst_numas = utils.get_fitted_inst_numas(instance, host_state) utils.pin_vcpu_with_inst_numa(enable_bind, enable_ht, any_mode, fitted_inst_numas, host_numa_top) else: utils.pin_vcpu(enable_bind, enable_ht, any_mode, vcpus, mem, host_numa_top, numa_opts, numa_id=specific_numa_id, pagesize=pagesize, host_state=host_state) except exception.NovaException as ex: LOG.debug(ex.format_message()) return False return True