Skip to content

Commit 1706175

Browse files
committed
Support parsing the '_raw' field in results.ResultsReader.
1 parent f9d0a41 commit 1706175

File tree

2 files changed

+141
-2
lines changed

2 files changed

+141
-2
lines changed

splunklib/results.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
]
5252

5353
class Message(object):
54-
"""Messages returned splunkd's XML.
54+
"""Messages returned in splunkd's XML.
5555
5656
**Example**::
5757
@@ -60,8 +60,15 @@ class Message(object):
6060
def __init__(self, type_, message):
6161
self.type = type_
6262
self.message = message
63+
6364
def __repr__(self):
6465
return "%s: %s" % (self.type, self.message)
66+
67+
def __eq__(self, other):
68+
return (self.type, self.message) == (other.type, other.message)
69+
70+
def __hash__(self):
71+
return hash((self.type, self.message))
6572

6673
class ConcatenatedStream(object):
6774
"""Lazily concatenate zero or more streams into a stream.
@@ -238,7 +245,7 @@ def parse_results(self, stream):
238245
# streaming.
239246
elem.clear()
240247

241-
elif elem.tag == 'text' and event == 'end':
248+
elif elem.tag in ('text', 'v') and event == 'end':
242249
values.append(elem.text.encode('utf8'))
243250
elem.clear()
244251

tests/test_results.py

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
#!/usr/bin/env python
2+
#
3+
# Copyright 2011-2012 Splunk, Inc.
4+
#
5+
# Licensed under the Apache License, Version 2.0 (the "License"): you may
6+
# not use this file except in compliance with the License. You may obtain
7+
# a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14+
# License for the specific language governing permissions and limitations
15+
# under the License.
16+
17+
from StringIO import StringIO
18+
19+
import testlib
20+
21+
import splunklib.results as results
22+
23+
class TestCase(testlib.TestCase):
24+
def test_read_normal_results(self):
25+
xml_text = """
26+
<?xml version='1.0' encoding='UTF-8'?>
27+
<results preview='0'>
28+
<meta>
29+
<fieldOrder>
30+
<field>series</field>
31+
<field>sum(kb)</field>
32+
</fieldOrder>
33+
</meta>
34+
<messages>
35+
<msg type='DEBUG'>base lispy: [ AND ]</msg>
36+
<msg type='DEBUG'>search context: user='admin', app='search', bs-pathname='/some/path'</msg>
37+
</messages>
38+
<result offset='0'>
39+
<field k='series'>
40+
<value><text>twitter</text></value>
41+
</field>
42+
<field k='sum(kb)'>
43+
<value><text>14372242.758775</text></value>
44+
</field>
45+
</result>
46+
<result offset='1'>
47+
<field k='series'>
48+
<value><text>splunkd</text></value>
49+
</field>
50+
<field k='sum(kb)'>
51+
<value><text>267802.333926</text></value>
52+
</field>
53+
</result>
54+
<result offset='2'>
55+
<field k='series'>
56+
<value><text>flurry</text></value>
57+
</field>
58+
<field k='sum(kb)'>
59+
<value><text>12576.454102</text></value>
60+
</field>
61+
</result>
62+
<result offset='3'>
63+
<field k='series'>
64+
<value><text>splunkd_access</text></value>
65+
</field>
66+
<field k='sum(kb)'>
67+
<value><text>5979.036338</text></value>
68+
</field>
69+
</result>
70+
<result offset='4'>
71+
<field k='series'>
72+
<value><text>splunk_web_access</text></value>
73+
</field>
74+
<field k='sum(kb)'>
75+
<value><text>5838.935649</text></value>
76+
</field>
77+
</result>
78+
</results>
79+
""".strip()
80+
expected_results = [
81+
results.Message('DEBUG', 'base lispy: [ AND ]'),
82+
results.Message('DEBUG', "search context: user='admin', app='search', bs-pathname='/some/path'"),
83+
{
84+
'series': 'twitter',
85+
'sum(kb)': '14372242.758775',
86+
},
87+
{
88+
'series': 'splunkd',
89+
'sum(kb)': '267802.333926',
90+
},
91+
{
92+
'series': 'flurry',
93+
'sum(kb)': '12576.454102',
94+
},
95+
{
96+
'series': 'splunkd_access',
97+
'sum(kb)': '5979.036338',
98+
},
99+
{
100+
'series': 'splunk_web_access',
101+
'sum(kb)': '5838.935649',
102+
},
103+
]
104+
105+
self.assert_parsed_results_equals(xml_text, expected_results)
106+
107+
def test_read_raw_field(self):
108+
xml_text = """
109+
<?xml version='1.0' encoding='UTF-8'?>
110+
<results preview='0'>
111+
<meta>
112+
<fieldOrder>
113+
<field>_raw</field>
114+
</fieldOrder>
115+
</meta>
116+
<result offset='0'>
117+
<field k='_raw'><v xml:space='preserve' trunc='0'>07-13-2012 09:27:27.307 -0700 INFO Metrics - group=search_concurrency, system total, active_hist_searches=0, active_realtime_searches=0</v></field>
118+
</result>
119+
</results>
120+
""".strip()
121+
expected_results = [
122+
{
123+
'_raw': '07-13-2012 09:27:27.307 -0700 INFO Metrics - group=search_concurrency, system total, active_hist_searches=0, active_realtime_searches=0',
124+
},
125+
]
126+
127+
self.assert_parsed_results_equals(xml_text, expected_results)
128+
129+
def assert_parsed_results_equals(self, xml_text, expected_results):
130+
results_reader = results.ResultsReader(StringIO(xml_text))
131+
actual_results = [x for x in results_reader]
132+
self.assertEquals(expected_results, actual_results)

0 commit comments

Comments
 (0)