[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Replace VM.platform_{std_VGA, serial, localtime, clock_offset, enable_audio} with
# HG changeset patch # User Ewan Mellor <ewan@xxxxxxxxxxxxx> # Date 1173563302 0 # Node ID 0affe03ee985ddad617d1f7b23828574cc89f324 # Parent 620212e48908b511203a1e8ad5a88a95ca0b60ac Replace VM.platform_{std_VGA,serial,localtime,clock_offset,enable_audio} with a single VM.platform String -> String Map. Propogate this change through to XendDomainInfo and image so that the backwards compatibility is handled by XendConfig. Make PCI_bus a read-write field. Added C bindings for these changes also. Signed-off-by: Ewan Mellor <ewan@xxxxxxxxxxxxx> --- docs/xen-api/xenapi-datamodel.tex | 383 +++++++++----------------------- tools/libxen/include/xen_vm.h | 100 ++------ tools/libxen/src/xen_vm.c | 244 ++++++-------------- tools/python/xen/xend/XendAPI.py | 139 ++++------- tools/python/xen/xend/XendConfig.py | 275 ++++++---------------- tools/python/xen/xend/XendDomainInfo.py | 67 +---- tools/python/xen/xend/image.py | 54 ++-- 7 files changed, 393 insertions(+), 869 deletions(-) diff -r 620212e48908 -r 0affe03ee985 docs/xen-api/xenapi-datamodel.tex --- a/docs/xen-api/xenapi-datamodel.tex Sat Mar 10 21:43:07 2007 +0000 +++ b/docs/xen-api/xenapi-datamodel.tex Sat Mar 10 21:48:22 2007 +0000 @@ -1058,12 +1058,8 @@ Quals & Field & Type & Description \\ $\mathit{RW}$ & {\tt PV/bootloader\_args} & string & miscellaneous arguments for the bootloader \\ $\mathit{RW}$ & {\tt HVM/boot\_policy} & string & HVM boot policy \\ $\mathit{RW}$ & {\tt HVM/boot\_params} & (string $\rightarrow$ string) Map & HVM boot params \\ -$\mathit{RW}$ & {\tt platform/std\_VGA} & bool & emulate standard VGA instead of cirrus logic \\ -$\mathit{RW}$ & {\tt platform/serial} & string & redirect serial port to pty \\ -$\mathit{RW}$ & {\tt platform/localtime} & bool & set RTC to local time \\ -$\mathit{RW}$ & {\tt platform/clock\_offset} & bool & timeshift applied to guest's clock \\ -$\mathit{RW}$ & {\tt platform/enable\_audio} & bool & emulate audio \\ -$\mathit{RO}_\mathit{ins}$ & {\tt PCI\_bus} & string & PCI bus path for pass-through devices \\ +$\mathit{RW}$ & {\tt platform} & (string $\rightarrow$ string) Map & platform-specific configuration \\ +$\mathit{RW}$ & {\tt PCI\_bus} & string & PCI bus path for pass-through devices \\ $\mathit{RW}$ & {\tt other\_config} & (string $\rightarrow$ string) Map & additional configuration \\ $\mathit{RO}_\mathit{run}$ & {\tt domid} & int & domain ID (if available, -1 otherwise) \\ $\mathit{RO}_\mathit{run}$ & {\tt is\_control\_domain} & bool & true if this is a control domain (domain 0 or a driver domain) \\ @@ -3407,13 +3403,13 @@ void \vspace{0.3cm} \vspace{0.3cm} \vspace{0.3cm} -\subsubsection{RPC name:~get\_platform\_std\_VGA} - -{\bf Overview:} -Get the platform/std\_VGA field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} bool get_platform_std_VGA (session_id s, VM ref self)\end{verbatim} +\subsubsection{RPC name:~get\_platform} + +{\bf Overview:} +Get the platform field of the given VM. + + \noindent {\bf Signature:} +\begin{verbatim} ((string -> string) Map) get_platform (session_id s, VM ref self)\end{verbatim} \noindent{\bf Arguments:} @@ -3431,21 +3427,21 @@ Get the platform/std\_VGA field of the g \noindent {\bf Return Type:} {\tt -bool -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_platform\_std\_VGA} - -{\bf Overview:} -Set the platform/std\_VGA field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_platform_std_VGA (session_id s, VM ref self, bool value)\end{verbatim} +(string $\rightarrow$ string) Map +} + + +value of the field +\vspace{0.3cm} +\vspace{0.3cm} +\vspace{0.3cm} +\subsubsection{RPC name:~set\_platform} + +{\bf Overview:} +Set the platform field of the given VM. + + \noindent {\bf Signature:} +\begin{verbatim} void set_platform (session_id s, VM ref self, (string -> string) Map value)\end{verbatim} \noindent{\bf Arguments:} @@ -3457,7 +3453,7 @@ Set the platform/std\_VGA field of the g {\bf type} & {\bf name} & {\bf description} \\ \hline {\tt VM ref } & self & reference to the object \\ \hline -{\tt bool } & value & New value to set \\ \hline +{\tt (string $\rightarrow$ string) Map } & value & New value to set \\ \hline \end{tabular} @@ -3473,13 +3469,13 @@ void \vspace{0.3cm} \vspace{0.3cm} \vspace{0.3cm} -\subsubsection{RPC name:~get\_platform\_serial} - -{\bf Overview:} -Get the platform/serial field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_platform_serial (session_id s, VM ref self)\end{verbatim} +\subsubsection{RPC name:~add\_to\_platform} + +{\bf Overview:} +Add the given key-value pair to the platform field of the given VM. + + \noindent {\bf Signature:} +\begin{verbatim} void add_to_platform (session_id s, VM ref self, string key, string value)\end{verbatim} \noindent{\bf Arguments:} @@ -3491,6 +3487,77 @@ Get the platform/serial field of the giv {\bf type} & {\bf name} & {\bf description} \\ \hline {\tt VM ref } & self & reference to the object \\ \hline +{\tt string } & key & Key to add \\ \hline + +{\tt string } & value & Value to add \\ \hline + +\end{tabular} + +\vspace{0.3cm} + + \noindent {\bf Return Type:} +{\tt +void +} + + + +\vspace{0.3cm} +\vspace{0.3cm} +\vspace{0.3cm} +\subsubsection{RPC name:~remove\_from\_platform} + +{\bf Overview:} +Remove the given key and its corresponding value from the platform field of +the given VM. If the key is not in that Map, then do nothing. + + \noindent {\bf Signature:} +\begin{verbatim} void remove_from_platform (session_id s, VM ref self, string key)\end{verbatim} + + +\noindent{\bf Arguments:} + + +\vspace{0.3cm} +\begin{tabular}{|c|c|p{7cm}|} + \hline +{\bf type} & {\bf name} & {\bf description} \\ \hline +{\tt VM ref } & self & reference to the object \\ \hline + +{\tt string } & key & Key to remove \\ \hline + +\end{tabular} + +\vspace{0.3cm} + + \noindent {\bf Return Type:} +{\tt +void +} + + + +\vspace{0.3cm} +\vspace{0.3cm} +\vspace{0.3cm} +\subsubsection{RPC name:~get\_PCI\_bus} + +{\bf Overview:} +Get the PCI\_bus field of the given VM. + + \noindent {\bf Signature:} +\begin{verbatim} string get_PCI_bus (session_id s, VM ref self)\end{verbatim} + + +\noindent{\bf Arguments:} + + +\vspace{0.3cm} +\begin{tabular}{|c|c|p{7cm}|} + \hline +{\bf type} & {\bf name} & {\bf description} \\ \hline +{\tt VM ref } & self & reference to the object \\ \hline + \end{tabular} \vspace{0.3cm} @@ -3505,13 +3572,13 @@ value of the field \vspace{0.3cm} \vspace{0.3cm} \vspace{0.3cm} -\subsubsection{RPC name:~set\_platform\_serial} - -{\bf Overview:} -Set the platform/serial field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_platform_serial (session_id s, VM ref self, string value)\end{verbatim} +\subsubsection{RPC name:~set\_PCI\_bus} + +{\bf Overview:} +Set the PCI\_bus field of the given VM. + + \noindent {\bf Signature:} +\begin{verbatim} void set_PCI_bus (session_id s, VM ref self, string value)\end{verbatim} \noindent{\bf Arguments:} @@ -3536,236 +3603,6 @@ void -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_platform\_localtime} - -{\bf Overview:} -Get the platform/localtime field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} bool get_platform_localtime (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -bool -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_platform\_localtime} - -{\bf Overview:} -Set the platform/localtime field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_platform_localtime (session_id s, VM ref self, bool value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt bool } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_platform\_clock\_offset} - -{\bf Overview:} -Get the platform/clock\_offset field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} bool get_platform_clock_offset (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -bool -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_platform\_clock\_offset} - -{\bf Overview:} -Set the platform/clock\_offset field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_platform_clock_offset (session_id s, VM ref self, bool value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt bool } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_platform\_enable\_audio} - -{\bf Overview:} -Get the platform/enable\_audio field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} bool get_platform_enable_audio (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -bool -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_platform\_enable\_audio} - -{\bf Overview:} -Set the platform/enable\_audio field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_platform_enable_audio (session_id s, VM ref self, bool value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt bool } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_PCI\_bus} - -{\bf Overview:} -Get the PCI\_bus field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_PCI_bus (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field \vspace{0.3cm} \vspace{0.3cm} \vspace{0.3cm} diff -r 620212e48908 -r 0affe03ee985 tools/libxen/include/xen_vm.h --- a/tools/libxen/include/xen_vm.h Sat Mar 10 21:43:07 2007 +0000 +++ b/tools/libxen/include/xen_vm.h Sat Mar 10 21:48:22 2007 +0000 @@ -106,11 +106,7 @@ typedef struct xen_vm_record char *pv_bootloader_args; char *hvm_boot_policy; xen_string_string_map *hvm_boot_params; - bool platform_std_vga; - char *platform_serial; - bool platform_localtime; - bool platform_clock_offset; - bool platform_enable_audio; + xen_string_string_map *platform; char *pci_bus; xen_string_string_map *other_config; int64_t domid; @@ -460,38 +456,10 @@ xen_vm_get_hvm_boot_params(xen_session * /** - * Get the platform/std_VGA field of the given VM. - */ -extern bool -xen_vm_get_platform_std_vga(xen_session *session, bool *result, xen_vm vm); - - -/** - * Get the platform/serial field of the given VM. - */ -extern bool -xen_vm_get_platform_serial(xen_session *session, char **result, xen_vm vm); - - -/** - * Get the platform/localtime field of the given VM. - */ -extern bool -xen_vm_get_platform_localtime(xen_session *session, bool *result, xen_vm vm); - - -/** - * Get the platform/clock_offset field of the given VM. - */ -extern bool -xen_vm_get_platform_clock_offset(xen_session *session, bool *result, xen_vm vm); - - -/** - * Get the platform/enable_audio field of the given VM. - */ -extern bool -xen_vm_get_platform_enable_audio(xen_session *session, bool *result, xen_vm vm); + * Get the platform field of the given VM. + */ +extern bool +xen_vm_get_platform(xen_session *session, xen_string_string_map **result, xen_vm vm); /** @@ -732,38 +700,32 @@ xen_vm_remove_from_hvm_boot_params(xen_s /** - * Set the platform/std_VGA field of the given VM. - */ -extern bool -xen_vm_set_platform_std_vga(xen_session *session, xen_vm vm, bool std_vga); - - -/** - * Set the platform/serial field of the given VM. - */ -extern bool -xen_vm_set_platform_serial(xen_session *session, xen_vm vm, char *serial); - - -/** - * Set the platform/localtime field of the given VM. - */ -extern bool -xen_vm_set_platform_localtime(xen_session *session, xen_vm vm, bool localtime); - - -/** - * Set the platform/clock_offset field of the given VM. - */ -extern bool -xen_vm_set_platform_clock_offset(xen_session *session, xen_vm vm, bool clock_offset); - - -/** - * Set the platform/enable_audio field of the given VM. - */ -extern bool -xen_vm_set_platform_enable_audio(xen_session *session, xen_vm vm, bool enable_audio); + * Set the platform field of the given VM. + */ +extern bool +xen_vm_set_platform(xen_session *session, xen_vm vm, xen_string_string_map *platform); + + +/** + * Add the given key-value pair to the platform field of the given VM. + */ +extern bool +xen_vm_add_to_platform(xen_session *session, xen_vm vm, char *key, char *value); + + +/** + * Remove the given key and its corresponding value from the platform + * field of the given VM. If the key is not in that Map, then do nothing. + */ +extern bool +xen_vm_remove_from_platform(xen_session *session, xen_vm vm, char *key); + + +/** + * Set the PCI_bus field of the given VM. + */ +extern bool +xen_vm_set_pci_bus(xen_session *session, xen_vm vm, char *pci_bus); /** diff -r 620212e48908 -r 0affe03ee985 tools/libxen/src/xen_vm.c --- a/tools/libxen/src/xen_vm.c Sat Mar 10 21:43:07 2007 +0000 +++ b/tools/libxen/src/xen_vm.c Sat Mar 10 21:48:22 2007 +0000 @@ -145,21 +145,9 @@ static const struct_member xen_vm_record { .key = "HVM_boot_params", .type = &abstract_type_string_string_map, .offset = offsetof(xen_vm_record, hvm_boot_params) }, - { .key = "platform_std_VGA", - .type = &abstract_type_bool, - .offset = offsetof(xen_vm_record, platform_std_vga) }, - { .key = "platform_serial", - .type = &abstract_type_string, - .offset = offsetof(xen_vm_record, platform_serial) }, - { .key = "platform_localtime", - .type = &abstract_type_bool, - .offset = offsetof(xen_vm_record, platform_localtime) }, - { .key = "platform_clock_offset", - .type = &abstract_type_bool, - .offset = offsetof(xen_vm_record, platform_clock_offset) }, - { .key = "platform_enable_audio", - .type = &abstract_type_bool, - .offset = offsetof(xen_vm_record, platform_enable_audio) }, + { .key = "platform", + .type = &abstract_type_string_string_map, + .offset = offsetof(xen_vm_record, platform) }, { .key = "PCI_bus", .type = &abstract_type_string, .offset = offsetof(xen_vm_record, pci_bus) }, @@ -217,7 +205,7 @@ xen_vm_record_free(xen_vm_record *record free(record->pv_bootloader_args); free(record->hvm_boot_policy); xen_string_string_map_free(record->hvm_boot_params); - free(record->platform_serial); + xen_string_string_map_free(record->platform); free(record->pci_bus); xen_string_string_map_free(record->other_config); xen_vm_metrics_record_opt_free(record->metrics); @@ -825,82 +813,18 @@ xen_vm_get_hvm_boot_params(xen_session * bool -xen_vm_get_platform_std_vga(xen_session *session, bool *result, xen_vm vm) -{ - abstract_value param_values[] = - { - { .type = &abstract_type_string, - .u.string_val = vm } - }; - - abstract_type result_type = abstract_type_bool; - - XEN_CALL_("VM.get_platform_std_VGA"); - return session->ok; -} - - -bool -xen_vm_get_platform_serial(xen_session *session, char **result, xen_vm vm) -{ - abstract_value param_values[] = - { - { .type = &abstract_type_string, - .u.string_val = vm } - }; - - abstract_type result_type = abstract_type_string; - - *result = NULL; - XEN_CALL_("VM.get_platform_serial"); - return session->ok; -} - - -bool -xen_vm_get_platform_localtime(xen_session *session, bool *result, xen_vm vm) -{ - abstract_value param_values[] = - { - { .type = &abstract_type_string, - .u.string_val = vm } - }; - - abstract_type result_type = abstract_type_bool; - - XEN_CALL_("VM.get_platform_localtime"); - return session->ok; -} - - -bool -xen_vm_get_platform_clock_offset(xen_session *session, bool *result, xen_vm vm) -{ - abstract_value param_values[] = - { - { .type = &abstract_type_string, - .u.string_val = vm } - }; - - abstract_type result_type = abstract_type_bool; - - XEN_CALL_("VM.get_platform_clock_offset"); - return session->ok; -} - - -bool -xen_vm_get_platform_enable_audio(xen_session *session, bool *result, xen_vm vm) -{ - abstract_value param_values[] = - { - { .type = &abstract_type_string, - .u.string_val = vm } - }; - - abstract_type result_type = abstract_type_bool; - - XEN_CALL_("VM.get_platform_enable_audio"); +xen_vm_get_platform(xen_session *session, xen_string_string_map **result, xen_vm vm) +{ + abstract_value param_values[] = + { + { .type = &abstract_type_string, + .u.string_val = vm } + }; + + abstract_type result_type = abstract_type_string_string_map; + + *result = NULL; + XEN_CALL_("VM.get_platform"); return session->ok; } @@ -1442,81 +1366,67 @@ xen_vm_remove_from_hvm_boot_params(xen_s bool -xen_vm_set_platform_std_vga(xen_session *session, xen_vm vm, bool std_vga) -{ - abstract_value param_values[] = - { - { .type = &abstract_type_string, - .u.string_val = vm }, - { .type = &abstract_type_bool, - .u.bool_val = std_vga } - }; - - xen_call_(session, "VM.set_platform_std_VGA", param_values, 2, NULL, NULL); - return session->ok; -} - - -bool -xen_vm_set_platform_serial(xen_session *session, xen_vm vm, char *serial) -{ - abstract_value param_values[] = - { - { .type = &abstract_type_string, - .u.string_val = vm }, - { .type = &abstract_type_string, - .u.string_val = serial } - }; - - xen_call_(session, "VM.set_platform_serial", param_values, 2, NULL, NULL); - return session->ok; -} - - -bool -xen_vm_set_platform_localtime(xen_session *session, xen_vm vm, bool localtime) -{ - abstract_value param_values[] = - { - { .type = &abstract_type_string, - .u.string_val = vm }, - { .type = &abstract_type_bool, - .u.bool_val = localtime } - }; - - xen_call_(session, "VM.set_platform_localtime", param_values, 2, NULL, NULL); - return session->ok; -} - - -bool -xen_vm_set_platform_clock_offset(xen_session *session, xen_vm vm, bool clock_offset) -{ - abstract_value param_values[] = - { - { .type = &abstract_type_string, - .u.string_val = vm }, - { .type = &abstract_type_bool, - .u.bool_val = clock_offset } - }; - - xen_call_(session, "VM.set_platform_clock_offset", param_values, 2, NULL, NULL); - return session->ok; -} - - -bool -xen_vm_set_platform_enable_audio(xen_session *session, xen_vm vm, bool enable_audio) -{ - abstract_value param_values[] = - { - { .type = &abstract_type_string, - .u.string_val = vm }, - { .type = &abstract_type_bool, - .u.bool_val = enable_audio } - }; - - xen_call_(session, "VM.set_platform_enable_audio", param_values, 2, NULL, NULL); +xen_vm_set_platform(xen_session *session, xen_vm vm, xen_string_string_map *platform) +{ + abstract_value param_values[] = + { + { .type = &abstract_type_string, + .u.string_val = vm }, + { .type = &abstract_type_string_string_map, + .u.set_val = (arbitrary_set *)platform } + }; + + xen_call_(session, "VM.set_platform", param_values, 2, NULL, NULL); + return session->ok; +} + + +bool +xen_vm_add_to_platform(xen_session *session, xen_vm vm, char *key, char *value) +{ + abstract_value param_values[] = + { + { .type = &abstract_type_string, + .u.string_val = vm }, + { .type = &abstract_type_string, + .u.string_val = key }, + { .type = &abstract_type_string, + .u.string_val = value } + }; + + xen_call_(session, "VM.add_to_platform", param_values, 3, NULL, NULL); + return session->ok; +} + + +bool +xen_vm_remove_from_platform(xen_session *session, xen_vm vm, char *key) +{ + abstract_value param_values[] = + { + { .type = &abstract_type_string, + .u.string_val = vm }, + { .type = &abstract_type_string, + .u.string_val = key } + }; + + xen_call_(session, "VM.remove_from_platform", param_values, 2, NULL, NULL); + return session->ok; +} + + +bool +xen_vm_set_pci_bus(xen_session *session, xen_vm vm, char *pci_bus) +{ + abstract_value param_values[] = + { + { .type = &abstract_type_string, + .u.string_val = vm }, + { .type = &abstract_type_string, + .u.string_val = pci_bus } + }; + + xen_call_(session, "VM.set_PCI_bus", param_values, 2, NULL, NULL); return session->ok; } diff -r 620212e48908 -r 0affe03ee985 tools/python/xen/xend/XendAPI.py --- a/tools/python/xen/xend/XendAPI.py Sat Mar 10 21:43:07 2007 +0000 +++ b/tools/python/xen/xend/XendAPI.py Sat Mar 10 21:48:22 2007 +0000 @@ -676,8 +676,9 @@ class XendAPI(object): return xen_api_success_void() def host_remove_from_other_config(self, session, host_ref, key): node = XendNode.instance() - del node.other_config[key] - node.save() + if key in node.other_config: + del node.other_config[key] + node.save() return xen_api_success_void() def host_get_API_version_major(self, _, ref): return xen_api_success(XEN_API_VERSION_MAJOR) @@ -998,7 +999,6 @@ class XendAPI(object): 'VIFs', 'VBDs', 'VTPMs', - 'PCI_bus', 'tools_version', 'domid', 'is_control_domain', @@ -1024,12 +1024,8 @@ class XendAPI(object): 'PV_bootloader_args', 'HVM_boot_policy', 'HVM_boot_params', - 'platform_std_VGA', - 'platform_serial', - 'platform_localtime', - 'platform_clock_offset', - 'platform_enable_audio', - 'platform_keymap', + 'platform', + 'PCI_bus', 'other_config'] VM_methods = [('clone', 'VM'), @@ -1042,6 +1038,10 @@ class XendAPI(object): ('hard_reboot', None), ('suspend', None), ('resume', None), + ('add_to_HVM_boot_params', None), + ('remove_from_HVM_boot_params', None), + ('add_to_platform', None), + ('remove_from_platform', None), ('add_to_other_config', None), ('remove_from_other_config', None)] @@ -1071,13 +1071,7 @@ class XendAPI(object): 'PV_bootloader_args', 'HVM_boot_policy', 'HVM_boot_params', - 'platform_std_VGA', - 'platform_serial', - 'platform_localtime', - 'platform_clock_offset', - 'platform_enable_audio', - 'platform_keymap', - 'grub_cmdline', + 'platform', 'PCI_bus', 'other_config'] @@ -1089,7 +1083,10 @@ class XendAPI(object): xd = XendDomain.instance() dominfo = xd.get_vm_by_uuid(vm_ref) dominfo.info[name] = value - xd.managed_config_save(dominfo) + return self._VM_save(dominfo) + + def _VM_save(self, dominfo): + XendDomain.instance().managed_config_save(dominfo) return xen_api_success_void() # attributes (ro) @@ -1136,10 +1133,6 @@ class XendAPI(object): dom = XendDomain.instance().get_vm_by_uuid(vm_ref) return xen_api_success(dom.get_consoles()) - def VM_get_PCI_bus(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return dom.get_pci_bus() - def VM_get_tools_version(self, session, vm_ref): dom = XendDomain.instance().get_vm_by_uuid(vm_ref) return dom.get_tools_version() @@ -1214,29 +1207,16 @@ class XendAPI(object): def VM_get_HVM_boot_params(self, session, vm_ref): return self.VM_get('HVM_boot_params', session, vm_ref) - def VM_get_platform_std_VGA(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_success(dom.get_platform_std_vga()) - - def VM_get_platform_serial(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_success(dom.get_platform_serial()) - - def VM_get_platform_localtime(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_success(dom.get_platform_localtime()) - - def VM_get_platform_clock_offset(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_success(dom.get_platform_clock_offset()) - - def VM_get_platform_enable_audio(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_success(dom.get_platform_enable_audio()) - - def VM_get_platform_keymap(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_success(dom.get_platform_keymap()) + def VM_get_platform(self, session, vm_ref): + dom = XendDomain.instance().get_vm_by_uuid(vm_ref) + return xen_api_success(dom.get_platform()) + + def VM_get_PCI_bus(self, session, vm_ref): + dom = XendDomain.instance().get_vm_by_uuid(vm_ref) + return dom.get_pci_bus() + + def VM_set_PCI_bus(self, session, vm_ref, val): + return self.VM_set('PCI_bus', session, vm_ref, val) def VM_get_other_config(self, session, vm_ref): return self.VM_get('other_config', session, vm_ref) @@ -1253,7 +1233,7 @@ class XendAPI(object): def VM_set_name_label(self, session, vm_ref, label): dom = XendDomain.instance().get_vm_by_uuid(vm_ref) dom.setName(label) - return xen_api_success_void() + return self._VM_save(dom) def VM_set_name_description(self, session, vm_ref, desc): dom = XendDomain.instance().get_vm_by_uuid(vm_ref) @@ -1319,14 +1299,16 @@ class XendAPI(object): if 'HVM_boot_params' not in dom.info: dom.info['HVM_boot_params'] = {} dom.info['HVM_boot_params'][key] = value - return xen_api_success_void() + return self._VM_save(dom) def VM_remove_from_HVM_boot_params(self, session, vm_ref, key): dom = XendDomain.instance().get_vm_by_uuid(vm_ref) if 'HVM_boot_params' in dom.info \ and key in dom.info['HVM_boot_params']: del dom.info['HVM_boot_params'][key] - return xen_api_success_void() + return self._VM_save(dom) + else: + return xen_api_success_void() def VM_set_PV_bootloader(self, session, vm_ref, value): return self.VM_set('PV_bootloader', session, vm_ref, value) @@ -1343,40 +1325,42 @@ class XendAPI(object): def VM_set_PV_bootloader_args(self, session, vm_ref, value): return self.VM_set('PV_bootloader_args', session, vm_ref, value) - def VM_set_platform_std_VGA(self, session, vm_ref, value): - return self.VM_set('platform_std_vga', session, vm_ref, value) - - def VM_set_platform_serial(self, session, vm_ref, value): - return self.VM_set('platform_serial', session, vm_ref, value) - - def VM_set_platform_keymap(self, session, vm_ref, value): - return self.VM_set('platform_keymap', session, vm_ref, value) - - def VM_set_platform_localtime(self, session, vm_ref, value): - return self.VM_set('platform_localtime', session, vm_ref, value) - - def VM_set_platform_clock_offset(self, session, vm_ref, value): - return self.VM_set('platform_clock_offset', session, vm_ref, value) - - def VM_set_platform_enable_audio(self, session, vm_ref, value): - return self.VM_set('platform_enable_audio', session, vm_ref, value) - + def VM_set_platform(self, session, vm_ref, value): + return self.VM_set('platform', session, vm_ref, value) + + def VM_add_to_platform(self, session, vm_ref, key, value): + dom = XendDomain.instance().get_vm_by_uuid(vm_ref) + plat = dom.get_platform() + plat[key] = value + return self.VM_set_platform(session, vm_ref, plat) + + def VM_remove_from_platform(self, session, vm_ref, key): + dom = XendDomain.instance().get_vm_by_uuid(vm_ref) + plat = dom.get_platform() + if key in plat: + del plat[key] + return self.VM_set_platform(session, vm_ref, plat) + else: + return xen_api_success_void() + def VM_set_other_config(self, session, vm_ref, value): - return self.VM_set('otherconfig', session, vm_ref, value) + return self.VM_set('other_config', session, vm_ref, value) def VM_add_to_other_config(self, session, vm_ref, key, value): dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - if dom and 'otherconfig' in dom.info: - dom.info['otherconfig'][key] = value - return xen_api_success_void() + if dom and 'other_config' in dom.info: + dom.info['other_config'][key] = value + return self._VM_save(dom) def VM_remove_from_other_config(self, session, vm_ref, key): dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - if dom and 'otherconfig' in dom.info \ - and key in dom.info['otherconfig']: - del dom.info['otherconfig'][key] - return xen_api_success_void() - + if dom and 'other_config' in dom.info \ + and key in dom.info['other_config']: + del dom.info['other_config'][key] + return self._VM_save(dom) + else: + return xen_api_success_void() + # class methods def VM_get_all(self, session): refs = [d.get_uuid() for d in XendDomain.instance().list('all')] @@ -1437,12 +1421,7 @@ class XendAPI(object): 'PV_bootloader_args': xeninfo.info.get('PV_bootloader_args'), 'HVM_boot_policy': xeninfo.info.get('HVM_boot_policy'), 'HVM_boot_params': xeninfo.info.get('HVM_boot_params'), - 'platform_std_VGA': xeninfo.get_platform_std_vga(), - 'platform_serial': xeninfo.get_platform_serial(), - 'platform_localtime': xeninfo.get_platform_localtime(), - 'platform_clock_offset': xeninfo.get_platform_clock_offset(), - 'platform_enable_audio': xeninfo.get_platform_enable_audio(), - 'platform_keymap': xeninfo.get_platform_keymap(), + 'platform': xeninfo.get_platform(), 'PCI_bus': xeninfo.get_pci_bus(), 'tools_version': xeninfo.get_tools_version(), 'other_config': xeninfo.info.get('other_config', {}), diff -r 620212e48908 -r 0affe03ee985 tools/python/xen/xend/XendConfig.py --- a/tools/python/xen/xend/XendConfig.py Sat Mar 10 21:43:07 2007 +0000 +++ b/tools/python/xen/xend/XendConfig.py Sat Mar 10 21:48:22 2007 +0000 @@ -12,7 +12,7 @@ # 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) 2006 XenSource Ltd +# Copyright (C) 2006-2007 XenSource Ltd #============================================================================ import logging @@ -111,22 +111,18 @@ XENAPI_CFG_TO_LEGACY_CFG = { 'actions_after_shutdown': 'on_poweroff', 'actions_after_reboot': 'on_reboot', 'actions_after_crash': 'on_crash', - 'platform_localtime': 'localtime', 'PV_bootloader': 'bootloader', 'PV_bootloader_args': 'bootloader_args', } LEGACY_CFG_TO_XENAPI_CFG = reverse_dict(XENAPI_CFG_TO_LEGACY_CFG) -# Mapping from XendConfig configuration keys to the old -# legacy configuration keys that are found in the 'image' -# SXP object. -XENAPI_HVM_CFG = { - 'platform_std_vga': 'stdvga', - 'platform_serial' : 'serial', - 'platform_localtime': 'localtime', - 'platform_keymap' : 'keymap' -} +# Platform configuration keys. +XENAPI_PLATFORM_CFG = [ 'acpi', 'apic', 'device_model', 'display', 'fda', + 'fdb', 'keymap', 'isa', 'localtime', 'nographic', + 'pae', 'serial', 'sdl', 'soundhw','stdvga', 'usb', + 'usbdevice', 'vnc', 'vncconsole', 'vncdisplay', + 'vnclisten', 'vncpasswd', 'vncunused', 'xauthority'] # List of XendConfig configuration keys that have no direct equivalent # in the old world. @@ -158,15 +154,10 @@ XENAPI_CFG_TYPES = { 'PV_bootloader_args': str, 'HVM_boot_policy': str, 'HVM_boot_params': dict, - 'platform_std_vga': bool0, - 'platform_serial': str, - 'platform_localtime': bool0, - 'platform_clock_offset': bool0, - 'platform_enable_audio': bool0, - 'platform_keymap': str, - 'pci_bus': str, + 'PCI_bus': str, + 'platform': dict, 'tools_version': dict, - 'otherconfig': dict, + 'other_config': dict, } # List of legacy configuration keys that have no equivalent in the @@ -236,44 +227,7 @@ LEGACY_XENSTORE_VM_PARAMS = [ 'on_xend_stop', ] -LEGACY_IMAGE_CFG = [ - ('root', str), - ('ip', str), - ('nographic', int), - ('vnc', int), - ('sdl', int), - ('vncdisplay', int), - ('vncunused', int), - ('vncpasswd', str), - ('vnclisten', str), -] - -LEGACY_IMAGE_HVM_CFG = [ - ('device_model', str), - ('display', str), - ('xauthority', str), - ('vncconsole', int), - ('pae', int), - ('apic', int), -] - -LEGACY_IMAGE_HVM_DEVICES_CFG = [ - ('acpi', int), - ('boot', str), - ('fda', str), - ('fdb', str), - ('isa', int), - ('keymap', str), - ('localtime', int), - ('serial', str), - ('stdvga', int), - ('soundhw', str), - ('usb', int), - ('usbdevice', str), - ('vcpus', int), -] - -LEGACY_DM = '/usr/lib/xen/bin/qemu-dm' +DEFAULT_DM = '/usr/lib/xen/bin/qemu-dm' ## ## Config Choices @@ -315,7 +269,6 @@ class XendConfig(dict): self._sxp_to_xapi_unsupported(sxp_obj) elif xapi: self.update_with_xenapi_config(xapi) - self._add_xapi_unsupported(xapi) elif dominfo: # output from xc.domain_getinfo self._dominfo_to_xapi(dominfo) @@ -362,7 +315,6 @@ class XendConfig(dict): 'memory_dynamic_max': 0, 'memory_actual': 0, 'devices': {}, - 'image': {}, 'security': None, 'on_xend_start': 'ignore', 'on_xend_stop': 'ignore', @@ -376,6 +328,7 @@ class XendConfig(dict): 'vbd_refs': [], 'vtpm_refs': [], 'other_config': {}, + 'platform': {} } return defaults @@ -416,12 +369,23 @@ class XendConfig(dict): if 'name_label' not in self: self['name_label'] = 'Domain-' + self['uuid'] + def _platform_sanity_check(self): + if self.is_hvm(): + if 'device_model' not in self['platform']: + self['platform']['device_model'] = DEFAULT_DM + + # Compatibility hack, can go away soon. + if 'soundhw' not in self['platform'] and \ + self['platform'].get('enable_audio'): + self['platform']['soundhw'] = 'sb16' + def validate(self): self._uuid_sanity_check() self._name_sanity_check() self._memory_sanity_check() self._actions_sanity_check() self._vcpus_sanity_check() + self._platform_sanity_check() def _dominfo_to_xapi(self, dominfo): self['domid'] = dominfo['domid'] @@ -496,6 +460,18 @@ class XendConfig(dict): except (TypeError, ValueError), e: log.warn("Unable to parse key %s: %s: %s" % (key, str(val), e)) + + if 'platform' not in cfg: + cfg['platform'] = {} + localtime = sxp.child_value(sxp_cfg, 'localtime') + if localtime is not None: + cfg['platform']['localtime'] = localtime + + # Compatibility hack -- can go soon. + for key in XENAPI_PLATFORM_CFG: + val = sxp.child_value(sxp_cfg, "platform_" + key, None) + if val is not None: + self['platform'][key] = val # Compatibility hack -- can go soon. boot_order = sxp.child_value(sxp_cfg, 'HVM_boot') @@ -651,10 +627,9 @@ class XendConfig(dict): self.update_with_image_sxp(image_sxp) # Convert Legacy HVM parameters to Xen API configuration - self['platform_std_vga'] = bool0(cfg.get('stdvga', 0)) - self['platform_serial'] = str(cfg.get('serial', '')) - self['platform_localtime'] = bool0(cfg.get('localtime', 0)) - self['platform_enable_audio'] = bool0(cfg.get('soundhw', 0)) + for key in XENAPI_PLATFORM_CFG: + if key in cfg: + self['platform'][key] = cfg[key] # make sure a sane maximum is set if self['memory_static_max'] <= 0: @@ -671,7 +646,7 @@ class XendConfig(dict): self['vtpm_refs'] = cfg.get('vtpm_refs', []) # coalesce hvm vnc frame buffer with vfb config - if self['image']['type'] == 'hvm' and self['image'].get('vnc', 0): + if self.is_hvm() and self['platform'].get('vnc', 0): # add vfb device if it isn't there already has_rfb = False for console_uuid in self['console_refs']: @@ -684,11 +659,11 @@ class XendConfig(dict): if not has_rfb: dev_config = ['vfb'] - # copy VNC related params from image config to vfb dev conf + # copy VNC related params from platform config to vfb dev conf for key in ['vncpasswd', 'vncunused', 'vncdisplay', 'vnclisten']: - if key in self['image']: - dev_config.append([key, self['image'][key]]) + if key in self['platform']: + dev_config.append([key, self['platform'][key]]) self.device_add('vfb', cfg_sxp = dev_config) @@ -705,39 +680,19 @@ class XendConfig(dict): # the image (as well as HVM images) image_sxp = sxp.child_value(sxp_cfg, 'image', []) if image_sxp: - image = {} - image['type'] = sxp.name(image_sxp) - for arg, conv in LEGACY_IMAGE_CFG: - val = sxp.child_value(image_sxp, arg, None) - if val != None: - image[arg] = conv(val) - - image_hvm = {} - for arg, conv in LEGACY_IMAGE_HVM_CFG: - val = sxp.child_value(image_sxp, arg, None) - if val != None: - image_hvm[arg] = conv(val) - - image_hvm_devices = {} - for arg, conv in LEGACY_IMAGE_HVM_DEVICES_CFG: - val = sxp.child_value(image_sxp, arg, None) - if val != None: - image_hvm_devices[arg] = conv(val) - - if image_hvm or image_hvm_devices: - image['hvm'] = image_hvm - image['hvm']['devices'] = image_hvm_devices - + image_type = sxp.name(image_sxp) + if image_type != 'hvm' and image_type != 'linux': + self['platform']['image_type'] = image_type + + for key in XENAPI_PLATFORM_CFG: + val = sxp.child_value(image_sxp, key, None) + if val is not None: + self['platform'][key] = val + notes = sxp.children(image_sxp, 'notes') if notes: - image['notes'] = self.notes_from_sxp(notes[0]) - - self['image'] = image - - for apikey, imgkey in XENAPI_HVM_CFG.items(): - val = sxp.child_value(image_sxp, imgkey, None) - if val != None: - self[apikey] = val + self['notes'] = self.notes_from_sxp(notes[0]) + self._hvm_boot_params_from_sxp(image_sxp) # extract backend value @@ -773,33 +728,6 @@ class XendConfig(dict): _set_cfg_if_exists('up_time') _set_cfg_if_exists('status') # TODO, deprecated - def _add_xapi_unsupported(self, xapi_dict): - """Updates the configuration object with entries that are not - officially supported by the Xen API but is required for - the rest of Xend to function. - """ - - # populate image - if 'image' in xapi_dict: - self['image'].update(xapi_dict['image']) - else: - hvm = self['HVM_boot_policy'] != '' - self['image']['type'] = hvm and 'hvm' or 'linux' - if hvm: - self['image']['hvm'] = {'devices': {}} - for xapi, cfgapi in XENAPI_HVM_CFG.items(): - if xapi in self: - self['image']['hvm']['devices'][cfgapi] = self[xapi] - - # currently unsupported options - self['image']['hvm']['device_model'] = LEGACY_DM - self['image']['vnc'] = 0 - self['image']['hvm']['pae'] = 1 - - if self['platform_enable_audio']: - self['image']['hvm']['devices']['soundhw'] = 'sb16' - - def _get_old_state_string(self): """Returns the old xm state string. @rtype: string @@ -889,9 +817,7 @@ class XendConfig(dict): if self.has_key(legacy) and self[legacy] not in (None, []): sxpr.append([legacy, self[legacy]]) - if 'image' in self and self['image']: - sxpr.append(['image', self.image_sxpr()]) - + sxpr.append(['image', self.image_sxpr()]) sxpr.append(['status', domain.state]) sxpr.append(['memory_dynamic_min', self.get('memory_dynamic_min')]) sxpr.append(['memory_dynamic_max', self.get('memory_dynamic_max')]) @@ -1338,7 +1264,7 @@ class XendConfig(dict): def image_sxpr(self): """Returns a backwards compatible image SXP expression that is used in xenstore's /vm/<uuid>/image value and xm list.""" - image = [self['image'].get('type', 'linux')] + image = [self.image_type()] if self.has_key('PV_kernel'): image.append(['kernel', self['PV_kernel']]) if self.has_key('PV_ramdisk') and self['PV_ramdisk']: @@ -1346,28 +1272,12 @@ class XendConfig(dict): if self.has_key('PV_args') and self['PV_args']: image.append(['args', self['PV_args']]) - for arg, conv in LEGACY_IMAGE_CFG: - if self['image'].has_key(arg): - image.append([arg, self['image'][arg]]) - - if 'hvm' in self['image']: - for arg, conv in LEGACY_IMAGE_HVM_CFG: - if self['image']['hvm'].get(arg): - image.append([arg, conv(self['image']['hvm'][arg])]) - - if 'hvm' in self['image'] and 'devices' in self['image']['hvm']: - for arg, conv in LEGACY_IMAGE_HVM_DEVICES_CFG: - val = self['image']['hvm']['devices'].get(arg) - if val != None: - try: - if conv: val = conv(val) - except (ValueError, TypeError): - if type(val) == bool: val = int(val) - - image.append([arg, val]) - - if 'notes' in self['image']: - image.append(self.notes_sxp(self['image']['notes'])) + for key in XENAPI_PLATFORM_CFG: + if key in self['platform']: + image.append([key, self['platform'][key]]) + + if 'notes' in self: + image.append(self.notes_sxp(self['notes'])) return image @@ -1398,57 +1308,24 @@ class XendConfig(dict): self['PV_ramdisk'] = sxp.child_value(image_sxp, 'ramdisk','') self['PV_args'] = kernel_args - # Store image SXP in python dictionary format - image = {} - image['type'] = sxp.name(image_sxp) - for arg, conv in LEGACY_IMAGE_CFG: - val = sxp.child_value(image_sxp, arg, None) - if val != None: - image[arg] = conv(val) - - image_hvm = {} - for arg, conv in LEGACY_IMAGE_HVM_CFG: - val = sxp.child_value(image_sxp, arg, None) - if val != None: - image_hvm[arg] = conv(val) - - image_hvm_devices = {} - for arg, conv in LEGACY_IMAGE_HVM_DEVICES_CFG: - val = sxp.child_value(image_sxp, arg, None) - if val != None: - try: - image_hvm_devices[arg] = conv(val) - except (ValueError, TypeError): - image_hvm_devices[arg] = val - - - if image_hvm or image_hvm_devices: - image['hvm'] = image_hvm - image['hvm']['devices'] = image_hvm_devices + for key in XENAPI_PLATFORM_CFG: + val = sxp.child_value(image_sxp, key, None) + if val is not None: + self['platform'][key] = val notes = sxp.children(image_sxp, 'notes') if notes: - image['notes'] = self.notes_from_sxp(notes[0]) - - self['image'] = image - - for apikey, imgkey in XENAPI_HVM_CFG.items(): - val = sxp.child_value(image_sxp, imgkey, None) - if val != None: - type_conv = XENAPI_CFG_TYPES[apikey] - if callable(type_conv): - self[apikey] = type_conv(val) - else: - self[apikey] = val + self['notes'] = self.notes_from_sxp(notes[0]) + self._hvm_boot_params_from_sxp(image_sxp) def set_notes(self, notes): 'Add parsed elfnotes to image' - self['image']['notes'] = notes + self['notes'] = notes def get_notes(self): try: - return self['image']['notes'] or {} + return self['notes'] or {} except KeyError: return {} @@ -1470,11 +1347,9 @@ class XendConfig(dict): self['HVM_boot_policy'] = 'BIOS order' self['HVM_boot_params'] = { 'order' : boot } - -# -# debugging -# - -if __name__ == "__main__": - pass - + def is_hvm(self): + return self['HVM_boot_policy'] != '' + + def image_type(self): + stored_type = self['platform'].get('image_type') + return stored_type or (self.is_hvm() and 'hvm' or 'linux') diff -r 620212e48908 -r 0affe03ee985 tools/python/xen/xend/XendDomainInfo.py --- a/tools/python/xen/xend/XendDomainInfo.py Sat Mar 10 21:43:07 2007 +0000 +++ b/tools/python/xen/xend/XendDomainInfo.py Sat Mar 10 21:48:22 2007 +0000 @@ -13,7 +13,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #============================================================================ # Copyright (C) 2004, 2005 Mike Wray <mike.wray@xxxxxx> -# Copyright (C) 2005, 2006 XenSource Ltd +# Copyright (C) 2005-2007 XenSource Ltd #============================================================================ """Representation of a single domain. @@ -176,14 +176,8 @@ def recreate(info, priv): vm._storeVmDetails() vm._storeDomDetails() - if vm.info['image']: # Only dom0 should be without an image entry when - # recreating, but we cope with missing ones - # elsewhere just in case. - vm.image = image.create(vm, - vm.info, - vm.info['image'], - vm.info['devices']) - vm.image.recreate() + vm.image = image.create(vm, vm.info) + vm.image.recreate() vm._registerWatches() vm.refreshShutdown(xeninfo) @@ -448,9 +442,7 @@ class XendDomainInfo: self.storeDom("control/shutdown", reason) ## shutdown hypercall for hvm domain desides xenstore write - image_cfg = self.info.get('image', {}) - hvm = image_cfg.has_key('hvm') - if hvm: + if self.info.is_hvm(): for code in DOMAIN_SHUTDOWN_REASONS.keys(): if DOMAIN_SHUTDOWN_REASONS[code] == reason: break @@ -1389,9 +1381,7 @@ class XendDomainInfo: self.shutdownStartTime = None - image_cfg = self.info.get('image', {}) - hvm = image_cfg.has_key('hvm') - + hvm = self.info.is_hvm() if hvm: info = xc.xeninfo() if 'hvm' not in info['xen_caps']: @@ -1438,14 +1428,8 @@ class XendDomainInfo: self._configureBootloader() - if not self._infoIsSet('image'): - raise VmError('Missing image in configuration') - try: - self.image = image.create(self, - self.info, - self.info['image'], - self.info['devices']) + self.image = image.create(self, self.info) localtime = self.info.get('platform_localtime', False) if localtime: @@ -1507,7 +1491,8 @@ class XendDomainInfo: self._stateSet(DOM_STATE_RUNNING) except (RuntimeError, VmError), exn: log.exception("XendDomainInfo.initDomain: exception occurred") - self.image.cleanupBootloading() + if self.image: + self.image.cleanupBootloading() raise VmError(str(exn)) @@ -1574,13 +1559,8 @@ class XendDomainInfo: self.console_mfn = console_mfn self._introduceDomain() - image_cfg = self.info.get('image', {}) - hvm = image_cfg.has_key('hvm') - if hvm: - self.image = image.create(self, - self.info, - self.info['image'], - self.info['devices']) + if self.info.has_hvm(): + self.image = image.create(self, self.info) if self.image: self.image.createDeviceModel(True) self.image.register_shutdown_watch() @@ -1742,11 +1722,7 @@ class XendDomainInfo: if boot: # HVM booting. - self.info['image']['type'] = 'hvm' - if not 'devices' in self.info['image']: - self.info['image']['devices'] = {} - self.info['image']['devices']['boot'] = \ - self.info['HVM_boot_params'].get('order', 'dc') + pass elif not blexec and kernel: # Boot from dom0. Nothing left to do -- the kernel and ramdisk # will be picked up by image.py. @@ -1910,10 +1886,9 @@ class XendDomainInfo: if self._infoIsSet(info_key): to_store[key] = str(self.info[info_key]) - if self.info.get('image'): - image_sxpr = self.info.image_sxpr() - if image_sxpr: - to_store['image'] = sxp.to_string(image_sxpr) + image_sxpr = self.info.image_sxpr() + if image_sxpr: + to_store['image'] = sxp.to_string(image_sxpr) if self._infoIsSet('security'): secinfo = self.info['security'] @@ -2074,18 +2049,8 @@ class XendDomainInfo: return retval def get_power_state(self): return XEN_API_VM_POWER_STATE[self.state] - def get_platform_std_vga(self): - return self.info.get('platform_std_vga', False) - def get_platform_serial(self): - return self.info.get('platform_serial', '') - def get_platform_localtime(self): - return self.info.get('platform_localtime', False) - def get_platform_clock_offset(self): - return self.info.get('platform_clock_offset', False) - def get_platform_enable_audio(self): - return self.info.get('platform_enable_audio', False) - def get_platform_keymap(self): - return self.info.get('platform_keymap', '') + def get_platform(self): + return self.info.get('platform', {}) def get_pci_bus(self): return self.info.get('pci_bus', '') def get_tools_version(self): diff -r 620212e48908 -r 0affe03ee985 tools/python/xen/xend/image.py --- a/tools/python/xen/xend/image.py Sat Mar 10 21:43:07 2007 +0000 +++ b/tools/python/xen/xend/image.py Sat Mar 10 21:48:22 2007 +0000 @@ -13,7 +13,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #============================================================================ # Copyright (C) 2005 Mike Wray <mike.wray@xxxxxx> -# Copyright (C) 2005 XenSource Ltd +# Copyright (C) 2005-2007 XenSource Ltd #============================================================================ @@ -36,13 +36,12 @@ MAX_GUEST_CMDLINE = 1024 MAX_GUEST_CMDLINE = 1024 -def create(vm, vmConfig, imageConfig, deviceConfig): +def create(vm, vmConfig): """Create an image handler for a vm. @return ImageHandler instance """ - return findImageHandlerClass(imageConfig)(vm, vmConfig, imageConfig, - deviceConfig) + return findImageHandlerClass(vmConfig)(vm, vmConfig) class ImageHandler: @@ -65,7 +64,7 @@ class ImageHandler: ostype = None - def __init__(self, vm, vmConfig, imageConfig, deviceConfig): + def __init__(self, vm, vmConfig): self.vm = vm self.bootloader = False @@ -73,9 +72,9 @@ class ImageHandler: self.ramdisk = None self.cmdline = None - self.configure(vmConfig, imageConfig, deviceConfig) - - def configure(self, vmConfig, imageConfig, _): + self.configure(vmConfig) + + def configure(self, vmConfig): """Config actions common to all unix-like domains.""" if '_temp_using_bootloader' in vmConfig: self.bootloader = True @@ -262,13 +261,13 @@ class HVMImageHandler(ImageHandler): ostype = "hvm" - def __init__(self, vm, vmConfig, imageConfig, deviceConfig): - ImageHandler.__init__(self, vm, vmConfig, imageConfig, deviceConfig) + def __init__(self, vm, vmConfig): + ImageHandler.__init__(self, vm, vmConfig) self.shutdownWatch = None self.rebootFeatureWatch = None - def configure(self, vmConfig, imageConfig, deviceConfig): - ImageHandler.configure(self, vmConfig, imageConfig, deviceConfig) + def configure(self, vmConfig): + ImageHandler.configure(self, vmConfig) if not self.kernel: self.kernel = '/usr/lib/xen/boot/hvmloader' @@ -279,13 +278,13 @@ class HVMImageHandler(ImageHandler): "supported by your CPU and enabled in your BIOS?") self.dmargs = self.parseDeviceModelArgs(vmConfig) - self.device_model = imageConfig['hvm'].get('device_model') + self.device_model = vmConfig['platform'].get('device_model') if not self.device_model: raise VmError("hvm: missing device model") - self.display = imageConfig['hvm'].get('display') - self.xauthority = imageConfig['hvm'].get('xauthority') - self.vncconsole = imageConfig['hvm'].get('vncconsole') + self.display = vmConfig['platform'].get('display') + self.xauthority = vmConfig['platform'].get('xauthority') + self.vncconsole = vmConfig['platform'].get('vncconsole') self.vm.storeVm(("image/dmargs", " ".join(self.dmargs)), ("image/device-model", self.device_model), @@ -293,9 +292,9 @@ class HVMImageHandler(ImageHandler): self.pid = None - self.pae = imageConfig['hvm'].get('pae', 0) - self.apic = imageConfig['hvm'].get('apic', 0) - self.acpi = imageConfig['hvm']['devices'].get('acpi', 0) + self.pae = int(vmConfig['platform'].get('pae', 0)) + self.apic = int(vmConfig['platform'].get('apic', 0)) + self.acpi = int(vmConfig['platform'].get('acpi', 0)) def buildDomain(self): @@ -331,11 +330,10 @@ class HVMImageHandler(ImageHandler): 'localtime', 'serial', 'stdvga', 'isa', 'acpi', 'usb', 'usbdevice', 'keymap' ] - hvmDeviceConfig = vmConfig['image']['hvm']['devices'] ret = ['-vcpus', str(self.vm.getVCpuCount())] for a in dmargs: - v = hvmDeviceConfig.get(a) + v = vmConfig['platform'].get(a) # python doesn't allow '-' in variable names if a == 'stdvga': a = 'std-vga' @@ -395,14 +393,14 @@ class HVMImageHandler(ImageHandler): # Find RFB console device, and if it exists, make QEMU enable # the VNC console. # - if vmConfig['image'].get('nographic'): + if vmConfig['platform'].get('nographic'): # skip vnc init if nographic is set ret.append('-nographic') return ret vnc_config = {} - has_vnc = int(vmConfig['image'].get('vnc', 0)) != 0 - has_sdl = int(vmConfig['image'].get('sdl', 0)) != 0 + has_vnc = int(vmConfig['platform'].get('vnc', 0)) != 0 + has_sdl = int(vmConfig['platform'].get('sdl', 0)) != 0 for dev_uuid in vmConfig['console_refs']: dev_type, dev_info = vmConfig['devices'][dev_uuid] if dev_type == 'vfb': @@ -414,8 +412,8 @@ class HVMImageHandler(ImageHandler): if not vnc_config: for key in ('vncunused', 'vnclisten', 'vncdisplay', 'vncpasswd'): - if key in vmConfig['image']: - vnc_config[key] = vmConfig['image'][key] + if key in vmConfig['platform']: + vnc_config[key] = vmConfig['platform'][key] if not vnc_config.get('vncunused', 0) and \ vnc_config.get('vncdisplay', 0): @@ -634,9 +632,7 @@ def findImageHandlerClass(image): @param image config @return ImageHandler subclass or None """ - image_type = image['type'] - if image_type is None: - raise VmError('missing image type') + image_type = image.image_type() try: return _handlers[arch.type][image_type] except KeyError: _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |