mirror of
https://github.com/fog/fog.git
synced 2022-11-09 13:51:43 -05:00
2ff638b085
Adding fog-suport for optional arguments in Glesys::Server#save to support https://github.com/GleSYS/API/wiki/functions_server#wiki-servercreate .
143 lines
3.9 KiB
Ruby
143 lines
3.9 KiB
Ruby
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 :uptime
|
|
attribute :templatename
|
|
attribute :managedhosting
|
|
attribute :platform
|
|
attribute :cost
|
|
attribute :rootpassword
|
|
attribute :state
|
|
attribute :iplist
|
|
attribute :description
|
|
attribute :usage
|
|
attribute :glera_enabled, :aliases => "gleraenabled"
|
|
attribute :supported_features, :aliases => "supportedfeatures"
|
|
|
|
def ready?
|
|
state == 'running'
|
|
end
|
|
|
|
def start
|
|
requires :identity
|
|
service.start(:serverid => identity)
|
|
end
|
|
|
|
def stop
|
|
requires :identity
|
|
service.stop(:serverid => identity)
|
|
end
|
|
|
|
def reboot
|
|
requires :identity
|
|
service.reboot(:serverid => identity)
|
|
end
|
|
|
|
def destroy(options = {})
|
|
requires :identity
|
|
service.destroy(options.merge!({:serverid => identity}))
|
|
end
|
|
|
|
def save
|
|
raise "Operation not supported" if self.identity
|
|
requires :hostname, :rootpassword
|
|
|
|
options = {
|
|
:datacenter => datacenter || "Falkenberg",
|
|
:platform => platform || "Xen",
|
|
:hostname => hostname,
|
|
:templatename => templatename || "Debian-6 x64",
|
|
:disksize => disksize || "10",
|
|
:memorysize => memorysize || "512",
|
|
:cpucores => cpucores || "1",
|
|
:rootpassword => rootpassword,
|
|
:transfer => transfer || "500",
|
|
}
|
|
|
|
# optional options when creating a server:
|
|
[:ip, :ipv6, :description].each do |k|
|
|
options[k] = attributes[k] if attributes[k]
|
|
end
|
|
|
|
data = service.create(options)
|
|
merge_attributes(data.body['response']['server'])
|
|
data.status == 200 ? true : false
|
|
end
|
|
|
|
def setup(credentials = {})
|
|
requires :public_ip_address, :username
|
|
require 'net/ssh'
|
|
|
|
attrs = attributes.dup
|
|
attrs.delete(:rootpassword)
|
|
|
|
commands = [
|
|
%{mkdir -p .ssh},
|
|
%{echo "#{Fog::JSON.encode(Fog::JSON.sanitize(attrs))}" >> ~/attributes.json}
|
|
]
|
|
if public_key
|
|
commands << %{echo "#{public_key}" >> ~/.ssh/authorized_keys}
|
|
end
|
|
|
|
if credentials[:password].nil? && !rootpassword.nil?
|
|
credentials[:password] = rootpassword
|
|
end
|
|
|
|
# wait for glesys to be ready
|
|
wait_for { sshable?(credentials) }
|
|
|
|
Fog::SSH.new(public_ip_address, username, credentials).run(commands)
|
|
end
|
|
|
|
def ssh(command, options={}, &block)
|
|
if options[:password].nil? && !rootpassword.nil?
|
|
options[:password] = rootpassword
|
|
end
|
|
super(command, options, &block)
|
|
end
|
|
|
|
def ips
|
|
Fog::Compute::Glesys::Ips.new(:serverid => identity, :server => self, :service => service).all
|
|
end
|
|
|
|
def ip(ip)
|
|
Fog::Compute::Glesys::Ips.new(:serverid => identity, :server => self, :service => service).get(ip)
|
|
end
|
|
|
|
def public_ip_address(options = {})
|
|
|
|
return nil if iplist.nil?
|
|
|
|
type = options[:type] || nil
|
|
|
|
ips = case type
|
|
when :ipv4 then iplist.select { |ip| ip["version"] == 4 }
|
|
when :ipv6 then iplist.select { |ip| ip["version"] == 6 }
|
|
else iplist.sort_by { |ip| ip["version"] }
|
|
end
|
|
|
|
if ips.empty?
|
|
nil
|
|
else
|
|
ips.first["ipaddress"]
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
end
|