From fe8199844d77edacf27dc129db54dcc566206dc8 Mon Sep 17 00:00:00 2001
From: Jorrit Schaap <schaap@astron.nl>
Date: Thu, 31 Mar 2016 13:11:09 +0000
Subject: [PATCH] Task #8887: use dbcreds, so we can connect to remote db host

---
 .../SystemStatusDatabase/ssdb.py              | 17 +++++++-------
 .../SystemStatusService/SSDBQueryService.py   | 23 ++++++++++---------
 .../SystemStatusService/ssdbservice           | 17 +++++++++++---
 3 files changed, 34 insertions(+), 23 deletions(-)

diff --git a/SAS/ResourceAssignment/SystemStatusDatabase/ssdb.py b/SAS/ResourceAssignment/SystemStatusDatabase/ssdb.py
index e97ac206366..cb869b21e1a 100644
--- a/SAS/ResourceAssignment/SystemStatusDatabase/ssdb.py
+++ b/SAS/ResourceAssignment/SystemStatusDatabase/ssdb.py
@@ -5,21 +5,16 @@ import psycopg2 as pg
 import psycopg2.extras as pgdefs
 from lofar.messaging import Service
 from lofar.common.util import waitForInterrupt
+from lofar.common import dbcredentials
 
 import logging
 import sys
 logging.basicConfig(stream=sys.stdout, level=logging.INFO)
 logger = logging.getLogger(__name__)
 
-DATABASE    = "datamonitor"
-USER        = "lofarsys"
-PASSWORD    = "welkom001"
-
 class SSDB:
     def __init__(self,**kwargs):
-        self.username = kwargs.pop("username", USER)
-        self.password = kwargs.pop("password", PASSWORD)
-        self.database = kwargs.pop("database", DATABASE)
+        self.dbcreds =  kwargs.pop("dbcreds", None)
         self.conn = None
         self.DBconnected = (self.conn and self.conn.status==1)
         self.Qlistall="select * from hosts inner join datapaths on hosts.id = datapaths.hostid;"
@@ -42,10 +37,14 @@ class SSDB:
         self.DBconnected = (self.conn and self.conn.status==1)
         if not self.DBconnected:
             try:
-                self.conn= pg.connect("dbname=%s user=%s password=%s" % (DATABASE,USER,PASSWORD))
+                self.conn = pg.connect(host=self.dbcreds.host,
+                                       user=self.dbcreds.user,
+                                       password=self.dbcreds.password,
+                                       database=self.dbcreds.database,
+                                       connect_timeout=5)
                 self.DBconnected = (self.conn and self.conn.status==1)
             except Exception as e:
-                logger.error("[SSDBconnector]: DB connection could not be restored.")
+                logger.error("[SSDBconnector]: DB connection could not be restored: %s" % (e,))
         return self.DBconnected
 
     def _doquery(self,q):
diff --git a/SAS/ResourceAssignment/SystemStatusService/SSDBQueryService.py b/SAS/ResourceAssignment/SystemStatusService/SSDBQueryService.py
index 7201d5d92ae..81cbf0b9bd4 100644
--- a/SAS/ResourceAssignment/SystemStatusService/SSDBQueryService.py
+++ b/SAS/ResourceAssignment/SystemStatusService/SSDBQueryService.py
@@ -3,6 +3,7 @@
 from lofar.messaging import Service, MessageHandlerInterface
 from lofar.common.util import waitForInterrupt
 from lofar.sas.systemstatus.database.ssdb import SSDB
+from lofar.common import dbcredentials
 
 import logging
 import sys
@@ -11,18 +12,13 @@ logger = logging.getLogger(__name__)
 
 SERVICENAME = "GetServerState"
 BUSNAME     = "simpletest"
-DATABASE    = "datamonitor"
-USER        = "lofarsys"
-PASSWORD    = "welkom001"
 
 class DataMonitorQueryService(MessageHandlerInterface):
 
     def __init__(self,**kwargs):
         super(DataMonitorQueryService,self).__init__(**kwargs)
 
-        self.username = kwargs.pop("username", USER)
-        self.password = kwargs.pop("password", PASSWORD)
-        self.database = kwargs.pop("database", DATABASE)
+        self.dbcreds = kwargs.pop("dbcreds", None)
 
         self.service2MethodMap = {
             'GetStateNames':self.getstatenames,
@@ -35,7 +31,7 @@ class DataMonitorQueryService(MessageHandlerInterface):
 
 
     def prepare_loop(self):
-        self.ssdb = SSDB(username=self.username,password=self.password,database=self.database)
+        self.ssdb = SSDB(dbcreds=self.dbcreds)
 
     def prepare_receive(self):
         self.ssdb.ensure_connected()
@@ -99,9 +95,14 @@ class DataMonitorQueryService(MessageHandlerInterface):
         jobinfo  = self.ssdb.getIngestJobs()
         return { "main" : maininfo, "jobs" : jobinfo };
 
-def createService(busname=BUSNAME,servicename=SERVICENAME):
-    return Service(servicename,DataMonitorQueryService,busname=busname,numthreads=4,use_service_methods=True)
+def createService(busname=BUSNAME,servicename=SERVICENAME, dbcreds=None):
+    return Service(servicename,
+                   DataMonitorQueryService,
+                   busname=busname,
+                   numthreads=4,
+                   handler_args={'dbcreds': dbcreds},
+                   use_service_methods=True)
 
-def runservice(busname=BUSNAME,servicename=SERVICENAME):
-    with createService(busname,servicename) as GetServerState:
+def runservice(busname=BUSNAME,servicename=SERVICENAME, dbcreds=None):
+    with createService(busname,servicename,dbcreds) as GetServerState:
         waitForInterrupt()
diff --git a/SAS/ResourceAssignment/SystemStatusService/ssdbservice b/SAS/ResourceAssignment/SystemStatusService/ssdbservice
index 11b7adb47e2..9f69e52043c 100755
--- a/SAS/ResourceAssignment/SystemStatusService/ssdbservice
+++ b/SAS/ResourceAssignment/SystemStatusService/ssdbservice
@@ -7,6 +7,7 @@ runs the systemstatus database service
 import logging
 from optparse import OptionParser
 from lofar.sas.systemstatus.service.SSDBQueryService import runservice
+from lofar.common import dbcredentials
 
 logger = logging.getLogger(__name__)
 DEFAULT_BUSNAME="amq.topic"
@@ -18,8 +19,18 @@ if __name__ == '__main__':
     # Check the invocation arguments
     parser = OptionParser("%prog [options]",
                           description='runs the systemstatus database service')
-    parser.add_option("-b", "--busname", dest="busname", type="string", default=DEFAULT_BUSNAME, help="Name of the bus exchange on the qpid broker, default: %s" % DEFAULT_BUSNAME)
-    parser.add_option("-s", "--servicename", dest="servicename", type="string", default=DEFAULT_SERVICENAME, help="Name for this service, default: %s" % DEFAULT_SERVICENAME)
+    parser.add_option("-b", "--busname", dest="busname", type="string",
+                      default=DEFAULT_BUSNAME,
+                      help="Name of the bus exchange on the qpid broker, default: %s" % DEFAULT_BUSNAME)
+    parser.add_option("-s", "--servicename", dest="servicename", type="string",
+                      default=DEFAULT_SERVICENAME,
+                      help="Name for this service, default: %s" % DEFAULT_SERVICENAME)
+    parser.add_option_group(dbcredentials.options_group(parser))
+    parser.set_defaults(dbcredentials="SSDB")
     (options, args) = parser.parse_args()
 
-    runservice(busname=options.busname, servicename=options.servicename)
+    dbcreds = dbcredentials.parse_options(options)
+
+    logger.info("Using dbcreds: %s" % dbcreds.stringWithHiddenPassword())
+
+    runservice(busname=options.busname, servicename=options.servicename, dbcreds=dbcreds)
-- 
GitLab