redhat_access_lib 1.0.6
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/Rakefile +9 -0
- data/lib/api/api.rb +43 -0
- data/lib/api/telemetry_api.rb +230 -0
- data/lib/brokers/article.rb +24 -0
- data/lib/brokers/attachment.rb +81 -0
- data/lib/brokers/broker.rb +16 -0
- data/lib/brokers/case.rb +145 -0
- data/lib/brokers/comment.rb +69 -0
- data/lib/brokers/entitlement.rb +15 -0
- data/lib/brokers/group.rb +15 -0
- data/lib/brokers/problem.rb +51 -0
- data/lib/brokers/product.rb +15 -0
- data/lib/brokers/solution.rb +22 -0
- data/lib/brokers/symptom.rb +19 -0
- data/lib/network/ftp_connection.rb +19 -0
- data/lib/network/http_connection.rb +109 -0
- data/lib/network/http_request.rb +55 -0
- data/lib/network/http_resource.rb +175 -0
- data/lib/redhat_access_lib.rb +111 -0
- data/redhat_access_lib.gemspec +16 -0
- metadata +99 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 28ee4071dfdcde44888e21d564c2671f9f7bdbdb
|
4
|
+
data.tar.gz: 69c2bb2e6c5edd63b7fb74ce6a6cf0ed83e8acb7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f0c37cd7508267505894f68fad37445640b95ba8e0d1d4882a953d849255a02135aad1d236c50c1f6adf32ca2ca3d0eb3310e7d85bfa500365c51996afb2c745
|
7
|
+
data.tar.gz: 22ab3cc62253c9645e5133787b47f7a2d41762c17232fadeb08abc9cafe80a2676f7d0727d1334def3aa1abf93ee378596e5a3a41bcfafaf0c27e34599b76565
|
data/Rakefile
ADDED
data/lib/api/api.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require_relative '../brokers/broker'
|
2
|
+
require_relative '../brokers/article'
|
3
|
+
require_relative '../brokers/case'
|
4
|
+
require_relative '../brokers/solution'
|
5
|
+
require_relative '../brokers/symptom'
|
6
|
+
require_relative '../brokers/problem'
|
7
|
+
require_relative '../brokers/attachment'
|
8
|
+
require_relative '../brokers/product'
|
9
|
+
require_relative '../brokers/entitlement'
|
10
|
+
require_relative '../brokers/comment'
|
11
|
+
require_relative '../brokers/group'
|
12
|
+
|
13
|
+
require_relative '../network/http_connection'
|
14
|
+
|
15
|
+
module RedHatSupportLib
|
16
|
+
module Api
|
17
|
+
class API
|
18
|
+
attr_reader :article_broker, :case_broker, :solution_broker
|
19
|
+
attr_reader :symptom_broker, :problem_broker, :attachment_broker
|
20
|
+
attr_reader :product_broker, :group_broker, :entitlement_broker, :comment_broker
|
21
|
+
|
22
|
+
def initialize(network_config, attachments_config)
|
23
|
+
@connection = Network::HttpConnection.new(network_config)
|
24
|
+
@article_broker = Brokers::Article.new(@connection)
|
25
|
+
@case_broker = Brokers::Case.new(@connection)
|
26
|
+
@solution_broker = Brokers::Solution.new(@connection)
|
27
|
+
@symptom_broker = Brokers::Symptom.new(@connection)
|
28
|
+
@problem_broker = Brokers::Problem.new(@connection)
|
29
|
+
@comment_broker = Brokers::Comment.new(@connection)
|
30
|
+
@attachment_broker = Brokers::Attachment.new(@connection, @comment_broker, attachments_config)
|
31
|
+
@product_broker = Brokers::Product.new(@connection)
|
32
|
+
@group_broker = Brokers::Group.new(@connection)
|
33
|
+
@entitlement_broker = Brokers::Entitlement.new(@connection)
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.log_location(path)
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,230 @@
|
|
1
|
+
require_relative '../network/http_request'
|
2
|
+
|
3
|
+
module RedHatSupportLib::TelemetryApi
|
4
|
+
|
5
|
+
SUBSET_LIST_TYPE_KEY = :subset_list_type
|
6
|
+
SUBSET_LIST_TYPE_MACHINE_ID = :machine_ids
|
7
|
+
SUBSET_LIST_TYPE_LEAF_ID = :leaf_ids
|
8
|
+
SUBSET_ROUTE_REGEX = [/^(v[0-9]|latest)\/systems\/status$/,
|
9
|
+
/^systems\/status$/,
|
10
|
+
/^(v[0-9]|latest)\/systems$/,
|
11
|
+
/^systems$/,
|
12
|
+
/^(v[0-9]|latest)\/rules$/,
|
13
|
+
/^rules$/,
|
14
|
+
/^(v[0-9]|latest)\/reports$/,
|
15
|
+
/^reports$/,
|
16
|
+
/^(v[0-9]|latest)\/messaging\/data\/weeklyinfo$/].freeze
|
17
|
+
|
18
|
+
|
19
|
+
class Client
|
20
|
+
RestClient.log =Object.new.tap do |proxy|
|
21
|
+
def proxy.<<(message)
|
22
|
+
Rails.logger.debug message
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# Creates and returns the subset route corresponding to 'path' if 'path' is a subset resource, otherwise
|
28
|
+
# returns 'nil'
|
29
|
+
#
|
30
|
+
def create_subset_route(path)
|
31
|
+
SUBSET_ROUTE_REGEX.each do |regex|
|
32
|
+
if regex.match(path)
|
33
|
+
subset_id = get_hash(get_machines)
|
34
|
+
path.gsub(regex) do |s|
|
35
|
+
api_version = Regexp.last_match[1]
|
36
|
+
if api_version
|
37
|
+
path = s.sub(api_version, "#{api_version}/subsets/#{subset_id}")
|
38
|
+
else
|
39
|
+
path = "subsets/#{subset_id}/#{s}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
return path
|
43
|
+
end
|
44
|
+
end
|
45
|
+
nil
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
def initialize(upload_url,
|
50
|
+
api_url,
|
51
|
+
creds,
|
52
|
+
optional)
|
53
|
+
|
54
|
+
@creds = creds
|
55
|
+
@upload_url = upload_url
|
56
|
+
@api_url = api_url
|
57
|
+
@subset_url = "#{@api_url}/subsets"
|
58
|
+
@subset_list_type = SUBSET_LIST_TYPE_LEAF_ID
|
59
|
+
|
60
|
+
if optional
|
61
|
+
@logger = optional[:logger]
|
62
|
+
@http_proxy = optional[:http_proxy] if optional[:http_proxy]
|
63
|
+
@user_agent = optional[:user_agent] if optional[:user_agent]
|
64
|
+
@http_headers = optional[:headers] if optional[:headers]
|
65
|
+
@subset_list_type = optional[SUBSET_LIST_TYPE_KEY] if optional[SUBSET_LIST_TYPE_KEY]
|
66
|
+
end
|
67
|
+
ldebug ("HTTP proxy is set to #{@http_proxy}")
|
68
|
+
end
|
69
|
+
|
70
|
+
def post_upload(original_params,
|
71
|
+
original_payload)
|
72
|
+
|
73
|
+
call_tapi('POST',
|
74
|
+
'/',
|
75
|
+
original_params,
|
76
|
+
original_payload,
|
77
|
+
do_upload: true)
|
78
|
+
end
|
79
|
+
|
80
|
+
def call_tapi_no_subset(original_method,
|
81
|
+
resource,
|
82
|
+
original_params,
|
83
|
+
original_payload,
|
84
|
+
extra)
|
85
|
+
|
86
|
+
ldebug ('Called no subset proxy')
|
87
|
+
call_tapi(original_method, resource, original_params, original_payload, extra, false)
|
88
|
+
end
|
89
|
+
|
90
|
+
def call_tapi(original_method,
|
91
|
+
resource,
|
92
|
+
original_params,
|
93
|
+
original_payload,
|
94
|
+
extra, use_subsets = true)
|
95
|
+
|
96
|
+
if (use_subsets && subset_resource = create_subset_route(resource))
|
97
|
+
ldebug "Doing subset call to #{subset_resource} (was : #{resource})"
|
98
|
+
response = do_subset_call("#{@api_url}/#{subset_resource}", params: original_params, method: original_method, payload: original_payload)
|
99
|
+
return {data: response, code: response.code}
|
100
|
+
else
|
101
|
+
if extra && extra[:do_upload]
|
102
|
+
url = @upload_url
|
103
|
+
else
|
104
|
+
url = "#{@api_url}/#{resource}"
|
105
|
+
end
|
106
|
+
client = default_rest_client(url, params: original_params, method: original_method, payload: original_payload)
|
107
|
+
response = client.execute
|
108
|
+
return {data: response, code: response.code}
|
109
|
+
end
|
110
|
+
rescue RestClient::ExceptionWithResponse => e
|
111
|
+
lerror nil, "Caught HTTP error when proxying call to tapi: #{e}"
|
112
|
+
return {data: e.response, error: e, code: e.response.code}
|
113
|
+
rescue Exception => e
|
114
|
+
lerror e, "Caught unexpected error when proxying call to tapi: #{e}"
|
115
|
+
return {data: e, error: e, code: 500}
|
116
|
+
end
|
117
|
+
|
118
|
+
def call_strata(original_method,
|
119
|
+
resource,
|
120
|
+
original_params,
|
121
|
+
original_payload,
|
122
|
+
_extra)
|
123
|
+
|
124
|
+
url = "#{@api_url}/#{resource}"
|
125
|
+
client = default_rest_client(url, params: original_params, method: original_method, payload: original_payload)
|
126
|
+
response = client.execute
|
127
|
+
return {data: response, code: response.code}
|
128
|
+
rescue RestClient::ExceptionWithResponse => e
|
129
|
+
lerror nil, "Caught HTTP error when proxying call to tapi: #{e}"
|
130
|
+
return {data: e.response, error: e, code: e.response.code}
|
131
|
+
rescue Exception => e
|
132
|
+
lerror e, "Caught unexpected error when proxying call to tapi: #{e}"
|
133
|
+
return {data: e, error: e, code: 500}
|
134
|
+
end
|
135
|
+
|
136
|
+
def get_machines
|
137
|
+
throw NotImplementedError
|
138
|
+
end
|
139
|
+
|
140
|
+
def get_branch_id
|
141
|
+
throw NotImplementedError
|
142
|
+
end
|
143
|
+
|
144
|
+
# Returns the machines hash used for /subset/$hash/
|
145
|
+
def get_hash(machines)
|
146
|
+
branch = get_branch_id
|
147
|
+
hash = Digest::SHA1.hexdigest(machines.join)
|
148
|
+
"#{branch}__#{hash}"
|
149
|
+
end
|
150
|
+
|
151
|
+
private
|
152
|
+
|
153
|
+
def ldebug(message)
|
154
|
+
@logger.debug "#{self.class.name}: #{message}" if @logger
|
155
|
+
end
|
156
|
+
|
157
|
+
def lerror(e, message)
|
158
|
+
if @logger
|
159
|
+
@logger.error ("#{self.class.name}: #{message}")
|
160
|
+
@logger.error (e.backtrace.join("\n")) if e
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def do_subset_call(resource,
|
165
|
+
conf)
|
166
|
+
ldebug 'Doing subset call'
|
167
|
+
# Try subset
|
168
|
+
begin
|
169
|
+
ldebug "url: #{resource}"
|
170
|
+
client = default_rest_client resource, conf
|
171
|
+
response = client.execute
|
172
|
+
ldebug 'First subset call passed, CACHE_HIT'
|
173
|
+
ldebug(response.headers)
|
174
|
+
return response
|
175
|
+
rescue RestClient::ExceptionWithResponse => e
|
176
|
+
|
177
|
+
if e.response && e.response.code == 412
|
178
|
+
create_subset
|
179
|
+
|
180
|
+
# retry the original request
|
181
|
+
ldebug 'Subset creation passed calling newly created subset'
|
182
|
+
response = client.execute
|
183
|
+
return response
|
184
|
+
else
|
185
|
+
raise e
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
|
191
|
+
def create_subset
|
192
|
+
ldebug 'First subset call failed, CACHE_MISS'
|
193
|
+
subset_client = default_rest_client(@subset_url,
|
194
|
+
method: :post,
|
195
|
+
payload: {
|
196
|
+
hash: get_hash(get_machines),
|
197
|
+
branch_id: get_branch_id,
|
198
|
+
@subset_list_type => get_machines
|
199
|
+
}.to_json)
|
200
|
+
subset_client.execute
|
201
|
+
end
|
202
|
+
|
203
|
+
|
204
|
+
def default_rest_client(url, override_options)
|
205
|
+
opts = {
|
206
|
+
method: :get,
|
207
|
+
url: url
|
208
|
+
}
|
209
|
+
opts[:proxy] = @http_proxy unless @http_proxy.nil? || @http_proxy == ''
|
210
|
+
opts = opts.merge(get_auth_opts(@creds))
|
211
|
+
opts = opts.merge(override_options)
|
212
|
+
opts[:headers] = @http_headers if @http_headers
|
213
|
+
if override_options[:params]
|
214
|
+
opts[:url] = "#{url}?#{override_options[:params].to_query}"
|
215
|
+
override_options.delete(:params)
|
216
|
+
end
|
217
|
+
opts[:headers] = {} unless opts[:headers]
|
218
|
+
if opts[:headers]['content-type'].nil?
|
219
|
+
opts[:headers] = opts[:headers].merge('content-type' => 'application/json')
|
220
|
+
end
|
221
|
+
if opts[:headers]['accept'].nil?
|
222
|
+
opts[:headers] = opts[:headers].merge('accept' => 'application/json')
|
223
|
+
end
|
224
|
+
if @user_agent
|
225
|
+
opts[:headers] = opts[:headers].merge(user_agent: @user_agent)
|
226
|
+
end
|
227
|
+
RedHatSupportLib::Network::HttpRequest.new(opts)
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
module RedHatSupportLib
|
3
|
+
module Brokers
|
4
|
+
class Article < Broker
|
5
|
+
def initialize(connection)
|
6
|
+
super
|
7
|
+
end
|
8
|
+
|
9
|
+
def search(text, limit=10)
|
10
|
+
#TODO encode input and error handling
|
11
|
+
text = URI::encode(text)
|
12
|
+
result = @connection.get("/rs/articles?keyword=#{text}&limit=#{limit}", {:accept => :json})
|
13
|
+
result['article']
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_article(id)
|
17
|
+
#TODO encode input and error handling
|
18
|
+
result = @connection.get("/rs/articles/#{id}", {:accept => :json})
|
19
|
+
#result.parsed_response
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require_relative '../network/ftp_connection'
|
3
|
+
|
4
|
+
module RedHatSupportLib
|
5
|
+
module Brokers
|
6
|
+
class Attachment < Broker
|
7
|
+
|
8
|
+
def initialize(connection, comments_broker, attachments_config)
|
9
|
+
super(connection)
|
10
|
+
@comments_broker = comments_broker
|
11
|
+
@attachments_config = attachments_config
|
12
|
+
end
|
13
|
+
|
14
|
+
def list(case_number, start_date, end_date, filter=[])
|
15
|
+
|
16
|
+
uri = "/rs/cases/#{case_number}/attachments"
|
17
|
+
param = ''
|
18
|
+
if start_date
|
19
|
+
param = "?startDate=#{start_date}"
|
20
|
+
end
|
21
|
+
if end_date
|
22
|
+
if start_date
|
23
|
+
param = param + "&endDate=#{end_date}"
|
24
|
+
else
|
25
|
+
param = param + "?endDate=#{end_date}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
result = @connection.get(uri+param, {:accept => :json})
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
def get(case_number, attachment_uuid, file_name, dest_dir)
|
33
|
+
#TODO
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
def delete(case_number, attachment_uuid)
|
38
|
+
|
39
|
+
uri = "/rs/cases/#{case_number}/attachments/#{attachment_uuid}";
|
40
|
+
result = @connection.delete(uri)
|
41
|
+
end
|
42
|
+
|
43
|
+
def add(case_number, is_public, file_name, description)
|
44
|
+
#puts "Sending attachment for case "+ case_number
|
45
|
+
attachment_id = nil
|
46
|
+
File.open(file_name) do |file|
|
47
|
+
if file.size < @attachments_config[:max_http_size]
|
48
|
+
headers = {:description => description}
|
49
|
+
@connection.upload("/rs/cases/#{case_number}/attachments",
|
50
|
+
file, headers) do |code, headers|
|
51
|
+
if code == 201
|
52
|
+
location = headers[:location]
|
53
|
+
attachment_id = get_id(location)
|
54
|
+
else
|
55
|
+
#What to return here?
|
56
|
+
raise "Attachment failed " + code
|
57
|
+
end
|
58
|
+
end
|
59
|
+
else
|
60
|
+
ftp_connection = RedHatSupportLib::Network::FtpConnection.new(@attachments_config[:ftp_host])
|
61
|
+
ftp_connection.upload(file_name,
|
62
|
+
@attachments_config[:ftp_remote_dir])
|
63
|
+
comment = StringIO.new
|
64
|
+
comment << "The file #{file_name} exceeds the byte limit to attach a file to a case;"
|
65
|
+
comment << " Therefore, the file was uploaded to"
|
66
|
+
comment << " #{@attachments_config[:ftp_host]} as #{File.basename(file_name)}"
|
67
|
+
@comments_broker.add(comment.string, case_number, false, is_public)
|
68
|
+
#TODO what to return here?
|
69
|
+
end
|
70
|
+
end
|
71
|
+
attachment_id
|
72
|
+
end
|
73
|
+
|
74
|
+
def get_id(uri)
|
75
|
+
parts = uri.split("/")
|
76
|
+
parts.pop
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/lib/brokers/case.rb
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
module RedHatSupportLib
|
2
|
+
module Brokers
|
3
|
+
class Case < Broker
|
4
|
+
def initialize(connection)
|
5
|
+
super
|
6
|
+
end
|
7
|
+
|
8
|
+
def list(keywords, include_closed, detail, group, start_date, end_date,
|
9
|
+
count, start, kwargs)
|
10
|
+
headers = {:content_type => 'application/xml', :accept => :json}
|
11
|
+
param =""
|
12
|
+
if detail
|
13
|
+
param = "?detail=true"
|
14
|
+
end
|
15
|
+
filter = self.create_filter(keywords, include_closed,
|
16
|
+
group, start_date,
|
17
|
+
end_date, count, start,
|
18
|
+
@connection.config.username)
|
19
|
+
result = @connection.post("/rs/cases/filter#{param}", filter, headers)
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
def list_severities
|
24
|
+
result = @connection.get("/rs/values/case/severity", {:accept => :json})
|
25
|
+
list = result["value"].map do |item|
|
26
|
+
item["name"]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def list_case_types
|
31
|
+
result = @connection.get("/rs/values/case/types", {:accept => :json})
|
32
|
+
list = result["value"].map do |item|
|
33
|
+
item["name"]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
def get(id)
|
39
|
+
result = @connection.get("/rs/cases/#{id}", {:accept => :json})
|
40
|
+
end
|
41
|
+
|
42
|
+
def create(product, version, summary, description, severity, folder_number=nil)
|
43
|
+
|
44
|
+
headers = {:content_type => 'application/xml'}
|
45
|
+
data = StringIO.new
|
46
|
+
data << "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
|
47
|
+
data << "<tns:case xmlns:tns=\"http://www.redhat.com/gss/strata\"> "
|
48
|
+
data << "<tns:summary>#{summary}</tns:summary>"
|
49
|
+
data << "<tns:description>#{description}</tns:description>"
|
50
|
+
data << "<tns:product>#{product}</tns:product>"
|
51
|
+
data << "<tns:version>#{version}</tns:version>"
|
52
|
+
data << "<tns:severity>#{severity}</tns:severity>"
|
53
|
+
if folder_number
|
54
|
+
data << "<tns:folderNumber>#{folder_number}</tns:folderNumber>"
|
55
|
+
end
|
56
|
+
data << "</tns:case>"
|
57
|
+
result = @connection.post("/rs/cases", data.string, headers) do |code, headers|
|
58
|
+
if code == 201
|
59
|
+
return get_id(headers[:location])
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def update(case_number, product, version, alternate_id, status, severity, type)
|
65
|
+
headers = {:content_type => 'application/xml'}
|
66
|
+
data = create_update_data(product, version, alternate_id, status, severity, type)
|
67
|
+
result = @connection.put("/rs/cases/#{case_number}", data, headers) do |code, headers|
|
68
|
+
if code == 202
|
69
|
+
return get case_number
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def create_update_data(product, version, alternate_id, status, severity, type)
|
75
|
+
#for now use xml version
|
76
|
+
data = StringIO.new
|
77
|
+
data << "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
|
78
|
+
if alternate_id
|
79
|
+
data << "<case xmlns=\"http://www.redhat.com/gss/strata\" alternateId=\"#{alternate_id}\">"
|
80
|
+
else
|
81
|
+
data << "<case xmlns=\"http://www.redhat.com/gss/strata\">"
|
82
|
+
end
|
83
|
+
if product
|
84
|
+
data << "<product>#{product}</product>"
|
85
|
+
end
|
86
|
+
if version
|
87
|
+
data << "<version>#{version}</version>"
|
88
|
+
end
|
89
|
+
if status
|
90
|
+
data << "<status>#{status}</status>"
|
91
|
+
end
|
92
|
+
if severity
|
93
|
+
data << "<severity>#{severity}</severity>"
|
94
|
+
end
|
95
|
+
if type
|
96
|
+
data << "<type>#{type}</type>"
|
97
|
+
end
|
98
|
+
data << "</case>"
|
99
|
+
return data.string
|
100
|
+
end
|
101
|
+
|
102
|
+
def create_filter(keywords, include_closed, group, start_date, end_date,
|
103
|
+
count, start, owner_sso_name)
|
104
|
+
#for now use xml version
|
105
|
+
filter = StringIO.new
|
106
|
+
filter << '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'
|
107
|
+
filter << '<caseFilter xmlns="http://www.redhat.com/gss/strata">'
|
108
|
+
if keywords
|
109
|
+
keywords.each do |keyword|
|
110
|
+
filter << "<keyword>#{keyword}</keyword>"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
if include_closed
|
114
|
+
filter << "<includeClosed>true</includeClosed>"
|
115
|
+
end
|
116
|
+
if group.nil?
|
117
|
+
filter << "<onlyUngrouped>false</onlyUngrouped>"
|
118
|
+
else
|
119
|
+
filter << "<groupNumber>#{group}</groupNumber>"
|
120
|
+
end
|
121
|
+
if start_date
|
122
|
+
filter << "<startDate>#{start_date}</startDate>"
|
123
|
+
end
|
124
|
+
if end_date
|
125
|
+
filter << "<endDate>#{end_date}</endDate>"
|
126
|
+
end
|
127
|
+
if count
|
128
|
+
filter << "<count>#{count}</count>"
|
129
|
+
end
|
130
|
+
if start
|
131
|
+
filter << "<start>#{start}</start>"
|
132
|
+
end
|
133
|
+
filter << "<ownerSSOName>#{owner_sso_name}</ownerSSOName>"
|
134
|
+
filter << "</caseFilter>"
|
135
|
+
filter.string
|
136
|
+
end
|
137
|
+
|
138
|
+
|
139
|
+
end
|
140
|
+
# class CaseFilter
|
141
|
+
# attr_accessor :keywords, :include_closed, :detail,
|
142
|
+
# :group, :start_date, :end_date, :count, :start, :kwargs
|
143
|
+
# end
|
144
|
+
end
|
145
|
+
end
|