# Copyright 2019 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. """This module provides functions for loading side_effects_config.json. """ import errno import os from google.protobuf import json_format import common from autotest_lib.utils.side_effects.proto import config_pb2 _SIDE_EFFECTS_CONFIG_FILE = 'side_effects_config.json' def load(results_dir): """Load a side_effects_config.json file. @param results_dir: The path to the results directory containing the file. @returns: a side_effects.Config proto object if side_effects_config.json exists, None otherwise. @raises: json_format.ParseError if the content of side_effects_config.json is not valid JSON. """ config_path = os.path.join(results_dir, _SIDE_EFFECTS_CONFIG_FILE) if not os.path.exists(config_path): return None with open(config_path, 'r') as config_file: content = config_file.read() config = config_pb2.Config() return json_format.Parse(content, config, ignore_unknown_fields=True) def validate_tko(config): """Validate the tko field of the side_effects.Config. @param config: A side_effects.Config proto. @raises: ValueError if the tko field does not contain all required fields. OSError if one of the required files is missing. """ _check_empty_fields({ 'TKO proxy socket': config.tko.proxy_socket, 'TKO MySQL user': config.tko.mysql_user, 'TKO MySQL password file': config.tko.mysql_password_file }) _check_file_existence({ 'TKO proxy socket': config.tko.proxy_socket, 'TKO MySQL password file': config.tko.mysql_password_file }) def validate_google_storage(config): """Validate the google_storage field of the side_effects.Config. @param config: A side_effects.Config proto. @raises: ValueError if the tko field does not contain all required fields. OSError if one of the required files is missing. """ _check_empty_fields({ 'Google Storage bucket': config.google_storage.bucket, 'Google Storage credentials file': config.google_storage.credentials_file }) _check_file_existence({ 'Google Storage credentials file': config.google_storage.credentials_file }) def _check_empty_fields(fields): """Return a list of missing required TKO-related fields. @param fields: A dict mapping string field descriptions to string field values. @raises: ValueError if at least one of the field values is empty. """ empty_fields = [] for description, value in fields.items(): if not value: empty_fields.append(description) if empty_fields: raise ValueError('Missing required fields: ' + ', '.join(empty_fields)) def _check_file_existence(files): """Checks that all given files exist. @param files: A dict mapping string file descriptions to string file names. @raises: OSError if at least one of the files is missing. """ missing_files = [] for description, path in files.items(): if not os.path.exists(path): missing_files.append(description + ': ' + path) if missing_files: raise OSError(errno.ENOENT, os.strerror(errno.ENOENT), ', '.join(missing_files))