summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLV-426 <lv-426@taproot.org.il>2015-01-02 17:45:22 +0200
committerLV-426 <lv-426@taproot.org.il>2015-01-02 17:56:27 +0200
commit758190f775b765583de61f5ce5e657ea60ac3302 (patch)
tree50e68011d3756b7eb6971a7606f7ec03fecdd9ed
parentfe6d9f455bcc1c68d2d4c01fd128df01689debf3 (diff)
rhizi_api.py: extract core logic to rz_kernel (REST/web-socket agnostic)
-rw-r--r--src/server/rhizi_api.py44
-rw-r--r--src/server/rhizi_server.py12
-rwxr-xr-xsrc/server/rhizi_server_fcgi.py13
-rw-r--r--src/server/rz_kernel.py36
4 files changed, 87 insertions, 18 deletions
diff --git a/src/server/rhizi_api.py b/src/server/rhizi_api.py
index afa8213f..44edb660 100644
--- a/src/server/rhizi_api.py
+++ b/src/server/rhizi_api.py
@@ -20,6 +20,8 @@ from flask import url_for
from flask import render_template
from flask import send_from_directory
+from rz_kernel import RZ_Kernel
+
from model.graph import Topo_Diff
from model.graph import Attr_Diff
from model.model import Link
@@ -186,7 +188,9 @@ def diff_commit__set():
def diff_commit__topo():
"""
- commit a graph topology diff
+ REST API wrapper around diff_commit__topo():
+ - extract topo_diff from request
+ - handle success/error outcomes
"""
def sanitize_input(req):
topo_diff_dict = request.get_json()['topo_diff']
@@ -195,9 +199,20 @@ def diff_commit__topo():
sanitize_input__topo_diff(topo_diff)
return topo_diff;
- topo_diff = sanitize_input(request)
- op = dbc.DBO_topo_diff_commit(topo_diff)
- return __common_exec(op)
+ try:
+ topo_diff = sanitize_input(request)
+ except Exception as e:
+ return __common_resp_handle(error='malformed input')
+
+ try:
+ kernel = flask.current_app.kernel
+ topo_diff = kernel.diff_commit__topo(db_ctl, topo_diff)
+ topo_diff_json = topo_diff.to_json_dict()
+ return __common_resp_handle(data=topo_diff_json)
+ except Exception as e:
+ log.error(e.message)
+ log.error(traceback.print_exc())
+ return __common_resp_handle(error=e)
def diff_commit__attr():
"""
@@ -210,9 +225,24 @@ def diff_commit__attr():
sanitize_input__attr_diff(attr_diff)
return attr_diff;
- attr_diff = sanitize_input(request)
- op = dbc.DBO_attr_diff_commit(attr_diff)
- return __common_exec(op)
+ def on_error(e):
+ # handle DB ERRORS, eg. name attr change error
+ return __common_resp_handle(error='error occurred')
+
+ try:
+ attr_diff = sanitize_input(request)
+ _validate_obj__attr_diff(attr_diff)
+ except Exception as e:
+ return __common_resp_handle(error='malformed input')
+
+ try:
+ kernel = flask.current_app.kernel
+ attr_diff = kernel.diff_commit__attr(db_ctl, attr_diff)
+ return __common_resp_handle(data=attr_diff)
+ except Exception as e:
+ log.error(e.message)
+ log.error(traceback.print_exc())
+ return __common_resp_handle(error=e)
def diff_commit__vis():
pass
diff --git a/src/server/rhizi_server.py b/src/server/rhizi_server.py
index 147976aa..216085fc 100644
--- a/src/server/rhizi_server.py
+++ b/src/server/rhizi_server.py
@@ -21,6 +21,7 @@ from flask import send_from_directory
from functools import wraps
from rz_mesh import init_ws_interface
+from rz_kernel import RZ_Kernel
class Config(object):
"""
@@ -220,7 +221,7 @@ def init_rest_interface(cfg, flask_webapp):
flask_webapp.f = f # assign decorated function
-def init_webapp(cfg, db_ctl=None):
+def init_webapp(cfg, kernel, db_ctl=None):
"""
Initialize webapp:
- call init_rest_interface()
@@ -239,6 +240,7 @@ def init_webapp(cfg, db_ctl=None):
rhizi_api.db_ctl = db_ctl
webapp.rz_config = cfg
+ webapp.kernel = kernel
init_rest_interface(cfg, webapp)
return webapp
@@ -272,8 +274,8 @@ if __name__ == "__main__":
init_pw_db(cfg, args.htpasswd_init_file)
exit(0)
- webapp = init_webapp(cfg)
- ws_srv = init_ws_interface(cfg, webapp)
- ws_srv.serve_forever()
-
+ kernel = RZ_Kernel()
+ webapp = init_webapp(cfg, kernel)
+ ws_srv = init_ws_interface(cfg, kernel, webapp)
+ ws_srv.serve_forever()
diff --git a/src/server/rhizi_server_fcgi.py b/src/server/rhizi_server_fcgi.py
index f0b9a04b..b3985ee1 100755
--- a/src/server/rhizi_server_fcgi.py
+++ b/src/server/rhizi_server_fcgi.py
@@ -6,19 +6,20 @@ import sys
import cgitb
import rhizi_server
+from rz_kernel import RZ_Kernel
+
# sys.path.insert(0, '/srv/www/rhizi/rhizi.net/src-py')
# enable debugging
cgitb.enable()
if __name__ == '__main__':
- cfg_dir = '/etc/rhizi'
-
- cfg = rhizi_server.init_config(os.path.join(cfg_dir, 'rhizi-server.conf'))
- log = rhizi_server.init_log()
+ cfg = rhizi_server.init_config(cfg_dir='/etc/rhizi')
+ log = rhizi_server.init_log(cfg)
- webapp = rhizi_server.init_webapp(cfg)
- rhizi_server.init_rest_api(cfg, webapp)
+ kernel = RZ_Kernel()
+ webapp = rhizi_server.init_webapp(cfg, kernel)
+ rhizi_server.init_rest_interface(cfg, webapp)
log.info('launching webapp via flup.server.fcgi.WSGIServer')
diff --git a/src/server/rz_kernel.py b/src/server/rz_kernel.py
new file mode 100644
index 00000000..b2bba38a
--- /dev/null
+++ b/src/server/rz_kernel.py
@@ -0,0 +1,36 @@
+"""
+Rhizi kernel, home to core operation login
+"""
+import db_controller
+import logging
+import traceback
+
+log = logging.getLogger('rhizi')
+
+class RZ_Kernel(object):
+
+ def diff_commit__topo(self, db_ctl, topo_diff):
+ """
+ commit a graph topology diff - this is a common pathway for:
+ - RESP API calls
+ - socket.io calls
+ - future interfaces
+ """
+ op = db_controller.DBO_topo_diff_commit(topo_diff)
+ try:
+ op_ret = db_ctl.exec_op(op)
+ return op_ret
+ except Exception as e:
+ log.error(e.message)
+ log.error(traceback.print_exc())
+ raise e
+
+ def diff_commit__attr(self, db_ctl, attr_diff):
+ op = db_controller.DBO_attr_diff_commit(attr_diff)
+ try:
+ op_ret = db_ctl.exec_op(op)
+ return op_ret
+ except Exception as e:
+ log.error(e.message)
+ log.error(traceback.print_exc())
+ raise e