class Keyrod::FedcloudClient

Constants

PROJECTS_PATH
REDIRECT_HEADER
SCOPED_PATH

Attributes

access_token[R]
auth_path[R]
site[R]
ssl[R]

Public Class Methods

new() click to toggle source
# File lib/keyrod/fedcloud_client.rb, line 13
def initialize
  @site = Keyrod::Settings[:site]
  @access_token = Keyrod::Settings[:'access-token']
  @auth_path = "/v3/OS-FEDERATION/identity_providers/#{Keyrod::Settings[:'identity-provider']}/protocols/oidc/auth"
  @ssl = Keyrod::Settings[:ssl]
end

Public Instance Methods

projects(unscoped_token) click to toggle source
# File lib/keyrod/fedcloud_client.rb, line 25
def projects(unscoped_token)
  response = handle_response(projects_params(unscoped_token), error_message: 'Response for getting list of projects was')
  parse_projects(response.body)
end
scoped_token(unscoped_token, project) click to toggle source
# File lib/keyrod/fedcloud_client.rb, line 30
def scoped_token(unscoped_token, project)
  response = handle_response(scoped_token_params, body: scoped_token_body(unscoped_token, project),
                                                  error_message: 'Response for getting scoped token was')
  response.headers[:'X-Subject-Token']
end
unscoped_token() click to toggle source
# File lib/keyrod/fedcloud_client.rb, line 20
def unscoped_token
  response = handle_response(unscoped_token_params, error_message: 'Response for getting unscoped token was')
  response.headers[:'X-Subject-Token']
end

Private Instance Methods

connection(params) click to toggle source
# File lib/keyrod/fedcloud_client.rb, line 89
def connection(params)
  Faraday.new(File.join(params[:site], params[:path]), ssl: ssl, headers: params[:headers])
end
handle_response(params, body: nil, error_message: '') click to toggle source
# File lib/keyrod/fedcloud_client.rb, line 93
def handle_response(params, body: nil, error_message: '')
  conn = connection(params)
  logger.debug "Sending request with headers #{conn.headers}"
  begin
    response = body ? conn.post { |req| req.body = body } : conn.get

    if response.status == 401 && response.headers[REDIRECT_HEADER]
      params[:site] = parse_redirect(response)
      response = handle_response(params, body: body, error_message: error_message)
    end
  rescue Faraday::ClientError => e
    raise Keyrod::Errors::ConnectionError, e.message
  end

  raise Keyrod::Errors::ResponseError, "#{error_message} #{response.status}" unless response.success?
  response
end
parse_projects(projects_body) click to toggle source
# File lib/keyrod/fedcloud_client.rb, line 80
def parse_projects(projects_body)
  project_json = JSON.parse(projects_body, symbolize_names: true)
  project_json[:projects].map { |project| project[:id] }
end
parse_redirect(response) click to toggle source
# File lib/keyrod/fedcloud_client.rb, line 85
def parse_redirect(response)
  response.headers[REDIRECT_HEADER].downcase.sub('keystone uri=', '').delete("'")
end
projects_params(unscoped_token) click to toggle source
# File lib/keyrod/fedcloud_client.rb, line 46
def projects_params(unscoped_token)
  {
    site: site,
    headers: { 'X-Auth-Token': unscoped_token, Accept: 'application/json' },
    path: PROJECTS_PATH
  }
end
scoped_token_body(unscoped_token, project) click to toggle source
# File lib/keyrod/fedcloud_client.rb, line 62
def scoped_token_body(unscoped_token, project)
  {
    auth: {
      identity: {
        methods: ['token'],
        token: {
          id: unscoped_token
        }
      },
      scope: {
        project: {
          id: project
        }
      }
    }
  }.to_json
end
scoped_token_params() click to toggle source
# File lib/keyrod/fedcloud_client.rb, line 54
def scoped_token_params
  {
    site: site,
    headers: { Accept: 'application/json', 'Content-Type': 'application/json' },
    path: SCOPED_PATH
  }
end
unscoped_token_params() click to toggle source
# File lib/keyrod/fedcloud_client.rb, line 38
def unscoped_token_params
  {
    site: site,
    headers: { Authorization: "Bearer #{access_token}", Accept: 'application/json' },
    path: auth_path
  }
end