From defe9506bbf177ae49a9a07b427453bd7c953ff8 Mon Sep 17 00:00:00 2001
From: Jack Robison <jackrobison@lbry.io>
Date: Fri, 20 Jul 2018 14:48:31 -0400
Subject: [PATCH] set daemon attribute for each component as they start

---
 lbrynet/daemon/Component.py        |  1 +
 lbrynet/daemon/ComponentManager.py |  2 +-
 lbrynet/daemon/Daemon.py           | 27 +++++++++++++++++++--------
 lbrynet/daemon/auth/server.py      |  2 +-
 4 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/lbrynet/daemon/Component.py b/lbrynet/daemon/Component.py
index e7877c47f..e2f18c039 100644
--- a/lbrynet/daemon/Component.py
+++ b/lbrynet/daemon/Component.py
@@ -42,6 +42,7 @@ class Component(object):
     def stop(self):
         raise NotImplementedError()
 
+    @property
     def component(self):
         raise NotImplementedError()
 
diff --git a/lbrynet/daemon/ComponentManager.py b/lbrynet/daemon/ComponentManager.py
index 3541339dc..17dcbcb57 100644
--- a/lbrynet/daemon/ComponentManager.py
+++ b/lbrynet/daemon/ComponentManager.py
@@ -88,7 +88,7 @@ class ComponentManager(object):
         def _setup(component):
             if component.component_name in callbacks:
                 d = component._setup()
-                d.addCallback(callbacks[component.component_name])
+                d.addCallback(callbacks[component.component_name], component)
                 return d
             return component._setup()
 
diff --git a/lbrynet/daemon/Daemon.py b/lbrynet/daemon/Daemon.py
index 623bef92f..61e7bc1cc 100644
--- a/lbrynet/daemon/Daemon.py
+++ b/lbrynet/daemon/Daemon.py
@@ -153,6 +153,16 @@ class Daemon(AuthJSONRPCServer):
     LBRYnet daemon, a jsonrpc interface to lbry functions
     """
 
+    component_attributes = {
+        EXCHANGE_RATE_MANAGER_COMPONENT: "exchange_rate_manager",
+        DATABASE_COMPONENT: "storage",
+        SESSION_COMPONENT: "session",
+        WALLET_COMPONENT: "wallet",
+        DHT_COMPONENT: "dht_node",
+        STREAM_IDENTIFIER_COMPONENT: "sd_identifier",
+        FILE_MANAGER_COMPONENT: "file_manager",
+    }
+
     def __init__(self, analytics_manager, component_manager=None):
         AuthJSONRPCServer.__init__(self, conf.settings['use_auth_http'])
         self.download_directory = conf.settings['download_directory']
@@ -208,15 +218,16 @@ class Daemon(AuthJSONRPCServer):
         self.looping_call_manager.start(Checker.CONNECTION_STATUS, 30)
 
         yield self._initial_setup()
-        yield self.component_manager.setup()
-        self.exchange_rate_manager = self.component_manager.get_component(EXCHANGE_RATE_MANAGER_COMPONENT)
-        self.storage = self.component_manager.get_component(DATABASE_COMPONENT)
-        self.session = self.component_manager.get_component(SESSION_COMPONENT)
-        self.wallet = self.component_manager.get_component(WALLET_COMPONENT)
-        self.dht_node = self.component_manager.get_component(DHT_COMPONENT)
         yield self._start_analytics()
-        self.sd_identifier = self.component_manager.get_component(STREAM_IDENTIFIER_COMPONENT)
-        self.file_manager = self.component_manager.get_component(FILE_MANAGER_COMPONENT)
+
+        def update_attr(component_setup_result, component):
+            setattr(self, self.component_attributes[component.component_name], component.component)
+
+        setup_callbacks = {
+            component_name: update_attr for component_name in self.component_attributes.keys()
+        }
+
+        yield self.component_manager.setup(**setup_callbacks)
         log.info("Starting balance: " + str(self.wallet.get_balance()))
         self.announced_startup = True
         log.info("Started lbrynet-daemon")
diff --git a/lbrynet/daemon/auth/server.py b/lbrynet/daemon/auth/server.py
index 72d7e7b6b..af2461839 100644
--- a/lbrynet/daemon/auth/server.py
+++ b/lbrynet/daemon/auth/server.py
@@ -164,7 +164,7 @@ class AuthorizedBase(object):
                     result = yield fn(*args, **kwargs)
                     defer.returnValue(result)
                 else:
-                    raise ComponentsNotStarted("Not all required components are set up:", components)
+                    raise ComponentsNotStarted("Not all required components are set up: %s" % json.dumps(components))
             return _inner
         return _wrap