class Fog::Scaleway::Account::Mock

Constants

ORGANIZATION
ORGANIZATION_QUOTAS
TIME_FORMAT
TOKEN_PERMISSIONS

Public Class Methods

data() click to toggle source
# File lib/fog/scaleway/account.rb, line 185
def self.data
  @data ||= Hash.new do |hash, token|
    hash[token] = {
      organizations: { ORGANIZATION['id'] => ORGANIZATION },
      organization_quotas: Hash.new(ORGANIZATION_QUOTAS),
      tokens: {},
      token_permissions: Hash.new(TOKEN_PERMISSIONS),
      users: { ORGANIZATION['users'][0]['id'] => ORGANIZATION['users'][0] }
    }
  end
end
new(options) click to toggle source
# File lib/fog/scaleway/account.rb, line 197
def initialize(options)
  @token = options[:scaleway_token]
  @email = options[:scaleway_email]
end
reset() click to toggle source
# File lib/fog/scaleway/account.rb, line 202
def self.reset
  @data = nil
end

Public Instance Methods

create_token(options = {}) click to toggle source
# File lib/fog/scaleway/requests/account/create_token.rb, line 21
def create_token(options = {})
  if @email.nil?
    raise ArgumentError, 'email is required to create a token'
  end

  body = {
    email: @email
  }

  body.merge!(options)

  body = jsonify(body)

  user = data[:users].values.find do |u|
    u['email'] == body['email']
  end

  raise_invalid_auth('Invalid credentials') unless user

  expires = nil
  if body['expires'] != false
    expires = (Time.now + 30 * 60).utc.strftime(TIME_FORMAT)
  end

  token = {
    'user_id' => user['id'],
    'description' => body['description'] || '',
    'roles' => { 'organization' => nil, 'role' => nil },
    'expires' => expires,
    'creation_date' => now,
    'inherits_user_perms' => true,
    'id' => Fog::UUID.uuid
  }

  data[:tokens][token['id']] = token

  response(status: 201, body: { 'token' => token })
end
delete_token(token_id) click to toggle source
# File lib/fog/scaleway/requests/account/delete_token.rb, line 11
def delete_token(token_id)
  token = lookup(:tokens, token_id)

  data[:tokens].delete(token['id'])

  response(status: 204)
end
get_organization(organization_id) click to toggle source
# File lib/fog/scaleway/requests/account/get_organization.rb, line 11
def get_organization(organization_id)
  organization = lookup(:organizations, organization_id)

  response(status: 200, body: { 'organization' => organization })
end
get_organization_quotas(organization_id) click to toggle source
# File lib/fog/scaleway/requests/account/get_organization_quotas.rb, line 11
def get_organization_quotas(organization_id)
  organization = lookup(:organizations, organization_id)

  quotas = lookup(:organization_quotas, organization['id'])

  response(status: 200, body: { 'quotas' => quotas })
end
get_token(token_id) click to toggle source
# File lib/fog/scaleway/requests/account/get_token.rb, line 11
def get_token(token_id)
  token = lookup(:tokens, token_id)

  response(status: 200, body: { 'token' => token })
end
get_token_permission(token_id) click to toggle source
# File lib/fog/scaleway/requests/account/get_token_permissions.rb, line 11
def get_token_permission(token_id)
  token = lookup(:tokens, token_id)

  permissions = lookup(:token_permissions, token['id'])

  response(status: 200, body: { 'permissions' => permissions })
end
get_user(user_id) click to toggle source
# File lib/fog/scaleway/requests/account/get_user.rb, line 11
def get_user(user_id)
  user = lookup(:users, user_id)

  response(status: 200, body: { 'user' => user })
end
list_organizations() click to toggle source
# File lib/fog/scaleway/requests/account/list_organizations.rb, line 11
def list_organizations
  organizations = data[:organizations].values

  response(status: 200, body: { 'organizations' => organizations })
end
list_tokens() click to toggle source
# File lib/fog/scaleway/requests/account/list_tokens.rb, line 11
def list_tokens
  tokens = data[:tokens].values

  response(status: 200, body: { 'tokens' => tokens })
end
update_token(token_id, options = {}) click to toggle source
# File lib/fog/scaleway/requests/account/update_token.rb, line 14
def update_token(token_id, options = {})
  options = jsonify(options)

  token = lookup(:tokens, token_id)

  token['description'] = options['description'] unless options['description'].nil?
  token['expires'] = (Time.now + 30 * 60).utc.strftime(TIME_FORMAT)

  response(status: 200, body: { 'token' => token })
end
update_user(user_id, options = {}) click to toggle source
# File lib/fog/scaleway/requests/account/update_user.rb, line 14
def update_user(user_id, options = {})
  options = jsonify(options)

  user = lookup(:users, user_id)

  %w[firstname lastname].each do |attr|
    user[attr] = options[attr] if options.key?(attr)
  end

  user['fullname'] = [user['firstname'], user['lastname']].compact.join(' ')

  if (ssh_public_keys = options['ssh_public_keys'])
    user['ssh_public_keys'] = ssh_public_keys.map do |key|
      {
        'key' => key['key'],
        'fingerprint' => generate_fingerprint(key['key'])
      }
    end
  end

  response(status: 200, body: { 'user' => user })
end

Private Instance Methods

data() click to toggle source
# File lib/fog/scaleway/account.rb, line 208
def data
  self.class.data[@token]
end
decode_body(response) click to toggle source
# File lib/fog/scaleway/account.rb, line 242
def decode_body(response)
  body         = response.body
  content_type = response.headers['Content-Type']

  if !body.nil? && !body.empty? && content_type =~ %r{application/json.*}i
    Fog::JSON.decode(body)
  else
    body
  end
end
decode_public_key(key) click to toggle source
# File lib/fog/scaleway/account.rb, line 290
def decode_public_key(key)
  type, *nums = unpack_public_key(key)
  [type] + nums.map { |n| OpenSSL::BN.new(n, 2) }
end
encode_body(params) click to toggle source
# File lib/fog/scaleway/account.rb, line 229
def encode_body(params)
  body         = params[:body]
  content_type = params[:headers]['Content-Type']

  if body.nil? || body.is_a?(String)
    body
  elsif content_type =~ %r{application/json.*}i
    Fog::JSON.encode(body)
  else
    body.to_s
  end
end
generate_fingerprint(ssh_public_key) click to toggle source
# File lib/fog/scaleway/account.rb, line 273
def generate_fingerprint(ssh_public_key)
  require 'base64'
  require 'digest/md5'

  type, key, comment = ssh_public_key.split(' ', 3)

  unless type == 'ssh-rsa'
    raise ArgumentError, "Unsupported public key format: #{type}"
  end

  size = decode_public_key(Base64.decode64(key)).last.num_bytes * 8

  fingerprint = Digest::MD5.hexdigest(Base64.decode64(key)).scan(/../).join(':')

  "#{size} #{fingerprint} #{comment} (RSA)"
end
jsonify(value) click to toggle source
# File lib/fog/scaleway/account.rb, line 269
def jsonify(value)
  Fog::JSON.decode(Fog::JSON.encode(value))
end
lookup(type, id) click to toggle source
# File lib/fog/scaleway/account.rb, line 212
def lookup(type, id)
  data[type][id] || raise_unknown_resource(id)
end
now() click to toggle source
# File lib/fog/scaleway/account.rb, line 265
def now
  Time.now.utc.strftime(TIME_FORMAT)
end
raise_invalid_auth(message) click to toggle source
# File lib/fog/scaleway/account.rb, line 257
def raise_invalid_auth(message)
  raise Fog::Scaleway::Account::InvalidAuth, message
end
raise_invalid_request_error(message) click to toggle source
# File lib/fog/scaleway/account.rb, line 253
def raise_invalid_request_error(message)
  raise Fog::Scaleway::Account::InvalidRequestError, message
end
raise_unknown_resource(id) click to toggle source
# File lib/fog/scaleway/account.rb, line 261
def raise_unknown_resource(id)
  raise Fog::Scaleway::Account::UnknownResource, "\"#{id}\" not found"
end
response(params) click to toggle source
# File lib/fog/scaleway/account.rb, line 216
def response(params)
  params[:headers] ||= {}
  params[:headers]['Content-Type'] ||= 'application/json'

  params[:body] = encode_body(params)

  response = Excon::Response.new(params)

  response.body = decode_body(response)

  response
end
unpack_public_key(key) click to toggle source
# File lib/fog/scaleway/account.rb, line 295
def unpack_public_key(key)
  vs = []
  until key.empty?
    n, key = key.unpack('Na*')
    v, key = key.unpack("a#{n}a*")
    vs << v
  end
  vs
end