tosca daemon
diff --git a/xos/tosca/daemon.py b/xos/tosca/daemon.py
new file mode 100644
index 0000000..0fff6e2
--- /dev/null
+++ b/xos/tosca/daemon.py
@@ -0,0 +1,92 @@
+""" A very simple Tosca daemon. Every ten seconds it looks for new programs in
+ "run" or "destroy" status, and executes them.
+
+ TODO: Replace this with observer and/or model_policies ?
+"""
+
+import os
+import sys
+from threading import Thread
+import time
+
+# add the parent directory to sys.path
+import os,sys,inspect
+currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
+parentdir = os.path.dirname(currentdir)
+sys.path.append(parentdir)
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xos.settings")
+import django
+django.setup()
+
+from core.models import Program, User
+from nodeselect import XOSNodeSelector
+from imageselect import XOSImageSelector
+import traceback
+
+from engine import XOSTosca
+
+class ToscaDaemon(Thread):
+ def __init__(self):
+ Thread.__init__(self)
+ self.daemon = True
+
+ def run_program(self, model):
+ try:
+ print "*** Run Program %s ***" % model.name
+ model.status = "executing"
+ model.output = ""
+ model.save()
+ xt = XOSTosca(model.contents, parent_dir=currentdir, log_to_console=True)
+ xt.execute(model.owner)
+ model.output = "\n".join(xt.log_msgs)
+ model.status = "complete"
+ except:
+ model.output = traceback.format_exc()
+ model.status = "exception"
+ traceback.print_exc()
+ model.command = None
+ model.save()
+
+ def destroy_program(self, model):
+ try:
+ print "*** Destroy Program %s ***" % model.name
+ model.status = "executing"
+ model.output = ""
+ model.save()
+ xt = XOSTosca(model.contents, parent_dir=currentdir)
+ xt.destroy(model.owner)
+ model.output = "\n".join(xt.log_msgs)
+ model.status = "complete"
+ except:
+ model.output = traceback.format_exc()
+ model.status = "exception"
+ traceback.print_exc()
+ model.command = None
+ model.save()
+
+ def run_once(self):
+ models = Program.objects.filter(kind="tosca", command="run")
+ for model in models:
+ self.run_program(model)
+
+ models = Program.objects.filter(kind="tosca", command="destroy")
+ for model in models:
+ self.destroy_program(model)
+
+ def run(self):
+ while True:
+ self.run_once()
+ time.sleep(10)
+ django.db.reset_queries()
+
+if __name__ == "__main__":
+ if "--once" in sys.argv:
+ ToscaDaemon().execute_once()
+ else:
+ ToscaDaemon().start()
+
+ print "Running forever..."
+ while True:
+ time.sleep(60)
+