blob: d2ec20961d5c18a52856b6acc8cfb423cdaa2523 [file] [log] [blame]
Scott Baker5a963142016-03-06 16:50:25 -08001import os
2import socket
3import sys
4import base64
5import time
6from django.db.models import F, Q
7from xos.config import Config
8from synchronizers.base.syncstep import SyncStep
9from synchronizers.base.ansible import run_template_ssh
10from synchronizers.base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
11from core.models import Service, Slice, Tag
12from services.cord.models import VSGService, VSGTenant, VOLTTenant, CordSubscriberRoot
13from services.vtr.models import VTRService, VTRTenant
14from services.hpc.models import HpcService, CDNPrefix
15from xos.logger import Logger, logging
16
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
23CORD_USE_VTN = getattr(Config(), "networking_use_vtn", False)
24
25class SyncVTRTenant(SyncInstanceUsingAnsible):
26 provides=[VTRTenant]
27 observes=VTRTenant
28 requested_interval=0
29 template_name = "sync_vtrtenant.yaml"
30 service_key_name = "/opt/xos/synchronizers/vtr/vcpe_private_key"
31
32 def __init__(self, *args, **kwargs):
33 super(SyncVTRTenant, self).__init__(*args, **kwargs)
34
35 def fetch_pending(self, deleted):
36 if (not deleted):
37 objs = VTRTenant.get_tenant_objects().filter(Q(enacted__lt=F('updated')) | Q(enacted=None),Q(lazy_blocked=False))
38 else:
39 objs = VTRTenant.get_deleted_tenant_objects()
40
41 return objs
42
43 def get_vtr_service(self, o):
44 if not o.provider_service:
45 return None
46
47 vtrs = VTRService.get_service_objects().filter(id=o.provider_service.id)
48 if not vtrs:
49 return None
50
51 return vtrs[0]
52
53 def get_vcpe_service(self, o):
54 if o.target:
55 # o.target is a CordSubscriberRoot
56 if o.target.volt and o.target.volt.vcpe:
57 vcpes = VSGService.get_service_objects().filter(id=o.target.volt.vcpe.provider_service.id)
58 if not vcpes:
59 return None
60 return vcpes[0]
61 return None
62
63 def get_instance(self, o):
64 if o.target and o.target.volt and o.target.volt.vcpe:
65 return o.target.volt.vcpe.instance
66 else:
67 return None
68
69 def get_extra_attributes(self, o):
70 vtr_service = self.get_vtr_service(o)
71 vcpe_service = self.get_vcpe_service(o)
72
73 if not vcpe_service:
74 raise Exception("No vcpeservice")
75
76 instance = self.get_instance(o)
77
78 if not instance:
79 raise Exception("No instance")
80
81 s_tags = []
82 c_tags = []
83 if o.target and o.target.volt:
84 s_tags.append(o.target.volt.s_tag)
85 c_tags.append(o.target.volt.c_tag)
86
87 wan_vm_ip=""
88 wan_vm_mac=""
89 tags = Tag.select_by_content_object(instance).filter(name="vm_wan_addr")
90 if tags:
91 parts=tags[0].value.split(",")
92 if len(parts)!=3:
93 raise Exception("vm_wan_addr tag is malformed: %s" % value)
94 wan_vm_ip = parts[1]
95 wan_vm_mac = parts[2]
96 else:
97 if CORD_USE_VTN:
98 raise Exception("no vm_wan_addr tag for instance %s" % instance)
99
100 fields = {"s_tags": s_tags,
101 "c_tags": c_tags,
102 "isolation": instance.isolation,
103 "wan_container_gateway_mac": vcpe_service.wan_container_gateway_mac,
104 "wan_container_gateway_ip": vcpe_service.wan_container_gateway_ip,
105 "wan_container_netbits": vcpe_service.wan_container_netbits,
106 "wan_vm_mac": wan_vm_mac,
107 "wan_vm_ip": wan_vm_ip,
108 "container_name": "vcpe-%s-%s" % (s_tags[0], c_tags[0]),
109 "dns_servers": [x.strip() for x in vcpe_service.dns_servers.split(",")],
110
Scott Baker40272242016-03-08 15:31:36 -0800111 "result_fn": "%s-vcpe-%s-%s" % (o.test, s_tags[0], c_tags[0]),
112 "resultcode_fn": "code-%s-vcpe-%s-%s" % (o.test, s_tags[0], c_tags[0]) }
Scott Baker5a963142016-03-06 16:50:25 -0800113
114 # add in the sync_attributes that come from the SubscriberRoot object
115
116 if o.target and hasattr(o.target, "sync_attributes"):
117 for attribute_name in o.target.sync_attributes:
118 fields[attribute_name] = getattr(o.target, attribute_name)
119
120 for attribute_name in o.sync_attributes:
121 fields[attribute_name] = getattr(o,attribute_name)
122
123 return fields
124
125 def sync_fields(self, o, fields):
126 # the super causes the playbook to be run
127
128 super(SyncVTRTenant, self).sync_fields(o, fields)
129
130 def run_playbook(self, o, fields):
131 o.result = ""
132
Scott Bakerc06f0de2016-03-06 23:00:41 -0800133 result_fn = os.path.join("/opt/xos/synchronizers/vtr/result", fields["result_fn"])
Scott Baker5a963142016-03-06 16:50:25 -0800134 if os.path.exists(result_fn):
135 os.remove(result_fn)
136
Scott Baker40272242016-03-08 15:31:36 -0800137 resultcode_fn = os.path.join("/opt/xos/synchronizers/vtr/result", fields["resultcode_fn"])
138 if os.path.exists(resultcode_fn):
139 os.remove(resultcode_fn)
140
Scott Bakerd8122992016-03-07 14:57:50 -0800141 super(SyncVTRTenant, self).run_playbook(o, fields)
Scott Baker5a963142016-03-06 16:50:25 -0800142
143 if os.path.exists(result_fn):
144 o.result = open(result_fn).read()
145
Scott Baker40272242016-03-08 15:31:36 -0800146 if os.path.exists(resultcode_fn):
147 o.result_code = open(resultcode_fn).read()
148
Scott Baker5a963142016-03-06 16:50:25 -0800149
150 def delete_record(self, m):
151 pass