blob: 7377c91f25b28d272380a111572f1fa8f6ce088e [file] [log] [blame]
import base64
import os
import sys
import time
import traceback
from protos import utility_pb2
from google.protobuf.empty_pb2 import Empty
from importlib import import_module
from django.conf import settings
SessionStore = import_module(settings.SESSION_ENGINE).SessionStore
from django.contrib.auth import authenticate as django_authenticate
import django.apps
from core.models import *
from xos.exceptions import *
from apihelper import XOSAPIHelperMixin
# The Tosca engine expects to be run from /opt/xos/tosca/ or equivalent. It
# needs some sys.path fixing up.
import inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
toscadir = os.path.join(currentdir, "../tosca")
class UtilityService(utility_pb2.utilityServicer, XOSAPIHelperMixin):
def __init__(self, thread_pool):
self.thread_pool = thread_pool
def stop(self):
pass
def Login(self, request, context):
if not request.username:
raise XOSPermissionDenied("No username")
u=django_authenticate(username=request.username, password=request.password)
if not u:
raise XOSPermissionDenied("Failed to authenticate user %s" % request.username)
session = SessionStore()
auth = {"username": request.username, "password": request.password}
session["auth"] = auth
session['_auth_user_id'] = u.pk
session['_auth_user_backend'] = u.backend
session.save()
response = utility_pb2.LoginResponse()
response.sessionid = session.session_key
return response
def Logout(self, request, context):
for (k, v) in context.invocation_metadata():
if (k.lower()=="x-xossession"):
s = SessionStore(session_key=v)
if "_auth_user_id" in s:
del s["_auth_user_id"]
s.save()
return Empty()
def RunTosca(self, request, context):
user=self.authenticate(context, required=True)
sys_path_save = sys.path
try:
sys.path.append(toscadir)
from tosca.engine import XOSTosca
xt = XOSTosca(request.recipe, parent_dir=toscadir, log_to_console=False)
xt.execute(user)
except:
response = utility_pb2.ToscaResponse()
response.status = response.ERROR
response.messages = traceback.format_exc()
return response
finally:
sys.path = sys_path_save
response = utility_pb2.ToscaResponse()
response.status = response.SUCCESS
response.messages = "\n".join(xt.log_msgs)
return response
def DestroyTosca(self, request, context):
user=self.authenticate(context, required=True)
sys_path_save = sys.path
try:
sys.path.append(toscadir)
from tosca.engine import XOSTosca
xt = XOSTosca(request.recipe, parent_dir=toscadir, log_to_console=False)
xt.destroy(user)
except:
response = utility_pb2.ToscaResponse()
response.status = response.ERROR
response.messages = traceback.format_exc()
return response
finally:
sys.path = sys_path_save
response = utility_pb2.ToscaResponse()
response.status = response.SUCCESS
response.messages = "\n".join(xt.log_msgs)
return response
def NoOp(self, request, context):
return Empty()