WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-api

[Xen-API] [PATCH 1 of 2] CA-42836: in VDI import, issue an HTTP 302 redi

To: xen-api@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-API] [PATCH 1 of 2] CA-42836: in VDI import, issue an HTTP 302 redirect to the correct host rather than just assuming the current host has access to the SR
From: David Scott <dave.scott@xxxxxxxxxxxxx>
Date: Mon, 23 Aug 2010 13:03:53 +0100
Delivery-date: Mon, 23 Aug 2010 05:25:35 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1282565032@ely>
List-help: <mailto:xen-api-request@lists.xensource.com?subject=help>
List-id: Discussion of API issues surrounding Xen <xen-api.lists.xensource.com>
List-post: <mailto:xen-api@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>, <mailto:xen-api-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>, <mailto:xen-api-request@lists.xensource.com?subject=unsubscribe>
References: <patchbomb.1282565032@ely>
Sender: xen-api-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mercurial-patchbomb/1.4.3
# HG changeset patch
# User David Scott <dave.scott@xxxxxxxxxxxxx>
# Date 1282565001 -3600
# Node ID 838461861723b2801ffc5496df81c55ecbe8ebe9
# Parent  2580868fdc435e5c729f98bd707d018dafd3dc2a
CA-42836: in VDI import, issue an HTTP 302 redirect to the correct host rather 
than just assuming the current host has access to the SR.

Signed-off-by: David Scott <dave.scott@xxxxxxxxxxxxx>

diff -r 2580868fdc43 -r 838461861723 ocaml/xapi/import_raw_vdi.ml
--- a/ocaml/xapi/import_raw_vdi.ml      Fri Jul 23 18:18:39 2010 +0100
+++ b/ocaml/xapi/import_raw_vdi.ml      Mon Aug 23 13:03:21 2010 +0100
@@ -23,14 +23,20 @@
 open Unixext
 open Pervasiveext
 
-let handler (req: request) (s: Unix.file_descr) =
+let vdi_of_req ~__context (req: request) = 
+       let vdi = 
+               if List.mem_assoc "vdi" req.Http.query
+               then List.assoc "vdi" req.Http.query
+               else raise (Failure "Missing vdi query parameter") in
+       if Db_cache.DBCache.is_valid_ref vdi 
+       then Ref.of_string vdi 
+       else Db.VDI.get_by_uuid ~__context ~uuid:vdi
+
+let localhost_handler rpc session_id (req: request) (s: Unix.file_descr) =
   req.close <- true;
   Xapi_http.with_context "Importing raw VDI" req s
     (fun __context ->
-      let vdi = 
-       if List.mem_assoc "vdi" req.Http.query
-       then Ref.of_string (List.assoc "vdi" req.Http.query)
-       else raise (Failure "Missing vdi query parameter") in
+      let vdi = vdi_of_req ~__context req in
       try
        match req.transfer_encoding, req.content_length with
        | Some "chunked", _ ->
@@ -43,8 +49,7 @@
                content_type ] in
             Http_svr.headers s headers;
            
-           Helpers.call_api_functions ~__context
-             (fun rpc session_id ->
+
                 Sm_fs_ops.with_block_attached_device __context rpc session_id 
vdi `RW
                   (fun device ->
                      let fd = Unix.openfile device  [ Unix.O_WRONLY ] 0 in
@@ -57,10 +62,37 @@
                             raise (Api_errors.Server_error 
(Api_errors.vdi_io_error, ["Device I/O errors"]))
                        )
                        (fun () -> Unix.close fd)
-                  )
-             );
+                  );
 
            TaskHelper.complete ~__context []
       with e ->
        TaskHelper.failed ~__context (Api_errors.internal_error, ["Caught 
exception: " ^ (ExnHelper.string_of_exn e)]);
        raise e)
+
+let return_302_redirect (req: request) s address =
+       let url = Printf.sprintf "https://%s%s?%s"; address req.uri 
(String.concat "&" (List.map (fun (a,b) -> a^"="^b) req.query)) in
+       let headers = Http.http_302_redirect url in
+       debug "HTTP 302 redirect to: %s" url;
+       Http_svr.headers s headers
+
+let handler (req: request) (s: Unix.file_descr) =
+       Xapi_http.assert_credentials_ok "VDI.import" 
~http_action:"put_import_raw_vdi" req;
+
+       (* Perform the SR reachability check using a fresh context/task because
+          we don't want to complete the task in the forwarding case *)
+       Server_helpers.exec_with_new_task "VDI.import" 
+       (fun __context -> 
+               Helpers.call_api_functions ~__context 
+               (fun rpc session_id ->
+                       let vdi = vdi_of_req ~__context req in
+                       let sr = Db.VDI.get_SR ~__context ~self:vdi in
+                       debug "Checking whether localhost can see SR: %s" 
(Ref.string_of sr);
+                       if (Importexport.check_sr_availability ~__context sr)
+                       then localhost_handler rpc session_id req s
+                       else 
+                               let host = Importexport.find_host_for_sr 
~__context sr in
+                               let address = Db.Host.get_address ~__context 
~self:host in
+                               return_302_redirect req s address
+               )
+       )
+
 ocaml/xapi/import_raw_vdi.ml |  50 ++++++++++++++++++++++++++++++++++++-------
 1 files changed, 41 insertions(+), 9 deletions(-)


Attachment: xen-api.hg-1.patch
Description: Text Data

_______________________________________________
xen-api mailing list
xen-api@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/mailman/listinfo/xen-api
<Prev in Thread] Current Thread [Next in Thread>