class ActicloudNumGoldSilverFilter(filters.BaseHostFilter): """ ACTiCLOUD filter. Part of ACTiManager external. """ # list of hosts doesn't change within a request run_filter_once_per_request = True def __init__(self): LOG.info("Hello from ACTICLOUD Filter __init__") self.acticlouddb_client = ActiCloudDBClient() self.nova = novaclient.Client("2", **get_nova_creds()) def host_passes(self, host_state, spec_obj): hostname = host_state.host vm_uuid = spec_obj.instance_uuid flavor_id = spec_obj.flavor.flavorid nr_gold_vms = self.acticlouddb_client.get_nr_gold_vms_by_hostname( hostname) nr_gold_vcpus = self.acticlouddb_client.get_nr_gold_vcpus_by_hostname( hostname) nr_silver_vcpus = self.acticlouddb_client.get_nr_silver_vcpus_by_hostname( hostname) is_gold_vm = flavor_id in ["1001", "1002", "1004", "1008"] nr_vcpus_host = host_state.vcpus_total nr_vcpus_instance = spec_obj.vcpus # ## FIXME remove me # if (hostname != "acticloud1"): # return False ## How many vcpus do silver VMs occupy when oversubscribed? nr_silver_vcpus_ovs = int( math.ceil(float(nr_silver_vcpus) / ACTICLOUD_OVERSUBSCRIPTION)) free_vcpus = nr_vcpus_host - (nr_gold_vcpus + nr_silver_vcpus_ovs) ret = False if is_gold_vm: if free_vcpus >= nr_vcpus_instance: ret = True else: # is silver vm if free_vcpus >= math.ceil( nr_vcpus_instance / ACTICLOUD_OVERSUBSCRIPTION): ret = True else: free_oversubscribed_vcpus = int( nr_silver_vcpus_ovs * ACTICLOUD_OVERSUBSCRIPTION) - nr_silver_vcpus if free_oversubscribed_vcpus >= nr_vcpus_instance: ret = True if ret: LOG.info("DOES FIT IN HOST %s", hostname) else: LOG.info("DOES NOT FIT IN HOST %s", hostname) return ret
class InformationAggregator(): def __init__(self): self.logger = logging.getLogger(self.__class__.__name__) self.COMPUTE_NODES = [ 'acticloud1', 'acticloud2', 'acticloud3', 'acticloud4' ] self.acticlouddb_client = ActiCloudDBClient() self.openstack_client = OpenstackClient() def is_gold_vm(self, vmid): return self.acticlouddb_client.is_gold_vm(vmid, 1) def get_vm_nr_vcpus(self, vmid): return self.acticlouddb_client.get_nr_vcpus(vmid) def get_vm_current_host(self, vmid): return self.openstack_client.get_vm_current_host(vmid) def getServerListByComputeNode(self, computeNode): return self.openstack_client.get_vms_by_hostname(computeNode) def getGoldServerListByComputeNode(self, computeNode): all_servers = self.getServerListByComputeNode(computeNode) gold_servers = [x for x in all_servers if self.is_gold_vm(x)] return gold_servers def getSilverServerListByComputeNode(self, computeNode): all_servers = self.getServerListByComputeNode(computeNode) silver_servers = [x for x in all_servers if not self.is_gold_vm(x)] return silver_servers def getVcpusByComputeNode(self, computeNode): gold_vcpus = self.acticlouddb_client.get_nr_gold_vcpus_by_hostname( computeNode) silver_vcpus = self.acticlouddb_client.get_nr_silver_vcpus_by_hostname( computeNode) return (gold_vcpus, silver_vcpus) def getServerList(self): return self.openstack_client.get_vms() def getComputeNodes(self): return list(self.COMPUTE_NODES)
class ActicloudGoldWeigher(weights.BaseHostWeigher): def __init__(self): LOG.info("Hello from Gold __init__") self.acticlouddb_client = ActiCloudDBClient() def _weigh_object(self, host_state, weight_properties): hostname = host_state.nodename nr_gold_vcpus = self.acticlouddb_client.get_nr_gold_vcpus_by_hostname( hostname) nr_silver_vcpus = self.acticlouddb_client.get_nr_silver_vcpus_by_hostname( hostname) nr_silver_vcpus_ovs = int( math.ceil(float(nr_silver_vcpus) / ACTICLOUD_OVERSUBSCRIPTION)) nr_vcpus_host = host_state.vcpus_total free_vcpus = nr_vcpus_host - (nr_gold_vcpus + nr_silver_vcpus_ovs) LOG.info( "Executing acticloud gold weigher for host %(host)s %(free_vcpus)d", { 'host': hostname, 'free_vcpus': free_vcpus }) """Higher weights win.""" return float(-free_vcpus)