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