blob: 0112259d5e58108e9e2a559062705c5a4e7ec0c9 [file] [log] [blame]
Scott Bakerb87b8732015-05-08 10:55:30 -07001import os
2import requests
3import socket
4import sys
5import base64
6from django.db.models import F, Q
7from xos.config import Config
8from observer.syncstep import SyncStep
9from observer.ansible import run_template_ssh
10from core.models import Service
11from cord.models import VCPEService, VCPETenant, VBNGTenant, VBNGService
12from hpc.models import HpcService, CDNPrefix
13from util.logger import Logger, logging
14
Scott Baker0bfb4002015-05-29 11:53:39 -070015VBNG_API = "http://10.0.3.136:8181/onos/virtualbng/privateip/"
Scott Bakerb87b8732015-05-08 10:55:30 -070016
17# hpclibrary will be in steps/..
18parentdir = os.path.join(os.path.dirname(__file__),"..")
19sys.path.insert(0,parentdir)
20
21logger = Logger(level=logging.INFO)
22
23class SyncVBNGTenant(SyncStep):
24 provides=[VCPETenant]
25 observes=VCPETenant
26 requested_interval=0
27
28 def __init__(self, **args):
29 SyncStep.__init__(self, **args)
30
31 def fetch_pending(self, deleted):
32 if (not deleted):
33 objs = VBNGTenant.get_tenant_objects().filter(Q(enacted__lt=F('updated')) | Q(enacted=None),Q(lazy_blocked=False))
34 else:
35 objs = VBNGTenant.get_deleted_tenant_objects()
36
37 return objs
38
39 def defer_sync(self, o, reason):
40 o.backend_register="{}"
41 o.backend_status = "2 - " + reason
42 o.save(update_fields=['enacted','backend_status','backend_register'])
43 logger.info("defer object %s due to %s" % (str(o), reason))
44
45 def sync_record(self, o):
46 logger.info("sync'ing VBNGTenant %s" % str(o))
47
48 vcpes = VCPETenant.get_tenant_objects().all()
49 vcpes = [x for x in vcpes if (x.vbng is not None) and (x.vbng.id == o.id)]
50 if not vcpes:
51 raise Exception("No vCPE tenant is associated with vBNG %s" % str(o.id))
52 if len(vcpes)>1:
53 raise Exception("More than one vCPE tenant is associated with vBNG %s" % str(o.id))
54
55 vcpe = vcpes[0]
56 sliver = vcpe.sliver
57
58 if not sliver:
59 raise Exception("No sliver associated with vBNG %s" % str(o.id))
60
61 external_ns = None
62 for ns in sliver.networkslivers.all():
Scott Baker32f94532015-05-29 10:46:24 -070063 if (ns.ip) and ("WAN" in ns.network.template.name):
Scott Bakerb87b8732015-05-08 10:55:30 -070064 external_ns = ns
65
66 if not external_ns:
Scott Baker32f94532015-05-29 10:46:24 -070067 self.defer_sync(o, "WAN network is not filled in yet")
Scott Bakerb87b8732015-05-08 10:55:30 -070068 return
69
70 private_ip = external_ns.ip
71
72 if not o.routeable_subnet:
Scott Baker0bfb4002015-05-29 11:53:39 -070073 r = requests.post(VBNG_API + "%s" % private_ip, )
74 if (r.status_code != 200):
75 raise Exception("Received error from bng service (%d)" % r.status_code)
76 logger.info("received public IP %s from private IP %s" % (r.text, private_ip))
77 o.routeable_subnet = r.text
Scott Bakerb87b8732015-05-08 10:55:30 -070078
79 o.save()
80
81 def delete_record(self, m):
82 pass
83