[Asterisk-code-review] Support testing realtime with ODBC (testsuite[master])

Anonymous Coward asteriskteam at digium.com
Tue Jun 21 05:26:38 CDT 2016


Anonymous Coward #1000019 has submitted this change and it was merged.

Change subject: Support testing realtime with ODBC
......................................................................


Support testing realtime with ODBC

This test module adds the ability to configure and use
an ODBC database for testing the realtime capabilities
of Asterisk.

ASTERISK-26114 #close

Change-Id: I0e20dc7354e0d4bc7d1b5d5458bdd356f1b00d26
---
A lib/python/asterisk/realtime_odbc_module.py
1 file changed, 125 insertions(+), 0 deletions(-)

Approvals:
  Anonymous Coward #1000019: Verified
  Joshua Colp: Looks good to me, approved
  Matthew Fredrickson: Looks good to me, but someone else must approve



diff --git a/lib/python/asterisk/realtime_odbc_module.py b/lib/python/asterisk/realtime_odbc_module.py
new file mode 100644
index 0000000..3653553
--- /dev/null
+++ b/lib/python/asterisk/realtime_odbc_module.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python
+"""
+Copyright (C) 2016, Digium, Inc.
+Scott Griepentrog <sgriepentrog at digium.com>
+
+This program is free software, distributed under the terms of
+the GNU General Public License Version 2.
+"""
+import os
+import logging
+
+
+LOGGER = logging.getLogger(__name__)
+
+
+class RealtimeOdbcModule(object):
+    """Test module for realtime database tests using unixODBC.
+
+    This module configures unixODBC and Asterisk for realtime database
+    use.  The __init__() is called at a point where the configuration
+    files for the Asterisk test instance have been written, but prior
+    to starting Asterisk.
+
+    The module config should look something like this (the Database
+    entry is an sqlite3 file preloaded with the database data, and
+    is located in configs/ast1 which will be copied to etc/asterisk):
+
+    odbc-config:
+        asterisk:
+            # consult /etc/odbcinst.ini, borrow entry with this driver
+            use-driver: 'libsqlite3odbc'
+            odbcinst:
+                # odbcinst values from copied from /etc can be overwritten here
+                Threading: '0'
+                Pooling: 'yes'
+                CPTimeout: '120'
+                UsageCount: '2'
+            odbc:
+                # Driver=(name of odbcinst entry) added automatically
+                Database: 'etc/asterisk/asterisk.sqlite3'
+                # Database: 'asterisk'
+                Description: 'Test Database'
+            res_odbc:
+                # 'dsn => asterisk' added automatically from key one level up
+                enabled: 'yes'
+                pre-connect: 'yes'
+                max_connections: '20'
+    """
+    def __init__(self, module_config, test_object):
+        self.test_object = test_object
+        self.odbcinst = {}
+        self.odbc = {}
+        self.res_odbc = {}
+
+        # generate configuration for each dsn
+        for dsn, config in module_config.iteritems():
+            self._configure(dsn, config)
+
+        # set the odbc and conf files
+        etc = test_object.ast[0].base + '/etc'
+        odbcinst_path = etc + '/odbcinst.ini'
+        odbc_path = etc + '/odbc.ini'
+        res_odbc_path = etc + '/asterisk/res_odbc.conf'
+
+        # write the odbc ini and conf files
+        self._write_ini_file(odbcinst_path, self.odbcinst)
+        self._write_ini_file(odbc_path, self.odbc)
+        self._write_ini_file(res_odbc_path, self.res_odbc)
+
+        # inform ODBC where to find them
+        os.environ['ODBCSYSINI'] = etc
+
+    def _configure(self, dsn, config):
+        match_driver = config.get('use-driver', 'libsqlite3odbc')
+
+        inst = self._read_ini_file('/etc/odbcinst.ini')
+        found_driver = None
+        for section in inst:
+            driver = inst[section].get('Driver')
+            if driver and match_driver in driver:
+                found_driver = section
+                break
+
+        if not found_driver:
+            LOGGER.error('Unable to find odbcinst entry matching driver ' +
+                         repr(match_driver))
+            return
+
+        # create a unique driver name by adding the dsn
+        driver_name = found_driver + '_' + dsn
+
+        self.odbcinst[driver_name] = inst[found_driver]
+        self.odbcinst[driver_name].update(config.get('odbcinst', {}))
+
+        self.odbc[dsn] = {'Driver': driver_name}
+        self.odbc[dsn].update(config.get('odbc', {}))
+
+        self.res_odbc[dsn] = {'dsn': dsn}
+        self.res_odbc[dsn].update(config.get('res_odbc', {}))
+
+        # update the Database path if relative
+        Database = self.odbc[dsn].get('Database', None)
+        if Database and Database[0] != '/' and '/' in Database:
+            self.odbc[dsn]['Database'] = '/'.join([
+                self.test_object.ast[0].base,
+                Database])
+
+    def _write_ini_file(self, filepath, contents):
+        with open(filepath, 'w') as filehandle:
+            for section in contents:
+                filehandle.write('[' + section + ']\n')
+                for name, value in contents[section].iteritems():
+                    filehandle.write(name + '=' + value + '\n')
+
+    def _read_ini_file(self, filepath):
+        contents = {}
+        with open(filepath) as filehandle:
+            for line in filehandle.readlines():
+                if line.startswith('['):
+                    section = line.rstrip()[1:-1]
+                    contents[section] = {}
+                elif '=' in line:
+                    name, value = line.rstrip().split('=')
+                    contents[section][name.strip()] = value.strip()
+        return contents

-- 
To view, visit https://gerrit.asterisk.org/3026
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I0e20dc7354e0d4bc7d1b5d5458bdd356f1b00d26
Gerrit-PatchSet: 2
Gerrit-Project: testsuite
Gerrit-Branch: master
Gerrit-Owner: Scott Griepentrog <sgriepentrog at digium.com>
Gerrit-Reviewer: Anonymous Coward #1000019
Gerrit-Reviewer: Joshua Colp <jcolp at digium.com>
Gerrit-Reviewer: Mark Michelson <mmichelson at digium.com>
Gerrit-Reviewer: Matthew Fredrickson <creslin at digium.com>
Gerrit-Reviewer: Scott Griepentrog <sgriepentrog at digium.com>



More information about the asterisk-code-review mailing list