splunker 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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