Even with this patch I am unable to create a vlan tagged bridge on
      Ubuntu.
      
      The errors I got:
      
      [12/Feb/2014:15:28:34] HTTP Traceback (most recent call last):
        File "/usr/lib/python2.7/dist-packages/cherrypy/_cprequest.py",
      line 656, in respond
          response.body = self.handler()
        File
      "/usr/lib/python2.7/dist-packages/cherrypy/lib/encoding.py", line
      188, in __call__
          self.body = self.oldhandler(*args, **kwargs)
        File "/usr/lib/python2.7/dist-packages/cherrypy/_cpdispatch.py",
      line 34, in __call__
          return self.callable(*self.args, **self.kwargs)
        File "/home/alinefm/kimchi/src/kimchi/control/base.py", line
      277, in index
          return self.create(parse_request(), *args)
        File "/home/alinefm/kimchi/src/kimchi/control/base.py", line
      211, in create
          name = create(*args)
        File "/home/alinefm/kimchi/src/kimchi/model/networks.py", line
      56, in create
          self._set_network_bridge(params)
        File "/home/alinefm/kimchi/src/kimchi/model/networks.py", line
      119, in _set_network_bridge
          str(params['vlan_id']))
        File "/home/alinefm/kimchi/src/kimchi/model/networks.py", line
      147, in _create_vlan_tagged_bridge
          vlan_tagged_br = conn.interfaceDefineXML(br_xml)
        File
      "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line
      65, in wrapper
          ret = f(*args, **kwargs)
      TypeError: interfaceDefineXML() takes exactly 3 arguments (2
      given)
      
      [12/Feb/2014:15:30:42] HTTP Traceback (most recent call last):
        File "/usr/lib/python2.7/dist-packages/cherrypy/_cprequest.py",
      line 656, in respond
          response.body = self.handler()
        File
      "/usr/lib/python2.7/dist-packages/cherrypy/lib/encoding.py", line
      188, in __call__
          self.body = self.oldhandler(*args, **kwargs)
        File "/usr/lib/python2.7/dist-packages/cherrypy/_cpdispatch.py",
      line 34, in __call__
          return self.callable(*self.args, **self.kwargs)
        File "/home/alinefm/kimchi/src/kimchi/control/base.py", line
      277, in index
          return self.create(parse_request(), *args)
        File "/home/alinefm/kimchi/src/kimchi/control/base.py", line
      211, in create
          name = create(*args)
        File "/home/alinefm/kimchi/src/kimchi/model/networks.py", line
      56, in create
          self._set_network_bridge(params)
        File "/home/alinefm/kimchi/src/kimchi/model/networks.py", line
      119, in _set_network_bridge
          str(params['vlan_id']))
        File "/home/alinefm/kimchi/src/kimchi/model/networks.py", line
      148, in _create_vlan_tagged_bridge
          vlan_tagged_br.create()
        File
      "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line
      65, in wrapper
          ret = f(*args, **kwargs)
      TypeError: create() takes exactly 2 arguments (1 given)
      
      They are because, libvirt has not a default value for flags.
      We should use: 
      conn.interfaceDefineXML(br_xml, 0) and vlan_tagged_br.create(0)
      
      Ramon, could you include those fix in this patch?
      
      
      
      
      On 02/11/2014 11:34 AM, Ramon Medeiros wrote:
    
    
      Python binding for libvirt does not support conn.changeBegin() and
conn.commit(). To make the change safe, this procedure was changed to a
internal framework: RollbackContext.
Signed-off-by: Ramon Medeiros <ramonn@linux.vnet.ibm.com>
---
 src/kimchi/model/networks.py | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/src/kimchi/model/networks.py b/src/kimchi/model/networks.py
index b164141..d577154 100644
--- a/src/kimchi/model/networks.py
+++ b/src/kimchi/model/networks.py
@@ -29,7 +29,7 @@ from kimchi import networkxml
 from kimchi import xmlutils
 from kimchi.exception import InvalidOperation, InvalidParameter
 from kimchi.exception import MissingParameter, NotFoundError, OperationFailed
-
+from kimchi.rollbackcontext import RollbackContext
 class NetworksModel(object):
     def __init__(self, **kargs):
@@ -138,17 +138,17 @@ class NetworksModel(object):
         br_xml = networkxml.create_vlan_tagged_bridge_xml(br_name, interface,
                                                           vlan_id)
         conn = self.conn.get()
-        conn.changeBegin()
-        try:
-            vlan_tagged_br = conn.interfaceDefineXML(br_xml)
-            vlan_tagged_br.create()
-        except libvirt.libvirtError as e:
-            conn.changeRollback()
-            raise OperationFailed(e.message)
-        else:
-            conn.changeCommit()
-            return br_name
+        with RollbackContext() as rollback:
+
+            try:
+                vlan_tagged_br = conn.interfaceDefineXML(br_xml)
+                vlan_tagged_br.create()
+            except libvirt.libvirtError as e:
+                rollback.prependDefer(vlan_tagged_br.destroy)
+                raise OperationFailed(e.message)
+            else:
+                return br_name
 class NetworkModel(object):
     def __init__(self, **kargs):