Skip to content

Commit 50b7251

Browse files
committed
Fix issue #18, creating confs is slightly different in the REST API, so had to special case that in the Confs collection.
1 parent 8c16a69 commit 50b7251

File tree

2 files changed

+105
-20
lines changed

2 files changed

+105
-20
lines changed

splunklib/client.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,12 @@ def __init__(self, service):
494494
item=lambda service, path, **kwargs:
495495
Conf(service, kwargs['state'].title))
496496

497+
def create(self, name, **kwargs):
498+
if not isinstance(name, basestring):
499+
raise ValueError("Invalid argument: 'name'")
500+
self.post(__conf=name, **kwargs)
501+
return self[name] # UNDONE: Extra round-trip to retrieve entity
502+
497503
class Stanza(Entity):
498504
"""This class contains a single configuration stanza."""
499505
def submit(self, stanza):

tests/test_conf.py

Lines changed: 99 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -41,26 +41,105 @@ def test_read(self):
4141
def test_crud(self):
4242
service = client.connect(**self.opts.kwargs)
4343

44-
self.assertTrue('props' in service.confs)
45-
props = service.confs['props']
46-
47-
if 'sdk-tests' in props: props.delete('sdk-tests')
48-
self.assertFalse('sdk-tests' in props)
49-
50-
stanza = props.create('sdk-tests')
51-
self.assertTrue(props.contains('sdk-tests'))
52-
self.assertEqual(stanza.name,'sdk-tests')
53-
self.assertTrue('maxDist' in stanza.content)
54-
value = int(stanza['maxDist'])
55-
stanza.update(maxDist=value+1)
56-
stanza.refresh()
57-
self.assertEqual(stanza['maxDist'], str(value + 1))
58-
stanza.update(maxDist=value)
59-
stanza.refresh()
60-
self.assertEqual(stanza['maxDist'], str(value))
61-
62-
props.delete('sdk-tests')
63-
self.assertFalse(props.contains('sdk-tests'))
44+
# There is no way to delete a conf file via the REST API, so we
45+
# create a test app to use as the context fo the conf test and then
46+
# we cleanup by deleting the app.
47+
48+
app_name = "sdk-test-app"
49+
50+
# Delete any lingering test app
51+
testlib.delete_app(service, app_name)
52+
self.assertFalse(app_name in service.apps)
53+
54+
# Create a fresh test app
55+
service.apps.create(app_name)
56+
self.assertTrue(app_name in service.apps)
57+
58+
# Connect using the test app context
59+
kwargs = self.opts.kwargs.copy()
60+
kwargs['app'] = app_name
61+
kwargs['owner'] = "nobody"
62+
kwargs['sharing'] = "app"
63+
service = client.connect(**kwargs)
64+
65+
conf_name = "sdk-test-conf"
66+
67+
confs = service.confs
68+
self.assertFalse(conf_name in confs)
69+
70+
conf = confs.create(conf_name)
71+
self.assertTrue(conf_name in confs)
72+
self.assertEqual(conf.name, conf_name)
73+
74+
stanzas = conf.list()
75+
self.assertEqual(len(stanzas), 0)
76+
77+
conf.create("stanza1")
78+
self.assertEqual(len(conf.list()), 1)
79+
self.assertTrue("stanza1" in conf)
80+
self.assertFalse("stanza2" in conf)
81+
self.assertFalse("stanza3" in conf)
82+
83+
conf.create("stanza2")
84+
self.assertEqual(len(conf.list()), 2)
85+
self.assertTrue("stanza1" in conf)
86+
self.assertTrue("stanza2" in conf)
87+
self.assertFalse("stanza3" in conf)
88+
89+
conf.create("stanza3")
90+
self.assertEqual(len(conf.list()), 3)
91+
self.assertTrue("stanza1" in conf)
92+
self.assertTrue("stanza2" in conf)
93+
self.assertTrue("stanza3" in conf)
94+
95+
stanza1 = conf['stanza1']
96+
self.assertFalse('key1' in stanza1.content)
97+
self.assertFalse('key2' in stanza1.content)
98+
self.assertFalse('key3' in stanza1.content)
99+
100+
stanza1.update(key1="value1")
101+
stanza1.refresh()
102+
self.assertTrue('key1' in stanza1.content)
103+
self.assertFalse('key2' in stanza1.content)
104+
self.assertFalse('key3' in stanza1.content)
105+
self.check_content(stanza1, key1="value1")
106+
107+
stanza1.update(key2="value2")
108+
stanza1.refresh()
109+
self.assertTrue('key1' in stanza1.content)
110+
self.assertTrue('key2' in stanza1.content)
111+
self.assertFalse('key3' in stanza1.content)
112+
self.check_content(stanza1, key1="value1", key2="value2")
113+
114+
stanza1.update(key3=42)
115+
stanza1.refresh()
116+
self.assertTrue('key1' in stanza1.content)
117+
self.assertTrue('key2' in stanza1.content)
118+
self.assertTrue('key3' in stanza1.content)
119+
self.check_content(stanza1, key1="value1", key2="value2", key3=42)
120+
121+
conf.delete("stanza3")
122+
self.assertEqual(len(conf.list()), 2)
123+
self.assertTrue("stanza1" in conf)
124+
self.assertTrue("stanza2" in conf)
125+
self.assertFalse("stanza3" in conf)
126+
127+
conf.delete("stanza2")
128+
self.assertEqual(len(conf.list()), 1)
129+
self.assertTrue("stanza1" in conf)
130+
self.assertFalse("stanza2" in conf)
131+
self.assertFalse("stanza3" in conf)
132+
133+
conf.delete("stanza1")
134+
self.assertEqual(len(conf.list()), 0)
135+
self.assertFalse("stanza1" in conf)
136+
self.assertFalse("stanza2" in conf)
137+
self.assertFalse("stanza3" in conf)
138+
139+
# Reconnect using original context so we can cleaup the test app
140+
service = client.connect(**self.opts.kwargs)
141+
testlib.delete_app(service, app_name)
142+
self.assertFalse(app_name in service.apps)
64143

65144
if __name__ == "__main__":
66145
testlib.main()

0 commit comments

Comments
 (0)