blob: dc6e057b8bfe5019650ae936b96c0251f0794c1a [file] [log] [blame]
""" 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.messages = ""
model.save()
xt = XOSTosca(model.contents, parent_dir=currentdir, log_to_console=True)
xt.execute(model.owner)
model.messages = "\n".join(xt.log_msgs)
model.status = "complete"
except:
model.messages = 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.messages = ""
model.save()
xt = XOSTosca(model.contents, parent_dir=currentdir)
xt.destroy(model.owner)
model.messages = "\n".join(xt.log_msgs)
model.status = "complete"
except:
model.messages = 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)