# HG changeset patch
# User Ewan Mellor <ewan@xxxxxxxxxxxxx>
# Date 1175694578 -3600
# Node ID e5931b5e6cc5202a9c86c3cd717580bead18c657
# Parent 14c25e48a55730115c71e592ae065e715c1d23af
Remove docs and bindings for unimplemented SR.{create,destroy,clone}.
Implement PBD class, matching existing docs and bindings.
Signed-off-by: Ewan Mellor <ewan@xxxxxxxxxxxxx>
---
docs/xen-api/xenapi-datamodel.tex | 138 +++++--------------------
tools/libxen/include/xen_sr.h | 36 +-----
tools/libxen/src/xen_sr.c | 105 +++++++------------
tools/python/xen/xend/XendAPI.py | 91 +++++++++++-----
tools/python/xen/xend/XendLocalStorageRepo.py | 17 +--
tools/python/xen/xend/XendNode.py | 39 ++++---
tools/python/xen/xend/XendPBD.py | 79 ++++++++++++++
tools/python/xen/xend/XendQCoWStorageRepo.py | 23 ++--
tools/python/xen/xend/XendStateStore.py | 2
tools/python/xen/xend/XendStorageRepository.py | 13 +-
10 files changed, 279 insertions(+), 264 deletions(-)
diff -r 14c25e48a557 -r e5931b5e6cc5 docs/xen-api/xenapi-datamodel.tex
--- a/docs/xen-api/xenapi-datamodel.tex Thu Apr 05 09:10:33 2007 +0100
+++ b/docs/xen-api/xenapi-datamodel.tex Wed Apr 04 14:49:38 2007 +0100
@@ -9190,51 +9190,35 @@ Quals & Field & Type & Description \\
$\mathit{RO}_\mathit{run}$ & {\tt physical\_utilisation} & int & physical
space currently utilised on this storage repository (in bytes). Note that for
sparse disk formats, physical\_utilisation may be less than virtual\_allocation
\\
$\mathit{RO}_\mathit{ins}$ & {\tt physical\_size} & int & total physical size
of the repository (in bytes) \\
$\mathit{RO}_\mathit{ins}$ & {\tt type} & string & type of the storage
repository \\
-$\mathit{RO}_\mathit{ins}$ & {\tt location} & string & a string that uniquely
determines the location of the storage repository; the format of this string
depends on the repository's type \\
+$\mathit{RO}_\mathit{ins}$ & {\tt content\_type} & string & the type of the
SR's content, if required (e.g. ISOs) \\
\hline
\end{longtable}
\subsection{RPCs associated with class: SR}
-\subsubsection{RPC name:~clone}
-
-{\bf Overview:}
-Take an exact copy of the Storage Repository;
- the cloned storage repository has the same type as its parent
-
- \noindent {\bf Signature:}
-\begin{verbatim} (SR ref) clone (session_id s, SR ref sr, string loc, string
name)\end{verbatim}
-
-
-\noindent{\bf Arguments:}
-
-
-\vspace{0.3cm}
-\begin{tabular}{|c|c|p{7cm}|}
- \hline
-{\bf type} & {\bf name} & {\bf description} \\ \hline
-{\tt SR ref } & sr & The Storage Repository to clone \\ \hline
-
-{\tt string } & loc & The location string that defines where the new storage
repository will be located \\ \hline
-
-{\tt string } & name & The name of the new storage repository \\ \hline
-
-\end{tabular}
-
-\vspace{0.3cm}
-
- \noindent {\bf Return Type:}
-{\tt
-SR ref
-}
-
-
-The ID of the newly created Storage Repository.
+\subsubsection{RPC name:~get\_supported\_types}
+
+{\bf Overview:}
+Return a set of all the SR types supported by the system.
+
+ \noindent {\bf Signature:}
+\begin{verbatim} (string Set) get_supported_types (session_id s)\end{verbatim}
+
+
+\vspace{0.3cm}
+
+ \noindent {\bf Return Type:}
+{\tt
+string Set
+}
+
+
+the supported SR types
\vspace{0.3cm}
\vspace{0.3cm}
\vspace{0.3cm}
\subsubsection{RPC name:~get\_all}
{\bf Overview:}
-Return a list of all the Storage Repositories known to the system
+Return a list of all the SRs known to the system.
\noindent {\bf Signature:}
\begin{verbatim} ((SR ref) Set) get_all (session_id s)\end{verbatim}
@@ -9248,7 +9232,7 @@ Return a list of all the Storage Reposit
}
-A list of all the IDs of all the Storage Repositories
+references to all objects
\vspace{0.3cm}
\vspace{0.3cm}
\vspace{0.3cm}
@@ -9608,13 +9592,13 @@ value of the field
\vspace{0.3cm}
\vspace{0.3cm}
\vspace{0.3cm}
-\subsubsection{RPC name:~get\_location}
-
-{\bf Overview:}
-Get the location field of the given SR.
-
- \noindent {\bf Signature:}
-\begin{verbatim} string get_location (session_id s, SR ref self)\end{verbatim}
+\subsubsection{RPC name:~get\_content\_type}
+
+{\bf Overview:}
+Get the content\_type field of the given SR.
+
+ \noindent {\bf Signature:}
+\begin{verbatim} string get_content_type (session_id s, SR ref
self)\end{verbatim}
\noindent{\bf Arguments:}
@@ -9637,70 +9621,6 @@ string
value of the field
-\vspace{0.3cm}
-\vspace{0.3cm}
-\vspace{0.3cm}
-\subsubsection{RPC name:~create}
-
-{\bf Overview:}
-Create a new SR instance, and return its handle.
-
- \noindent {\bf Signature:}
-\begin{verbatim} (SR ref) create (session_id s, SR record args)\end{verbatim}
-
-
-\noindent{\bf Arguments:}
-
-
-\vspace{0.3cm}
-\begin{tabular}{|c|c|p{7cm}|}
- \hline
-{\bf type} & {\bf name} & {\bf description} \\ \hline
-{\tt SR record } & args & All constructor arguments \\ \hline
-
-\end{tabular}
-
-\vspace{0.3cm}
-
- \noindent {\bf Return Type:}
-{\tt
-SR ref
-}
-
-
-reference to the newly created object
-\vspace{0.3cm}
-\vspace{0.3cm}
-\vspace{0.3cm}
-\subsubsection{RPC name:~destroy}
-
-{\bf Overview:}
-Destroy the specified SR instance.
-
- \noindent {\bf Signature:}
-\begin{verbatim} void destroy (session_id s, SR 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 SR ref } & self & reference to the object \\ \hline
-
-\end{tabular}
-
-\vspace{0.3cm}
-
- \noindent {\bf Return Type:}
-{\tt
-void
-}
-
-
-
\vspace{0.3cm}
\vspace{0.3cm}
\vspace{0.3cm}
@@ -11988,7 +11908,7 @@ Quals & Field & Type & Description \\
$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object
reference \\
$\mathit{RO}_\mathit{ins}$ & {\tt host} & host ref & physical machine on
which the pbd is available \\
$\mathit{RO}_\mathit{ins}$ & {\tt SR} & SR ref & the storage repository that
the pbd realises \\
-$\mathit{RO}_\mathit{ins}$ & {\tt device\_config} & (string $\rightarrow$
string) Map & a config string that is provided to the host's SR-backend-driver
\\
+$\mathit{RO}_\mathit{ins}$ & {\tt device\_config} & (string $\rightarrow$
string) Map & a config string to string map that is provided to the host's
SR-backend-driver \\
$\mathit{RO}_\mathit{run}$ & {\tt currently\_attached} & bool & is the SR
currently attached on this host? \\
\hline
\end{longtable}
diff -r 14c25e48a557 -r e5931b5e6cc5 tools/libxen/include/xen_sr.h
--- a/tools/libxen/include/xen_sr.h Thu Apr 05 09:10:33 2007 +0100
+++ b/tools/libxen/include/xen_sr.h Wed Apr 04 14:49:38 2007 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, XenSource Inc.
+ * Copyright (c) 2006-2007, XenSource Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -22,6 +22,7 @@
#include "xen_common.h"
#include "xen_pbd_decl.h"
#include "xen_sr_decl.h"
+#include "xen_string_set.h"
#include "xen_vdi_decl.h"
@@ -72,7 +73,7 @@ typedef struct xen_sr_record
int64_t physical_utilisation;
int64_t physical_size;
char *type;
- char *location;
+ char *content_type;
} xen_sr_record;
/**
@@ -169,20 +170,6 @@ xen_sr_get_by_uuid(xen_session *session,
/**
- * Create a new SR instance, and return its handle.
- */
-extern bool
-xen_sr_create(xen_session *session, xen_sr *result, xen_sr_record *record);
-
-
-/**
- * Destroy the specified SR instance.
- */
-extern bool
-xen_sr_destroy(xen_session *session, xen_sr sr);
-
-
-/**
* Get all the SR instances with the given label.
*/
extern bool
@@ -253,10 +240,10 @@ xen_sr_get_type(xen_session *session, ch
/**
- * Get the location field of the given SR.
- */
-extern bool
-xen_sr_get_location(xen_session *session, char **result, xen_sr sr);
+ * Get the content_type field of the given SR.
+ */
+extern bool
+xen_sr_get_content_type(xen_session *session, char **result, xen_sr sr);
/**
@@ -274,11 +261,10 @@ xen_sr_set_name_description(xen_session
/**
- * Take an exact copy of the Storage Repository; the cloned storage
- * repository has the same type as its parent
- */
-extern bool
-xen_sr_clone(xen_session *session, xen_sr *result, xen_sr sr, char *loc, char
*name);
+ * Return a set of all the SR types supported by the system.
+ */
+extern bool
+xen_sr_get_supported_types(xen_session *session, struct xen_string_set
**result);
/**
diff -r 14c25e48a557 -r e5931b5e6cc5 tools/libxen/src/xen_sr.c
--- a/tools/libxen/src/xen_sr.c Thu Apr 05 09:10:33 2007 +0100
+++ b/tools/libxen/src/xen_sr.c Wed Apr 04 14:49:38 2007 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, XenSource Inc.
+ * Copyright (c) 2006-2007, XenSource Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -65,9 +65,9 @@ static const struct_member xen_sr_record
{ .key = "type",
.type = &abstract_type_string,
.offset = offsetof(xen_sr_record, type) },
- { .key = "location",
- .type = &abstract_type_string,
- .offset = offsetof(xen_sr_record, location) }
+ { .key = "content_type",
+ .type = &abstract_type_string,
+ .offset = offsetof(xen_sr_record, content_type) }
};
const abstract_type xen_sr_record_abstract_type_ =
@@ -94,7 +94,7 @@ xen_sr_record_free(xen_sr_record *record
xen_vdi_record_opt_set_free(record->vdis);
xen_pbd_record_opt_set_free(record->pbds);
free(record->type);
- free(record->location);
+ free(record->content_type);
free(record);
}
@@ -140,37 +140,6 @@ xen_sr_get_by_uuid(xen_session *session,
bool
-xen_sr_create(xen_session *session, xen_sr *result, xen_sr_record *record)
-{
- abstract_value param_values[] =
- {
- { .type = &xen_sr_record_abstract_type_,
- .u.struct_val = record }
- };
-
- abstract_type result_type = abstract_type_string;
-
- *result = NULL;
- XEN_CALL_("SR.create");
- return session->ok;
-}
-
-
-bool
-xen_sr_destroy(xen_session *session, xen_sr sr)
-{
- abstract_value param_values[] =
- {
- { .type = &abstract_type_string,
- .u.string_val = sr }
- };
-
- xen_call_(session, "SR.destroy", param_values, 1, NULL, NULL);
- return session->ok;
-}
-
-
-bool
xen_sr_get_by_name_label(xen_session *session, struct xen_sr_set **result,
char *label)
{
abstract_value param_values[] =
@@ -239,6 +208,23 @@ xen_sr_get_vdis(xen_session *session, st
bool
+xen_sr_get_pbds(xen_session *session, struct xen_pbd_set **result, xen_sr sr)
+{
+ abstract_value param_values[] =
+ {
+ { .type = &abstract_type_string,
+ .u.string_val = sr }
+ };
+
+ abstract_type result_type = abstract_type_string_set;
+
+ *result = NULL;
+ XEN_CALL_("SR.get_PBDs");
+ return session->ok;
+}
+
+
+bool
xen_sr_get_virtual_allocation(xen_session *session, int64_t *result, xen_sr sr)
{
abstract_value param_values[] =
@@ -304,18 +290,18 @@ xen_sr_get_type(xen_session *session, ch
bool
-xen_sr_get_location(xen_session *session, char **result, xen_sr sr)
-{
- abstract_value param_values[] =
- {
- { .type = &abstract_type_string,
- .u.string_val = sr }
- };
-
- abstract_type result_type = abstract_type_string;
-
- *result = NULL;
- XEN_CALL_("SR.get_location");
+xen_sr_get_content_type(xen_session *session, char **result, xen_sr sr)
+{
+ abstract_value param_values[] =
+ {
+ { .type = &abstract_type_string,
+ .u.string_val = sr }
+ };
+
+ abstract_type result_type = abstract_type_string;
+
+ *result = NULL;
+ XEN_CALL_("SR.get_content_type");
return session->ok;
}
@@ -353,22 +339,13 @@ xen_sr_set_name_description(xen_session
bool
-xen_sr_clone(xen_session *session, xen_sr *result, xen_sr sr, char *loc, char
*name)
-{
- abstract_value param_values[] =
- {
- { .type = &abstract_type_string,
- .u.string_val = sr },
- { .type = &abstract_type_string,
- .u.string_val = loc },
- { .type = &abstract_type_string,
- .u.string_val = name }
- };
-
- abstract_type result_type = abstract_type_string;
-
- *result = NULL;
- XEN_CALL_("SR.clone");
+xen_sr_get_supported_types(xen_session *session, struct xen_string_set
**result)
+{
+
+ abstract_type result_type = abstract_type_string_set;
+
+ *result = NULL;
+ xen_call_(session, "SR.get_supported_types", NULL, 0, &result_type,
result);
return session->ok;
}
diff -r 14c25e48a557 -r e5931b5e6cc5 tools/python/xen/xend/XendAPI.py
--- a/tools/python/xen/xend/XendAPI.py Thu Apr 05 09:10:33 2007 +0100
+++ b/tools/python/xen/xend/XendAPI.py Wed Apr 04 14:49:38 2007 +0100
@@ -26,20 +26,22 @@ import time
import time
import xmlrpclib
-from xen.xend import XendDomain, XendDomainInfo, XendNode, XendDmesg
-from xen.xend import XendLogging, XendTaskManager
-
-from xen.xend.XendAPIVersion import *
-from xen.xend.XendAuthSessions import instance as auth_manager
-from xen.xend.XendError import *
-from xen.xend.XendClient import ERROR_INVALID_DOMAIN
-from xen.xend.XendLogging import log
-from xen.xend.XendNetwork import XendNetwork
-from xen.xend.XendTask import XendTask
-from xen.xend.XendPIFMetrics import XendPIFMetrics
-from xen.xend.XendVMMetrics import XendVMMetrics
-
-from xen.xend.XendAPIConstants import *
+import XendDomain, XendDomainInfo, XendNode, XendDmesg
+import XendLogging, XendTaskManager
+
+from XendAPIVersion import *
+from XendAuthSessions import instance as auth_manager
+from XendError import *
+from XendClient import ERROR_INVALID_DOMAIN
+from XendLogging import log
+from XendNetwork import XendNetwork
+from XendTask import XendTask
+from XendPIFMetrics import XendPIFMetrics
+from XendVMMetrics import XendVMMetrics
+
+import XendPBD
+
+from XendAPIConstants import *
from xen.util.xmlrpclib2 import stringify
from xen.util.blkif import blkdev_name_to_number
@@ -394,6 +396,17 @@ def valid_sr(func):
_check_ref(lambda r: XendNode.instance().is_valid_sr,
'SR', func, *args, **kwargs)
+def valid_pbd(func):
+ """Decorator to verify if pbd_ref is valid before calling
+ method.
+
+ @param func: function with params: (self, session, pbd_ref)
+ @rtype: callable object
+ """
+ return lambda *args, **kwargs: \
+ _check_ref(lambda r: r in XendPBD.get_all_refs(),
+ 'PBD', func, *args, **kwargs)
+
def valid_pif(func):
"""Decorator to verify if pif_ref is valid before calling
method.
@@ -479,6 +492,7 @@ classes = {
'VTPM' : valid_vtpm,
'console' : valid_console,
'SR' : valid_sr,
+ 'PBD' : valid_pbd,
'PIF' : valid_pif,
'PIF_metrics' : valid_pif_metrics,
'task' : valid_task,
@@ -488,6 +502,7 @@ autoplug_classes = {
autoplug_classes = {
'network' : XendNetwork,
'VM_metrics' : XendVMMetrics,
+ 'PBD' : XendPBD.XendPBD,
'PIF_metrics' : XendPIFMetrics,
}
@@ -843,6 +858,7 @@ class XendAPI(object):
host_attr_ro = ['software_version',
'resident_VMs',
+ 'PBDs',
'PIFs',
'host_CPUs',
'cpu_configuration',
@@ -913,6 +929,8 @@ class XendAPI(object):
return xen_api_success(XendNode.instance().xen_version())
def host_get_resident_VMs(self, session, host_ref):
return xen_api_success(XendDomain.instance().get_domain_refs())
+ def host_get_PBDs(self, _, ref):
+ return xen_api_success(XendPBD.get_all_refs())
def host_get_PIFs(self, session, ref):
return xen_api_success(XendNode.instance().get_PIF_refs())
def host_get_host_CPUs(self, session, host_ref):
@@ -2434,18 +2452,17 @@ class XendAPI(object):
'physical_utilisation',
'physical_size',
'type',
- 'location']
+ 'content_type']
SR_attr_rw = ['name_label',
'name_description']
SR_attr_inst = ['physical_size',
'type',
- 'location',
'name_label',
'name_description']
- SR_methods = [('clone', 'SR'), ('destroy', None)]
+ SR_methods = []
SR_funcs = [('get_by_name_label', 'Set(SR)'),
('get_by_uuid', 'SR')]
@@ -2456,15 +2473,10 @@ class XendAPI(object):
def SR_get_by_name_label(self, session, label):
return xen_api_success(XendNode.instance().get_sr_by_name(label))
- def SR_create(self, session):
- return xen_api_error(XEND_ERROR_UNSUPPORTED)
+ def SR_get_supported_types(self, _):
+ return xen_api_success(['local', 'qcow_file'])
# Class Methods
- def SR_clone(self, session, sr_ref):
- return xen_api_error(XEND_ERROR_UNSUPPORTED)
-
- def SR_destroy(self, session, sr_ref):
- return xen_api_error(XEND_ERROR_UNSUPPORTED)
def SR_get_record(self, session, sr_ref):
sr = XendNode.instance().get_sr(sr_ref)
@@ -2497,8 +2509,8 @@ class XendAPI(object):
def SR_get_type(self, _, ref):
return self._get_SR_attr(ref, 'type')
- def SR_get_location(self, _, ref):
- return self._get_SR_attr(ref, 'location')
+ def SR_get_content_type(self, _, ref):
+ return self._get_SR_attr(ref, 'content_type')
def SR_get_name_label(self, _, ref):
return self._get_SR_attr(ref, 'name_label')
@@ -2519,6 +2531,33 @@ class XendAPI(object):
sr.name_description = value
XendNode.instance().save()
return xen_api_success_void()
+
+
+ # Xen API: Class PBD
+ # ----------------------------------------------------------------
+
+ PBD_attr_ro = ['host',
+ 'SR',
+ 'device_config',
+ 'currently_attached']
+ PBD_attr_rw = []
+ PBD_methods = [('destroy', None)]
+ PBD_funcs = [('create', None)]
+
+ def PBD_get_all(self, _):
+ return xen_api_success(XendPBD.get_all_refs())
+
+ def _PBD_get(self, _, ref):
+ return XendPBD.get(ref)
+
+ def PBD_create(self, _, record):
+ if 'uuid' in record:
+ return xen_api_error(['VALUE_NOT_SUPPORTED',
+ 'uuid', record['uuid'],
+ 'You may not specify a UUID on creation'])
+ new_uuid = XendPBD.XendPBD(record).get_uuid()
+ XendNode.instance().save()
+ return xen_api_success(new_uuid)
# Xen API: Class event
diff -r 14c25e48a557 -r e5931b5e6cc5
tools/python/xen/xend/XendLocalStorageRepo.py
--- a/tools/python/xen/xend/XendLocalStorageRepo.py Thu Apr 05 09:10:33
2007 +0100
+++ b/tools/python/xen/xend/XendLocalStorageRepo.py Wed Apr 04 14:49:38
2007 +0100
@@ -30,13 +30,13 @@ import struct
import struct
from xen.util import mkdir
-from xen.xend import uuid
-from xen.xend.XendError import XendError
-from xen.xend.XendVDI import *
-from xen.xend.XendTask import XendTask
-from xen.xend.XendStorageRepository import XendStorageRepository
-from xen.xend.XendStateStore import XendStateStore
-from xen.xend.XendOptions import instance as xendoptions
+import uuid
+from XendError import XendError
+from XendVDI import *
+from XendTask import XendTask
+from XendStorageRepository import XendStorageRepository
+from XendStateStore import XendStateStore
+from XendOptions import instance as xendoptions
MB = 1024 * 1024
@@ -58,8 +58,7 @@ class XendLocalStorageRepo(XendStorageRe
"""
XendStorageRepository.__init__(self, sr_uuid, sr_type,
- name_label, name_description,
- '/')
+ name_label, name_description)
self.state = XendStateStore(xendoptions().get_xend_state_path()
+ '/local_sr')
diff -r 14c25e48a557 -r e5931b5e6cc5 tools/python/xen/xend/XendNode.py
--- a/tools/python/xen/xend/XendNode.py Thu Apr 05 09:10:33 2007 +0100
+++ b/tools/python/xen/xend/XendNode.py Wed Apr 04 14:49:38 2007 +0100
@@ -22,17 +22,18 @@ import xen.lowlevel.xc
from xen.util import Brctl
-from xen.xend import uuid, arch
-from xen.xend.XendError import *
-from xen.xend.XendOptions import instance as xendoptions
-from xen.xend.XendQCoWStorageRepo import XendQCoWStorageRepo
-from xen.xend.XendLocalStorageRepo import XendLocalStorageRepo
-from xen.xend.XendLogging import log
-from xen.xend.XendPIF import *
-from xen.xend.XendPIFMetrics import XendPIFMetrics
-from xen.xend.XendNetwork import *
-from xen.xend.XendStateStore import XendStateStore
-from xen.xend.XendMonitor import XendMonitor
+import uuid, arch
+import XendPBD
+from XendError import *
+from XendOptions import instance as xendoptions
+from XendQCoWStorageRepo import XendQCoWStorageRepo
+from XendLocalStorageRepo import XendLocalStorageRepo
+from XendLogging import log
+from XendPIF import *
+from XendPIFMetrics import XendPIFMetrics
+from XendNetwork import *
+from XendStateStore import XendStateStore
+from XendMonitor import XendMonitor
class XendNode:
"""XendNode - Represents a Domain 0 Host."""
@@ -193,13 +194,14 @@ class XendNode:
saved_srs = self.state_store.load_state('sr')
if saved_srs:
for sr_uuid, sr_cfg in saved_srs.items():
+ log.error("SAved SRS %s %s", sr_uuid, sr_cfg['type'])
if sr_cfg['type'] == 'qcow_file':
self.srs[sr_uuid] = XendQCoWStorageRepo(sr_uuid)
- elif sr_cfg['type'] == 'local_image':
+ elif sr_cfg['type'] == 'local':
self.srs[sr_uuid] = XendLocalStorageRepo(sr_uuid)
# Create missing SRs if they don't exist
- if not self.get_sr_by_type('local_image'):
+ if not self.get_sr_by_type('local'):
image_sr_uuid = uuid.createString()
self.srs[image_sr_uuid] = XendLocalStorageRepo(image_sr_uuid)
@@ -207,6 +209,11 @@ class XendNode:
qcow_sr_uuid = uuid.createString()
self.srs[qcow_sr_uuid] = XendQCoWStorageRepo(qcow_sr_uuid)
+ saved_pbds = self.state_store.load_state('pbd')
+ if saved_pbds:
+ for pbd_uuid, pbd_cfg in saved_pbds.items():
+ pbd_cfg['uuid'] = pbd_uuid
+ XendPBD.XendPBD(pbd_cfg)
def network_create(self, record, persist = True, net_uuid = None):
@@ -280,6 +287,7 @@ class XendNode:
self.state_store.save_state('cpu', self.cpus)
self.save_PIFs()
self.save_networks()
+ self.save_PBDs()
self.save_SRs()
def save_PIFs(self):
@@ -291,6 +299,11 @@ class XendNode:
net_records = dict([(k, v.get_record_internal(False))
for k, v in self.networks.items()])
self.state_store.save_state('network', net_records)
+
+ def save_PBDs(self):
+ pbd_records = dict([(v.get_uuid(), v.get_record())
+ for v in XendPBD.get_all()])
+ self.state_store.save_state('pbd', pbd_records)
def save_SRs(self):
sr_records = dict([(k, v.get_record(transient = False))
diff -r 14c25e48a557 -r e5931b5e6cc5 tools/python/xen/xend/XendPBD.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/python/xen/xend/XendPBD.py Wed Apr 04 14:49:38 2007 +0100
@@ -0,0 +1,79 @@
+#============================================================================
+# 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) 2007 Xensource Inc.
+#============================================================================
+
+
+import uuid
+from XendLogging import log
+
+
+attr_inst = ['uuid',
+ 'host',
+ 'SR',
+ 'device_config']
+attr_ro = attr_inst + ['currently_attached']
+
+
+_all = {}
+
+
+def get(ref):
+ return _all[ref]
+
+
+def get_all():
+ return _all.values()
+
+
+def get_all_refs():
+ return _all.keys()
+
+
+def get_by_SR(sr_ref):
+ return [k for (k, v) in _all.items() if v.get_SR() == sr_ref]
+
+
+class XendPBD:
+ """Physical block devices."""
+
+ def __init__(self, record):
+ if 'uuid' not in record:
+ record['uuid'] = uuid.createString()
+
+ import XendAPI
+ for v in attr_inst:
+ setattr(self, v, record[v])
+ self.currently_attached = True
+ _all[record['uuid']] = self
+
+
+ def destroy(self):
+ if self.uuid in _all:
+ del _all[self.uuid]
+
+
+ def get_record(self):
+ import XendAPI
+ result = {}
+ for v in attr_ro:
+ result[v] = getattr(self, v)
+ return result
+
+
+for v in attr_ro:
+ def f(v_):
+ setattr(XendPBD, 'get_' + v_, lambda s: getattr(s, v_))
+ f(v)
diff -r 14c25e48a557 -r e5931b5e6cc5
tools/python/xen/xend/XendQCoWStorageRepo.py
--- a/tools/python/xen/xend/XendQCoWStorageRepo.py Thu Apr 05 09:10:33
2007 +0100
+++ b/tools/python/xen/xend/XendQCoWStorageRepo.py Wed Apr 04 14:49:38
2007 +0100
@@ -29,12 +29,13 @@ import struct
import struct
from xen.util import mkdir
-from xen.xend import uuid
-from xen.xend.XendError import XendError
-from xen.xend.XendVDI import *
-from xen.xend.XendTask import XendTask
-from xen.xend.XendStorageRepository import XendStorageRepository
-from xen.xend.XendOptions import instance as xendoptions
+import uuid
+import XendPBD
+from XendError import XendError
+from XendVDI import *
+from XendTask import XendTask
+from XendStorageRepository import XendStorageRepository
+from XendOptions import instance as xendoptions
XEND_STORAGE_NO_MAXIMUM = sys.maxint
XEND_STORAGE_QCOW_FILENAME = "%s.qcow"
@@ -72,7 +73,6 @@ class XendQCoWStorageRepo(XendStorageRep
sr_type = "qcow_file",
name_label = "QCoW",
name_description = "Xend QCoW Storage Repository",
- location = xendoptions().get_xend_storage_path(),
storage_max = XEND_STORAGE_NO_MAXIMUM):
"""
@keyword storage_max: Maximum disk space to use in bytes.
@@ -85,9 +85,9 @@ class XendQCoWStorageRepo(XendStorageRep
"""
XendStorageRepository.__init__(self, sr_uuid, sr_type, name_label,
- name_description, location,
- storage_max)
+ name_description, storage_max)
self.storage_free = 0
+ self.location = xendoptions().get_xend_storage_path()
self._refresh()
def get_record(self, transient = True):
@@ -98,8 +98,9 @@ class XendQCoWStorageRepo(XendStorageRep
'physical_utilisation': self.physical_utilisation,
'physical_size': self.physical_size,
'type': self.type,
- 'location': self.location,
- 'VDIs': self.images.keys()}
+ 'content_type': self.content_type,
+ 'VDIs': self.images.keys(),
+ 'PBDs': XendPBD.get_by_SR(self.uuid)}
if self.physical_size == XEND_STORAGE_NO_MAXIMUM:
stfs = os.statvfs(self.location)
diff -r 14c25e48a557 -r e5931b5e6cc5 tools/python/xen/xend/XendStateStore.py
--- a/tools/python/xen/xend/XendStateStore.py Thu Apr 05 09:10:33 2007 +0100
+++ b/tools/python/xen/xend/XendStateStore.py Wed Apr 04 14:49:38 2007 +0100
@@ -204,7 +204,7 @@ class XendStateStore:
if type(val) == dict:
for val_uuid in val.keys():
val_node = doc.createElement(key)
- if key == 'other_config':
+ if key in ['other_config', 'device_config']:
val_node.setAttribute('key', str(val_uuid))
val_node.setAttribute('value', str(val[val_uuid]))
else:
diff -r 14c25e48a557 -r e5931b5e6cc5
tools/python/xen/xend/XendStorageRepository.py
--- a/tools/python/xen/xend/XendStorageRepository.py Thu Apr 05 09:10:33
2007 +0100
+++ b/tools/python/xen/xend/XendStorageRepository.py Wed Apr 04 14:49:38
2007 +0100
@@ -22,8 +22,9 @@ import threading
import threading
import sys
-from xen.xend.XendError import XendError
-from xen.xend.XendVDI import *
+from XendError import XendError
+from XendVDI import *
+import XendPBD
XEND_STORAGE_NO_MAXIMUM = sys.maxint
@@ -34,7 +35,6 @@ class XendStorageRepository:
sr_type = "unknown",
name_label = 'Unknown',
name_description = 'Not Implemented',
- location = '',
storage_max = XEND_STORAGE_NO_MAXIMUM):
"""
@keyword storage_max: Maximum disk space to use in bytes.
@@ -49,7 +49,6 @@ class XendStorageRepository:
# XenAPI Parameters
self.uuid = uuid
self.type = sr_type
- self.location = location
self.name_label = name_label
self.name_description = name_description
self.images = {}
@@ -57,6 +56,7 @@ class XendStorageRepository:
self.physical_size = storage_max
self.physical_utilisation = 0
self.virtual_allocation = 0
+ self.content_type = ''
self.lock = threading.RLock()
@@ -68,9 +68,10 @@ class XendStorageRepository:
'physical_utilisation': self.physical_utilisation,
'physical_size': self.physical_size,
'type': self.type,
- 'location': self.location,
+ 'content_type': self.content_type,
'VDIs': self.images.keys()}
-
+ if not transient:
+ retval ['PBDs'] = XendPBD.get_by_SR(self.uuid)
return retval
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|