You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.6 KiB
112 lines
3.6 KiB
4 months ago
|
#!/usr/bin/env python2
|
||
|
# Copyright 2020 The Chromium OS Authors. All rights reserved.
|
||
|
# Use of this source code is governed by a BSD-style license that can be
|
||
|
# found in the LICENSE file.
|
||
|
|
||
|
import logging
|
||
|
|
||
|
import common
|
||
|
|
||
|
class AuditError(Exception):
|
||
|
"""Generic error raised during audit."""
|
||
|
|
||
|
|
||
|
class _BaseVerifier(object):
|
||
|
"""Base verify provide and keep base information and methods.
|
||
|
|
||
|
Verifiers run audit against target host specified by 'get_host()'
|
||
|
method in subclasses. CrosHost for audit actions against DUT, ServoHost
|
||
|
for actions against servo and its dependencies.
|
||
|
|
||
|
Main logic located in '_verify()' method.
|
||
|
"""
|
||
|
|
||
|
def __init__(self, dut_host):
|
||
|
self._dut_host = dut_host
|
||
|
self._result_dir = None
|
||
|
|
||
|
def verify(self):
|
||
|
"""Main method to start the verifier"""
|
||
|
raise NotImplementedError("'verify' method not implemented")
|
||
|
|
||
|
def _verify(self):
|
||
|
"""Main method to run the logic of the verifier.
|
||
|
|
||
|
Access to the host provided by `self.get_host()`.
|
||
|
"""
|
||
|
raise NotImplementedError("'verify' method not implemented")
|
||
|
|
||
|
def get_host(self):
|
||
|
"""Provide access to target host"""
|
||
|
raise NotImplementedError("'get_host' method not implemented")
|
||
|
|
||
|
def _set_host_info_state(self, prefix, state):
|
||
|
"""Update state value to the label in the host_info
|
||
|
|
||
|
@param host: dut host presentation to provide access to host_info
|
||
|
@param prefix: label prefix. (ex. label_prefix:value)
|
||
|
@param state: new state value for the label
|
||
|
"""
|
||
|
if self._dut_host and prefix:
|
||
|
host_info = self._dut_host.host_info_store.get()
|
||
|
old_state = host_info.get_label_value(prefix)
|
||
|
host_info.set_version_label(prefix, state)
|
||
|
logging.info('Set %s as `%s` (previous: `%s`)',
|
||
|
prefix, state, old_state)
|
||
|
self._dut_host.host_info_store.commit(host_info)
|
||
|
|
||
|
def host_is_up(self):
|
||
|
"""Check if the host is up and available by ssh"""
|
||
|
return self._dut_host.is_up(timeout=20)
|
||
|
|
||
|
def servo_is_up(self):
|
||
|
"""Check if servo host is up and servod is initialized"""
|
||
|
return self.servo_host_is_up() and bool(self._dut_host.servo)
|
||
|
|
||
|
def servo_host_is_up(self):
|
||
|
"""Check if servo host is up and available by ssh"""
|
||
|
return (self._dut_host._servo_host
|
||
|
and self._dut_host._servo_host.is_up(timeout=20))
|
||
|
|
||
|
def set_result_dir(self, result_dir):
|
||
|
"""Set result directory path."""
|
||
|
logging.debug('Set result_dir: %s', result_dir)
|
||
|
self._result_dir = result_dir
|
||
|
|
||
|
def get_result_dir(self):
|
||
|
"""Provide result directory path."""
|
||
|
return self._result_dir
|
||
|
|
||
|
|
||
|
class _BaseDUTVerifier(_BaseVerifier):
|
||
|
"""Base verify check availability of DUT before run actual verifier.
|
||
|
|
||
|
Verifier run audit actions against CrosHost.
|
||
|
"""
|
||
|
|
||
|
def get_host(self):
|
||
|
"""Return CrosHost"""
|
||
|
return self._dut_host
|
||
|
|
||
|
def verify(self, **args):
|
||
|
"""Vallidate the host reachable by SSH and run verifier"""
|
||
|
if not self._dut_host:
|
||
|
raise AuditError('host is not present')
|
||
|
self._verify(**args)
|
||
|
|
||
|
|
||
|
class _BaseServoVerifier(_BaseVerifier):
|
||
|
"""Base verify check availability of Servo before run actual verifier
|
||
|
|
||
|
Verifier run audit actions against ServoHost.
|
||
|
"""
|
||
|
def get_host(self):
|
||
|
"""Return ServoHost"""
|
||
|
return self._dut_host._servo_host
|
||
|
|
||
|
def verify(self):
|
||
|
"""Vallidate the host and servo initialized and run verifier"""
|
||
|
if not self._dut_host:
|
||
|
raise AuditError('host is not present')
|
||
|
self._verify()
|