mirror of
https://github.com/fog/fog.git
synced 2022-11-09 13:51:43 -05:00
Merge pull request #1906 from icco/next_version
[google|compute] Upgrade GCE to v1beta15 and fix a bunch of bugs
This commit is contained in:
commit
60aacd7dcb
8 changed files with 120 additions and 62 deletions
|
@ -41,6 +41,8 @@ module Fog
|
|||
request :insert_network
|
||||
request :insert_server
|
||||
|
||||
request :set_metadata
|
||||
|
||||
model_path 'fog/google/models/compute'
|
||||
model :server
|
||||
collection :servers
|
||||
|
@ -66,16 +68,15 @@ module Fog
|
|||
attr_reader :project
|
||||
|
||||
def initialize(options)
|
||||
|
||||
|
||||
base_url = 'https://www.googleapis.com/compute/'
|
||||
api_version = 'v1beta14'
|
||||
api_version = 'v1beta15'
|
||||
api_scope_url = 'https://www.googleapis.com/auth/compute'
|
||||
|
||||
@project = options[:google_project]
|
||||
google_client_email = options[:google_client_email]
|
||||
@api_url = base_url + api_version + '/projects/'
|
||||
#NOTE: loaded here to avoid requiring this as a core Fog dependency
|
||||
|
||||
# NOTE: loaded here to avoid requiring this as a core Fog dependency
|
||||
begin
|
||||
require 'google/api_client'
|
||||
rescue LoadError
|
||||
|
@ -87,6 +88,7 @@ module Fog
|
|||
:application_name => "fog",
|
||||
:application_version => Fog::VERSION,
|
||||
})
|
||||
|
||||
@client.authorization = Signet::OAuth2::Client.new({
|
||||
:audience => 'https://accounts.google.com/o/oauth2/token',
|
||||
:auth_provider_x509_cert_url => "https://www.googleapis.com/oauth2/v1/certs",
|
||||
|
@ -96,15 +98,14 @@ module Fog
|
|||
:signing_key => key,
|
||||
:token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
|
||||
})
|
||||
@client.authorization.fetch_access_token!
|
||||
|
||||
@client.authorization.fetch_access_token!
|
||||
@compute = @client.discovered_api('compute', api_version)
|
||||
@default_network = 'default'
|
||||
end
|
||||
|
||||
def build_result(api_method, parameters, body_object=nil)
|
||||
if body_object
|
||||
#p api_method, parameters
|
||||
result = @client.execute(
|
||||
:api_method => api_method,
|
||||
:parameters => parameters,
|
||||
|
@ -123,6 +124,10 @@ module Fog
|
|||
response.body = Fog::JSON.decode(result.body)
|
||||
if response.body["error"]
|
||||
response.status = response.body["error"]["code"]
|
||||
|
||||
response.body["error"]["errors"].each do |error|
|
||||
throw Fog::Errors::Error.new(error["message"])
|
||||
end
|
||||
else
|
||||
response.status = 200
|
||||
end
|
||||
|
@ -131,7 +136,7 @@ module Fog
|
|||
|
||||
end
|
||||
|
||||
RUNNING_STATE = 'RUNNING'
|
||||
RUNNING = 'RUNNING'
|
||||
|
||||
end
|
||||
end
|
||||
|
|
|
@ -12,6 +12,37 @@ module Fog
|
|||
attribute :creation_timestamp, :aliases => 'creationTimestamp'
|
||||
attribute :description
|
||||
attribute :preferred_kernel, :aliases => 'preferredKernel'
|
||||
attribute :project
|
||||
|
||||
def reload
|
||||
requires :name
|
||||
|
||||
data = {}
|
||||
if project
|
||||
data = service.get_image(name, project).body
|
||||
elsif
|
||||
[ 'google', 'debian-cloud', 'centos-cloud' ].each do |owner|
|
||||
begin
|
||||
data = service.get_image(name, owner).body
|
||||
data[:project] = owner
|
||||
rescue
|
||||
end
|
||||
end
|
||||
end
|
||||
self.merge_attributes(data)
|
||||
|
||||
self
|
||||
end
|
||||
|
||||
def save
|
||||
requires :name
|
||||
|
||||
reload
|
||||
end
|
||||
|
||||
def resource_url
|
||||
"#{self.project}/global/images/#{name}"
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
|
|
@ -16,8 +16,8 @@ module Fog
|
|||
attribute :metadata
|
||||
|
||||
def destroy
|
||||
requires :name
|
||||
service.delete_server(name)
|
||||
requires :name, :zone
|
||||
service.delete_server(name, zone)
|
||||
end
|
||||
|
||||
def image
|
||||
|
@ -25,22 +25,37 @@ module Fog
|
|||
end
|
||||
|
||||
def public_ip_address
|
||||
if self.network_interfaces.count
|
||||
self.network_interfaces[0]["networkIP"]
|
||||
else
|
||||
nil
|
||||
ip = nil
|
||||
if self.network_interfaces
|
||||
self.network_interfaces.each do |netif|
|
||||
netif["accessConfigs"].each do |access_config|
|
||||
if access_config["name"] == "External NAT"
|
||||
ip = access_config['natIP']
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
ip
|
||||
end
|
||||
|
||||
def ready?
|
||||
data = service.get_server(self.name, self.zone_name).body
|
||||
data['zone_name'] = self.zone_name
|
||||
self.merge_attributes(data)
|
||||
self.state == RUNNING_STATE
|
||||
self.state == RUNNING
|
||||
end
|
||||
|
||||
def zone
|
||||
service.get_zone(self.zone_name.split('/')[-1])
|
||||
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 reload
|
||||
data = service.get_server(self.name, self.zone).body
|
||||
self.merge_attributes(data)
|
||||
end
|
||||
|
||||
def save
|
||||
|
@ -49,29 +64,20 @@ module Fog
|
|||
requires :machine_type
|
||||
requires :zone_name
|
||||
|
||||
if metadata.nil?
|
||||
metadata = {}
|
||||
end
|
||||
|
||||
metadata.merge!({
|
||||
"sshKeys" => "#{username}:#{File.read(public_key_path).strip}"
|
||||
}) if :public_key_path
|
||||
|
||||
data = service.insert_server(
|
||||
name,
|
||||
image_name,
|
||||
zone_name,
|
||||
machine_type)
|
||||
|
||||
data = service.get_server(self.name, self.zone_name).body
|
||||
service.servers.merge_attributes(data)
|
||||
end
|
||||
|
||||
def setup(credentials = {})
|
||||
requires :public_ip_address, :public_key, :username
|
||||
service.set_metadata(self.instance, self.zone, {'sshKeys' => self.public_key })
|
||||
rescue Errno::ECONNREFUSED
|
||||
sleep(1)
|
||||
retry
|
||||
end
|
||||
|
||||
def sshable?(options={})
|
||||
service.set_metadata(self.instance, self.zone, {'sshKeys' => self.public_key })
|
||||
ready? && !public_ip_address.nil? && public_key && metadata['sshKeys']
|
||||
rescue SystemCallError, Net::SSH::AuthenticationFailed, Timeout::Error
|
||||
false
|
||||
machine_type,
|
||||
metadata)
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
@ -22,20 +22,20 @@ module Fog
|
|||
end
|
||||
|
||||
def get(identity, zone=nil)
|
||||
data = nil
|
||||
response = nil
|
||||
if zone.nil?
|
||||
service.list_zones.body['items'].each do |zone|
|
||||
data = service.get_server(identity, zone['name']).body
|
||||
break if data["code"] == 200
|
||||
response = service.get_server(identity, zone['name'])
|
||||
break if response.status == 200
|
||||
end
|
||||
else
|
||||
data = service.get_server(identity, zone).body
|
||||
response = service.get_server(identity, zone)
|
||||
end
|
||||
|
||||
if data["code"] != 200
|
||||
if response.nil? or response.status != 200
|
||||
nil
|
||||
else
|
||||
new(data)
|
||||
new(response.body)
|
||||
end
|
||||
rescue Excon::Errors::NotFound
|
||||
nil
|
||||
|
@ -44,15 +44,17 @@ module Fog
|
|||
def bootstrap(new_attributes = {})
|
||||
defaults = {
|
||||
:name => "fog-#{Time.now.to_i}",
|
||||
:image_name => "gcel-12-04-v20130225",
|
||||
:image_name => "debian-7-wheezy-v20130617",
|
||||
:machine_type => "n1-standard-1",
|
||||
:zone_name => "us-central1-a",
|
||||
:private_key_path => File.expand_path("~/.ssh/id_rsa"),
|
||||
:public_key_path => File.expand_path("~/.ssh/id_rsa.pub"),
|
||||
:username => ENV['USER'],
|
||||
}
|
||||
|
||||
server = create(defaults.merge(new_attributes))
|
||||
server.wait_for(Fog.timeout, 30) { ready? }
|
||||
server.wait_for { sshable? }
|
||||
|
||||
server
|
||||
end
|
||||
end
|
||||
|
|
|
@ -15,11 +15,14 @@ module Fog
|
|||
def delete_server(server_name, zone_name=nil)
|
||||
if zone_name.nil?
|
||||
list_zones.body['items'].each do |zone|
|
||||
data = get_server(server_name, zone['name']).body
|
||||
if data["error"].nil?
|
||||
if get_server(server_name, zone['name']).status == 200
|
||||
zone_name = zone['name']
|
||||
end
|
||||
end
|
||||
else
|
||||
if zone_name.is_a? Excon::Response
|
||||
zone_name = zone_name.body["name"]
|
||||
end
|
||||
end
|
||||
|
||||
api_method = @compute.instances.delete
|
||||
|
|
|
@ -13,10 +13,16 @@ module Fog
|
|||
class Real
|
||||
|
||||
def get_server(server_name, zone_name)
|
||||
if zone_name.is_a? Excon::Response
|
||||
zone = zone_name.body["name"]
|
||||
else
|
||||
zone = zone_name
|
||||
end
|
||||
|
||||
api_method = @compute.instances.get
|
||||
parameters = {
|
||||
'project' => @project,
|
||||
'zone' => zone_name,
|
||||
'zone' => zone,
|
||||
'instance' => server_name
|
||||
}
|
||||
|
||||
|
|
|
@ -12,16 +12,17 @@ module Fog
|
|||
|
||||
class Real
|
||||
|
||||
def format_metadata(metadata)
|
||||
{ "items" => metadata.map {|k,v| {"key" => k, "value" => v}} }
|
||||
end
|
||||
|
||||
def insert_server(server_name, image_name,
|
||||
zone_name, machine_name,
|
||||
zone_name, machine_name, metadata,
|
||||
network_name=@default_network)
|
||||
|
||||
# We need to check if the image is owned by the user or a global image.
|
||||
if get_image(image_name, @project).data['code'] == 200
|
||||
image_url = @api_url + @project + "/global/images/#{image_name}"
|
||||
else
|
||||
image_url = @api_url + "google/global/images/#{image_name}"
|
||||
end
|
||||
# We don't know the owner of the image.
|
||||
image = images.create({:name => image_name})
|
||||
@image_url = @api_url + image.resource_url
|
||||
|
||||
api_method = @compute.instances.insert
|
||||
parameters = {
|
||||
|
@ -30,10 +31,15 @@ module Fog
|
|||
}
|
||||
body_object = {
|
||||
'name' => server_name,
|
||||
'image' => image_url,
|
||||
'machineType' => @api_url + @project + "/global/machineTypes/#{machine_name}",
|
||||
'image' => @image_url,
|
||||
'machineType' => @api_url + @project + "/zones/#{zone_name}/machineTypes/#{machine_name}",
|
||||
'metadata' => format_metadata(metadata),
|
||||
'networkInterfaces' => [{
|
||||
'network' => @api_url + @project + "/global/networks/#{network_name}"
|
||||
'network' => @api_url + @project + "/global/networks/#{network_name}",
|
||||
'accessConfigs' => [{
|
||||
'type' => 'ONE_TO_ONE_NAT',
|
||||
'name' => 'External NAT',
|
||||
}]
|
||||
}]
|
||||
}
|
||||
|
||||
|
@ -41,9 +47,7 @@ module Fog
|
|||
body_object=body_object)
|
||||
response = self.build_response(result)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -12,10 +12,11 @@ module Fog
|
|||
|
||||
class Real
|
||||
|
||||
def list_machine_types
|
||||
def list_machine_types(zone_name)
|
||||
api_method = @compute.machine_types.list
|
||||
parameters = {
|
||||
'project' => 'google'
|
||||
'project' => @project,
|
||||
'zone' => zone_name,
|
||||
}
|
||||
|
||||
result = self.build_result(api_method, parameters)
|
||||
|
|
Loading…
Add table
Reference in a new issue