move over onos service from xos repo
diff --git a/xos/models.py b/xos/models.py
new file mode 100644
index 0000000..20fa73f
--- /dev/null
+++ b/xos/models.py
@@ -0,0 +1,146 @@
+from django.db import models
+from core.models import Service, PlCoreBase, Slice, Instance, Tenant, TenantWithContainer, Node, Image, User, Flavor, Subscriber
+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
+import traceback
+from xos.exceptions import *
+from core.models import SlicePrivilege, SitePrivilege
+from sets import Set
+
+ONOS_KIND = "onos"
+
+class ONOSService(Service):
+ KIND = ONOS_KIND
+
+ class Meta:
+ app_label = "onos"
+ verbose_name = "ONOS Service"
+ proxy = True
+
+ default_attributes = {"rest_hostname": "",
+ "rest_port": "8181",
+ "no_container": False,
+ "node_key": ""}
+
+ @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 no_container(self):
+ return self.get_attribute("no_container", self.default_attributes["no_container"])
+
+ @no_container.setter
+ def no_container(self, value):
+ self.set_attribute("no_container", value)
+
+ @property
+ def node_key(self):
+ return self.get_attribute("node_key", self.default_attributes["node_key"])
+
+ @node_key.setter
+ def node_key(self, value):
+ self.set_attribute("node_key", value)
+
+
+class ONOSApp(Tenant): # aka 'ONOSTenant'
+ class Meta:
+ proxy = True
+
+ KIND = ONOS_KIND
+
+ default_attributes = {"name": "",
+ "install_dependencies": "",
+ "dependencies": ""}
+ def __init__(self, *args, **kwargs):
+ onos_services = ONOSService.get_service_objects().all()
+ if onos_services:
+ self._meta.get_field("provider_service").default = onos_services[0].id
+ super(ONOSApp, self).__init__(*args, **kwargs)
+
+ @property
+ def creator(self):
+ from core.models import User
+ if getattr(self, "cached_creator", None):
+ return self.cached_creator
+ creator_id=self.get_attribute("creator_id")
+ if not creator_id:
+ return None
+ users=User.objects.filter(id=creator_id)
+ if not users:
+ return None
+ user=users[0]
+ self.cached_creator = users[0]
+ return user
+
+ @creator.setter
+ def creator(self, value):
+ if value:
+ value = value.id
+ if (value != self.get_attribute("creator_id", None)):
+ self.cached_creator=None
+ self.set_attribute("creator_id", value)
+
+ @property
+ def name(self):
+ return self.get_attribute("name", self.default_attributes["name"])
+
+ @name.setter
+ def name(self, value):
+ self.set_attribute("name", value)
+
+ @property
+ def dependencies(self):
+ return self.get_attribute("dependencies", self.default_attributes["dependencies"])
+
+ @dependencies.setter
+ def dependencies(self, value):
+ self.set_attribute("dependencies", value)
+
+ @property
+ def install_dependencies(self):
+ return self.get_attribute("install_dependencies", self.default_attributes["install_dependencies"])
+
+ @install_dependencies.setter
+ def install_dependencies(self, value):
+ self.set_attribute("install_dependencies", value)
+
+ def save(self, *args, **kwargs):
+ if not self.creator:
+ if not getattr(self, "caller", None):
+ # caller must be set when creating a vCPE since it creates a slice
+ raise XOSProgrammingError("ONOSApp's self.caller was not set")
+ self.creator = self.caller
+ if not self.creator:
+ raise XOSProgrammingError("ONOSApp's self.creator was not set")
+
+ super(ONOSApp, self).save(*args, **kwargs)
+ model_policy_onos_app(self.pk)
+
+# TODO: Probably don't need this...
+def model_policy_onos_app(pk):
+ # TODO: this should be made in to a real model_policy
+ with transaction.atomic():
+ oa = ONOSApp.objects.select_for_update().filter(pk=pk)
+ if not oa:
+ return
+ oa = oa[0]
+ #oa.manage_container()
+
+