Defined Models and REST APIs
TOSCA specs
Synchronizer

Change-Id: Icd9dde1b456711ca7e5f0c69ae547072ff5b3120
diff --git a/xos/models.py b/xos/models.py
index d302b13..8396d3e 100644
--- a/xos/models.py
+++ b/xos/models.py
@@ -12,35 +12,77 @@
 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)
 
+
 class VRouterService(Service):
     KIND = VROUTER_KIND
 
     class Meta:
-        app_label = "vrouter"
+        app_label = APP_LABEL
         verbose_name = "vRouter Service"
         proxy = True
 
+    default_attributes = {
+        "rest_hostname": "",
+        "rest_port": "8181",
+        "rest_user": "onos",
+        "rest_pass": "rocks"
+    }
+
+    @property
+    def rest_hostname(self):
+        return self.get_attribute("rest_hostname", self.default_attributes["rest_hostname"])
+
+    @rest_hostname.setter
+    def rest_hostname(self, value):
+        self.set_attribute("rest_hostname", value)
+
+    @property
+    def rest_port(self):
+        return self.get_attribute("rest_port", self.default_attributes["rest_port"])
+
+    @rest_port.setter
+    def rest_port(self, value):
+        self.set_attribute("rest_port", value)
+
+    @property
+    def rest_user(self):
+        return self.get_attribute("rest_user", self.default_attributes["rest_user"])
+
+    @rest_user.setter
+    def rest_user(self, value):
+        self.set_attribute("rest_user", value)
+
+    @property
+    def rest_pass(self):
+        return self.get_attribute("rest_pass", self.default_attributes["rest_pass"])
+
+    @rest_pass.setter
+    def rest_pass(self, value):
+        self.set_attribute("rest_pass", value)
+
     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=[]
+        gateways = []
 
         aps = self.addresspools.all()
         for ap in aps:
-            gateways.append( {"gateway_ip": ap.gateway_ip, "gateway_mac": ap.gateway_mac} )
+            gateways.append({"gateway_ip": ap.gateway_ip, "gateway_mac": ap.gateway_mac})
 
         return gateways
 
@@ -67,18 +109,19 @@
 
         return t
 
-#VRouterService.setup_simple_attributes()
 
 class VRouterTenant(Tenant):
     class Meta:
         proxy = True
+        verbose_name = "vRouter Tenant"
 
     KIND = VROUTER_KIND
 
-    simple_attributes = ( ("public_ip", None),
-                          ("public_mac", None),
-                          ("address_pool_id", None),
-                          )
+    simple_attributes = (
+        ("public_ip", None),
+        ("public_mac", None),
+        ("address_pool_id", None),
+    )
 
     @property
     def gateway_ip(self):
@@ -103,7 +146,7 @@
         # return number of bits in the network portion of the cidr
         if self.cidr:
             parts = self.cidr.split("/")
-            if len(parts)==2:
+            if len(parts) == 2:
                 return int(parts[1].strip())
         return None
 
@@ -113,10 +156,10 @@
             return self.cached_address_pool
         if not self.address_pool_id:
             return None
-        aps=AddressPool.objects.filter(id=self.address_pool_id)
+        aps = AddressPool.objects.filter(id=self.address_pool_id)
         if not aps:
             return None
-        ap=aps[0]
+        ap = aps[0]
         self.cached_address_pool = ap
         return ap
 
@@ -125,7 +168,7 @@
         if value:
             value = value.id
         if (value != self.get_attribute("address_pool_id", None)):
-            self.cached_address_pool=None
+            self.cached_address_pool = None
         self.set_attribute("address_pool_id", value)
 
     def cleanup_addresspool(self):
@@ -141,3 +184,75 @@
 
 VRouterTenant.setup_simple_attributes()
 
+
+# DEVICES
+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')
+
+
+# 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)
+
+
+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)
+
+
+# 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)