aboutsummaryrefslogtreecommitdiff
path: root/rpki/rcynicdb/models.py
blob: 318f87e3fa800c8b295d00bf495d13ff98e82aff (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# First cut at ORM models for rcynicng, assuming for now that we're
# going to go with Django rather than raw SQL.

from django.db import models

# HTTP/HTTPS/RSYNC fetch event.
#
# Open issue: for RRDP, are we just recording the notification fetch,
# or the snapshot/delta fetches as well?  If the latter, to which
# retrieval event does the RRDPSnapshot 1:1 relationship refer?  For
# that matter, should we somehow be recording the relationship between
# the notification and snapshot/delta fetches?  Given that, at least
# in the current protocol, we will only do either one snapshot fetch
# or one delta fetch after the notify fetch, we could just use two
# URIs in the retrieval record, if we allow the second to be empty
# (which we would have to do anyway for rsync).
#
# Or we could add some kind of fun SQL self-reference, which, in
# Django, looks like:
#
#   models.ForeignKey('self', on_delete = models.CASCADE)
#
# except that it's more like a 1:1 recursive relationship, which isn't
# mentioned in the Django docs, but which supposedly
# (http://stackoverflow.com/questions/18271001/django-recursive-relationship)
# works the same way:
#
#   models.OneToOneField('self', null = True)
#
# Unclear whether we still need "on_delete = models.CASCADE", probably.
# Example on StackOverflow has a complex .save() method, but that may
# be specific to the original poster's desired semantics.

class Retrieval(models.Model):
    uri = models.TextField()
    started = models.DateTimeField()
    finished = models.DateTimeField()
    successful = models.BooleanField()

# Collection of validated objects (like current
# rsync-data/authenticated.yyyy-mm-ddTHH:MM:SS/ tree)

class Authenticated(models.Model):
    timestamp = models.DateTimeField()

# One instance of an RRDP snapshot.
#
# Deltas are processed by finding the RRDPSnapshot holding the
# starting point, creating a new RRDPSnapshot for the endpoint, and
# applying all necessary deltas (with consistency checks all along the
# way) to get from one to the other; we don't commit the endpoint (or
# anything created during the process) until and unless it all works.
#
# Not sure we want uuid field, drop if not useful.

class RRDPSnapshot(models.Model):
    timestamp = models.DateTimeField()
    uuid = models.UUIDField()
    serial = models.BigIntegerField()
    retrieved = models.OneToOneField(Retrieval)

# RPKI objects.

class RPKIObject(models.Model):
    der = models.BinaryField(unique = True)
    uri = models.TextField()
    aki = models.SlugField(max_length = 40)  # hex SHA-1
    ski = models.SlugField(max_length = 40)  # hex SHA-1
    hash = models.SlugField(max_length = 64) # hex SHA-256
    retrieved = models.ForeignKey(Retrieval)
    authenticated = models.ManyToManyField(Authenticated)
    snapshot = models.ManyToManyField(RRDPSnapshot)

# No exact analogue to current unauthenticated tree.  Generally, when
# we would have looked in the unauthenticated tree we want the most
# recently retrieved copy of a particular object, but particular
# object gets a little weird in RRDP universe.  See Tim's draft, not
# gospel but best worked example available to date.