diff --git a/synergy/common/config.py b/synergy/common/config.py index 3cfdb67..4ae4e69 100644 --- a/synergy/common/config.py +++ b/synergy/common/config.py @@ -70,29 +70,9 @@ manager_opts = [ cfg.IntOpt("rate", default=60) ] -""" -keystone_opts = [ - cfg.StrOpt("admin_user", required=True), - cfg.StrOpt("admin_password", required=True), - cfg.StrOpt("admin_project_name", required=True), - cfg.StrOpt("auth_url", required=True) -] - -mysql_opts = [ - cfg.StrOpt("host", required=True), - cfg.StrOpt("user", default="synergy"), - cfg.StrOpt("password", required=True), - cfg.StrOpt("db", default="synergy", required=True), - cfg.IntOpt("pool_size", default="10", required=False) -] -""" - cfg.CONF.register_opts(service_opts) cfg.CONF.register_opts(wsgi_opts, group="WSGI") cfg.CONF.register_opts(logger_opts, group="Logger") -# cfg.CONF.register_opts(socket_opts) -# cfg.CONF.register_opts(keystone_opts, group="Keystone") -# cfg.CONF.register_opts(mysql_opts, group="MYSQL") def parse_args(args=None, usage=None, default_config_files=None): diff --git a/synergy/common/context.py b/synergy/common/context.py index ceb2276..b4cad8e 100644 --- a/synergy/common/context.py +++ b/synergy/common/context.py @@ -1,8 +1,9 @@ import copy -import datetime import six import uuid +from datetime import datetime + __author__ = "Lisa Zangrando" __email__ = "lisa.zangrando[AT]pd.infn.it" @@ -45,10 +46,9 @@ class RequestContext(object): self.read_deleted = read_deleted self.remote_address = remote_address if not timestamp: - timestamp = datetime.datetime.utcnow() + timestamp = datetime.utcnow() if isinstance(timestamp, six.string_types): - timestamp = datetime.datetime.strptime(timestamp, - '%Y-%m-%dT%H:%M:%S.%f') + timestamp = datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%S.%f') self.timestamp = timestamp if not request_id: request_id = generate_request_id() @@ -99,16 +99,14 @@ class RequestContext(object): pass def toDict(self): - date_format = "%Y-%m-%dT%H:%M:%S.%f" - return {'user_id': self.user_id, 'project_id': self.project_id, 'is_admin': self.is_admin, 'read_deleted': self.read_deleted, 'roles': self.roles, 'remote_address': self.remote_address, - 'timestamp': datetime.datetime.strptime(self.timestamp, - date_format), + 'timestamp': datetime.strptime(self.timestamp, + '%Y-%m-%dT%H:%M:%S.%f'), 'request_id': self.request_id, 'auth_token': self.auth_token, 'quota_class': self.quota_class, diff --git a/synergy/common/log.py b/synergy/common/log.py index e321420..d063950 100644 --- a/synergy/common/log.py +++ b/synergy/common/log.py @@ -1,5 +1,6 @@ import logging import logging.handlers +import os try: from oslo_config import cfg @@ -53,6 +54,10 @@ def getLogger(name="unknown"): # create a logging format formatter = logging.Formatter(CONF.Logger.formatter) + log_dir = os.path.dirname(CONF.Logger.filename) + if not os.path.exists(log_dir): + os.makedirs(log_dir) + # Add the log message handler to the logger handler = logging.handlers.RotatingFileHandler( CONF.Logger.filename, diff --git a/synergy/common/manager.py b/synergy/common/manager.py index 3110c2e..20d1e8e 100644 --- a/synergy/common/manager.py +++ b/synergy/common/manager.py @@ -1,6 +1,8 @@ from threading import Condition -from threading import Timer +from threading import Event +from threading import Thread +import time __author__ = "Lisa Zangrando" __email__ = "lisa.zangrando[AT]pd.infn.it" @@ -21,17 +23,18 @@ See the License for the specific language governing permissions and limitations under the License.""" -class Manager(object): +class Manager(Thread): def __init__(self, name): + super(Manager, self).__init__() + self.setDaemon(True) + self.stop_event = Event() self.config_opts = [] self.condition = Condition() self.name = name self.status = "CREATED" self.autostart = False self.rate = -1 - self.timer = None - self.is_running = False self.managers = {} def execute(self, command, *args, **kargs): @@ -75,8 +78,7 @@ class Manager(object): return self.rate def setRate(self, rate): - if rate and rate > 0: - self.rate = rate + self.rate = rate def setup(self): """Manager initialization @@ -102,46 +104,17 @@ class Manager(object): # if self.status == "RUNNING": # self.__task() - """ - def __task(self): - if self.rate: - if self.status == "RUNNING": - self.task() - self.timer = Timer(self.rate, self.__task) - self.timer.start() - else: - self.timer.cancel() - """ - - def start(self): - if not self.rate: - return - - if not self.is_running and self.rate > 0: - self.timer = Timer(self.rate * 60, self._run) - self.timer.start() - self.is_running = True - - def _run(self): - self.is_running = False - self.start() - - if self.status == "RUNNING": - self.task() - def stop(self): - self.timer.cancel() - self.is_running = False + if self.isAlive(): + # set event to signal thread to terminate + self.stop_event.set() + # block calling thread until thread really has terminated + self.join() def run(self): - if not self.rate: - return - - with self.condition: - while self.status != "DESTROYED" and self.status != "ERROR": - if self.status == "RUNNING": - self.task() - - self.condition.wait(self.rate) - else: - self.condition.wait() + while not self.stop_event.is_set(): + try: + self.task() + time.sleep(self.rate * 60) + except Exception as ex: + print("task %r: %s" % (self.name, ex)) diff --git a/synergy/common/serializer.py b/synergy/common/serializer.py index d7ca473..9e40bf7 100644 --- a/synergy/common/serializer.py +++ b/synergy/common/serializer.py @@ -4,7 +4,6 @@ except ImportError: import oslo.messaging as oslo_messaging from synergy.common import context as ctx -from synergy.common import log as logging from synergy.common import utils @@ -27,9 +26,6 @@ See the License for the specific language governing permissions and limitations under the License.""" -LOG = logging.getLogger(__name__) - - class SynergyObject(object): """Base class and object factory. @@ -101,10 +97,11 @@ class SynergyObject(object): self.attributes['synergy_object.namespace'] = 'synergy' return self.attributes - + """ def log(self): for key, value in self.attributes.items(): LOG.info("%s = %s" % (key, value)) + """ class SynergySerializer(oslo_messaging.Serializer): diff --git a/synergy/service.py b/synergy/service.py index d1e1b4c..bf619fd 100644 --- a/synergy/service.py +++ b/synergy/service.py @@ -5,17 +5,17 @@ import sys from cgi import escape from cgi import parse_qs from pkg_resources import iter_entry_points -from synergy.common import config -from synergy.common import log as logging -from synergy.common import serializer -from synergy.common import service -from synergy.common import wsgi try: from oslo_config import cfg except ImportError: from oslo.config import cfg +from synergy.common import config +from synergy.common import log as logging +from synergy.common import serializer +from synergy.common import service +from synergy.common import wsgi __author__ = "Lisa Zangrando" __email__ = "lisa.zangrando[AT]pd.infn.it" @@ -35,7 +35,6 @@ either express or implied. See the License for the specific language governing permissions and limitations under the License.""" - CONF = cfg.CONF LOG = None MANAGER_ENTRY_POINT = "synergy.managers" # used to discover Synergy managers @@ -162,14 +161,14 @@ class Synergy(service.Service): CONF.register_opts(config.manager_opts, group=entry.name) - manager_conf = CONF.get(entry.name) + # manager_conf = CONF.get(entry.name) manager_class = entry.load() manager_obj = manager_class(*args, **kwargs) LOG.info("manager instance %r created!", entry.name) - manager_obj.setAutoStart(manager_conf.autostart) - manager_obj.setRate(manager_conf.rate) + manager_obj.setAutoStart(CONF.get(entry.name).autostart) + manager_obj.setRate(CONF.get(entry.name).rate) self.managers[manager_obj.getName()] = manager_obj @@ -264,7 +263,9 @@ class Synergy(service.Service): if manager_name in self.managers: manager = self.managers[manager_name] try: - manager.execute(cmd=command) + cmd_result = manager.execute(command=command.getName(), + **command.getParameters()) + command.addResult("result", cmd_result) result = synergySerializer.serialize_entity(context=None, entity=command) # LOG.info("command result %s" % result) @@ -284,7 +285,6 @@ class Synergy(service.Service): manager_list = None result = {} - # synergySerializer = serializer.SynergySerializer() query = environ.get("QUERY_STRING", None) if query: