module Miasma::Contrib::Lxd::Api

API updates required for LXD communication

Constants

DEFAULT_API_VERSION

Default API version to require

Public Class Methods

included(klass) click to toggle source

Load required attributes into API class

@param klass [Class]

# File lib/miasma/contrib/lxd.rb, line 15
def self.included(klass)
  klass.class_eval do
    attribute :name, String, :required => true, :default => Socket.gethostname
    attribute :password, String
    attribute :api_endpoint, String, :required => true
    attribute :ssl_certificate, String, :required => true
    attribute :ssl_key, String, :required => true
    attribute :version, Gem::Version, :coerce => lambda{|v| Gem::Version.new(v.to_s)}, :required => true, :default => lambda{ Miasma::Contrib::Lxd::Api::DEFAULT_API_VERSION }
  end
end

Public Instance Methods

custom_setup(args) click to toggle source

Clean up endpoint prior to data loading

@param args [Hash]

# File lib/miasma/contrib/lxd.rb, line 34
def custom_setup(args)
  if(args[:api_endpoint].to_s.end_with?('/'))
    args[:api_endpoint] = args[:api_endpoint][0, endpoint.length - 1]
  end
end
endpoint() click to toggle source

@return [String] versioned endpoint

# File lib/miasma/contrib/lxd.rb, line 27
def endpoint
  "#{api_endpoint}/#{version}"
end
make_request(connection, http_method, request_args) click to toggle source

Perform request

@param connection [HTTP] @param http_method [Symbol] @param request_args [Array] @return [HTTP::Response]

# File lib/miasma/contrib/lxd.rb, line 46
def make_request(connection, http_method, request_args)
  dest, options = request_args
  options = Smash.new unless options
  options[:ssl_context] = ssl_context
  connection.send(http_method, dest, options)
end

Protected Instance Methods

authenticate_connection!() click to toggle source

Authenticate with the endpoint to create trusted connection

# File lib/miasma/contrib/lxd.rb, line 79
def authenticate_connection!
  request(
    :method => :post,
    :path => 'certificates',
    :json => {
      :type => :client,
      :name => name,
      :password => password
    }
  )
end
connect() click to toggle source

Establish connection to endpoint and register client if not already registered

# File lib/miasma/contrib/lxd.rb, line 67
def connect
  result = request(:endpoint => api_endpoint)[:body]
  unless(result[:metadata].any?{|s| s.end_with?(version.to_s)})
    raise InvalidVersionError
  end
  result = request(:endpoint => api_endpoint, :path => "/#{version}")[:body]
  if(result[:auth] != 'trusted' && password)
    authenticate_connection!
  end
end
ssl_context() click to toggle source

@return [OpenSSL::SSL::SSLContext.new]

# File lib/miasma/contrib/lxd.rb, line 56
def ssl_context
  memoize(:ssl_context) do
    ctx = OpenSSL::SSL::SSLContext.new
    ctx.cert = OpenSSL::X509::Certificate.new(File.read(ssl_certificate))
    ctx.key = OpenSSL::PKey::RSA.new(File.read(ssl_key))
    ctx
  end
end