From 4449555abe6d1921d80efe7be7593267c3078593 Mon Sep 17 00:00:00 2001 From: Jeff Bradberry Date: Fri, 17 Dec 2021 14:28:33 -0500 Subject: [PATCH] Add a new register_peers management command and alter provision_instance to accept hop nodes. --- .../management/commands/provision_instance.py | 12 ++++---- .../management/commands/register_peers.py | 30 +++++++++++++++++++ 2 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 awx/main/management/commands/register_peers.py diff --git a/awx/main/management/commands/provision_instance.py b/awx/main/management/commands/provision_instance.py index 3056a09b9c..c3c8f188ab 100644 --- a/awx/main/management/commands/provision_instance.py +++ b/awx/main/management/commands/provision_instance.py @@ -13,19 +13,19 @@ class Command(BaseCommand): Register this instance with the database for HA tracking. """ - help = 'Add instance to the database. ' 'Specify `--hostname` to use this command.' + help = "Add instance to the database. Specify `--hostname` to use this command." def add_arguments(self, parser): - parser.add_argument('--hostname', dest='hostname', type=str, help='Hostname used during provisioning') - parser.add_argument('--node_type', type=str, default="hybrid", choices=["control", "execution", "hybrid"], help='Instance Node type') - parser.add_argument('--uuid', type=str, help='Instance UUID') + parser.add_argument('--hostname', dest='hostname', type=str, help="Hostname used during provisioning") + parser.add_argument('--node_type', type=str, default='hybrid', choices=['control', 'execution', 'hop', 'hybrid'], help="Instance Node type") + parser.add_argument('--uuid', type=str, help="Instance UUID") def _register_hostname(self, hostname, node_type, uuid): if not hostname: return (changed, instance) = Instance.objects.register(hostname=hostname, node_type=node_type, uuid=uuid) if changed: - print('Successfully registered instance {}'.format(hostname)) + print("Successfully registered instance {}".format(hostname)) else: print("Instance already registered {}".format(instance.hostname)) self.changed = changed @@ -37,4 +37,4 @@ class Command(BaseCommand): self.changed = False self._register_hostname(options.get('hostname'), options.get('node_type'), options.get('uuid')) if self.changed: - print('(changed: True)') + print("(changed: True)") diff --git a/awx/main/management/commands/register_peers.py b/awx/main/management/commands/register_peers.py new file mode 100644 index 0000000000..3a9af7947f --- /dev/null +++ b/awx/main/management/commands/register_peers.py @@ -0,0 +1,30 @@ +from django.core.management.base import BaseCommand, CommandError + +from awx.main.models import Instance, InstanceLink + + +class Command(BaseCommand): + """ + Internal tower command. + Register the peers of a receptor node. + """ + + def add_arguments(self, parser): + parser.add_argument('source', type=str, help="") + parser.add_argument('--peers', type=str, nargs='+', required=True, help="") + + def handle(self, **options): + nodes = Instance.objects.in_bulk(field_name='hostname') + if options['source'] not in nodes: + raise CommandError() + missing_peers = set(options['peers']) - set(nodes) + if missing_peers: + raise CommandError() + + results = 0 + for target in options['peers']: + instance, created = InstanceLink.objects.get_or_create(source=nodes[options['source']], target=nodes[target]) + if created: + results += 1 + + print(f"{results} new peer links added to the database.")