mirror of
https://github.com/OpenNebula/one.git
synced 2025-03-22 18:50:08 +03:00
feature #200: Get rid of Crack library for OCCI. OCCI now uses OpenNebula authorization mechanisms
This commit is contained in:
parent
95d0cf7841
commit
a6edd2483a
@ -82,54 +82,13 @@ class CloudServer
|
||||
# Generates an OpenNebula Session for the given user
|
||||
# user:: _Hash_ the user information
|
||||
# [return] an OpenNebula client session
|
||||
def one_client_user(user)
|
||||
def one_client_user(name, password)
|
||||
client = Client.new("dummy:dummy")
|
||||
client.one_auth = "#{user[:name]}:#{user[:password]}"
|
||||
client.one_auth = "#{name}:#{password}"
|
||||
|
||||
return client
|
||||
end
|
||||
|
||||
# Authenticates a user
|
||||
# name:: _String_ of the user
|
||||
# password:: _String_ of the user
|
||||
# [return] true if authenticated
|
||||
def authenticate?(name, password)
|
||||
user = get_user(name)
|
||||
|
||||
return user && user.password == password
|
||||
end
|
||||
|
||||
# Gets the data associated with a user
|
||||
# name:: _String_ the name of the user
|
||||
# [return] _Hash_ with the user data
|
||||
def get_user(name)
|
||||
user = nil
|
||||
|
||||
@user_pool.info
|
||||
@user_pool.each{ |u|
|
||||
if u.name==name
|
||||
user=Hash.new
|
||||
|
||||
user[:id] = u.id
|
||||
user[:name] = u.name
|
||||
user[:password] = u[:password]
|
||||
end
|
||||
}
|
||||
return user
|
||||
end
|
||||
|
||||
def get_template_path(instance_type_name)
|
||||
|
||||
instance_type=@instance_types[instance_type_name]
|
||||
|
||||
if !instance_type
|
||||
error = OpenNebula::Error.new("Bad instance type")
|
||||
return error
|
||||
end
|
||||
|
||||
return @config[:template_location]+"/#{instance_type['TEMPLATE']}"
|
||||
end
|
||||
|
||||
###########################################################################
|
||||
# Repository Methods
|
||||
###########################################################################
|
||||
|
@ -31,7 +31,7 @@ $: << RUBY_LIB_LOCATION+"/cloud"
|
||||
COMMANDS_HELP=<<-EOT
|
||||
** Synopsis
|
||||
occi-storage
|
||||
|
||||
|
||||
Manages OCCI storage resource
|
||||
|
||||
** Usage
|
||||
@ -40,7 +40,7 @@ occi-storage <COMMAND> [OPTIONS] [PARAMETERS]
|
||||
COMMANDS
|
||||
|
||||
create <occi xml file>
|
||||
creates a new storage resource described by the provided
|
||||
creates a new storage resource described by the provided
|
||||
<occi xml file>
|
||||
|
||||
list
|
||||
@ -81,7 +81,7 @@ EOT
|
||||
require 'occi/OCCIClient'
|
||||
require 'CloudClient'
|
||||
require 'getoptlong'
|
||||
require "rexml/document"
|
||||
require 'rexml/document'
|
||||
require 'pp'
|
||||
include CloudCLI
|
||||
|
||||
@ -120,12 +120,12 @@ begin
|
||||
when '--debug'
|
||||
debug = true
|
||||
when '--multipart'
|
||||
curb = false
|
||||
curb = false
|
||||
end
|
||||
end
|
||||
rescue Exception => e
|
||||
exit(-1)
|
||||
end
|
||||
end
|
||||
|
||||
if !ARGV[0]
|
||||
puts "#{cmd_name}: [COMMAND] not present"
|
||||
@ -158,21 +158,21 @@ case ARGV[0].downcase
|
||||
when 'show'
|
||||
image_id = ARGV[1]
|
||||
|
||||
if !image_id
|
||||
if !image_id
|
||||
puts "#{cmd_name} show: missing storage id parameter"
|
||||
exit(-1)
|
||||
end
|
||||
|
||||
|
||||
rc = occi_client.get_image(image_id)
|
||||
|
||||
when 'delete'
|
||||
image_id = ARGV[1]
|
||||
|
||||
if !image_id
|
||||
if !image_id
|
||||
puts "#{cmd_name} show: missing storage id parameter"
|
||||
exit(-1)
|
||||
end
|
||||
|
||||
|
||||
rc = occi_client.delete_image(image_id)
|
||||
|
||||
else
|
||||
@ -182,22 +182,22 @@ end
|
||||
|
||||
if CloudClient::is_error?(rc)
|
||||
puts rc.to_s()
|
||||
else
|
||||
else
|
||||
begin
|
||||
doc = REXML::Document.new(rc)
|
||||
rescue REXML::ParseException => e
|
||||
puts e.message
|
||||
puts e.message
|
||||
exit(-1)
|
||||
end
|
||||
|
||||
|
||||
xml = doc.root
|
||||
|
||||
|
||||
if xml.nil?
|
||||
puts rc
|
||||
exit(-1)
|
||||
end
|
||||
|
||||
|
||||
str = ""
|
||||
REXML::Formatters::Pretty.new(4).write(xml,str)
|
||||
puts "\n" + str + "\n "
|
||||
puts "\n" + str + "\n "
|
||||
end
|
||||
|
@ -1,33 +1,40 @@
|
||||
#
|
||||
# Virtual Machine Template generated for large instance types. Adjust this
|
||||
# by setting the desired capacity (CPU,MEMORY) or adding specific
|
||||
# attributes for your cloud (e.g. OS). You should not need to change the DISK
|
||||
# and NIC sections
|
||||
#
|
||||
|
||||
CPU = 8
|
||||
MEMORY = 8192
|
||||
|
||||
NAME = <%= vm_info['NAME'] %>
|
||||
NAME = <%= @vm_info['NAME'] %>
|
||||
|
||||
<% if vm_info['DISK'] %>
|
||||
<% vm_info['DISK'].each do |disk| %>
|
||||
<% if disk['STORAGE'] && disk['STORAGE']['href'] %>
|
||||
DISK = [ IMAGE_ID = <%= disk['STORAGE']['href'].split('/').last %>
|
||||
<% if disk.key?('OVERWRITE') %>
|
||||
,OVERWRITE = "yes"
|
||||
<% end %>
|
||||
<% if disk['SAVE_AS'] %>
|
||||
,SAVE_AS = "<%= disk['SAVE_AS'] %>"
|
||||
<% end %>
|
||||
]
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% if @vm_info['DISK'] %>
|
||||
<% @vm_info.each('DISK') do |disk| %>
|
||||
<% if disk['STORAGE'] && disk.attr('STORAGE','href') %>
|
||||
DISK = [ IMAGE_ID = <%= disk.attr('STORAGE','href').split('/').last %>
|
||||
<% if disk['OVERWRITE'] %>
|
||||
,OVERWRITE = "yes"
|
||||
<% end %>
|
||||
<% if disk['SAVE_AS'] %>
|
||||
,SAVE_AS = "<%= disk['SAVE_AS'] %>"
|
||||
<% end %>
|
||||
]
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<% if vm_info['NIC'] %>
|
||||
<% vm_info['NIC'].each do |nic| %>
|
||||
<% if nic['NETWORK'] && nic['NETWORK']['href'] %>
|
||||
NIC = [ NETWORK_ID = <%= nic['NETWORK']['href'].split('/').last %>
|
||||
<% if nic['IP'] %>
|
||||
,IP = <%= nic['IP'] %>
|
||||
<% end %>
|
||||
]
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% if @vm_info['NIC'] %>
|
||||
<% @vm_info.each('NIC') do |nic| %>
|
||||
<% if nic['NETWORK'] && nic.attr('NETWORK','href') %>
|
||||
NIC = [ NETWORK_ID = <%= nic.attr('NETWORK','href').split('/').last %>
|
||||
<% if nic['IP'] %>
|
||||
,IP = <%= nic['IP'] %>
|
||||
<% end %>
|
||||
]
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
INSTANCE_TYPE = <%= vm_info['INSTANCE_TYPE']%>
|
||||
INSTANCE_TYPE = <%= @vm_info['INSTANCE_TYPE']%>
|
@ -1,33 +1,41 @@
|
||||
#
|
||||
# Virtual Machine Template generated for medium instance types. Adjust this
|
||||
# by setting the desired capacity (CPU,MEMORY) or adding specific
|
||||
# attributes for your cloud (e.g. OS). You should not need to change the DISK
|
||||
# and NIC sections
|
||||
#
|
||||
|
||||
CPU = 4
|
||||
MEMORY = 4096
|
||||
|
||||
NAME = <%= vm_info['NAME'] %>
|
||||
NAME = <%= @vm_info['NAME'] %>
|
||||
|
||||
<% if vm_info['DISK'] %>
|
||||
<% vm_info['DISK'].each do |disk| %>
|
||||
<% if disk['STORAGE'] && disk['STORAGE']['href'] %>
|
||||
DISK = [ IMAGE_ID = <%= disk['STORAGE']['href'].split('/').last %>
|
||||
<% if disk.key?('OVERWRITE') %>
|
||||
,OVERWRITE = "yes"
|
||||
<% end %>
|
||||
<% if disk['SAVE_AS'] %>
|
||||
,SAVE_AS = "<%= disk['SAVE_AS'] %>"
|
||||
<% end %>
|
||||
]
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% if @vm_info['DISK'] %>
|
||||
<% @vm_info.each('DISK') do |disk| %>
|
||||
<% if disk['STORAGE'] && disk.attr('STORAGE','href') %>
|
||||
DISK = [ IMAGE_ID = <%= disk.attr('STORAGE','href').split('/').last %>
|
||||
<% if disk['OVERWRITE'] %>
|
||||
,OVERWRITE = "yes"
|
||||
<% end %>
|
||||
<% if disk['SAVE_AS'] %>
|
||||
,SAVE_AS = "<%= disk['SAVE_AS'] %>"
|
||||
<% end %>
|
||||
]
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<% if vm_info['NIC'] %>
|
||||
<% vm_info['NIC'].each do |nic| %>
|
||||
<% if nic['NETWORK'] && nic['NETWORK']['href'] %>
|
||||
NIC = [ NETWORK_ID = <%= nic['NETWORK']['href'].split('/').last %>
|
||||
<% if nic['IP'] %>
|
||||
,IP = <%= nic['IP'] %>
|
||||
<% end %>
|
||||
]
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% if @vm_info['NIC'] %>
|
||||
<% @vm_info.each('NIC') do |nic| %>
|
||||
<% if nic['NETWORK'] && nic.attr('NETWORK','href') %>
|
||||
NIC = [ NETWORK_ID = <%= nic.attr('NETWORK','href').split('/').last %>
|
||||
<% if nic['IP'] %>
|
||||
,IP = <%= nic['IP'] %>
|
||||
<% end %>
|
||||
]
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
INSTANCE_TYPE = <%= vm_info['INSTANCE_TYPE']%>
|
||||
INSTANCE_TYPE = <%= @vm_info['INSTANCE_TYPE']%>
|
||||
|
||||
|
@ -1,33 +1,41 @@
|
||||
#
|
||||
# Virtual Machine Template generated for small instance types. Adjust this
|
||||
# by setting the desired capacity (CPU,MEMORY) or adding specific
|
||||
# attributes for your cloud (e.g. OS). You should not need to change the DISK
|
||||
# and NIC sections
|
||||
#
|
||||
|
||||
CPU = 1
|
||||
MEMORY = 1024
|
||||
|
||||
NAME = <%= vm_info['NAME'] %>
|
||||
NAME = <%= @vm_info['NAME'] %>
|
||||
|
||||
<% if vm_info['DISK'] %>
|
||||
<% vm_info['DISK'].each do |disk| %>
|
||||
<% if disk['STORAGE'] && disk['STORAGE']['href'] %>
|
||||
DISK = [ IMAGE_ID = <%= disk['STORAGE']['href'].split('/').last %>
|
||||
<% if disk.key?('OVERWRITE') %>
|
||||
,OVERWRITE = "yes"
|
||||
<% end %>
|
||||
<% if disk['SAVE_AS'] %>
|
||||
,SAVE_AS = "<%= disk['SAVE_AS'] %>"
|
||||
<% end %>
|
||||
]
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% if @vm_info['DISK'] %>
|
||||
<% @vm_info.each('DISK') do |disk| %>
|
||||
<% if disk['STORAGE'] && disk.attr('STORAGE','href') %>
|
||||
DISK = [ IMAGE_ID = <%= disk.attr('STORAGE','href').split('/').last %>
|
||||
<% if disk['OVERWRITE'] %>
|
||||
,OVERWRITE = "yes"
|
||||
<% end %>
|
||||
<% if disk['SAVE_AS'] %>
|
||||
,SAVE_AS = "<%= disk['SAVE_AS'] %>"
|
||||
<% end %>
|
||||
]
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<% if vm_info['NIC'] %>
|
||||
<% vm_info['NIC'].each do |nic| %>
|
||||
<% if nic['NETWORK'] && nic['NETWORK']['href'] %>
|
||||
NIC = [ NETWORK_ID = <%= nic['NETWORK']['href'].split('/').last %>
|
||||
<% if nic['IP'] %>
|
||||
,IP = <%= nic['IP'] %>
|
||||
<% end %>
|
||||
]
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% if @vm_info['NIC'] %>
|
||||
<% @vm_info.each('NIC') do |nic| %>
|
||||
<% if nic['NETWORK'] && nic.attr('NETWORK','href') %>
|
||||
NIC = [ NETWORK_ID = <%= nic.attr('NETWORK','href').split('/').last %>
|
||||
<% if nic['IP'] %>
|
||||
,IP = <%= nic['IP'] %>
|
||||
<% end %>
|
||||
]
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
INSTANCE_TYPE = <%= vm_info['INSTANCE_TYPE']%>
|
||||
INSTANCE_TYPE = <%= @vm_info['INSTANCE_TYPE']%>
|
||||
|
||||
|
@ -37,29 +37,29 @@ class ImageOCCI < Image
|
||||
|
||||
|
||||
ONE_IMAGE = %q{
|
||||
NAME = "<%= @image_info.elements['NAME'].text %>"
|
||||
<% if @image_info.elements['DESCRIPTION'] != nil %>
|
||||
DESCRIPTION = "<%= @image_info.elements['DESCRIPTION'].text %>"
|
||||
NAME = "<%= @image_info['NAME'] %>"
|
||||
<% if @image_info['DESCRIPTION'] != nil %>
|
||||
DESCRIPTION = "<%= @image_info['DESCRIPTION'] %>"
|
||||
<% end %>
|
||||
<% if @image_info.elements['TYPE'] != nil %>
|
||||
TYPE = <%= @image_info.elements['TYPE'].text %>
|
||||
<% if @image_info['TYPE'] != nil %>
|
||||
TYPE = <%= @image_info['TYPE'] %>
|
||||
<% end %>
|
||||
<% if @image_info.elements['FSTYPE'] != nil %>
|
||||
FSTYPE = <%= @image_info.elements['FSTYPE'].text %>
|
||||
<% if @image_info['FSTYPE'] != nil %>
|
||||
FSTYPE = <%= @image_info['FSTYPE'] %>
|
||||
<% end %>
|
||||
<% if @image_info.elements['SIZE'] != nil %>
|
||||
SIZE = <%= @image_info.elements['SIZE'].text %>
|
||||
<% if @image_info['SIZE'] != nil %>
|
||||
SIZE = <%= @image_info['SIZE'] %>
|
||||
<% end %>
|
||||
}.gsub(/^ /, '')
|
||||
|
||||
# Class constructor
|
||||
def initialize(xml, client, xml_info=nil)
|
||||
super(xml, client)
|
||||
@image_info = nil
|
||||
|
||||
if xml_info != nil
|
||||
@image_info = REXML::Document.new(xml_info).root
|
||||
else
|
||||
@image_info = nil
|
||||
xmldoc = XMLUtilsElement.initialize_xml(xml_info, 'STORAGE')
|
||||
@image_info = XMLElement.new(xmldoc) if xmldoc != nil
|
||||
end
|
||||
end
|
||||
|
||||
@ -81,13 +81,13 @@ class ImageOCCI < Image
|
||||
end
|
||||
|
||||
def to_one_template()
|
||||
if @image_info.name != 'STORAGE'
|
||||
if @image_info == nil
|
||||
error_msg = "Missing STORAGE section in the XML body"
|
||||
error = OpenNebula::Error.new(error_msg)
|
||||
return error
|
||||
end
|
||||
|
||||
if @image_info.elements['NAME'] == nil
|
||||
if @image_info['NAME'] == nil
|
||||
error_msg = "Missing Image NAME in the XML DISK section"
|
||||
error = OpenNebula::Error.new(error_msg)
|
||||
return error
|
||||
|
@ -57,41 +57,13 @@ class OCCIServer < CloudServer
|
||||
print_configuration
|
||||
end
|
||||
|
||||
# Authorization function
|
||||
# requestenv:: _Hash_ Hash containing the environment of the request
|
||||
# [return] _Boolean_ Whether the user is authorized or not
|
||||
def authenticate?(requestenv)
|
||||
auth ||= Rack::Auth::Basic::Request.new(requestenv)
|
||||
|
||||
if !(auth.provided? && auth.basic? && auth.credentials)
|
||||
return false
|
||||
end
|
||||
|
||||
user = get_user(requestenv, auth)
|
||||
|
||||
if user
|
||||
if user[:password] == auth.credentials[1]
|
||||
return true
|
||||
end
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
# Retrieve the user crendentials
|
||||
# requestenv:: _Hash_ Hash containing the environment of the request
|
||||
# [return] _User_ User structure
|
||||
def get_user(requestenv, auth=nil)
|
||||
auth = Rack::Auth::Basic::Request.new(requestenv) if !auth
|
||||
super(auth.credentials.first)
|
||||
end
|
||||
|
||||
# Retrieve a client with the user credentials
|
||||
# requestenv:: _Hash_ Hash containing the environment of the request
|
||||
# [return] _Client_ client with the user credentials
|
||||
def get_client(requestenv)
|
||||
user = get_user(requestenv)
|
||||
return one_client_user(user)
|
||||
auth = Rack::Auth::Basic::Request.new(requestenv)
|
||||
|
||||
return one_client_user(auth.credentials[0], auth.credentials[1])
|
||||
end
|
||||
|
||||
# Prepare the OCCI XML Response
|
||||
@ -104,17 +76,6 @@ class OCCIServer < CloudServer
|
||||
return xml_response, 201
|
||||
end
|
||||
|
||||
def get_info_hash(body)
|
||||
if body
|
||||
info = XMLUtilsElement::xml_to_hash(body.read)
|
||||
return info
|
||||
else
|
||||
error_msg = "OCCI XML representation not present"
|
||||
error = OpenNebula::Error.new(error_msg)
|
||||
return error
|
||||
end
|
||||
end
|
||||
|
||||
############################################################################
|
||||
############################################################################
|
||||
# POOL RESOURCE METHODS
|
||||
@ -192,26 +153,14 @@ class OCCIServer < CloudServer
|
||||
# request:: _Hash_ hash containing the data of the request
|
||||
# [return] _String_,_Integer_ COMPUTE Representation or error, status code
|
||||
def post_compute(request)
|
||||
# --- Get client with user credentials ---
|
||||
client = get_client(request.env)
|
||||
|
||||
# --- Check OCCI XML from POST ---
|
||||
vm_info = get_info_hash(request.body)
|
||||
return vm_info, 400 if OpenNebula.is_error?(vm_info)
|
||||
|
||||
# --- Get Template Path ---
|
||||
if vm_info['COMPUTE']
|
||||
path = get_template_path(vm_info['COMPUTE']['INSTANCE_TYPE'])
|
||||
return path, 500 if OpenNebula.is_error?(path)
|
||||
|
||||
vm_info['TEMPLATE_PATH'] = path
|
||||
end
|
||||
|
||||
# --- Create the new Instance ---
|
||||
vm = VirtualMachineOCCI.new(
|
||||
vm_info,
|
||||
VirtualMachine.build_xml,
|
||||
client)
|
||||
get_client(request.env),
|
||||
request.body.read,
|
||||
@instance_types,
|
||||
@config[:template_location])
|
||||
|
||||
# --- Generate the template and Allocate the new Instance ---
|
||||
template = vm.to_one_template
|
||||
@ -230,14 +179,11 @@ class OCCIServer < CloudServer
|
||||
# [return] _String_,_Integer_ COMPUTE representation or error,
|
||||
# status code
|
||||
def get_compute(request, params)
|
||||
# --- Get client with user credentials ---
|
||||
client = get_client(request.env)
|
||||
|
||||
# --- Get the VM ---
|
||||
vm = VirtualMachineOCCI.new(
|
||||
nil,
|
||||
VirtualMachine.build_xml(params[:id]),
|
||||
client)
|
||||
get_client(request.env))
|
||||
|
||||
result = vm.info
|
||||
return result, 404 if OpenNebula::is_error?(result)
|
||||
@ -252,13 +198,11 @@ class OCCIServer < CloudServer
|
||||
# [return] _String_,_Integer_ Delete confirmation msg or error,
|
||||
# status code
|
||||
def delete_compute(request, params)
|
||||
# --- Get client with user credentials ---
|
||||
client = get_client(request.env)
|
||||
|
||||
# --- Get the VM ---
|
||||
vm = VirtualMachineOCCI.new(
|
||||
nil,
|
||||
VirtualMachine.build_xml(params[:id]),
|
||||
client)
|
||||
get_client(request.env))
|
||||
|
||||
# --- Finalize the VM ---
|
||||
result = vm.finalize
|
||||
@ -272,21 +216,16 @@ class OCCIServer < CloudServer
|
||||
# [return] _String_,_Integer_ Update confirmation msg or error,
|
||||
# status code
|
||||
def put_compute(request, params)
|
||||
# --- Get client with user credentials ---
|
||||
client = get_client(request.env)
|
||||
|
||||
# --- Check OCCI XML from POST ---
|
||||
vm_info = get_info_hash(request.body)
|
||||
return vm_info, 400 if OpenNebula.is_error?(vm_info)
|
||||
vm_info = XMLUtilsElement.initialize_xml(xml_info, 'COMPUTE')
|
||||
|
||||
# --- Get the VM and Action on it ---
|
||||
if vm_info['COMPUTE'] && vm_info['COMPUTE']['STATE']
|
||||
if vm_info['STATE'] != nil
|
||||
vm = VirtualMachineOCCI.new(
|
||||
vm_info,
|
||||
VirtualMachine.build_xml(params[:id]),
|
||||
client)
|
||||
get_client(request.env))
|
||||
|
||||
rc = vm.mk_action(vm_info['STATE'])
|
||||
|
||||
rc = vm.mk_action(vm_info['COMPUTE']['STATE'])
|
||||
return rc, 400 if OpenNebula.is_error?(rc)
|
||||
else
|
||||
error_msg = "State not defined in the OCCI XML"
|
||||
@ -307,13 +246,11 @@ class OCCIServer < CloudServer
|
||||
# request:: _Hash_ hash containing the data of the request
|
||||
# [return] _String_,_Integer_ Network Representation or error, status code
|
||||
def post_network(request)
|
||||
# --- Get client with user credentials ---
|
||||
client = get_client(request.env)
|
||||
|
||||
# --- Create the new Instance ---
|
||||
network = VirtualNetworkOCCI.new(
|
||||
VirtualNetwork.build_xml,
|
||||
client,
|
||||
get_client(request.env),
|
||||
request.body,
|
||||
@config[:bridge])
|
||||
|
||||
@ -334,13 +271,10 @@ class OCCIServer < CloudServer
|
||||
# [return] _String_,_Integer_ NETWORK occi representation or error,
|
||||
# status code
|
||||
def get_network(request, params)
|
||||
# --- Get client with user credentials ---
|
||||
client = get_client(request.env)
|
||||
|
||||
# --- Get the VM ---
|
||||
network = VirtualNetworkOCCI.new(
|
||||
VirtualNetwork.build_xml(params[:id]),
|
||||
client)
|
||||
get_client(request.env))
|
||||
|
||||
result = network.info
|
||||
return result, 404 if OpenNebula::is_error?(result)
|
||||
@ -354,12 +288,10 @@ class OCCIServer < CloudServer
|
||||
# [return] _String_,_Integer_ Delete confirmation msg or error,
|
||||
# status code
|
||||
def delete_network(request, params)
|
||||
# --- Get client with user credentials ---
|
||||
client = get_client(request.env)
|
||||
|
||||
vn = VirtualNetworkOCCI.new(
|
||||
VirtualNetwork.build_xml(params[:id]),
|
||||
client)
|
||||
get_client(request.env))
|
||||
|
||||
# --- Delete the VNET ---
|
||||
result = vn.delete
|
||||
@ -376,8 +308,6 @@ class OCCIServer < CloudServer
|
||||
# request:: _Hash_ hash containing the data of the request
|
||||
# [return] _String_,_Integer_ Image representation or error, status code
|
||||
def post_storage(request)
|
||||
# Get client with user credentials
|
||||
client = get_client(request.env)
|
||||
|
||||
# --- Check OCCI XML from POST ---
|
||||
if request.params['occixml'] == nil
|
||||
@ -388,7 +318,9 @@ class OCCIServer < CloudServer
|
||||
end
|
||||
|
||||
# --- Create and Add the new Image ---
|
||||
image = ImageOCCI.new(Image.build_xml,client, request.params['occixml'])
|
||||
image = ImageOCCI.new(Image.build_xml,
|
||||
get_client(request.env),
|
||||
request.params['occixml'])
|
||||
|
||||
rc = add_image(image, request.params['file'])
|
||||
return rc, 500 if OpenNebula.is_error?(rc)
|
||||
@ -406,11 +338,10 @@ class OCCIServer < CloudServer
|
||||
# [return] _String_,_Integer_ STORAGE occi representation or error,
|
||||
# status code
|
||||
def get_storage(request, params)
|
||||
# --- Get client with user credentials ---
|
||||
client = get_client(request.env)
|
||||
|
||||
# --- Get the Image ---
|
||||
image = ImageOCCI.new(Image.build_xml(params[:id]), client)
|
||||
image = ImageOCCI.new(Image.build_xml(params[:id]),
|
||||
get_client(request.env))
|
||||
|
||||
result = image.info
|
||||
return result, 404 if OpenNebula::is_error?(result)
|
||||
@ -424,10 +355,9 @@ class OCCIServer < CloudServer
|
||||
# [return] _String_,_Integer_ Delete confirmation msg or error,
|
||||
# status code
|
||||
def delete_storage(request, params)
|
||||
# --- Get client with user credentials ---
|
||||
client = get_client(request.env)
|
||||
|
||||
image = ImageOCCI.new(Image.build_xml(params[:id]), client)
|
||||
image = ImageOCCI.new(Image.build_xml(params[:id]),
|
||||
get_client(request.env))
|
||||
|
||||
# --- Delete the Image ---
|
||||
result = image.delete
|
||||
|
@ -23,12 +23,12 @@ class VirtualMachineOCCI < VirtualMachine
|
||||
<COMPUTE href="<%= base_url %>/compute/<%= self.id.to_s %>">
|
||||
<ID><%= self.id.to_s%></ID>
|
||||
<NAME><%= self.name%></NAME>
|
||||
<% if template['INSTANCE_TYPE'] %>
|
||||
<INSTANCE_TYPE><%= template['INSTANCE_TYPE'] %></INSTANCE_TYPE>
|
||||
<% if self['TEMPLATE/INSTANCE_TYPE'] %>
|
||||
<INSTANCE_TYPE><%= self['TEMPLATE/INSTANCE_TYPE'] %></INSTANCE_TYPE>
|
||||
<% end %>
|
||||
<STATE><%= self.state_str %></STATE>
|
||||
<% if template['DISK'] %>
|
||||
<% template['DISK'].each do |disk| %>
|
||||
<% if self['TEMPLATE/DISK'] %>
|
||||
<% self.each('TEMPLATE/DISK') do |disk| %>
|
||||
<DISK>
|
||||
<STORAGE href="<%= base_url %>/storage/<%= disk['IMAGE_ID'] %>" name="<%= disk['IMAGE'] %>"/>
|
||||
<TYPE><%= disk['TYPE'] %></TYPE>
|
||||
@ -42,8 +42,8 @@ class VirtualMachineOCCI < VirtualMachine
|
||||
</DISK>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% if template['NIC'] %>
|
||||
<% template['NIC'].each do |nic| %>
|
||||
<% if self['TEMPLATE/NIC'] %>
|
||||
<% self.each('TEMPLATE/NIC') do |nic| %>
|
||||
<NIC>
|
||||
<NETWORK href="<%= base_url %>/network/<%= nic['NETWORK_ID'] %>" name="<%= nic['NETWORK'] %>"/>
|
||||
<% if nic['IP'] %>
|
||||
@ -55,19 +55,33 @@ class VirtualMachineOCCI < VirtualMachine
|
||||
</NIC>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</COMPUTE>
|
||||
</COMPUTE>
|
||||
}
|
||||
|
||||
# Class constructor
|
||||
def initialize(vm_info, xml, client)
|
||||
super(xml, client)
|
||||
|
||||
@vm_info = vm_info
|
||||
# Class constructor
|
||||
def initialize(xml, client, xml_info = nil, types=nil, base=nil)
|
||||
super(xml, client)
|
||||
@vm_info = nil
|
||||
@template = nil
|
||||
|
||||
if xml_info != nil
|
||||
xmldoc = XMLUtilsElement.initialize_xml(xml_info, 'COMPUTE')
|
||||
@vm_info = XMLElement.new(xmldoc) if xmldoc != nil
|
||||
end
|
||||
|
||||
if @vm_info != nil
|
||||
itype = @vm_info['INSTANCE_TYPE']
|
||||
|
||||
if itype != nil and types[itype] != nil
|
||||
@template = base + "/#{types[itype]['TEMPLATE']}"
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
def mk_action(action_str)
|
||||
case action_str.downcase
|
||||
when "stopped"
|
||||
when "stopped"
|
||||
rc = self.stop
|
||||
when "suspended"
|
||||
rc = self.suspend
|
||||
@ -77,55 +91,47 @@ class VirtualMachineOCCI < VirtualMachine
|
||||
rc = self.cancel
|
||||
when "shutdown"
|
||||
rc = self.shutdown
|
||||
when "done"
|
||||
rc = self.finalize
|
||||
else
|
||||
when "done"
|
||||
rc = self.finalize
|
||||
else
|
||||
error_msg = "Invalid state"
|
||||
error = OpenNebula::Error.new(error_msg)
|
||||
return error
|
||||
end
|
||||
|
||||
|
||||
return rc
|
||||
end
|
||||
|
||||
|
||||
def to_one_template()
|
||||
if @vm_info['COMPUTE']
|
||||
vm_info = @vm_info['COMPUTE']
|
||||
vm_info['DISK'] = [vm_info['DISK']].flatten if vm_info['DISK']
|
||||
vm_info['NIC'] = [vm_info['NIC']].flatten if vm_info['NIC']
|
||||
else
|
||||
if @vm_info == nil
|
||||
error_msg = "Missing COMPUTE section in the XML body"
|
||||
error = OpenNebula::Error.new(error_msg)
|
||||
return error, 400
|
||||
end
|
||||
|
||||
return OpenNebula::Error.new(error_msg), 400
|
||||
end
|
||||
|
||||
if @template == nil
|
||||
return OpenNebula::Error.new("Bad instance type"), 500
|
||||
end
|
||||
|
||||
begin
|
||||
template = ERB.new(File.read(@vm_info['TEMPLATE_PATH']))
|
||||
template_text = template.result(binding)
|
||||
template = ERB.new(File.read(@template))
|
||||
template_text = template.result(binding)
|
||||
rescue Exception => e
|
||||
error = OpenNebula::Error.new(e.message)
|
||||
return error
|
||||
end
|
||||
end
|
||||
|
||||
return template_text
|
||||
return template_text
|
||||
end
|
||||
|
||||
|
||||
# Creates the VMI representation of a Virtual Machine
|
||||
def to_occi(base_url)
|
||||
vm_hash = self.to_hash
|
||||
return vm_hash, 500 if OpenNebula.is_error?(vm_hash)
|
||||
|
||||
template = vm_hash['VM']['TEMPLATE']
|
||||
template['DISK']=[template['DISK']].flatten if template['DISK']
|
||||
template['NIC']=[template['NIC']].flatten if template['NIC']
|
||||
|
||||
begin
|
||||
occi_vm = ERB.new(OCCI_VM)
|
||||
occi_vm_text = occi_vm.result(binding)
|
||||
occi_vm_text = occi_vm.result(binding)
|
||||
rescue Exception => e
|
||||
error = OpenNebula::Error.new(e.message)
|
||||
return error
|
||||
end
|
||||
end
|
||||
|
||||
return occi_vm_text.gsub(/\n\s*/,'')
|
||||
end
|
||||
|
@ -31,26 +31,22 @@ class VirtualNetworkOCCI < VirtualNetwork
|
||||
}
|
||||
|
||||
ONE_NETWORK = %q{
|
||||
NAME = <%= @vnet_info.elements['NAME'].text %>
|
||||
NAME = <%= @vnet_info['NAME'] %>
|
||||
TYPE = RANGED
|
||||
BRIDGE = <%= @vnet_info.elements['BRIDGE'].text %>
|
||||
NETWORK_ADDRESS = <%= @vnet_info.elements['ADDRESS'].text %>
|
||||
NETWORK_SIZE = <%= @vnet_info.elements['SIZE'].text %>
|
||||
BRIDGE = <%= @bridge %>
|
||||
NETWORK_ADDRESS = <%= @vnet_info['ADDRESS'] %>
|
||||
NETWORK_SIZE = <%= @vnet_info['SIZE']%>
|
||||
}.gsub(/^ /, '')
|
||||
|
||||
# Class constructor
|
||||
def initialize(xml, client, xml_info=nil, bridge=nil)
|
||||
super(xml, client)
|
||||
@bridge = bridge
|
||||
@vnet_info = nil
|
||||
|
||||
if xml_info != nil and bridge != nil
|
||||
@vnet_info = REXML::Document.new(xml_info).root
|
||||
|
||||
bridge_element = REXML::Element.new("BRIDGE")
|
||||
bridge_element.add_text(bridge)
|
||||
|
||||
@vnet_info.add(bridge_element)
|
||||
else
|
||||
@vnet_info = nil
|
||||
if xml_info != nil
|
||||
xmldoc = XMLUtilsElement.initialize_xml(xml_info, 'NETWORK')
|
||||
@vnet_info = XMLElement.new(xmldoc) if xmldoc != nil
|
||||
end
|
||||
end
|
||||
|
||||
@ -68,7 +64,7 @@ class VirtualNetworkOCCI < VirtualNetwork
|
||||
end
|
||||
|
||||
def to_one_template()
|
||||
if @vnet_info.name != 'NETWORK'
|
||||
if @vnet_info == nil
|
||||
error_msg = "Missing NETWORK section in the XML body"
|
||||
error = OpenNebula::Error.new(error_msg)
|
||||
return error
|
||||
|
@ -61,13 +61,6 @@ set :port, $occi_server.config[:port]
|
||||
# Helpers
|
||||
##############################################################################
|
||||
|
||||
# Authentication
|
||||
before do
|
||||
if !$occi_server.authenticate?(request.env)
|
||||
halt 401, 'Invalid credentials'
|
||||
end
|
||||
end
|
||||
|
||||
# Response treatment
|
||||
helpers do
|
||||
def treat_response(result,rc)
|
||||
|
@ -26,10 +26,18 @@ module OpenNebula
|
||||
# [return] _XML_ object for the underlying XML engine
|
||||
def self.initialize_xml(xml, root_element)
|
||||
if NOKOGIRI
|
||||
Nokogiri::XML(xml).xpath("/#{root_element}")
|
||||
xmldoc = Nokogiri::XML(xml).xpath("/#{root_element}")
|
||||
if xmldoc.size == 0
|
||||
xmldoc = nil
|
||||
end
|
||||
else
|
||||
REXML::Document.new(xml).root
|
||||
xmldoc = REXML::Document.new(xml).root
|
||||
if xmldoc.name != root_element
|
||||
xmldoc = nil
|
||||
end
|
||||
end
|
||||
|
||||
return xmldoc
|
||||
end
|
||||
|
||||
# Extract an element from the XML description of the PoolElement.
|
||||
@ -53,6 +61,45 @@ module OpenNebula
|
||||
end
|
||||
end
|
||||
|
||||
# Gets an attribute from an elemenT
|
||||
# key:: _String_ xpath for the element
|
||||
# name:: _String_ name of the attribute
|
||||
def attr(key,name)
|
||||
value = nil
|
||||
|
||||
if NOKOGIRI
|
||||
element=@xml.xpath(key.to_s.upcase)
|
||||
if element.size == 0
|
||||
return nil
|
||||
end
|
||||
|
||||
attribute = element.attr(name)
|
||||
|
||||
value = attribute.text if attribute != nil
|
||||
else
|
||||
element=@xml.elements[key.to_s.upcase]
|
||||
|
||||
value = element.attributes[name] if element != nil
|
||||
end
|
||||
|
||||
return value
|
||||
end
|
||||
|
||||
# Iterates over every Element in the XPath and calls the block with a
|
||||
# a XMLElement
|
||||
# block:: _Block_
|
||||
def each(xpath_str,&block)
|
||||
if NOKOGIRI
|
||||
@xml.xpath(xpath_str).each { |pelem|
|
||||
block.call XMLElement.new(pelem)
|
||||
}
|
||||
else
|
||||
@xml.elements.each(xpath_str) { |pelem|
|
||||
block.call XMLElement.new(pelem)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def template_str(indent=true)
|
||||
template_like_str('TEMPLATE', indent)
|
||||
end
|
||||
@ -122,18 +169,6 @@ module OpenNebula
|
||||
str
|
||||
end
|
||||
end
|
||||
|
||||
def XMLUtilsElement.xml_to_hash(xml)
|
||||
begin
|
||||
hash = Crack::XML.parse(xml)
|
||||
rescue Exception => e
|
||||
error = OpenNebula::Error.new(e.message)
|
||||
return error
|
||||
end
|
||||
|
||||
return hash
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
###########################################################################
|
||||
@ -190,6 +225,14 @@ module OpenNebula
|
||||
return @hash
|
||||
end
|
||||
end
|
||||
|
||||
class XMLElement
|
||||
include XMLUtilsElement
|
||||
|
||||
def initialize(xml)
|
||||
@xml = xml
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user