jenkins_api_client 0.14.1 → 1.0.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 +7 -0
- data/.gitignore +3 -0
- data/.travis.yml +5 -23
- data/CHANGELOG.md +104 -35
- data/CONTRIBUTORS.md +1 -11
- data/Gemfile +4 -2
- data/README.md +107 -7
- data/Rakefile +1 -0
- data/Vagrantfile +6 -8
- data/jenkins_api_client.gemspec +30 -12
- data/lib/jenkins_api_client/cli/helper.rb +1 -0
- data/lib/jenkins_api_client/client.rb +162 -69
- data/lib/jenkins_api_client/exceptions.rb +26 -17
- data/lib/jenkins_api_client/job.rb +321 -75
- data/lib/jenkins_api_client/node.rb +22 -10
- data/lib/jenkins_api_client/plugin_manager.rb +460 -0
- data/lib/jenkins_api_client/urihelper.rb +17 -0
- data/lib/jenkins_api_client/user.rb +4 -2
- data/lib/jenkins_api_client/version.rb +3 -3
- data/lib/jenkins_api_client/view.rb +10 -7
- data/lib/jenkins_api_client.rb +1 -0
- data/scripts/login_with_pry.rb +54 -0
- data/spec/func_tests/client_spec.rb +3 -3
- data/spec/func_tests/job_spec.rb +90 -7
- data/spec/func_tests/{node_spec.rb → node_spec.rb.pending} +9 -9
- data/spec/func_tests/plugin_spec.rb +148 -0
- data/spec/unit_tests/client_spec.rb +108 -27
- data/spec/unit_tests/fake_http_response.rb +9 -0
- data/spec/unit_tests/fixtures/files/available_plugins.json +1 -0
- data/spec/unit_tests/fixtures/files/installed_plugins.json +1 -0
- data/spec/unit_tests/fixtures/files/updatable_plugins.json +1 -0
- data/spec/unit_tests/job_spec.rb +109 -6
- data/spec/unit_tests/node_spec.rb +18 -6
- data/spec/unit_tests/plugin_spec.rb +165 -0
- data/spec/unit_tests/spec_helper.rb +11 -1
- data/spec/unit_tests/system_spec.rb +2 -1
- data/spec/unit_tests/user_spec.rb +1 -1
- data/travis/hudson.model.UpdateCenter.xml +7 -0
- data/travis/setup.sh +2 -1
- metadata +76 -64
@@ -20,6 +20,8 @@
|
|
20
20
|
# THE SOFTWARE.
|
21
21
|
#
|
22
22
|
|
23
|
+
require 'jenkins_api_client/urihelper'
|
24
|
+
|
23
25
|
module JenkinsApi
|
24
26
|
class Client
|
25
27
|
# This class communicates with Jenkins "/view" API and used to create,
|
@@ -27,6 +29,7 @@ module JenkinsApi
|
|
27
29
|
# API.
|
28
30
|
#
|
29
31
|
class View
|
32
|
+
include JenkinsApi::UriHelper
|
30
33
|
|
31
34
|
# Initializes a new view object
|
32
35
|
#
|
@@ -150,7 +153,7 @@ module JenkinsApi
|
|
150
153
|
post_params.merge!("filterExecutors" => "on") if params[:filter_executors]
|
151
154
|
post_params.merge!("useincluderegex" => "on",
|
152
155
|
"includeRegex" => params[:regex]) if params[:regex]
|
153
|
-
@client.api_post_request("/view/#{params[:name]}/configSubmit",
|
156
|
+
@client.api_post_request("/view/#{path_encode params[:name]}/configSubmit",
|
154
157
|
post_params)
|
155
158
|
end
|
156
159
|
|
@@ -160,7 +163,7 @@ module JenkinsApi
|
|
160
163
|
#
|
161
164
|
def delete(view_name)
|
162
165
|
@logger.info "Deleting view '#{view_name}'"
|
163
|
-
@client.api_post_request("/view/#{view_name}/doDelete")
|
166
|
+
@client.api_post_request("/view/#{path_encode view_name}/doDelete")
|
164
167
|
end
|
165
168
|
|
166
169
|
# Deletes all views (except the All view) in Jenkins.
|
@@ -211,7 +214,7 @@ module JenkinsApi
|
|
211
214
|
job_names = []
|
212
215
|
raise "The view #{view_name} doesn't exists on the server"\
|
213
216
|
unless exists?(view_name)
|
214
|
-
response_json = @client.api_get_request("/view/#{view_name}")
|
217
|
+
response_json = @client.api_get_request("/view/#{path_encode view_name}")
|
215
218
|
response_json["jobs"].each do |job|
|
216
219
|
job_names << job["name"]
|
217
220
|
end
|
@@ -225,7 +228,7 @@ module JenkinsApi
|
|
225
228
|
#
|
226
229
|
def add_job(view_name, job_name)
|
227
230
|
@logger.info "Adding job '#{job_name}' to view '#{view_name}'"
|
228
|
-
post_msg = "/view/#{view_name}/addJobToView?name=#{job_name}"
|
231
|
+
post_msg = "/view/#{path_encode view_name}/addJobToView?name=#{form_encode job_name}"
|
229
232
|
@client.api_post_request(post_msg)
|
230
233
|
end
|
231
234
|
|
@@ -236,7 +239,7 @@ module JenkinsApi
|
|
236
239
|
#
|
237
240
|
def remove_job(view_name, job_name)
|
238
241
|
@logger.info "Removing job '#{job_name}' from view '#{view_name}'"
|
239
|
-
post_msg = "/view/#{view_name}/removeJobFromView?name=#{job_name}"
|
242
|
+
post_msg = "/view/#{path_encode view_name}/removeJobFromView?name=#{form_encode job_name}"
|
240
243
|
@client.api_post_request(post_msg)
|
241
244
|
end
|
242
245
|
|
@@ -246,7 +249,7 @@ module JenkinsApi
|
|
246
249
|
#
|
247
250
|
def get_config(view_name)
|
248
251
|
@logger.info "Obtaining the configuration of view '#{view_name}'"
|
249
|
-
@client.get_config("/view/#{view_name}")
|
252
|
+
@client.get_config("/view/#{path_encode view_name}")
|
250
253
|
end
|
251
254
|
|
252
255
|
# Post the configuration of a view given the view name and the config.xml
|
@@ -256,7 +259,7 @@ module JenkinsApi
|
|
256
259
|
#
|
257
260
|
def post_config(view_name, xml)
|
258
261
|
@logger.info "Posting the configuration of view '#{view_name}'"
|
259
|
-
@client.post_config("/view/#{view_name}/config.xml", xml)
|
262
|
+
@client.post_config("/view/#{path_encode view_name}/config.xml", xml)
|
260
263
|
end
|
261
264
|
|
262
265
|
end
|
data/lib/jenkins_api_client.rb
CHANGED
@@ -28,6 +28,7 @@ require 'jenkins_api_client/node'
|
|
28
28
|
require 'jenkins_api_client/system'
|
29
29
|
require 'jenkins_api_client/view'
|
30
30
|
require 'jenkins_api_client/build_queue'
|
31
|
+
require 'jenkins_api_client/plugin_manager'
|
31
32
|
require 'jenkins_api_client/user'
|
32
33
|
|
33
34
|
require 'jenkins_api_client/cli/helper'
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#!/usr/bin/env ruby1.9.1
|
2
|
+
# This script provides an easier way to login to Jenkins server API.
|
3
|
+
# It logs you in with the credentials and server details you proided and then
|
4
|
+
# starts an IRB session so you can interactively play with the API.
|
5
|
+
|
6
|
+
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
|
7
|
+
require 'jenkins_api_client'
|
8
|
+
require 'yaml'
|
9
|
+
require 'pry'
|
10
|
+
|
11
|
+
def prompt_for_username
|
12
|
+
get_from_stdin("Username: ", false)
|
13
|
+
end
|
14
|
+
|
15
|
+
def prompt_for_password
|
16
|
+
get_from_stdin("Password: ", true)
|
17
|
+
end
|
18
|
+
|
19
|
+
def get_from_stdin(prompt, mask = false)
|
20
|
+
$stdout.write(prompt)
|
21
|
+
|
22
|
+
begin
|
23
|
+
Kernel::system "stty -echo" if mask == true
|
24
|
+
ret = gets.chomp!
|
25
|
+
ensure
|
26
|
+
if mask == true
|
27
|
+
Kernel::system "stty echo"
|
28
|
+
puts ""
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
ret
|
33
|
+
end
|
34
|
+
|
35
|
+
if ARGV.empty?
|
36
|
+
config_file = '~/.jenkins_api_client/spec.yml'
|
37
|
+
else
|
38
|
+
config_file = ARGV.shift
|
39
|
+
end
|
40
|
+
|
41
|
+
begin
|
42
|
+
client_opts = YAML.load_file(File.expand_path(config_file))
|
43
|
+
unless client_opts.has_key?(:username)
|
44
|
+
client_opts[:username] = prompt_for_username()
|
45
|
+
end
|
46
|
+
unless client_opts.has_key?(:password) or client_opts.has_key?(:password_base64)
|
47
|
+
client_opts[:password] = prompt_for_password()
|
48
|
+
end
|
49
|
+
|
50
|
+
@client = JenkinsApi::Client.new(client_opts)
|
51
|
+
puts "logged-in to the Jenkins API, use the '@client' variable to use the client"
|
52
|
+
end
|
53
|
+
|
54
|
+
Pry.start
|
@@ -66,9 +66,9 @@ describe JenkinsApi::Client do
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
-
describe "#
|
70
|
-
it "Should
|
71
|
-
@client.
|
69
|
+
describe "#exec_script" do
|
70
|
+
it "Should execute the provided groovy script" do
|
71
|
+
@client.exec_script('println("hi")').should == "hi\n"
|
72
72
|
end
|
73
73
|
end
|
74
74
|
end
|
data/spec/func_tests/job_spec.rb
CHANGED
@@ -481,6 +481,14 @@ describe JenkinsApi::Client::Job do
|
|
481
481
|
end
|
482
482
|
|
483
483
|
describe "#build" do
|
484
|
+
|
485
|
+
def wait_for_job_to_finish(job_name)
|
486
|
+
while @client.job.get_current_build_status(@job_name) == "running" do
|
487
|
+
# Waiting for this job to finish so it doesn't affect other tests
|
488
|
+
sleep 10
|
489
|
+
end
|
490
|
+
end
|
491
|
+
|
484
492
|
it "Should build the specified job" do
|
485
493
|
@client.job.get_current_build_status(
|
486
494
|
@job_name
|
@@ -489,14 +497,89 @@ describe JenkinsApi::Client::Job do
|
|
489
497
|
# As of Jenkins version 1.519 the job build responds with a 201
|
490
498
|
# status code.
|
491
499
|
@valid_post_responses.should include(response.to_i)
|
492
|
-
# Sleep for
|
500
|
+
# Sleep for 10 seconds so we don't hit the Jenkins quiet period (5
|
493
501
|
# seconds)
|
494
|
-
sleep
|
502
|
+
sleep 10
|
495
503
|
@client.job.get_current_build_status(@job_name).should == "running"
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
504
|
+
wait_for_job_to_finish(@job_name)
|
505
|
+
end
|
506
|
+
|
507
|
+
it "Should build the specified job (wait for start)" do
|
508
|
+
@client.job.get_current_build_status(
|
509
|
+
@job_name
|
510
|
+
).should_not == "running"
|
511
|
+
expected_build_id = (@client.job.get_current_build_number(@job_name) || 0) + 1
|
512
|
+
|
513
|
+
build_opts = {
|
514
|
+
'build_start_timeout' => 10,
|
515
|
+
'progress_proc' => lambda do |max_wait, curr_wait, poll_count|
|
516
|
+
puts "Waited #{curr_wait}s of #{max_wait}s max - poll count = #{poll_count}"
|
517
|
+
end,
|
518
|
+
'completion_proc' => lambda do |build_number, cancelled|
|
519
|
+
if build_number
|
520
|
+
puts "Wait over: build #{build_number} started"
|
521
|
+
else
|
522
|
+
puts "Wait over: build not started, build #{cancelled ? "" : "NOT "} cancelled"
|
523
|
+
end
|
524
|
+
end
|
525
|
+
}
|
526
|
+
build_id = @client.job.build(@job_name, {}, build_opts)
|
527
|
+
build_id.should_not be_nil
|
528
|
+
build_id.should eql(expected_build_id)
|
529
|
+
@client.job.get_current_build_status(@job_name).should == "running"
|
530
|
+
wait_for_job_to_finish(@job_name)
|
531
|
+
end
|
532
|
+
|
533
|
+
# This build doesn't start in time, but we don't cancel it, so it will run if
|
534
|
+
# Jenkins gets to it
|
535
|
+
it "Should build the specified job (wait for start - but not long enough)" do
|
536
|
+
@client.job.get_current_build_status(
|
537
|
+
@job_name
|
538
|
+
).should_not == "running"
|
539
|
+
|
540
|
+
build_opts = {
|
541
|
+
'build_start_timeout' => 1,
|
542
|
+
'progress_proc' => lambda do |max_wait, curr_wait, poll_count|
|
543
|
+
puts "Waited #{curr_wait}s of #{max_wait}s max - poll count = #{poll_count}"
|
544
|
+
end,
|
545
|
+
'completion_proc' => lambda do |build_number, cancelled|
|
546
|
+
if build_number
|
547
|
+
puts "Wait over: build #{build_number} started"
|
548
|
+
else
|
549
|
+
puts "Wait over: build not started, build #{cancelled ? "" : "NOT "}cancelled"
|
550
|
+
end
|
551
|
+
end
|
552
|
+
}
|
553
|
+
expect( lambda { @client.job.build(@job_name, {}, build_opts) } ).to raise_error(Timeout::Error)
|
554
|
+
# Sleep for 10 seconds so we don't hit the Jenkins quiet period (5
|
555
|
+
# seconds)
|
556
|
+
sleep 10
|
557
|
+
@client.job.get_current_build_status(@job_name).should == "running"
|
558
|
+
wait_for_job_to_finish(@job_name)
|
559
|
+
end
|
560
|
+
|
561
|
+
# This build doesn't start in time, and we will attempt to cancel it so it
|
562
|
+
# doesn't run
|
563
|
+
it "Should build the specified job (wait for start - but not long enough, cancelled)" do
|
564
|
+
@client.job.get_current_build_status(
|
565
|
+
@job_name
|
566
|
+
).should_not == "running"
|
567
|
+
|
568
|
+
build_opts = {
|
569
|
+
'build_start_timeout' => 1,
|
570
|
+
'cancel_on_build_start_timeout' => true,
|
571
|
+
'progress_proc' => lambda do |max_wait, curr_wait, poll_count|
|
572
|
+
puts "Waited #{curr_wait}s of #{max_wait}s max - poll count = #{poll_count}"
|
573
|
+
end,
|
574
|
+
'completion_proc' => lambda do |build_number, cancelled|
|
575
|
+
if build_number
|
576
|
+
puts "Wait over: build #{build_number} started"
|
577
|
+
else
|
578
|
+
puts "Wait over: build not started, build #{cancelled ? "" : "NOT "}cancelled"
|
579
|
+
end
|
580
|
+
end
|
581
|
+
}
|
582
|
+
expect( lambda { @client.job.build(@job_name, {}, build_opts) } ).to raise_error(Timeout::Error)
|
500
583
|
end
|
501
584
|
end
|
502
585
|
|
@@ -527,7 +610,7 @@ describe JenkinsApi::Client::Job do
|
|
527
610
|
@job_name
|
528
611
|
).should_not == "running"
|
529
612
|
@client.job.build(@job_name)
|
530
|
-
sleep
|
613
|
+
sleep 10
|
531
614
|
@client.job.get_current_build_status(@job_name).should == "running"
|
532
615
|
sleep 5
|
533
616
|
@valid_post_responses.should include(
|
@@ -21,7 +21,7 @@ describe JenkinsApi::Client::Node do
|
|
21
21
|
puts e.message
|
22
22
|
end
|
23
23
|
|
24
|
-
@client.node.
|
24
|
+
@client.node.create_dumb_slave(
|
25
25
|
:name => "slave",
|
26
26
|
:slave_host => "10.0.0.1",
|
27
27
|
:private_key_file => "/root/.ssh/id_rsa"
|
@@ -43,12 +43,12 @@ describe JenkinsApi::Client::Node do
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
-
describe "#
|
46
|
+
describe "#create_dumb_slave" do
|
47
47
|
|
48
48
|
def test_and_validate(params)
|
49
49
|
name = params[:name]
|
50
50
|
@valid_post_responses.should include(
|
51
|
-
@client.node.
|
51
|
+
@client.node.create_dumb_slave(params).to_i
|
52
52
|
)
|
53
53
|
@client.node.list(name).include?(name).should be_true
|
54
54
|
@valid_post_responses.should include(
|
@@ -79,7 +79,7 @@ describe JenkinsApi::Client::Node do
|
|
79
79
|
:private_key_file => "/root/.ssh/id_rsa"
|
80
80
|
}
|
81
81
|
expect(
|
82
|
-
lambda{ @client.node.
|
82
|
+
lambda{ @client.node.create_dumb_slave(params) }
|
83
83
|
).to raise_error(ArgumentError)
|
84
84
|
end
|
85
85
|
it "fails if slave_host is missing" do
|
@@ -88,7 +88,7 @@ describe JenkinsApi::Client::Node do
|
|
88
88
|
:private_key_file => "/root/.ssh/id_rsa"
|
89
89
|
}
|
90
90
|
expect(
|
91
|
-
lambda{ @client.node.
|
91
|
+
lambda{ @client.node.create_dumb_slave(params) }
|
92
92
|
).to raise_error(ArgumentError)
|
93
93
|
end
|
94
94
|
it "fails if private_key_file is missing" do
|
@@ -97,7 +97,7 @@ describe JenkinsApi::Client::Node do
|
|
97
97
|
:slave_host => "10.10.10.10"
|
98
98
|
}
|
99
99
|
expect(
|
100
|
-
lambda{ @client.node.
|
100
|
+
lambda{ @client.node.create_dumb_slave(params) }
|
101
101
|
).to raise_error(ArgumentError)
|
102
102
|
end
|
103
103
|
it "fails if the slave already exists in Jenkins" do
|
@@ -107,10 +107,10 @@ describe JenkinsApi::Client::Node do
|
|
107
107
|
:private_key_file => "/root/.ssh/id_rsa"
|
108
108
|
}
|
109
109
|
@valid_post_responses.should include(
|
110
|
-
@client.node.
|
110
|
+
@client.node.create_dumb_slave(params).to_i
|
111
111
|
)
|
112
112
|
expect(
|
113
|
-
lambda{ @client.node.
|
113
|
+
lambda{ @client.node.create_dumb_slave(params) }
|
114
114
|
).to raise_error(JenkinsApi::Exceptions::NodeAlreadyExists)
|
115
115
|
@valid_post_responses.should include(
|
116
116
|
@client.node.delete(params[:name]).to_i
|
@@ -126,7 +126,7 @@ describe JenkinsApi::Client::Node do
|
|
126
126
|
:private_key_file => "/root/.ssh/id_rsa"
|
127
127
|
}
|
128
128
|
@valid_post_responses.should include(
|
129
|
-
@client.node.
|
129
|
+
@client.node.create_dumb_slave(params).to_i
|
130
130
|
)
|
131
131
|
@valid_post_responses.should include(
|
132
132
|
@client.node.delete(params[:name]).to_i
|
@@ -0,0 +1,148 @@
|
|
1
|
+
#
|
2
|
+
# Specifying JenkinsApi::Client::PluginManager class capabilities
|
3
|
+
# Author Kannan Manickam <arangamani.kannan@gmail.com>
|
4
|
+
#
|
5
|
+
|
6
|
+
require File.expand_path('../spec_helper', __FILE__)
|
7
|
+
require 'yaml'
|
8
|
+
|
9
|
+
describe JenkinsApi::Client::PluginManager do
|
10
|
+
context "With properly initialized client" do
|
11
|
+
before(:all) do
|
12
|
+
@creds_file = '~/.jenkins_api_client/spec.yml'
|
13
|
+
@valid_post_responses = [200, 201, 302]
|
14
|
+
@test_plugin = "scripttrigger"
|
15
|
+
@test_plugins = ["text-finder", "terminal", "warnings"]
|
16
|
+
begin
|
17
|
+
@client = JenkinsApi::Client.new(
|
18
|
+
YAML.load_file(File.expand_path(@creds_file, __FILE__))
|
19
|
+
)
|
20
|
+
@client.init_update_center
|
21
|
+
sleep 30
|
22
|
+
rescue Exception => e
|
23
|
+
puts "WARNING: Credentials are not set properly."
|
24
|
+
puts e.message
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "InstanceMethods" do
|
29
|
+
describe "#list_installed" do
|
30
|
+
it "lists all installed plugins in jenkins" do
|
31
|
+
@client.plugin.list_installed.class.should == Hash
|
32
|
+
end
|
33
|
+
supported_filters = [
|
34
|
+
:active, :bundled, :deleted, :downgradable, :enabled,
|
35
|
+
:hasUpdate, :pinned
|
36
|
+
]
|
37
|
+
supported_filters.each do |filter|
|
38
|
+
it "lists all installed plugins matching filter '#{filter}'" do
|
39
|
+
@client.plugin.list_installed(filter => true).class.should == Hash
|
40
|
+
end
|
41
|
+
end
|
42
|
+
it "raises an error if unsupported filter is specified" do
|
43
|
+
expect(
|
44
|
+
lambda { @client.plugin.list_installed(:unsupported => true) }
|
45
|
+
).to raise_error(ArgumentError)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "#list_available" do
|
50
|
+
it "lists all available plugins in jenkins update center" do
|
51
|
+
@client.plugin.list_available.class.should == Hash
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "#list_updates" do
|
56
|
+
it "lists all available plugin updates in jenkins update center" do
|
57
|
+
@client.plugin.list_updates.class.should == Hash
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "#install, #restart_required?" do
|
62
|
+
it "installs a single plugin given as a string" do
|
63
|
+
@client.plugin.install(@test_plugin)
|
64
|
+
# Plugin installation might take a bit
|
65
|
+
sleep 5
|
66
|
+
@client.system.restart(true) if @client.plugin.restart_required?
|
67
|
+
@client.system.wait_for_ready
|
68
|
+
@client.plugin.list_installed.keys.should include(@test_plugin)
|
69
|
+
end
|
70
|
+
it "installs multiple plugins given as an array" do
|
71
|
+
@client.plugin.install(@test_plugins)
|
72
|
+
# Plugin installation might take a bit
|
73
|
+
sleep 15
|
74
|
+
@client.system.restart(true) if @client.plugin.restart_required?
|
75
|
+
@client.system.wait_for_ready
|
76
|
+
installed = @client.plugin.list_installed.keys
|
77
|
+
@test_plugins.all? { |plugin| installed.include?(plugin) }.
|
78
|
+
should == true
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "#disable, #restart_required?" do
|
83
|
+
it "disables a single plugin given as a string" do
|
84
|
+
@client.plugin.disable(@test_plugin)
|
85
|
+
# Plugin installation might take a bit
|
86
|
+
sleep 5
|
87
|
+
@client.system.restart(true)
|
88
|
+
@client.system.wait_for_ready
|
89
|
+
@client.plugin.list_installed(:active => false).keys.
|
90
|
+
should include(@test_plugin)
|
91
|
+
end
|
92
|
+
it "disables multiple plugins given as an array" do
|
93
|
+
@client.plugin.disable(@test_plugins)
|
94
|
+
# Plugin installation might take a bit
|
95
|
+
sleep 5
|
96
|
+
@client.system.restart(true)
|
97
|
+
@client.system.wait_for_ready
|
98
|
+
installed = @client.plugin.list_installed(:active => false).keys
|
99
|
+
@test_plugins.all? { |plugin| installed.include?(plugin) }.
|
100
|
+
should == true
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe "#enable, #restart_required?" do
|
105
|
+
it "enables a single plugin given as a string" do
|
106
|
+
@client.plugin.enable(@test_plugin)
|
107
|
+
# Plugin installation might take a bit
|
108
|
+
sleep 5
|
109
|
+
@client.system.restart(true)
|
110
|
+
@client.system.wait_for_ready
|
111
|
+
@client.plugin.list_installed(:active => true).keys.
|
112
|
+
should include(@test_plugin)
|
113
|
+
end
|
114
|
+
it "enables multiple plugins given as an array" do
|
115
|
+
@client.plugin.enable(@test_plugins)
|
116
|
+
# Plugin installation might take a bit
|
117
|
+
sleep 5
|
118
|
+
@client.system.restart(true)
|
119
|
+
@client.system.wait_for_ready
|
120
|
+
installed = @client.plugin.list_installed(:active => true).keys
|
121
|
+
@test_plugins.all? { |plugin| installed.include?(plugin) }.
|
122
|
+
should == true
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
describe "#uninstall, #restart_required?" do
|
127
|
+
it "uninstalls a single plugin given as a string" do
|
128
|
+
@client.plugin.uninstall(@test_plugin)
|
129
|
+
# Plugin uninstallation might take a bit
|
130
|
+
sleep 5
|
131
|
+
@client.system.restart(true) if @client.plugin.restart_required?
|
132
|
+
@client.system.wait_for_ready
|
133
|
+
@client.plugin.list_installed.keys.should_not include(@test_plugin)
|
134
|
+
end
|
135
|
+
it "uninstalls multiple plugins given as an array" do
|
136
|
+
@client.plugin.uninstall(@test_plugins)
|
137
|
+
# Plugin uninstallation might take a bit
|
138
|
+
sleep 5
|
139
|
+
@client.system.restart(true) if @client.plugin.restart_required?
|
140
|
+
@client.system.wait_for_ready
|
141
|
+
installed = @client.plugin.list_installed.keys
|
142
|
+
@test_plugins.all? { |plugin| installed.include?(plugin) }.
|
143
|
+
should == false
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|