[Kimchi-devel] [PATCH] issue #242: Do not allow user deactivate/delete storage pool used by a template
Aline Manera
alinefm at linux.vnet.ibm.com
Tue Feb 25 18:43:13 UTC 2014
From: Aline Manera <alinefm at br.ibm.com>
Make a integrity verification when user try to deactivate or delete a pool.
If pool is used by a template it should not be deactivated or deleted to
avoid problems while using the template.
Also update the po files as new messages are added to alert the user.
Signed-off-by: Aline Manera <alinefm at br.ibm.com>
---
po/en_US.po | 66 +++++++++++++++++++++++++++-----------
po/kimchi.pot | 57 ++++++++++++++++++++++++--------
po/pt_BR.po | 66 +++++++++++++++++++++++++++-----------
po/zh_CN.po | 65 ++++++++++++++++++++++++++-----------
src/kimchi/i18n.py | 2 ++
src/kimchi/model/storagepools.py | 21 ++++++++++--
tests/test_model.py | 5 +++
7 files changed, 210 insertions(+), 72 deletions(-)
diff --git a/po/en_US.po b/po/en_US.po
index ca1fe86..aeff16e 100644
--- a/po/en_US.po
+++ b/po/en_US.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: kimchi 0.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-20 15:26-0300\n"
+"POT-Creation-Date: 2014-02-25 15:23-0300\n"
"PO-Revision-Date: 2013-07-11 17:32-0400\n"
"Last-Translator: Crístian Viana <vianac at linux.vnet.ibm.com>\n"
"Language-Team: English\n"
@@ -85,18 +85,21 @@ msgstr "Cancel"
msgid "Save"
msgstr "Save"
-msgid "Reset"
-msgstr "Reset"
-
msgid "Start"
msgstr "Start"
+msgid "Reset"
+msgstr "Reset"
+
msgid "Stop"
msgstr "Stop"
msgid "Actions"
msgstr "Actions"
+msgid "Console"
+msgstr ""
+
msgid "Edit"
msgstr "Edit"
@@ -237,6 +240,9 @@ msgstr "Remove"
msgid "Download"
msgstr "Download"
+msgid "Report name should contain only letters, digits and/or hyphen ('-')."
+msgstr ""
+
msgid ""
"This will delete the virtual machine and its virtual disks. This operation "
"cannot be undone. Would you like to continue?"
@@ -299,12 +305,12 @@ msgstr "Server name can not be blank."
msgid "This is not a valid Server Name or IP. please, modify it."
msgstr "This is not a valid Server Name or IP. please, modify it."
-msgid "Log out"
-msgstr "Log out"
-
msgid "Help"
msgstr ""
+msgid "Log out"
+msgstr "Log out"
+
msgid "Log In"
msgstr "Log In"
@@ -322,12 +328,8 @@ msgstr "Report Name"
msgid ""
"The name used to identify the report. If omitted, a name will be chosen "
-"based on current time. Name can contain: letters, digits, \"-\", \"_\", or "
-"\".\"."
+"based on current time. Name can contain: letters, digits and hyphen (\"-\")."
msgstr ""
-"The name used to identify the report. If omitted, a name will be chosen "
-"based on current time. Name can contain: letters, digits, \"-\", \"_\", or "
-"\".\"."
msgid "Define a New Storage Pool"
msgstr "Define a New Storage Pool"
@@ -400,12 +402,12 @@ msgstr "iSCSI Authentication"
msgid "CPU"
msgstr "CPU"
-msgid "Network I/O"
-msgstr "Network I/O"
-
msgid "Disk I/O"
msgstr "Disk I/O"
+msgid "Network I/O"
+msgstr "Network I/O"
+
msgid "Livetile"
msgstr "Livetile"
@@ -741,6 +743,10 @@ msgid ""
msgstr ""
#, python-format
+msgid "Unable to start virtual machine %(name)s. Details: %(err)s"
+msgstr ""
+
+#, python-format
msgid "Interface %(iface)s does not exist in virtual machine %(name)s"
msgstr ""
@@ -936,6 +942,18 @@ msgstr ""
msgid "The SCSI host adapter name must be a string."
msgstr ""
+msgid "The storage pool kimchi_isos is reserved for internal use"
+msgstr ""
+
+#, python-format
+msgid ""
+"Unable to deactivate pool %(name)s as it is associated with some templates"
+msgstr ""
+
+#, python-format
+msgid "Unable to delete pool %(name)s as it is associated with some templates"
+msgstr ""
+
#, python-format
msgid "Storage volume %(name)s already exists"
msgstr ""
@@ -1081,6 +1099,13 @@ msgstr ""
msgid "Unable to generate debug report %(name)s. Details: %(err)s"
msgstr ""
+msgid "You should give a name for the debug file report."
+msgstr ""
+
+msgid ""
+"Name should be a string. Only letters, digits and hyphen ('-') are allowed."
+msgstr ""
+
#, python-format
msgid "Storage server %(server)s was not used by Kimchi"
msgstr ""
@@ -1139,16 +1164,13 @@ msgid "Invalid storage type. Types supported: 'cdrom'"
msgstr ""
#, python-format
-msgid "The path %(value)s is not valid local/remote path for the device"
+msgid "The path '%(value)s' is not valid local/remote path for the device"
msgstr ""
#, python-format
msgid "Device name %(dev_name)s already exists in vm %(vm_name)s"
msgstr ""
-msgid "Must specify a device name"
-msgstr ""
-
msgid "Can't specify a directory for a CDROM device path"
msgstr ""
@@ -1171,6 +1193,12 @@ msgstr ""
msgid "Do not support guest CDROM hot plug attachment"
msgstr ""
+msgid "Specify type and path to add a new virtual machine disk"
+msgstr ""
+
+msgid "Specify path to update virtual machine disk"
+msgstr ""
+
msgid "Repository ID must be one word only string."
msgstr ""
diff --git a/po/kimchi.pot b/po/kimchi.pot
index a906ad9..abb7219 100755
--- a/po/kimchi.pot
+++ b/po/kimchi.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-20 15:26-0300\n"
+"POT-Creation-Date: 2014-02-25 15:23-0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
"Language-Team: LANGUAGE <LL at li.org>\n"
@@ -85,10 +85,10 @@ msgstr ""
msgid "Save"
msgstr ""
-msgid "Reset"
+msgid "Start"
msgstr ""
-msgid "Start"
+msgid "Reset"
msgstr ""
msgid "Stop"
@@ -97,6 +97,9 @@ msgstr ""
msgid "Actions"
msgstr ""
+msgid "Console"
+msgstr ""
+
msgid "Edit"
msgstr ""
@@ -233,6 +236,9 @@ msgstr ""
msgid "Download"
msgstr ""
+msgid "Report name should contain only letters, digits and/or hyphen ('-')."
+msgstr ""
+
msgid ""
"This will delete the virtual machine and its virtual disks. This operation "
"cannot be undone. Would you like to continue?"
@@ -291,10 +297,10 @@ msgstr ""
msgid "This is not a valid Server Name or IP. please, modify it."
msgstr ""
-msgid "Log out"
+msgid "Help"
msgstr ""
-msgid "Help"
+msgid "Log out"
msgstr ""
msgid "Log In"
@@ -314,8 +320,7 @@ msgstr ""
msgid ""
"The name used to identify the report. If omitted, a name will be chosen "
-"based on current time. Name can contain: letters, digits, \"-\", \"_\", or "
-"\".\"."
+"based on current time. Name can contain: letters, digits and hyphen (\"-\")."
msgstr ""
msgid "Define a New Storage Pool"
@@ -385,10 +390,10 @@ msgstr ""
msgid "CPU"
msgstr ""
-msgid "Network I/O"
+msgid "Disk I/O"
msgstr ""
-msgid "Disk I/O"
+msgid "Network I/O"
msgstr ""
msgid "Livetile"
@@ -726,6 +731,10 @@ msgid ""
msgstr ""
#, python-format
+msgid "Unable to start virtual machine %(name)s. Details: %(err)s"
+msgstr ""
+
+#, python-format
msgid "Interface %(iface)s does not exist in virtual machine %(name)s"
msgstr ""
@@ -921,6 +930,18 @@ msgstr ""
msgid "The SCSI host adapter name must be a string."
msgstr ""
+msgid "The storage pool kimchi_isos is reserved for internal use"
+msgstr ""
+
+#, python-format
+msgid ""
+"Unable to deactivate pool %(name)s as it is associated with some templates"
+msgstr ""
+
+#, python-format
+msgid "Unable to delete pool %(name)s as it is associated with some templates"
+msgstr ""
+
#, python-format
msgid "Storage volume %(name)s already exists"
msgstr ""
@@ -1066,6 +1087,13 @@ msgstr ""
msgid "Unable to generate debug report %(name)s. Details: %(err)s"
msgstr ""
+msgid "You should give a name for the debug file report."
+msgstr ""
+
+msgid ""
+"Name should be a string. Only letters, digits and hyphen ('-') are allowed."
+msgstr ""
+
#, python-format
msgid "Storage server %(server)s was not used by Kimchi"
msgstr ""
@@ -1124,16 +1152,13 @@ msgid "Invalid storage type. Types supported: 'cdrom'"
msgstr ""
#, python-format
-msgid "The path %(value)s is not valid local/remote path for the device"
+msgid "The path '%(value)s' is not valid local/remote path for the device"
msgstr ""
#, python-format
msgid "Device name %(dev_name)s already exists in vm %(vm_name)s"
msgstr ""
-msgid "Must specify a device name"
-msgstr ""
-
msgid "Can't specify a directory for a CDROM device path"
msgstr ""
@@ -1156,6 +1181,12 @@ msgstr ""
msgid "Do not support guest CDROM hot plug attachment"
msgstr ""
+msgid "Specify type and path to add a new virtual machine disk"
+msgstr ""
+
+msgid "Specify path to update virtual machine disk"
+msgstr ""
+
msgid "Repository ID must be one word only string."
msgstr ""
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 715e072..db7c579 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: kimchi 1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-20 15:26-0300\n"
+"POT-Creation-Date: 2014-02-25 15:23-0300\n"
"PO-Revision-Date: 2013-06-27 10:48+0000\n"
"Last-Translator: Crístian Viana <vianac at linux.vnet.ibm.com>\n"
"Language-Team: Aline Manera <alinefm at br.ibm.com>\n"
@@ -101,18 +101,21 @@ msgstr "Cancelar"
msgid "Save"
msgstr "Salvar"
-msgid "Reset"
-msgstr "Reiniciar"
-
msgid "Start"
msgstr "Iniciar"
+msgid "Reset"
+msgstr "Reiniciar"
+
msgid "Stop"
msgstr "Parar"
msgid "Actions"
msgstr "Ações"
+msgid "Console"
+msgstr ""
+
msgid "Edit"
msgstr "Editar"
@@ -255,6 +258,9 @@ msgstr "Remover"
msgid "Download"
msgstr "Baixar"
+msgid "Report name should contain only letters, digits and/or hyphen ('-')."
+msgstr ""
+
msgid ""
"This will delete the virtual machine and its virtual disks. This operation "
"cannot be undone. Would you like to continue?"
@@ -317,12 +323,12 @@ msgstr ""
msgid "This is not a valid Server Name or IP. please, modify it."
msgstr ""
-msgid "Log out"
-msgstr "Sair"
-
msgid "Help"
msgstr ""
+msgid "Log out"
+msgstr "Sair"
+
msgid "Log In"
msgstr "Entrar"
@@ -340,12 +346,8 @@ msgstr "Nome do Relatório"
msgid ""
"The name used to identify the report. If omitted, a name will be chosen "
-"based on current time. Name can contain: letters, digits, \"-\", \"_\", or "
-"\".\"."
+"based on current time. Name can contain: letters, digits and hyphen (\"-\")."
msgstr ""
-"O nome usado para identificar o relatório. Se omitido, o nome será escolhido "
-"baseado no horário. O nome pode conter: letras, números, \"-\", \"_\", ou \"."
-"\"."
msgid "Define a New Storage Pool"
msgstr "Definir novo Storage Pool"
@@ -415,12 +417,12 @@ msgstr ""
msgid "CPU"
msgstr "CPU"
-msgid "Network I/O"
-msgstr "Rede E/S"
-
msgid "Disk I/O"
msgstr "Disco E/S"
+msgid "Network I/O"
+msgstr "Rede E/S"
+
msgid "Livetile"
msgstr "Tela ao vivo"
@@ -756,6 +758,10 @@ msgid ""
msgstr ""
#, python-format
+msgid "Unable to start virtual machine %(name)s. Details: %(err)s"
+msgstr ""
+
+#, python-format
msgid "Interface %(iface)s does not exist in virtual machine %(name)s"
msgstr ""
@@ -951,6 +957,18 @@ msgstr ""
msgid "The SCSI host adapter name must be a string."
msgstr ""
+msgid "The storage pool kimchi_isos is reserved for internal use"
+msgstr ""
+
+#, python-format
+msgid ""
+"Unable to deactivate pool %(name)s as it is associated with some templates"
+msgstr ""
+
+#, python-format
+msgid "Unable to delete pool %(name)s as it is associated with some templates"
+msgstr ""
+
#, python-format
msgid "Storage volume %(name)s already exists"
msgstr ""
@@ -1096,6 +1114,13 @@ msgstr ""
msgid "Unable to generate debug report %(name)s. Details: %(err)s"
msgstr ""
+msgid "You should give a name for the debug file report."
+msgstr ""
+
+msgid ""
+"Name should be a string. Only letters, digits and hyphen ('-') are allowed."
+msgstr ""
+
#, python-format
msgid "Storage server %(server)s was not used by Kimchi"
msgstr ""
@@ -1154,16 +1179,13 @@ msgid "Invalid storage type. Types supported: 'cdrom'"
msgstr ""
#, python-format
-msgid "The path %(value)s is not valid local/remote path for the device"
+msgid "The path '%(value)s' is not valid local/remote path for the device"
msgstr ""
#, python-format
msgid "Device name %(dev_name)s already exists in vm %(vm_name)s"
msgstr ""
-msgid "Must specify a device name"
-msgstr ""
-
msgid "Can't specify a directory for a CDROM device path"
msgstr ""
@@ -1186,6 +1208,12 @@ msgstr ""
msgid "Do not support guest CDROM hot plug attachment"
msgstr ""
+msgid "Specify type and path to add a new virtual machine disk"
+msgstr ""
+
+msgid "Specify path to update virtual machine disk"
+msgstr ""
+
msgid "Repository ID must be one word only string."
msgstr ""
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 546ccef..0439b04 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: kimchi 0.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-20 15:26-0300\n"
+"POT-Creation-Date: 2014-02-25 15:23-0300\n"
"PO-Revision-Date: 2013-06-27 10:48+0000\n"
"Last-Translator: ShaoHe Feng <shaohef at linux.vnet.ibm.com>\n"
"Language-Team: ShaoHe Feng <shaohef at linux.vnet.ibm.com>\n"
@@ -101,18 +101,21 @@ msgstr "取消"
msgid "Save"
msgstr "保存"
-msgid "Reset"
-msgstr "重置"
-
msgid "Start"
msgstr "启用"
+msgid "Reset"
+msgstr "重置"
+
msgid "Stop"
msgstr "停止"
msgid "Actions"
msgstr "操作"
+msgid "Console"
+msgstr ""
+
msgid "Edit"
msgstr "编辑"
@@ -249,6 +252,9 @@ msgstr "删除"
msgid "Download"
msgstr "下载"
+msgid "Report name should contain only letters, digits and/or hyphen ('-')."
+msgstr ""
+
msgid ""
"This will delete the virtual machine and its virtual disks. This operation "
"cannot be undone. Would you like to continue?"
@@ -307,12 +313,12 @@ msgstr "服务器不能为空"
msgid "This is not a valid Server Name or IP. please, modify it."
msgstr "这不是一个有效的服务器名或IP,请修改"
-msgid "Log out"
-msgstr "登出"
-
msgid "Help"
msgstr ""
+msgid "Log out"
+msgstr "登出"
+
msgid "Log In"
msgstr "登录"
@@ -330,11 +336,8 @@ msgstr "诊断报告名"
msgid ""
"The name used to identify the report. If omitted, a name will be chosen "
-"based on current time. Name can contain: letters, digits, \"-\", \"_\", or "
-"\".\"."
+"based on current time. Name can contain: letters, digits and hyphen (\"-\")."
msgstr ""
-"该名称用来唯一标识报告,如果不指定,将会基于当前时间自动生成一个名称。名称可"
-"以包含: 字母、数字、\"-\"、\"_\" 或者 \".\""
msgid "Define a New Storage Pool"
msgstr "定义一个新的存储池"
@@ -403,12 +406,12 @@ msgstr "iSCSI认证"
msgid "CPU"
msgstr "处理器"
-msgid "Network I/O"
-msgstr "网络I/O"
-
msgid "Disk I/O"
msgstr "磁盘I/O"
+msgid "Network I/O"
+msgstr "网络I/O"
+
msgid "Livetile"
msgstr "屏幕"
@@ -744,6 +747,10 @@ msgid ""
msgstr ""
#, python-format
+msgid "Unable to start virtual machine %(name)s. Details: %(err)s"
+msgstr ""
+
+#, python-format
msgid "Interface %(iface)s does not exist in virtual machine %(name)s"
msgstr ""
@@ -939,6 +946,18 @@ msgstr ""
msgid "The SCSI host adapter name must be a string."
msgstr ""
+msgid "The storage pool kimchi_isos is reserved for internal use"
+msgstr ""
+
+#, python-format
+msgid ""
+"Unable to deactivate pool %(name)s as it is associated with some templates"
+msgstr ""
+
+#, python-format
+msgid "Unable to delete pool %(name)s as it is associated with some templates"
+msgstr ""
+
#, python-format
msgid "Storage volume %(name)s already exists"
msgstr ""
@@ -1084,6 +1103,13 @@ msgstr ""
msgid "Unable to generate debug report %(name)s. Details: %(err)s"
msgstr ""
+msgid "You should give a name for the debug file report."
+msgstr ""
+
+msgid ""
+"Name should be a string. Only letters, digits and hyphen ('-') are allowed."
+msgstr ""
+
#, python-format
msgid "Storage server %(server)s was not used by Kimchi"
msgstr ""
@@ -1142,16 +1168,13 @@ msgid "Invalid storage type. Types supported: 'cdrom'"
msgstr ""
#, python-format
-msgid "The path %(value)s is not valid local/remote path for the device"
+msgid "The path '%(value)s' is not valid local/remote path for the device"
msgstr ""
#, python-format
msgid "Device name %(dev_name)s already exists in vm %(vm_name)s"
msgstr ""
-msgid "Must specify a device name"
-msgstr ""
-
msgid "Can't specify a directory for a CDROM device path"
msgstr ""
@@ -1174,6 +1197,12 @@ msgstr ""
msgid "Do not support guest CDROM hot plug attachment"
msgstr ""
+msgid "Specify type and path to add a new virtual machine disk"
+msgstr ""
+
+msgid "Specify path to update virtual machine disk"
+msgstr ""
+
msgid "Repository ID must be one word only string."
msgstr ""
diff --git a/src/kimchi/i18n.py b/src/kimchi/i18n.py
index fea0184..f766383 100644
--- a/src/kimchi/i18n.py
+++ b/src/kimchi/i18n.py
@@ -135,6 +135,8 @@ messages = {
"KCHPOOL0029E": _("The parameter disks only can be updated for logical storage pool."),
"KCHPOOL0030E": _("The SCSI host adapter name must be a string."),
"KCHPOOL0031E": _("The storage pool kimchi_isos is reserved for internal use"),
+ "KCHPOOL0032E": _("Unable to deactivate pool %(name)s as it is associated with some templates"),
+ "KCHPOOL0033E": _("Unable to delete pool %(name)s as it is associated with some templates"),
"KCHVOL0001E": _("Storage volume %(name)s already exists"),
"KCHVOL0002E": _("Storage volume %(name)s does not exist in storage pool %(pool)s"),
diff --git a/src/kimchi/model/storagepools.py b/src/kimchi/model/storagepools.py
index 011feb0..d4a6ee8 100644
--- a/src/kimchi/model/storagepools.py
+++ b/src/kimchi/model/storagepools.py
@@ -29,8 +29,7 @@ from kimchi.exception import NotFoundError, OperationFailed
from kimchi.model.config import CapabilitiesModel
from kimchi.model.host import DeviceModel
from kimchi.model.libvirtstoragepool import StoragePoolDef
-from kimchi.utils import add_task, kimchi_log
-from kimchi.utils import run_command
+from kimchi.utils import add_task, kimchi_log, pool_name_from_uri, run_command
ISO_POOL_NAME = u'kimchi_isos'
@@ -190,7 +189,7 @@ class StoragePoolModel(object):
elif len(res) == 0:
source[key] = ""
else:
- souce[key] = res
+ source[key] = res
return source
@@ -273,7 +272,20 @@ class StoragePoolModel(object):
raise OperationFailed("KCHPOOL0009E",
{'name': name, 'err': e.get_error_message()})
+ def _pool_used_by_template(self, pool_name):
+ with self.objstore as session:
+ templates = session.get_list('template')
+ for tmpl in templates:
+ t_info = session.get('template', tmpl)
+ t_pool = pool_name_from_uri(t_info['storagepool'])
+ if t_pool == pool_name:
+ return True
+ return False
+
def deactivate(self, name):
+ if self._pool_used_by_template(name):
+ raise InvalidOperation('KCHPOOL0032E', {'name': name})
+
pool = self.get_storagepool(name, self.conn)
try:
pool.destroy()
@@ -282,6 +294,9 @@ class StoragePoolModel(object):
{'name': name, 'err': e.get_error_message()})
def delete(self, name):
+ if self._pool_used_by_template(name):
+ raise InvalidOperation('KCHPOOL0033E', {'name': name})
+
pool = self.get_storagepool(name, self.conn)
if pool.isActive():
raise InvalidOperation("KCHPOOL0005E", {'name': name})
diff --git a/tests/test_model.py b/tests/test_model.py
index 74e2424..7cf2f08 100644
--- a/tests/test_model.py
+++ b/tests/test_model.py
@@ -406,6 +406,11 @@ class ModelTests(unittest.TestCase):
disk_path = '/tmp/kimchi-images/%s-0.img' % vm_info['uuid']
self.assertTrue(os.access(disk_path, os.F_OK))
+ # reset template to default storage pool
+ # so we can remove the storage pool created 'test-pool'
+ params = {'storagepool': '/storagepools/default'}
+ inst.template_update('test', params)
+
@unittest.skipUnless(utils.running_as_root(), 'Must be run as root')
def test_template_create(self):
inst = model.Model('test:///default',
--
1.7.10.4
More information about the Kimchi-devel
mailing list