[PATCH V2 0/4] vmiface update support

From: ShaoHe Feng <shaohef@linux.vnet.ibm.com> V1 -> V2 add test case for running VM We allow user change the interface from one network to another network when VM is alive. But we only support change the vm configure no matter vm is alive or not. ShaoHe Feng (4): vmiface update support: update API.md vmiface update support: update model. vmiface update support: update mockmodel vmiface update support: update test case docs/API.md | 8 ++++++++ src/kimchi/API.json | 17 +++++++++++++++++ src/kimchi/control/vm/ifaces.py | 1 + src/kimchi/i18n.py | 1 + src/kimchi/mockmodel.py | 12 ++++++++++++ src/kimchi/model/vmifaces.py | 25 +++++++++++++++++++++++++ tests/test_model.py | 20 ++++++++++++++++++++ tests/test_rest.py | 8 ++++++++ 8 files changed, 92 insertions(+) -- 1.9.0

From: ShaoHe Feng <shaohef@linux.vnet.ibm.com> update API.md and API.json Test this patch by: $ curl -u <user>:<password> -H "Content-Type: application/json" \
-H "Accept: application/json" http://localhost:8000/vms/<vmname>/ifaces/<mac> \ -X PUT -d ' { "model":"virtio", "network":"default" }'
Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- docs/API.md | 8 ++++++++ src/kimchi/API.json | 17 +++++++++++++++++ src/kimchi/i18n.py | 1 + 3 files changed, 26 insertions(+) diff --git a/docs/API.md b/docs/API.md index 716c983..8da539d 100644 --- a/docs/API.md +++ b/docs/API.md @@ -220,6 +220,14 @@ A interface represents available network interface on VM. * **DELETE**: detach the network interface from VM +* **PUT**: update the parameters of existing VM interface. + * model *(optional)*: model of emulated network interface card. It will be one of these models: + ne2k_pci, i82551, i82557b, i82559er, rtl8139, e1000, pcnet and virtio. + This change is only on the persisted VM configuration. + * network *(optional)*: the name of resource network, only be available when the + interface type is network. + This change is on the active VM instance and persisted VM configuration. + **Actions (POST):** *No actions defined* diff --git a/src/kimchi/API.json b/src/kimchi/API.json index 3360a9c..9ad8e9d 100644 --- a/src/kimchi/API.json +++ b/src/kimchi/API.json @@ -288,6 +288,23 @@ } } }, + "vmiface_update": { + "type": "object", + "error": "KCHVMIF0008E", + "properties": { + "network": { + "description": "the name of one available network", + "minLength": 1, + "type": "string", + "error": "KCHVMIF0005E" + }, + "model": { + "description": "model of emulated network interface card", + "enum": ["ne2k_pci", "i82551", "i82557b", "i82559er", "rtl8139", "e1000", "pcnet", "virtio", "spapr-vlan"], + "error": "KCHVMIF0006E" + } + } + }, "templates_create": { "type": "object", "error": "KCHTMPL0016E", diff --git a/src/kimchi/i18n.py b/src/kimchi/i18n.py index 89bcd02..b8d8164 100644 --- a/src/kimchi/i18n.py +++ b/src/kimchi/i18n.py @@ -94,6 +94,7 @@ messages = { "KCHVMIF0005E": _("Network name for virtual machine interface must be a string"), "KCHVMIF0006E": _("Invalid network model card specified for virtual machine interface"), "KCHVMIF0007E": _("Specify type and network to add a new virtual machine interface"), + "KCHVMIF0008E": _("Specify type and network to update a virtual machine interface"), "KCHTMPL0001E": _("Template %(name)s already exists"), "KCHTMPL0002E": _("Template %(name)s does not exist"), -- 1.9.0

From: ShaoHe Feng <shaohef@linux.vnet.ibm.com> For network source, change will be on the active VM instance and persisted VM configuration. For model, change will be on the active VM instance only Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- src/kimchi/control/vm/ifaces.py | 1 + src/kimchi/model/vmifaces.py | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/kimchi/control/vm/ifaces.py b/src/kimchi/control/vm/ifaces.py index 874ef54..1b5dc36 100644 --- a/src/kimchi/control/vm/ifaces.py +++ b/src/kimchi/control/vm/ifaces.py @@ -34,6 +34,7 @@ class VMIfaces(Collection): class VMIface(Resource): def __init__(self, model, vm, ident): super(VMIface, self).__init__(model, ident) + self.update_params = ["model", "network"] self.vm = vm self.ident = ident self.info = {} diff --git a/src/kimchi/model/vmifaces.py b/src/kimchi/model/vmifaces.py index 9bf110e..e745114 100644 --- a/src/kimchi/model/vmifaces.py +++ b/src/kimchi/model/vmifaces.py @@ -129,3 +129,28 @@ class VMIfaceModel(object): dom.detachDeviceFlags(etree.tostring(iface), libvirt.VIR_DOMAIN_AFFECT_CURRENT) + + def update(self, vm, mac, params): + dom = VMModel.get_vm(vm, self.conn) + iface = self._get_vmiface(vm, mac) + + if iface is None: + raise NotFoundError("KCHVMIF0001E", {'name': vm, 'iface': mac}) + + # change on the active VM instance and persisted VM configuration. + if iface.attrib['type'] == 'network' and 'network' in params: + iface.source.attrib['network'] = params['network'] + xml = etree.tostring(iface) + conf_flag = (libvirt.VIR_DOMAIN_AFFECT_CONFIG + + libvirt.VIR_DOMAIN_AFFECT_LIVE if dom.isActive() and + dom.isPersistent() else + libvirt.VIR_DOMAIN_AFFECT_CURRENT) + dom.updateDeviceFlags(xml, flags=conf_flag) + + # change on the persisted VM configuration only. + if 'model' in params and dom.isPersistent(): + iface.model.attrib["type"] = params['model'] + xml = etree.tostring(iface) + dom.updateDeviceFlags(xml, flags=libvirt.VIR_DOMAIN_AFFECT_CONFIG) + + return mac -- 1.9.0

From: ShaoHe Feng <shaohef@linux.vnet.ibm.com> update mockmodel Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- src/kimchi/mockmodel.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/kimchi/mockmodel.py b/src/kimchi/mockmodel.py index 866ad2c..e48b278 100644 --- a/src/kimchi/mockmodel.py +++ b/src/kimchi/mockmodel.py @@ -737,6 +737,18 @@ class MockModel(object): except KeyError: raise NotFoundError("KCHVMIF0001E", {'iface': mac, 'name': vm}) + def vmiface_update(self, vm, mac, params): + dom = self._get_vm(vm) + try: + info = dom.ifaces[mac].info + except KeyError: + raise NotFoundError("KCHVMIF0001E", {'iface': mac, 'name': vm}) + if info['type'] == 'network' and 'network' in params: + info['network'] = params['network'] + if 'model' in params: + info['model'] = params['model'] + return mac + def tasks_get_list(self): with self.objstore as session: return session.get_list('task') -- 1.9.0

From: ShaoHe Feng <shaohef@linux.vnet.ibm.com> update test_model.py and test_rest.py Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- tests/test_model.py | 20 ++++++++++++++++++++ tests/test_rest.py | 8 ++++++++ 2 files changed, 28 insertions(+) diff --git a/tests/test_model.py b/tests/test_model.py index 2fb4446..fac4008 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -147,6 +147,8 @@ class ModelTests(unittest.TestCase): 'subnet': '127.0.100.0/24'} inst.networks_create(net_args) rollback.prependDefer(inst.network_delete, net_name) + inst.network_activate(net_name) + rollback.prependDefer(inst.network_deactivate, net_name) ifaces = inst.vmifaces_get_list('kimchi-ifaces') self.assertEquals(1, len(ifaces)) @@ -170,6 +172,24 @@ class ModelTests(unittest.TestCase): self.assertEquals("test-network", iface['network']) self.assertEquals("virtio", iface["model"]) + # update vm interface + iface_args = {"network": "default", + "model": "e1000"} + inst.vmiface_update('kimchi-ifaces', mac, iface_args) + iface = inst.vmiface_lookup('kimchi-ifaces', mac) + self.assertEquals("default", iface['network']) + self.assertEquals("e1000", iface["model"]) + + # update vm interface when vm is running + inst.vm_start("kimchi-ifaces") + rollback.prependDefer(inst.vm_poweroff, 'kimchi-ifaces') + iface_args = {"network": "test-network", + "model": "virtio"} + inst.vmiface_update('kimchi-ifaces', mac, iface_args) + iface = inst.vmiface_lookup('kimchi-ifaces', mac) + self.assertEquals("e1000", iface["model"]) + self.assertEquals("test-network", iface['network']) + @unittest.skipUnless(utils.running_as_root(), 'Must be run as root') def test_vm_cdrom(self): inst = model.Model(objstore_loc=self.tmp_store) diff --git a/tests/test_rest.py b/tests/test_rest.py index 06396db..0d19841 100644 --- a/tests/test_rest.py +++ b/tests/test_rest.py @@ -516,6 +516,14 @@ class RestTests(unittest.TestCase): self.assertEquals('virtio', iface['model']) self.assertEquals('network', iface['type']) + # update vm interface + req = json.dumps({"network": "default", "model": "e1000"}) + resp = self.request('/vms/test-vm/ifaces/%s' % iface['mac'], req, 'PUT') + self.assertEquals(200, resp.status) + update_iface = json.loads(resp.read()) + self.assertEquals('e1000', update_iface['model']) + self.assertEquals('default', update_iface['network']) + # detach network interface from vm resp = self.request('/vms/test-vm/ifaces/%s' % iface['mac'], '{}', 'DELETE') -- 1.9.0

The tests are failing: ====================================================================== ERROR: test_vm_ifaces (test_model.ModelTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/alinefm/kimchi/tests/test_model.py", line 190, in test_vm_ifaces inst.vmiface_update('kimchi-ifaces', mac, iface_args) File "/home/alinefm/kimchi/src/kimchi/model/vmifaces.py", line 148, in update dom.updateDeviceFlags(xml, flags=conf_flag) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/usr/lib/python2.7/dist-packages/libvirt.py", line 1628, in updateDeviceFlags if ret == -1: raise libvirtError ('virDomainUpdateDeviceFlags() failed', dom=self) libvirtError: this function is not supported by the connection driver: cannot modify network device configuration ---------------------------------------------------------------------- Ran 158 tests in 201.711s FAILED (errors=1) [28/Apr/2014:16:58:10] ENGINE Waiting for child threads to terminate... make[3]: *** [check-local] Error 1 make[3]: Leaving directory `/home/alinefm/kimchi/tests' make[2]: *** [check-am] Error 2 make[2]: Leaving directory `/home/alinefm/kimchi/tests' make[1]: *** [check] Error 2 make[1]: Leaving directory `/home/alinefm/kimchi/tests' make: *** [check-recursive] Error 1 On 04/23/2014 11:41 AM, shaohef@linux.vnet.ibm.com wrote:
From: ShaoHe Feng <shaohef@linux.vnet.ibm.com>
V1 -> V2 add test case for running VM
We allow user change the interface from one network to another network when VM is alive.
But we only support change the vm configure no matter vm is alive or not.
ShaoHe Feng (4): vmiface update support: update API.md vmiface update support: update model. vmiface update support: update mockmodel vmiface update support: update test case
docs/API.md | 8 ++++++++ src/kimchi/API.json | 17 +++++++++++++++++ src/kimchi/control/vm/ifaces.py | 1 + src/kimchi/i18n.py | 1 + src/kimchi/mockmodel.py | 12 ++++++++++++ src/kimchi/model/vmifaces.py | 25 +++++++++++++++++++++++++ tests/test_model.py | 20 ++++++++++++++++++++ tests/test_rest.py | 8 ++++++++ 8 files changed, 92 insertions(+)

It works well on host. It should be your libvirt does not support to change the guest from one network to another when guest is living. only high version libvirt supports this feature. But as we discussed last week. we all think this is a good feature for users. So do you agree to probe the libvirt support this feature first. If libvirt supports it, we allow to change the network live and persistent configure. or, we just change the network persistent configure? On 04/29/2014 04:00 AM, Aline Manera wrote:
The tests are failing:
====================================================================== ERROR: test_vm_ifaces (test_model.ModelTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/alinefm/kimchi/tests/test_model.py", line 190, in test_vm_ifaces inst.vmiface_update('kimchi-ifaces', mac, iface_args) File "/home/alinefm/kimchi/src/kimchi/model/vmifaces.py", line 148, in update dom.updateDeviceFlags(xml, flags=conf_flag) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/usr/lib/python2.7/dist-packages/libvirt.py", line 1628, in updateDeviceFlags if ret == -1: raise libvirtError ('virDomainUpdateDeviceFlags() failed', dom=self) libvirtError: this function is not supported by the connection driver: cannot modify network device configuration
---------------------------------------------------------------------- Ran 158 tests in 201.711s
FAILED (errors=1) [28/Apr/2014:16:58:10] ENGINE Waiting for child threads to terminate... make[3]: *** [check-local] Error 1 make[3]: Leaving directory `/home/alinefm/kimchi/tests' make[2]: *** [check-am] Error 2 make[2]: Leaving directory `/home/alinefm/kimchi/tests' make[1]: *** [check] Error 2 make[1]: Leaving directory `/home/alinefm/kimchi/tests' make: *** [check-recursive] Error 1
On 04/23/2014 11:41 AM, shaohef@linux.vnet.ibm.com wrote:
From: ShaoHe Feng <shaohef@linux.vnet.ibm.com>
V1 -> V2 add test case for running VM
We allow user change the interface from one network to another network when VM is alive.
But we only support change the vm configure no matter vm is alive or not.
ShaoHe Feng (4): vmiface update support: update API.md vmiface update support: update model. vmiface update support: update mockmodel vmiface update support: update test case
docs/API.md | 8 ++++++++ src/kimchi/API.json | 17 +++++++++++++++++ src/kimchi/control/vm/ifaces.py | 1 + src/kimchi/i18n.py | 1 + src/kimchi/mockmodel.py | 12 ++++++++++++ src/kimchi/model/vmifaces.py | 25 +++++++++++++++++++++++++ tests/test_model.py | 20 ++++++++++++++++++++ tests/test_rest.py | 8 ++++++++ 8 files changed, 92 insertions(+)
-- Thanks and best regards! Sheldon Feng(冯少合)<shaohef@linux.vnet.ibm.com> IBM Linux Technology Center

or I will first support to change persistent configure. And I will to support a new patch to support to change both live and persistent configure later for high lever libvirt version? On 04/29/2014 11:51 PM, Sheldon wrote:
It works well on host.
It should be your libvirt does not support to change the guest from one network to another when guest is living.
only high version libvirt supports this feature.
But as we discussed last week. we all think this is a good feature for users.
So do you agree to probe the libvirt support this feature first. If libvirt supports it, we allow to change the network live and persistent configure. or, we just change the network persistent configure?
On 04/29/2014 04:00 AM, Aline Manera wrote:
The tests are failing:
====================================================================== ERROR: test_vm_ifaces (test_model.ModelTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/alinefm/kimchi/tests/test_model.py", line 190, in test_vm_ifaces inst.vmiface_update('kimchi-ifaces', mac, iface_args) File "/home/alinefm/kimchi/src/kimchi/model/vmifaces.py", line 148, in update dom.updateDeviceFlags(xml, flags=conf_flag) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/home/alinefm/kimchi/src/kimchi/model/libvirtconnection.py", line 62, in wrapper ret = f(*args, **kwargs) File "/usr/lib/python2.7/dist-packages/libvirt.py", line 1628, in updateDeviceFlags if ret == -1: raise libvirtError ('virDomainUpdateDeviceFlags() failed', dom=self) libvirtError: this function is not supported by the connection driver: cannot modify network device configuration
---------------------------------------------------------------------- Ran 158 tests in 201.711s
FAILED (errors=1) [28/Apr/2014:16:58:10] ENGINE Waiting for child threads to terminate... make[3]: *** [check-local] Error 1 make[3]: Leaving directory `/home/alinefm/kimchi/tests' make[2]: *** [check-am] Error 2 make[2]: Leaving directory `/home/alinefm/kimchi/tests' make[1]: *** [check] Error 2 make[1]: Leaving directory `/home/alinefm/kimchi/tests' make: *** [check-recursive] Error 1
On 04/23/2014 11:41 AM, shaohef@linux.vnet.ibm.com wrote:
From: ShaoHe Feng <shaohef@linux.vnet.ibm.com>
V1 -> V2 add test case for running VM
We allow user change the interface from one network to another network when VM is alive.
But we only support change the vm configure no matter vm is alive or not.
ShaoHe Feng (4): vmiface update support: update API.md vmiface update support: update model. vmiface update support: update mockmodel vmiface update support: update test case
docs/API.md | 8 ++++++++ src/kimchi/API.json | 17 +++++++++++++++++ src/kimchi/control/vm/ifaces.py | 1 + src/kimchi/i18n.py | 1 + src/kimchi/mockmodel.py | 12 ++++++++++++ src/kimchi/model/vmifaces.py | 25 +++++++++++++++++++++++++ tests/test_model.py | 20 ++++++++++++++++++++ tests/test_rest.py | 8 ++++++++ 8 files changed, 92 insertions(+)
-- Thanks and best regards! Sheldon Feng(冯少合)<shaohef@linux.vnet.ibm.com> IBM Linux Technology Center
participants (3)
-
Aline Manera
-
shaohef@linux.vnet.ibm.com
-
Sheldon