WARNING - OLD ARCHIVES

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

xen-changelog

[Xen-changelog] [xen-unstable] Remove docs and bindings for unimplemente

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] Remove docs and bindings for unimplemented SR.{create, destroy, clone}.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Thu, 05 Apr 2007 06:50:15 -0700
Delivery-date: Thu, 05 Apr 2007 06:50:09 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# 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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] Remove docs and bindings for unimplemented SR.{create, destroy, clone}., Xen patchbot-unstable <=