On 2014年02月26日 02:43, Aline Manera wrote:
From: Aline Manera <alinefm(a)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(a)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(a)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@ADDRESS>\n"
"Language-Team: LANGUAGE <LL(a)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(a)linux.vnet.ibm.com>\n"
"Language-Team: Aline Manera <alinefm(a)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(a)linux.vnet.ibm.com>\n"
"Language-Team: ShaoHe Feng <shaohef(a)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})
I understand this patch as future fool proof of creating a vm from a
deactivated pool.
How about disable the template rather than reject the deactivate?
Because for some storage pools, the connection will down because of
server status, iscsi/nfs
Users will still get errors when using template on these pools.
So when using these template to fork storage, just reject it and mark it
as disabled.
What do you think?
+
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',