CORD-1092: Brought vRouter over to xproto

Change-Id: I6f1060f231c76b3e50c96325fb5145ad0bd9684f
diff --git a/xos/models.py b/xos/models.py
index 98faaad..09ef583 100644
--- a/xos/models.py
+++ b/xos/models.py
@@ -1,200 +1,290 @@
-from django.db import models
-from core.models import Service, PlCoreBase, Slice, Instance, Tenant, TenantWithContainer, Node, Image, User, Flavor, NetworkParameter, NetworkParameterType, Port, AddressPool
-from core.models.plcorebase import StrippedCharField
-import os
-from django.db import models, transaction
-from django.forms.models import model_to_dict
-from django.db.models import Q
-from operator import itemgetter, attrgetter, methodcaller
-from core.models import Tag
-from core.models.service import LeastLoadedNodeScheduler
-import traceback
-from xos.exceptions import *
-from xos.config import Config
+from header import *
 
 
-class ConfigurationError(Exception):
-    pass
 
 
-VROUTER_KIND = "vROUTER"
-APP_LABEL = "vrouter"
-
-# NOTE: don't change VROUTER_KIND unless you also change the reference to it
-#   in tosca/resources/network.py
-
-CORD_USE_VTN = getattr(Config(), "networking_use_vtn", False)
 
 
-class VRouterService(Service):
-    KIND = VROUTER_KIND
-
-    class Meta:
-        app_label = APP_LABEL
-        verbose_name = "vRouter Service"
-
-    # Are rest_hostname and rest_port redundant with ONOS service?
-    # Should ONOSService be augmented with rest_user and rest_pass?
-
-    rest_hostname = StrippedCharField(max_length=255, null=True, blank=True)
-    rest_port = models.IntegerField(default=8181)
-    rest_user = StrippedCharField(max_length=255, default="onos")
-    rest_pass = StrippedCharField(max_length=255, default="rocks")
-
-    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(provider_service=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 VRouterTenant(Tenant):
-    class Meta:
-        verbose_name = "vRouter Tenant"
-
-    KIND = VROUTER_KIND
-
-    public_ip = StrippedCharField(max_length = 30, null=True, blank=True)
-    public_mac = StrippedCharField(max_length = 30, null=True, blank=True)
-    address_pool = models.ForeignKey(AddressPool, related_name='vrouter_tenants', blank=True, null=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[0].put_address(self.public_ip)
-                self.public_ip = None
-
-    def delete(self, *args, **kwargs):
-        self.cleanup_addresspool()
-        super(VRouterTenant, self).delete(*args, **kwargs)
 
 
-# DEVICES
+
+
+
+
+
+
+
+
+
+
+
+
+
+#from core.models.service import Service
+from core.models import Service
+
+
+
+from core.models import AddressPool#from core.models.tenant import Tenant
+from core.models import Tenant
+
+
+
+
+
+class VRouterApp(PlCoreBase):
+
+  KIND = "vROUTER"
+
+  class Meta:
+      app_label = "vrouter"
+      name = "vrouter"
+      verbose_name = "vRouter Service"
+
+  # Primitive Fields (Not Relations)
+  name = CharField( help_text = "application name", max_length = 50, null = False, db_index = False, blank = False )
+  control_plane_connect_point = CharField( help_text = "port identifier in ONOS", max_length = 21, null = False, db_index = False, blank = False )
+  ospf_enabled = BooleanField( default = True, help_text = "ospf enabled", null = False, db_index = False, blank = True )
+  
+
+  # Relations
+  
+  vrouter_service = ForeignKey(VRouterService, db_index = True, related_name = 'apps', null = False, blank = False )
+
+  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
+  
+  pass
+
+
+
+
 class VRouterDevice(PlCoreBase):
-    """define the information related to an device used by vRouter"""
-    class Meta:
-        app_label = APP_LABEL
-        verbose_name = "vRouter Device"
 
-    name = models.CharField(max_length=20, help_text="device friendly name", null=True, blank=True)
-    openflow_id = models.CharField(max_length=20, help_text="device identifier in ONOS", null=False, blank=False)
-    config_key = models.CharField(max_length=32, help_text="configuration key", null=False, blank=False, default="basic")
-    driver = models.CharField(max_length=32, help_text="driver type", null=False, blank=False)
-    vrouter_service = models.ForeignKey(VRouterService, related_name='devices')
+  KIND = "vROUTER"
+
+  class Meta:
+      app_label = "vrouter"
+      name = "vrouter"
+      verbose_name = "vRouter Service"
+
+  # Primitive Fields (Not Relations)
+  name = CharField( help_text = "device friendly name", max_length = 20, null = True, db_index = False, blank = True )
+  openflow_id = CharField( help_text = "device identifier in ONOS", max_length = 20, null = False, db_index = False, blank = False )
+  config_key = CharField( default = "basic", max_length = 32, blank = False, help_text = "configuration key", null = False, db_index = False )
+  driver = CharField( help_text = "driver type", max_length = 32, null = False, db_index = False, blank = False )
+  
+
+  # Relations
+  
+  vrouter_service = ForeignKey(VRouterService, db_index = True, related_name = 'devices', null = False, blank = False )
+
+  
+  pass
 
 
-# PORTS
-class VRouterPort(PlCoreBase):
-    class Meta:
-        app_label = APP_LABEL
-        verbose_name = "vRouter Port"
-
-    name = models.CharField(max_length=20, help_text="port friendly name", null=True, blank=True)
-    openflow_id = models.CharField(max_length=21, help_text="port identifier in ONOS", null=False, blank=False)
-    vrouter_device = models.ForeignKey(VRouterDevice, related_name='ports')
-    # NOTE probably is not meaningful to relate a port to a service
-    vrouter_service = models.ForeignKey(VRouterService, related_name='device_ports')
 
 
 class VRouterInterface(PlCoreBase):
-    class Meta:
-        app_label = APP_LABEL
-        verbose_name = "vRouter Interface"
 
-    name = models.CharField(max_length=20, help_text="interface friendly name", null=True, blank=True)
-    vrouter_port = models.ForeignKey(VRouterPort, related_name='interfaces')
-    name = models.CharField(max_length=10, help_text="interface name", null=False, blank=False)
-    mac = models.CharField(max_length=17, help_text="interface mac", null=False, blank=False)
-    vlan = models.CharField(max_length=10, help_text="interface vlan id", null=True, blank=True)
+  KIND = "vROUTER"
+
+  class Meta:
+      app_label = "vrouter"
+      name = "vrouter"
+      verbose_name = "vRouter Service"
+
+  # Primitive Fields (Not Relations)
+  name = CharField( help_text = "interface name", max_length = 10, null = False, db_index = False, blank = False )
+  mac = CharField( help_text = "interface mac", max_length = 17, null = False, db_index = False, blank = False )
+  vlan = CharField( help_text = "interface vlan id", max_length = 10, null = True, db_index = False, blank = True )
+  
+
+  # Relations
+  
+  vrouter_port = ForeignKey(VRouterPort, db_index = True, related_name = 'interfaces', null = False, blank = False )
+
+  
+  pass
+
+
 
 
 class VRouterIp(PlCoreBase):
-    class Meta:
-        app_label = APP_LABEL
-        verbose_name = "vRouter Ip"
 
-    name = models.CharField(max_length=20, help_text="ip friendly name", null=True, blank=True)
-    vrouter_interface = models.ForeignKey(VRouterInterface, related_name='ips')
-    ip = models.CharField(max_length=19, help_text="interface ips", null=False, blank=False)
+  KIND = "vROUTER"
+
+  class Meta:
+      app_label = "vrouter"
+      name = "vrouter"
+      verbose_name = "vRouter Service"
+
+  # Primitive Fields (Not Relations)
+  name = CharField( help_text = "ip friendly name", max_length = 20, null = True, db_index = False, blank = True )
+  ip = CharField( help_text = "interface ips", max_length = 19, null = False, db_index = False, blank = False )
+  
+
+  # Relations
+  
+  vrouter_interface = ForeignKey(VRouterInterface, db_index = True, related_name = 'ips', null = False, blank = False )
+
+  
+  pass
 
 
-# APPS
-class VRouterApp(PlCoreBase):
-    class Meta:
-        app_label = "vrouter"
-        verbose_name = "vRouter App"
 
-    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
 
-    vrouter_service = models.ForeignKey(VRouterService, related_name='apps')
-    name = models.CharField(max_length=50, help_text="application name", null=False, blank=False)
-    control_plane_connect_point = models.CharField(max_length=21, help_text="port identifier in ONOS", null=False, blank=False)
-    ospf_enabled = models.BooleanField(default=True, help_text="ospf enabled")
-    interfaces = property(_get_interfaces)
+class VRouterPort(PlCoreBase):
+
+  KIND = "vROUTER"
+
+  class Meta:
+      app_label = "vrouter"
+      name = "vrouter"
+      verbose_name = "vRouter Service"
+
+  # Primitive Fields (Not Relations)
+  name = CharField( help_text = "port friendly name", max_length = 20, null = True, db_index = False, blank = True )
+  openflow_id = CharField( help_text = "port identifier in ONOS", max_length = 21, null = False, db_index = False, blank = False )
+  
+
+  # Relations
+  
+  vrouter_device = ForeignKey(VRouterDevice, db_index = True, related_name = 'ports', null = False, blank = False )
+  vrouter_service = ForeignKey(VRouterService, db_index = True, related_name = 'device_ports', null = False, blank = False )
+
+  
+  pass
+
+
+
+
+class VRouterService(Service):
+
+  KIND = "vROUTER"
+
+  class Meta:
+      app_label = "vrouter"
+      name = "vrouter"
+      verbose_name = "vRouter Service"
+
+  # Primitive Fields (Not Relations)
+  rest_hostname = StrippedCharField( db_index = False, max_length = 255, null = True, blank = True )
+  rest_port = IntegerField( default = 8181, null = False, blank = False, db_index = False )
+  rest_user = StrippedCharField( default = "onos", max_length = 255, null = False, db_index = False, blank = False )
+  rest_pass = StrippedCharField( default = "rocks", max_length = 255, null = False, db_index = False, blank = False )
+  
+
+  # Relations
+  
+
+  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(provider_service=self, **kwargs)
+      t.public_ip = ip
+      t.public_mac = self.ip_to_mac(ip)
+      t.address_pool_id = ap.id
+      t.save()
+  
+      return t
+  
+  pass
+
+
+
+
+class VRouterTenant(Tenant):
+
+  KIND = "vROUTER"
+
+  class Meta:
+      app_label = "vrouter"
+      name = "vrouter"
+      verbose_name = "vRouter Service"
+
+  # Primitive Fields (Not Relations)
+  public_ip = StrippedCharField( db_index = False, max_length = 30, null = True, blank = True )
+  public_mac = StrippedCharField( db_index = False, max_length = 30, null = True, blank = True )
+  
+
+  # Relations
+  
+  address_pool = ForeignKey(AddressPool, db_index = True, related_name = 'vrouter_tenants', null = True, blank = 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[0].put_address(self.public_ip)
+              self.public_ip = None
+  
+  def delete(self, *args, **kwargs):
+      self.cleanup_addresspool()
+      super(VRouterTenant, self).delete(*args, **kwargs)
+  
+  pass
+
+