blob: a29ba0948ece4e973bd2f4cd0b4ed4932238ec57 [file] [log] [blame]
Scott Baker64b889b2015-05-05 17:53:12 -07001import os
2import socket
3import sys
4import base64
5from django.db.models import F, Q
6from xos.config import Config
7from observer.syncstep import SyncStep
8from observer.ansible import run_template_ssh
9from core.models import Service
10from cord.models import VCPEService, VCPETenant, VOLTTenant
11from hpc.models import HpcService, CDNPrefix
12from util.logger import Logger, logging
13
14# hpclibrary will be in steps/..
15parentdir = os.path.join(os.path.dirname(__file__),"..")
16sys.path.insert(0,parentdir)
17
Scott Bakercdf47142015-06-01 16:15:42 -070018from broadbandshield import BBS
19
Scott Baker64b889b2015-05-05 17:53:12 -070020logger = Logger(level=logging.INFO)
21
22class SyncVCPETenant(SyncStep):
23 provides=[VCPETenant]
24 observes=VCPETenant
25 requested_interval=0
26 template_name = "sync_vcpetenant.yaml"
27 service_key_name = "/opt/xos/observers/vcpe/vcpe_private_key"
28
29 def __init__(self, **args):
30 SyncStep.__init__(self, **args)
31
32 def defer_sync(self, o, reason):
Scott Baker61c8e8d2015-06-02 14:34:04 -070033 logger.info("defer object %s due to %s" % (str(o), reason))
Scott Baker59e88d52015-06-02 09:48:47 -070034 raise Exception("defer object %s due to %s" % (str(o), reason))
Scott Baker64b889b2015-05-05 17:53:12 -070035
36 def fetch_pending(self, deleted):
37 if (not deleted):
38 objs = VCPETenant.get_tenant_objects().filter(Q(enacted__lt=F('updated')) | Q(enacted=None),Q(lazy_blocked=False))
39 else:
40 objs = VCPETenant.get_deleted_tenant_objects()
41
42 return objs
43
44 def get_extra_attributes(self, o):
45 # This is a place to include extra attributes that aren't part of the
46 # object itself. In our case, it's handy to know the VLAN IDs when
47 # configuring the VCPE.
48
49 dnsdemux_ip = "none"
50 for service in HpcService.objects.all():
51 for slice in service.slices.all():
52 if "dnsdemux" in slice.name:
53 for sliver in slice.slivers.all():
Scott Baker4d5d5d72015-06-05 12:09:36 -070054 # Connect to a dnsdemux that's on the hpc_client network
55 # if one is available.
56 for ns in sliver.networkslivers.all():
57 if ns.ip and ns.network.labels and ("hpc_client" in ns.network.labels):
58 dnsdemux_ip = ns.ip
Scott Baker64b889b2015-05-05 17:53:12 -070059 if dnsdemux_ip=="none":
60 try:
61 dnsdemux_ip = socket.gethostbyname(sliver.node.name)
62 except:
63 pass
64
Scott Baker2e64a3a2015-05-06 20:06:21 -070065 cdn_prefixes = []
66 for prefix in CDNPrefix.objects.all():
67 cdn_prefixes.append(prefix.prefix)
68
Scott Bakerf674e912015-05-08 10:56:13 -070069 volts = [x for x in VOLTTenant.get_tenant_objects() if (x.vcpe is not None) and (x.vcpe.id==o.id)]
Scott Baker64b889b2015-05-05 17:53:12 -070070 vlan_ids = [x.vlan_id for x in volts]
71 return {"vlan_ids": vlan_ids,
Scott Baker2e64a3a2015-05-06 20:06:21 -070072 "dnsdemux_ip": dnsdemux_ip,
73 "cdn_prefixes": cdn_prefixes}
Scott Baker64b889b2015-05-05 17:53:12 -070074
75 def get_sliver(self, o):
76 # We need to know what slivers is associated with the object.
77 # For vCPE this is easy, as VCPETenant has a sliver field.
78
79 return o.sliver
80
81 def sync_record(self, o):
82 logger.info("sync'ing VCPETenant %s" % str(o))
83
84 sliver = self.get_sliver(o)
85 if not sliver:
86 self.defer_sync(o, "waiting on sliver")
87 return
88
89 service = o.sliver.slice.service
90 if not service:
91 # Ansible uses the service's keypair in order to SSH into the
92 # instance. It would be bad if the slice had no service.
93
94 raise Exception("Slice %s is not associated with a service" % sliver.slice.name)
95
96 if not os.path.exists(self.service_key_name):
97 raise Exception("Service key %s does not exist" % self.service_key_name)
98
99 service_key = file(self.service_key_name).read()
100
101 fields = { "sliver_name": sliver.name,
102 "hostname": sliver.node.name,
103 "instance_id": sliver.instance_id,
104 "private_key": service_key,
Scott Baker83734052015-05-12 16:13:29 -0700105 "ansible_tag": "vcpe_tenant_" + str(o.id)
Scott Baker64b889b2015-05-05 17:53:12 -0700106 }
107
108 if hasattr(o, "sync_attributes"):
109 for attribute_name in o.sync_attributes:
110 fields[attribute_name] = getattr(o, attribute_name)
111
112 fields.update(self.get_extra_attributes(o))
Scott Baker64b889b2015-05-05 17:53:12 -0700113 run_template_ssh(self.template_name, fields)
114
Scott Bakercdf47142015-06-01 16:15:42 -0700115 if o.url_filter_enable:
116 bbs = BBS(o.bbs_account, "123")
117 bbs.sync(o.url_filter_level, o.users)
118
Scott Baker64b889b2015-05-05 17:53:12 -0700119 o.save()
120
121 def delete_record(self, m):
122 pass
123