Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)