diff options
author | Rob Austein <sra@hactrn.net> | 2016-04-23 15:02:57 +0000 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2016-04-23 15:02:57 +0000 |
commit | 0a712cef8857c6cfc53c2157ffaf5553d70c6472 (patch) | |
tree | be8ecd049fec672f7e82020a281359b1f36478ad | |
parent | 772ff8e5a51b11d424b453990c6c9a0a4c03d31c (diff) |
Step one of adding internal support for RPKI roots to rpkid: split
Parent model into base Turtle model and derived Parent model.
svn path=/branches/tk705/; revision=6367
-rw-r--r-- | Makefile.in | 4 | ||||
-rw-r--r-- | rpki/rpkid_tasks.py | 2 | ||||
-rw-r--r-- | rpki/rpkidb/migrations/0002_add_turtle.py | 56 | ||||
-rw-r--r-- | rpki/rpkidb/migrations/0003_turtle_data.py | 41 | ||||
-rw-r--r-- | rpki/rpkidb/migrations/0004_turtle_cleanup.py | 26 | ||||
-rw-r--r-- | rpki/rpkidb/models.py | 24 |
6 files changed, 143 insertions, 10 deletions
diff --git a/Makefile.in b/Makefile.in index 364ba7b1..ef929dd7 100644 --- a/Makefile.in +++ b/Makefile.in @@ -217,10 +217,10 @@ tags: Makefile .FORCE { find rpki rp ca schemas -type f \( -name '*.[ch]' -o -name '*.py' -o -name '*.sql' -o -name '*.rnc' \) ! -name relaxng.py -print; find rp ca -type f -perm -1 ! -name '*~' -print | xargs grep -El '^#!.+python'; } | etags - makemigrations: - RPKI_CONF=makemigrations.conf.$$$$ TEMP_DB=makemigrations.db.$$$$; export RPKI_CONF TEMP_DB; trap "rm -f $$RPKI_CONF $$TEMP_DB" 0; \ + PYTHONPATH=. RPKI_CONF=makemigrations.conf.$$$$ TEMP_DB=makemigrations.db.$$$$; export PYTHONPATH RPKI_CONF TEMP_DB; trap "rm -f $$RPKI_CONF $$TEMP_DB" 0; \ ${PYTHON} rp/config/rpki-confgen --read-xml rp/config/rpki-confgen.xml --autoconf --set myrpki::shared_sql_engine=sqlite3 \ --set myrpki::rpkid_sql_database=$$TEMP_DB --set myrpki::irdbd_sql_database=$$TEMP_DB --set myrpki::pubd_sql_database=$$TEMP_DB \ --pwgen myrpki::shared_sql_password --pwgen web_portal::secret-key --write-conf $$RPKI_CONF; \ - for i in rpkid pubd irdb rcynic; do rp/config/rpki-manage makemigrations --settings rpki.django_settings.$$i; done + for i in rpkid pubd irdb rcynic; do django-admin makemigrations --settings rpki.django_settings.$$i; done .FORCE: diff --git a/rpki/rpkid_tasks.py b/rpki/rpkid_tasks.py index 4fff7511..77fdf870 100644 --- a/rpki/rpkid_tasks.py +++ b/rpki/rpkid_tasks.py @@ -152,7 +152,7 @@ class PollParentTask(AbstractTask): def main(self): logger.debug("%r: Polling parents", self) - for parent in self.tenant.parents.all(): + for parent in rpki.rpkidb.models.Parent.objects.filter(tenant = self.tenant): try: logger.debug("%r: Executing list query", self) list_r_msg = yield parent.up_down_list_query(rpkid = self.rpkid) diff --git a/rpki/rpkidb/migrations/0002_add_turtle.py b/rpki/rpkidb/migrations/0002_add_turtle.py new file mode 100644 index 00000000..e898f43a --- /dev/null +++ b/rpki/rpkidb/migrations/0002_add_turtle.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('rpkidb', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Turtle', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('parent_handle', models.SlugField(max_length=255)), + ('repository', models.ForeignKey(related_name='parents', to='rpkidb.Repository')), + ('tenant', models.ForeignKey(related_name='parents', to='rpkidb.Tenant')), + ], + ), + migrations.AlterUniqueTogether( + name='parent', + unique_together=set([]), + ), + migrations.RemoveField( + model_name='parent', + name='id', + ), + migrations.RenameField( + model_name='parent', + old_name='parent_handle', + new_name='old_parent_handle', + ), + migrations.RenameField( + model_name='parent', + old_name='repository', + new_name='old_repository', + ), + migrations.RenameField( + model_name='parent', + old_name='tenant', + new_name='old_tenant', + ), + migrations.AddField( + model_name='parent', + name='turtle_ptr', + field=models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, default=0, serialize=False, to='rpkidb.Turtle'), + preserve_default=False, + ), + migrations.AlterUniqueTogether( + name='turtle', + unique_together=set([('tenant', 'parent_handle')]), + ), + ] diff --git a/rpki/rpkidb/migrations/0003_turtle_data.py b/rpki/rpkidb/migrations/0003_turtle_data.py new file mode 100644 index 00000000..dbf3b211 --- /dev/null +++ b/rpki/rpkidb/migrations/0003_turtle_data.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +def turtle_forward(apps, schema_editor): + Turtle = apps.get_model("rpkidb", "Turtle") + Parent = apps.get_model("rpkidb", "Parent") + db_alias = schema_editor.connection.alias + for parent in Parent.objects.using(db_alias).all(): + turtle = Turtle.objects.using(db_alias).create( + parent_handle = parent.old_parent_handle, + tenant = parent.old_tenant, + repository = parent.old_repository) + parent.turtle_ptr = turtle + parent.save() + + +def turtle_reverse(apps, schema_editor): + Turtle = apps.get_model("rpkidb", "Turtle") + Parent = apps.get_model("rpkidb", "Parent") + db_alias = schema_editor.connection.alias + for parent in Parent.objects.using(db_alias).all(): + parent.old_parent_handle = parent.turtle_ptr.parent_handle + parent.old_tenant = parent.turtle_ptr.tenant + parent.old_repository = parent.turtle_ptr.repository + parent.turtle_ptr = None + parent.save() + Turtle.objects.using(db_alias).all().delete() + + +class Migration(migrations.Migration): + + dependencies = [ + ('rpkidb', '0002_add_turtle'), + ] + + operations = [ + migrations.RunPython(turtle_forward, turtle_reverse) + ] diff --git a/rpki/rpkidb/migrations/0004_turtle_cleanup.py b/rpki/rpkidb/migrations/0004_turtle_cleanup.py new file mode 100644 index 00000000..5d2d78ec --- /dev/null +++ b/rpki/rpkidb/migrations/0004_turtle_cleanup.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('rpkidb', '0003_turtle_data'), + ] + + operations = [ + migrations.RemoveField( + model_name='parent', + name='old_parent_handle', + ), + migrations.RemoveField( + model_name='parent', + name='old_repository', + ), + migrations.RemoveField( + model_name='parent', + name='old_tenant', + ), + ] diff --git a/rpki/rpkidb/models.py b/rpki/rpkidb/models.py index d71fdbc3..b1e66a8b 100644 --- a/rpki/rpkidb/models.py +++ b/rpki/rpkidb/models.py @@ -537,9 +537,24 @@ class Repository(models.Model): raise tornado.gen.Return(r_msg) -@xml_hooks -class Parent(models.Model): +# https://docs.djangoproject.com/en/1.9/topics/db/models/#multi-table-inheritance + +class Turtle(models.Model): + + # The parent-specific names here will need to change, but first + # step is testing whether the magic of multi-table inheritance + # causes all of this to Just Work until we change the field names. + parent_handle = models.SlugField(max_length = 255) + tenant = models.ForeignKey(Tenant, related_name = "parents") + repository = models.ForeignKey(Repository, related_name = "parents") + + class Meta: + unique_together = ("tenant", "parent_handle") + + +@xml_hooks +class Parent(Turtle): bpki_cert = CertificateField(null = True) bpki_glue = CertificateField(null = True) peer_contact_uri = models.TextField(null = True) @@ -547,14 +562,9 @@ class Parent(models.Model): sender_name = models.TextField(null = True) recipient_name = models.TextField(null = True) last_cms_timestamp = SundialField(null = True) - tenant = models.ForeignKey(Tenant, related_name = "parents") bsc = models.ForeignKey(BSC, related_name = "parents") - repository = models.ForeignKey(Repository, related_name = "parents") objects = XMLManager() - class Meta: - unique_together = ("tenant", "parent_handle") - xml_template = XMLTemplate( name = "parent", handles = (BSC, Repository), |