chef-solr 0.8.6 → 0.8.8

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/Rakefile CHANGED
@@ -30,7 +30,7 @@ require 'spec/rake/spectask'
30
30
  Spec::Rake::SpecTask.new(:spec) do |spec|
31
31
  spec.libs << 'lib' << 'spec'
32
32
  spec.spec_files = FileList['spec/**/*_spec.rb']
33
- spec.spec_opts = %w{-fs --color}
33
+ spec.spec_opts = ['--options', File.expand_path(File.dirname(__FILE__) + '/spec/spec.opts')]
34
34
  end
35
35
 
36
36
  Spec::Rake::SpecTask.new(:rcov) do |spec|
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.6
1
+ 0.8.8
data/lib/chef/solr.rb CHANGED
@@ -6,9 +6,9 @@
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
8
8
  # You may obtain a copy of the License at
9
- #
9
+ #
10
10
  # http://www.apache.org/licenses/LICENSE-2.0
11
- #
11
+ #
12
12
  # Unless required by applicable law or agreed to in writing, software
13
13
  # distributed under the License is distributed on an "AS IS" BASIS,
14
14
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -34,6 +34,9 @@ require 'uri'
34
34
 
35
35
  class Chef
36
36
  class Solr
37
+
38
+ VERSION = "0.8.8"
39
+
37
40
  include Chef::Mixin::XMLEscape
38
41
 
39
42
  attr_accessor :solr_url, :http
@@ -73,7 +76,7 @@ class Chef
73
76
 
74
77
  def solr_add(data)
75
78
  data = [data] unless data.kind_of?(Array)
76
-
79
+
77
80
  Chef::Log.debug("adding to SOLR: #{data.inspect}")
78
81
  xml_document = LibXML::XML::Document.new
79
82
  xml_add = LibXML::XML::Node.new("add")
@@ -97,19 +100,19 @@ class Chef
97
100
  def solr_commit(opts={})
98
101
  post_to_solr(generate_single_element("commit", opts))
99
102
  end
100
-
103
+
101
104
  def solr_optimize(opts={})
102
105
  post_to_solr(generate_single_element("optimize", opts))
103
106
  end
104
-
107
+
105
108
  def solr_rollback
106
109
  post_to_solr(generate_single_element("rollback"))
107
110
  end
108
-
111
+
109
112
  def solr_delete_by_id(ids)
110
113
  post_to_solr(generate_delete_document("id", ids))
111
114
  end
112
-
115
+
113
116
  def solr_delete_by_query(queries)
114
117
  post_to_solr(generate_delete_document("query", queries))
115
118
  end
@@ -117,20 +120,20 @@ class Chef
117
120
  def rebuild_index(url=Chef::Config[:couchdb_url], db=Chef::Config[:couchdb_database])
118
121
  solr_delete_by_query("X_CHEF_database_CHEF_X:#{db}")
119
122
  solr_commit
120
-
123
+
121
124
  results = {}
122
- [Chef::ApiClient, Chef::Node, Chef::OpenIDRegistration, Chef::Role, Chef::WebUIUser].each do |klass|
125
+ [Chef::ApiClient, Chef::Node, Chef::Role].each do |klass|
123
126
  results[klass.name] = reindex_all(klass) ? "success" : "failed"
124
127
  end
125
128
  databags = Chef::DataBag.cdb_list(true)
126
129
  Chef::Log.info("Reloading #{databags.size.to_s} #{Chef::DataBag} objects into the indexer")
127
- databags.each { |i| i.add_to_index; i.list(true).each { |x| x.add_to_index } }
128
- results[Chef::DataBag.name] = "success"
130
+ databags.each { |i| i.add_to_index; i.list(true).each { |x| x.add_to_index } }
131
+ results[Chef::DataBag.name] = "success"
129
132
  results
130
133
  end
131
134
 
132
135
  private
133
-
136
+
134
137
  def reindex_all(klass, metadata={})
135
138
  begin
136
139
  items = klass.cdb_list(true)
@@ -204,7 +207,7 @@ class Chef
204
207
  def escape(s)
205
208
  s.to_s.gsub(/([^ a-zA-Z0-9_.-]+)/n) {
206
209
  '%'+$1.unpack('H2'*$1.size).join('%').upcase
207
- }.tr(' ', '+')
210
+ }.tr(' ', '+')
208
211
  end
209
212
 
210
213
  end
@@ -6,9 +6,9 @@
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
8
8
  # You may obtain a copy of the License at
9
- #
9
+ #
10
10
  # http://www.apache.org/licenses/LICENSE-2.0
11
- #
11
+ #
12
12
  # Unless required by applicable law or agreed to in writing, software
13
13
  # distributed under the License is distributed on an "AS IS" BASIS,
14
14
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -29,14 +29,14 @@ class Chef
29
29
  class Solr
30
30
  class Application
31
31
  class Indexer < Chef::Application
32
-
33
- option :config_file,
32
+
33
+ option :config_file,
34
34
  :short => "-c CONFIG",
35
35
  :long => "--config CONFIG",
36
36
  :default => "/etc/chef/solr.rb",
37
37
  :description => "The configuration file to use"
38
38
 
39
- option :log_level,
39
+ option :log_level,
40
40
  :short => "-l LEVEL",
41
41
  :long => "--log_level LEVEL",
42
42
  :description => "Set the log level (debug, info, warn, error, fatal)",
@@ -48,6 +48,13 @@ class Chef
48
48
  :description => "Set the log file location, defaults to STDOUT - recommended for daemonizing",
49
49
  :proc => nil
50
50
 
51
+ option :pid_file,
52
+ :short => "-P PID_FILE",
53
+ :long => "--pid PIDFILE",
54
+ :description => "Set the PID file location, defaults to /tmp/chef-solr-indexer.pid",
55
+ :proc => nil
56
+
57
+
51
58
  option :help,
52
59
  :short => "-h",
53
60
  :long => "--help",
@@ -94,7 +101,15 @@ class Chef
94
101
  option :amqp_vhost,
95
102
  :long => "--amqp-vhost VHOST",
96
103
  :description => "The amqp vhost"
97
-
104
+
105
+ option :version,
106
+ :short => "-v",
107
+ :long => "--version",
108
+ :description => "Show chef-solr-indexer version",
109
+ :boolean => true,
110
+ :proc => lambda {|v| puts "chef-solr-indexer: #{::Chef::Solr::VERSION}"},
111
+ :exit => 0
112
+
98
113
  Signal.trap("INT") do
99
114
  begin
100
115
  AmqpClient.instance.stop
@@ -102,15 +117,15 @@ class Chef
102
117
  end
103
118
  fatal!("SIGINT received, stopping", 2)
104
119
  end
105
-
106
- Kernel.trap("TERM") do
120
+
121
+ Kernel.trap("TERM") do
107
122
  begin
108
123
  AmqpClient.instance.stop
109
124
  rescue Bunny::ProtocolError, Bunny::ConnectionError, Bunny::UnsubscribeError
110
125
  end
111
126
  fatal!("SIGTERM received, stopping", 1)
112
127
  end
113
-
128
+
114
129
  def initialize
115
130
  super
116
131
 
@@ -6,9 +6,9 @@
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
8
8
  # You may obtain a copy of the License at
9
- #
9
+ #
10
10
  # http://www.apache.org/licenses/LICENSE-2.0
11
- #
11
+ #
12
12
  # Unless required by applicable law or agreed to in writing, software
13
13
  # distributed under the License is distributed on an "AS IS" BASIS,
14
14
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -26,14 +26,14 @@ class Chef
26
26
  class Solr
27
27
  class Application
28
28
  class Rebuild < Chef::Application
29
-
30
- option :config_file,
29
+
30
+ option :config_file,
31
31
  :short => "-c CONFIG",
32
32
  :long => "--config CONFIG",
33
33
  :default => "/etc/chef/solr.rb",
34
34
  :description => "The configuration file to use"
35
35
 
36
- option :log_level,
36
+ option :log_level,
37
37
  :short => "-l LEVEL",
38
38
  :long => "--log_level LEVEL",
39
39
  :description => "Set the log level (debug, info, warn, error, fatal)",
@@ -64,6 +64,14 @@ class Chef
64
64
  :long => "--couchdb-url URL",
65
65
  :description => "The CouchDB URL"
66
66
 
67
+ option :version,
68
+ :short => "-v",
69
+ :long => "--version",
70
+ :description => "Show chef-solr-rebuild version",
71
+ :boolean => true,
72
+ :proc => lambda {|v| puts "chef-solr-rebuild: #{::Chef::Solr::VERSION}"},
73
+ :exit => 0
74
+
67
75
  def initialize
68
76
  super
69
77
 
@@ -6,9 +6,9 @@
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
8
8
  # You may obtain a copy of the License at
9
- #
9
+ #
10
10
  # http://www.apache.org/licenses/LICENSE-2.0
11
- #
11
+ #
12
12
  # Unless required by applicable law or agreed to in writing, software
13
13
  # distributed under the License is distributed on an "AS IS" BASIS,
14
14
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -21,19 +21,20 @@ require 'chef/config'
21
21
  require 'chef/application'
22
22
  require 'chef/daemon'
23
23
  require 'chef/client'
24
+ require 'chef/solr'
24
25
 
25
26
  class Chef
26
27
  class Solr
27
28
  class Application
28
29
  class Solr < Chef::Application
29
-
30
- option :config_file,
30
+
31
+ option :config_file,
31
32
  :short => "-c CONFIG",
32
33
  :long => "--config CONFIG",
33
34
  :default => "/etc/chef/solr.rb",
34
35
  :description => "The configuration file to use"
35
36
 
36
- option :log_level,
37
+ option :log_level,
37
38
  :short => "-l LEVEL",
38
39
  :long => "--log_level LEVEL",
39
40
  :description => "Set the log level (debug, info, warn, error, fatal)",
@@ -45,6 +46,12 @@ class Chef
45
46
  :description => "Set the log file location, defaults to STDOUT - recommended for daemonizing",
46
47
  :proc => nil
47
48
 
49
+ option :pid_file,
50
+ :short => "-P PID_FILE",
51
+ :long => "--pid PIDFILE",
52
+ :description => "Set the PID file location, defaults to /tmp/chef-solr.pid",
53
+ :proc => nil
54
+
48
55
  option :help,
49
56
  :short => "-h",
50
57
  :long => "--help",
@@ -95,11 +102,19 @@ class Chef
95
102
  option :solr_java_opts,
96
103
  :short => "-j OPTS",
97
104
  :long => "--java-opts OPTS",
98
- :description => "Raw options passed to Java"
105
+ :description => "Raw options passed to Java"
106
+
107
+ option :version,
108
+ :short => "-v",
109
+ :long => "--version",
110
+ :description => "Show chef-solr version",
111
+ :boolean => true,
112
+ :proc => lambda {|v| puts "chef-solr: #{::Chef::Solr::VERSION}"},
113
+ :exit => 0
99
114
 
100
115
  def initialize
101
116
  super
102
- Chef::Log.level = Chef::Config[:log_level]
117
+ Chef::Log.level = Chef::Config[:log_level]
103
118
  end
104
119
 
105
120
  def setup_application
@@ -113,7 +128,7 @@ class Chef
113
128
 
114
129
  # Create the Jetty container
115
130
  unless File.directory?(Chef::Config[:solr_jetty_path])
116
- Chef::Log.warn("Initializing the Jetty container")
131
+ Chef::Log.warn("Initializing the Jetty container")
117
132
  solr_jetty_dir = Chef::Resource::Directory.new(Chef::Config[:solr_jetty_path], nil, c.node)
118
133
  solr_jetty_dir.recursive(true)
119
134
  solr_jetty_dir.run_action(:create)
@@ -125,7 +140,7 @@ class Chef
125
140
 
126
141
  # Create the solr home
127
142
  unless File.directory?(Chef::Config[:solr_home_path])
128
- Chef::Log.warn("Initializing Solr home directory")
143
+ Chef::Log.warn("Initializing Solr home directory")
129
144
  solr_home_dir = Chef::Resource::Directory.new(Chef::Config[:solr_home_path], nil, c.node)
130
145
  solr_home_dir.recursive(true)
131
146
  solr_home_dir.run_action(:create)
@@ -135,7 +150,7 @@ class Chef
135
150
  solr_jetty_untar.run_action(:run)
136
151
  end
137
152
 
138
- # Create the solr data path
153
+ # Create the solr data path
139
154
  unless File.directory?(Chef::Config[:solr_data_path])
140
155
  Chef::Log.warn("Initializing Solr data directory")
141
156
  solr_data_dir = Chef::Resource::Directory.new(Chef::Config[:solr_data_path], nil, c.node)
@@ -170,5 +170,69 @@ describe Chef::Solr do
170
170
  @solr.solr_delete_by_query([ "foo:bar", "baz:bum" ])
171
171
  end
172
172
  end
173
+
174
+ describe "rebuilding the index" do
175
+ before do
176
+ Chef::Config[:couchdb_database] = "chunky_bacon"
177
+ end
178
+
179
+ it "deletes the index and commits" do
180
+ @solr.should_receive(:solr_delete_by_query).with("X_CHEF_database_CHEF_X:chunky_bacon")
181
+ @solr.should_receive(:solr_commit)
182
+ @solr.stub!(:reindex_all)
183
+ Chef::DataBag.stub!(:cdb_list).and_return([])
184
+ @solr.rebuild_index
185
+ end
186
+
187
+ it "reindexes Chef::ApiClient, Chef::Node, and Chef::Role objects, reporting the results as a hash" do
188
+ @solr.stub!(:solr_delete_by_query).with("X_CHEF_database_CHEF_X:chunky_bacon")
189
+ @solr.stub!(:solr_commit)
190
+ @solr.should_receive(:reindex_all).with(Chef::ApiClient).and_return(true)
191
+ @solr.should_receive(:reindex_all).with(Chef::Node).and_return(true)
192
+ @solr.should_receive(:reindex_all).with(Chef::Role).and_return(true)
193
+ Chef::DataBag.stub!(:cdb_list).and_return([])
194
+
195
+ result = @solr.rebuild_index
196
+ result["Chef::ApiClient"].should == "success"
197
+ result["Chef::Node"].should == "success"
198
+ result["Chef::Role"].should == "success"
199
+ end
200
+
201
+ it "does not reindex Chef::OpenIDRegistration or Chef::WebUIUser objects" do
202
+ # hi there. the reason we're specifying this behavior is because these objects
203
+ # are not properly indexed in the first place and trying to reindex them
204
+ # tickles a bug in our CamelCase to snake_case code. See CHEF-1009.
205
+ @solr.stub!(:solr_delete_by_query).with("X_CHEF_database_CHEF_X:chunky_bacon")
206
+ @solr.stub!(:solr_commit)
207
+ @solr.stub!(:reindex_all).with(Chef::ApiClient)
208
+ @solr.stub!(:reindex_all).with(Chef::Node)
209
+ @solr.stub!(:reindex_all).with(Chef::Role)
210
+ @solr.should_not_receive(:reindex_all).with(Chef::OpenIDRegistration)
211
+ @solr.should_not_receive(:reindex_all).with(Chef::WebUIUser)
212
+ Chef::DataBag.stub!(:cdb_list).and_return([])
213
+
214
+ @solr.rebuild_index
215
+ end
216
+
217
+ it "reindexes databags" do
218
+ one_data_item = Chef::DataBagItem.new
219
+ one_data_item.raw_data = {"maybe"=>"snakes actually are evil", "id" => "just_sayin"}
220
+ two_data_item = Chef::DataBagItem.new
221
+ two_data_item.raw_data = {"tone_depth"=>"rumble_fish", "id" => "eff_yes"}
222
+ data_bag = Chef::DataBag.new
223
+ data_bag.stub!(:list).and_return([one_data_item, two_data_item])
224
+
225
+ @solr.stub!(:solr_delete_by_query).with("X_CHEF_database_CHEF_X:chunky_bacon")
226
+ @solr.stub!(:solr_commit)
227
+ @solr.stub!(:reindex_all)
228
+ Chef::DataBag.stub!(:cdb_list).and_return([data_bag])
229
+
230
+ data_bag.should_receive(:add_to_index)
231
+ one_data_item.should_receive(:add_to_index)
232
+ two_data_item.should_receive(:add_to_index)
233
+
234
+ @solr.rebuild_index["Chef::DataBag"].should == "success"
235
+ end
236
+ end
173
237
 
174
238
  end
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ -cbfs
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 8
8
- - 6
9
- version: 0.8.6
8
+ - 8
9
+ version: 0.8.8
10
10
  platform: ruby
11
11
  authors:
12
12
  - Adam Jacob
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-04 00:00:00 -08:00
17
+ date: 2010-03-17 00:00:00 -07:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -55,8 +55,8 @@ dependencies:
55
55
  segments:
56
56
  - 0
57
57
  - 8
58
- - 6
59
- version: 0.8.6
58
+ - 8
59
+ version: 0.8.8
60
60
  type: :runtime
61
61
  version_requirements: *id003
62
62
  description:
@@ -89,6 +89,7 @@ files:
89
89
  - spec/chef/solr/index_spec.rb
90
90
  - spec/chef/solr/query_spec.rb
91
91
  - spec/chef/solr_spec.rb
92
+ - spec/spec.opts
92
93
  - spec/spec_helper.rb
93
94
  - LICENSE
94
95
  has_rdoc: true