aboutsummaryrefslogtreecommitdiffstats
path: root/yardstick/benchmark/scenarios/lib/get_numa_info.py
blob: 4e4a44d951e7cf134aa09ebaf23db05c55c981ff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# ############################################################################
# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
# ############################################################################

from __future__ import print_function
from __future__ import absolute_import

import logging
import os

import yaml
from xml.etree import ElementTree as ET

from yardstick import ssh
from yardstick.benchmark.scenarios import base
from yardstick.common import constants as consts
from yardstick.common.utils import change_obj_to_dict
from yardstick.common.openstack_utils import get_nova_client
from yardstick.common.task_template import TaskTemplate

LOG = logging.getLogger(__name__)


class GetNumaInfo(base.Scenario):
    """
    Execute a live migration for two hosts

    """

    __scenario_type__ = "GetNumaInfo"

    def __init__(self, scenario_cfg, context_cfg):
        self.scenario_cfg = scenario_cfg
        self.context_cfg = context_cfg
        self.options = self.scenario_cfg.get('options', {})

        server = self.options['server']
        self.server_id = server['id']
        self.host = self._get_current_host_name(self.server_id)

        node_file = os.path.join(consts.YARDSTICK_ROOT_PATH,
                                 self.options.get('file'))

        with open(node_file) as f:
            nodes = yaml.safe_load(TaskTemplate.render(f.read()))
        self.nodes = {a['host_name']: a for a in nodes['nodes']}

    def run(self, result):
        numa_info = self._check_numa_node(self.server_id, self.host)

        keys = self.scenario_cfg.get('output', '').split()
        values = [numa_info]
        return self._push_to_outputs(keys, values)

    def _get_current_host_name(self, server_id):

        return change_obj_to_dict(get_nova_client().servers.get(server_id))['OS-EXT-SRV-ATTR:host']

    def _get_host_client(self, node_name):
        self.host_client = ssh.SSH.from_node(self.nodes.get(node_name))
        self.host_client.wait(timeout=600)

    def _check_numa_node(self, server_id, host):
        self._get_host_client(host)

        cmd = "sudo virsh dumpxml %s" % server_id
        LOG.debug("Executing command: %s", cmd)
        status, stdout, stderr = self.host_client.execute(cmd)
        if status:
            raise RuntimeError(stderr)
        root = ET.fromstring(stdout)
        vcpupin = [a.attrib for a in root.iter('vcpupin')]
        pinning = [a.attrib for a in root.iter('memnode')]
        return {"pinning": pinning, 'vcpupin': vcpupin}