Class: InsightsCloud::Api::MachineTelemetriesController

Inherits:
Api::V2::BaseController
  • Object
show all
Includes:
CandlepinCache, ClientAuthentication
Defined in:
app/controllers/insights_cloud/api/machine_telemetries_controller.rb

Instance Method Summary collapse

Methods included from CandlepinCache

#candlepin_id_cert, #cp_owner_id, #upstream_owner

Methods included from ClientAuthentication

#authorize, #client_authorized?, #subscribed_host_by_uuid, #valid_machine_user?

Instance Method Details

#assign_header(res, cloud_res, header, transform) ⇒ Object



77
78
79
80
81
82
# File 'app/controllers/insights_cloud/api/machine_telemetries_controller.rb', line 77

def assign_header(res, cloud_res, header, transform)
  header_content = cloud_res.headers[header]
  return unless header_content
  new_header = transform ? header.to_s.tr('_', '-') : header.to_s
  res.headers[new_header] = header_content
end

#branch_infoObject



67
68
69
70
71
72
73
74
75
# File 'app/controllers/insights_cloud/api/machine_telemetries_controller.rb', line 67

def branch_info
  payload = nil

  User.as_anonymous_admin do
    payload = ForemanRhCloud::BranchInfo.new.generate(@uuid, @host, @branch_id, request.host).to_json
  end

  render :json => payload
end

#forward_requestObject

The method that “proxies” requests over to Cloud



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'app/controllers/insights_cloud/api/machine_telemetries_controller.rb', line 18

def forward_request
  begin
    @cloud_response = ::ForemanRhCloud::CloudRequestForwarder.new.forward_request(request, controller_name, @branch_id, @host)
  rescue RestClient::Exceptions::Timeout => e
    response_obj = e.response.presence || e.exception
    return render json: { message: response_obj.to_s, error: response_obj.to_s }, status: :gateway_timeout
  rescue RestClient::Unauthorized => e
    logger.warn("Forwarding request auth error: #{e}")
    message = 'Authentication to the Insights Service failed.'
    return render json: { message: message, error: message }, status: :unauthorized
  rescue RestClient::NotModified => e
    logger.info("Forwarding request not modified: #{e}")
    message = 'Cloud request not modified'
    return render json: { message: message, error: message }, status: :not_modified
  rescue RestClient::ExceptionWithResponse => e
    response_obj = e.response.presence || e.exception
    code = response_obj.try(:code) || response_obj.try(:http_code) || 500
    upstream_content_type = response_obj.try(:headers)&.[](:content_type)
    content_type = upstream_content_type&.match?(/json/) ? upstream_content_type : 'application/json'

    return render body: response_obj.to_s, status: code, content_type: content_type
  rescue StandardError => e
    # Catch any other exceptions here, such as Errno::ECONNREFUSED
    logger.warn("Cloud request failed with exception: #{e}")
    return render json: { error: e.to_s }, status: :bad_gateway
  end

  # Append redhat-specific headers
  @cloud_response.headers.each do |key, value|
    assign_header(response, @cloud_response, key, false) if key.to_s.start_with?('x_rh_')
  end

  # Append general headers
  assign_header(response, @cloud_response, :x_resource_count, true)
  headers[Rack::ETAG] = @cloud_response.headers[:etag]

  if @cloud_response.headers[:content_disposition]
    # If there is a Content-Disposition header, it means we are forwarding binary data, send the raw data with proper
    # content type
    send_data @cloud_response, disposition: @cloud_response.headers[:content_disposition], type: @cloud_response.headers[:content_type]
  elsif @cloud_response.headers[:content_type] =~ /zip/
    # If there is no Content-Disposition, but the content type is binary according to Content-Type, send the raw data
    # with proper content type
    send_data @cloud_response, type: @cloud_response.headers[:content_type]
  else
    render json: @cloud_response, status: @cloud_response.code
  end
end