Skip to content

update support for accelerated_field of kvstore #500

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jan 31, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 20 additions & 11 deletions splunklib/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -3709,24 +3709,31 @@ class KVStoreCollections(Collection):
def __init__(self, service):
Collection.__init__(self, service, 'storage/collections/config', item=KVStoreCollection)

def create(self, name, indexes = {}, fields = {}, **kwargs):
def __getitem__(self, item):
res = Collection.__getitem__(self, item)
for k, v in res.content.items():
if "accelerated_fields" in k:
res.content[k] = json.loads(v)
return res

def create(self, name, accelerated_fields={}, fields={}, **kwargs):
"""Creates a KV Store Collection.

:param name: name of collection to create
:type name: ``string``
:param indexes: dictionary of index definitions
:type indexes: ``dict``
:param accelerated_fields: dictionary of accelerated_fields definitions
:type accelerated_fields: ``dict``
:param fields: dictionary of field definitions
:type fields: ``dict``
:param kwargs: a dictionary of additional parameters specifying indexes and field definitions
:type kwargs: ``dict``

:return: Result of POST request
"""
for k, v in six.iteritems(indexes):
for k, v in six.iteritems(accelerated_fields):
if isinstance(v, dict):
v = json.dumps(v)
kwargs['index.' + k] = v
kwargs['accelerated_fields.' + k] = v
for k, v in six.iteritems(fields):
kwargs['field.' + k] = v
return self.post(name=name, **kwargs)
Expand All @@ -3740,18 +3747,20 @@ def data(self):
"""
return KVStoreCollectionData(self)

def update_index(self, name, value):
"""Changes the definition of a KV Store index.
def update_accelerated_field(self, name, value):
"""Changes the definition of a KV Store accelerated_field.

:param name: name of index to change
:param name: name of accelerated_fields to change
:type name: ``string``
:param value: new index definition
:type value: ``dict`` or ``string``
:param value: new accelerated_fields definition
:type value: ``dict``

:return: Result of POST request
"""
kwargs = {}
kwargs['index.' + name] = value if isinstance(value, six.string_types) else json.dumps(value)
if isinstance(value, dict):
value = json.dumps(value)
kwargs['accelerated_fields.' + name] = value
return self.post(**kwargs)

def update_field(self, name, value):
Expand Down
31 changes: 18 additions & 13 deletions tests/test_kvstore_conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
# under the License.

from __future__ import absolute_import

import json
from tests import testlib
try:
import unittest
Expand Down Expand Up @@ -42,13 +44,27 @@ def test_create_delete_collection(self):
self.confs['test'].delete()
self.assertTrue(not 'test' in self.confs)

def test_create_fields(self):
self.confs.create('test', accelerated_fields={'ind1':{'a':1}}, fields={'a':'number1'})
self.assertEqual(self.confs['test']['field.a'], 'number1')
self.assertEqual(self.confs['test']['accelerated_fields.ind1'], {"a": 1})
self.confs['test'].delete()

def test_update_collection(self):
self.confs.create('test')
self.confs['test'].post(**{'accelerated_fields.ind1': '{"a": 1}', 'field.a': 'number'})
val = {"a": 1}
self.confs['test'].post(**{'accelerated_fields.ind1': json.dumps(val), 'field.a': 'number'})
self.assertEqual(self.confs['test']['field.a'], 'number')
self.assertEqual(self.confs['test']['accelerated_fields.ind1'], '{"a": 1}')
self.assertEqual(self.confs['test']['accelerated_fields.ind1'], {"a": 1})
self.confs['test'].delete()

def test_update_accelerated_fields(self):
self.confs.create('test', accelerated_fields={'ind1':{'a':1}})
self.assertEqual(self.confs['test']['accelerated_fields.ind1'], {'a': 1})
# update accelerated_field value
self.confs['test'].update_accelerated_field('ind1', {'a': -1})
self.assertEqual(self.confs['test']['accelerated_fields.ind1'], {'a': -1})
self.confs['test'].delete()

def test_update_fields(self):
self.confs.create('test')
Expand Down Expand Up @@ -77,17 +93,6 @@ def test_overlapping_collections(self):
self.confs['test'].delete()
self.confs['test'].delete()

"""
def test_create_accelerated_fields_fields(self):
self.confs.create('test', indexes={'foo': '{"foo": 1}', 'bar': {'bar': -1}}, **{'field.foo': 'string'})
self.assertEqual(self.confs['test']['accelerated_fields.foo'], '{"foo": 1}')
self.assertEqual(self.confs['test']['field.foo'], 'string')
self.assertRaises(client.HTTPError, lambda: self.confs['test'].post(**{'accelerated_fields.foo': 'THIS IS INVALID'}))
self.assertEqual(self.confs['test']['accelerated_fields.foo'], '{"foo": 1}')
self.confs['test'].update_accelerated_fields('foo', '')
self.assertEqual(self.confs['test']['accelerated_fields.foo'], None)
"""

def tearDown(self):
if ('test' in self.confs):
self.confs['test'].delete()
Expand Down