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