handle Neutron DB schema name changes 11/40311/3
authoryayogev <yaronyogev@gmail.com>
Sun, 27 Aug 2017 12:25:45 +0000 (15:25 +0300)
committeryayogev <yaronyogev@gmail.com>
Sun, 27 Aug 2017 13:07:00 +0000 (16:07 +0300)
Change-Id: I9bf11221319d3ec2174eaa78bcb363b4f24a50fe
Signed-off-by: yayogev <yaronyogev@gmail.com>
app/discover/fetchers/db/db_access.py
app/test/fetch/test_fetch.py

index 0174c4b..47f4f9e 100644 (file)
@@ -11,6 +11,7 @@ import mysql.connector
 
 from discover.configuration import Configuration
 from discover.fetcher import Fetcher
+from discover.scan_error import ScanError
 from utils.string_utils import jsonify
 
 
@@ -27,15 +28,7 @@ class DbAccess(Fetcher):
         self.config = Configuration()
         self.conf = self.config.get("mysql")
         self.connect_to_db()
-        cursor = DbAccess.conn.cursor(dictionary=True)
-        try:
-            # check if DB schema 'neutron' exists
-            cursor.execute("SELECT COUNT(*) FROM neutron.agents")
-            for row in cursor:
-                pass
-            self.neutron_db = "neutron"
-        except (AttributeError, mysql.connector.errors.ProgrammingError):
-            self.neutron_db = "ml2_neutron"
+        self.neutron_db = self.get_neutron_db_name()
 
     def db_connect(self, _host, _port, _user, _pwd, _database):
         if DbAccess.conn:
@@ -54,6 +47,22 @@ class DbAccess(Fetcher):
             return
         DbAccess.query_count_per_con = 0
 
+    @staticmethod
+    def get_neutron_db_name():
+        # check if DB schema 'neutron' exists
+        cursor = DbAccess.conn.cursor(dictionary=True)
+        cursor.execute('SHOW DATABASES')
+        matches = []
+        for row in cursor:
+            if 'neutron' in row.get('Database', ''):
+                matches.append(row)
+        if not matches:
+            raise ScanError('Unable to find Neutron schema in OpenStack DB')
+        if len(matches) > 1:
+            raise ScanError('Found multiple possible names for Neutron schema '
+                            'in OpenStack DB')
+        return matches[0]
+
     def connect_to_db(self, force=False):
         if DbAccess.conn:
             if not force:
index 55d7d4c..d40a52c 100644 (file)
@@ -59,6 +59,8 @@ class TestFetch(unittest.TestCase):
         self.inv = InventoryMgr()
         self.inv.set_collections(self.inventory_collection)
         DbAccess.conn = MagicMock()
+        DbAccess.get_neutron_db_name = MagicMock()
+        DbAccess.get_neutron_db_name.return_value = "neutron"
         SshConnection.connect = MagicMock()
         SshConnection.check_definitions = MagicMock()
         SshConn.check_definitions = MagicMock()