[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] Document existing PIF.create_VLAN, and remove PIF.create (PIFs are implicitly



# HG changeset patch
# User Ewan Mellor <ewan@xxxxxxxxxxxxx>
# Date 1169991607 0
# Node ID 5e1c7022d4ad69d59b661f73302d8f9a135db714
# Parent  ea3c752045555180c2de41913e5efeabd424d0cf
Document existing PIF.create_VLAN, and remove PIF.create (PIFs are implicitly
created from the physical host configuration).

Change PIF.name to PIF.device, for consistency with other uses, and make
PIF.VLAN an int.

Signed-off-by: Ewan Mellor <ewan@xxxxxxxxxxxxx>
---
 docs/xen-api/xenapi-datamodel.tex         |  178 +++++++++++++++---------------
 tools/libxen/include/xen_pif.h            |   57 ++++-----
 tools/libxen/src/xen_pif.c                |  160 +++++++++++++-------------
 tools/python/xen/xend/XendAPI.py          |   46 +++----
 tools/python/xen/xend/XendError.py        |    8 +
 tools/python/xen/xend/XendNode.py         |   27 +++-
 tools/python/xen/xend/XendPIF.py          |   24 ++--
 tools/python/xen/xm/messages/en/xen-xm.po |   10 +
 8 files changed, 273 insertions(+), 237 deletions(-)

diff -r ea3c75204555 -r 5e1c7022d4ad docs/xen-api/xenapi-datamodel.tex
--- a/docs/xen-api/xenapi-datamodel.tex Sat Jan 27 18:26:41 2007 +0000
+++ b/docs/xen-api/xenapi-datamodel.tex Sun Jan 28 13:40:07 2007 +0000
@@ -6529,22 +6529,94 @@ all fields from the object
 \begin{longtable}{|lllp{0.38\textwidth}|}
 \hline
 \multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf PIF} \\
-\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A 
physical network interface (note separate VLANs are represented as several 
PIFs)}} \\
+\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A
+physical network interface (note separate VLANs are represented as several
+PIFs)}} \\
 \hline
 Quals & Field & Type & Description \\
 \hline
 $\mathit{RO}_\mathit{run}$ &  {\tt uuid} & string & unique identifier/object 
reference \\
-$\mathit{RW}$ &  {\tt name} & string & human-readable name of the interface \\
+$\mathit{RW}$ &  {\tt device} & string & machine-readable name of the 
interface (e.g. eth0) \\
 $\mathit{RW}$ &  {\tt network} & network ref & virtual network to which this 
pif is connected \\
 $\mathit{RW}$ &  {\tt host} & host ref & physical machine to which this pif is 
connected \\
 $\mathit{RW}$ &  {\tt MAC} & string & ethernet MAC address of physical 
interface \\
 $\mathit{RW}$ &  {\tt MTU} & int & MTU in octets \\
-$\mathit{RW}$ &  {\tt VLAN} & string & VLAN tag for all traffic passing 
through this interface \\
+$\mathit{RW}$ &  {\tt VLAN} & int & VLAN tag for all traffic passing through 
this interface \\
 $\mathit{RO}_\mathit{run}$ &  {\tt io/read\_kbs} & float & Read bandwidth 
(KiB/s) \\
 $\mathit{RO}_\mathit{run}$ &  {\tt io/write\_kbs} & float & Write bandwidth 
(KiB/s) \\
 \hline
 \end{longtable}
 \subsection{Additional RPCs associated with class: PIF}
+\subsubsection{RPC name:~create\_VLAN}
+
+{\bf Overview:} 
+Create a VLAN interface from an existing physical interface
+
+ \noindent {\bf Signature:} 
+\begin{verbatim} (PIF ref) create_VLAN (session_id s, string device, network 
ref network, host ref host, int VLAN)\end{verbatim}
+
+
+\noindent{\bf Arguments:}
+
+ 
+\vspace{0.3cm}
+\begin{tabular}{|c|c|p{7cm}|}
+ \hline
+{\bf type} & {\bf name} & {\bf description} \\ \hline
+{\tt string } & device & physical interface on which to crate the VLAN 
interface \\ \hline 
+
+{\tt network ref } & network & network to which this interface should be 
connected \\ \hline 
+
+{\tt host ref } & host & physical machine to which this PIF is connected \\ 
\hline 
+
+{\tt int } & VLAN & VLAN tag for the new interface \\ \hline 
+
+\end{tabular}
+
+\vspace{0.3cm}
+
+ \noindent {\bf Return Type:} 
+{\tt 
+PIF ref
+}
+
+
+The reference of the created PIF object
+\vspace{0.3cm}
+\vspace{0.3cm}
+\vspace{0.3cm}
+\subsubsection{RPC name:~destroy}
+
+{\bf Overview:} 
+Destroy the interface (provided it is a synthetic interface like a VLAN; fail 
if it is a physical interface)
+
+ \noindent {\bf Signature:} 
+\begin{verbatim} void destroy (session_id s, PIF 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 PIF ref } & self & the PIF object to destroy \\ \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\_uuid}
 
 {\bf Overview:} 
@@ -6577,13 +6649,13 @@ value of the field
 \vspace{0.3cm}
 \vspace{0.3cm}
 \vspace{0.3cm}
-\subsubsection{RPC name:~get\_name}
-
-{\bf Overview:} 
-Get the name field of the given PIF.
-
- \noindent {\bf Signature:} 
-\begin{verbatim} string get_name (session_id s, PIF ref self)\end{verbatim}
+\subsubsection{RPC name:~get\_device}
+
+{\bf Overview:} 
+Get the device field of the given PIF.
+
+ \noindent {\bf Signature:} 
+\begin{verbatim} string get_device (session_id s, PIF ref self)\end{verbatim}
 
 
 \noindent{\bf Arguments:}
@@ -6609,13 +6681,13 @@ value of the field
 \vspace{0.3cm}
 \vspace{0.3cm}
 \vspace{0.3cm}
-\subsubsection{RPC name:~set\_name}
-
-{\bf Overview:} 
-Set the name field of the given PIF.
-
- \noindent {\bf Signature:} 
-\begin{verbatim} void set_name (session_id s, PIF ref self, string 
value)\end{verbatim}
+\subsubsection{RPC name:~set\_device}
+
+{\bf Overview:} 
+Set the device field of the given PIF.
+
+ \noindent {\bf Signature:} 
+\begin{verbatim} void set_device (session_id s, PIF ref self, string 
value)\end{verbatim}
 
 
 \noindent{\bf Arguments:}
@@ -6913,7 +6985,7 @@ Get the VLAN field of the given PIF.
 Get the VLAN field of the given PIF.
 
  \noindent {\bf Signature:} 
-\begin{verbatim} string get_VLAN (session_id s, PIF ref self)\end{verbatim}
+\begin{verbatim} int get_VLAN (session_id s, PIF ref self)\end{verbatim}
 
 
 \noindent{\bf Arguments:}
@@ -6931,7 +7003,7 @@ Get the VLAN field of the given PIF.
 
  \noindent {\bf Return Type:} 
 {\tt 
-string
+int
 }
 
 
@@ -6945,7 +7017,7 @@ Set the VLAN field of the given PIF.
 Set the VLAN field of the given PIF.
 
  \noindent {\bf Signature:} 
-\begin{verbatim} void set_VLAN (session_id s, PIF ref self, string 
value)\end{verbatim}
+\begin{verbatim} void set_VLAN (session_id s, PIF ref self, int 
value)\end{verbatim}
 
 
 \noindent{\bf Arguments:}
@@ -6957,7 +7029,7 @@ Set the VLAN field of the given PIF.
 {\bf type} & {\bf name} & {\bf description} \\ \hline
 {\tt PIF ref } & self & reference to the object \\ \hline 
 
-{\tt string } & value & New value to set \\ \hline 
+{\tt int } & value & New value to set \\ \hline 
 
 \end{tabular}
 
@@ -7034,70 +7106,6 @@ float
 
 
 value of the field
-\vspace{0.3cm}
-\vspace{0.3cm}
-\vspace{0.3cm}
-\subsubsection{RPC name:~create}
-
-{\bf Overview:} 
-Create a new PIF instance, and return its handle.
-
- \noindent {\bf Signature:} 
-\begin{verbatim} (PIF ref) create (session_id s, PIF 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 PIF record } & args & All constructor arguments \\ \hline 
-
-\end{tabular}
-
-\vspace{0.3cm}
-
- \noindent {\bf Return Type:} 
-{\tt 
-PIF 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 PIF instance.
-
- \noindent {\bf Signature:} 
-\begin{verbatim} void destroy (session_id s, PIF 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 PIF 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}
diff -r ea3c75204555 -r 5e1c7022d4ad tools/libxen/include/xen_pif.h
--- a/tools/libxen/include/xen_pif.h    Sat Jan 27 18:26:41 2007 +0000
+++ b/tools/libxen/include/xen_pif.h    Sun Jan 28 13:40:07 2007 +0000
@@ -26,8 +26,8 @@
 
 
 /*
- * The PIF class. 
- *  
+ * The PIF class.
+ * 
  * A physical network interface (note separate VLANs are represented as
  * several PIFs).
  */
@@ -65,12 +65,12 @@ typedef struct xen_pif_record
 {
     xen_pif handle;
     char *uuid;
-    char *name;
+    char *device;
     struct xen_network_record_opt *network;
     struct xen_host_record_opt *host;
     char *mac;
     int64_t mtu;
-    char *vlan;
+    int64_t vlan;
     double io_read_kbs;
     double io_write_kbs;
 } xen_pif_record;
@@ -169,20 +169,6 @@ xen_pif_get_by_uuid(xen_session *session
 
 
 /**
- * Create a new PIF instance, and return its handle.
- */
-extern bool
-xen_pif_create(xen_session *session, xen_pif *result, xen_pif_record *record);
-
-
-/**
- * Destroy the specified PIF instance.
- */
-extern bool
-xen_pif_destroy(xen_session *session, xen_pif pif);
-
-
-/**
  * Get the uuid field of the given PIF.
  */
 extern bool
@@ -190,10 +176,10 @@ xen_pif_get_uuid(xen_session *session, c
 
 
 /**
- * Get the name field of the given PIF.
- */
-extern bool
-xen_pif_get_name(xen_session *session, char **result, xen_pif pif);
+ * Get the device field of the given PIF.
+ */
+extern bool
+xen_pif_get_device(xen_session *session, char **result, xen_pif pif);
 
 
 /**
@@ -228,7 +214,7 @@ xen_pif_get_mtu(xen_session *session, in
  * Get the VLAN field of the given PIF.
  */
 extern bool
-xen_pif_get_vlan(xen_session *session, char **result, xen_pif pif);
+xen_pif_get_vlan(xen_session *session, int64_t *result, xen_pif pif);
 
 
 /**
@@ -246,10 +232,10 @@ xen_pif_get_io_write_kbs(xen_session *se
 
 
 /**
- * Set the name field of the given PIF.
- */
-extern bool
-xen_pif_set_name(xen_session *session, xen_pif pif, char *name);
+ * Set the device field of the given PIF.
+ */
+extern bool
+xen_pif_set_device(xen_session *session, xen_pif pif, char *device);
 
 
 /**
@@ -284,7 +270,22 @@ xen_pif_set_mtu(xen_session *session, xe
  * Set the VLAN field of the given PIF.
  */
 extern bool
-xen_pif_set_vlan(xen_session *session, xen_pif pif, char *vlan);
+xen_pif_set_vlan(xen_session *session, xen_pif pif, int64_t vlan);
+
+
+/**
+ * Create a VLAN interface from an existing physical interface
+ */
+extern bool
+xen_pif_create_vlan(xen_session *session, xen_pif *result, char *device, 
xen_network network, xen_host host, int64_t vlan);
+
+
+/**
+ * Destroy the interface (provided it is a synthetic interface like a
+ * VLAN; fail if it is a physical interface)
+ */
+extern bool
+xen_pif_destroy(xen_session *session, xen_pif self);
 
 
 #endif
diff -r ea3c75204555 -r 5e1c7022d4ad tools/libxen/src/xen_pif.c
--- a/tools/libxen/src/xen_pif.c        Sat Jan 27 18:26:41 2007 +0000
+++ b/tools/libxen/src/xen_pif.c        Sun Jan 28 13:40:07 2007 +0000
@@ -41,9 +41,9 @@ static const struct_member xen_pif_recor
         { .key = "uuid",
           .type = &abstract_type_string,
           .offset = offsetof(xen_pif_record, uuid) },
-        { .key = "name",
+        { .key = "device",
           .type = &abstract_type_string,
-          .offset = offsetof(xen_pif_record, name) },
+          .offset = offsetof(xen_pif_record, device) },
         { .key = "network",
           .type = &abstract_type_ref,
           .offset = offsetof(xen_pif_record, network) },
@@ -57,7 +57,7 @@ static const struct_member xen_pif_recor
           .type = &abstract_type_int,
           .offset = offsetof(xen_pif_record, mtu) },
         { .key = "VLAN",
-          .type = &abstract_type_string,
+          .type = &abstract_type_int,
           .offset = offsetof(xen_pif_record, vlan) },
         { .key = "io_read_kbs",
           .type = &abstract_type_float,
@@ -86,11 +86,10 @@ xen_pif_record_free(xen_pif_record *reco
     }
     free(record->handle);
     free(record->uuid);
-    free(record->name);
+    free(record->device);
     xen_network_record_opt_free(record->network);
     xen_host_record_opt_free(record->host);
     free(record->mac);
-    free(record->vlan);
     free(record);
 }
 
@@ -136,49 +135,18 @@ xen_pif_get_by_uuid(xen_session *session
 
 
 bool
-xen_pif_create(xen_session *session, xen_pif *result, xen_pif_record *record)
-{
-    abstract_value param_values[] =
-        {
-            { .type = &xen_pif_record_abstract_type_,
-              .u.struct_val = record }
-        };
-
-    abstract_type result_type = abstract_type_string;
-
-    *result = NULL;
-    XEN_CALL_("PIF.create");
-    return session->ok;
-}
-
-
-bool
-xen_pif_destroy(xen_session *session, xen_pif pif)
-{
-    abstract_value param_values[] =
-        {
-            { .type = &abstract_type_string,
-              .u.string_val = pif }
-        };
-
-    xen_call_(session, "PIF.destroy", param_values, 1, NULL, NULL);
-    return session->ok;
-}
-
-
-bool
-xen_pif_get_name(xen_session *session, char **result, xen_pif pif)
-{
-    abstract_value param_values[] =
-        {
-            { .type = &abstract_type_string,
-              .u.string_val = pif }
-        };
-
-    abstract_type result_type = abstract_type_string;
-
-    *result = NULL;
-    XEN_CALL_("PIF.get_name");
+xen_pif_get_device(xen_session *session, char **result, xen_pif pif)
+{
+    abstract_value param_values[] =
+        {
+            { .type = &abstract_type_string,
+              .u.string_val = pif }
+        };
+
+    abstract_type result_type = abstract_type_string;
+
+    *result = NULL;
+    XEN_CALL_("PIF.get_device");
     return session->ok;
 }
 
@@ -251,17 +219,16 @@ xen_pif_get_mtu(xen_session *session, in
 
 
 bool
-xen_pif_get_vlan(xen_session *session, char **result, xen_pif pif)
-{
-    abstract_value param_values[] =
-        {
-            { .type = &abstract_type_string,
-              .u.string_val = pif }
-        };
-
-    abstract_type result_type = abstract_type_string;
-
-    *result = NULL;
+xen_pif_get_vlan(xen_session *session, int64_t *result, xen_pif pif)
+{
+    abstract_value param_values[] =
+        {
+            { .type = &abstract_type_string,
+              .u.string_val = pif }
+        };
+
+    abstract_type result_type = abstract_type_int;
+
     XEN_CALL_("PIF.get_VLAN");
     return session->ok;
 }
@@ -300,17 +267,17 @@ xen_pif_get_io_write_kbs(xen_session *se
 
 
 bool
-xen_pif_set_name(xen_session *session, xen_pif pif, char *name)
-{
-    abstract_value param_values[] =
-        {
-            { .type = &abstract_type_string,
-              .u.string_val = pif },
-            { .type = &abstract_type_string,
-              .u.string_val = name }
-        };
-
-    xen_call_(session, "PIF.set_name", param_values, 2, NULL, NULL);
+xen_pif_set_device(xen_session *session, xen_pif pif, char *device)
+{
+    abstract_value param_values[] =
+        {
+            { .type = &abstract_type_string,
+              .u.string_val = pif },
+            { .type = &abstract_type_string,
+              .u.string_val = device }
+        };
+
+    xen_call_(session, "PIF.set_device", param_values, 2, NULL, NULL);
     return session->ok;
 }
 
@@ -380,14 +347,14 @@ xen_pif_set_mtu(xen_session *session, xe
 
 
 bool
-xen_pif_set_vlan(xen_session *session, xen_pif pif, char *vlan)
-{
-    abstract_value param_values[] =
-        {
-            { .type = &abstract_type_string,
-              .u.string_val = pif },
-            { .type = &abstract_type_string,
-              .u.string_val = vlan }
+xen_pif_set_vlan(xen_session *session, xen_pif pif, int64_t vlan)
+{
+    abstract_value param_values[] =
+        {
+            { .type = &abstract_type_string,
+              .u.string_val = pif },
+            { .type = &abstract_type_int,
+              .u.int_val = vlan }
         };
 
     xen_call_(session, "PIF.set_VLAN", param_values, 2, NULL, NULL);
@@ -396,6 +363,43 @@ xen_pif_set_vlan(xen_session *session, x
 
 
 bool
+xen_pif_create_vlan(xen_session *session, xen_pif *result, char *device, 
xen_network network, xen_host host, int64_t vlan)
+{
+    abstract_value param_values[] =
+        {
+            { .type = &abstract_type_string,
+              .u.string_val = device },
+            { .type = &abstract_type_string,
+              .u.string_val = network },
+            { .type = &abstract_type_string,
+              .u.string_val = host },
+            { .type = &abstract_type_int,
+              .u.int_val = vlan }
+        };
+
+    abstract_type result_type = abstract_type_string;
+
+    *result = NULL;
+    XEN_CALL_("PIF.create_VLAN");
+    return session->ok;
+}
+
+
+bool
+xen_pif_destroy(xen_session *session, xen_pif self)
+{
+    abstract_value param_values[] =
+        {
+            { .type = &abstract_type_string,
+              .u.string_val = self }
+        };
+
+    xen_call_(session, "PIF.destroy", param_values, 1, NULL, NULL);
+    return session->ok;
+}
+
+
+bool
 xen_pif_get_uuid(xen_session *session, char **result, xen_pif pif)
 {
     *result = session->ok ? xen_strdup_((char *)pif) : NULL;
diff -r ea3c75204555 -r 5e1c7022d4ad tools/python/xen/xend/XendAPI.py
--- a/tools/python/xen/xend/XendAPI.py  Sat Jan 27 18:26:41 2007 +0000
+++ b/tools/python/xen/xend/XendAPI.py  Sun Jan 28 13:40:07 2007 +0000
@@ -752,7 +752,7 @@ class XendAPI(object):
 
     PIF_attr_ro = ['io_read_kbs',
                    'io_write_kbs']
-    PIF_attr_rw = ['name',
+    PIF_attr_rw = ['device',
                    'network',
                    'host',
                    'MAC',
@@ -766,24 +766,11 @@ class XendAPI(object):
     def _get_PIF(self, ref):
         return XendNode.instance().pifs[ref]
 
-    def PIF_create(self, _, name, network_uuid, host_uuid, mac, mtu, vlan):
+    def PIF_destroy(self, _, ref):
         try:
-            node = XendNode.instance()
-            if host_uuid != node.uuid:
-                return xen_api_error(['HOST_HANDLE_INVALID', host_uuid])
-
-            elif _is_valid_ref(network_uuid, node.is_valid_network):
-                network = node.get_network(network_uuid)
-                return xen_api_success(node.PIF_create(name, mtu, vlan, mac,
-                                                       network))
-            else:
-                return xen_api_error(['NETWORK_HANDLE_INVALID', network_uuid])
-        except NetworkAlreadyConnected, exn:
-            return xen_api_error(['NETWORK_ALREADY_CONNECTED',
-                                  network_uuid, exn.pif_uuid])
-
-    def PIF_destroy(self, _, ref):
-        return xen_api_success(XendNode.instance().PIF_destroy(ref))
+            return xen_api_success(XendNode.instance().PIF_destroy(ref))
+        except PIFIsPhysical, exn:
+            return xen_api_error(['PIF_IS_PHYSICAL', ref])
 
     # object methods
     def PIF_get_record(self, _, ref):
@@ -792,8 +779,8 @@ class XendAPI(object):
     def PIF_get_all(self, _):
         return xen_api_success(XendNode.instance().pifs.keys())
 
-    def PIF_get_name(self, _, ref):
-        return xen_api_success(self._get_PIF(ref).name)
+    def PIF_get_device(self, _, ref):
+        return xen_api_success(self._get_PIF(ref).device)
 
     def PIF_get_network(self, _, ref):
         return xen_api_success(self._get_PIF(ref).network.uuid)
@@ -816,8 +803,8 @@ class XendAPI(object):
     def PIF_get_io_write_kbs(self, _, ref):
         return xen_api_success(self._get_PIF(ref).get_io_write_kbs())
     
-    def PIF_set_name(self, _, ref, name):
-        return xen_api_success(self._get_PIF(ref).set_name(name))
+    def PIF_set_device(self, _, ref, device):
+        return xen_api_success(self._get_PIF(ref).set_device(device))
 
     def PIF_set_MAC(self, _, ref, mac):
         return xen_api_success(self._get_PIF(ref).set_mac(mac))
@@ -827,14 +814,23 @@ class XendAPI(object):
 
     def PIF_create_VLAN(self, _, ref, network, vlan):
         try:
-            if _is_valid_ref(network, XendNode.instance().is_valid_network):
-                return xen_api_success(XendNode.instance().PIF_create_VLAN(
-                    ref, network, vlan))
+            vlan = int(vlan)
+        except:
+            return xen_api_error(['VLAN_TAG_INVALID', vlan])
+
+        try:
+            node = XendNode.instance()
+            
+            if _is_valid_ref(network, node.is_valid_network):
+                return xen_api_success(
+                    node.PIF_create_VLAN(ref, network, vlan))
             else:
                 return xen_api_error(['NETWORK_HANDLE_INVALID', network])
         except NetworkAlreadyConnected, exn:
             return xen_api_error(['NETWORK_ALREADY_CONNECTED',
                                   network, exn.pif_uuid])
+        except VLANTagInvalid:
+            return xen_api_error(['VLAN_TAG_INVALID', vlan])
 
 
     # Xen API: Class VM
diff -r ea3c75204555 -r 5e1c7022d4ad tools/python/xen/xend/XendError.py
--- a/tools/python/xen/xend/XendError.py        Sat Jan 27 18:26:41 2007 +0000
+++ b/tools/python/xen/xend/XendError.py        Sun Jan 28 13:40:07 2007 +0000
@@ -43,6 +43,14 @@ class NetworkAlreadyConnected(XendError)
         XendError.__init__(self, 'Network already connected')
         self.pif_uuid = pif_uuid
 
+class PIFIsPhysical(XendError):
+    def __init__(self):
+        XendError.__init__(self, 'PIF is physical')
+
+class VLANTagInvalid(XendError):
+    def __init__(self):
+        XendError.__init__(self, 'VLAN tag invalid')
+
 class VmError(XendError):
     """Vm construction error."""
     pass
diff -r ea3c75204555 -r 5e1c7022d4ad tools/python/xen/xend/XendNode.py
--- a/tools/python/xen/xend/XendNode.py Sat Jan 27 18:26:41 2007 +0000
+++ b/tools/python/xen/xend/XendNode.py Sun Jan 28 13:40:07 2007 +0000
@@ -23,7 +23,7 @@ from xen.util import Brctl
 from xen.util import Brctl
 
 from xen.xend import uuid
-from xen.xend.XendError import XendError, NetworkAlreadyConnected
+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
@@ -111,8 +111,13 @@ class XendNode:
                 if pif.get('network') in self.networks:
                     network = self.networks[pif['network']]
                     try:
-                        self.PIF_create(pif['name'], pif['MTU'], pif['VLAN'],
-                                        pif['MAC'], network, False, pif_uuid)
+                        if 'device' not in pif and 'name' in pif:
+                            # Compatibility hack, can go pretty soon.
+                            pif['device'] = pif['name']
+                        
+                        self._PIF_create(pif['device'], pif['MTU'],
+                                         int(pif['VLAN']),
+                                         pif['MAC'], network, False, pif_uuid)
                     except NetworkAlreadyConnected, exn:
                         log.error('Cannot load saved PIF %s, as network %s ' +
                                   'is already connected to PIF %s',
@@ -120,7 +125,7 @@ class XendNode:
         else:
             for name, mtu, mac in linux_get_phy_ifaces():
                 network = self.networks.values()[0]
-                self.PIF_create(name, mtu, '', mac, network, False)
+                self._PIF_create(name, mtu, -1, mac, network, False)
 
         # initialise storage
         saved_srs = self.state_store.load_state('sr')
@@ -161,8 +166,8 @@ class XendNode:
         self.save_networks()
 
 
-    def PIF_create(self, name, mtu, vlan, mac, network, persist = True,
-                   pif_uuid = None):
+    def _PIF_create(self, name, mtu, vlan, mac, network, persist = True,
+                    pif_uuid = None):
         for pif in self.pifs.values():
             if pif.network == network:
                 raise NetworkAlreadyConnected(pif.uuid)
@@ -178,12 +183,20 @@ class XendNode:
 
 
     def PIF_create_VLAN(self, pif_uuid, network_uuid, vlan):
+        if vlan < 0 or vlan >= 4096:
+            raise VLANTagInvalid()
+            
         pif = self.pifs[pif_uuid]
         network = self.networks[network_uuid]
-        return self.PIF_create(pif.name, pif.mtu, vlan, pif.mac, network)
+        return self._PIF_create(pif.device, pif.mtu, vlan, pif.mac, network)
 
 
     def PIF_destroy(self, pif_uuid):
+        pif = self.pifs[pif_uuid]
+
+        if pif.vlan == -1:
+            raise PIFIsPhysical()
+
         del self.pifs[pif_uuid]
         self.save_PIFs()
 
diff -r ea3c75204555 -r 5e1c7022d4ad tools/python/xen/xend/XendPIF.py
--- a/tools/python/xen/xend/XendPIF.py  Sat Jan 27 18:26:41 2007 +0000
+++ b/tools/python/xen/xend/XendPIF.py  Sun Jan 28 13:40:07 2007 +0000
@@ -90,18 +90,18 @@ class XendPIF:
 class XendPIF:
     """Representation of a Physical Network Interface."""
     
-    def __init__(self, uuid, name, mtu, vlan, mac, network, host):
+    def __init__(self, uuid, device, mtu, vlan, mac, network, host):
         self.uuid = uuid
-        self.name = name
+        self.device = device
         self.mac = mac
         self.mtu = mtu
         self.vlan = vlan
         self.network = network
         self.host = host
 
-    def set_name(self, new_name):
-        self.name = new_name
-            
+    def set_device(self, new_device):
+        self.device = new_device
+
     def set_mac(self, new_mac):
         success = linux_set_mac(new_mac)
         if success:
@@ -116,14 +116,14 @@ class XendPIF:
 
     def get_io_read_kbs(self):
         from xen.xend.XendNode import instance as xennode
-        return xennode().get_pif_util(self.name)[0]
+        return xennode().get_pif_util(self.device)[0]
 
     def get_io_write_kbs(self):
         from xen.xend.XendNode import instance as xennode
-        return xennode().get_pif_util(self.name)[1]      
+        return xennode().get_pif_util(self.device)[1]      
 
     def get_record(self, transient = True):
-        result = {'name': self.name,
+        result = {'device': self.device,
                   'MAC': self.mac,
                   'MTU': self.mtu,
                   'VLAN': self.vlan,
@@ -143,10 +143,10 @@ class XendPIF:
             # there's nothing we can do -- this should have been set up with
             # the network script.  Otherwise, we can use vconfig to derive
             # a subinterface.
-            if not self.vlan:
+            if self.vlan == -1:
                 return
             
-            rc, _ = _cmd('vconfig add %s %s', self.name, self.vlan)
+            rc, _ = _cmd('vconfig add %s %d', self.device, self.vlan)
             if rc != 0:
                 log.error('Could not refresh %s', ifname)
                 return
@@ -176,9 +176,9 @@ class XendPIF:
 
     def interface_name(self):
         if self.vlan:
-            return '%s.%s' % (self.name, self.vlan)
+            return '%s.%d' % (self.device, self.vlan)
         else:
-            return self.name
+            return self.device
 
 
 def _cmd(cmd, *args):
diff -r ea3c75204555 -r 5e1c7022d4ad tools/python/xen/xm/messages/en/xen-xm.po
--- a/tools/python/xen/xm/messages/en/xen-xm.po Sat Jan 27 18:26:41 2007 +0000
+++ b/tools/python/xen/xm/messages/en/xen-xm.po Sun Jan 28 13:40:07 2007 +0000
@@ -12,14 +12,14 @@
 # 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 Inc.
+# Copyright (c) 2006-2007 XenSource Inc.
 # ============================================================================
 # 
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: Xen-xm 3.0\n"
-"PO-Revision-Date: 2006-12-28 15:43+0000\n"
+"PO-Revision-Date: 2007-01-28 12:59+0000\n"
 "Last-Translator: Ewan Mellor <ewan@xxxxxxxxxxxxx>\n"
 "Language-Team: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>\n"
 "MIME-Version: 1.0\n"
@@ -68,5 +68,11 @@ msgid "NETWORK_ALREADY_CONNECTED"
 msgid "NETWORK_ALREADY_CONNECTED"
 msgstr "The network you specified already has a PIF attached to it, and so 
another one may not be attached."
 
+msgid "PIF_IS_PHYSICAL"
+msgstr "The PIF %(1)s corresponds to a physical interface, and so may not be 
destroyed."
+
+msgid "VLAN_TAG_INVALID"
+msgstr "The VLAN tag you gave (%(1)s) is invalid -- it must be between 0 and 
4095."
+
 msgid "VM_BAD_POWER_STATE"
 msgstr "The VM must be %(2)s to perform the requested operation (it is 
currently %(3)s)."

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.