import getpass
import json
import os
import shutil
import sys
import yaml
from buildtest import BUILDTEST_VERSION
from buildtest.defaults import BUILDSPEC_CACHE_FILE, supported_schemas
from buildtest.exceptions import ConfigurationError
from buildtest.executors.setup import BuildExecutor
from buildtest.system import system
from jsonschema import ValidationError
from tabulate import tabulate
from termcolor import colored
[docs]def config_cmd(args, configuration):
"""Entry point for ``buildtest config`` command. This method will invoke other methods depending on input argument.
Args:
args (dict): Parsed arguments from `ArgumentParser.parse_args <https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser.parse_args>`_
configuration (buildtest.config.SiteConfiguration): An instance of SiteConfiguration class
"""
if args.config == "view":
view_configuration(configuration)
elif args.config == "executors":
buildexecutor = BuildExecutor(configuration)
view_executors(
configuration,
buildexecutor,
args.json,
args.yaml,
args.disabled,
args.invalid,
)
elif args.config == "summary":
view_summary(configuration)
elif args.config == "validate":
validate_config(configuration)
elif args.config == "systems":
view_system(configuration)
[docs]def view_system(configuration):
"""This method implements command ``buildtest config systems`` which displays
system details from configuration file in table format.
Args:
configuration (buildtest.config.SiteConfiguration): An instance of SiteConfiguration class
"""
table = {"system": [], "description": [], "hostnames": [], "moduletool": []}
for name in configuration.config["system"].keys():
table["system"].append(name)
table["description"].append(
configuration.config["system"][name].get("description")
)
table["moduletool"].append(configuration.config["system"][name]["moduletool"])
table["hostnames"].append(configuration.config["system"][name]["hostnames"])
if os.getenv("BUILDTEST_COLOR") == "True":
print(
tabulate(
table,
headers=[
colored(field, "blue", attrs=["bold"]) for field in table.keys()
],
tablefmt="grid",
)
)
return
print(tabulate(table, headers=table.keys(), tablefmt="grid"))
[docs]def validate_config(configuration):
"""This method implements ``buildtest config validate`` which attempts to
validate buildtest schema file `settings.schema.json <https://github.com/buildtesters/buildtest/blob/devel/buildtest/schemas/settings.schema.json>`_.
If it's not validate an exception is raised which could be
`jsonschema.exceptions.ValidationError <https://python-jsonschema.readthedocs.io/en/stable/errors/#jsonschema.exceptions.ValidationError>`_
or :class:`buildtest.exceptions.ConfigurationError`.
If configuration is valid buildtest print something as follows.
.. code-block:: console
bash-3.2$ buildtest config validate
/Users/siddiq90/Documents/GitHubDesktop/buildtest/buildtest/settings/config.yml is valid
If there is an error validating configuration file, buildtest will print error message reported by exception
Args:
configuration (buildtest.config.SiteConfiguration): An instance of SiteConfiguration class
Raises:
SystemExit: If exception is raised during validating configuration file.
"""
try:
configuration.validate()
except (ValidationError, ConfigurationError) as err:
print(err)
raise sys.exit(f"{configuration.file} is not valid")
print(f"{configuration.file} is valid")
[docs]def view_configuration(configuration):
"""Display content of buildtest configuration file. This implements command ``buildtest config view``"""
print(
yaml.dump(
configuration.target_config, default_flow_style=False, sort_keys=False
)
)
print("{:_<80}".format(""))
print(f"Settings File: {configuration.file}")
[docs]def view_executors(
configuration,
buildexecutor,
json_format=False,
yaml_format=False,
disabled=False,
invalid=False,
):
"""Display executors from buildtest configuration. This implements ``buildtest config executors`` command.
Args:
configuration (buildtest.config.SiteConfiguration): An instance of SiteConfiguration class
buildexecutor (buildtest.executors.setup.BuildExecutor): An instance of BuildExecutor class
json_format (bool): Display output in json format which is specified via ``buildtest config executors --json``
yaml_format (bool): Display output in yaml format which is specified via ``buildtest config executors --yaml``
disabled (bool): Display list of disabled executors which is specified via ``buildtest config executors --disabled``
invalid (bool): Display list of invalid executors which is specified via ``buildtest config executors --invalid``
"""
d = {"executors": configuration.target_config["executors"]}
# display output in JSON format
if json_format:
print(json.dumps(d, indent=2))
return
# display output in YAML format
if yaml_format:
print(yaml.dump(d, default_flow_style=False))
return
if disabled:
executors = configuration.disabled_executors
if not executors:
print("There are no disabled executors")
return
for executor in executors:
print(executor)
return
if invalid:
executors = configuration.invalid_executors
if not executors:
print("There are no invalid executors")
return
for executor in executors:
print(executor)
return
names = buildexecutor.list_executors()
for name in names:
print(name)
[docs]def view_summary(configuration, buildtestsystem=None):
"""This method implements ``buildtest config summary`` option. In this method
we will display a summary of System Details, Buildtest settings, Schemas,
Repository details, Buildspecs files and test names.
Args:
configuration (buildtest.config.SiteConfiguration): An instance of SiteConfiguration class
buildexecutor (buildtest.executors.setup.BuildExecutor): An instance of BuildExecutor class
"""
system_details = buildtestsystem or system
print("buildtest version: ", BUILDTEST_VERSION)
print("buildtest Path:", shutil.which("buildtest"))
print("\n")
print("Machine Details")
print("{:_<30}".format(""))
print("Operating System: ", system_details.system["os"])
print("Hostname: ", system_details.system["host"])
print("Machine: ", system_details.system["machine"])
print("Processor: ", system_details.system["processor"])
print("Python Path", system_details.system["python"])
print("Python Version:", system_details.system["pyver"])
print("User:", getpass.getuser())
print("\n")
print("Buildtest Settings")
print("{:_<80}".format(""))
print(f"Buildtest Settings: {configuration.file}")
executors = []
for executor_type in configuration.target_config.get("executors").keys():
for name in configuration.target_config["executors"][executor_type].keys():
executors.append(f"{executor_type}.{name}")
print("Executors: ", executors)
print("Buildspec Cache File:", BUILDSPEC_CACHE_FILE)
print("\n")
print("Buildtest Schemas")
print("{:_<80}".format(""))
print("Available Schemas:", supported_schemas)