rubyjobbuilderdsl 0.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.
Files changed (104) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +6 -0
  3. data/Gemfile.lock +33 -0
  4. data/LICENSE +19 -0
  5. data/Rakefile +12 -0
  6. data/docs/common.md +313 -0
  7. data/docs/flow.md +18 -0
  8. data/docs/freestyle.md +100 -0
  9. data/docs/gerrit.md +70 -0
  10. data/docs/git.md +88 -0
  11. data/docs/index.md +11 -0
  12. data/docs/multi.md +27 -0
  13. data/docs/overview.md +74 -0
  14. data/docs/postbuild.md +266 -0
  15. data/docs/view.md +13 -0
  16. data/lib/rubyjobbuilderdsl/builder.rb +69 -0
  17. data/lib/rubyjobbuilderdsl/buildstep/ant.rb +29 -0
  18. data/lib/rubyjobbuilderdsl/buildstep/copyartifact.rb +23 -0
  19. data/lib/rubyjobbuilderdsl/buildstep/inject_env.rb +18 -0
  20. data/lib/rubyjobbuilderdsl/buildstep/phase.rb +19 -0
  21. data/lib/rubyjobbuilderdsl/buildstep/phase_job.rb +26 -0
  22. data/lib/rubyjobbuilderdsl/buildstep/shell.rb +24 -0
  23. data/lib/rubyjobbuilderdsl/common/artifactory.rb +33 -0
  24. data/lib/rubyjobbuilderdsl/common/blocking_job.rb +11 -0
  25. data/lib/rubyjobbuilderdsl/common/build_timeout.rb +23 -0
  26. data/lib/rubyjobbuilderdsl/common/gerrit.rb +53 -0
  27. data/lib/rubyjobbuilderdsl/common/git.rb +76 -0
  28. data/lib/rubyjobbuilderdsl/common/logrotate.rb +24 -0
  29. data/lib/rubyjobbuilderdsl/common/parameter.rb +22 -0
  30. data/lib/rubyjobbuilderdsl/common/password.rb +12 -0
  31. data/lib/rubyjobbuilderdsl/common/pollscm.rb +10 -0
  32. data/lib/rubyjobbuilderdsl/common/scms.rb +18 -0
  33. data/lib/rubyjobbuilderdsl/common/throttle.rb +24 -0
  34. data/lib/rubyjobbuilderdsl/common/timed.rb +10 -0
  35. data/lib/rubyjobbuilderdsl/common/timestamps.rb +6 -0
  36. data/lib/rubyjobbuilderdsl/common.rb +140 -0
  37. data/lib/rubyjobbuilderdsl/deployer.rb +95 -0
  38. data/lib/rubyjobbuilderdsl/flow.rb +14 -0
  39. data/lib/rubyjobbuilderdsl/freestyle.rb +57 -0
  40. data/lib/rubyjobbuilderdsl/jenkins_client.rb +203 -0
  41. data/lib/rubyjobbuilderdsl/multijob.rb +24 -0
  42. data/lib/rubyjobbuilderdsl/postbuild/archive.rb +23 -0
  43. data/lib/rubyjobbuilderdsl/postbuild/chucknorris_publisher.rb +6 -0
  44. data/lib/rubyjobbuilderdsl/postbuild/claim_publisher.rb +6 -0
  45. data/lib/rubyjobbuilderdsl/postbuild/cloverphp_publisher.rb +36 -0
  46. data/lib/rubyjobbuilderdsl/postbuild/email_publisher.rb +23 -0
  47. data/lib/rubyjobbuilderdsl/postbuild/game_publisher.rb +6 -0
  48. data/lib/rubyjobbuilderdsl/postbuild/groovy.rb +10 -0
  49. data/lib/rubyjobbuilderdsl/postbuild/html_publisher.rb +27 -0
  50. data/lib/rubyjobbuilderdsl/postbuild/javadoc_publisher.rb +19 -0
  51. data/lib/rubyjobbuilderdsl/postbuild/logparser.rb +21 -0
  52. data/lib/rubyjobbuilderdsl/postbuild/nunit_publisher.rb +21 -0
  53. data/lib/rubyjobbuilderdsl/postbuild/pmd_publisher.rb +19 -0
  54. data/lib/rubyjobbuilderdsl/postbuild/script.rb +14 -0
  55. data/lib/rubyjobbuilderdsl/postbuild/tap_publisher.rb +44 -0
  56. data/lib/rubyjobbuilderdsl/postbuild/trigger.rb +38 -0
  57. data/lib/rubyjobbuilderdsl/postbuild/xunit_publisher.rb +35 -0
  58. data/lib/rubyjobbuilderdsl/postbuild.rb +146 -0
  59. data/lib/rubyjobbuilderdsl/view.rb +14 -0
  60. data/lib/rubyjobbuilderdsl/xml_generator.rb +839 -0
  61. data/lib/rubyjobbuilderdsl.rb +2 -0
  62. data/rubyjobbuilderdsl.gemspec +13 -0
  63. data/rubyjobbuilderdsl.sublime-project +14 -0
  64. data/run_tests.sh +7 -0
  65. data/sample/hello_mars.rb +27 -0
  66. data/sample/local.ini +4 -0
  67. data/test/test_ant.rb +38 -0
  68. data/test/test_archive.rb +24 -0
  69. data/test/test_artifactory.rb +26 -0
  70. data/test/test_blocking_job.rb +18 -0
  71. data/test/test_chucknorris_publisher.rb +17 -0
  72. data/test/test_claim_publisher.rb +17 -0
  73. data/test/test_cloverphp.rb +33 -0
  74. data/test/test_concurrent.rb +44 -0
  75. data/test/test_copyartifact.rb +45 -0
  76. data/test/test_default_setting.rb +29 -0
  77. data/test/test_email_publisher.rb +44 -0
  78. data/test/test_flow.rb +19 -0
  79. data/test/test_freestyle.rb +52 -0
  80. data/test/test_game_publisher.rb +17 -0
  81. data/test/test_gerrit.rb +117 -0
  82. data/test/test_git.rb +80 -0
  83. data/test/test_html_publisher.rb +57 -0
  84. data/test/test_inject.rb +23 -0
  85. data/test/test_javadoc.rb +22 -0
  86. data/test/test_logparser.rb +24 -0
  87. data/test/test_logrotate.rb +22 -0
  88. data/test/test_multijob.rb +50 -0
  89. data/test/test_nunit_publisher.rb +20 -0
  90. data/test/test_parameter.rb +44 -0
  91. data/test/test_password.rb +17 -0
  92. data/test/test_pmd.rb +22 -0
  93. data/test/test_pollscm.rb +15 -0
  94. data/test/test_postbuild_groovy.rb +21 -0
  95. data/test/test_postbuild_script.rb +24 -0
  96. data/test/test_postbuild_trigger.rb +170 -0
  97. data/test/test_scms.rb +31 -0
  98. data/test/test_tap_publisher.rb +25 -0
  99. data/test/test_timed.rb +15 -0
  100. data/test/test_timeout.rb +20 -0
  101. data/test/test_timestamps.rb +14 -0
  102. data/test/test_xml_generator.rb +28 -0
  103. data/test/test_xunit_publisher.rb +22 -0
  104. metadata +173 -0
@@ -0,0 +1,203 @@
1
+ require 'net/http'
2
+ require 'net/https'
3
+ require 'uri'
4
+ require 'base64'
5
+ require 'nokogiri'
6
+
7
+ module JenkinsJob
8
+ class JenkinsClient
9
+ attr_reader :server_url, :username, :password
10
+
11
+ def initialize(server_url, username, password)
12
+ @server_url = server_url
13
+ @username = username
14
+ @password = password
15
+ end
16
+
17
+ def upload_job(name, xml)
18
+ if job_exists?(name)
19
+ $stderr.puts "updating job #{name}"
20
+ request_uri = "/job/#{name}/config.xml"
21
+ else
22
+ $stderr.puts "creating job #{name}"
23
+ request_uri = "/createItem?name=#{name}"
24
+ end
25
+
26
+ request = Net::HTTP::Post.new(request_uri)
27
+ request.content_type = 'application/xml;charset=UTF-8'
28
+ request.body = xml
29
+
30
+ response = send_request(request)
31
+
32
+ $stderr.puts response.body if response.code == '200'
33
+ end
34
+
35
+ def upload_view(name, xml)
36
+ if view_exists?(name)
37
+ $stderr.puts "updating view #{name}"
38
+ request_uri = "/view/#{name}/config.xml"
39
+ else
40
+ $stderr.puts "creating view #{name}"
41
+ request_uri = "/createView?name=#{name}"
42
+ end
43
+
44
+ request = Net::HTTP::Post.new(request_uri)
45
+ request.content_type = 'application/xml;charset=UTF-8'
46
+ request.body = xml
47
+
48
+ response = send_request(request)
49
+
50
+ $stderr.puts response.body if response.code == '200'
51
+ end
52
+
53
+ def upload_file(remote_name, content)
54
+ base64_content = Base64.strict_encode64(content)
55
+
56
+ groovy_script = <<-EOS
57
+ import org.apache.commons.codec.binary.Base64
58
+ Base64 coder = new Base64()
59
+ env = System.getenv()
60
+ new File(env['JENKINS_HOME'] + '/#{remote_name}').withWriter {
61
+ out -> out.write(new String(coder.decode('#{base64_content}')))
62
+ }
63
+ EOS
64
+
65
+ groovysh(groovy_script)
66
+ end
67
+
68
+ def groovysh(groovy_script)
69
+ $stdout.puts 'running groovy script'
70
+ request = Net::HTTP::Post.new('/scriptText')
71
+
72
+ request.set_form_data('script' => groovy_script)
73
+
74
+ response = send_request(request)
75
+
76
+ $stderr.puts response.body if response.code == '200'
77
+
78
+ response = send_request(request)
79
+
80
+ $stderr.puts response.body if response.code == '200'
81
+ end
82
+
83
+ def delete_view(name)
84
+ $stdout.puts "deleting view #{name}"
85
+ if view_exists?(name)
86
+ request = Net::HTTP::Post.new("/view/#{name}/doDelete")
87
+ response = send_request(request)
88
+ $stderr.puts response.body if response.code == '200'
89
+ else
90
+ $stdout.puts "view #{name} doesn't exists"
91
+ end
92
+ end
93
+
94
+ def delete_job(name)
95
+ $stdout.puts "deleting job #{name}"
96
+ if job_exists?(name)
97
+ request = Net::HTTP::Post.new("/job/#{name}/doDelete")
98
+ response = send_request(request)
99
+ $stderr.puts response.body if response.code == '200'
100
+ else
101
+ $stdout.puts "job #{name} doesn't exists"
102
+ end
103
+ end
104
+
105
+ def wipeout_workspace(name)
106
+ $stdout.puts "wiping out workspace of #{name}"
107
+ if job_exists?(name)
108
+ request = Net::HTTP::Post.new("/job/#{name}/doWipeOutWorkspace")
109
+ send_request(request)
110
+ else
111
+ $stdout.puts "job #{name} doesn't exists"
112
+ end
113
+ end
114
+
115
+ def disable_job(name)
116
+ $stdout.puts "disabling job #{name}"
117
+ if job_exists?(name)
118
+ request = Net::HTTP::Post.new("/job/#{name}/disable")
119
+ send_request(request)
120
+ else
121
+ $stdout.puts "job #{name} doesn't exists"
122
+ end
123
+ end
124
+
125
+ def enable_job(name)
126
+ $stdout.puts "enabling job #{name}"
127
+ if job_exists?(name)
128
+ request = Net::HTTP::Post.new("/job/#{name}/enable")
129
+ send_request(request)
130
+ else
131
+ $stdout.puts "job #{name} doesn't exists"
132
+ end
133
+ end
134
+
135
+ def trigger_job(name)
136
+ $stdout.puts "buiding job #{name}"
137
+ if job_exists?(name)
138
+ request = Net::HTTP::Post.new("/job/#{name}/build")
139
+ send_request(request)
140
+ else
141
+ $stdout.puts "job #{name} doesn't exists"
142
+ end
143
+ end
144
+
145
+ def jobs(filter)
146
+ if jenkins_xml_doc
147
+ jenkins_xml_doc.xpath('//job/name').map(&:text).select { |name| name =~ /#{filter}/ }
148
+ else
149
+ []
150
+ end
151
+ end
152
+
153
+ private
154
+
155
+ def jenkins_xml_doc(force = true)
156
+ if force || @jenkins_xml_doc.nil?
157
+ request = Net::HTTP::Get.new('/api/xml')
158
+ response = send_request(request)
159
+ if response.code == '200'
160
+ @jenkins_xml_doc = Nokogiri::XML.parse(response.body)
161
+ end
162
+ end
163
+ @jenkins_xml_doc
164
+ end
165
+
166
+ def job_exists?(name)
167
+ if jenkins_xml_doc
168
+ jenkins_xml_doc.xpath('//job/name').map(&:text).include?(name)
169
+ else
170
+ false
171
+ end
172
+ end
173
+
174
+ def view_exists?(name)
175
+ if jenkins_xml_doc
176
+ jenkins_xml_doc.xpath('//view/name').map(&:text).include?(name)
177
+ else
178
+ false
179
+ end
180
+ end
181
+
182
+ def send_request(request)
183
+ uri = URI.parse("#{server_url}")
184
+ http = Net::HTTP.new(uri.host, uri.port)
185
+
186
+ if server_url =~ /^https:/
187
+ http.use_ssl = true
188
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
189
+ end
190
+
191
+ request.basic_auth(username, password)
192
+ response = http.request(request)
193
+
194
+ if response.code.to_i < 200 || response.code.to_i > 399
195
+ $stderr.puts "Error posting to #{request.path}"
196
+ $stderr.puts "Http response.code: #{response.code}"
197
+ $stderr.puts "Http response.body:\n#{response.body}\n"
198
+ end
199
+
200
+ response
201
+ end
202
+ end
203
+ end
@@ -0,0 +1,24 @@
1
+ require_relative './common'
2
+ require_relative './buildstep/phase'
3
+ require_relative './buildstep/phase_job'
4
+
5
+ module JenkinsJob
6
+ class MultiJob < Common::Common
7
+ include BuildStep
8
+
9
+ attr_reader :name, :builders_
10
+
11
+ def initialize(name, builder)
12
+ super(builder)
13
+ @name = name
14
+ @builders_ = []
15
+ end
16
+
17
+ def phase(name, &block)
18
+ phase = Phase.new(name)
19
+ phase.instance_eval(&block) if block
20
+
21
+ @builders_ << phase
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+ module JenkinsJob
2
+ module Postbuild
3
+ class Archive < BasicObject
4
+ attr_reader :artifacts_, :exclude_, :allow_empty_, :latest_only_
5
+
6
+ def file(*value)
7
+ @artifacts_ = value.join(',')
8
+ end
9
+
10
+ def exclude(*value)
11
+ @exclude_ = value.join(',')
12
+ end
13
+
14
+ def allow_empty(value = true)
15
+ @allow_empty_ = value
16
+ end
17
+
18
+ def latest_only(value = true)
19
+ @latest_only_ = value
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,6 @@
1
+ module JenkinsJob
2
+ module Postbuild
3
+ class ChuckNorrisPublisher < BasicObject
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module JenkinsJob
2
+ module Postbuild
3
+ class ClaimPublisher < BasicObject
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,36 @@
1
+ module JenkinsJob
2
+ module Postbuild
3
+ class CloverPhpPublisher < BasicObject
4
+ attr_reader :xml_location_, :html_report_dir_, :archive_,
5
+ :healthy_target_, :unhealthy_target_, :failing_target_
6
+
7
+ def initialize
8
+ @archive_ = true
9
+ end
10
+
11
+ def xml_location(value)
12
+ @xml_location_ = value
13
+ end
14
+
15
+ def html_report_dir(value)
16
+ @html_report_dir_ = value
17
+ end
18
+
19
+ def archive(value = true)
20
+ @archive_ = value
21
+ end
22
+
23
+ def healthy_target(value)
24
+ @healthy_target_ = value
25
+ end
26
+
27
+ def unhealthy_target(value)
28
+ @unhealthy_target_ = value
29
+ end
30
+
31
+ def failing_target(value)
32
+ @failing_target_ = value
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,23 @@
1
+ # dsl methods for job builder
2
+ module JenkinsJob
3
+ module Postbuild
4
+ class EmailPublisher < BasicObject
5
+ attr_reader :recipients_, :notify_every_unstable_build_, :send_to_individuals_
6
+
7
+ def initialize(recipients)
8
+ @recipients_ = recipients
9
+
10
+ @notify_every_unstable_build_ = true
11
+ @send_to_individuals_ = false
12
+ end
13
+
14
+ def notify_every_unstable_build(value)
15
+ @notify_every_unstable_build_ = value
16
+ end
17
+
18
+ def send_to_individuals(value = true)
19
+ @send_to_individuals_ = value
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,6 @@
1
+ module JenkinsJob
2
+ module Postbuild
3
+ class GamePublisher < BasicObject
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,10 @@
1
+ module JenkinsJob
2
+ module Postbuild
3
+ class PostbuildGroovy < BasicObject
4
+ attr_reader :value_
5
+ def initialize(value)
6
+ @value_ = value
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,27 @@
1
+ module JenkinsJob
2
+ module Postbuild
3
+ class HtmlPublisher < BasicObject
4
+ attr_reader :name, :keep_all_, :allow_missing_, :dir_, :file_
5
+
6
+ def initialize(name)
7
+ @name = name
8
+ end
9
+
10
+ def dir(value)
11
+ @dir_ = value
12
+ end
13
+
14
+ def file(value)
15
+ @file_ = value
16
+ end
17
+
18
+ def keep_all(value = true)
19
+ @keep_all_ = value
20
+ end
21
+
22
+ def allow_missing(value = true)
23
+ @allow_missing_ = value
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,19 @@
1
+ module JenkinsJob
2
+ module Postbuild
3
+ class JavaDocPublisher < BasicObject
4
+ attr_reader :doc_dir_, :keep_all_
5
+
6
+ def initialize
7
+ @keep_all_ = false
8
+ end
9
+
10
+ def doc_dir(value)
11
+ @doc_dir_ = value
12
+ end
13
+
14
+ def keep_all(value = true)
15
+ @keep_all_ = value
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,21 @@
1
+ module JenkinsJob
2
+ module Postbuild
3
+ class LogParser < BasicObject
4
+ attr_reader :rule_file_, :unstable_on_warning_, :fail_on_error_
5
+
6
+ def initialize(rule_file)
7
+ @rule_file_ = rule_file
8
+ @unstable_on_warning_ = false
9
+ @fail_on_error_ = false
10
+ end
11
+
12
+ def unstable_on_warning(value = true)
13
+ @unstable_on_warning_ = value
14
+ end
15
+
16
+ def fail_on_error(value = true)
17
+ @fail_on_error_ = value
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # dsl methods for job builder
2
+ module JenkinsJob
3
+ module Postbuild
4
+ class NUnitPublisher < BasicObject
5
+ attr_reader :test_results_pattern_, :debug_, :keep_junit_reports_,
6
+ :skip_junit_archiver_
7
+
8
+ def initialize(test_results_pattern)
9
+ @test_results_pattern_ = test_results_pattern
10
+
11
+ @debug_ = false
12
+ @keep_junit_reports_ = false
13
+ @skip_junit_archiver_ = false
14
+ end
15
+
16
+ def test_results_pattern(value)
17
+ @test_results_pattern_ = value
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ module JenkinsJob
2
+ module Postbuild
3
+ class PMDPublisher < BasicObject
4
+ attr_reader :pmd_results_, :threshold_limit_
5
+
6
+ def initialize
7
+ @threshold_limit_ = 'low'
8
+ end
9
+
10
+ def pmd_results(value)
11
+ @pmd_results_ = value
12
+ end
13
+
14
+ def threshold_limit(value)
15
+ @threshold_limit_ = value
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ module JenkinsJob
2
+ module Postbuild
3
+ class PostbuildScript < BasicObject
4
+ attr_reader :builders_
5
+ def initialize
6
+ @builders_ = []
7
+ end
8
+
9
+ def add(step)
10
+ @builders_ << step
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,44 @@
1
+ module JenkinsJob
2
+ module Postbuild
3
+ class TapPublisher < BasicObject
4
+ attr_reader :test_results_,
5
+ :verbose_,
6
+ :fail_if_no_test_results_,
7
+ :fail_if_test_fail_,
8
+ :include_diagnostics_,
9
+ :require_plan_
10
+
11
+ def initialize(test_restult)
12
+ @test_results_ = test_restult
13
+ @fail_if_test_fail_ = true
14
+ @fail_if_no_test_results_ = true
15
+ @include_diagnostics_ = true
16
+ @require_plan_ = false
17
+ end
18
+
19
+ def test_results(value)
20
+ @test_results_ = value
21
+ end
22
+
23
+ def verbose(value = true)
24
+ @verbose_ = value
25
+ end
26
+
27
+ def fail_if_no_test_results(value = true)
28
+ @fail_if_no_test_results_ = value
29
+ end
30
+
31
+ def fail_if_test_fail(value = true)
32
+ @fail_if_test_fail_ = value
33
+ end
34
+
35
+ def include_diagnostics(value = true)
36
+ @include_diagnostics_ = value
37
+ end
38
+
39
+ def require_plan(value = true)
40
+ @require_plan_ = value
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,38 @@
1
+ module JenkinsJob
2
+ module Postbuild
3
+ class PostbuildTrigger < BasicObject
4
+ attr_reader :project_, :fail_on_missing_, :file_,
5
+ :predefined_parameters_, :current_parameters_, :trigger_with_no_parameters_,
6
+ :pass_through_git_commit_
7
+
8
+ def initialize(*project)
9
+ @project_ = project
10
+ @trigger_with_no_parameters_ = false
11
+ end
12
+
13
+ def fail_on_missing(value = false)
14
+ @fail_on_missing_ = value
15
+ end
16
+
17
+ def file(value)
18
+ @file_ = value
19
+ end
20
+
21
+ def predefined_parameters(value)
22
+ @predefined_parameters_ = value.map { |key, val| "#{key}=#{val}" }.join("\n")
23
+ end
24
+
25
+ def current_parameters(value)
26
+ @current_parameters_ = value
27
+ end
28
+
29
+ def trigger_with_no_parameters(value)
30
+ @trigger_with_no_parameters_ = value
31
+ end
32
+
33
+ def pass_through_git_commit(value = true)
34
+ @pass_through_git_commit_ = value
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,35 @@
1
+ # dsl methods for job builder
2
+ module JenkinsJob
3
+ module Postbuild
4
+ class XUnitPublisher < BasicObject
5
+ attr_reader :test_results_pattern_,
6
+ :failed_threshold_, :unstable_threshold_
7
+
8
+ THRESH_HOLDS = [:total_failed_tests, :new_failed_tests,
9
+ :total_skipped_tests, :new_skipped_tests]
10
+
11
+ def initialize(test_results_pattern)
12
+ @test_results_pattern_ = test_results_pattern
13
+
14
+ @debug_ = false
15
+ @keep_junit_reports_ = false
16
+ @skip_junit_archiver_ = false
17
+
18
+ @failed_threshold_ = {}
19
+ @unstable_threshold_ = {}
20
+ end
21
+
22
+ def test_results_pattern(value)
23
+ @test_results_pattern_ = value
24
+ end
25
+
26
+ def failed_threshold(params = {})
27
+ @failed_threshold_ = params
28
+ end
29
+
30
+ def unstable_threshold(params = {})
31
+ @unstable_threshold_ = params
32
+ end
33
+ end
34
+ end
35
+ end