jenkins_api_client 0.12.1 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +2 -0
- data/CHANGELOG.md +30 -1
- data/CONTRIBUTORS.md +13 -0
- data/README.md +126 -66
- data/Vagrantfile +85 -0
- data/config/login.yml.example +4 -0
- data/jenkins_api_client.gemspec +12 -12
- data/lib/jenkins_api_client/build_queue.rb +34 -0
- data/lib/jenkins_api_client/cli/job.rb +4 -11
- data/lib/jenkins_api_client/client.rb +241 -79
- data/lib/jenkins_api_client/exceptions.rb +109 -21
- data/lib/jenkins_api_client/job.rb +143 -28
- data/lib/jenkins_api_client/node.rb +16 -8
- data/lib/jenkins_api_client/system.rb +21 -2
- data/lib/jenkins_api_client/version.rb +2 -2
- data/lib/jenkins_api_client/view.rb +18 -1
- data/spec/func_tests/client_spec.rb +9 -15
- data/spec/func_tests/job_spec.rb +190 -51
- data/spec/func_tests/node_spec.rb +29 -12
- data/spec/func_tests/spec_helper.rb +1 -7
- data/spec/func_tests/system_spec.rb +25 -6
- data/spec/func_tests/view_spec.rb +101 -34
- data/spec/unit_tests/build_queue_spec.rb +4 -0
- data/spec/unit_tests/client_spec.rb +2 -36
- data/spec/unit_tests/job_spec.rb +48 -5
- data/spec/unit_tests/node_spec.rb +4 -7
- data/spec/unit_tests/spec_helper.rb +1 -0
- data/spec/unit_tests/system_spec.rb +15 -2
- data/spec/unit_tests/view_spec.rb +11 -7
- data/travis/jenkins_config_with_crumb.xml +67 -0
- data/travis/setup_crumb.sh +11 -0
- data/travis/spec.yml +4 -0
- metadata +158 -140
@@ -10,6 +10,7 @@ describe JenkinsApi::Client::Node do
|
|
10
10
|
context "With properly initialized client" do
|
11
11
|
before(:all) do
|
12
12
|
@creds_file = '~/.jenkins_api_client/spec.yml'
|
13
|
+
@valid_post_responses = [200, 201, 302]
|
13
14
|
@node_name = 'master'
|
14
15
|
begin
|
15
16
|
@client = JenkinsApi::Client.new(
|
@@ -46,9 +47,13 @@ describe JenkinsApi::Client::Node do
|
|
46
47
|
|
47
48
|
def test_and_validate(params)
|
48
49
|
name = params[:name]
|
49
|
-
@
|
50
|
+
@valid_post_responses.should include(
|
51
|
+
@client.node.create_dump_slave(params).to_i
|
52
|
+
)
|
50
53
|
@client.node.list(name).include?(name).should be_true
|
51
|
-
@
|
54
|
+
@valid_post_responses.should include(
|
55
|
+
@client.node.delete(params[:name]).to_i
|
56
|
+
)
|
52
57
|
@client.node.list(name).include?(name).should be_false
|
53
58
|
end
|
54
59
|
|
@@ -75,7 +80,7 @@ describe JenkinsApi::Client::Node do
|
|
75
80
|
}
|
76
81
|
expect(
|
77
82
|
lambda{ @client.node.create_dump_slave(params) }
|
78
|
-
).to raise_error
|
83
|
+
).to raise_error(ArgumentError)
|
79
84
|
end
|
80
85
|
it "fails if slave_host is missing" do
|
81
86
|
params = {
|
@@ -84,7 +89,7 @@ describe JenkinsApi::Client::Node do
|
|
84
89
|
}
|
85
90
|
expect(
|
86
91
|
lambda{ @client.node.create_dump_slave(params) }
|
87
|
-
).to raise_error
|
92
|
+
).to raise_error(ArgumentError)
|
88
93
|
end
|
89
94
|
it "fails if private_key_file is missing" do
|
90
95
|
params = {
|
@@ -93,7 +98,7 @@ describe JenkinsApi::Client::Node do
|
|
93
98
|
}
|
94
99
|
expect(
|
95
100
|
lambda{ @client.node.create_dump_slave(params) }
|
96
|
-
).to raise_error
|
101
|
+
).to raise_error(ArgumentError)
|
97
102
|
end
|
98
103
|
it "fails if the slave already exists in Jenkins" do
|
99
104
|
params = {
|
@@ -101,11 +106,15 @@ describe JenkinsApi::Client::Node do
|
|
101
106
|
:slave_host => "10.10.10.10",
|
102
107
|
:private_key_file => "/root/.ssh/id_rsa"
|
103
108
|
}
|
104
|
-
@
|
109
|
+
@valid_post_responses.should include(
|
110
|
+
@client.node.create_dump_slave(params).to_i
|
111
|
+
)
|
105
112
|
expect(
|
106
113
|
lambda{ @client.node.create_dump_slave(params) }
|
107
|
-
).to raise_error
|
108
|
-
@
|
114
|
+
).to raise_error(JenkinsApi::Exceptions::NodeAlreadyExists)
|
115
|
+
@valid_post_responses.should include(
|
116
|
+
@client.node.delete(params[:name]).to_i
|
117
|
+
)
|
109
118
|
end
|
110
119
|
end
|
111
120
|
|
@@ -116,8 +125,12 @@ describe JenkinsApi::Client::Node do
|
|
116
125
|
:slave_host => "10.10.10.10",
|
117
126
|
:private_key_file => "/root/.ssh/id_rsa"
|
118
127
|
}
|
119
|
-
@
|
120
|
-
|
128
|
+
@valid_post_responses.should include(
|
129
|
+
@client.node.create_dump_slave(params).to_i
|
130
|
+
)
|
131
|
+
@valid_post_responses.should include(
|
132
|
+
@client.node.delete(params[:name]).to_i
|
133
|
+
)
|
121
134
|
end
|
122
135
|
it "raises an error if the slave doesn't exist in Jenkins" do
|
123
136
|
expect(
|
@@ -167,8 +180,12 @@ describe JenkinsApi::Client::Node do
|
|
167
180
|
|
168
181
|
describe "#change_mode" do
|
169
182
|
it "changes the mode of the given slave to the given mode" do
|
170
|
-
@
|
171
|
-
|
183
|
+
@valid_post_responses.should include(
|
184
|
+
@client.node.change_mode("slave", "exclusive").to_i
|
185
|
+
)
|
186
|
+
@valid_post_responses.should include(
|
187
|
+
@client.node.change_mode("slave", "normal").to_i
|
188
|
+
)
|
172
189
|
end
|
173
190
|
end
|
174
191
|
|
@@ -10,13 +10,8 @@ require 'pp'
|
|
10
10
|
require 'yaml'
|
11
11
|
require 'nokogiri'
|
12
12
|
|
13
|
-
#RSpec.configure do |config|
|
14
|
-
# config.mock_with :flexmock
|
15
|
-
#end
|
16
|
-
|
17
13
|
module JenkinsApiSpecHelper
|
18
14
|
class Helper
|
19
|
-
|
20
15
|
def create_job_xml
|
21
16
|
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') { |xml|
|
22
17
|
xml.project {
|
@@ -33,7 +28,7 @@ module JenkinsApiSpecHelper
|
|
33
28
|
xml.concurrentBuild "false"
|
34
29
|
xml.builders {
|
35
30
|
xml.send("hudson.tasks.Shell") {
|
36
|
-
xml.command "\necho 'going to take a nice nap'\nsleep
|
31
|
+
xml.command "\necho 'going to take a nice nap'\nsleep 15\necho 'took a nice nap'"
|
37
32
|
}
|
38
33
|
}
|
39
34
|
xml.publishers
|
@@ -42,6 +37,5 @@ module JenkinsApiSpecHelper
|
|
42
37
|
}
|
43
38
|
builder.to_xml
|
44
39
|
end
|
45
|
-
|
46
40
|
end
|
47
41
|
end
|
@@ -10,8 +10,11 @@ describe JenkinsApi::Client::System do
|
|
10
10
|
context "With properly initialized client" do
|
11
11
|
before(:all) do
|
12
12
|
@creds_file = '~/.jenkins_api_client/spec.yml'
|
13
|
+
@valid_post_responses = [200, 201, 302]
|
13
14
|
begin
|
14
|
-
@client = JenkinsApi::Client.new(
|
15
|
+
@client = JenkinsApi::Client.new(
|
16
|
+
YAML.load_file(File.expand_path(@creds_file, __FILE__))
|
17
|
+
)
|
15
18
|
rescue Exception => e
|
16
19
|
puts "WARNING: Credentials are not set properly."
|
17
20
|
puts e.message
|
@@ -22,19 +25,25 @@ describe JenkinsApi::Client::System do
|
|
22
25
|
|
23
26
|
describe "#quiet_down" do
|
24
27
|
it "Should be able to quiet down a Jenkins server" do
|
25
|
-
@
|
28
|
+
@valid_post_responses.should include(
|
29
|
+
@client.system.quiet_down.to_i
|
30
|
+
)
|
26
31
|
end
|
27
32
|
end
|
28
33
|
|
29
34
|
describe "#cancel_quiet_down" do
|
30
35
|
it "Should be able to cancel the quiet down a Jenkins server" do
|
31
|
-
@
|
36
|
+
@valid_post_responses.should include(
|
37
|
+
@client.system.cancel_quiet_down.to_i
|
38
|
+
)
|
32
39
|
end
|
33
40
|
end
|
34
41
|
|
35
42
|
describe "#restart" do
|
36
43
|
it "Should be able to restart a Jenkins server safely" do
|
37
|
-
@
|
44
|
+
@valid_post_responses.should include(
|
45
|
+
@client.system.restart.to_i
|
46
|
+
)
|
38
47
|
end
|
39
48
|
|
40
49
|
it "Should be able to wait after a safe restart" do
|
@@ -42,7 +51,9 @@ describe JenkinsApi::Client::System do
|
|
42
51
|
end
|
43
52
|
|
44
53
|
it "Should be able to force restart a Jenkins server" do
|
45
|
-
@
|
54
|
+
@valid_post_responses.should include(
|
55
|
+
@client.system.restart(true).to_i
|
56
|
+
)
|
46
57
|
end
|
47
58
|
|
48
59
|
it "Should be able to wait after a force restart" do
|
@@ -52,13 +63,21 @@ describe JenkinsApi::Client::System do
|
|
52
63
|
|
53
64
|
describe "#reload" do
|
54
65
|
it "Should be able to reload a Jenkins server" do
|
55
|
-
@
|
66
|
+
@valid_post_responses.should include(
|
67
|
+
@client.system.reload.to_i
|
68
|
+
)
|
56
69
|
end
|
57
70
|
it "Should be able to wait after a force restart" do
|
58
71
|
@client.system.wait_for_ready.should == true
|
59
72
|
end
|
60
73
|
end
|
61
74
|
|
75
|
+
describe "#list_users" do
|
76
|
+
it "Should be able to get a list of users" do
|
77
|
+
@client.system.list_users.size == 1
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
62
81
|
end
|
63
82
|
|
64
83
|
end
|
@@ -10,6 +10,7 @@ describe JenkinsApi::Client::View do
|
|
10
10
|
context "With properly initialized client" do
|
11
11
|
before(:all) do
|
12
12
|
@creds_file = '~/.jenkins_api_client/spec.yml'
|
13
|
+
@valid_post_responses = [200, 201, 302]
|
13
14
|
@node_name = 'master'
|
14
15
|
begin
|
15
16
|
@client = JenkinsApi::Client.new(
|
@@ -21,7 +22,9 @@ describe JenkinsApi::Client::View do
|
|
21
22
|
end
|
22
23
|
|
23
24
|
# Create a view that can be used for tests
|
24
|
-
@
|
25
|
+
@valid_post_responses.should include(
|
26
|
+
@client.view.create("general_purpose_view").to_i
|
27
|
+
)
|
25
28
|
end
|
26
29
|
|
27
30
|
describe "InstanceMethods" do
|
@@ -35,42 +38,75 @@ describe JenkinsApi::Client::View do
|
|
35
38
|
describe "#create" do
|
36
39
|
it "accepts the name of the view and creates the view" do
|
37
40
|
name = "test_view"
|
38
|
-
@
|
41
|
+
@valid_post_responses.should include(
|
42
|
+
@client.view.create(name).to_i
|
43
|
+
)
|
39
44
|
@client.view.list(name).include?(name).should be_true
|
40
|
-
@
|
45
|
+
@valid_post_responses.should include(
|
46
|
+
@client.view.delete(name).to_i
|
47
|
+
)
|
41
48
|
end
|
42
49
|
it "accepts spaces and other characters in the view name" do
|
43
50
|
name = "test view with spaces and {special characters}"
|
44
|
-
@
|
51
|
+
@valid_post_responses.should include(
|
52
|
+
@client.view.create(name).to_i
|
53
|
+
)
|
45
54
|
@client.view.list(name).include?(name).should be_true
|
46
|
-
@
|
55
|
+
@valid_post_responses.should include(
|
56
|
+
@client.view.delete(name).to_i
|
57
|
+
)
|
47
58
|
end
|
48
59
|
it "accepts the name of view and creates a listview" do
|
49
60
|
name = "test_view"
|
50
|
-
@
|
61
|
+
@valid_post_responses.should include(
|
62
|
+
@client.view.create(name, "listview").to_i
|
63
|
+
)
|
51
64
|
@client.view.list(name).include?(name).should be_true
|
52
|
-
@
|
65
|
+
@valid_post_responses.should include(
|
66
|
+
@client.view.delete(name).to_i
|
67
|
+
)
|
53
68
|
end
|
54
69
|
it "accepts the name of view and creates a myview" do
|
55
70
|
name = "test_view"
|
56
|
-
@
|
71
|
+
@valid_post_responses.should include(
|
72
|
+
@client.view.create(name, "myview").to_i
|
73
|
+
)
|
57
74
|
@client.view.list(name).include?(name).should be_true
|
58
|
-
@
|
75
|
+
@valid_post_responses.should include(
|
76
|
+
@client.view.delete(name).to_i
|
77
|
+
)
|
59
78
|
end
|
60
79
|
it "raises an error when unsupported view type is specified" do
|
61
80
|
expect(
|
62
81
|
lambda { @client.view.create(name, "awesomeview") }
|
63
82
|
).to raise_error
|
64
83
|
end
|
84
|
+
it "raises proper error if the view already exists" do
|
85
|
+
name = "duplicate_view"
|
86
|
+
@valid_post_responses.should include(
|
87
|
+
@client.view.create(name, "listview").to_i
|
88
|
+
)
|
89
|
+
@client.view.list(name).include?(name).should be_true
|
90
|
+
expect(
|
91
|
+
lambda { @client.view.create(name, "listview") }
|
92
|
+
).to raise_error(JenkinsApi::Exceptions::ViewAlreadyExists)
|
93
|
+
@valid_post_responses.should include(
|
94
|
+
@client.view.delete(name).to_i
|
95
|
+
)
|
96
|
+
end
|
65
97
|
end
|
66
98
|
|
67
99
|
describe "#create_list_view" do
|
68
100
|
|
69
101
|
def test_and_validate(params)
|
70
102
|
name = params[:name]
|
71
|
-
@
|
103
|
+
@valid_post_responses.should include(
|
104
|
+
@client.view.create_list_view(params).to_i
|
105
|
+
)
|
72
106
|
@client.view.list(name).include?(name).should be_true
|
73
|
-
@
|
107
|
+
@valid_post_responses.should include(
|
108
|
+
@client.view.delete(name).to_i
|
109
|
+
)
|
74
110
|
@client.view.list(name).include?(name).should be_false
|
75
111
|
end
|
76
112
|
|
@@ -112,16 +148,34 @@ describe JenkinsApi::Client::View do
|
|
112
148
|
}
|
113
149
|
test_and_validate(params)
|
114
150
|
end
|
151
|
+
it "raises an error when the input parameters is not a Hash" do
|
152
|
+
expect(
|
153
|
+
lambda {
|
154
|
+
@client.view.create_list_view("a_string")
|
155
|
+
}
|
156
|
+
).to raise_error(ArgumentError)
|
157
|
+
end
|
158
|
+
it "raises an error when the required name paremeter is missing" do
|
159
|
+
expect(
|
160
|
+
lambda {
|
161
|
+
@client.view.create_list_view(:description => "awesomeview")
|
162
|
+
}
|
163
|
+
).to raise_error(ArgumentError)
|
164
|
+
end
|
115
165
|
end
|
116
166
|
|
117
167
|
describe "#delete" do
|
118
168
|
name = "test_view_to_delete"
|
119
169
|
before(:all) do
|
120
|
-
@
|
170
|
+
@valid_post_responses.should include(
|
171
|
+
@client.view.create(name).to_i
|
172
|
+
)
|
121
173
|
end
|
122
174
|
it "accepts the name of the view and deletes from Jenkins" do
|
123
175
|
@client.view.list(name).include?(name).should be_true
|
124
|
-
@
|
176
|
+
@valid_post_responses.should include(
|
177
|
+
@client.view.delete(name).to_i
|
178
|
+
)
|
125
179
|
@client.view.list(name).include?(name).should be_false
|
126
180
|
end
|
127
181
|
end
|
@@ -140,15 +194,19 @@ describe JenkinsApi::Client::View do
|
|
140
194
|
|
141
195
|
describe "#add_job" do
|
142
196
|
before(:all) do
|
143
|
-
@
|
144
|
-
|
145
|
-
|
197
|
+
@valid_post_responses.should include(
|
198
|
+
@client.job.create_freestyle(
|
199
|
+
:name => "test_job_for_view"
|
200
|
+
).to_i
|
201
|
+
)
|
146
202
|
end
|
147
203
|
it "accepts the job and and adds it to the specified view" do
|
148
|
-
@
|
149
|
-
|
150
|
-
|
151
|
-
|
204
|
+
@valid_post_responses.should include(
|
205
|
+
@client.view.add_job(
|
206
|
+
"general_purpose_view",
|
207
|
+
"test_job_for_view"
|
208
|
+
).to_i
|
209
|
+
)
|
152
210
|
@client.view.list_jobs(
|
153
211
|
"general_purpose_view"
|
154
212
|
).include?("test_job_for_view").should be_true
|
@@ -158,23 +216,29 @@ describe JenkinsApi::Client::View do
|
|
158
216
|
describe "#remove_job" do
|
159
217
|
before(:all) do
|
160
218
|
unless @client.job.exists?("test_job_for_view")
|
161
|
-
@
|
162
|
-
|
163
|
-
|
219
|
+
@valid_post_responses.should include(
|
220
|
+
@client.job.create_freestyle(
|
221
|
+
:name => "test_job_for_view"
|
222
|
+
).to_i
|
223
|
+
)
|
164
224
|
end
|
165
225
|
unless @client.view.list_jobs(
|
166
226
|
"general_purpose_view").include?("test_job_for_view")
|
167
|
-
@
|
168
|
-
|
169
|
-
|
170
|
-
|
227
|
+
@valid_post_responses.should include(
|
228
|
+
@client.view.add_job(
|
229
|
+
"general_purpose_job",
|
230
|
+
"test_job_for_view"
|
231
|
+
).to_i
|
232
|
+
)
|
171
233
|
end
|
172
234
|
end
|
173
235
|
it "accepts the job name and removes it from the specified view" do
|
174
|
-
@
|
175
|
-
|
176
|
-
|
177
|
-
|
236
|
+
@valid_post_responses.should include(
|
237
|
+
@client.view.remove_job(
|
238
|
+
"general_purpose_view",
|
239
|
+
"test_job_for_view"
|
240
|
+
).to_i
|
241
|
+
)
|
178
242
|
end
|
179
243
|
end
|
180
244
|
|
@@ -199,11 +263,14 @@ describe JenkinsApi::Client::View do
|
|
199
263
|
end
|
200
264
|
|
201
265
|
after(:all) do
|
202
|
-
@
|
266
|
+
@valid_post_responses.should include(
|
267
|
+
@client.view.delete("general_purpose_view").to_i
|
268
|
+
)
|
203
269
|
if @client.job.exists?("test_job_for_view")
|
204
|
-
@
|
270
|
+
@valid_post_responses.should include(
|
271
|
+
@client.job.delete("test_job_for_view").to_i
|
272
|
+
)
|
205
273
|
end
|
206
274
|
end
|
207
|
-
|
208
275
|
end
|
209
276
|
end
|
@@ -4,6 +4,8 @@ describe JenkinsApi::Client::BuildQueue do
|
|
4
4
|
context "With properly initialized Client" do
|
5
5
|
before do
|
6
6
|
@client = mock
|
7
|
+
mock_logger = Logger.new "/dev/null"
|
8
|
+
@client.should_receive(:logger).and_return(mock_logger)
|
7
9
|
@queue = JenkinsApi::Client::BuildQueue.new(@client)
|
8
10
|
@sample_queue_json = {
|
9
11
|
"items" => [
|
@@ -38,6 +40,8 @@ describe JenkinsApi::Client::BuildQueue do
|
|
38
40
|
describe "InstanceMethods" do
|
39
41
|
describe "#initialize" do
|
40
42
|
it "initializes by receiving an instance of client object" do
|
43
|
+
mock_logger = Logger.new "/dev/null"
|
44
|
+
@client.should_receive(:logger).and_return(mock_logger)
|
41
45
|
expect(
|
42
46
|
lambda{ JenkinsApi::Client::BuildQueue.new(@client) }
|
43
47
|
).not_to raise_error
|
@@ -7,7 +7,8 @@ describe JenkinsApi::Client do
|
|
7
7
|
:server_ip => '127.0.0.1',
|
8
8
|
:server_port => 8080,
|
9
9
|
:username => 'username',
|
10
|
-
:password => 'password'
|
10
|
+
:password => 'password',
|
11
|
+
:log_location => '/dev/null'
|
11
12
|
)
|
12
13
|
end
|
13
14
|
|
@@ -141,41 +142,6 @@ describe JenkinsApi::Client do
|
|
141
142
|
end
|
142
143
|
|
143
144
|
describe "InstanceMethods" do
|
144
|
-
describe "#debug" do
|
145
|
-
it "The default for debug should be false" do
|
146
|
-
client = JenkinsApi::Client.new(
|
147
|
-
:server_ip => '127.0.0.1',
|
148
|
-
:server_port => 8080,
|
149
|
-
:username => 'username',
|
150
|
-
:password => 'password'
|
151
|
-
)
|
152
|
-
client.debug.should == false
|
153
|
-
end
|
154
|
-
|
155
|
-
it "Should be able to set the debug value" do
|
156
|
-
client = JenkinsApi::Client.new(
|
157
|
-
:server_ip => '127.0.0.1',
|
158
|
-
:server_port => 8080,
|
159
|
-
:username => 'username',
|
160
|
-
:password => 'password',
|
161
|
-
:debug => true
|
162
|
-
)
|
163
|
-
client.debug.should == true
|
164
|
-
end
|
165
|
-
|
166
|
-
it "Should be able to toggle the debug value" do
|
167
|
-
client = JenkinsApi::Client.new(
|
168
|
-
:server_ip => '127.0.0.1',
|
169
|
-
:server_port => 8080,
|
170
|
-
:username => 'username',
|
171
|
-
:password => 'password',
|
172
|
-
:debug => true
|
173
|
-
)
|
174
|
-
client.toggle_debug
|
175
|
-
client.debug.should == false
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
145
|
describe "#getroot" do
|
180
146
|
it "is defined with no parameters" do
|
181
147
|
expect(
|