# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1248081158 -3600
# Node ID e34975d7d8f1ed63213486614c13c6b668989894
# Parent 62b7fc245d1f110dd04aad6523dedcd2c84178e4
xend: Add support for URI ('file:' and 'data:' scheme) for PV/kernel and
PV/ramdisk
Add support for 'file:' and 'data:' URI schemes for the parameters
'PV/kernel' and 'PV/ramdisk' in the VM.create() call. The 'data:'
scheme handling enables using a file which is stored inside the
management system (from where the XenAPI call is send) as kernel or
ramdisk.
Notes:
o all included: a detailed description can be found in the xenapi
documentation
o bumped up the version of the API document to 1.0.8 (because of
(minimal) interface extension)
o Future enhancements (like http:, ftp: schemes) fit seamlessly into
the current design / classes
Signed-off-by: Andreas Florath <xen@xxxxxxxxxxxx>
---
docs/xen-api/bibliography.tex | 5
docs/xen-api/revision-history.tex | 58 ++----
docs/xen-api/xenapi-coversheet.tex | 4
docs/xen-api/xenapi-datamodel.tex | 91 ++++++++++
docs/xen-api/xenapi.tex | 2
tools/python/xen/util/fileuri.py | 273 ++++++++++++++++++++++++++++++++
tools/python/xen/xend/XendConfig.py | 15 +
tools/python/xen/xend/XendDomainInfo.py | 6
tools/python/xen/xend/image.py | 11 +
9 files changed, 415 insertions(+), 50 deletions(-)
diff -r 62b7fc245d1f -r e34975d7d8f1 docs/xen-api/bibliography.tex
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/xen-api/bibliography.tex Mon Jul 20 10:12:38 2009 +0100
@@ -0,0 +1,5 @@
+\begin{thebibliography}{9}
+\bibitem[RFC2397]{RFC2397}
+Masinter L., \textbf{The "data" URL scheme}, RFC 2397, August 1998,
+Network Working Group, http://www.ietf.org/rfc/rfc2397.txt
+\end{thebibliography}
diff -r 62b7fc245d1f -r e34975d7d8f1 docs/xen-api/revision-history.tex
--- a/docs/xen-api/revision-history.tex Mon Jul 20 10:10:15 2009 +0100
+++ b/docs/xen-api/revision-history.tex Mon Jul 20 10:12:38 2009 +0100
@@ -1,69 +1,49 @@
{ \bf Revision History}
+% Please do not use minipages in a tabular environment; this results
+% in bad vertical alignment.
+
+\begin{flushleft}
\begin{center}
- \begin{tabular}{|l|l|l|l|}
+ \begin{tabular}{|l|l|l|>{\raggedright}p{7cm}|}
\hline
1.0.0 & 27th April 07 & Xensource et al. &
- \begin{minipage}[t][.7cm]{7cm}
- Initial Revision
- \end{minipage}\\
+ Initial Revision\tabularnewline
\hline
1.0.1 & 10th Dec. 07 & S. Berger &
- \begin{minipage}[t]{7cm}
- \begin{flushleft}
Added XSPolicy.reset\_xspolicy, VTPM.get\_other\_config,
- VTPM.set\_otherconfig. ACMPolicy.get\_enforced\_binary methods.
- \end{flushleft}
- \end{minipage}\\
+ VTPM.set\_otherconfig. ACMPolicy.get\_enforced\_binary
methods.\tabularnewline
\hline
1.0.2 & 25th Jan. 08 & J. Fehlig &
- \begin{minipage}[t]{7cm}
- \begin{flushleft}
- Added Crashed VM power state.
- \end{flushleft}
- \end{minipage}\\
+ Added Crashed VM power state.\tabularnewline
\hline
1.0.3 & 11th Feb. 08 & S. Berger &
- \begin{minipage}[t]{7cm}
- \begin{flushleft}
- Added table of contents and hyperlink cross reference.
- \end{flushleft}
- \end{minipage}\\
+ Added table of contents and hyperlink cross reference.\tabularnewline
\hline
1.0.4 & 23rd March 08 & S. Berger &
- \begin{minipage}[t]{7cm}
- \begin{flushleft}
- Added XSPolicy.can\_run
- \end{flushleft}
- \end{minipage}\\
+ Added XSPolicy.can\_run\tabularnewline
\hline
1.0.5 & 17th Apr. 08 & S. Berger &
- \begin{minipage}[t]{7cm}
- \begin{flushleft}
Added undocumented fields and methods for default\_netmask and
default\_gateway to the Network class. Removed an unimplemented
method from the XSPolicy class and removed the 'optional' from
- 'oldlabel' parameters.
- \end{flushleft}
- \end{minipage}\\
+ 'oldlabel' parameters.\tabularnewline
\hline
1.0.6 & 24th Jul. 08 & Y. Iwamatsu &
- \begin{minipage}[t]{7cm}
- \begin{flushleft}
Added definitions of new classes DPCI and PPCI. Updated the table
and the diagram representing relationships between classes.
- Added host.PPCIs and VM.DPCIs fields.
- \end{flushleft}
- \end{minipage}\\
+ Added host.PPCIs and VM.DPCIs fields.\tabularnewline
\hline
1.0.7 & 20th Oct. 08 & M. Kanno &
- \begin{minipage}[t]{7cm}
- \begin{flushleft}
Added definitions of new classes DSCSI and PSCSI. Updated the table
and the diagram representing relationships between classes.
- Added host.PSCSIs and VM.DSCSIs fields.
- \end{flushleft}
- \end{minipage}\\
+ Added host.PSCSIs and VM.DSCSIs fields.\tabularnewline
+ \hline
+ 1.0.8 & 17th Jun. 09 & A. Florath &
+ Updated interactive session example.
+ Added description for \texttt{PV/kernel} and \texttt{PV/ramdisk}
+ parameters using URIs.\tabularnewline
\hline
\end{tabular}
\end{center}
+\end{flushleft}
diff -r 62b7fc245d1f -r e34975d7d8f1 docs/xen-api/xenapi-coversheet.tex
--- a/docs/xen-api/xenapi-coversheet.tex Mon Jul 20 10:10:15 2009 +0100
+++ b/docs/xen-api/xenapi-coversheet.tex Mon Jul 20 10:12:38 2009 +0100
@@ -17,12 +17,12 @@
\newcommand{\coversheetlogo}{xen.eps}
%% Document date
-\newcommand{\datestring}{20th October 2008}
+\newcommand{\datestring}{17th June 2009}
\newcommand{\releasestatement}{Stable Release}
%% Document revision
-\newcommand{\revstring}{API Revision 1.0.7}
+\newcommand{\revstring}{API Revision 1.0.8}
%% Document authors
\newcommand{\docauthors}{
diff -r 62b7fc245d1f -r e34975d7d8f1 docs/xen-api/xenapi-datamodel.tex
--- a/docs/xen-api/xenapi-datamodel.tex Mon Jul 20 10:10:15 2009 +0100
+++ b/docs/xen-api/xenapi-datamodel.tex Mon Jul 20 10:12:38 2009 +0100
@@ -1,5 +1,6 @@
%
% Copyright (c) 2006-2007 XenSource, Inc.
+% Copyright (c) 2009 flonatel GmbH & Co. KG
%
% Permission is granted to copy, distribute and/or modify this document under
% the terms of the GNU Free Documentation License, Version 1.2 or any later
@@ -9,6 +10,7 @@
% "GNU Free Documentation License" or the file fdl.tex.
%
% Authors: Ewan Mellor, Richard Sharp, Dave Scott, Jon Harrop.
+% Contributor: Andreas Florath
%
\chapter{API Reference}
@@ -1378,10 +1380,10 @@ the batch of events
\newpage
\section{Class: VM}
\subsection{Fields for class: VM}
-\begin{longtable}{|lllp{0.38\textwidth}|}
+\begin{longtable}{|llp{0.21\textwidth}p{0.33\textwidth}|}
\hline
\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf VM} \\
-\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A
+\multicolumn{4}{|l|}{\parbox{11cm}{\em Description: A
virtual machine (or 'guest').}} \\
\hline
Quals & Field & Type & Description \\
@@ -1413,8 +1415,8 @@ Quals & Field & Type & Description \\
$\mathit{RO}_\mathit{run}$ & {\tt DPCIs} & (DPCI ref) Set & pass-through PCI
devices \\
$\mathit{RO}_\mathit{run}$ & {\tt DSCSIs} & (DSCSI ref) Set &
half-virtualized SCSI devices \\
$\mathit{RW}$ & {\tt PV/bootloader} & string & name of or path to bootloader
\\
-$\mathit{RW}$ & {\tt PV/kernel} & string & path to the kernel \\
-$\mathit{RW}$ & {\tt PV/ramdisk} & string & path to the initrd \\
+$\mathit{RW}$ & {\tt PV/kernel} & string & URI of kernel \\
+$\mathit{RW}$ & {\tt PV/ramdisk} & string & URI of initrd \\
$\mathit{RW}$ & {\tt PV/args} & string & kernel command-line arguments \\
$\mathit{RW}$ & {\tt PV/bootloader\_args} & string & miscellaneous arguments
for the bootloader \\
$\mathit{RW}$ & {\tt HVM/boot\_policy} & string & HVM boot policy \\
@@ -1429,6 +1431,87 @@ Quals & Field & Type & Description \\
$\mathit{RO}_\mathit{run}$ & {\tt security/label} & string & the VM's
security label \\
\hline
\end{longtable}
+\subsection{Parameter Details}
+\subsubsection{PV/kernel and PV/ramdisk}
+The \texttt{PV/kernel} and \texttt{PV/ramdisk} parameters should be
+specified as URIs with either a \texttt{file} or \texttt{data} scheme.
+
+The \texttt{file} scheme must be used when a file on the remote dom0
+should be used. The remote dom0 is the one where the guest system
+should be started on. Only absolute filenames are supported, i.e. the
+string must start with \texttt{file://} appended with the absolute
+path. This is typically used when the guest system use the same
+operating systems as the dom0 or there is some kind of shared storage
+for the images inside the dom0s.
+
+Note that for compatibility reasons it is possible --- but not
+recommended --- to leave out the scheme specification for
+\texttt{file}, i.e. \texttt{file:///some/path} and \texttt{/some/path}
+is equivalent.
+
+Examples (in python):
+
+Use kernel image which resides in the \texttt{/boot} directory:
+\begin{verbatim}
+xenapi.VM.create({ ...
+ 'PV_kernel': 'file:///boot/vmlinuz-2.6.26-2-xen-686',
+ ... })
+\end{verbatim}
+
+Use ramdisk image which resides on a (shared) nfs directory:
+\begin{verbatim}
+xenapi.VM.create({ ...
+ 'PV_ramdisk': 'file:///nfs/xen/debian/5.0.1/initrd.img-2.6.26-2-xen-686'
+ ... })
+\end{verbatim}
+
+When an image should be used which resides on the local system,
+i.e. the system where the XenAPI call is send from, it is possible to
+use the \texttt{data} URI scheme as described in \cite{RFC2397}. The
+media-type must be set to \texttt{application/octet-stream}.
+Currently only base64 encoding is supported. The URI must therefore
+start with \texttt{data:application/octet-stream;base64,} followed by
+the base64 encoded image.
+
+The \texttt{xen/util/fileuri.py} provides a helper function which
+takes a local filename as parameter and build up the correct URI from
+this.
+
+Examples (in python):
+
+Use kernel image specified inline:
+\begin{verbatim}
+xenapi.VM.create({ ...
+ 'PV_kernel': 'data:application/octet-stream;base64,H4Zu....'
+ # most of base64 encoded data is omitted
+ ... })
+\end{verbatim}
+
+Using the utility function:
+\begin{verbatim}
+from xen.util.fileuri import scheme_data
+xenapi.VM.create({ ...
+ 'PV_kernel': scheme_data.create_from_file(
+ "/xen/guests/images/debian/5.0.1/vmlinuz-2.6.26-2-xen-686"),
+ ... })
+\end{verbatim}
+
+Currently when using the \texttt{data} URI scheme, a temporary file is
+created on the remote dom0 in the directory
+\texttt{/var/run/xend/boot} which is then used for booting. When not
+used any longer the file is deleted. (Therefore reading of the
+\texttt{PV/kernel} or \texttt{PV/ramdisk} parameters when created with
+a \texttt{data} URI scheme returns a filename to a temporary file ---
+which might even not exists when querying.) This implementation might
+change in the way that the data is directly used --- without the
+indirection using a file. Therefore do not rely on the data resulting
+from a read of a variables which was set using the \texttt{data}
+scheme.
+
+Note: a mix of different schemes for the parameters is possible; e.g.
+the kernel can be specified with a \texttt{file} and the ramdisk with
+the \texttt{data} URI scheme.
+
\subsection{RPCs associated with class: VM}
\subsubsection{RPC name:~clone}
diff -r 62b7fc245d1f -r e34975d7d8f1 docs/xen-api/xenapi.tex
--- a/docs/xen-api/xenapi.tex Mon Jul 20 10:10:15 2009 +0100
+++ b/docs/xen-api/xenapi.tex Mon Jul 20 10:12:38 2009 +0100
@@ -18,6 +18,7 @@
\usepackage{longtable}
\usepackage{fancyhdr}
\usepackage{hyperref}
+\usepackage{array}
\setlength\topskip{0cm}
\setlength\topmargin{0cm}
@@ -54,5 +55,6 @@ Xen-enabled host.
\include{vm-lifecycle}
\include{xenapi-datamodel}
\include{fdl}
+\include{bibliography}
\end{document}
diff -r 62b7fc245d1f -r e34975d7d8f1 tools/python/xen/util/fileuri.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/python/xen/util/fileuri.py Mon Jul 20 10:12:38 2009 +0100
@@ -0,0 +1,273 @@
+#============================================================================
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#============================================================================
+# Copyright (C) 2009 flonatel GmbH & Co. KG
+#============================================================================
+
+import logging
+import os
+import base64
+import tempfile
+import stat
+from xen.xend.XendLogging import log
+from xen.util import mkdir
+# The following are needed for unit-testing only
+import unittest
+
+#
+# This functions and classes can be used where a filename is expected -
+# especially in the xenapi.VM.create() for PV_kernel and PV_ramdisk.
+#
+# The functions have a backward compatibility mode, i.e. when there is
+# no appropriate scheme detected, the data is seens as a path to a
+# (local) file.
+#
+
+class scheme_error(Exception):
+ def __init__(self, value):
+ self.value = value
+ def __str__(self):
+ return repr(self.value)
+
+# Data scheme (as defined in RFC 2397):
+# data:application/octet-stream;base64,<base64 encoded data>
+# It looks that there is currently no general purpose implementation
+# available (in python) for this URL scheme - so the very basic is
+# done here.
+#
+# Limitations
+# o Only base64 is currently supported
+class scheme_data:
+
+ @staticmethod
+ def encode(data, mediatype = 'application/octet-stream',
+ encoding = 'base64'):
+ # XXX Limit this to base64 for current implementation
+ if encoding!='base64':
+ raise scheme_error("invalid encoding")
+ return 'data:' + mediatype + ";" + encoding \
+ + "," + base64.b64encode(data)
+
+ # Private method: parse encoded data
+ @staticmethod
+ def parse(encoded_data):
+ if not isinstance(encoded_data, str):
+ raise scheme_error("encoded data has wrong type")
+ if not encoded_data.startswith('data:'):
+ raise scheme_error("'data:' scheme declaration missing")
+ comma = encoded_data.find(',', 5)
+ if comma == -1:
+ raise scheme_error("data separator (comma) is missing")
+ # Cut off the media type and encoding
+ mtenc = encoded_data[5:comma]
+ if len(mtenc)==0:
+ raise scheme_error("encoding is empty")
+ # XXX Limit to base64 encoding
+ if not mtenc.endswith(';base64'):
+ raise scheme_error("encoding is not base64")
+ mediatype = mtenc[:-7]
+ return (mediatype, 'base64', comma+1)
+
+ # Stores the data in a local file and returns the filename
+ # and a flag if this file in temporary only and must be deleted
+ # after starting the VM.
+ @staticmethod
+ def decode(encoded_data):
+ mkdir.parents("/var/run/xend/boot/", stat.S_IRWXU)
+ mediatype, encoding, data_start = scheme_data.parse(encoded_data)
+ fd, filename = tempfile.mkstemp(
+ prefix="data_uri_file.", dir="/var/run/xend/boot")
+ os.write(fd, base64.b64decode(encoded_data[data_start:]))
+ os.close(fd)
+ return filename, True
+
+ # Utility function which reads in the given (local) file and
+ # creates a data scheme from this.
+ @staticmethod
+ def create_from_file(filename):
+ try:
+ f = open(filename, "r")
+ d = f.read()
+ f.close()
+ return scheme_data.encode(d)
+ except IOError:
+ raise scheme_error("file does not exists")
+
+class scheme_data_unit_tests(unittest.TestCase):
+
+ def check_basic_encoding(self):
+ "scheme_data - basic encoding"
+ sd = scheme_data.encode('Hello!')
+ self.assertEqual(sd, 'data:application/octet-stream;base64,SGVsbG8h')
+
+ def check_encoding_with_given_mediatype(self):
+ "scheme_data - encoding with given media name"
+ sd = scheme_data.encode('Hello!', 'application/x-my-linux-kernel')
+ self.assertEqual(sd,
+ 'data:application/x-my-linux-kernel;base64,SGVsbG8h')
+
+ def check_parse_01(self):
+ "scheme_data - parsing of None"
+ self.assertRaises(scheme_error, scheme_data.parse, None)
+
+ def check_parse_02(self):
+ "scheme_data - parsing of empty string"
+ self.assertRaises(scheme_error, scheme_data.parse, "")
+
+ def check_parse_03(self):
+ "scheme_data - parsing of unstructured data"
+ self.assertRaises(scheme_error, scheme_data.parse, "akskdjdfhezezu")
+
+ def check_parse_04(self):
+ "scheme_data - data: is not at the first place"
+ self.assertRaises(scheme_error, scheme_data.parse, 'ggdata:sossm')
+
+ def check_parse_05(self):
+ "scheme_data - no comma in data"
+ self.assertRaises(scheme_error, scheme_data.parse, 'data:sossm')
+
+ def check_parse_06(self):
+ "scheme_data - encoding is empty"
+ self.assertRaises(scheme_error, scheme_data.parse, 'data:,')
+
+ def check_parse_07(self):
+ "scheme_data - unknown encoding"
+ self.assertRaises(scheme_error, scheme_data.parse,
+ 'data:somemediatype;unknown,')
+
+ def check_parse_08(self):
+ "scheme_data - parse ok - empty data"
+ mediatype, encoding, data_start = scheme_data.parse(
+ 'data:somemedia;base64,')
+ self.assertEqual(mediatype, 'somemedia')
+ self.assertEqual(encoding, 'base64')
+ self.assertEqual(data_start, 22)
+
+ def check_parse_09(self):
+ "scheme_data - parse ok - some data"
+ mediatype, encoding, data_start = scheme_data.parse(
+ 'data:somemedia;base64,HereComesTheSun')
+ self.assertEqual(mediatype, 'somemedia')
+ self.assertEqual(encoding, 'base64')
+ self.assertEqual(data_start, 22)
+
+ def check_cff_file_does_not_exist(self):
+ "scheme_data - create from file - non existent file"
+ self.assertRaises(scheme_error, scheme_data.create_from_file,
+ "/there/is/hopefully/no/file/like/this")
+
+ def check_cff_ok(self):
+ "scheme_data - create from file - ok"
+ tmppath = "/tmp/scheme_data_check_cff_ok"
+ f = open(tmppath, "w")
+ f.write("huhuhu")
+ f.close()
+ d = scheme_data.create_from_file(tmppath)
+ os.unlink(tmppath)
+ self.assertEqual(d, "data:application/octet-stream;base64,aHVodWh1")
+
+# File Scheme
+# This class supports absolut paths only.
+class scheme_file:
+
+ @staticmethod
+ def encode(filename):
+ if len(filename) == 0:
+ raise scheme_error("filename is empty")
+ if filename[0] != '/':
+ raise scheme_error("filename is not absolut")
+ return 'file://' + filename
+
+ @staticmethod
+ def decode(encoded_data):
+ if not encoded_data.startswith("file://"):
+ raise scheme_error("no file:// scheme found")
+ path = encoded_data[7:]
+ if len(path)==0:
+ raise scheme_error("path is empty")
+ if path[0]!='/':
+ raise scheme_error("path is not absolute")
+ return path, False
+
+class scheme_file_unit_tests(unittest.TestCase):
+
+ def check_encode_empty_filename(self):
+ "scheme_file - encode empty filename"
+ self.assertRaises(scheme_error, scheme_file.encode, "")
+
+ def check_encode_relative_filename(self):
+ "scheme_file - encode relative filename"
+ self.assertRaises(scheme_error, scheme_file.encode, "../there")
+
+ def check_encode_absolut_filename(self):
+ "scheme_file - encode absolut filename"
+ self.assertEqual(
+ scheme_file.encode("/here/and/there/again"),
+ 'file:///here/and/there/again')
+
+ def check_decode_01(self):
+ "scheme_file - decode empty data"
+ self.assertRaises(scheme_error, scheme_file.decode, "")
+
+ def check_decode_02(self):
+ "scheme_file - decode data with no file:// at the beginning (1)"
+ self.assertRaises(scheme_error, scheme_file.decode,
+ "phonehome://bbbb")
+
+ def check_decode_03(self):
+ "scheme_file - decode data with no file:// at the beginning (2)"
+ self.assertRaises(scheme_error, scheme_file.decode,
+ "file:/bbbb")
+
+ def check_decode_04(self):
+ "scheme_file - decode empty path"
+ self.assertRaises(scheme_error, scheme_file.decode,
+ "file://")
+
+ def check_decode_05(self):
+ "scheme_file - decode empty relative path"
+ self.assertRaises(scheme_error, scheme_file.decode,
+ "file://somewhere")
+
+ def check_decode_06(self):
+ "scheme_file - decode ok"
+ path, tmp_file = scheme_file.decode("file:///boot/vmlinuz")
+ self.assertEqual(path, "/boot/vmlinuz")
+ self.assertEqual(tmp_file, False)
+
+class scheme_set:
+
+ def __init__(self):
+ self.schemes = [scheme_data, scheme_file]
+
+ def decode(self, uri):
+ for scheme in self.schemes:
+ try:
+ # If this passes, it is the correct scheme
+ return scheme.decode(uri)
+ except scheme_error, se:
+ log.debug("Decode throws an error: '%s'" % se)
+ return uri, False
+
+schemes = scheme_set()
+
+
+def suite():
+ return unittest.TestSuite(
+ [unittest.makeSuite(scheme_data_unit_tests, 'check_'),
+ unittest.makeSuite(scheme_file_unit_tests, 'check_'),])
+
+if __name__ == "__main__":
+ testresult = unittest.TextTestRunner(verbosity=3).run(suite())
+
diff -r 62b7fc245d1f -r e34975d7d8f1 tools/python/xen/xend/XendConfig.py
--- a/tools/python/xen/xend/XendConfig.py Mon Jul 20 10:10:15 2009 +0100
+++ b/tools/python/xen/xend/XendConfig.py Mon Jul 20 10:12:38 2009 +0100
@@ -41,6 +41,7 @@ from xen.xend.XendSXPDev import dev_dict
from xen.xend.XendSXPDev import dev_dict_to_sxp
from xen.util import xsconstants
from xen.util import auxbin
+import xen.util.fileuri
log = logging.getLogger("xend.XendConfig")
log.setLevel(logging.WARN)
@@ -337,6 +338,8 @@ class XendConfig(dict):
elif dominfo:
# output from xc.domain_getinfo
self._dominfo_to_xapi(dominfo, update_mem = True)
+
+ self.handle_fileuris()
log.debug('XendConfig.init: %s' % scrub_password(self))
@@ -1999,10 +2002,14 @@ class XendConfig(dict):
self['_temp_kernel'] = sxp.child_value(image_sxp, 'kernel','')
self['_temp_ramdisk'] = sxp.child_value(image_sxp, 'ramdisk','')
self['_temp_args'] = kernel_args
+ self['use_tmp_kernel'] = True
+ self['use_tmp_ramdisk'] = True
else:
self['PV_kernel'] = sxp.child_value(image_sxp, 'kernel','')
self['PV_ramdisk'] = sxp.child_value(image_sxp, 'ramdisk','')
self['PV_args'] = kernel_args
+ self['use_tmp_kernel'] = False
+ self['use_tmp_ramdisk'] = False
self['superpages'] = sxp.child_value(image_sxp, 'superpages',0)
@@ -2076,3 +2083,11 @@ class XendConfig(dict):
pci.append([domain, bus, slot, func, vdevfn, opts])
self['platform']['pci'] = pci
+
+ def handle_fileuris(self):
+ for arg in [('PV_kernel', 'use_tmp_kernel'),
+ ('PV_ramdisk', 'use_tmp_ramdisk')]:
+ if self[arg[0]] != None:
+ self[arg[0]], self[arg[1]] \
+ = xen.util.fileuri.schemes.decode(self[arg[0]])
+ log.debug("fileuri '%s' = '%s'" % (arg[0], self[arg[0]][:100]))
diff -r 62b7fc245d1f -r e34975d7d8f1 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py Mon Jul 20 10:10:15 2009 +0100
+++ b/tools/python/xen/xend/XendDomainInfo.py Mon Jul 20 10:12:38 2009 +0100
@@ -2634,7 +2634,7 @@ class XendDomainInfo:
self._createDevices()
- self.image.cleanupBootloading()
+ self.image.cleanupTmpImages()
self.info['start_time'] = time.time()
@@ -2642,12 +2642,12 @@ class XendDomainInfo:
except VmError, exn:
log.exception("XendDomainInfo.initDomain: exception occurred")
if self.image:
- self.image.cleanupBootloading()
+ self.image.cleanupTmpImages()
raise exn
except RuntimeError, exn:
log.exception("XendDomainInfo.initDomain: exception occurred")
if self.image:
- self.image.cleanupBootloading()
+ self.image.cleanupTmpImages()
raise VmError(str(exn))
diff -r 62b7fc245d1f -r e34975d7d8f1 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py Mon Jul 20 10:10:15 2009 +0100
+++ b/tools/python/xen/xend/image.py Mon Jul 20 10:12:38 2009 +0100
@@ -89,6 +89,8 @@ class ImageHandler:
self.vm = vm
self.bootloader = False
+ self.use_tmp_kernel = False
+ self.use_tmp_ramdisk = False
self.kernel = None
self.ramdisk = None
self.cmdline = None
@@ -106,6 +108,10 @@ class ImageHandler:
self.kernel = vmConfig['PV_kernel']
self.cmdline = vmConfig['PV_args']
self.ramdisk = vmConfig['PV_ramdisk']
+ if vmConfig['use_tmp_kernel']:
+ self.use_tmp_ramdisk = True
+ if vmConfig['use_tmp_ramdisk']:
+ self.use_tmp_kernel = True
self.vm.storeVm(("image/ostype", self.ostype),
("image/kernel", self.kernel),
("image/cmdline", self.cmdline),
@@ -135,9 +141,10 @@ class ImageHandler:
if 'cpuid_check' in vmConfig:
self.cpuid_check = vmConfig['cpuid_check']
- def cleanupBootloading(self):
- if self.bootloader:
+ def cleanupTmpImages(self):
+ if self.use_tmp_kernel:
self.unlink(self.kernel)
+ if self.use_tmp_ramdisk:
self.unlink(self.ramdisk)
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|