Class: JiraGateway
- Inherits:
-
Object
- Object
- JiraGateway
- Defined in:
- lib/jirametrics/jira_gateway.rb
Instance Attribute Summary collapse
-
#file_system ⇒ Object
readonly
Returns the value of attribute file_system.
-
#ignore_ssl_errors ⇒ Object
Returns the value of attribute ignore_ssl_errors.
-
#jira_url ⇒ Object
readonly
Returns the value of attribute jira_url.
-
#settings ⇒ Object
readonly
Returns the value of attribute settings.
Instance Method Summary collapse
- #call_command(command) ⇒ Object
- #call_url(relative_url:) ⇒ Object
- #cloud? ⇒ Boolean
-
#initialize(file_system:, jira_config:, settings:) ⇒ JiraGateway
constructor
A new instance of JiraGateway.
- #json_successful?(json) ⇒ Boolean
- #load_jira_config(jira_config) ⇒ Object
- #make_curl_command(url:, method: 'GET') ⇒ Object
- #parse_response(command:, result:) ⇒ Object
- #post_request(relative_url:, payload:) ⇒ Object
- #sanitize_message(message) ⇒ Object
Constructor Details
#initialize(file_system:, jira_config:, settings:) ⇒ JiraGateway
Returns a new instance of JiraGateway.
12 13 14 15 16 17 |
# File 'lib/jirametrics/jira_gateway.rb', line 12 def initialize file_system:, jira_config:, settings: @file_system = file_system load_jira_config(jira_config) @settings = settings @ignore_ssl_errors = settings['ignore_ssl_errors'] end |
Instance Attribute Details
#file_system ⇒ Object (readonly)
Returns the value of attribute file_system.
10 11 12 |
# File 'lib/jirametrics/jira_gateway.rb', line 10 def file_system @file_system end |
#ignore_ssl_errors ⇒ Object
Returns the value of attribute ignore_ssl_errors.
9 10 11 |
# File 'lib/jirametrics/jira_gateway.rb', line 9 def ignore_ssl_errors @ignore_ssl_errors end |
#jira_url ⇒ Object (readonly)
Returns the value of attribute jira_url.
10 11 12 |
# File 'lib/jirametrics/jira_gateway.rb', line 10 def jira_url @jira_url end |
#settings ⇒ Object (readonly)
Returns the value of attribute settings.
10 11 12 |
# File 'lib/jirametrics/jira_gateway.rb', line 10 def settings @settings end |
Instance Method Details
#call_command(command) ⇒ Object
67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/jirametrics/jira_gateway.rb', line 67 def call_command command log_entry = " #{command.gsub(/\s+/, ' ')}" log_entry = log_entry @file_system.log log_entry result = `#{command}` @file_system.log result unless $CHILD_STATUS.success? return result if $CHILD_STATUS.success? @file_system.log "Failed call with exit status #{$CHILD_STATUS.exitstatus}." raise "Failed call with exit status #{$CHILD_STATUS.exitstatus}. " \ "See #{@file_system.logfile_name} for details" end |
#call_url(relative_url:) ⇒ Object
40 41 42 43 44 |
# File 'lib/jirametrics/jira_gateway.rb', line 40 def call_url relative_url: command = make_curl_command url: "#{@jira_url}#{relative_url}" result = call_command command parse_response(command: command, result: result) end |
#cloud? ⇒ Boolean
125 126 127 |
# File 'lib/jirametrics/jira_gateway.rb', line 125 def cloud? @jira_url.downcase.end_with? '.atlassian.net' end |
#json_successful?(json) ⇒ Boolean
118 119 120 121 122 123 |
# File 'lib/jirametrics/jira_gateway.rb', line 118 def json_successful? json return false if json.is_a?(Hash) && (json['error'] || json['errorMessages'] || json['errorMessage']) return false if json.is_a?(Array) && json.first == 'errorMessage' true end |
#load_jira_config(jira_config) ⇒ Object
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/jirametrics/jira_gateway.rb', line 81 def load_jira_config jira_config @jira_url = jira_config['url'] raise 'Must specify URL in config' if @jira_url.nil? @jira_email = jira_config['email'] @jira_api_token = jira_config['api_token'] @jira_personal_access_token = jira_config['personal_access_token'] raise 'When specifying an api-token, you must also specify email' if @jira_api_token && !@jira_email if @jira_api_token && @jira_personal_access_token raise "You can't specify both an api-token and a personal-access-token. They don't work together." end @cookies = (jira_config['cookies'] || []).collect { |key, value| "#{key}=#{value}" }.join(';') end |
#make_curl_command(url:, method: 'GET') ⇒ Object
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
# File 'lib/jirametrics/jira_gateway.rb', line 98 def make_curl_command url:, method: 'GET' command = +'' command << 'curl' command << ' -L' # follow redirects command << ' -s' # silent command << ' -k' if @ignore_ssl_errors # insecure command << " --cookie #{@cookies.inspect}" unless @cookies.empty? command << " --user #{@jira_email}:#{@jira_api_token}" if @jira_api_token command << " -H \"Authorization: Bearer #{@jira_personal_access_token}\"" if @jira_personal_access_token command << " --request #{method}" if method == 'POST' command << ' --data @-' command << ' --header "Content-Type: application/json"' end command << ' --header "Accept: application/json"' command << ' --show-error --fail' # Better diagnostics when the server returns an error command << " --url \"#{url}\"" command end |
#parse_response(command:, result:) ⇒ Object
46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/jirametrics/jira_gateway.rb', line 46 def parse_response command:, result: begin json = JSON.parse(result) rescue # rubocop:disable Style/RescueStandardError = "Unable to parse results from #{(command)}" @file_system.error , more: result raise end raise "Download failed with: #{JSON.pretty_generate(json)}" unless json_successful?(json) json end |
#post_request(relative_url:, payload:) ⇒ Object
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/jirametrics/jira_gateway.rb', line 19 def post_request relative_url:, payload: command = make_curl_command url: "#{@jira_url}#{relative_url}", method: 'POST' log_entry = " #{command.gsub(/\s+/, ' ')}" log_entry = log_entry @file_system.log log_entry stdout, stderr, status = Open3.capture3(command, stdin_data: payload) unless status.success? @file_system.log "Failed call with exit status #{status.exitstatus}!" @file_system.log "Returned (stdout): #{stdout.inspect}" @file_system.log "Returned (stderr): #{stderr.inspect}" raise "Failed call with exit status #{status.exitstatus}. " \ "See #{@file_system.logfile_name} for details" end @file_system.log "Returned (stderr): #{stderr}" unless stderr == '' raise 'no response from curl on stdout' if stdout == '' parse_response(command: command, result: stdout) end |
#sanitize_message(message) ⇒ Object
60 61 62 63 64 65 |
# File 'lib/jirametrics/jira_gateway.rb', line 60 def token = @jira_api_token || @jira_personal_access_token raise 'Neither Jira API Token or personal access token has been set' unless token .gsub(token, '[API_TOKEN]') end |