[Kimchi-devel] [PATCH] [Kimchi 6/6] Improve logic to identify if a network is in use or not
Aline Manera
alinefm at linux.vnet.ibm.com
Tue Feb 7 18:35:16 UTC 2017
The function get_vms_attach_to_a_network() to identify which virtual
machines are using a given network was being called multiple times
without need. So improve the logic.
Signed-off-by: Aline Manera <alinefm at linux.vnet.ibm.com>
---
i18n.py | 4 ++--
model/networks.py | 42 ++++++++++++++++++++++++++----------------
2 files changed, 28 insertions(+), 18 deletions(-)
diff --git a/i18n.py b/i18n.py
index f505693..4460ce5 100644
--- a/i18n.py
+++ b/i18n.py
@@ -300,8 +300,8 @@ messages = {
"KCHNET0014E": _("Network interfaces must be an array."),
"KCHNET0015E": _("Network VLAN ID must be an integer between 1 and 4094"),
"KCHNET0016E": _("Specify name and type to create a Network"),
- "KCHNET0017E": _("Unable to delete or update network %(name)s. There are some virtual machines %(vms)s and/or templates linked to this network."),
- "KCHNET0018E": _("Unable to deactivate network %(name)s. There are some virtual machines %(vms)s and/or templates linked to this network."),
+ "KCHNET0017E": _("Unable to delete or update network %(name)s as it is linked to some virtual machines (%(vms)s) and/or templates (%(tmpls)s)."),
+ "KCHNET0018E": _("Unable to deactivate network %(name)s as it is linked to are some virtual machines (%(vms)s) and/or templates (%(tmpls)s)."),
"KCHNET0019E": _("Bridge device %(name)s can not be the trunk device of a VLAN."),
"KCHNET0020E": _("Failed to activate interface %(iface)s: %(err)s."),
"KCHNET0021E": _("Failed to activate interface %(iface)s. Please check the physical link status."),
diff --git a/model/networks.py b/model/networks.py
index be4eec2..eb1590e 100644
--- a/model/networks.py
+++ b/model/networks.py
@@ -1,7 +1,7 @@
#
# Project Kimchi
#
-# Copyright IBM Corp, 2015-2016
+# Copyright IBM Corp, 2015-2017
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -383,12 +383,14 @@ class NetworkModel(object):
else:
interfaces = [interface]
+ network_in_use, used_by_vms, _ = self._is_network_in_use(name)
+
return {'connection': connection,
'interfaces': interfaces,
'subnet': subnet,
'dhcp': dhcp,
- 'vms': self._get_vms_attach_to_a_network(name),
- 'in_use': self._is_network_in_use(name),
+ 'vms': used_by_vms,
+ 'in_use': network_in_use,
'autostart': network.autostart() == 1,
'state': network.isActive() and "active" or "inactive",
'persistent': True if network.isPersistent() else False}
@@ -397,20 +399,24 @@ class NetworkModel(object):
# All the networks listed as default in template.conf file should not
# be deactivate or deleted. Otherwise, we will allow user create
# inconsistent templates from scratch
+ vms = self._get_vms_attach_to_a_network(name)
+ tmpls = self._is_network_used_by_template(name)
+
if name in tmpl_defaults['networks']:
- return True
+ return (True, vms, tmpls)
- vms = self._get_vms_attach_to_a_network(name)
- return bool(vms) or self._is_network_used_by_template(name)
+ return (bool(vms) or bool(tmpls), vms, tmpls)
def _is_network_used_by_template(self, network):
+ tmpl_list = []
+
with self.objstore as session:
templates = session.get_list('template')
for tmpl in templates:
tmpl_net = session.get('template', tmpl)['networks']
if network in tmpl_net:
- return True
- return False
+ tmpl_list.append(tmpl)
+ return tmpl_list
def _get_vms_attach_to_a_network(self, network, filter="all"):
DOM_STATE_MAP = {'nostate': 0, 'running': 1, 'blocked': 2,
@@ -440,21 +446,25 @@ class NetworkModel(object):
'err': e.message})
def deactivate(self, name):
- if self._is_network_in_use(name):
- vms = self._get_vms_attach_to_a_network(name)
- vms.sort()
+ in_use, used_by_vms, used_by_tmpls = self._is_network_in_use(name)
+ vms = 'N/A' if len(used_by_vms) == 0 else ', '.join(used_by_vms)
+ tmpls = 'N/A' if len(used_by_tmpls) == 0 else ', '.join(used_by_tmpls)
+ if in_use:
raise InvalidOperation("KCHNET0018E", {'name': name,
- 'vms': ', '.join(vms)})
+ 'vms': vms,
+ 'tmpls': tmpls})
network = self.get_network(self.conn.get(), name)
network.destroy()
def delete(self, name):
- if self._is_network_in_use(name):
- vms = self._get_vms_attach_to_a_network(name)
- vms.sort()
+ in_use, used_by_vms, used_by_tmpls = self._is_network_in_use(name)
+ vms = 'N/A' if len(used_by_vms) == 0 else ', '.join(used_by_vms)
+ tmpls = 'N/A' if len(used_by_tmpls) == 0 else ', '.join(used_by_tmpls)
+ if in_use:
raise InvalidOperation("KCHNET0017E", {'name': name,
- 'vms': ', '.join(vms)})
+ 'vms': vms,
+ 'tmpls': tmpls})
network = self.get_network(self.conn.get(), name)
if network.isActive():
--
2.9.3
More information about the Kimchi-devel
mailing list