blob: dc6e057b8bfe5019650ae936b96c0251f0794c1a [file] [log] [blame]
Scott Baker61b708f2015-08-11 17:24:08 -07001""" A very simple Tosca daemon. Every ten seconds it looks for new programs in
2 "run" or "destroy" status, and executes them.
3
4 TODO: Replace this with observer and/or model_policies ?
5"""
6
7import os
8import sys
9from threading import Thread
10import time
11
12# add the parent directory to sys.path
13import os,sys,inspect
14currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
15parentdir = os.path.dirname(currentdir)
16sys.path.append(parentdir)
17
18os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xos.settings")
19import django
20django.setup()
21
22from core.models import Program, User
23from nodeselect import XOSNodeSelector
24from imageselect import XOSImageSelector
25import traceback
26
27from engine import XOSTosca
28
29class ToscaDaemon(Thread):
30 def __init__(self):
31 Thread.__init__(self)
32 self.daemon = True
33
34 def run_program(self, model):
35 try:
36 print "*** Run Program %s ***" % model.name
37 model.status = "executing"
Scott Baker366b4772015-08-12 19:05:35 -070038 model.messages = ""
Scott Baker61b708f2015-08-11 17:24:08 -070039 model.save()
40 xt = XOSTosca(model.contents, parent_dir=currentdir, log_to_console=True)
41 xt.execute(model.owner)
Scott Baker366b4772015-08-12 19:05:35 -070042 model.messages = "\n".join(xt.log_msgs)
Scott Baker61b708f2015-08-11 17:24:08 -070043 model.status = "complete"
44 except:
Scott Baker366b4772015-08-12 19:05:35 -070045 model.messages = traceback.format_exc()
Scott Baker61b708f2015-08-11 17:24:08 -070046 model.status = "exception"
47 traceback.print_exc()
48 model.command = None
49 model.save()
50
51 def destroy_program(self, model):
52 try:
53 print "*** Destroy Program %s ***" % model.name
54 model.status = "executing"
Scott Baker366b4772015-08-12 19:05:35 -070055 model.messages = ""
Scott Baker61b708f2015-08-11 17:24:08 -070056 model.save()
57 xt = XOSTosca(model.contents, parent_dir=currentdir)
58 xt.destroy(model.owner)
Scott Baker366b4772015-08-12 19:05:35 -070059 model.messages = "\n".join(xt.log_msgs)
Scott Baker61b708f2015-08-11 17:24:08 -070060 model.status = "complete"
61 except:
Scott Baker366b4772015-08-12 19:05:35 -070062 model.messages = traceback.format_exc()
Scott Baker61b708f2015-08-11 17:24:08 -070063 model.status = "exception"
64 traceback.print_exc()
65 model.command = None
66 model.save()
67
68 def run_once(self):
69 models = Program.objects.filter(kind="tosca", command="run")
70 for model in models:
71 self.run_program(model)
72
73 models = Program.objects.filter(kind="tosca", command="destroy")
74 for model in models:
75 self.destroy_program(model)
76
77 def run(self):
78 while True:
79 self.run_once()
80 time.sleep(10)
81 django.db.reset_queries()
82
83if __name__ == "__main__":
84 if "--once" in sys.argv:
85 ToscaDaemon().execute_once()
86 else:
87 ToscaDaemon().start()
88
89 print "Running forever..."
90 while True:
91 time.sleep(60)
92