1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00
fog--fog/lib/fog/google/models/compute/server.rb
Nat Welch c258dee6ec [google|compute] Fix metadata bug.
Works for when you have metadata, but no sshKeys metadata.
2013-10-04 15:06:42 -07:00

127 lines
3.6 KiB
Ruby

require 'fog/compute/models/server'
require 'net/ssh/proxy/command'
module Fog
module Compute
class Google
class Server < Fog::Compute::Server
identity :name
attribute :image_name, :aliases => 'image'
attribute :network_interfaces, :aliases => 'networkInterfaces'
attribute :network, :aliases => 'network'
attribute :external_ip, :aliases => 'externalIP'
attribute :state, :aliases => 'status'
attribute :zone_name, :aliases => 'zone'
attribute :machine_type, :aliases => 'machineType'
attribute :disks, :aliases => 'disks'
attribute :kernel, :aliases => 'kernel'
attribute :metadata
def destroy
requires :name, :zone
service.delete_server(name, zone)
end
def image
service.get_image(self.image_name.split('/')[-1])
end
def public_ip_address
ip = nil
if self.network_interfaces.respond_to? :each
self.network_interfaces.each do |netif|
if netif["accessConfigs"].respond_to? :each
netif["accessConfigs"].each do |access_config|
if access_config["name"] == "External NAT"
ip = access_config['natIP']
end
end
end
end
end
ip
end
def private_ip_address
ip = nil
if self.network_interfaces.respond_to? :first
ip = self.network_interfaces.first['networkIP']
end
ip
end
def ready?
self.state == RUNNING
end
def zone
if self.zone_name.is_a? String
service.get_zone(self.zone_name.split('/')[-1]).body["name"]
elsif zone_name.is_a? Excon::Response
service.get_zone(zone_name.body["name"]).body["name"]
else
self.zone_name
end
end
def add_ssh_key username, key
if self.metadata.nil?
self.metadata = Hash.new("")
end
# You can have multiple SSH keys, seperated by newlines.
# https://developers.google.com/compute/docs/console?hl=en#sshkeys
if !self.metadata["sshKeys"]
self.metadata["sshKeys"] = ""
end
if !self.metadata["sshKeys"].empty?
self.metadata["sshKeys"] += "\n"
end
self.metadata["sshKeys"] += "#{username}:#{key.strip}"
return self.metadata
end
def reload
data = service.get_server(self.name, self.zone).body
self.merge_attributes(data)
end
def save
requires :name
requires :machine_type
requires :zone_name
if not service.zones.find{ |zone| zone.name == self.zone_name }
raise ArgumentError.new "#{self.zone_name.inspect} is either down or you don't have permission to use it."
end
self.add_ssh_key(self.username, self.public_key) if self.public_key
options = {
'image' => image_name,
'machineType' => machine_type,
'networkInterfaces' => network_interfaces,
'network' => network,
'externalIp' => external_ip,
'disks' => disks,
'kernel' => kernel,
'metadata' => metadata
}.delete_if {|key, value| value.nil?}
service.insert_server(name, zone_name, options)
data = service.backoff_if_unfound {service.get_server(self.name, self.zone_name).body}
service.servers.merge_attributes(data)
end
end
end
end
end