Add a SQLite3 ext_pillar built on the sql_base pillar.

This commit is contained in:
Aneesh Agrawal 2015-05-27 14:44:10 -04:00
parent decb6cef97
commit ac4792f68d
2 changed files with 682 additions and 0 deletions

114
salt/pillar/sqlite3.py Normal file
View File

@ -0,0 +1,114 @@
# -*- coding: utf-8 -*-
'''
Retrieve Pillar data by doing a SQLite3 query
sqlite3 is included in the stdlib since python2.5.
This module is a concrete implementation of the sql_base ext_pillar for SQLite3.
:maturity: new
:platform: all
Configuring the sqlite3 ext_pillar
=====================================
Use the 'sqlite3' key under ext_pillar for configuration of queries.
SQLite3 database connection configuration requires the following values
configured in the master config:
Note, timeout is in seconds.
.. code-block:: yaml
pillar.sqlite3.database: /var/lib/salt/pillar.db
pillar.sqlite3.timeout: 5.0
Complete example
=====================================
.. code-block:: yaml
pillar:
sqlite3:
database: '/var/lib/salt/pillar.db'
timeout: 5.0
ext_pillar:
- sqlite3:
fromdb:
query: 'SELECT col1,col2,col3,col4,col5,col6,col7
FROM some_random_table
WHERE minion_pattern LIKE %s'
depth: 5
as_list: True
with_lists: [1,3]
'''
from __future__ import absolute_import
# Import python libs
from contextlib import contextmanager
import logging
import sqlite3
# Import Salt libs
import salt.utils
from salt.pillar.sql_base import SqlBaseExtPillar
# Set up logging
log = logging.getLogger(__name__)
def __virtual__():
return True
class SQLite3ExtPillar(SqlBaseExtPillar):
'''
This class receives and processes the database rows from SQLite3.
'''
@classmethod
def _db_name(cls):
return 'SQLite3'
def _get_options():
'''
Returns options used for the SQLite3 connection.
'''
defaults = {'database': '/var/lib/salt/pillar.db',
'timeout': 5.0}
_options = {}
_opts = __opts__.get('pillar', {}).get('sqlite3', {})
for attr in defaults:
if attr not in _opts:
log.debug('Using default for SQLite3 pillar {0}'.format(attr))
_options[attr] = defaults[attr]
continue
_options[attr] = _opts[attr]
return _options
@contextmanager
def _get_cursor():
'''
Yield a SQLite3 cursor
'''
_options = _get_options()
conn = sqlite3.connect(_options.get('database'),
timeout=float(_options.get('timeout')))
cursor = conn.cursor()
try:
yield cursor
except sqlite3.Error as err:
log.exception('Error in ext_pillar SQLite3: {0}'.format(err.args))
finally:
conn.close()
def ext_pillar(minion_id,
pillar,
*args,
**kwargs):
'''
Execute queries against SQLite3, merge and return as a dict
'''
return SQLite3ExtPillar().fetch(minion_id, pillar, *args, **kwargs)

View File

@ -0,0 +1,568 @@
# -*- coding: utf-8 -*-
# Import python libs
from __future__ import absolute_import
# Import Salt Testing libs
from salttesting import TestCase, skipIf
from salttesting.mock import NO_MOCK, NO_MOCK_REASON
from salttesting.helpers import ensure_in_syspath
ensure_in_syspath('../../')
# Import Salt Libs
from salt.pillar import sqlite3
@skipIf(NO_MOCK, NO_MOCK_REASON)
class SQLite3PillarTestCase(TestCase):
maxDiff = None
def test_001_extract_queries_list(self):
return_data = sqlite3.SQLite3ExtPillar()
args, kwargs = [
'SELECT blah',
'SELECT blah2',
('SELECT blah3',),
('SELECT blah4', 2),
{'query': 'SELECT blah5'},
{'query': 'SELECT blah6', 'depth': 2},
{'query': 'SELECT blah7', 'as_list': True},
{'query': 'SELECT blah8', 'with_lists': '1'},
{'query': 'SELECT blah9', 'with_lists': '1,2'}
], {}
qbuffer = return_data.extract_queries(args, kwargs)
self.assertEqual([
[None, {'query': 'SELECT blah', 'depth': 0, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
[None, {'query': 'SELECT blah2', 'depth': 0, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
[None, {'query': 'SELECT blah3', 'depth': 0, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
[None, {'query': 'SELECT blah4', 'depth': 2, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
[None, {'query': 'SELECT blah5', 'depth': 0, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
[None, {'query': 'SELECT blah6', 'depth': 2, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
[None, {'query': 'SELECT blah7', 'depth': 0, 'as_list': True,
'with_lists': None, 'ignore_null': False}],
[None, {'query': 'SELECT blah8', 'depth': 0, 'as_list': False,
'with_lists': [1], 'ignore_null': False}],
[None, {'query': 'SELECT blah9', 'depth': 0, 'as_list': False,
'with_lists': [1, 2], 'ignore_null': False}]
], qbuffer)
def test_002_extract_queries_kwarg(self):
return_data = sqlite3.SQLite3ExtPillar()
args, kwargs = [], {
'1': 'SELECT blah',
'2': 'SELECT blah2',
'3': ('SELECT blah3',),
'4': ('SELECT blah4', 2),
'5': {'query': 'SELECT blah5'},
'6': {'query': 'SELECT blah6', 'depth': 2},
'7': {'query': 'SELECT blah7', 'as_list': True},
}
qbuffer = return_data.extract_queries(args, kwargs)
self.assertEqual([
['1', {'query': 'SELECT blah', 'depth': 0, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
['2', {'query': 'SELECT blah2', 'depth': 0, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
['3', {'query': 'SELECT blah3', 'depth': 0, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
['4', {'query': 'SELECT blah4', 'depth': 2, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
['5', {'query': 'SELECT blah5', 'depth': 0, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
['6', {'query': 'SELECT blah6', 'depth': 2, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
['7', {'query': 'SELECT blah7', 'depth': 0, 'as_list': True,
'with_lists': None, 'ignore_null': False}]
], qbuffer)
def test_003_extract_queries_mixed(self):
return_data = sqlite3.SQLite3ExtPillar()
args, kwargs = [
'SELECT blah1',
('SELECT blah2', 2),
{'query': 'SELECT blah3', 'as_list': True},
], {
'1': 'SELECT blah1',
'2': ('SELECT blah2', 2),
'3': {'query': 'SELECT blah3', 'as_list': True},
}
qbuffer = return_data.extract_queries(args, kwargs)
self.assertEqual([
[None, {'query': 'SELECT blah1', 'depth': 0, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
[None, {'query': 'SELECT blah2', 'depth': 2, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
[None, {'query': 'SELECT blah3', 'depth': 0, 'as_list': True,
'with_lists': None, 'ignore_null': False}],
['1', {'query': 'SELECT blah1', 'depth': 0, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
['2', {'query': 'SELECT blah2', 'depth': 2, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
['3', {'query': 'SELECT blah3', 'depth': 0, 'as_list': True,
'with_lists': None, 'ignore_null': False}]
], qbuffer)
def test_004_extract_queries_bogus_list(self):
# This test is specifically checking that empty queries are dropped
return_data = sqlite3.SQLite3ExtPillar()
args, kwargs = [
'SELECT blah',
'',
'SELECT blah2',
('SELECT blah3',),
('',),
('SELECT blah4', 2),
tuple(),
('SELECT blah5',),
{'query': 'SELECT blah6'},
{'query': ''},
{'query': 'SELECT blah7', 'depth': 2},
{'not_a_query': 'in sight!'},
{'query': 'SELECT blah8', 'as_list': True},
], {}
qbuffer = return_data.extract_queries(args, kwargs)
self.assertEqual([
[None, {'query': 'SELECT blah', 'depth': 0, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
[None, {'query': 'SELECT blah2', 'depth': 0, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
[None, {'query': 'SELECT blah3', 'depth': 0, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
[None, {'query': 'SELECT blah4', 'depth': 2, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
[None, {'query': 'SELECT blah5', 'depth': 0, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
[None, {'query': 'SELECT blah6', 'depth': 0, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
[None, {'query': 'SELECT blah7', 'depth': 2, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
[None, {'query': 'SELECT blah8', 'depth': 0, 'as_list': True,
'with_lists': None, 'ignore_null': False}]
], qbuffer)
def test_005_extract_queries_bogus_kwargs(self):
# this test is cut down as most of the path matches test_*_bogus_list
return_data = sqlite3.SQLite3ExtPillar()
args, kwargs = [], {
'1': 'SELECT blah',
'2': '',
'3': 'SELECT blah2'
}
qbuffer = return_data.extract_queries(args, kwargs)
self.assertEqual([
['1', {'query': 'SELECT blah', 'depth': 0, 'as_list': False,
'with_lists': None, 'ignore_null': False}],
['3', {'query': 'SELECT blah2', 'depth': 0, 'as_list': False,
'with_lists': None, 'ignore_null': False}]
], qbuffer)
def test_011_enter_root(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.enter_root("test")
self.assertEqual(return_data.result["test"], return_data.focus)
return_data.enter_root(None)
self.assertEqual(return_data.result, return_data.focus)
def test_021_process_fields(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.process_fields(['a', 'b'], 0)
self.assertEqual(return_data.num_fields, 2)
self.assertEqual(return_data.depth, 1)
return_data.process_fields(['a', 'b'], 2)
self.assertEqual(return_data.num_fields, 2)
self.assertEqual(return_data.depth, 1)
return_data.process_fields(['a', 'b', 'c', 'd'], 0)
self.assertEqual(return_data.num_fields, 4)
self.assertEqual(return_data.depth, 3)
return_data.process_fields(['a', 'b', 'c', 'd'], 1)
self.assertEqual(return_data.num_fields, 4)
self.assertEqual(return_data.depth, 1)
return_data.process_fields(['a', 'b', 'c', 'd'], 2)
self.assertEqual(return_data.num_fields, 4)
self.assertEqual(return_data.depth, 2)
return_data.process_fields(['a', 'b', 'c', 'd'], 3)
self.assertEqual(return_data.num_fields, 4)
self.assertEqual(return_data.depth, 3)
return_data.process_fields(['a', 'b', 'c', 'd'], 4)
self.assertEqual(return_data.num_fields, 4)
self.assertEqual(return_data.depth, 3)
def test_111_process_results_legacy(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.process_fields(['a', 'b'], 0)
return_data.with_lists = []
return_data.process_results([[1, 2]])
self.assertEqual(
{1: 2},
return_data.result
)
def test_112_process_results_legacy_multiple(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.process_fields(['a', 'b'], 0)
return_data.with_lists = []
return_data.process_results([[1, 2], [3, 4], [5, 6]])
self.assertEqual(
{1: 2, 3: 4, 5: 6},
return_data.result
)
def test_121_process_results_depth_0(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.process_fields(['a', 'b', 'c', 'd'], 0)
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_results([[1, 2, 3, 4], [5, 6, 7, 8]])
self.assertEqual(
{1: {2: {3: 4}}, 5: {6: {7: 8}}},
return_data.result
)
def test_122_process_results_depth_1(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.process_fields(['a', 'b', 'c', 'd'], 1)
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_results([[1, 2, 3, 4], [5, 6, 7, 8]])
self.assertEqual(
{1: {'b': 2, 'c': 3, 'd': 4}, 5: {'b': 6, 'c': 7, 'd': 8}},
return_data.result
)
def test_123_process_results_depth_2(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.process_fields(['a', 'b', 'c', 'd'], 2)
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_results([[1, 2, 3, 4], [5, 6, 7, 8]])
self.assertEqual(
{1: {2: {'c': 3, 'd': 4}}, 5: {6: {'c': 7, 'd': 8}}},
return_data.result
)
def test_124_process_results_depth_3(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.process_fields(['a', 'b', 'c', 'd'], 3)
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_results([[1, 2, 3, 4], [5, 6, 7, 8]])
self.assertEqual(
{1: {2: {3: 4}}, 5: {6: {7: 8}}},
return_data.result
)
def test_125_process_results_depth_4(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.process_fields(['a', 'b', 'c', 'd'], 4)
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_results([[1, 2, 3, 4], [5, 6, 7, 8]])
self.assertEqual(
{1: {2: {3: 4}}, 5: {6: {7: 8}}},
return_data.result
)
def test_131_process_results_overwrite_legacy_multiple(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.process_fields(['a', 'b'], 0)
return_data.with_lists = []
return_data.process_results([[1, 2], [3, 4], [1, 6]])
self.assertEqual(
{1: 6, 3: 4},
return_data.result
)
def test_132_process_results_merge_depth_0(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.process_fields(['a', 'b', 'c', 'd'], 0)
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_results([[1, 2, 3, 4], [1, 6, 7, 8]])
self.assertEqual(
{1: {2: {3: 4}, 6: {7: 8}}},
return_data.result
)
def test_133_process_results_overwrite_depth_0(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.process_fields(['a', 'b', 'c', 'd'], 0)
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_results([[1, 2, 3, 4], [1, 2, 3, 8]])
self.assertEqual(
{1: {2: {3: 8}}},
return_data.result
)
def test_134_process_results_deepmerge_depth_0(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.process_fields(['a', 'b', 'c', 'd'], 0)
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_results([[1, 2, 3, 4], [1, 2, 7, 8]])
self.assertEqual(
{1: {2: {3: 4, 7: 8}}},
return_data.result
)
def test_135_process_results_overwrite_depth_1(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.process_fields(['a', 'b', 'c', 'd'], 1)
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_results([[1, 2, 3, 4], [1, 6, 7, 8]])
self.assertEqual(
{1: {'b': 6, 'c': 7, 'd': 8}},
return_data.result
)
def test_136_process_results_merge_depth_2(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.process_fields(['a', 'b', 'c', 'd'], 2)
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_results([[1, 2, 3, 4], [1, 6, 7, 8]])
self.assertEqual(
{1: {2: {'c': 3, 'd': 4}, 6: {'c': 7, 'd': 8}}},
return_data.result
)
def test_137_process_results_overwrite_depth_2(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.process_fields(['a', 'b', 'c', 'd'], 2)
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_results([[1, 2, 3, 4], [1, 2, 7, 8]])
self.assertEqual(
{1: {2: {'c': 7, 'd': 8}}},
return_data.result
)
def test_201_process_results_complexity_multiresults(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.process_fields(['a', 'b', 'c', 'd'], 2)
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_results([[1, 2, 3, 4]])
return_data.process_results([[1, 2, 7, 8]])
self.assertEqual(
{1: {2: {'c': 7, 'd': 8}}},
return_data.result
)
def test_202_process_results_complexity_as_list(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.process_fields(['a', 'b', 'c', 'd'], 2)
return_data.with_lists = []
return_data.enter_root(None)
return_data.as_list = True
return_data.process_results([[1, 2, 3, 4]])
return_data.process_results([[1, 2, 7, 8]])
self.assertEqual(
{1: {2: {'c': [3, 7], 'd': [4, 8]}}},
return_data.result
)
def test_203_process_results_complexity_as_list_deeper(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.process_fields(['a', 'b', 'c', 'd'], 0)
return_data.with_lists = []
return_data.enter_root(None)
return_data.as_list = True
return_data.process_results([[1, 2, 3, 4]])
return_data.process_results([[1, 2, 3, 8]])
self.assertEqual(
{1: {2: {3: [4, 8]}}},
return_data.result
)
def test_204_process_results_complexity_as_list_mismatch_depth(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.as_list = True
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_fields(['a', 'b', 'c', 'd'], 0)
return_data.process_results([[1, 2, 3, 4]])
return_data.process_results([[1, 2, 3, 5]])
return_data.process_fields(['a', 'b', 'c', 'd', 'e'], 0)
return_data.process_results([[1, 2, 3, 6, 7]])
self.assertEqual(
{1: {2: {3: [4, 5, {6: 7}]}}},
return_data.result
)
def test_205_process_results_complexity_as_list_mismatch_depth_reversed(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.as_list = True
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_fields(['a', 'b', 'c', 'd', 'e'], 0)
return_data.process_results([[1, 2, 3, 6, 7]])
return_data.process_results([[1, 2, 3, 8, 9]])
return_data.process_fields(['a', 'b', 'c', 'd'], 0)
return_data.process_results([[1, 2, 3, 4]])
return_data.process_results([[1, 2, 3, 5]])
self.assertEqual(
{1: {2: {3: [{6: 7, 8: 9}, 4, 5]}}},
return_data.result
)
def test_206_process_results_complexity_as_list_mismatch_depth_weird_order(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.as_list = True
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_fields(['a', 'b', 'c', 'd', 'e'], 0)
return_data.process_results([[1, 2, 3, 6, 7]])
return_data.process_fields(['a', 'b', 'c', 'd'], 0)
return_data.process_results([[1, 2, 3, 4]])
return_data.process_fields(['a', 'b', 'c', 'd', 'e'], 0)
return_data.process_results([[1, 2, 3, 8, 9]])
return_data.process_fields(['a', 'b', 'c', 'd'], 0)
return_data.process_results([[1, 2, 3, 5]])
self.assertEqual(
{1: {2: {3: [{6: 7, }, 4, {8: 9}, 5]}}},
return_data.result
)
def test_207_process_results_complexity_collision_mismatch_depth(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.as_list = False
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_fields(['a', 'b', 'c', 'd'], 0)
return_data.process_results([[1, 2, 3, 4]])
return_data.process_results([[1, 2, 3, 5]])
return_data.process_fields(['a', 'b', 'c', 'd', 'e'], 0)
return_data.process_results([[1, 2, 3, 6, 7]])
self.assertEqual(
{1: {2: {3: {6: 7}}}},
return_data.result
)
def test_208_process_results_complexity_collision_mismatch_depth_reversed(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.as_list = False
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_fields(['a', 'b', 'c', 'd', 'e'], 0)
return_data.process_results([[1, 2, 3, 6, 7]])
return_data.process_results([[1, 2, 3, 8, 9]])
return_data.process_fields(['a', 'b', 'c', 'd'], 0)
return_data.process_results([[1, 2, 3, 4]])
return_data.process_results([[1, 2, 3, 5]])
self.assertEqual(
{1: {2: {3: 5}}},
return_data.result
)
def test_209_process_results_complexity_collision_mismatch_depth_weird_order(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.as_list = False
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_fields(['a', 'b', 'c', 'd', 'e'], 0)
return_data.process_results([[1, 2, 3, 6, 7]])
return_data.process_fields(['a', 'b', 'c', 'd'], 0)
return_data.process_results([[1, 2, 3, 4]])
return_data.process_fields(['a', 'b', 'c', 'd', 'e'], 0)
return_data.process_results([[1, 2, 3, 8, 9]])
return_data.process_fields(['a', 'b', 'c', 'd'], 0)
return_data.process_results([[1, 2, 3, 5]])
self.assertEqual(
{1: {2: {3: 5}}},
return_data.result
)
def test_20A_process_results_complexity_as_list_vary(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.as_list = True
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_fields(['a', 'b', 'c', 'd', 'e'], 0)
return_data.process_results([[1, 2, 3, 6, 7]])
return_data.process_results([[1, 2, 3, 8, 9]])
return_data.process_fields(['a', 'b', 'c', 'd'], 0)
return_data.process_results([[1, 2, 3, 4]])
return_data.as_list = False
return_data.process_results([[1, 2, 3, 5]])
self.assertEqual(
{1: {2: {3: 5}}},
return_data.result
)
def test_207_process_results_complexity_roots_collision(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.as_list = False
return_data.with_lists = []
return_data.enter_root(None)
return_data.process_fields(['a', 'b', 'c', 'd'], 0)
return_data.process_results([[1, 2, 3, 4]])
return_data.enter_root(1)
return_data.process_results([[5, 6, 7, 8]])
self.assertEqual(
{1: {5: {6: {7: 8}}}},
return_data.result
)
def test_301_process_results_with_lists(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.as_list = False
return_data.with_lists = [1, 3]
return_data.enter_root(None)
return_data.process_fields(['a', 'b', 'c', 'd', 'e', 'v'], 0)
return_data.process_results([['a', 'b', 'c', 'd', 'e', 1],
['a', 'b', 'c', 'f', 'g', 2],
['a', 'z', 'h', 'y', 'j', 3],
['a', 'z', 'h', 'y', 'k', 4]])
self.assertEqual(
{'a': [
{'c': [
{'e': 1},
{'g': 2}
]
},
{'h': [
{'j': 3, 'k': 4}
]
}
]},
return_data.result
)
def test_302_process_results_with_lists_consecutive(self):
return_data = sqlite3.SQLite3ExtPillar()
return_data.as_list = False
return_data.with_lists = [1, 2, 3]
return_data.enter_root(None)
return_data.process_fields(['a', 'b', 'c', 'd', 'e', 'v'], 0)
return_data.process_results([['a', 'b', 'c', 'd', 'e', 1],
['a', 'b', 'c', 'f', 'g', 2],
['a', 'z', 'h', 'y', 'j', 3],
['a', 'z', 'h', 'y', 'k', 4]])
self.assertEqual(
{'a': [
[[
{'e': 1},
{'g': 2}
]
],
[[
{'j': 3, 'k': 4}
]
]
]},
return_data.result
)
if __name__ == '__main__':
from integration import run_tests
run_tests(SQLite3PillarTestCase, needs_daemon=False)