From a31bd1a8fd7c36801bedb9cf62acf8a1b7411665 Mon Sep 17 00:00:00 2001 From: Jeremy Stanley Date: Tue, 22 Nov 2022 18:22:56 +0000 Subject: [PATCH] Improve launch-node deps and fix script bugs The version of python-cinderclient needs to be constrained to before the point at which it dropped volume API v2 support (which happened in 8.0.0). If this is pinned back, latest openstackclient can be installed and used for Rackspace volume operations without issue. Make sure we install new enough OpenStackSDK so it doesn't try to pass unsupported networking options in server create calls to Rackspace too. The script itself had a couple of issues once rehomed, the first being it was looking for Ansible playbooks relative to its former path in the repository rather than its installed location in the venv, so make that path configurable but have it default to the absolute path to those on the bridge now. Also, the script really wanted to clear the ansible cache, but when that path doesn't exist (as is currently the case on the bridge), it aborts rather than continuing, so wrap that call in a try/except. While we're here, update our default server image from focal to jammy. Change-Id: I103c7799ebe319d2d8b3fb626d7804387d3e8a60 --- launch/pyproject.toml | 10 ++++----- launch/src/opendev_launch/launch_node.py | 28 +++++++++++++++--------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/launch/pyproject.toml b/launch/pyproject.toml index f1a56a379f..3d8b46d031 100644 --- a/launch/pyproject.toml +++ b/launch/pyproject.toml @@ -14,11 +14,11 @@ classifiers = [ ] dependencies = [ "paramiko>=2.9.1", - # This is a very specific list which is known to work - # with RAX storage... - "python-openstackclient==4.0.2", - "python-cinderclient==9.1.0", - "openstacksdk==0.102.0" + "python-openstackclient", + # Minimum to work with clouds like RAX that don't take network:auto + "openstacksdk>=0.103", + # Pin to a version of cinderclient known to work with RAX storage... + "python-cinderclient<8", ] [project.urls] diff --git a/launch/src/opendev_launch/launch_node.py b/launch/src/opendev_launch/launch_node.py index 461cb9e9cf..937db1a2f1 100755 --- a/launch/src/opendev_launch/launch_node.py +++ b/launch/src/opendev_launch/launch_node.py @@ -96,7 +96,8 @@ def stream_syslog(ssh_client): def bootstrap_server(server, key, name, volume_device, keep, - mount_path, fs_label, environment, timeout, ignore_ipv6): + mount_path, fs_label, environment, timeout, ignore_ipv6, + playbooks): ip = server.public_v4 ssh_kwargs = dict(pkey=key) @@ -156,8 +157,11 @@ def bootstrap_server(server, key, name, volume_device, keep, # Zero the ansible inventory cache so that next run finds the new server inventory_cache_dir = '/var/cache/ansible/inventory' - for inventory_cache in os.listdir(inventory_cache_dir): - os.unlink(os.path.join(inventory_cache_dir, inventory_cache)) + try: + for inventory_cache in os.listdir(inventory_cache_dir): + os.unlink(os.path.join(inventory_cache_dir, inventory_cache)) + except FileNotFoundError: + pass with JobDir(keep) as jobdir: # Update the generated-groups file globally and incorporate it @@ -211,8 +215,7 @@ def bootstrap_server(server, key, name, volume_device, keep, 'base.yaml', 'apply-package-updates.yaml', ]: - run(ansible_cmd + [ - os.path.join(SCRIPT_DIR, '..', 'playbooks', playbook)], + run(ansible_cmd + [os.path.join(playbooks, playbook)], env=jobdir.env) try: @@ -229,7 +232,7 @@ def bootstrap_server(server, key, name, volume_device, keep, def build_server(cloud, name, image, flavor, volume, keep, network, boot_from_volume, config_drive, mount_path, fs_label, availability_zone, environment, - volume_size, timeout, ignore_ipv6): + volume_size, timeout, ignore_ipv6, playbooks): key = None server = None @@ -275,7 +278,8 @@ def build_server(cloud, name, image, flavor, else: volume_device = None bootstrap_server(server, key, name, volume_device, keep, - mount_path, fs_label, environment, timeout, ignore_ipv6) + mount_path, fs_label, environment, timeout, + ignore_ipv6, playbooks) print('UUID=%s\nIPV4=%s\nIPV6=%s\n' % ( server.id, server.public_v4, server.public_v6)) except Exception: @@ -322,7 +326,7 @@ def main(): parser.add_argument("--flavor", dest="flavor", default='1GB', help="name (or substring) of flavor") parser.add_argument("--image", dest="image", - default="Ubuntu 20.04 LTS (Focal Fossa) (Cloud)", + default="Ubuntu 22.04 LTS (Jammy Jellyfish) (Cloud)", help="image name") parser.add_argument("--environment", dest="environment", help="Puppet environment to use", @@ -362,9 +366,12 @@ def main(): parser.add_argument("--ignore_ipv6", dest="ignore_ipv6", help="Ignore IPv6 addresses from API", action='store_true', default=False) - parser.add_argument("--az", dest="availability_zone", default=None, help="AZ to boot in.") + parser.add_argument("--playbooks", dest="playbooks", + default="/home/zuul/src/opendev.org/opendev/" + "system-config/playbooks", + help="alternative playbook directory") options = parser.parse_args() openstack.enable_logging(debug=options.verbose) @@ -407,7 +414,8 @@ def main(): options.mount_path, options.fs_label, options.availability_zone, options.environment, options.volume_size, - options.timeout, options.ignore_ipv6) + options.timeout, options.ignore_ipv6, + options.playbooks) dns.print_dns(cloud, server) print("If this is a server that is expected to send email (ask, review,") print("lists, etc) double check that the server's IPs are not listed on")