blob: d302b13beb4b308f0eb0318e77b8b4e92ec9aa9f [file] [log] [blame]
Scott Bakerd25fcd02016-04-12 16:28:28 -07001from django.db import models
2from core.models import Service, PlCoreBase, Slice, Instance, Tenant, TenantWithContainer, Node, Image, User, Flavor, Subscriber, NetworkParameter, NetworkParameterType, Port, AddressPool
3from core.models.plcorebase import StrippedCharField
4import os
5from django.db import models, transaction
6from django.forms.models import model_to_dict
7from django.db.models import Q
8from operator import itemgetter, attrgetter, methodcaller
9from core.models import Tag
10from core.models.service import LeastLoadedNodeScheduler
11import traceback
12from xos.exceptions import *
13from xos.config import Config
14
15class ConfigurationError(Exception):
16 pass
17
Scott Baker0492c572016-06-14 14:53:05 -070018
Scott Bakerd25fcd02016-04-12 16:28:28 -070019VROUTER_KIND = "vROUTER"
20
Scott Baker0492c572016-06-14 14:53:05 -070021# NOTE: don't change VROUTER_KIND unless you also change the reference to it
22# in tosca/resources/network.py
23
Scott Bakerd25fcd02016-04-12 16:28:28 -070024CORD_USE_VTN = getattr(Config(), "networking_use_vtn", False)
25
26class VRouterService(Service):
27 KIND = VROUTER_KIND
28
29 class Meta:
Scott Baker269c9aa2016-04-13 15:44:42 -070030 app_label = "vrouter"
Scott Bakerd25fcd02016-04-12 16:28:28 -070031 verbose_name = "vRouter Service"
32 proxy = True
33
34 def ip_to_mac(self, ip):
35 (a, b, c, d) = ip.split('.')
36 return "02:42:%02x:%02x:%02x:%02x" % (int(a), int(b), int(c), int(d))
37
38 def get_gateways(self):
39 gateways=[]
40
41 aps = self.addresspools.all()
42 for ap in aps:
43 gateways.append( {"gateway_ip": ap.gateway_ip, "gateway_mac": ap.gateway_mac} )
44
45 return gateways
46
47 def get_address_pool(self, name):
48 ap = AddressPool.objects.filter(name=name, service=self)
49 if not ap:
50 raise Exception("vRouter unable to find addresspool %s" % name)
51 return ap[0]
52
53 def get_tenant(self, **kwargs):
54 address_pool_name = kwargs.pop("address_pool_name")
55
56 ap = self.get_address_pool(address_pool_name)
57
58 ip = ap.get_address()
59 if not ip:
60 raise Exception("AddressPool '%s' has run out of addresses." % ap.name)
61
Scott Baker79396fb2016-04-13 16:09:48 -070062 t = VRouterTenant(provider_service=self, **kwargs)
Scott Bakerd25fcd02016-04-12 16:28:28 -070063 t.public_ip = ip
64 t.public_mac = self.ip_to_mac(ip)
Scott Baker269c9aa2016-04-13 15:44:42 -070065 t.address_pool_id = ap.id
Scott Bakerd25fcd02016-04-12 16:28:28 -070066 t.save()
67
68 return t
69
Scott Baker6b3c9b32016-04-13 11:25:52 -070070#VRouterService.setup_simple_attributes()
Scott Bakerd25fcd02016-04-12 16:28:28 -070071
72class VRouterTenant(Tenant):
73 class Meta:
74 proxy = True
75
76 KIND = VROUTER_KIND
77
78 simple_attributes = ( ("public_ip", None),
79 ("public_mac", None),
Scott Baker269c9aa2016-04-13 15:44:42 -070080 ("address_pool_id", None),
Scott Bakerd25fcd02016-04-12 16:28:28 -070081 )
82
83 @property
84 def gateway_ip(self):
Scott Baker269c9aa2016-04-13 15:44:42 -070085 if not self.address_pool:
86 return None
Scott Bakerd25fcd02016-04-12 16:28:28 -070087 return self.address_pool.gateway_ip
88
89 @property
90 def gateway_mac(self):
Scott Baker269c9aa2016-04-13 15:44:42 -070091 if not self.address_pool:
92 return None
Scott Bakerd25fcd02016-04-12 16:28:28 -070093 return self.address_pool.gateway_mac
94
Scott Baker269c9aa2016-04-13 15:44:42 -070095 @property
Scott Baker44ded762016-04-13 16:40:50 -070096 def cidr(self):
97 if not self.address_pool:
98 return None
99 return self.address_pool.cidr
100
101 @property
Scott Baker98332502016-04-19 17:55:56 -0700102 def netbits(self):
103 # return number of bits in the network portion of the cidr
104 if self.cidr:
105 parts = self.cidr.split("/")
106 if len(parts)==2:
107 return int(parts[1].strip())
108 return None
109
110 @property
Scott Baker269c9aa2016-04-13 15:44:42 -0700111 def address_pool(self):
112 if getattr(self, "cached_address_pool", None):
113 return self.cached_address_pool
114 if not self.address_pool_id:
115 return None
116 aps=AddressPool.objects.filter(id=self.address_pool_id)
117 if not aps:
118 return None
119 ap=aps[0]
120 self.cached_address_pool = ap
121 return ap
122
123 @address_pool.setter
124 def address_pool(self, value):
125 if value:
126 value = value.id
127 if (value != self.get_attribute("address_pool_id", None)):
128 self.cached_address_pool=None
129 self.set_attribute("address_pool_id", value)
130
131 def cleanup_addresspool(self):
132 if self.address_pool_id:
133 ap = AddressPool.objects.filter(id=self.address_pool_id)
134 if ap:
Scott Baker79396fb2016-04-13 16:09:48 -0700135 ap[0].put_address(self.public_ip)
136 self.public_ip = None
Scott Baker269c9aa2016-04-13 15:44:42 -0700137
138 def delete(self, *args, **kwargs):
139 self.cleanup_addresspool()
140 super(VRouterTenant, self).delete(*args, **kwargs)
141
142VRouterTenant.setup_simple_attributes()
143