[CORD-2962] Refactoring vrouter and adding support for static routes
Change-Id: Ie2719ca94296559caee4a1e433631cbd43019bf9
diff --git a/xos/synchronizer/models/models.py b/xos/synchronizer/models/models.py
deleted file mode 100644
index 3acc198..0000000
--- a/xos/synchronizer/models/models.py
+++ /dev/null
@@ -1,155 +0,0 @@
-
-# Copyright 2017-present Open Networking Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-from django.db import models
-from core.models import Service, XOSBase, Slice, Instance, ServiceInstance, Node, Image, User, Flavor, NetworkParameter, NetworkParameterType, Port, AddressPool
-from core.models.xosbase import StrippedCharField
-import os
-from django.db import models, transaction
-from django.forms.models import model_to_dict
-from django.db.models import *
-from operator import itemgetter, attrgetter, methodcaller
-from core.models import Tag
-import traceback
-from xos.exceptions import *
-from models_decl import *
-
-
-class ConfigurationError(Exception):
- pass
-
-
-class VRouterService (VRouterService_decl):
- class Meta:
- proxy = True
-
- def ip_to_mac(self, ip):
- (a, b, c, d) = ip.split('.')
- return "02:42:%02x:%02x:%02x:%02x" % (int(a), int(b), int(c), int(d))
-
- def get_gateways(self):
- gateways = []
- aps = self.addresspools.all()
- for ap in aps:
- gateways.append({"gateway_ip": ap.gateway_ip, "gateway_mac": ap.gateway_mac})
-
- return gateways
-
- def get_address_pool(self, name):
- ap = AddressPool.objects.filter(name=name, service=self)
- if not ap:
- raise Exception("vRouter unable to find addresspool %s" % name)
- return ap[0]
-
- def get_tenant(self, **kwargs):
- address_pool_name = kwargs.pop("address_pool_name")
-
- ap = self.get_address_pool(address_pool_name)
-
- ip = ap.get_address()
- if not ip:
- raise Exception("AddressPool '%s' has run out of addresses." % ap.name)
-
- t = VRouterTenant(owner=self, **kwargs)
- t.public_ip = ip
- t.public_mac = self.ip_to_mac(ip)
- t.address_pool_id = ap.id
- t.save()
-
- return t
-
-
-class VRouterDevice (VRouterDevice_decl):
-
- class Meta:
- proxy = True
- pass
-
-class VRouterPort (VRouterPort_decl):
-
- class Meta:
- proxy = True
- pass
-
-class VRouterApp (VRouterApp_decl):
-
- class Meta:
- proxy = True
- def _get_interfaces(self):
- app_interfaces = []
- devices = VRouterDevice.objects.filter(vrouter_service=self.vrouter_service)
- for device in devices:
- ports = VRouterPort.objects.filter(vrouter_device=device.id)
- for port in ports:
- interfaces = VRouterInterface.objects.filter(vrouter_port=port.id)
- for iface in interfaces:
- app_interfaces.append(iface.name)
- return app_interfaces
-
-class VRouterInterface (VRouterInterface_decl):
-
- class Meta:
- proxy = True
- pass
-
-class VRouterIp (VRouterIp_decl):
-
- class Meta:
- proxy = True
- pass
-
-class VRouterTenant (VRouterTenant_decl):
-
- class Meta:
- proxy = True
- @property
- def gateway_ip(self):
- if not self.address_pool:
- return None
- return self.address_pool.gateway_ip
-
- @property
- def gateway_mac(self):
- if not self.address_pool:
- return None
- return self.address_pool.gateway_mac
-
- @property
- def cidr(self):
- if not self.address_pool:
- return None
- return self.address_pool.cidr
-
- @property
- def netbits(self):
- # return number of bits in the network portion of the cidr
- if self.cidr:
- parts = self.cidr.split("/")
- if len(parts) == 2:
- return int(parts[1].strip())
- return None
-
- def cleanup_addresspool(self):
- if self.address_pool:
- ap = self.address_pool
- if ap:
- ap.put_address(self.public_ip)
- self.public_ip = None
-
- def delete(self, *args, **kwargs):
- self.cleanup_addresspool()
- super(VRouterTenant, self).delete(*args, **kwargs)
-
diff --git a/xos/synchronizer/models/vrouter.xproto b/xos/synchronizer/models/vrouter.xproto
index 0a68a63..006ecb9 100644
--- a/xos/synchronizer/models/vrouter.xproto
+++ b/xos/synchronizer/models/vrouter.xproto
@@ -1,67 +1,23 @@
option kind="vROUTER";
option name="vrouter";
-option legacy="True";
option app_label = "vrouter";
-message VRouterService (Service){
- option verbose_name="vRouter Service";
-
- optional string rest_hostname = 1 [db_index = False, max_length = 255, null = True, content_type = "stripped", blank = True];
- required int32 rest_port = 2 [default = 8181, null = False, db_index = False, blank = False];
- required string rest_user = 3 [default = "onos", max_length = 255, content_type = "stripped", blank = False, null = False, db_index = False];
- required string rest_pass = 4 [default = "rocks", max_length = 255, content_type = "stripped", blank = False, null = False, db_index = False];
+message VRouterService (Service) {
+ option verbose_name = "vRouter Service";
}
-message VRouterDevice (XOSBase){
- option verbose_name="vRouter Device";
+message VRouterServiceInstance (ServiceInstance) {
+ option verbose_name = "vRouter Service Instance";
+ option owner_class_name = "VRouterService";
- optional string name = 1 [help_text = "device friendly name", max_length = 20, null = True, db_index = False, blank = True];
- required string openflow_id = 2 [help_text = "device identifier in ONOS", max_length = 20, null = False, db_index = False, blank = False];
- required string config_key = 3 [default = "basic", max_length = 32, blank = False, help_text = "configuration key", null = False, db_index = False];
- required string driver = 4 [help_text = "driver type", max_length = 32, null = False, db_index = False, blank = False];
- required manytoone vrouter_service->VRouterService:devices = 5 [db_index = True, null = False, blank = False];
+ // TODO - to be added to select interfaces the vrouter attaches to (use _decl)
+ // required manytoone interface->PortInterface:vrouters = 1 [help_text = "The fabric port interface to which the router is connected to", db_index = False, null = False, blank = False];
}
-message VRouterPort (XOSBase){
- option verbose_name="vRouter Port";
+message VRouterStaticRoute (XOSBase) {
+ option verbose_name = "vRouter static route";
- optional string name = 1 [help_text = "port friendly name", max_length = 20, null = True, db_index = False, blank = True];
- required string openflow_id = 2 [help_text = "port identifier in ONOS", max_length = 21, null = False, db_index = False, blank = False];
- required manytoone vrouter_device->VRouterDevice:ports = 3 [db_index = True, null = False, blank = False];
- required manytoone vrouter_service->VRouterService:device_ports = 4 [db_index = True, null = False, blank = False];
-}
-
-message VRouterApp (XOSBase){
- option verbose_name="vRouter App";
-
- required manytoone vrouter_service->VRouterService:apps = 1 [db_index = True, null = False, blank = False];
- required string name = 2 [help_text = "application name", max_length = 50, null = False, db_index = False, blank = False];
- required string control_plane_connect_point = 3 [help_text = "port identifier in ONOS", max_length = 21, null = False, db_index = False, blank = False];
- required bool ospf_enabled = 4 [help_text = "ospf enabled", default = True, null = False, db_index = False, blank = True];
-}
-
-message VRouterInterface (XOSBase) {
- option verbose_name="vRouter Interface";
-
- required manytoone vrouter_port->VRouterPort:interfaces = 1 [db_index = True, null = False, blank = False];
- required string name = 2 [help_text = "interface name", max_length = 10, null = False, db_index = False, blank = False];
- required string mac = 3 [help_text = "interface mac", max_length = 17, null = False, db_index = False, blank = False];
- optional string vlan = 4 [help_text = "interface vlan id", max_length = 10, null = True, db_index = False, blank = True];
-}
-
-message VRouterIp (XOSBase){
- option verbose_name="vRouter Ip";
-
- optional string name = 1 [help_text = "ip friendly name", max_length = 20, null = True, db_index = False, blank = True];
- required manytoone vrouter_interface->VRouterInterface:ips = 2 [db_index = True, null = False, blank = False];
- required string ip = 3 [help_text = "interface ips", max_length = 19, null = False, db_index = False, blank = False];
-}
-
-message VRouterTenant (ServiceInstance){
- option verbose_name="vRouter Tenant";
- option owner_class_name="VRouterService";
-
- optional string public_ip = 1 [db_index = False, max_length = 30, null = True, content_type = "stripped", blank = True];
- optional string public_mac = 2 [db_index = False, max_length = 30, null = True, content_type = "stripped", blank = True];
- optional manytoone address_pool->AddressPool:vrouter_tenants = 3 [db_index = True, null = True, blank = True];
+ required manytoone vrouter->VRouterServiceInstance:static_routes = 1 [help_text = "The static route to be configured in ONOS", db_index = False, null = False, blank = False];
+ required string prefix = 2 [help_text = "The destination prefix and netmask (xxx.yyy.www.zzz/nm)", max_length = 20, null = False, tosca_key = True, db_index = False, unique = True, blank = False];
+ required string next_hop = 5 [help_text = "The next-hop for the route", max_length = 17, null = False, db_index = False, blank = False];
}