aboutsummaryrefslogtreecommitdiff
path: root/scripts/testdb.py
blob: 01781d39525504f85e2a37e3e05cf2f682bbfce1 (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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# $Id$

import rpki.resource_set, os, yaml

class allocation_db(list):

  def __init__(self, yaml):
    self.root = allocation(yaml, self)
    assert self.root.is_root()
    self.root.closure()
    self.map = dict((a.name, a) for a in self)
    for i, a in zip(range(len(self)), self):
      a.number = i

  def get(self, name, default = None):
    return self.map.get(name, default)

  def apply_delta(self, delta):
    for d in delta:
      self.map[d["name"]].apply_delta(d)
    self.root.closure()

class allocation(object):

  parent = None

  def __init__(self, yaml, db, parent = None):
    db.append(self)
    self.name = yaml["name"]
    self.parent = parent
    self.kids = [allocation(k, db, self) for k in yaml.get("kids", ())]
    self.base = rpki.resource_set.resource_bag(
      as = rpki.resource_set.resource_set_as(yaml.get("asn")),
      v4 = rpki.resource_set.resource_set_ipv4(yaml.get("ipv4")),
      v6 = rpki.resource_set.resource_set_ipv6(yaml.get("ipv6")))

  def closure(self):
    """Compute the transitive resource closure for one resource attribute."""
    resources = self.base
    for kid in self.kids:
      resources = resources.union(kid.closure())
    self.resources = resources
    return resources

  def apply_delta(self, yaml):
    for k,v in yaml.items():
      if k != "name":
        getattr(self, "apply_" + k)(v)

  def apply_add_as(self, text):
    self.base.as = self.base.as.union(rpki.resource_set.resource_set_as(text))

  def apply_add_v4(self, text):
    self.base.v4 = self.base.v4.union(rpki.resource_set.resource_set_ipv4(text))

  def apply_add_v6(self, text):
    self.base.v6 = self.base.v6.union(rpki.resource_set.resource_set_ipv6(text))

  def apply_sub_as(self, text):
    self.base.as = self.base.as.difference(rpki.resource_set.resource_set_as(text))

  def apply_sub_v4(self, text):
    self.base.v4 = self.base.v4.difference(rpki.resource_set.resource_set_ipv4(text))

  def apply_sub_v6(self, text):
    self.base.v6 = self.base.v6.difference(rpki.resource_set.resource_set_ipv6(text))

  def dict(self):
    return { "name"   : self.name,
             "as"     : self.resources.as,
             "v4"     : self.resources.v4,
             "v6"     : self.resources.v6,
             "number" : str(self.number) }

  def is_leaf(self):
    return not self.kids

  def is_root(self):
    return self.parent is None

  def is_twig(self):
    return self.parent is not None and self.kids

  def write_conf(self):
    if self.is_twig():
      f = open(self.name + ".conf", "w")
      f.write(conf_fmt % self.dict())
      f.close()

  def write_yaml(self):
    if self.is_leaf():
      f = open(self.name + ".yaml", "w")
      f.write(yaml_fmt % self.dict())
      f.close()

dump_fmt = '''\
   #: %(number)s
Name: %(name)s
 ASN: %(as)s
IPv4: %(v4)s
IPv6: %(v6)s
'''

def dump():
  for a in db:
    print dump_fmt % a.dict()

y = [y for y in yaml.safe_load_all(open("testdb2.yaml"))]

print "Loading", str(y[0]), "\n"

db = allocation_db(y[0])
dump()

for delta in y[1:]:
  print "Applying delta", str(delta), "\n"
  db.apply_delta(delta)
  dump()

# Steps we need to take here
#
# 1: Construct config files for RPKId and IRDB instances
# 2: Initialize sql for RPKI and IRDB instances
# 3: Construct biz keys and certs for RPKI and IRDB instances
# 4: Populate IRDB(s)
# 5: Start RPKI and IRDB instances
# 6: Create objects in RPKI engines
# 7: Write YAML files for leaves
# 8: Start cycle:
# 8a: Run cron in all RPKI instances
# 8b: Run all YAML clients
# 8c: Read and apply next deltas from master YAML
#
# This is going to be ugly