dor-workflow-service 1.7.8 → 1.8.0
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.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/dor-workflow-service.gemspec +3 -1
- data/lib/dor/services/workflow_service.rb +12 -1
- data/lib/dor/workflow_version.rb +1 -1
- data/spec/workflow_service_spec.rb +41 -34
- metadata +33 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: abb7f9fafd6a57bbe2ce009a7f3d8bca21680383
|
4
|
+
data.tar.gz: 4c7ca111d9dbf464495a22eeb7a40bad80f8a805
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 008f69b8e8cf014a2d2490417b0812d34ef88bd731b5b9cbad822fec2938c6d4e5a9f7ef3bb3f78942a909b64ff625b8594f6f5f39a5edb689a7c603badc366e
|
7
|
+
data.tar.gz: 24ad2b473ff2507560897f0704c4c8813adb1b1092dccafea7eb49c565c3382ba936bf54991d4f226d19b59f42c49f2c1d018b732a6bd421877aa9c72da81103
|
data/.travis.yml
CHANGED
@@ -18,10 +18,12 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.require_paths = ['lib']
|
19
19
|
|
20
20
|
gem.add_dependency 'activesupport', '>= 3.2.1', '< 5'
|
21
|
-
gem.add_dependency 'nokogiri', '~> 1.6'
|
21
|
+
gem.add_dependency 'nokogiri', '~> 1.6.0'
|
22
22
|
gem.add_dependency 'rest-client', '~> 1.7'
|
23
23
|
gem.add_dependency 'retries'
|
24
24
|
gem.add_dependency 'confstruct', '>= 0.2.7', '< 2'
|
25
|
+
gem.add_dependency 'faraday', '~> 0.9.2'
|
26
|
+
gem.add_dependency 'net-http-persistent', '~> 2.9.4'
|
25
27
|
|
26
28
|
gem.add_development_dependency 'rake'
|
27
29
|
gem.add_development_dependency 'rspec', '~> 3.3'
|
@@ -3,6 +3,8 @@ require 'active_support'
|
|
3
3
|
require 'active_support/core_ext'
|
4
4
|
require 'nokogiri'
|
5
5
|
require 'retries'
|
6
|
+
require 'faraday'
|
7
|
+
require 'net/http/persistent'
|
6
8
|
|
7
9
|
module Dor
|
8
10
|
|
@@ -22,6 +24,7 @@ module Dor
|
|
22
24
|
@@logger = nil
|
23
25
|
@@resource = nil
|
24
26
|
@@dor_services_url = nil
|
27
|
+
@@http_conn = nil
|
25
28
|
|
26
29
|
# From Workflow Service's admin/Process.java
|
27
30
|
VALID_STATUS = %w{waiting completed error queued skipped hold}
|
@@ -467,6 +470,10 @@ module Dor
|
|
467
470
|
@@logger.warn "[Attempt #{attempt_number}] #{exception.class}: #{exception.message}; #{total_delay} seconds elapsed."
|
468
471
|
end
|
469
472
|
@@resource = RestClient::Resource.new(url, params)
|
473
|
+
@@http_conn = Faraday.new(url: url) do |faraday|
|
474
|
+
faraday.response :logger if opts[:debug] # logs to STDOUT
|
475
|
+
faraday.adapter :net_http_persistent # use Keep-Alive connections
|
476
|
+
end
|
470
477
|
end
|
471
478
|
|
472
479
|
|
@@ -519,7 +526,11 @@ module Dor
|
|
519
526
|
def workflow_resource_method(uri_string, meth = 'get', payload = '', opts = {})
|
520
527
|
with_retries(:max_tries => 2, :handler => @@handler, :rescue => workflow_service_exceptions_to_catch) do |attempt|
|
521
528
|
@@logger.info "[Attempt #{attempt}] #{meth} #{workflow_resource.url}/#{uri_string}"
|
522
|
-
if
|
529
|
+
if meth == 'get'
|
530
|
+
fail NotImplementedError, "GET does not support extra headers: #{opts}" unless opts.length == 0
|
531
|
+
@@logger.debug "Persistent HTTP GET #{uri_string} (#{@@http_conn.inspect})"
|
532
|
+
@@http_conn.get(uri_string).body
|
533
|
+
elsif meth == 'delete'
|
523
534
|
workflow_resource[uri_string].send(meth, opts)
|
524
535
|
elsif opts.size == 0 # the right number of args allows existing test expect/with statements to continue working
|
525
536
|
workflow_resource[uri_string].send(meth, payload)
|
data/lib/dor/workflow_version.rb
CHANGED
@@ -28,14 +28,21 @@ describe Dor::WorkflowService do
|
|
28
28
|
@repo = 'dor'
|
29
29
|
@druid = 'druid:123'
|
30
30
|
@mock_resource = double('mock_rest_client_resource')
|
31
|
-
@
|
31
|
+
@mock_http_connection = double('mock_http_connection')
|
32
|
+
@mock_logger = double('Logger')
|
33
|
+
|
34
|
+
allow(@mock_logger).to receive(:info) # silence log output
|
35
|
+
allow(@mock_logger).to receive(:debug) # silence log output
|
36
|
+
allow(Dor::WorkflowService).to receive(:default_logger).and_return(@mock_logger)
|
37
|
+
|
32
38
|
allow(@mock_resource).to receive(:[]).and_return(@mock_resource)
|
33
39
|
allow(@mock_resource).to receive(:options).and_return( {} )
|
34
|
-
allow(@mock_resource).to receive(:url).and_return( 'https://
|
35
|
-
|
40
|
+
allow(@mock_resource).to receive(:url).and_return( 'https://localhost/workflow' )
|
41
|
+
|
42
|
+
allow(Faraday).to receive(:new).and_return(@mock_http_connection)
|
43
|
+
|
36
44
|
allow(RestClient::Resource).to receive(:new).and_return(@mock_resource)
|
37
|
-
|
38
|
-
Dor::WorkflowService.configure 'https://dortest.stanford.edu/workflow'
|
45
|
+
Dor::WorkflowService.configure @mock_resource.url
|
39
46
|
end
|
40
47
|
|
41
48
|
describe '#create_workflow' do
|
@@ -121,20 +128,21 @@ describe Dor::WorkflowService do
|
|
121
128
|
|
122
129
|
describe '#get_workflow_status' do
|
123
130
|
it 'parses workflow xml and returns status as a string' do
|
124
|
-
|
131
|
+
xml = '<process name="registrar-approval" status="completed" />'
|
132
|
+
allow(@mock_http_connection).to receive(:get).and_return(double Faraday::Response, :body => xml)
|
125
133
|
expect(Dor::WorkflowService.get_workflow_status('dor', 'druid:123', 'etdSubmitWF', 'registrar-approval')).to eq('completed')
|
126
134
|
end
|
127
135
|
it 'should throw an exception if it fails for any reason' do
|
128
136
|
ex = Exception.new('exception thrown')
|
129
|
-
|
137
|
+
allow(@mock_http_connection).to receive(:get).and_raise(ex)
|
130
138
|
expect{ Dor::WorkflowService.get_workflow_status('dor', 'druid:123', 'etdSubmitWF', 'registrar-approval') }.to raise_error(Exception, 'exception thrown')
|
131
139
|
end
|
132
140
|
it 'should throw an exception if it cannot parse the response' do
|
133
|
-
|
141
|
+
allow(@mock_http_connection).to receive(:get).and_return(double Faraday::Response, :body => 'something not xml')
|
134
142
|
expect{ Dor::WorkflowService.get_workflow_status('dor', 'druid:123', 'etdSubmitWF', 'registrar-approval') }.to raise_error(Exception, "Unable to parse response:\nsomething not xml")
|
135
143
|
end
|
136
144
|
it 'should return nil if the workflow/process combination doesnt exist' do
|
137
|
-
|
145
|
+
allow(@mock_http_connection).to receive(:get).and_return(double Faraday::Response, :body => '<process name="registrar-approval" status="completed" />')
|
138
146
|
expect(Dor::WorkflowService.get_workflow_status('dor', 'druid:123', 'accessionWF', 'publish')).to be_nil
|
139
147
|
end
|
140
148
|
end
|
@@ -142,7 +150,7 @@ describe Dor::WorkflowService do
|
|
142
150
|
describe '#get_workflow_xml' do
|
143
151
|
it 'returns the xml for a given repository, druid, and workflow' do
|
144
152
|
xml = '<workflow id="etdSubmitWF"><process name="registrar-approval" status="completed" /></workflow>'
|
145
|
-
|
153
|
+
allow(@mock_http_connection).to receive(:get).and_return(double Faraday::Response, :body => xml)
|
146
154
|
expect(Dor::WorkflowService.get_workflow_xml('dor', 'druid:123', 'etdSubmitWF')).to eq(xml)
|
147
155
|
end
|
148
156
|
end
|
@@ -156,17 +164,18 @@ describe Dor::WorkflowService do
|
|
156
164
|
<milestone date="2010-06-15T16:08:58-0700">released</milestone>
|
157
165
|
</lifecycle>
|
158
166
|
EOXML
|
159
|
-
|
167
|
+
allow(@mock_http_connection).to receive(:get).and_return(double Faraday::Response, :body => xml)
|
160
168
|
expect(Dor::WorkflowService.get_lifecycle('dor', 'druid:123', 'released').beginning_of_day).to eq(Time.parse('2010-06-15T16:08:58-0700').beginning_of_day)
|
161
169
|
end
|
162
170
|
|
163
171
|
it "returns nil if the milestone hasn't been reached yet" do
|
164
|
-
|
172
|
+
xml = '<lifecycle/>'
|
173
|
+
allow(@mock_http_connection).to receive(:get).and_return(double Faraday::Response, :body => xml)
|
165
174
|
expect(Dor::WorkflowService.get_lifecycle('dor', 'druid:abc', 'inprocess')).to be_nil
|
166
175
|
end
|
167
176
|
end
|
168
177
|
|
169
|
-
|
178
|
+
context '#get_objects_for_workstep' do
|
170
179
|
before :each do
|
171
180
|
@repository = 'dor'
|
172
181
|
@workflow = 'googleScannedBookWF'
|
@@ -174,19 +183,19 @@ describe Dor::WorkflowService do
|
|
174
183
|
@waiting = 'process-content'
|
175
184
|
end
|
176
185
|
|
177
|
-
|
186
|
+
describe 'a query with one step completed and one waiting' do
|
178
187
|
it 'creates the URI string with only the one completed step' do
|
179
|
-
|
180
|
-
|
188
|
+
xml = %{<objects count="1"><object id="druid:ab123de4567"/><object id="druid:ab123de9012"/></objects>}
|
189
|
+
allow(@mock_http_connection).to receive(:get).with("workflow_queue?waiting=#{@repository}:#{@workflow}:#{@waiting}&completed=#{@repository}:#{@workflow}:#{@completed}&lane-id=default").and_return(double Faraday::Response, :body => xml)
|
181
190
|
expect(Dor::WorkflowService.get_objects_for_workstep(@completed, @waiting, 'default', :default_repository => @repository, :default_workflow => @workflow)).to eq(['druid:ab123de4567', 'druid:ab123de9012'])
|
182
191
|
end
|
183
192
|
end
|
184
193
|
|
185
|
-
|
194
|
+
describe 'a query with TWO steps completed and one waiting' do
|
186
195
|
it 'creates the URI string with the two completed steps correctly' do
|
187
196
|
second_completed = 'google-convert'
|
188
|
-
|
189
|
-
|
197
|
+
xml = %{<objects count="1"><object id="druid:ab123de4567"/><object id="druid:ab123de9012"/></objects>}
|
198
|
+
allow(@mock_http_connection).to receive(:get).with("workflow_queue?waiting=#{@repository}:#{@workflow}:#{@waiting}&completed=#{@repository}:#{@workflow}:#{@completed}&completed=#{@repository}:#{@workflow}:#{second_completed}&lane-id=default").and_return(double Faraday::Response, :body => xml)
|
190
199
|
expect(Dor::WorkflowService.get_objects_for_workstep([@completed, second_completed], @waiting, 'default', :default_repository => @repository, :default_workflow => @workflow)).to eq(['druid:ab123de4567', 'druid:ab123de9012'])
|
191
200
|
end
|
192
201
|
end
|
@@ -201,8 +210,8 @@ describe Dor::WorkflowService do
|
|
201
210
|
it 'creates the URI string with the two completed steps across repositories correctly' do
|
202
211
|
qualified_completed2 = "sdr:sdrIngestWF:complete-deposit"
|
203
212
|
qualified_completed3 = "sdr:sdrIngestWF:ingest-transfer"
|
204
|
-
|
205
|
-
|
213
|
+
xml = %{<objects count="2"><object id="druid:ab123de4567"/><object id="druid:ab123de9012"/></objects>}
|
214
|
+
allow(@mock_http_connection).to receive(:get).with("workflow_queue?waiting=#{@qualified_waiting}&completed=#{@qualified_completed}&completed=#{qualified_completed2}&completed=#{qualified_completed3}&lane-id=#{laneid}").and_return(double Faraday::Response, :body => xml)
|
206
215
|
args = [[@qualified_completed, qualified_completed2, qualified_completed3], @qualified_waiting]
|
207
216
|
args << laneid if laneid != 'default'
|
208
217
|
expect(Dor::WorkflowService.get_objects_for_workstep(*args)).to eq(['druid:ab123de4567', 'druid:ab123de9012'])
|
@@ -220,20 +229,20 @@ describe Dor::WorkflowService do
|
|
220
229
|
end
|
221
230
|
end
|
222
231
|
|
223
|
-
|
232
|
+
context 'URI string creation' do
|
224
233
|
before :each do
|
225
|
-
|
234
|
+
@xml = %{<objects count="1"><object id="druid:ab123de4567"/></objects>}
|
226
235
|
end
|
227
236
|
it 'with only one completed step passed in as a String' do
|
228
|
-
|
237
|
+
allow(@mock_http_connection).to receive(:get).with("workflow_queue?waiting=#{@qualified_waiting}&completed=#{@qualified_completed}&lane-id=default").and_return(double Faraday::Response, :body => @xml)
|
229
238
|
expect(Dor::WorkflowService.get_objects_for_workstep(@qualified_completed, @qualified_waiting)).to eq(['druid:ab123de4567'])
|
230
239
|
end
|
231
240
|
it 'without any completed steps, only waiting' do
|
232
|
-
|
241
|
+
allow(@mock_http_connection).to receive(:get).with("workflow_queue?waiting=#{@qualified_waiting}&lane-id=default").and_return(double Faraday::Response, :body => @xml)
|
233
242
|
expect(Dor::WorkflowService.get_objects_for_workstep(nil, @qualified_waiting)).to eq(['druid:ab123de4567'])
|
234
243
|
end
|
235
244
|
it 'same but with lane_id' do
|
236
|
-
|
245
|
+
allow(@mock_http_connection).to receive(:get).with("workflow_queue?waiting=#{@qualified_waiting}&lane-id=lane1").and_return(double Faraday::Response, :body => @xml)
|
237
246
|
expect(Dor::WorkflowService.get_objects_for_workstep(nil, @qualified_waiting, 'lane1')).to eq([ 'druid:ab123de4567' ])
|
238
247
|
end
|
239
248
|
end
|
@@ -246,8 +255,8 @@ describe Dor::WorkflowService do
|
|
246
255
|
workflow = 'googleScannedBookWF'
|
247
256
|
completed = 'google-download'
|
248
257
|
waiting = 'process-content'
|
249
|
-
|
250
|
-
|
258
|
+
xml = %{<objects count="0"/>}
|
259
|
+
allow(@mock_http_connection).to receive(:get).with("workflow_queue?waiting=#{repository}:#{workflow}:#{waiting}&completed=#{repository}:#{workflow}:#{completed}&lane-id=default").and_return(double Faraday::Response, :body => xml)
|
251
260
|
expect(Dor::WorkflowService.get_objects_for_workstep(completed, waiting, 'default', :default_repository => repository, :default_workflow => workflow)).to eq([])
|
252
261
|
end
|
253
262
|
end
|
@@ -310,8 +319,7 @@ describe Dor::WorkflowService do
|
|
310
319
|
<workflow laneId="lane2" note="annotation" lifecycle="in-process" errorText="stacktrace" errorMessage="NullPointerException" elapsed="1.173" repository="dor" attempts="0" datetime="2008-11-15T13:30:00-0800" status="waiting" process="jp2-create" name="assemblyWF" druid="dr:456"/>
|
311
320
|
</workflows>
|
312
321
|
XML
|
313
|
-
|
314
|
-
expect(@mock_resource).to receive(:get).and_return(xml)
|
322
|
+
allow(@mock_http_connection).to receive(:get).with('workflow_queue/all_queued?repository=dor&hours-ago=24&limit=100').and_return(double Faraday::Response, :body => xml)
|
315
323
|
ah = Dor::WorkflowService.get_stale_queued_workflows 'dor', :hours_ago => 24, :limit => 100
|
316
324
|
expected = [
|
317
325
|
{ :workflow => 'accessionWF', :step => 'content-metadata', :druid => 'dr:123', :lane_id => 'lane1' },
|
@@ -323,8 +331,8 @@ describe Dor::WorkflowService do
|
|
323
331
|
|
324
332
|
describe '.count_stale_queued_workflows' do
|
325
333
|
it 'returns the number of queued workflow steps' do
|
326
|
-
|
327
|
-
|
334
|
+
xml = %{<objects count="10"/>}
|
335
|
+
allow(@mock_http_connection).to receive(:get).with('workflow_queue/all_queued?repository=dor&hours-ago=48&count-only=true').and_return(double Faraday::Response, :body => xml)
|
328
336
|
expect(Dor::WorkflowService.count_stale_queued_workflows('dor', :hours_ago => 48)).to eq(10)
|
329
337
|
end
|
330
338
|
end
|
@@ -337,8 +345,7 @@ describe Dor::WorkflowService do
|
|
337
345
|
<lane id="lane2"/>
|
338
346
|
</lanes>
|
339
347
|
XML
|
340
|
-
|
341
|
-
expect(@mock_resource).to receive(:get).and_return(xml)
|
348
|
+
allow(@mock_http_connection).to receive(:get).with('workflow_queue/lane_ids?step=dor:accessionWF:shelve').and_return(double Faraday::Response, :body => xml)
|
342
349
|
expect(Dor::WorkflowService.get_lane_ids('dor', 'accessionWF', 'shelve')).to eq(%w(lane1 lane2))
|
343
350
|
end
|
344
351
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dor-workflow-service
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Willy Mene
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2015-12-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -37,14 +37,14 @@ dependencies:
|
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 1.6.0
|
41
41
|
type: :runtime
|
42
42
|
prerelease: false
|
43
43
|
version_requirements: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 1.6.0
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: rest-client
|
50
50
|
requirement: !ruby/object:Gem::Requirement
|
@@ -93,6 +93,34 @@ dependencies:
|
|
93
93
|
- - "<"
|
94
94
|
- !ruby/object:Gem::Version
|
95
95
|
version: '2'
|
96
|
+
- !ruby/object:Gem::Dependency
|
97
|
+
name: faraday
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 0.9.2
|
103
|
+
type: :runtime
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.9.2
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: net-http-persistent
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: 2.9.4
|
117
|
+
type: :runtime
|
118
|
+
prerelease: false
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - "~>"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: 2.9.4
|
96
124
|
- !ruby/object:Gem::Dependency
|
97
125
|
name: rake
|
98
126
|
requirement: !ruby/object:Gem::Requirement
|
@@ -210,7 +238,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
210
238
|
version: '0'
|
211
239
|
requirements: []
|
212
240
|
rubyforge_project:
|
213
|
-
rubygems_version: 2.
|
241
|
+
rubygems_version: 2.4.8
|
214
242
|
signing_key:
|
215
243
|
specification_version: 4
|
216
244
|
summary: Provides convenience methods to work with the DOR Workflow Service
|