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.

110 lines
3.4 KiB

# 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))