From 40f282cd8a67936d535ce73cafa03839ca1a1154 Mon Sep 17 00:00:00 2001 From: Daniel Molina Date: Thu, 2 Dec 2010 19:21:59 +0100 Subject: [PATCH] Add network publishing functionality to OCCI --- src/cloud/occi/bin/occi-network | 22 +++++++++++++--- src/cloud/occi/lib/OCCIClient.rb | 32 ++++++++++++++++++++++++ src/cloud/occi/lib/OCCIServer.rb | 28 +++++++++++++++++++++ src/cloud/occi/lib/VirtualNetworkOCCI.rb | 4 +++ src/cloud/occi/lib/occi-server.rb | 5 ++++ 5 files changed, 87 insertions(+), 4 deletions(-) diff --git a/src/cloud/occi/bin/occi-network b/src/cloud/occi/bin/occi-network index bdbeb3c57d..df53439be7 100755 --- a/src/cloud/occi/bin/occi-network +++ b/src/cloud/occi/bin/occi-network @@ -36,18 +36,22 @@ Usage: Commands: -create +* create creates a new virtual network described by the provided -list +* list lists available virtual networks -show +* show retrieves the OCCI XML representation of the virtual network identified by -delete +* update + updates the representation of the network resource represented by the + provided + +* delete deletes the virtual network idenfitied by @@ -164,6 +168,16 @@ case ARGV[0].downcase rc = occi_client.get_network(network_id) + when 'update' + network_xml = ARGV[1] + + if !network_xml || !File.exists?(network_xml) + puts "#{cmd_name} update: missing OCCI-XML or file not found" + exit -1 + end + + rc = occi_client.put_network(network_xml) + when 'delete' network_id = ARGV[1] diff --git a/src/cloud/occi/lib/OCCIClient.rb b/src/cloud/occi/lib/OCCIClient.rb index 3d8b1ba065..1188b33274 100755 --- a/src/cloud/occi/lib/OCCIClient.rb +++ b/src/cloud/occi/lib/OCCIClient.rb @@ -352,6 +352,38 @@ module OCCIClient end end + ###################################################################### + # Puts a new Network representation in order to change its state + # :xmlfile Network OCCI xml representation + ###################################################################### + def put_network(xmlfile) + xml = File.read(xmlfile) + vnet_info = REXML::Document.new(xml).root + + if vnet_info.elements['ID'] == nil + return CloudClient::Error.new("Can not find NETWORK_ID") + end + + vnet_id = vnet_info.elements['ID'].text + + url = URI.parse(@endpoint+'/network/' + vnet_id) + + req = Net::HTTP::Put.new(url.path) + req.body = xml + + req.basic_auth @occiauth[0], @occiauth[1] + + res = CloudClient::http_start(url, @timeout) do |http| + http.request(req) + end + + if CloudClient::is_error?(res) + return res + else + return res.body + end + end + ###################################################################### # :id VM identifier ###################################################################### diff --git a/src/cloud/occi/lib/OCCIServer.rb b/src/cloud/occi/lib/OCCIServer.rb index 6fd0a91290..4088ab6740 100755 --- a/src/cloud/occi/lib/OCCIServer.rb +++ b/src/cloud/occi/lib/OCCIServer.rb @@ -293,6 +293,34 @@ class OCCIServer < CloudServer return "", 204 end + + # Updates a NETWORK resource + # request:: _Hash_ hash containing the data of the request + # [return] _String_,_Integer_ Update confirmation msg or error, + # status code + def put_network(request, params) + xmldoc = XMLElement.build_xml(request.body, 'NETWORK') + vnet_info = XMLElement.new(xmldoc) if xmldoc != nil + + vnet = VirtualNetworkOCCI.new( + VirtualNetwork.build_xml(params[:id]), + get_client(request.env)) + + rc = vnet.info + return rc, 400 if OpenNebula.is_error?(rc) + + if vnet_info['PUBLIC'] == 'YES' + rc = vnet.publish + return rc, 400 if OpenNebula.is_error?(rc) + elsif vnet_info['PUBLIC'] == 'NO' + rc = vnet.unpublish + return rc, 400 if OpenNebula.is_error?(rc) + end + + # --- Prepare XML Response --- + vnet.info + return to_occi_xml(vnet, 202) + end ############################################################################ # STORAGE Methods diff --git a/src/cloud/occi/lib/VirtualNetworkOCCI.rb b/src/cloud/occi/lib/VirtualNetworkOCCI.rb index af3843be3c..7a0d765670 100755 --- a/src/cloud/occi/lib/VirtualNetworkOCCI.rb +++ b/src/cloud/occi/lib/VirtualNetworkOCCI.rb @@ -30,6 +30,7 @@ class VirtualNetworkOCCI < VirtualNetwork <% if self['TEMPLATE/NETWORK_SIZE'] %> <%= self['TEMPLATE/NETWORK_SIZE'] %> <% end %> + <%= self['PUBLIC'] == "0" ? "NO" : "YES"%> } @@ -39,6 +40,9 @@ class VirtualNetworkOCCI < VirtualNetwork <% if @vnet_info['DESCRIPTION'] != nil %> DESCRIPTION = "<%= @vnet_info['DESCRIPTION'] %>" <% end %> + <% if @vnet_info['PUBLIC'] != nil %> + PUBLIC = "<%= @vnet_info['PUBLIC'] %>" + <% end %> <% if @bridge %> BRIDGE = <%= @bridge %> <% end %> diff --git a/src/cloud/occi/lib/occi-server.rb b/src/cloud/occi/lib/occi-server.rb index 82624fdf94..bae43ac655 100755 --- a/src/cloud/occi/lib/occi-server.rb +++ b/src/cloud/occi/lib/occi-server.rb @@ -151,6 +151,11 @@ delete '/network/:id' do treat_response(result,rc) end +put '/network/:id' do + result,rc = $occi_server.put_network(request, params) + treat_response(result,rc) +end + get '/storage/:id' do result,rc = $occi_server.get_storage(request, params) treat_response(result,rc)