from uuid import uuid4
 from oslo_log import log as logging
 from moon_utilities.security_functions import call, notify
-from oslo_config import cfg
 from moon_router.api.generic import Status, Logs
+from moon_utilities import configuration
 
-LOG = logging.getLogger(__name__)
-CONF = cfg.CONF
+LOG = logging.getLogger("moon.router.api.route")
 
 API = {
     "orchestrator": (
 
     __version__ = "0.1.0"
     cache_requests = {}
+    slave_name = ""
 
     def __init__(self, add_master_cnx):
-        if CONF.slave.slave_name and add_master_cnx:
+        self.slave = configuration.get_configuration(configuration.SLAVE)["slave"]
+        try:
+            self.slave_name = self.slave['name']
+        except KeyError:
+            pass
+        if self.slave_name and add_master_cnx:
             result = call('security_router', method="route",
                           ctx={
-                              "name": CONF.slave.slave_name,
-                              "description": CONF.slave.slave_name,
+                              "name": self.slave_name,
+                              "description": self.slave_name,
                               "call_master": True,
                               "method": "add_slave"}, args={})
             if "result" in result and not result["result"]:
                 LOG.error("An error occurred when sending slave name {} {}".format(
-                    CONF.slave.slave_name, result
+                    self.slave_name, result
                 ))
             self.slave_id = list(result['slaves'].keys())[0]
             result = call('security_router', method="route",
                           ctx={
-                              "name": CONF.slave.slave_name,
-                              "description": CONF.slave.slave_name,
+                              "name": self.slave_name,
+                              "description": self.slave_name,
                               "call_master": True,
                               "method": "get_slaves"}, args={})
             if "result" in result and not result["result"]:
                 LOG.error("An error occurred when receiving slave names {} {}".format(
-                    CONF.slave.slave_name, result
+                    self.slave_name, result
                 ))
             LOG.info("SLAVES: {}".format(result))
 
     def delete(self):
-        if CONF.slave.slave_name and self.slave_id:
+        if self.slave_name and self.slave_id:
             result = call('security_router', method="route",
                           ctx={
-                              "name": CONF.slave.slave_name,
-                              "description": CONF.slave.slave_name,
+                              "name": self.slave_name,
+                              "description": self.slave_name,
                               "call_master": True,
                               "method": "delete_slave",
                               "id": self.slave_id}, args={})
             if "result" in result and not result["result"]:
                 LOG.error("An error occurred when sending slave name {} {}".format(
-                    CONF.slave.slave_name, result
+                    self.slave_name, result
                 ))
             LOG.info("SLAVE CONNECTION ENDED!")
             LOG.info(result)
 
-    @staticmethod
-    def check_pdp(ctx):
+    def check_pdp(self, ctx):
         _ctx = copy.deepcopy(ctx)
         keystone_id = _ctx.pop('id')
         # LOG.info("_ctx {}".format(_ctx))
             return False
         keystone_id_list = map(lambda x: x["keystone_project_id"], ext['pdps'].values())
         if not ext['pdps'] or keystone_id not in keystone_id_list:
-            if CONF.slave.slave_name:
+            if self.slave_name:
                 _ctx['call_master'] = True
                 # update from master if exist and test again
                 LOG.info("Need to update from master {}".format(keystone_id))
 
     def send_update(self, api, ctx={}, args={}):
         # TODO (asteroide): add threads here
-        if not CONF.slave.slave_name:
+        if not self.slave_name:
             # Note (asteroide):
             # if adding or setting an element: do nothing
             # if updating or deleting an element: force deletion in the slave
         :param args: dictionary depending of the real destination
         :return: dictionary depending of the real destination
         """
+        LOG.info("Get Route {} {}".format(ctx, args))
         if ctx["method"] == "get_status":
             return Status().get_status(ctx=ctx, args=args)
         if ctx["method"] == "get_logs":
 
 from moon_router.api.generic import Status, Logs
 from moon_router.api.route import Router
 from moon_utilities.api import APIList
+from moon_utilities import configuration
 
-LOG = logging.getLogger(__name__)
+LOG = logging.getLogger("moon.router.messenger")
 
 
 class Server:
     TOPIC = "security_router"
 
     def __init__(self, add_master_cnx=False):
-        if add_master_cnx and cfg.CONF.slave.master_url:
-            self.transport = oslo_messaging.get_transport(cfg.CONF, cfg.CONF.slave.master_url)
-            self.TOPIC = self.TOPIC + "_" + cfg.CONF.slave.slave_name
+        slave = configuration.get_configuration(configuration.SLAVE)["slave"]
+        cfg.CONF.transport_url = self.__get_transport_url()
+        if add_master_cnx and slave["master"]["url"]:
+            self.transport = oslo_messaging.get_transport(cfg.CONF, slave["master"]["url"])
+            self.TOPIC = self.TOPIC + "_" + slave["name"]
         else:
             self.transport = oslo_messaging.get_transport(cfg.CONF)
         self.target = oslo_messaging.Target(topic=self.TOPIC, server='server1')
                                                     access_policy=oslo_messaging.DefaultRPCAccessPolicy)
         self.__is_alive = False
 
+    @staticmethod
+    def __get_transport_url():
+        messenger = configuration.get_configuration(configuration.MESSENGER)["messenger"]
+        return messenger['url']
+
     def stop(self):
         self.__is_alive = False
         self.endpoints[-1].delete()
 
 import os
 import threading
 import signal
-from oslo_config import cfg
 from oslo_log import log as logging
-from moon_utilities import options  # noqa
+from moon_utilities import configuration, exceptions
 from moon_router.messenger import Server
 
 
     def run(self):
         self.server.run()
 
-LOG = logging.getLogger(__name__)
-CONF = cfg.CONF
-DOMAIN = "moon_router"
+LOG = logging.getLogger("moon.router")
 
 __CWD__ = os.path.dirname(os.path.abspath(__file__))
 
 
 def main():
     global background_threads
-    LOG.info("Starting server with IP {}".format(CONF.security_router.host))
+    configuration.init_logging()
+    try:
+        conf = configuration.get_configuration("components/router")
+    except exceptions.ConsulComponentNotFound:
+        conf = configuration.add_component("router", "router")
     signal.signal(signal.SIGALRM, stop_thread)
     signal.signal(signal.SIGTERM, stop_thread)
     signal.signal(signal.SIGABRT, stop_thread)
     background_master = None
-    if CONF.slave.slave_name:
+    slave = configuration.get_configuration(configuration.SLAVE)["slave"]
+    if slave['name']:
         background_master = AsyncServer(add_master_cnx=True)
         background_threads.append(background_master)
     background_slave = AsyncServer(add_master_cnx=False)
     background_threads.append(background_slave)
-    if CONF.slave.slave_name:
+    if slave['name']:
         background_master.start()
+        LOG.info("Connecting to master...")
     background_slave.start()
-    if CONF.slave.slave_name:
+    LOG.info("Starting main server {}".format(conf["components/router"]["hostname"]))
+    if slave['name']:
         background_master.join()
     background_slave.join()