lita-rundeck 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,3 @@
1
+ <result success='true' apiversion='10'>
2
+ <executions count='0' />
3
+ </result>
@@ -0,0 +1,383 @@
1
+ require "spec_helper"
2
+
3
+ describe Lita::Handlers::Rundeck, lita_handler: true do
4
+
5
+ let(:rundeck_info) do
6
+ File.read("spec/files/info.xml")
7
+ end
8
+
9
+ let(:rundeck_projects) do
10
+ File.read("spec/files/projects.xml")
11
+ end
12
+
13
+ let(:rundeck_projects_empty) do
14
+ File.read("spec/files/projects_empty.xml")
15
+ end
16
+
17
+ let(:rundeck_jobs) do
18
+ File.read("spec/files/jobs.xml")
19
+ end
20
+
21
+ let(:rundeck_jobs_empty) do
22
+ File.read("spec/files/jobs_empty.xml")
23
+ end
24
+
25
+ let(:rundeck_executions) do
26
+ File.read("spec/files/executions.xml")
27
+ end
28
+
29
+ let(:rundeck_executions_empty) do
30
+ File.read("spec/files/executions_empty.xml")
31
+ end
32
+
33
+ let(:rundeck_running) do
34
+ File.read("spec/files/running.xml")
35
+ end
36
+
37
+ let(:rundeck_runnning_empty) do
38
+ File.read("spec/files/running_empty.xml")
39
+ end
40
+
41
+ let(:rundeck_run) do
42
+ File.read("spec/files/run.xml")
43
+ end
44
+
45
+ let(:rundeck_run_conflict) do
46
+ File.read("spec/files/run_conflict.xml")
47
+ end
48
+
49
+ let(:rundeck_run_options_invalid) do
50
+ File.read("spec/files/run_options_invalid.xml")
51
+ end
52
+
53
+ let(:rundeck_run_unauthorized) do
54
+ File.read("spec/files/run_unauthorized.xml")
55
+ end
56
+
57
+ let(:rundeck_options) do
58
+ File.read("spec/files/definition.xml")
59
+ end
60
+
61
+ it { routes_command("rundeck info").to(:info) }
62
+ it { routes_command("rundeck projects").to(:projects) }
63
+ it { routes_command("rundeck jobs").to(:jobs) }
64
+ it { routes_command("rundeck executions").to(:executions) }
65
+ it { routes_command("rundeck running").to(:running) }
66
+ it { routes_command("rundeck aliases").to(:aliases) }
67
+ it { routes_command("rundeck alias register aliasfoo --project Litatest --job dateoutput").to(:alias_register) }
68
+ it { routes_command("rundeck alias forget aliasfoo").to(:alias_forget) }
69
+ it { routes_command("rundeck run aliasfoo").to(:run) }
70
+ it { routes_command("rundeck run aliasfoo --options SECONDS=60").to(:run) }
71
+ it { routes_command("rundeck run --project Litatest --job dateoutput").to(:run) }
72
+ it { routes_command("rundeck run --project Litatest --job dateoutput --options SECONDS=60").to(:run) }
73
+ it { routes_command("rundeck options aliasfoo").to(:options) }
74
+ it { routes_command("rundeck options --project Litatest --job dateoutput").to(:options) }
75
+
76
+ def grab_request(method, status, body)
77
+ response = double('Faraday::Response', status: status, body: body)
78
+ expect_any_instance_of(Faraday::Connection).to \
79
+ receive(method.to_sym).and_return(response)
80
+ end
81
+
82
+ before do
83
+ Lita.config.handlers.rundeck.url = "https://rundeck.mycompany.org"
84
+ Lita.config.handlers.rundeck.token = "abcdefghijzlmnopqrstuvwxyz"
85
+ Lita.config.handlers.rundeck.api_debug = true
86
+ end
87
+
88
+ describe "#info" do
89
+ it "replies with the rundeck server information with no users" do
90
+ grab_request("get", 200, rundeck_info)
91
+ send_command("rundeck info")
92
+ expect(replies.last).to eq <<-EOF.chomp
93
+ System Stats for Rundeck 2.0.4 on node rundeck.mycompany.org
94
+ No users are currently allowed to execute jobs. Ask an admin to 'lita add CHAT_ID rundeck_users'
95
+ EOF
96
+ end
97
+
98
+ context "with users" do
99
+ before do
100
+ allow(Lita::Authorization).to receive(:groups_with_users).and_return(
101
+ :rundeck_users => [ Lita::User.new(1, {"name"=>"Shell User"} ) ]
102
+ )
103
+ end
104
+
105
+ it "replies with the rundeck server information with users" do
106
+ grab_request("get", 200, rundeck_info)
107
+ send_command("rundeck info")
108
+ expect(replies.last).to eq <<-EOF.chomp
109
+ System Stats for Rundeck 2.0.4 on node rundeck.mycompany.org
110
+ Users allowed to execute jobs: Shell User
111
+ EOF
112
+ end
113
+ end
114
+ end
115
+
116
+ describe "#projects" do
117
+ it "replies with the project list" do
118
+ grab_request("get", 200, rundeck_projects)
119
+ send_command("rundeck projects")
120
+ expect(replies.last).to eq <<-EOF.chomp
121
+ [Litatest] - https://rundeck.mycompany.org/api/10/project/Litatest
122
+ EOF
123
+ end
124
+
125
+ it "replies emtpy project list" do
126
+ grab_request("get", 200, rundeck_projects_empty)
127
+ send_command("rundeck projects")
128
+ expect(replies.last).to eq <<-EOF.chomp
129
+ No projects found
130
+ EOF
131
+ end
132
+ end
133
+
134
+ describe "#jobs" do
135
+ it "replies with the jobs list" do
136
+ grab_request("get", 200, rundeck_projects)
137
+ grab_request("get", 200, rundeck_jobs)
138
+ send_command("rundeck alias register aliasfoo --project Litatest --job dateoutput")
139
+ send_command("rundeck jobs")
140
+ expect(replies.last).to eq <<-EOF.chomp
141
+ [Litatest] - Foo:Bar;baz
142
+ aliasfoo = [Litatest] - dateoutput
143
+ [Litatest] - test2
144
+ EOF
145
+ end
146
+
147
+ it "replies with an empty jobs list" do
148
+ grab_request("get", 200, rundeck_projects)
149
+ grab_request("get", 200, rundeck_jobs_empty)
150
+ send_command("rundeck jobs")
151
+ expect(replies.last).to eq <<-EOF.chomp
152
+ No jobs found
153
+ EOF
154
+ end
155
+ end
156
+
157
+ describe "#executions" do
158
+ it "replies with the executions list" do
159
+ grab_request("get", 200, rundeck_projects)
160
+ grab_request("get", 200, rundeck_executions)
161
+ send_command("rundeck executions")
162
+ expect(replies.last).to eq <<-EOF.chomp
163
+ 254 succeeded Shell User [Litatest] dateoutput SECONDS:60 start:2014-08-10T06:19:22Z end:2014-08-10T06:20:23Z
164
+ 255 succeeded Shell User [Litatest] dateoutput SECONDS:600 start:2014-08-10T06:20:33Z end:2014-08-10T06:30:36Z
165
+ 256 succeeded Shell User [Litatest] dateoutput start:2014-08-10T18:21:41Z end:2014-08-10T18:21:41Z
166
+ 257 succeeded Shell User [Litatest] dateoutput SECONDS:60 start:2014-08-10T21:31:29Z end:2014-08-10T21:32:30Z
167
+ 258 succeeded Shell User [Litatest] dateoutput SECOND:600 start:2014-08-10T21:33:06Z end:2014-08-10T21:33:06Z
168
+ 259 succeeded Shell User [Litatest] dateoutput SECONDS:600 start:2014-08-10T21:34:16Z end:2014-08-10T21:44:21Z
169
+ 260 succeeded Shell User [Litatest] dateoutput start:2014-08-10T22:03:37Z end:2014-08-10T22:03:40Z
170
+ 282 succeeded Shell User [Litatest] dateoutput SECONDS:60 start:2014-08-14T01:07:09Z end:2014-08-14T01:08:09Z
171
+ 283 succeeded Shell User [Litatest] dateoutput SECONDS:5 start:2014-08-14T02:27:41Z end:2014-08-14T02:27:46Z
172
+ 285 succeeded Shell User [Litatest] dateoutput SECONDS:600 start:2014-08-14T15:06:28Z end:2014-08-14T15:16:32Z
173
+ EOF
174
+ end
175
+
176
+ it "replies with the executions list limited to 2" do
177
+ grab_request("get", 200, rundeck_projects)
178
+ grab_request("get", 200, rundeck_executions)
179
+ send_command("rundeck executions 2")
180
+ expect(replies.last).to eq <<-EOF.chomp
181
+ 283 succeeded Shell User [Litatest] dateoutput SECONDS:5 start:2014-08-14T02:27:41Z end:2014-08-14T02:27:46Z
182
+ 285 succeeded Shell User [Litatest] dateoutput SECONDS:600 start:2014-08-14T15:06:28Z end:2014-08-14T15:16:32Z
183
+ EOF
184
+ end
185
+
186
+ it "replies with an empty executions list" do
187
+ grab_request("get", 200, rundeck_projects)
188
+ grab_request("get", 200, rundeck_executions_empty)
189
+ send_command("rundeck executions")
190
+ expect(replies.last).to eq <<-EOF.chomp
191
+ No executions found
192
+ EOF
193
+ end
194
+ end
195
+
196
+ describe "#running" do
197
+ it "replies with the running list" do
198
+ grab_request("get", 200, rundeck_projects)
199
+ grab_request("get", 200, rundeck_running)
200
+ send_command("rundeck running")
201
+ expect(replies.last).to eq <<-EOF.chomp
202
+ 285 running Shell User [Litatest] dateoutput SECONDS:600 start:2014-08-14T15:06:28Z
203
+ EOF
204
+ end
205
+
206
+ it "replies with an empty running list" do
207
+ grab_request("get", 200, rundeck_projects)
208
+ grab_request("get", 200, rundeck_executions_empty)
209
+ send_command("rundeck running")
210
+ expect(replies.last).to eq <<-EOF.chomp
211
+ No executions found
212
+ EOF
213
+ end
214
+ end
215
+
216
+ describe "#run" do
217
+ it "submit job and be denied because of authorization" do
218
+ allow(Lita::Authorization).to receive(:user_in_group?).and_return(false)
219
+ send_command("rundeck run --project Litatest --job dateoutput --options SECONDS=60")
220
+ expect(replies.last).to eq <<-EOF.chomp
221
+ You aren't authorized to run jobs
222
+ EOF
223
+ end
224
+
225
+ it "submit aliased job and have it succeed" do
226
+ allow(Lita::Authorization).to receive(:user_in_group?).and_return(true)
227
+ grab_request("get", 200, rundeck_projects)
228
+ grab_request("get", 200, rundeck_jobs)
229
+ grab_request("get", 200, rundeck_run)
230
+ send_command("rundeck alias register aliasfoo --project Litatest --job dateoutput")
231
+ send_command("rundeck run aliasfoo --options SECONDS=60")
232
+ expect(replies.last).to eq <<-EOF.chomp
233
+ Execution 285 is running
234
+ EOF
235
+ end
236
+
237
+ it "submit fully qualified job and have it succeed" do
238
+ allow(Lita::Authorization).to receive(:user_in_group?).and_return(true)
239
+ grab_request("get", 200, rundeck_projects)
240
+ grab_request("get", 200, rundeck_jobs)
241
+ grab_request("get", 200, rundeck_run)
242
+ send_command("rundeck run --project Litatest --job dateoutput --options SECONDS=60")
243
+ expect(replies.last).to eq <<-EOF.chomp
244
+ Execution 285 is running
245
+ EOF
246
+ end
247
+
248
+ it "submit a non-existent job" do
249
+ allow(Lita::Authorization).to receive(:user_in_group?).and_return(true)
250
+ send_command("rundeck run not-a-real-alias")
251
+ expect(replies.last).to eq <<-EOF.chomp
252
+ Can't find an alias or project and job
253
+ EOF
254
+ end
255
+
256
+ it "submit a conflicting job" do
257
+ allow(Lita::Authorization).to receive(:user_in_group?).and_return(true)
258
+ grab_request("get", 200, rundeck_projects)
259
+ grab_request("get", 200, rundeck_jobs)
260
+ grab_request("get", 200, rundeck_run)
261
+ grab_request("get", 200, rundeck_run_conflict)
262
+ send_command("rundeck run --project Litatest --job dateoutput --options SECONDS=60")
263
+ send_command("rundeck run --project Litatest --job dateoutput --options SECONDS=60")
264
+ expect(replies.last).to eq <<-EOF.chomp
265
+ Job is already running and only allows one execution at a time
266
+ EOF
267
+ end
268
+
269
+ it "submit a job with bad options" do
270
+ allow(Lita::Authorization).to receive(:user_in_group?).and_return(true)
271
+ grab_request("get", 200, rundeck_projects)
272
+ grab_request("get", 200, rundeck_jobs)
273
+ grab_request("get", 200, rundeck_run_options_invalid)
274
+ send_command("rundeck run --project Litatest --job dateoutput --options SECONDS=XXX")
275
+ expect(replies.last).to eq <<-EOF.chomp
276
+ Job options were not valid: Option 'SECONDS' doesn't match regular expression \\d+, value: XXX
277
+ EOF
278
+ end
279
+
280
+ it "submit a job against a server missing the runAs permission" do
281
+ allow(Lita::Authorization).to receive(:user_in_group?).and_return(true)
282
+ grab_request("get", 200, rundeck_projects)
283
+ grab_request("get", 200, rundeck_jobs)
284
+ grab_request("get", 200, rundeck_run_unauthorized)
285
+ send_command("rundeck run --project Litatest --job dateoutput --options SECONDS=XXX")
286
+ expect(replies.last).to eq <<-EOF.chomp
287
+ API token is unauthorized or lacks runAs permission; check the apitoken.aclpolicy
288
+ EOF
289
+ end
290
+ end
291
+
292
+ describe "#aliases" do
293
+ it "lists empty aliases list" do
294
+ send_command("rundeck aliases")
295
+ expect(replies.last).to eq <<-EOF.chomp
296
+ No aliases have been registered yet
297
+ EOF
298
+ end
299
+
300
+ it "lists aliases" do
301
+ send_command("rundeck alias register aliasfoo --project Litatest --job dateoutput")
302
+ send_command("rundeck aliases")
303
+ expect(replies.last).to eq <<-EOF.chomp
304
+ Alias = [Project] - Job
305
+ aliasfoo = [Litatest] - dateoutput
306
+ EOF
307
+ end
308
+
309
+ end
310
+
311
+ describe "#alias_register" do
312
+ it "registers a new alias" do
313
+ send_command("rundeck alias register aliasfoo --project Litatest --job dateoutput")
314
+ expect(replies.last).to eq <<-EOF.chomp
315
+ Alias registered
316
+ EOF
317
+ end
318
+
319
+ it "fails to registers an existing alias" do
320
+ send_command("rundeck alias register aliasfoo --project Litatest --job dateoutput")
321
+ send_command("rundeck alias register aliasfoo --project Litatest --job dateoutput")
322
+ expect(replies.last).to eq <<-EOF.chomp
323
+ Alias already exists
324
+ EOF
325
+ end
326
+
327
+ it "fails on a bad format" do
328
+ send_command("rundeck alias register aliasfoo")
329
+ expect(replies.last).to eq <<-EOF.chomp
330
+ Format is bad, see help for more info
331
+ EOF
332
+ end
333
+ end
334
+
335
+ describe "#alias_forget" do
336
+ it "removes an alias" do
337
+ send_command("rundeck alias register aliasfoo --project Litatest --job dateoutput")
338
+ send_command("rundeck alias forget aliasfoo")
339
+ expect(replies.last).to eq <<-EOF.chomp
340
+ Alias removed
341
+ EOF
342
+ end
343
+
344
+ it "fails to removes a non-existent alias" do
345
+ send_command("rundeck alias forget not-a-real-alias")
346
+ expect(replies.last).to eq <<-EOF.chomp
347
+ Alias not found
348
+ EOF
349
+ end
350
+ end
351
+
352
+ describe "#options" do
353
+ it "describe options of a job" do
354
+ grab_request("get", 200, rundeck_projects)
355
+ grab_request("get", 200, rundeck_jobs)
356
+ grab_request("get", 200, rundeck_options)
357
+ send_command("rundeck options --project Litatest --job dateoutput")
358
+ expect(replies.last).to eq <<-EOF.chomp
359
+ [Litatest] - dateoutput
360
+ * SECONDS (REQUIRED)
361
+ EOF
362
+ end
363
+
364
+ it "describe options of an aliased job" do
365
+ grab_request("get", 200, rundeck_projects)
366
+ grab_request("get", 200, rundeck_jobs)
367
+ grab_request("get", 200, rundeck_options)
368
+ send_command("rundeck alias register aliasfoo --project Litatest --job dateoutput")
369
+ send_command("rundeck options aliasfoo")
370
+ expect(replies.last).to eq <<-EOF.chomp
371
+ [Litatest] - dateoutput
372
+ * SECONDS (REQUIRED)
373
+ EOF
374
+ end
375
+
376
+ it "describe options of a non-existent job" do
377
+ send_command("rundeck options aliasfoo")
378
+ expect(replies.last).to eq <<-EOF.chomp
379
+ Can't find an alias or project and job
380
+ EOF
381
+ end
382
+ end
383
+ end
@@ -0,0 +1,10 @@
1
+ require "simplecov"
2
+ require "coveralls"
3
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
4
+ SimpleCov::Formatter::HTMLFormatter,
5
+ Coveralls::SimpleCov::Formatter
6
+ ]
7
+ SimpleCov.start { add_filter "/spec/" }
8
+
9
+ require "lita-rundeck"
10
+ require "lita/rspec"
metadata ADDED
@@ -0,0 +1,199 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lita-rundeck
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Harlan Barnes
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: lita
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '3.3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '3.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: xml-simple
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: 1.1.4
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 1.1.4
41
+ - !ruby/object:Gem::Dependency
42
+ name: lita-keyword-arguments
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.3'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '1.3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: 3.0.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: 3.0.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: coveralls
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: Lita handler for interacting with Rundeck
126
+ email:
127
+ - hbarnes@pobox.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - .gitignore
133
+ - .travis.yml
134
+ - Gemfile
135
+ - LICENSE
136
+ - README.md
137
+ - Rakefile
138
+ - lib/lita-rundeck.rb
139
+ - lib/lita/handlers/rundeck.rb
140
+ - lita-rundeck.gemspec
141
+ - locales/en.yml
142
+ - spec/files/definition.xml
143
+ - spec/files/executions.xml
144
+ - spec/files/executions_empty.xml
145
+ - spec/files/info.xml
146
+ - spec/files/jobs.xml
147
+ - spec/files/jobs_empty.xml
148
+ - spec/files/projects.xml
149
+ - spec/files/projects_empty.xml
150
+ - spec/files/run.xml
151
+ - spec/files/run_conflict.xml
152
+ - spec/files/run_options_invalid.xml
153
+ - spec/files/run_unauthorized.xml
154
+ - spec/files/running.xml
155
+ - spec/files/running_empty.xml
156
+ - spec/lita/handlers/rundeck_spec.rb
157
+ - spec/spec_helper.rb
158
+ homepage: https://github.com/harlanbarnes/lita-rundeck
159
+ licenses:
160
+ - MIT
161
+ metadata:
162
+ lita_plugin_type: handler
163
+ post_install_message:
164
+ rdoc_options: []
165
+ require_paths:
166
+ - lib
167
+ required_ruby_version: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - '>='
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ required_rubygems_version: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - '>='
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
177
+ requirements: []
178
+ rubyforge_project:
179
+ rubygems_version: 2.0.14
180
+ signing_key:
181
+ specification_version: 4
182
+ summary: Lita handler for interacting with Rundeck
183
+ test_files:
184
+ - spec/files/definition.xml
185
+ - spec/files/executions.xml
186
+ - spec/files/executions_empty.xml
187
+ - spec/files/info.xml
188
+ - spec/files/jobs.xml
189
+ - spec/files/jobs_empty.xml
190
+ - spec/files/projects.xml
191
+ - spec/files/projects_empty.xml
192
+ - spec/files/run.xml
193
+ - spec/files/run_conflict.xml
194
+ - spec/files/run_options_invalid.xml
195
+ - spec/files/run_unauthorized.xml
196
+ - spec/files/running.xml
197
+ - spec/files/running_empty.xml
198
+ - spec/lita/handlers/rundeck_spec.rb
199
+ - spec/spec_helper.rb