aboutsummaryrefslogtreecommitdiff
path: root/rpki/rpkidb
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2016-04-23 15:02:57 +0000
committerRob Austein <sra@hactrn.net>2016-04-23 15:02:57 +0000
commit0a712cef8857c6cfc53c2157ffaf5553d70c6472 (patch)
treebe8ecd049fec672f7e82020a281359b1f36478ad /rpki/rpkidb
parent772ff8e5a51b11d424b453990c6c9a0a4c03d31c (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
Diffstat (limited to 'rpki/rpkidb')
-rw-r--r--rpki/rpkidb/migrations/0002_add_turtle.py56
-rw-r--r--rpki/rpkidb/migrations/0003_turtle_data.py41
-rw-r--r--rpki/rpkidb/migrations/0004_turtle_cleanup.py26
-rw-r--r--rpki/rpkidb/models.py24
4 files changed, 140 insertions, 7 deletions
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),