summaryrefslogtreecommitdiffstats
path: root/cvp/opnfv_testapi/resources/sut_handlers.py
blob: 16c50b83ddd3450d4314948277d2be9ae4823b1f (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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
##############################################################################
# Copyright (c) 2017
# 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
##############################################################################
import logging
import json
import os

from opnfv_testapi.resources import handlers
from opnfv_testapi.resources import sut_models
from opnfv_testapi.tornado_swagger import swagger

LOG = logging.getLogger(__name__)
LOG.setLevel(logging.DEBUG)

RESULT_PATH = '/home/testapi/logs/{}/results'


class GenericSutHandler(handlers.GenericApiHandler):
    def __init__(self, application, request, **kwargs):
        super(GenericSutHandler, self).__init__(application,
                                                request,
                                                **kwargs)
        self.table = "suts"
        self.table_cls = sut_models.Sut


class HardwareHandler(GenericSutHandler):
    @swagger.operation(nickname="getHardwareById")
    def get(self, id):
        endpoint_info = self._read_endpoint_info(id)
        LOG.debug('Endpoint info: %s', endpoint_info)

        all_info = self._read_sut_info(id)
        LOG.debug('All SUT info: %s', all_info)

        hardware_info = {k: self._get_single_host_info(v)
                         for k, v in all_info.items()}
        LOG.debug('SUT info: %s', hardware_info)

        data = {
            'endpoint_info': endpoint_info,
            'hardware_info': hardware_info
        }

        self.write(data)

    def _read_endpoint_info(self, id):
        path = os.path.join(RESULT_PATH.format(id), 'endpoint_info.json')
        try:
            with open(path) as f:
                endpoint_info = json.load(f)
        except Exception:
            endpoint_info = []

        return endpoint_info

    def _read_sut_info(self, id):
        path = os.path.join(RESULT_PATH.format(id), 'all_hosts_info.json')
        try:
            with open(path) as f:
                all_info = json.load(f)
        except Exception:
            all_info = {}
        return all_info

    def _get_single_host_info(self, single_info):
        info = []
        facts = single_info.get('ansible_facts', {})

        info.append(['hostname', facts.get('ansible_hostname')])

        info.append(['product_name', facts.get('ansible_product_name')])
        info.append(['product_version', facts.get('ansible_product_version')])

        processors = facts.get('ansible_processor', [])
        try:
            processor_type = '{} {}'.format(processors[0], processors[1])
        except IndexError:
            LOG.exception('No Processor in SUT data')
            processor_type = None
        info.append(['processor_type', processor_type])
        info.append(['architecture', facts.get('ansible_architecture')])
        info.append(['processor_cores', facts.get('ansible_processor_cores')])
        info.append(['processor_vcpus', facts.get('ansible_processor_vcpus')])

        memory = facts.get('ansible_memtotal_mb')
        memory = round(memory * 1.0 / 1024, 2) if memory else None
        info.append(['memory', '{} GB'.format(memory)])

        devices = facts.get('ansible_devices', {})
        info.extend([self._get_device_info(k, v) for k, v in devices.items()])

        lsb_description = facts.get('ansible_lsb', {}).get('description')
        info.append(['OS', lsb_description])

        interfaces = facts.get('ansible_interfaces')
        info.append(['interfaces', interfaces])
        info.extend([self._get_interface_info(facts, i) for i in interfaces])
        info = [i for i in info if i]

        return info

    def _get_interface_info(self, facts, name):
        mac = facts.get('ansible_{}'.format(name), {}).get('macaddress')
        return [name, mac] if mac else []

    def _get_device_info(self, name, info):
        return ['disk_{}'.format(name), info.get('size')]