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



81
82
83
84
85
86
# File 'app/controllers/insights_cloud/api/machine_telemetries_controller.rb', line 81

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



71
72
73
74
75
76
77
78
79
# File 'app/controllers/insights_cloud/api/machine_telemetries_controller.rb', line 71

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
66
67
68
69
# 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
    message = 'Cloud request failed'

    return render json: {
      :message => message,
      :error => response_obj.to_s,
      :headers => {},
      :response => response_obj,
    }, status: code
  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