[PATCH] Bug fix #309 - network: Unable to create vlan tagged on Ubuntu

Changes: v3: rebase with new model. v2: Put the rollback function above the raise, unless, the line will never run. Ramon Medeiros (1): Bug fix #309 - network: Unable to create vlan tagged on Ubuntu src/kimchi/model/networks.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) -- 1.8.3.1

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): -- 1.8.3.1

Reviewed-by: Aline Manera <alinefm@linux.vnet.ibm.com> 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):

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):

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?
You said that i need to change the remove_vg function too. What function that i have to pass the 0 flag? def _remove_vlan_tagged_bridge(self, network): try: bridge = network.bridgeName() except libvirt.libvirtError: pass else: if bridge.startswith('kimchi-'): conn = self.conn.get() iface = conn.interfaceLookupByName(bridge) if iface.isActive(): iface.destroy() iface.undefine() iface.destroy(0) and iface.undefine(0)?
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):
-- Ramon Nunes Medeiros Software Engineer - Linux Technology Center Brazil IBM Systems & Technology Group Phone : +55 19 2132 7878 ramonn@br.ibm.com

On 02/17/2014 08:55 AM, Ramon Medeiros wrote:
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?
You said that i need to change the remove_vg function too.
What function that i have to pass the 0 flag?
def _remove_vlan_tagged_bridge(self, network): try: bridge = network.bridgeName() except libvirt.libvirtError: pass else: if bridge.startswith('kimchi-'): conn = self.conn.get() iface = conn.interfaceLookupByName(bridge) if iface.isActive(): iface.destroy() iface.undefine()
iface.destroy(0) and iface.undefine(0)?
I don't think it is needed for iface.undedine() but it is true for iface.destroy(0)
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):
participants (2)
-
Aline Manera
-
Ramon Medeiros