[compute|glesys] added glesys as provider

This commit is contained in:
Anton Lindstrom 2011-08-10 15:03:51 +02:00 committed by geemus
parent 729a62fb1e
commit 0c63450e90
29 changed files with 656 additions and 1 deletions

View File

@ -59,6 +59,7 @@ require 'fog/bin/dnsimple'
require 'fog/bin/dnsmadeeasy'
require 'fog/bin/dynect'
require 'fog/bin/ecloud'
require 'fog/bin/glesys'
require 'fog/bin/go_grid'
require 'fog/bin/google'
require 'fog/bin/libvirt'

36
lib/fog/bin/glesys.rb Normal file
View File

@ -0,0 +1,36 @@
class Glesys < Fog::Bin
class << self
def class_for(key)
case key
when :compute
Fog::Compute::Glesys
when :storage
Fog::Storage::Glesys
else
raise ArgumentError, "Unsupported #{self} service: #{key}"
end
end
def [](service)
@@connections ||= Hash.new do |hash, key|
hash[key] = case key
when :compute
Formatador.display_line("[yellow][WARN] Glesys[:compute] is deprecated, use Compute[:Glesys] instead[/]")
Fog::Compute.new(:provider => 'Glesys')
when :storage
Formatador.display_line("[yellow][WARN] Glesys[:storage] is deprecated, use Storage[:Glesys] instead[/]")
Fog::Storage.new(:provider => 'Glesys')
else
raise ArgumentError, "Unrecognized service: #{service}"
end
end
@@connections[service]
end
def services
Fog::Glesys.services
end
end
end

View File

@ -20,6 +20,9 @@ module Fog
when :ecloud
require 'fog/ecloud/compute'
Fog::Compute::Ecloud.new(attributes)
when :glesys
require 'fog/compute/glesys'
Fog::Compute::Glesys.new(attributes)
when :gogrid
require 'fog/go_grid/compute'
Fog::Compute::GoGrid.new(attributes)

108
lib/fog/compute/glesys.rb Normal file
View File

@ -0,0 +1,108 @@
module Fog
module Compute
class Glesys < Fog::Service
requires :glesys_username, :glesys_api_key
API_URL = "https://api.glesys.com"
model_path 'fog/compute/models/glesys'
collection :servers
model :server
collection :templates
model :template
collection :ips
model :ip
request_path 'fog/compute/requests/glesys'
request :create
request :destroy
request :list_servers
request :server_details
request :server_status
request :start
request :stop
# Templates
request :template_list
# IP operations
request :ip_list_free
request :ip_list_own
request :ip_details
request :ip_take
request :ip_release
request :ip_add
request :ip_remove
class Mock
include Collections
def request(method_name, options = {})
Fog::Mock.not_implemented
end
end
class Real
include Collections
def initialize(options)
require 'multi_json'
require 'base64'
@api_url = options[:glesys_api_url] || Fog.credentials[:glesys_api_url] || API_URL
@glesys_username = options[:glesys_username] || Fog.credentials[:glesys_api_key]
@glesys_api_key = options[:glesys_api_key] || Fog.credentials[:glesys_api_key]
@connection = Fog::Connection.new(@api_url)
end
def request(method_name, options = {})
options.merge!( {:format => 'json'})
begin
parser = options.delete(:parser)
data = @connection.request(
:expects => 200,
:method => "POST",
:body => urlencode(options),
:parser => parser,
:path => method_name,
:headers => {
'Authorization' => "Basic #{encoded_api_auth}",
'Content-Type' => 'application/x-www-form-urlencoded'
}
)
data.body = MultiJson.decode(data.body)
unless data.body['response']['status']['code'] == '200'
raise Fog::Compute::Glesys::Error, "#{data.body['response']['status']['text']}"
end
data
rescue Excon::Errors::HTTPStatusError => error
raise case error
when Excon::Errors::NotFound
Fog::Compute::Glesys::NotFound.slurp(error)
else
error
end
end
end
private
def encoded_api_auth
token = [@glesys_username, @glesys_api_key].join(':')
Base64.encode64(token).delete("\r\n")
end
def urlencode(hash)
hash.to_a.collect! { |k, v| "#{k}=#{v.to_s}" }.join("&")
end
end
end
end
end

View File

@ -0,0 +1,75 @@
require 'fog/core/model'
module Fog
module Glesys
class Compute
class Ip < Fog::Model
extend Fog::Deprecation
identity :serverid
attribute :datacenter
attribute :version
attribute :platform
attribute :ip
def list_own
connection.list_own
end
def list_free
requires :version, :datacenter, :platform
connection.ip_list_free(
:ipversion => version,
:platform => platform,
:datacenter => datacenter
).body['response']['iplist']
end
def details
requires :version, :ip
connection.ip_details(
:ipversion => version,
:ipaddress => ip
)
end
def take
requires :version, :ip
connection.ip_take(
:ipversion => version,
:ipaddress => ip
)
end
def release
requires :version, :ip
connection.ip_release(
:ipversion => version,
:ipaddress => ip
)
end
def add
requires :serverid, :version, :ip
connection.ip_add(
:serverid => serverid,
:ipversion => version,
:ipaddress => ip
)
end
def remove
requires :serverid, :version, :ip
connection.ip_remove(
:serverid => serverid,
:ipversion => version,
:ipaddress => ip
)
end
end
end
end
end

View File

@ -0,0 +1,39 @@
require 'fog/core/collection'
require 'fog/compute/models/glesys/ip'
module Fog
module Compute
class Glesys
class Ips < Fog::Collection
model Fog::Glesys::Compute::Ip
attribute :serverid
def all
data = connection.ip_list_own.body['response']['iplist']
load(data)
end
def get(identifier)
return nil if identifier.nil? || identifier == ""
self.new( :serverid => identifier )
data = connection.ip_list_own(:serverid => identifier).body['response']
if data['iplist'].empty?
nil
else
new(data['iplist'].first)
end
end
def new(attributes = {})
super({ :serverid => serverid }.merge!(attributes))
end
end
end
end
end

View File

@ -0,0 +1,71 @@
require 'fog/compute/models/server'
module Fog
module Compute
class Glesys
class Server < Fog::Compute::Server
extend Fog::Deprecation
identity :serverid
attribute :hostname
attribute :datacenter
attribute :cpucores
attribute :memorysize
attribute :disksize
attribute :transfer
attribute :template
attribute :managedhosting
attribute :platform
attribute :cost
attribute :rootpw
attribute :keepip
attribute :state
attribute :iplist
attribute :ipversion
attribute :ip
def ready?
state == 'running'
end
def start
requires :identity
connection.start(:serverid => identity)
end
def stop
requires :identity
connection.stop(:serverid => identity)
end
def destroy
requires :identity
connection.destroy(:serverid => identity, :keepip => keepip)
end
def save
raise "Operation not supported" if self.identity
requires :hostname, :rootpw
options = {
:datacenter => "Falkenberg" || datacenter,
:platform => "Xen" || platform,
:hostname => hostname,
:template => "Debian-6 x64" || template,
:disksize => "10" || disksize,
:memorysize => "512" || memorysize,
:cpucores => "1" || cpucores,
:rootpw => rootpw,
:transfer => "500" || transfer,
}
data = connection.create(options)
merge_attributes(data.body['response']['server'])
data.status == 200 ? true : false
end
end
end
end
end

View File

@ -0,0 +1,34 @@
require 'fog/core/collection'
require 'fog/compute/models/glesys/server'
module Fog
module Compute
class Glesys
class Servers < Fog::Collection
model Fog::Compute::Glesys::Server
def all
data = connection.list_servers.body['response']['servers']
load(data)
end
def get(identifier)
return nil if identifier.nil? || identifier == ""
details = connection.server_details(identifier).body['response']
status = connection.server_status(identifier).body['response']
if details.empty? || status.empty?
nil
else
status['server'].merge!({ :serverid => identifier})
details['server'].merge!(status['server'])
new(details['server'])
end
end
end
end
end
end

View File

@ -0,0 +1,25 @@
require 'fog/core/model'
module Fog
module Glesys
class Compute
class Template < Fog::Model
extend Fog::Deprecation
identity :templateid
attribute :platform
attribute :name
attribute :os
attribute :min_mem_size
attribute :min_disk_size
def list
connection.template_list
end
end
end
end
end

View File

@ -0,0 +1,28 @@
require 'fog/core/collection'
require 'fog/compute/models/glesys/template'
module Fog
module Compute
class Glesys
class Templates < Fog::Collection
model Fog::Glesys::Compute::Template
#attribute :platform
#attribute :name
#attribute :os
#attribute :min_mem_size
#attribute :min_disk_size
def all
openvz = connection.template_list.body['response']['templates']['OpenVZ']
xen = connection.template_list.body['response']['templates']['Xen']
load(xen+openvz)
end
end
end
end
end

View File

@ -0,0 +1,15 @@
module Fog
module Compute
class Glesys
class Real
def create(options = {})
request('server/create/',options)
end
end
end
end
end

View File

@ -0,0 +1,18 @@
module Fog
module Compute
class Glesys
class Real
def destroy(options)
if options[:keepip].nil?
options[:keepip] = 0
end
request("/server/destroy", options)
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Fog
module Compute
class Glesys
class Real
def ip_add(params)
request("/ip/add", params)
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Fog
module Compute
class Glesys
class Real
def ip_list_free(params)
request("/ip/listfree", params)
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Fog
module Compute
class Glesys
class Real
def ip_list_free(options = {})
request("/ip/listfree", options)
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Fog
module Compute
class Glesys
class Real
def ip_list_own(options = {})
request("/ip/listown", options)
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Fog
module Compute
class Glesys
class Real
def ip_release(params)
request("/ip/release", params)
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Fog
module Compute
class Glesys
class Real
def ip_remove(params)
request("/ip/remove", params)
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Fog
module Compute
class Glesys
class Real
def ip_take(params)
request("/ip/take", params)
end
end
end
end
end

View File

@ -0,0 +1,19 @@
module Fog
module Compute
class Glesys
class Real
def list_servers(serverid = nil, options = {})
unless serverid.nil?
options[:serverid] = serverid
end
request("/server/list", options)
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Fog
module Compute
class Glesys
class Real
def server_details(serverid)
request("/server/details", { :serverid => serverid })
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Fog
module Compute
class Glesys
class Real
def server_status(serverid)
request("/server/status", { :serverid => serverid } )
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Fog
module Compute
class Glesys
class Real
def start(param)
request("/server/start", param)
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Fog
module Compute
class Glesys
class Real
def stop(param)
request("/server/stop", param)
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Fog
module Compute
class Glesys
class Real
def template_list(options = {})
request("/server/templates", options)
end
end
end
end
end

View File

@ -5,6 +5,7 @@ require 'fog/dnsimple'
require 'fog/dnsmadeeasy'
require 'fog/dynect'
require 'fog/ecloud'
require 'fog/providers/glesys'
require 'fog/go_grid'
require 'fog/google'
require 'fog/libvirt'

View File

@ -0,0 +1,11 @@
require 'fog/core'
module Fog
module Glesys
extend Fog::Provider
service(:compute, 'compute/glesys')
end
end

View File

@ -17,6 +17,9 @@ def compute_providers
},
:mocked => false
},
:glesys => {
:mocked => false
},
:ninefold => {
:mocked => false
},

View File

@ -8,7 +8,7 @@ def lorem_file
end
# check to see which credentials are available and add others to the skipped tags list
all_providers = ['aws', 'bluebox', 'brightbox', 'dnsimple', 'dnsmadeeasy', 'dynect', 'ecloud', 'gogrid', 'google', 'linode', 'local', 'ninefold', 'newservers', 'rackspace', 'slicehost', 'stormondemand', 'voxel', 'zerigo']
all_providers = ['aws', 'bluebox', 'brightbox', 'dnsimple', 'dnsmadeeasy', 'dynect', 'ecloud', 'glesys', 'gogrid', 'google', 'linode', 'local', 'ninefold', 'newservers', 'rackspace', 'slicehost', 'stormondemand', 'voxel', 'zerigo']
available_providers = Fog.available_providers.map {|provider| provider.downcase}
for provider in (all_providers - available_providers)
Formatador.display_line("[yellow]Skipping tests for [bold]#{provider}[/] [yellow]due to lacking credentials (add some to '~/.fog' to run them)[/]")