xref: /aosp_15_r20/external/autotest/site_utils/admin_audit/base.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li#!/usr/bin/env python3
2*9c5db199SXin Li# Copyright 2020 The Chromium OS Authors. All rights reserved.
3*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
4*9c5db199SXin Li# found in the LICENSE file.
5*9c5db199SXin Li
6*9c5db199SXin Liimport logging
7*9c5db199SXin Li
8*9c5db199SXin Liimport common
9*9c5db199SXin Li
10*9c5db199SXin Liclass AuditError(Exception):
11*9c5db199SXin Li  """Generic error raised during audit."""
12*9c5db199SXin Li
13*9c5db199SXin Li
14*9c5db199SXin Liclass _BaseVerifier(object):
15*9c5db199SXin Li    """Base verify provide and keep base information and methods.
16*9c5db199SXin Li
17*9c5db199SXin Li    Verifiers run audit against target host specified by 'get_host()'
18*9c5db199SXin Li    method in subclasses. CrosHost for audit actions against DUT, ServoHost
19*9c5db199SXin Li    for actions against servo and its dependencies.
20*9c5db199SXin Li
21*9c5db199SXin Li    Main logic located in '_verify()' method.
22*9c5db199SXin Li    """
23*9c5db199SXin Li
24*9c5db199SXin Li    def __init__(self, dut_host):
25*9c5db199SXin Li        self._dut_host = dut_host
26*9c5db199SXin Li        self._result_dir = None
27*9c5db199SXin Li
28*9c5db199SXin Li    def verify(self):
29*9c5db199SXin Li        """Main method to start the verifier"""
30*9c5db199SXin Li        raise NotImplementedError("'verify' method not implemented")
31*9c5db199SXin Li
32*9c5db199SXin Li    def _verify(self):
33*9c5db199SXin Li        """Main method to run the logic of the verifier.
34*9c5db199SXin Li
35*9c5db199SXin Li        Access to the host provided by `self.get_host()`.
36*9c5db199SXin Li        """
37*9c5db199SXin Li        raise NotImplementedError("'verify' method not implemented")
38*9c5db199SXin Li
39*9c5db199SXin Li    def get_host(self):
40*9c5db199SXin Li        """Provide access to target host"""
41*9c5db199SXin Li        raise NotImplementedError("'get_host' method not implemented")
42*9c5db199SXin Li
43*9c5db199SXin Li    def _set_host_info_state(self, prefix, state):
44*9c5db199SXin Li        """Update state value to the label in the host_info
45*9c5db199SXin Li
46*9c5db199SXin Li        @param host: dut host presentation to provide access to host_info
47*9c5db199SXin Li        @param prefix: label prefix. (ex. label_prefix:value)
48*9c5db199SXin Li        @param state: new state value for the label
49*9c5db199SXin Li        """
50*9c5db199SXin Li        if self._dut_host and prefix:
51*9c5db199SXin Li            host_info = self._dut_host.host_info_store.get()
52*9c5db199SXin Li            old_state = host_info.get_label_value(prefix)
53*9c5db199SXin Li            host_info.set_version_label(prefix, state)
54*9c5db199SXin Li            logging.info('Set %s as `%s` (previous: `%s`)',
55*9c5db199SXin Li                            prefix, state, old_state)
56*9c5db199SXin Li            self._dut_host.host_info_store.commit(host_info)
57*9c5db199SXin Li
58*9c5db199SXin Li    def host_is_up(self):
59*9c5db199SXin Li        """Check if the host is up and available by ssh"""
60*9c5db199SXin Li        return self._dut_host.is_up(timeout=20)
61*9c5db199SXin Li
62*9c5db199SXin Li    def servo_is_up(self):
63*9c5db199SXin Li        """Check if servo host is up and servod is initialized"""
64*9c5db199SXin Li        return self.servo_host_is_up() and bool(self._dut_host.servo)
65*9c5db199SXin Li
66*9c5db199SXin Li    def servo_host_is_up(self):
67*9c5db199SXin Li        """Check if servo host is up and available by ssh"""
68*9c5db199SXin Li        return (self._dut_host._servo_host
69*9c5db199SXin Li            and self._dut_host._servo_host.is_up(timeout=20))
70*9c5db199SXin Li
71*9c5db199SXin Li    def set_result_dir(self, result_dir):
72*9c5db199SXin Li        """Set result directory path."""
73*9c5db199SXin Li        logging.debug('Set result_dir: %s', result_dir)
74*9c5db199SXin Li        self._result_dir = result_dir
75*9c5db199SXin Li
76*9c5db199SXin Li    def get_result_dir(self):
77*9c5db199SXin Li        """Provide result directory path."""
78*9c5db199SXin Li        return self._result_dir
79*9c5db199SXin Li
80*9c5db199SXin Li
81*9c5db199SXin Liclass _BaseDUTVerifier(_BaseVerifier):
82*9c5db199SXin Li    """Base verify check availability of DUT before run actual verifier.
83*9c5db199SXin Li
84*9c5db199SXin Li    Verifier run audit actions against CrosHost.
85*9c5db199SXin Li    """
86*9c5db199SXin Li
87*9c5db199SXin Li    def get_host(self):
88*9c5db199SXin Li        """Return CrosHost"""
89*9c5db199SXin Li        return self._dut_host
90*9c5db199SXin Li
91*9c5db199SXin Li    def verify(self, **args):
92*9c5db199SXin Li        """Vallidate the host reachable by SSH and run verifier"""
93*9c5db199SXin Li        if not self._dut_host:
94*9c5db199SXin Li            raise AuditError('host is not present')
95*9c5db199SXin Li        self._verify(**args)
96*9c5db199SXin Li
97*9c5db199SXin Li
98*9c5db199SXin Liclass _BaseServoVerifier(_BaseVerifier):
99*9c5db199SXin Li    """Base verify check availability of Servo before run actual verifier
100*9c5db199SXin Li
101*9c5db199SXin Li    Verifier run audit actions against ServoHost.
102*9c5db199SXin Li    """
103*9c5db199SXin Li    def get_host(self):
104*9c5db199SXin Li        """Return ServoHost"""
105*9c5db199SXin Li        return self._dut_host._servo_host
106*9c5db199SXin Li
107*9c5db199SXin Li    def verify(self):
108*9c5db199SXin Li        """Vallidate the host and servo initialized and run verifier"""
109*9c5db199SXin Li        if not self._dut_host:
110*9c5db199SXin Li            raise AuditError('host is not present')
111*9c5db199SXin Li        self._verify()
112