CORD-1092: Brought vRouter over to xproto

Change-Id: I6f1060f231c76b3e50c96325fb5145ad0bd9684f
diff --git a/xos/attic/header.py b/xos/attic/header.py
new file mode 100644
index 0000000..0f04064
--- /dev/null
+++ b/xos/attic/header.py
@@ -0,0 +1,27 @@
+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 *
+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
+
+
+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)
+
diff --git a/xos/attic/vrouterapp_model.py b/xos/attic/vrouterapp_model.py
new file mode 100644
index 0000000..aef51e9
--- /dev/null
+++ b/xos/attic/vrouterapp_model.py
@@ -0,0 +1,11 @@
+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
+
diff --git a/xos/attic/vrouterservice_model.py b/xos/attic/vrouterservice_model.py
new file mode 100644
index 0000000..82d2b15
--- /dev/null
+++ b/xos/attic/vrouterservice_model.py
@@ -0,0 +1,36 @@
+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
+
diff --git a/xos/attic/vroutertenant_model.py b/xos/attic/vroutertenant_model.py
new file mode 100644
index 0000000..7fde19d
--- /dev/null
+++ b/xos/attic/vroutertenant_model.py
@@ -0,0 +1,38 @@
+@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)
+
diff --git a/xos/header.py b/xos/header.py
new file mode 120000
index 0000000..721b5c0
--- /dev/null
+++ b/xos/header.py
@@ -0,0 +1 @@
+attic/header.py
\ No newline at end of file
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
+
+
diff --git a/xos/vrouter-onboard.yaml b/xos/vrouter-onboard.yaml
index f53c212..98316ab 100644
--- a/xos/vrouter-onboard.yaml
+++ b/xos/vrouter-onboard.yaml
@@ -13,7 +13,7 @@
           base_url: file:///opt/xos_services/vrouter/xos/
           # The following will concatenate with base_url automatically, if
           # base_url is non-null.
-          models: models.py
+          xproto: ./
           admin: admin.py
           admin_template: templates/vrouteradmin.html
           tosca_custom_types: vrouter.yaml
diff --git a/xos/vrouter.xproto b/xos/vrouter.xproto
new file mode 100644
index 0000000..b79b30c
--- /dev/null
+++ b/xos/vrouter.xproto
@@ -0,0 +1,51 @@
+option kind="vROUTER";
+option name="vrouter";
+option verbose_name="vRouter Service";
+
+message VRouterService (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 VRouterDevice (PlCoreBase){
+     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];
+}
+
+message VRouterPort (PlCoreBase){
+     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 (PlCoreBase){
+     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 (PlCoreBase) {
+     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 (PlCoreBase){
+     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 (Tenant){
+     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];
+}