From f01c1d971b88e40f205ebdc644afc31e5f33c3be Mon Sep 17 00:00:00 2001 From: Neill Cox Date: Sun, 17 Sep 2023 20:28:11 -0400 Subject: [PATCH] Initial commit --- .gitignore | 1 + README.md | 26 +++++++++++ main.py | 117 +++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 6 +++ 4 files changed, 150 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 main.py create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f7275bb --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +venv/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..99f69ca --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +A quick and dirty script to help set up a RHOSP AIO + +``` +usage: main.py [-h] -u USERNAME -p PASSWORD -a ADDRESS [-i INTERFACE] + [-m NETMASK] -d DNS [DNS ...] [-D DOMAIN] + [--using-multiple-nics] [-U DEPLOYMENT_USER] + [--deployment-dir DEPLOYMENT_DIR] [-g GATEWAY] + [--containers-yaml-out CONTAINERS_YAML_OUT] + [--standalone-yaml-out STANDALONE_YAML_OUT] + +optional arguments: + -h, --help show this help message and exit + -u USERNAME, --username USERNAME + -p PASSWORD, --password PASSWORD + -a ADDRESS, --address ADDRESS + -i INTERFACE, --interface INTERFACE + -m NETMASK, --netmask NETMASK + -d DNS [DNS ...], --dns DNS [DNS ...] + -D DOMAIN, --domain DOMAIN + --using-multiple-nics + -U DEPLOYMENT_USER, --deployment-user DEPLOYMENT_USER + --deployment-dir DEPLOYMENT_DIR + -g GATEWAY, --gateway GATEWAY + --containers-yaml-out CONTAINERS_YAML_OUT + --standalone-yaml-out STANDALONE_YAML_OUT +``` diff --git a/main.py b/main.py new file mode 100644 index 0000000..ff25069 --- /dev/null +++ b/main.py @@ -0,0 +1,117 @@ +""" +Quick and dirty script to help setup config filers for a RHOSP AIO install +""" +import argparse +import os +import subprocess +import yaml + + +def parse_args(): + """Parse the command line arguments""" + parser = argparse.ArgumentParser() + parser.add_argument("-u", "--username", required=True) + parser.add_argument("-p", "--password", required=True) + parser.add_argument("-a", "--address", required=True) + parser.add_argument("-i", "--interface", default="enp1s0") + parser.add_argument("-m", "--netmask", default=24) + parser.add_argument( + "-d", "--dns", nargs="+", action="append", required=True + ) + parser.add_argument("-D", "--domain", default="aio") + parser.add_argument("--using-multiple-nics", action="store_true") + parser.add_argument("-U", "--deployment-user") + parser.add_argument("--deployment-dir") + parser.add_argument("-g", "--gateway") + parser.add_argument( + "--containers-yaml-out", + default="./containers-prepare-parameters.yaml.gen", + ) + parser.add_argument( + "--standalone-yaml-out", default="./standalone_parameters.yaml.gen" + ) + + args = parser.parse_args() + + if not args.deployment_user: + args.deployment_user = os.environ.get("USER") + + if not args.deployment_dir: + args.deployment_dir = os.environ.get("HOME") + + if not args.using_multiple_nics and not args.gateway: + raise ValueError("Must specify a gateway when using a single nic") + + return args + + +def get_standalone_parameters(args): + """Build the standalone parameters as a dict ready to serialize as yaml""" + sp_dict = { + "parameter_defaults": { + "CloudName": args.address, + "CloudDomain": args.domain, + "ControlPlaneStaticRoutes": [], + "Debug": True, + "DeploymentUser": args.deployment_user, + "DnsServers": [dns[0] for dns in args.dns], + "NeutronPublicInterface": args.interface, + "NeutronDnsDomain": "localdomain", + "NeutronBridgeMappings": "datacentre:br-ctlplane", + "NeutronPhysicalBridge": "br-ctlplane", + "StandaloneEnableRoutedNetworks": False, + "StandaloneHomeDir": args.deployment_dir, + "StandaloneLocalMtu": 1500, + } + } + + if not args.using_multiple_nics: + sp_dict["parameter_defaults"]["ControlPlaneStaticRoutes"] = [ + { + "ip_netmask": "0.0.0.0/0", + "next_hop": args.gateway, + "default": True, + } + ] + + return sp_dict + + +def build_containers_yaml(args): + """Build the containers yaml based on a previously generated file.""" + + cmd = "sudo openstack tripleo container image prepare default" + result = subprocess.check_output(cmd, shell=True, universal_newlines=True) + + data = yaml.load(result, Loader=yaml.Loader) + + data["parameter_defaults"]["ContainerImageRegistryCredentials"] = { + "registry.redhat.io": {args.username: args.password} + } + + data["parameter_defaults"]["ContainerImageRegistryLogin"] = True + + return data + + +def main(): + """main function""" + args = parse_args() + + containers_yaml = build_containers_yaml(args) + with open( + args.containers_yaml_out, "w", encoding="utf-8" + ) as containers_out: + containers_out.write(yaml.dump(containers_yaml)) + print(f"containers yaml written to {args.containers_yaml_out}") + + standalone_parameters = get_standalone_parameters(args) + with open( + args.standalone_yaml_out, "w", encoding="utf-8" + ) as parameters_out: + parameters_out.write(yaml.dump(standalone_parameters)) + print(f"standalone parameters yaml written to {args.standalone_yaml_out}") + + +if __name__ == "__main__": + main() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..cdb17ee --- /dev/null +++ b/requirements.txt @@ -0,0 +1,6 @@ +# black==22.8.0 +# bpython==0.22.1 +# flake8==5.0.4 +# pyflakes==2.5.0 +# pylint==2.13.9 +PyYAML==6.0.1