X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=lcm%2Fosm_common%2Fdbmongo.py;h=34e6fafb64c21bd1b3b422c70a33ca1216c444ac;hb=ae501920e1c0e03c8571bece610dd5518e6e86b9;hp=38454b3b468319de03eaece5cf00e99b70279e59;hpb=0aef0dbb3c8b50426f31812e7f386dc9188823d2;p=osm%2FRO.git diff --git a/lcm/osm_common/dbmongo.py b/lcm/osm_common/dbmongo.py index 38454b3b..34e6fafb 100644 --- a/lcm/osm_common/dbmongo.py +++ b/lcm/osm_common/dbmongo.py @@ -1,20 +1,40 @@ #import pymongo -from pymongo import MongoClient -from dbbase import DbException, dbbase +import logging +from pymongo import MongoClient, errors +from dbbase import DbException, DbBase from http import HTTPStatus +from time import time, sleep -class dbmongo(dbbase): +__author__ = "Alfonso Tierno " - def __init__(self): - pass + +class DbMongo(DbBase): + conn_initial_timout = 120 + conn_timout = 10 + + def __init__(self, logger_name='db'): + self.logger = logging.getLogger(logger_name) def db_connect(self, config): try: + if "logger_name" in config: + self.logger = logging.getLogger(config["logger_name"]) self.client = MongoClient(config["host"], config["port"]) self.db = self.client[config["name"]] + if "loglevel" in config: + self.logger.setLevel(getattr(logging, config['loglevel'])) # get data to try a connection - self.db.users.find_one({"username": "admin"}) - except Exception as e: # TODO refine + now = time() + while True: + try: + self.db.users.find_one({"username": "admin"}) + return + except errors.ConnectionFailure as e: + if time() - now >= self.conn_initial_timout: + raise + self.logger.info("Waiting to database up {}".format(e)) + sleep(2) + except errors.PyMongoError as e: raise DbException(str(e)) def db_disconnect(self): @@ -62,7 +82,7 @@ class dbmongo(dbbase): return db_filter except Exception as e: raise DbException("Invalid query string filter at {}:{}. Error: {}".format(query_k, v, e), - http_code=HTTPStatus.BAD_REQUEST.value) + http_code=HTTPStatus.BAD_REQUEST) def get_list(self, table, filter={}): @@ -88,12 +108,12 @@ class dbmongo(dbbase): rows = collection.find(filter) if rows.count() == 0: if fail_on_empty: - raise DbException("Not found entry with filter='{}'".format(filter), HTTPStatus.NOT_FOUND.value) + raise DbException("Not found entry with filter='{}'".format(filter), HTTPStatus.NOT_FOUND) return None elif rows.count() > 1: if fail_on_more: raise DbException("Found more than one entry with filter='{}'".format(filter), - HTTPStatus.CONFLICT.value) + HTTPStatus.CONFLICT) return rows[0] except Exception as e: # TODO refine raise DbException(str(e)) @@ -114,7 +134,7 @@ class dbmongo(dbbase): rows = collection.delete_one(self._format_filter(filter)) if rows.deleted_count == 0: if fail_on_empty: - raise DbException("Not found entry with filter='{}'".format(filter), HTTPStatus.NOT_FOUND.value) + raise DbException("Not found entry with filter='{}'".format(filter), HTTPStatus.NOT_FOUND) return None return {"deleted": rows.deleted_count} except Exception as e: # TODO refine @@ -134,7 +154,7 @@ class dbmongo(dbbase): rows = collection.update_one(self._format_filter(filter), {"$set": update_dict}) if rows.updated_count == 0: if fail_on_empty: - raise DbException("Not found entry with filter='{}'".format(filter), HTTPStatus.NOT_FOUND.value) + raise DbException("Not found entry with filter='{}'".format(filter), HTTPStatus.NOT_FOUND) return None return {"deleted": rows.deleted_count} except Exception as e: # TODO refine @@ -146,7 +166,7 @@ class dbmongo(dbbase): rows = collection.replace_one({"_id": id}, indata) if rows.modified_count == 0: if fail_on_empty: - raise DbException("Not found entry with filter='{}'".format(filter), HTTPStatus.NOT_FOUND.value) + raise DbException("Not found entry with filter='{}'".format(filter), HTTPStatus.NOT_FOUND) return None return {"replace": rows.modified_count} except Exception as e: # TODO refine