1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00

[openstack|compute] General Cleanup and Update

- Focus on adding additional vm actions support
- New request types are not fully tested
This commit is contained in:
Nelvin Driz 2012-02-28 00:27:00 +08:00
parent 74fe4885c9
commit 4d33ccb7a7
29 changed files with 420 additions and 135 deletions

View file

@ -10,94 +10,119 @@ module Fog
recognizes :openstack_auth_token, :openstack_management_url, recognizes :openstack_auth_token, :openstack_management_url,
:persistent, :openstack_compute_service_name, :openstack_tenant :persistent, :openstack_compute_service_name, :openstack_tenant
## MODELS
#
model_path 'fog/openstack/models/compute' model_path 'fog/openstack/models/compute'
model :address
collection :addresses
model :flavor
collection :flavors
model :image
collection :images
model :server model :server
collection :servers collection :servers
model :meta model :image
collection :images
model :flavor
collection :flavors
model :metadatum
collection :metadata collection :metadata
model :key_pair model :address
collection :key_pairs collection :addresses
model :security_group model :security_group
collection :security_groups collection :security_groups
model :key_pair
collection :key_pairs
model :tenant model :tenant
collection :tenants collection :tenants
model :volume model :volume
collection :volumes collection :volumes
model :network
collection :networks
## REQUESTS
#
request_path 'fog/openstack/requests/compute' request_path 'fog/openstack/requests/compute'
request :create_server
request :delete_image
request :delete_server
request :get_flavor_details
request :get_image_details
request :get_server_details
request :list_flavors # Server CRUD
request :list_flavors_detail
request :list_images
request :list_images_detail
request :list_servers request :list_servers
request :list_servers_detail request :list_servers_detail
request :create_server
request :get_server_details
request :update_server
request :delete_server
# Server Actions
request :server_actions
request :server_action request :server_action
request :change_password_server
request :reboot_server request :reboot_server
request :rebuild_server request :rebuild_server
request :resize_server request :resize_server
request :confirm_resized_server request :confirm_resize_server
request :revert_resized_server request :revert_resize_server
request :pause_server
request :unpause_server
request :rescue_server
request :change_server_password
request :add_fixed_ip
request :remove_fixed_ip
request :server_diagnostics
# Server Extenstions
request :get_console_output
request :get_vnc_console
request :live_migrate_server
request :migrate_server
# Image CRUD
request :list_images
request :list_images_detail
request :create_image request :create_image
request :get_image_details
request :delete_image
request :update_server # Flavor
request :list_flavors
request :list_flavors_detail
request :get_flavor_details
# Metadata
request :list_metadata
request :get_metadata
request :set_metadata request :set_metadata
request :update_metadata request :update_metadata
request :list_metadata request :delete_metadata
request :get_meta
request :update_meta
request :delete_meta
# Address
request :list_addresses
request :list_all_addresses request :list_all_addresses
request :list_private_addresses request :list_private_addresses
request :list_public_addresses request :list_public_addresses
request :get_address
request :allocate_address request :allocate_address
request :associate_address request :associate_address
request :disassociate_address
request :get_address
request :list_addresses
request :release_address request :release_address
request :disassociate_address
# Security Group
request :list_security_groups
request :get_security_group
request :create_security_group request :create_security_group
request :create_security_group_rule request :create_security_group_rule
request :delete_security_group request :delete_security_group
request :delete_security_group_rule request :delete_security_group_rule
request :list_security_groups
request :get_security_group
# Key Pair
request :list_key_pairs
request :create_key_pair request :create_key_pair
request :delete_key_pair request :delete_key_pair
request :list_key_pairs
# Tenant
request :list_tenants request :list_tenants
request :set_tenant request :set_tenant
# Volume
request :list_volumes request :list_volumes
request :get_volume_details
request :create_volume request :create_volume
request :get_volume_details
request :delete_volume request :delete_volume
# Usage
request :list_usages request :list_usages
request :get_console_output
request :live_migrate_server
request :migrate_server
class Mock class Mock

View file

@ -1,6 +1,6 @@
require 'fog/core/collection' require 'fog/core/collection'
require 'fog/openstack/models/meta_parent' require 'fog/openstack/models/meta_parent'
require 'fog/openstack/models/compute/meta' require 'fog/openstack/models/compute/metadatum'
require 'fog/openstack/models/compute/image' require 'fog/openstack/models/compute/image'
require 'fog/openstack/models/compute/server' require 'fog/openstack/models/compute/server'
@ -10,7 +10,7 @@ module Fog
class Metadata < Fog::Collection class Metadata < Fog::Collection
model Fog::Compute::OpenStack::Meta model Fog::Compute::OpenStack::Metadatum
include Fog::Compute::OpenStack::MetaParent include Fog::Compute::OpenStack::MetaParent
@ -52,15 +52,15 @@ module Fog
if data.nil? if data.nil?
data={} data={}
self.each do |meta| self.each do |meta|
if meta.is_a?(Fog::Compute::OpenStack::Meta) then if meta.is_a?(Fog::Compute::OpenStack::Metadatum) then
data.store(meta.key, meta.value) data.store(meta.key, meta.value)
else else
data.store(meta["key"], meta["value"]) data.store(meta["key"], meta["value"])
end end
end end
end end
data data
end end
end end

View file

@ -4,7 +4,7 @@ require 'fog/openstack/models/meta_parent'
module Fog module Fog
module Compute module Compute
class OpenStack class OpenStack
class Meta < Fog::Model class Metadatum < Fog::Model
include Fog::Compute::OpenStack::MetaParent include Fog::Compute::OpenStack::MetaParent

View file

@ -0,0 +1,13 @@
require 'fog/core/model'
module Fog
module Compute
class OpenStack
class Network < Fog::Model
identity :id
attribute :name
attribute :addresses
end # class Network
end # class OpenStack
end # module Compute
end # module Fog

View file

@ -0,0 +1,29 @@
require 'fog/core/collection'
require 'fog/openstack/models/compute/network'
module Fog
module Compute
class OpenStack
class Networks < Fog::Collection
model Fog::Compute::OpenStack::Network
attribute :server
def all
requires :server
networks = Array.new
server.addresses.each_with_index do |address, index|
networks << {
:id => index + 1,
:name => address[0],
:addresses => address[1].map {|a| a['addr'] }
}
end
load(networks)
end
end # class Networks
end # class OpenStack
end # module Compute
end # module Fog

View file

@ -178,7 +178,7 @@ module Fog
def live_migrate(host, block_migration, disk_over_commit) def live_migrate(host, block_migration, disk_over_commit)
requires :id requires :id
connection.live_migrate_server(id, host, block_migration, disk_over_commit) connection.live_migrate_server(id, host, block_migration, disk_over_commit)
end end
def associate_address(floating_ip) def associate_address(floating_ip)
requires :id requires :id
@ -198,6 +198,10 @@ module Fog
@max_count = new_max_count @max_count = new_max_count
end end
def networks
connection.networks(:server => self)
end
# TODO: Implement /os-volumes-boot support with 'block_device_mapping' # TODO: Implement /os-volumes-boot support with 'block_device_mapping'
def save def save
raise Fog::Errors::Error.new('Resaving an existing object may create a duplicate') if identity raise Fog::Errors::Error.new('Resaving an existing object may create a duplicate') if identity

View file

@ -0,0 +1,29 @@
module Fog
module Compute
class OpenStack
class Real
# Add an IP address on a network.
#
# === Parameters
# * server_id <~String> - The ID of the server in which to add an IP to.
# * network_id <~String> - The ID of the network the IP should be on.
# === Returns
# * success <~Boolean>
def add_fixed_ip(server_id, network_id)
body = {
'addFixedIp' => {
'networkId' => network_id
}
}
server_action(server_id, body).status == 202
end # def add_fixed_ip
end # class Real
class Mock
def add_fixed_ip(server_id, network_id)
true
end # def add_fixed_ip
end # class Mock
end # class OpenStack
end # module Compute
end # module Fog

View file

@ -3,7 +3,7 @@ module Fog
class OpenStack class OpenStack
class Real class Real
def change_password_server(server_id, admin_password) def change_server_password(server_id, admin_password)
body = { 'changePassword' => { 'adminPass' => admin_password }} body = { 'changePassword' => { 'adminPass' => admin_password }}
server_action(server_id, body) server_action(server_id, body)
end end
@ -12,7 +12,7 @@ module Fog
class Mock class Mock
def change_password_server(server_id, admin_password) def change_server_password(server_id, admin_password)
response = Excon::Response.new response = Excon::Response.new
response.status = 202 response.status = 202
response response

View file

@ -3,7 +3,7 @@ module Fog
class OpenStack class OpenStack
class Real class Real
def confirm_resized_server(server_id) def confirm_resize_server(server_id)
body = { 'confirmResize' => nil } body = { 'confirmResize' => nil }
server_action(server_id, body, 204) server_action(server_id, body, 204)
end end
@ -12,7 +12,7 @@ module Fog
class Mock class Mock
def confirm_resized_server(server_id) def confirm_resize_server(server_id)
response = Excon::Response.new response = Excon::Response.new
response.status = 204 response.status = 204
response response

View file

@ -3,7 +3,7 @@ module Fog
class OpenStack class OpenStack
class Real class Real
def delete_meta(collection_name, parent_id, key) def delete_metadata(collection_name, parent_id, key)
request( request(
:expects => 204, :expects => 204,
:method => 'DELETE', :method => 'DELETE',
@ -15,7 +15,7 @@ module Fog
class Mock class Mock
def delete_meta(collection_name, parent_id, key) def delete_metadata(collection_name, parent_id, key)
response = Excon::Response.new response = Excon::Response.new
response.status = 204 response.status = 204
response response

View file

@ -3,7 +3,7 @@ module Fog
class OpenStack class OpenStack
class Real class Real
def get_meta(collection_name, parent_id, key) def get_metadata(collection_name, parent_id, key)
request( request(
:expects => [200, 203], :expects => [200, 203],
:method => 'GET', :method => 'GET',
@ -15,7 +15,7 @@ module Fog
class Mock class Mock
def get_meta(collection_name, parent_id, key) def get_metadata(collection_name, parent_id, key)
response = Excon::Response.new response = Excon::Response.new
response.status = 200 response.status = 200
response.body = { 'meta' => {} } response.body = { 'meta' => {} }

View file

@ -0,0 +1,40 @@
module Fog
module Compute
class OpenStack
class Real
# Get a vnc console for an instance.
#
# === Parameters
# * server_id <~String> - The ID of the server.
# * console_type <~String> - Type of vnc console to get ('novnc' or 'xvpvnc').
# === Returns
# * response <~Excon::Response>:
# * body <~Hash>:
# * url <~String>
# * type <~String>
def get_vnc_console(server_id, console_type)
body = {
'os-getVNCConsole' => {
'type' => console_type
}
}
server_action(server_id, body)
end # def get_vnc_console
end # class Real
class Mock
def get_vnc_console(server_id, console_type)
response = Excon::Response.new
response.status = 200
response.body = {
"console" => {
"url" => "http://192.168.27.100:6080/vnc_auto.html?token=c3606020-d1b7-445d-a88f-f7af48dd6a20",
"type" => "novnc"
}
}
response
end # def get_vnc_console
end # class Mock
end # class OpenStack
end # module Compute
end # module Fog

View file

@ -1,23 +0,0 @@
module Fog
module Compute
class OpenStack
class Real
def list_security_groups
request(
:expects => [200],
:method => 'GET',
:path => 'os-security-groups.json'
)
end
end
class Mock
end
end
end
end

View file

@ -0,0 +1,24 @@
module Fog
module Compute
class OpenStack
class Real
# Pause the server.
#
# === Parameters
# * server_id <~String> - The ID of the server to pause.
# === Returns
# * success <~Boolean>
def pause_server(server_id)
body = { 'pause' => nil }
server_action(server_id, body) == 202
end # def pause_server
end # class Real
class Mock
def pause_server(server_id)
true
end # def pause_server
end # class Mock
end # class OpenStack
end # module Compute
end # module Fog

View file

@ -0,0 +1,29 @@
module Fog
module Compute
class OpenStack
class Real
# Remove an IP address.
#
# === Parameters
# * server_id <~String> - The ID of the server in which to remove an IP from.
# * address <~String> - The IP address to be removed.
# === Returns
# * success <~Boolean>
def remove_fixed_ip(server_id, address)
body = {
'removeFixedIp' => {
'address' => address
}
}
server_action(server_id, body).status == 202
end # def remove_fixed_ip
end # class Real
class Mock
def remove_fixed_ip(server_id, network_id)
true
end # def remove_fixed_ip
end # class Mock
end # class OpenStack
end # module Compute
end # module Fog

View file

@ -0,0 +1,24 @@
module Fog
module Compute
class OpenStack
class Real
# Rescue the server.
#
# === Parameters
# * server_id <~String> - The ID of the server to be rescued.
# === Returns
# * success <~Boolean>
def rescue_server(server_id)
body = { 'rescue' => nil }
server_action(server_id, body) == 202
end # def rescue_server
end # class Real
class Mock
def rescue_server(server_id)
true
end # def rescue_server
end # class Mock
end # class OpenStack
end # module Compute
end # module Fog

View file

@ -0,0 +1,24 @@
module Fog
module Compute
class OpenStack
class Real
# Resume the server.
#
# === Parameters
# * server_id <~String> - The ID of the server to be resumed.
# === Returns
# * success <~Boolean>
def resume_server(server_id)
body = { 'resume' => nil }
server_action(server_id, body) == 202
end # def resume_server
end # class Real
class Mock
def resume_server(server_id)
true
end # def resume_server
end # class Mock
end # class OpenStack
end # module Compute
end # module Fog

View file

@ -0,0 +1,27 @@
module Fog
module Compute
class OpenStack
class Real
# Retrieve server actions.
#
# === Parameters
# * server_id <~String> - The ID of the server to query for available actions.
# === Returns
# * actions <~Array>
def server_actions(server_id)
request(
:expects => 200,
:method => 'GET',
:path => "servers/#{server_id}/actions"
).body['actions']
end # def server_actions
end # class Real
class Mock
def server_actions(server_id)
Array.new
end # def server_actions
end # class Mock
end # class OpenStack
end # module Compute
end # moduel Fog

View file

@ -0,0 +1,25 @@
module Fog
module Compute
class OpenStack
class Real
# Retrieve server diagnostics.
#
# === Parameters
# * server_id <~String> - The ID of the server to retrieve diagnostics.
# === Returns
# * actions <~Array>
def server_diagnostics(server_id)
request(
:method => 'GET',
:path => "servers/#{server_id}/diagnostics"
)
end # def server_diagnostics
end # class Real
class Mock
def server_diagnostics(server_id)
end # def server_diagnostics
end # class Real
end # class OpenStack
end # module Compute
end # module Fog

View file

@ -0,0 +1,24 @@
module Fog
module Compute
class OpenStack
class Real
# Suspend the server.
#
# === Parameters
# * server_id <~String> - The ID of the server to suspend.
# === Returns
# * success <~Boolean>
def suspend_server(server_id)
body = { 'suspend' => nil }
server_action(server_id, body).status == 202
end # def suspend_server
end # class Real
class Mock
def suspend_server(server_id)
true
end # def suspend_server
end # class Mock
end # class OpenStack
end # module Compute
end # module Fog

View file

@ -0,0 +1,24 @@
module Fog
module Compute
class OpenStack
class Real
# Unpause the server.
#
# === Parameters
# * server_id <~String> - The ID of the server to unpause.
# === Returns
# * success <~Boolean>
def unpause_server(server_id)
body = { 'unpause' => nil }
server_action(server_id, body).status == 202
end # def unpause_server
end # class Real
class Mock
def unpause_server(server_id)
true
end # def unpause_server
end # class Mock
end # class OpenStack
end # module Compute
end # module Fog

View file

@ -1,45 +0,0 @@
module Fog
module Compute
class OpenStack
class Real
def update_meta(collection_name, parent_id, key, value)
request(
:body => Fog::JSON.encode({ 'meta' => { key => value }}),
:expects => 200,
:method => 'PUT',
:path => "#{collection_name}/#{parent_id}/metadata/#{key}"
)
end
end
class Mock
def update_meta(collection_name, parent_id, key, value)
if collection_name == "images" then
if not list_images_detail.body['images'].detect {|_| _['id'] == parent_id}
raise Fog::Compute::OpenStack::NotFound
end
end
if collection_name == "servers" then
if not list_servers_detail.body['servers'].detect {|_| _['id'] == parent_id}
raise Fog::Compute::OpenStack::NotFound
end
end
response = Excon::Response.new
response.body = { "meta" => { key => value } }
response.status = 200
response
end
end
end
end
end

View file

@ -23,8 +23,8 @@ module Fog
response = Excon::Response.new response = Excon::Response.new
response.status = 202 response.status = 202
data = { data = {
'id' => Fog::Mock.random_numbers(6).to_s, 'id' => Fog::Mock.random_numbers(6).to_s,
'name' => name 'name' => name
} }
self.data[:roles][data['id']] = data self.data[:roles][data['id']] = data
response.body = { 'role' => data } response.body = { 'role' => data }

View file

@ -14,7 +14,11 @@ module Fog
end end
class Mock class Mock
def create_user_role(tenant_id, user_id, role_id)
response = Excon::Response.new
response.status = 200
response
end
end end
end end
end end

View file

@ -14,7 +14,11 @@ module Fog
end end
class Mock class Mock
def delete_user_role(tenant_id, user_id, role_id)
response = Excon::Response.new
response.status = 200
response
end
end end
end end
end end

View file

@ -16,10 +16,7 @@ module Fog
response = Excon::Response.new response = Excon::Response.new
response.status = 200 response.status = 200
response.body = { response.body = {
'roles' => [ 'roles' => self.data[:roles]
{'id' => '1',
'name' => 'admin'}
]
} }
response response
end # def list_roles_for_user_on_tenant end # def list_roles_for_user_on_tenant

View file

@ -1,7 +1,7 @@
Shindo.tests("Fog::Identity[:openstack] | role", ['openstack']) do Shindo.tests("Fog::Identity[:openstack] | role", ['openstack']) do
@instance = Fog::Identity[:openstack].roles.new({:name => 'Role Name', :user_id => 1, :role_id => 1}) @instance = Fog::Identity[:openstack].roles.new({:name => 'Role Name', :user_id => 1, :role_id => 1})
@user = Fog::Identity[:openstack].users.all.first @tenant = Fog::Identity[:openstack].tenants.create(:name => 'test_user')
@tenant = Fog::Identity[:openstack].tenants.all.first @user = Fog::Identity[:openstack].users.create(:name => 'test_user', :tenant_id => @tenant.id, :password => 'spoof')
tests('success') do tests('success') do
tests('#save').returns(true) do tests('#save').returns(true) do
@ -20,5 +20,8 @@ Shindo.tests("Fog::Identity[:openstack] | role", ['openstack']) do
@instance.destroy @instance.destroy
end end
end end
@user.destroy
@tenant.destroy
end end

View file

@ -1,7 +1,8 @@
Shindo.tests("Fog::Identity[:openstack] | roles", ['openstack']) do Shindo.tests("Fog::Identity[:openstack] | roles", ['openstack']) do
@user = Fog::Identity[:openstack].users.all.first @tenant = Fog::Identity[:openstack].tenants.create(:name => 'test_user')
@tenant = Fog::Identity[:openstack].tenants.all.first @user = Fog::Identity[:openstack].users.create(:name => 'test_user', :tenant_id => @tenant.id, :password => 'spoof')
@roles = Fog::Identity[:openstack].roles(:user => @user, :tenant => @tenant) @role = Fog::Identity[:openstack].roles(:user => @user, :tenant => @tenant).create(:name => 'test_role')
@roles = Fog::Identity[:openstack].roles(:user => @user, :tenant => @tenant)
tests('success') do tests('success') do
tests('#all').succeeds do tests('#all').succeeds do
@ -12,4 +13,7 @@ Shindo.tests("Fog::Identity[:openstack] | roles", ['openstack']) do
@roles.get @roles.first.id @roles.get @roles.first.id
end end
end end
@user.destroy
@tenant.destroy
end end