splunker 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.0.3
@@ -19,14 +19,14 @@ module Splunker::Models
19
19
  end
20
20
  end
21
21
 
22
- def find_all(options)
22
+ def find_all(options={})
23
23
  raise NotImplemented, "Not yet implemented!"
24
24
  self.client.get @service_path, options
25
25
  end
26
26
 
27
27
  def find_by_id(object_id, options={})
28
28
  object_path = "#{@service_path}/#{escape_object_id(object_id)}"
29
- self.new(self.client.get(object_path))
29
+ self.new(self.client.get(object_path, options))
30
30
  end
31
31
  end
32
32
 
@@ -3,6 +3,7 @@ module Splunker
3
3
  require 'cgi'
4
4
  require 'splunker/models/finders'
5
5
  require 'splunker/models/xml_processor'
6
+ require 'splunker/models/subresource'
6
7
 
7
8
  class Resource
8
9
 
@@ -14,6 +15,10 @@ module Splunker
14
15
  @service_path = path
15
16
  end
16
17
 
18
+ def self.my_service_path
19
+ @service_path
20
+ end
21
+
17
22
  def self.client
18
23
  Splunker.client
19
24
  end
@@ -0,0 +1,7 @@
1
+ module Splunker::Models
2
+ module Search
3
+ class History < Splunker::Models::Resource
4
+ include Subresource
5
+ end
6
+ end
7
+ end
@@ -2,7 +2,20 @@ module Splunker::Models
2
2
  module Search
3
3
  class Job < Splunker::Models::Resource
4
4
  # http://docs.splunk.com/Documentation/Splunk/latest/RESTAPI/RESTsearch#search.2Fjobs.2F.7Bsearch_id.7D
5
- service_path "jobs"
5
+ service_path "search/jobs"
6
+
7
+ def results
8
+ Results.find_as_subresource(Job.my_service_path, self.sid, "results")
9
+ end
10
+ =begin BIG FAT TODO
11
+ search/jobs/{search_id}/export
12
+ search/jobs/{search_id}/control
13
+ search/jobs/{search_id}/events
14
+ search/jobs/{search_id}/results_preview
15
+ search/jobs/{search_id}/search.log
16
+ search/jobs/{search_id}/summary
17
+ search/jobs/{search_id}/timeline
18
+ =end
6
19
  end
7
20
  end
8
21
  end
@@ -0,0 +1,7 @@
1
+ module Splunker::Models
2
+ module Search
3
+ class Results < Splunker::Models::Resource
4
+ include Subresource
5
+ end
6
+ end
7
+ end
@@ -4,10 +4,13 @@ module Splunker::Models
4
4
  # http://docs.splunk.com/Documentation/Splunk/4.3.4/RESTAPI/RESTsearch#saved.2Fsearches.2F.7Bname.7D
5
5
  service_path "saved/searches"
6
6
 
7
+ def history
8
+ History.find_as_subresource(Saved.my_service_path, self.title, "history")
9
+ end
10
+
7
11
  =begin Can these actions be standardized?
8
12
  def acknowledge; end
9
13
  def dispatch; end
10
- def history; end
11
14
  def scheduled_times; end
12
15
  def suppress; end
13
16
  =end
@@ -0,0 +1,26 @@
1
+ module Splunker::Models
2
+ module Subresource
3
+ module ClassMethods
4
+ def find_as_subresource(service_path, object_id, subresource, options={})
5
+ object_path = "#{service_path}/#{escape_object_id(object_id)}/#{subresource}"
6
+ self.new(self.client.get(object_path, options))
7
+ end
8
+
9
+ def where(options={})
10
+ raise NoMethodError, "Finders not available for subresources."
11
+ end
12
+
13
+ def find_all(options={})
14
+ raise NoMethodError, "Finders not available for subresources."
15
+ end
16
+
17
+ def find_by_id(object_id, options={})
18
+ raise NoMethodError, "Finders not available for subresources."
19
+ end
20
+ end
21
+
22
+ def self.included(base)
23
+ base.send(:extend, ClassMethods)
24
+ end
25
+ end
26
+ end
@@ -25,6 +25,25 @@ module Splunker
25
25
  hash
26
26
  end
27
27
 
28
+ def process_results(hash, node)
29
+ # TODO: Process meta. Ugh.
30
+ hash["meta"] = Array(node.xpath("./meta").children)
31
+
32
+ # Process results, yay.
33
+ hash["results"] = []
34
+
35
+ node.xpath("./result").each do |r|
36
+ result = {}
37
+ r.xpath("./field").each do |f|
38
+ next unless f.attributes.include?("k")
39
+ result[f.attribute("k").value] = f.text.strip
40
+ end
41
+ hash["results"] << result
42
+ end
43
+
44
+ hash
45
+ end
46
+
28
47
  def process_text(hash, node)
29
48
  hash
30
49
  end
@@ -0,0 +1,94 @@
1
+ <?xml-stylesheet type="text/xml" href="/static/atom.xsl"?>
2
+ <feed xmlns="http://www.w3.org/2005/Atom" xmlns:s="http://dev.splunk.com/ns/rest" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/">
3
+ <title>50msclub</title>
4
+ <id>https://localhost:8089/servicesNS/wade/search/saved/searches</id>
5
+ <updated>2012-10-10T14:19:50-05:00</updated>
6
+ <generator version="128297"/>
7
+ <author>
8
+ <name>Splunk</name>
9
+ </author>
10
+ <link href="/servicesNS/wade/search/saved/searches/_new" rel="create"/>
11
+ <link href="/servicesNS/wade/search/saved/searches/_reload" rel="_reload"/>
12
+ <opensearch:totalResults>3</opensearch:totalResults>
13
+ <opensearch:itemsPerPage>30</opensearch:itemsPerPage>
14
+ <opensearch:startIndex>0</opensearch:startIndex>
15
+ <s:messages/>
16
+ <entry>
17
+ <title>scheduler__wade__search__50msclub_at_1349896500_9be96fb18ff7bb9a</title>
18
+ <id>https://localhost:8089/servicesNS/nobody/search/search/jobs/scheduler__wade__search__50msclub_at_1349896500_9be96fb18ff7bb9a</id>
19
+ <updated>2012-10-10T14:15:40-05:00</updated>
20
+ <link href="/servicesNS/nobody/search/search/jobs/scheduler__wade__search__50msclub_at_1349896500_9be96fb18ff7bb9a" rel="alternate"/>
21
+ <author>
22
+ <name>wade</name>
23
+ </author>
24
+ <published>2012-10-10T14:15:00-05:00</published>
25
+ <link href="/servicesNS/nobody/search/search/jobs/scheduler__wade__search__50msclub_at_1349896500_9be96fb18ff7bb9a" rel="list"/>
26
+ <link href="/servicesNS/nobody/search/search/jobs/scheduler__wade__search__50msclub_at_1349896500_9be96fb18ff7bb9a/_reload" rel="_reload"/>
27
+ <link href="/servicesNS/nobody/search/search/jobs/scheduler__wade__search__50msclub_at_1349896500_9be96fb18ff7bb9a" rel="edit"/>
28
+ <link href="/servicesNS/nobody/search/search/jobs/scheduler__wade__search__50msclub_at_1349896500_9be96fb18ff7bb9a" rel="remove"/>
29
+ <content type="text/xml">
30
+ <s:dict>
31
+ <s:key name="eai:acl"><s:dict><s:key name="app">search</s:key><s:key name="can_change_perms">1</s:key><s:key name="can_list">1</s:key><s:key name="can_share_app">1</s:key><s:key name="can_share_global">0</s:key><s:key name="can_share_user">1</s:key><s:key name="can_write">1</s:key><s:key name="modifiable">1</s:key><s:key name="owner">wade</s:key><s:key name="perms"><s:dict><s:key name="read"><s:list><s:item>wade</s:item></s:list></s:key><s:key name="write"><s:list><s:item>wade</s:item></s:list></s:key></s:dict></s:key><s:key name="removable">0</s:key><s:key name="sharing">system</s:key></s:dict></s:key>
32
+ <s:key name="isDone">1</s:key>
33
+ <s:key name="isFinalized">0</s:key>
34
+ <s:key name="isRealTimeSearch">0</s:key>
35
+ <s:key name="isSaved">0</s:key>
36
+ <s:key name="isScheduled">1</s:key>
37
+ <s:key name="isZombie">0</s:key>
38
+ <s:key name="ttl">321</s:key>
39
+ </s:dict>
40
+ </content>
41
+ </entry>
42
+ <entry>
43
+ <title>scheduler__wade__search__50msclub_at_1349896200_1e5173a9ac1371bc</title>
44
+ <id>https://localhost:8089/servicesNS/nobody/search/search/jobs/scheduler__wade__search__50msclub_at_1349896200_1e5173a9ac1371bc</id>
45
+ <updated>2012-10-10T14:10:37-05:00</updated>
46
+ <link href="/servicesNS/nobody/search/search/jobs/scheduler__wade__search__50msclub_at_1349896200_1e5173a9ac1371bc" rel="alternate"/>
47
+ <author>
48
+ <name>wade</name>
49
+ </author>
50
+ <published>2012-10-10T14:10:13-05:00</published>
51
+ <link href="/servicesNS/nobody/search/search/jobs/scheduler__wade__search__50msclub_at_1349896200_1e5173a9ac1371bc" rel="list"/>
52
+ <link href="/servicesNS/nobody/search/search/jobs/scheduler__wade__search__50msclub_at_1349896200_1e5173a9ac1371bc/_reload" rel="_reload"/>
53
+ <link href="/servicesNS/nobody/search/search/jobs/scheduler__wade__search__50msclub_at_1349896200_1e5173a9ac1371bc" rel="edit"/>
54
+ <link href="/servicesNS/nobody/search/search/jobs/scheduler__wade__search__50msclub_at_1349896200_1e5173a9ac1371bc" rel="remove"/>
55
+ <content type="text/xml">
56
+ <s:dict>
57
+ <s:key name="eai:acl"><s:dict><s:key name="app">search</s:key><s:key name="can_change_perms">1</s:key><s:key name="can_list">1</s:key><s:key name="can_share_app">1</s:key><s:key name="can_share_global">0</s:key><s:key name="can_share_user">1</s:key><s:key name="can_write">1</s:key><s:key name="modifiable">1</s:key><s:key name="owner">wade</s:key><s:key name="perms"><s:dict><s:key name="read"><s:list><s:item>wade</s:item></s:list></s:key><s:key name="write"><s:list><s:item>wade</s:item></s:list></s:key></s:dict></s:key><s:key name="removable">0</s:key><s:key name="sharing">system</s:key></s:dict></s:key>
58
+ <s:key name="isDone">1</s:key>
59
+ <s:key name="isFinalized">0</s:key>
60
+ <s:key name="isRealTimeSearch">0</s:key>
61
+ <s:key name="isSaved">0</s:key>
62
+ <s:key name="isScheduled">1</s:key>
63
+ <s:key name="isZombie">0</s:key>
64
+ <s:key name="ttl">34</s:key>
65
+ </s:dict>
66
+ </content>
67
+ </entry>
68
+ <entry>
69
+ <title>scheduler__wade__search__50msclub_at_1349890200_9c17278833a16531</title>
70
+ <id>https://localhost:8089/servicesNS/nobody/search/search/jobs/scheduler__wade__search__50msclub_at_1349890200_9c17278833a16531</id>
71
+ <updated>2012-10-10T12:30:51-05:00</updated>
72
+ <link href="/servicesNS/nobody/search/search/jobs/scheduler__wade__search__50msclub_at_1349890200_9c17278833a16531" rel="alternate"/>
73
+ <author>
74
+ <name>wade</name>
75
+ </author>
76
+ <published>2012-10-10T12:30:32-05:00</published>
77
+ <link href="/servicesNS/nobody/search/search/jobs/scheduler__wade__search__50msclub_at_1349890200_9c17278833a16531" rel="list"/>
78
+ <link href="/servicesNS/nobody/search/search/jobs/scheduler__wade__search__50msclub_at_1349890200_9c17278833a16531/_reload" rel="_reload"/>
79
+ <link href="/servicesNS/nobody/search/search/jobs/scheduler__wade__search__50msclub_at_1349890200_9c17278833a16531" rel="edit"/>
80
+ <link href="/servicesNS/nobody/search/search/jobs/scheduler__wade__search__50msclub_at_1349890200_9c17278833a16531" rel="remove"/>
81
+ <content type="text/xml">
82
+ <s:dict>
83
+ <s:key name="eai:acl"><s:dict><s:key name="app">search</s:key><s:key name="can_change_perms">1</s:key><s:key name="can_list">1</s:key><s:key name="can_share_app">1</s:key><s:key name="can_share_global">0</s:key><s:key name="can_share_user">1</s:key><s:key name="can_write">1</s:key><s:key name="modifiable">1</s:key><s:key name="owner">wade</s:key><s:key name="perms"><s:dict><s:key name="read"><s:list><s:item>wade</s:item></s:list></s:key><s:key name="write"><s:list><s:item>wade</s:item></s:list></s:key></s:dict></s:key><s:key name="removable">0</s:key><s:key name="sharing">system</s:key></s:dict></s:key>
84
+ <s:key name="isDone">1</s:key>
85
+ <s:key name="isFinalized">0</s:key>
86
+ <s:key name="isRealTimeSearch">0</s:key>
87
+ <s:key name="isSaved">0</s:key>
88
+ <s:key name="isScheduled">1</s:key>
89
+ <s:key name="isZombie">0</s:key>
90
+ <s:key name="ttl">79853</s:key>
91
+ </s:dict>
92
+ </content>
93
+ </entry>
94
+ </feed>
@@ -11,17 +11,17 @@ describe Splunker::Models::Finders do
11
11
 
12
12
  before(:each) do
13
13
  object_path = "saved/searches/MyFinderTestSavedSearch"
14
- resource.client.stub(:get).with(object_path).and_return(search_fixture)
14
+ resource.client.stub(:get).with(object_path,{}).and_return(search_fixture)
15
15
  end
16
16
 
17
17
  it "should find_by_id" do
18
- a = resource.find_by_id("MyFinderTestSavedSearch")
18
+ a = resource.find_by_id("MyFinderTestSavedSearch", {})
19
19
  a.should be_a(Splunker::Models::Search::Saved)
20
20
  a.title.should eq("MySavedSearch")
21
21
  end
22
22
 
23
23
  it "should find by id by default" do
24
- a = resource.find("MyFinderTestSavedSearch")
24
+ a = resource.find("MyFinderTestSavedSearch", {})
25
25
  a.should be_a(Splunker::Models::Search::Saved)
26
26
  a.title.should eq("MySavedSearch")
27
27
  end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Splunker::Models::Search::History do
4
+
5
+ let(:resource_fixture) do
6
+ Nokogiri::XML(fixture("saved_history.xml"))
7
+ end
8
+
9
+ context "initialization" do
10
+ let(:history) do
11
+ Splunker::Models::Search::History.new(resource_fixture)
12
+ end
13
+
14
+ it "should load history" do
15
+ history.title.should eq("scheduler__wade__search__50msclub_at_1349890200_9c17278833a16531")
16
+ history.published.should eq("2012-10-10T12:30:32-05:00")
17
+ end
18
+ end
19
+ end
@@ -9,17 +9,54 @@ describe Splunker::Models::Search::Job do
9
9
  Nokogiri::XML(fixture("job_mysearch.xml"))
10
10
  end
11
11
 
12
+ let(:job) do
13
+ resource.new(job_fixture)
14
+ end
15
+
12
16
  # Covered in finders_spec, but I'm feeling redundant this morning.
13
17
  context "searching" do
14
18
  before(:each) do
15
- object_path = "jobs/MyFinderTestJob"
16
- resource.client.stub(:get).with(object_path).and_return(job_fixture)
19
+ object_path = "search/jobs/MyFinderTestJob"
20
+ resource.client.stub(:get).with(object_path, {}).and_return(job_fixture)
17
21
  end
18
22
 
19
23
  it "should find by id by default" do
20
- a = resource.find("MyFinderTestJob")
24
+ a = resource.find("MyFinderTestJob", {})
21
25
  a.should be_a(Splunker::Models::Search::Job)
22
26
  a.title.should eq("search index")
23
27
  end
24
28
  end
29
+
30
+ context "loads sid" do
31
+ let(:job) do
32
+ resource.new(job_fixture)
33
+ end
34
+
35
+ it "should have an sid" do
36
+ job.sid.should eq("mysearch")
37
+ end
38
+ end
39
+
40
+ context "subresources" do
41
+ let(:results_resource) do
42
+ Splunker::Models::Search::Results
43
+ end
44
+
45
+ let(:results_job_fixture) do
46
+ Nokogiri::XML(fixture("search_results_from_job.xml"))
47
+ end
48
+
49
+
50
+ before(:each) do
51
+ object_path = "search/jobs/mysearch/results"
52
+ resource.client.stub(:get).with(object_path, {}).and_return(results_job_fixture)
53
+ end
54
+
55
+ it "should load results" do
56
+ r = job.results
57
+ r.should be_a(Splunker::Models::Search::Results)
58
+ r.meta.should_not be_nil
59
+ r.results.first["median(time_total)"].should eq("280")
60
+ end
61
+ end
25
62
  end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe Splunker::Models::Search::Job do
4
+ let(:resource) do
5
+ Splunker::Models::Search::Results
6
+ end
7
+
8
+ let(:job_fixture) do
9
+ Nokogiri::XML(fixture("search_results_from_job.xml"))
10
+ end
11
+
12
+ context "initialization" do
13
+ let(:results) do
14
+ resource.new(job_fixture)
15
+ end
16
+
17
+ it "should load top level attributes" do
18
+ results.meta.should_not be_nil
19
+ results.results.first["median(time_total)"].should eq("280")
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe Splunker::Models::Finders do
4
+ let(:resource) do
5
+ Splunker::Models::Search::Results
6
+ end
7
+
8
+ let(:search_fixture) do
9
+ Nokogiri::XML(fixture("search_results_from_job.xml"))
10
+ end
11
+
12
+ before(:each) do
13
+ object_path = "search/jobs/myjob/results"
14
+ resource.client.stub(:get).with(object_path, {}).and_return(search_fixture)
15
+ end
16
+
17
+ context "retrieval" do
18
+ it "should retrieve the subresource data" do
19
+ r = resource.find_as_subresource("search/jobs", "myjob", "results", {})
20
+ r.should be_a(Splunker::Models::Search::Results)
21
+ end
22
+ end
23
+
24
+ context "finders" do
25
+ it "should not allow the where method" do
26
+ expect {
27
+ resource.where(:me => "you")
28
+ }.to raise_error(NoMethodError)
29
+ end
30
+ it "should not allow the find method" do
31
+ expect {
32
+ resource.find(:all)
33
+ }.to raise_error(NoMethodError)
34
+ end
35
+ it "should not allow the find_all method" do
36
+ expect {
37
+ resource.find_all
38
+ }.to raise_error(NoMethodError)
39
+ end
40
+ it "should not allow the find_by_id method" do
41
+ expect {
42
+ resource.find_by_id "my_resource"
43
+ }.to raise_error(NoMethodError)
44
+ end
45
+ end
46
+ end
47
+
@@ -7,7 +7,11 @@ describe Splunker::Models::XmlProcessor do
7
7
  end
8
8
 
9
9
  let(:xml) do
10
- Nokogiri::Slop(fixture("saved_search.xml"))
10
+ Nokogiri::XML(fixture("saved_search.xml"))
11
+ end
12
+
13
+ let(:results_xml) do
14
+ Nokogiri::XML(fixture("search_results_from_job.xml"))
11
15
  end
12
16
 
13
17
  context "hashify xml" do
@@ -44,6 +48,20 @@ describe Splunker::Models::XmlProcessor do
44
48
  end
45
49
  end
46
50
 
51
+ context "process results xml" do
52
+ let(:results) do
53
+ processor.hashify(results_xml)
54
+ end
55
+
56
+ it "should load meta as a top level attribute" do
57
+ results["meta"].should_not be_nil
58
+ end
59
+
60
+ it "should load results, with key-value pairs" do
61
+ results["results"].first["avg(time_total)"].should eq("626.604469")
62
+ end
63
+ end
64
+
47
65
  context "dictionary builders" do
48
66
  it "should build a nested hash from a string in dot notation" do
49
67
  h = {
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: splunker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-24 00:00:00.000000000 Z
12
+ date: 2012-10-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -135,13 +135,17 @@ files:
135
135
  - lib/splunker/models.rb
136
136
  - lib/splunker/models/finders.rb
137
137
  - lib/splunker/models/resource.rb
138
+ - lib/splunker/models/search/history.rb
138
139
  - lib/splunker/models/search/job.rb
140
+ - lib/splunker/models/search/results.rb
139
141
  - lib/splunker/models/search/saved.rb
142
+ - lib/splunker/models/subresource.rb
140
143
  - lib/splunker/models/xml_processor.rb
141
144
  - lib/splunker/request.rb
142
145
  - lib/splunker/version.rb
143
146
  - script/console
144
147
  - spec/fixtures/job_mysearch.xml
148
+ - spec/fixtures/saved_history.xml
145
149
  - spec/fixtures/saved_search.xml
146
150
  - spec/fixtures/search_results_from_job.xml
147
151
  - spec/functional/request_spec.rb
@@ -154,8 +158,11 @@ files:
154
158
  - spec/unit/errors_spec.rb
155
159
  - spec/unit/models/finders_spec.rb
156
160
  - spec/unit/models/resource_spec.rb
161
+ - spec/unit/models/search/history_spec.rb
157
162
  - spec/unit/models/search/job_spec.rb
163
+ - spec/unit/models/search/results_spec.rb
158
164
  - spec/unit/models/search/saved_spec.rb
165
+ - spec/unit/models/subresource_spec.rb
159
166
  - spec/unit/models/xml_processor_spec.rb
160
167
  - spec/unit/request_spec.rb
161
168
  - spec/unit/splunker_spec.rb
@@ -186,6 +193,7 @@ specification_version: 3
186
193
  summary: A Ruby client for the Splunk API
187
194
  test_files:
188
195
  - spec/fixtures/job_mysearch.xml
196
+ - spec/fixtures/saved_history.xml
189
197
  - spec/fixtures/saved_search.xml
190
198
  - spec/fixtures/search_results_from_job.xml
191
199
  - spec/functional/request_spec.rb
@@ -198,8 +206,11 @@ test_files:
198
206
  - spec/unit/errors_spec.rb
199
207
  - spec/unit/models/finders_spec.rb
200
208
  - spec/unit/models/resource_spec.rb
209
+ - spec/unit/models/search/history_spec.rb
201
210
  - spec/unit/models/search/job_spec.rb
211
+ - spec/unit/models/search/results_spec.rb
202
212
  - spec/unit/models/search/saved_spec.rb
213
+ - spec/unit/models/subresource_spec.rb
203
214
  - spec/unit/models/xml_processor_spec.rb
204
215
  - spec/unit/request_spec.rb
205
216
  - spec/unit/splunker_spec.rb