Beispiel #1
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)
Beispiel #2
0
class InformationAggregator():
    def __init__(self, compute_node_name, system_type):
        global INTERFERENCE_DETECTION_ENABLED
        self.logger = logging.getLogger(self.__class__.__name__)
        self.hostname = compute_node_name

        self.compute_node_name = compute_node_name

        self.system_type = system_type
        if system_type == "actistatic" or system_type == "actifull":
            if system_type == "actifull":
                INTERFERENCE_DETECTION_ENABLED = True
            self.system = ActiManagerSystem([2, 1, 10], compute_node_name)
        elif system_type == "gps":
            self.system = GoldPerSocketSystem([2, 1, 10], compute_node_name)
        elif system_type == "gno":
            self.system = GoldNotOversubscribedSystem([2, 1, 10],
                                                      compute_node_name)
        else:
            self.logger.error("Wrong system_type given: %s", system_type)
            sys.exit(1)

        self.acticlouddb_client = ActiCloudDBClient()
        self.openstack_client = OpenstackClient()
        return

    def get_system(self):
        return self.system

    def report_events(self):
        if ("acti" in self.system_type):
            event_logger.log_event({
                'event': 'internal-profit-report',
                'profit-value': self.system.cur_profit,
                'hostname': self.hostname
            })
            esd_dict = dict()
            for vm in self.system.vms:
                esd_dict[vm] = [v.esd for v in self.system.vms[vm].vcpus]
            event_logger.log_event({
                'event': 'internal-esd-report',
                'values': esd_dict,
                'hostname': self.hostname
            })

    def get_pid_from_vm_id(self, vm):
        command = "nova show %s | grep -i 'OS-EXT-SRV-ATTR:instance_name' | awk -F'|' '{print $3}'" % str(
            vm.id)
        libvirt_instance_name = shell_command.run_shell_command(
            command).strip()
        command = "ssh %s ps -ef | grep %s | grep \"qemu-system\" | grep -v grep | awk '{print $2}'" % (
            self.hostname, libvirt_instance_name)
        pid = shell_command.run_shell_command(command).strip()
        return pid

    def get_dst_numa_node_from_pcpu(self, pcpu_id):
        #module numa has not implemented numa_node_of_cpu() call of numa(3) library
        for i in range(0, numa.get_max_node() + 1):
            if pcpu_id in numa.node_to_cpus(i):
                return i

    def print_vcpu_to_pcpu_mapping(self):
        p_mapping = []
        for vm in self.getServerListByComputeNode(self.compute_node_name):
            vm_mapping = self.getVMVcpuMapping(vm)
            for i in range(len(vm_mapping)):
                p_mapping.append(0)
            break
        for vm in self.getServerListByComputeNode(self.compute_node_name):
            vm_mapping = self.getVMVcpuMapping(vm)
            for i in range(len(vm_mapping)):
                if vm_mapping[i]:
                    if self.is_gold_vm(vm):
                        p_mapping[i] += 10
                    else:
                        p_mapping[i] += 1
        self.logger.info("Physical CPU mapping: %s" % p_mapping)
        return

    def is_noisy_vm(self, vm):
        is_noisy = self.acticlouddb_client.is_noisy_vm(vm.id)
        return is_noisy

    def is_sensitive_vm(self, vm):
        is_sensitive = self.acticlouddb_client.is_sensitive_vm(vm.id)
        return is_sensitive

    def is_gold_vm(self, vm):
        is_gold = self.acticlouddb_client.is_gold_vm(vm.id, 1)
        return is_gold

    def get_vm_nr_vcpus(self, vm):
        return self.acticlouddb_client.get_nr_vcpus(vm.id)

    def get_cost_function(self, vm):
        cost_function = self.acticlouddb_client.cost_function(vm.id)
        return cost_function

    def get_cpu_util(self, vm):
        return 1.0  # FIXME
        cpu_util = self.acticlouddb_client.cpu_util(vm.id)
        return cpu_util

    def update_moves(self, vm):  # vm: Vm class instance
        prev_moves = self.acticlouddb_client.get_moves(vm.id)
        self.acticlouddb_client.set_moves(vm.id, prev_moves + vm.moves)

    def getServerListByComputeNode(self, computeNode):
        return self.openstack_client.get_vms_by_hostname(computeNode)

    def getServerList(self):
        return self.openstack_client.get_vms()

    def getVMVcpuMapping(self, vm):
        try:
            libvirt_instance_name = getattr(vm,
                                            'OS-EXT-SRV-ATTR:instance_name')
            with libvirt_client.LibVirtConnection(self.hostname,
                                                  "qemu+ssh") as libvconn:
                libvinstance = libvirt_client.LibVirtInstance(
                    libvconn, str(libvirt_instance_name))
                return list(libvinstance.get_instance_mapping()[0])
        except:
            self.logger.info(
                "=================> Could not get vcpu mapping of VM %s",
                vm.id)
            return None