From 7cf639d8eb7dca9a1ad45e55033fefad1df1b0bf Mon Sep 17 00:00:00 2001 From: Seth Foster Date: Fri, 19 Jan 2024 00:14:18 -0500 Subject: [PATCH] Add migration to support InstanceLink changes - Add forwards method to create a receptor address for any existing Instance that has listener_port defined - Add forwards method to modify each InstanceLink object that changes target to the newly created receptor addresses This migration was implemented as follows: 1. Add a target_new to InstanceLink which is a foreign key to ReceptorAddress 2. create receptor addresses 3. link to these receptor addresses using the target_new field 4. rename target_new to target 5. drop listener_port and peers_from_control_nodes from Instance Signed-off-by: Seth Foster --- awx/main/migrations/0189_inbound_hop_nodes.py | 81 ++++++++++++++----- 1 file changed, 63 insertions(+), 18 deletions(-) diff --git a/awx/main/migrations/0189_inbound_hop_nodes.py b/awx/main/migrations/0189_inbound_hop_nodes.py index 3f97aadb2e..e16b342905 100644 --- a/awx/main/migrations/0189_inbound_hop_nodes.py +++ b/awx/main/migrations/0189_inbound_hop_nodes.py @@ -1,10 +1,42 @@ -# Generated by Django 4.2.6 on 2024-01-12 20:01 +# Generated by Django 4.2.6 on 2024-01-19 03:13 import django.core.validators from django.db import migrations, models import django.db.models.deletion +def create_receptor_address(apps, schema_editor): + """ + if listener_port was defined on an instance, create a receptor address for it + """ + Instance = apps.get_model('main', 'Instance') + ReceptorAddress = apps.get_model('main', 'ReceptorAddress') + for instance in Instance.objects.all(): + if instance.listener_port: + instance.peers_from.all() + ReceptorAddress.objects.create( + instance=instance, + address=instance.hostname, + port=instance.listener_port, + peers_from_control_nodes=instance.peers_from_control_nodes, + protocol='tcp', + is_internal=False, + canonical=True, + ) + + +def link_to_receptor_address(apps, schema_editor): + """ + modify each InstanceLink to point to the newly created + ReceptorAddresses, through the target_new field + target_new will be renamed to target in an operation below + """ + InstanceLink = apps.get_model('main', 'InstanceLink') + for link in InstanceLink.objects.all(): + link.target_new = link.target.receptor_addresses.get() + link.save() + + class Migration(migrations.Migration): dependencies = [ ('main', '0188_add_bitbucket_dc_webhook'), @@ -35,7 +67,7 @@ class Migration(migrations.Migration): ), ), ('is_internal', models.BooleanField(default=False, help_text='If True, only routable within the Kubernetes cluster.')), - ('canonical', models.BooleanField(default=True, help_text='If True, this address is the canonical address for the instance.')), + ('canonical', models.BooleanField(default=False, help_text='If True, this address is the canonical address for the instance.')), ( 'peers_from_control_nodes', models.BooleanField(default=False, help_text='If True, control plane cluster nodes should automatically peer to it.'), @@ -50,24 +82,11 @@ class Migration(migrations.Migration): name='instancelink', unique_together=set(), ), - migrations.RemoveField( - model_name='instance', - name='listener_port', - ), - migrations.RemoveField( - model_name='instance', - name='peers_from_control_nodes', - ), migrations.AddField( model_name='instance', name='managed', field=models.BooleanField(default=False, editable=False, help_text='If True, this instance is managed by the control plane.'), ), - migrations.AlterField( - model_name='instancelink', - name='source', - field=models.ForeignKey(help_text='The source instance of this peer link.', on_delete=django.db.models.deletion.CASCADE, to='main.instance'), - ), migrations.AddConstraint( model_name='instancelink', constraint=models.UniqueConstraint(fields=('source', 'target'), name='source_target_unique_together'), @@ -82,6 +101,23 @@ class Migration(migrations.Migration): name='receptor_address', field=models.ManyToManyField(blank=True, to='main.receptoraddress'), ), + migrations.AddField( + model_name='instancelink', + name='target_new', + field=models.ForeignKey( + help_text='The target receptor address of this peer link.', null=True, on_delete=django.db.models.deletion.CASCADE, to='main.receptoraddress' + ), + ), + migrations.AddConstraint( + model_name='receptoraddress', + constraint=models.UniqueConstraint(fields=('address',), name='unique_receptor_address', violation_error_message='Receptor address must be unique.'), + ), + migrations.RunPython(create_receptor_address), + migrations.RunPython(link_to_receptor_address), + migrations.RemoveField( + model_name='instancelink', + name='target_new', + ), migrations.AlterField( model_name='instance', name='peers', @@ -94,8 +130,17 @@ class Migration(migrations.Migration): help_text='The target receptor address of this peer link.', on_delete=django.db.models.deletion.CASCADE, to='main.receptoraddress' ), ), - migrations.AddConstraint( - model_name='receptoraddress', - constraint=models.UniqueConstraint(fields=('address',), name='unique_receptor_address', violation_error_message='Receptor address must be unique.'), + migrations.AlterField( + model_name='instancelink', + name='source', + field=models.ForeignKey(help_text='The source instance of this peer link.', on_delete=django.db.models.deletion.CASCADE, to='main.instance'), + ), + migrations.RemoveField( + model_name='instance', + name='listener_port', + ), + migrations.RemoveField( + model_name='instance', + name='peers_from_control_nodes', ), ]