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