On 04/15/2016 05:48 PM, Jose Ricardo Ziviani wrote:
- This commit changes the way the template update works. Now, it
really updates the existing template instead of creating a new
one (and deleting the old one)
Signed-off-by: Jose Ricardo Ziviani <joserz(a)linux.vnet.ibm.com>
---
i18n.py | 3 +++
model/templates.py | 70 ++++++++++++++++++++++++++++++++------------------
tests/test_template.py | 6 ++++-
3 files changed, 53 insertions(+), 26 deletions(-)
diff --git a/i18n.py b/i18n.py
index 7cce796..e4656cb 100644
--- a/i18n.py
+++ b/i18n.py
@@ -155,8 +155,10 @@ messages = {
"KCHVMIF0011E": _("Cannot change MAC address of a running virtual
machine"),
"KCHTMPL0001E": _("Template %(name)s already exists"),
+ "KCHTMPL0002E": _("Source media %(path)s not found"),
"KCHTMPL0003E": _("Network '%(network)s' specified for
template %(template)s does not exist"),
"KCHTMPL0004E": _("Storage pool %(pool)s specified for template
%(template)s does not exist"),
+ "KCHTMPL0005E": _("Template %(name)s does not exist."),
"KCHTMPL0006E": _("Invalid parameter '%(param)s' specified
for CDROM."),
"KCHTMPL0007E": _("Network %(network)s specified for template
%(template)s is not active"),
"KCHTMPL0008E": _("Template name must be a string"),
@@ -181,6 +183,7 @@ messages = {
"KCHTMPL0029E": _("Disk format must be 'raw', for logical,
iscsi, and scsi pools."),
"KCHTMPL0030E": _("Memory expects an object with one or both
parameters: 'current' and 'maxmemory'"),
"KCHTMPL0031E": _("Memory value (%(mem)sMiB) must be equal or lesser
than maximum memory value (%(maxmem)sMiB)"),
+ "KCHTMPL0032E": _("Unable to update template due error:
%(err)s"),
"KCHPOOL0001E": _("Storage pool %(name)s already exists"),
"KCHPOOL0002E": _("Storage pool %(name)s does not exist"),
diff --git a/model/templates.py b/model/templates.py
index a02099c..d0742ca 100644
--- a/model/templates.py
+++ b/model/templates.py
@@ -51,7 +51,7 @@ class TemplatesModel(object):
self.objstore = kargs['objstore']
self.conn = kargs['conn']
- def create(self, params):
+ def _validate_template_params(self, params):
name = params.get('name', '').strip()
conn = self.conn.get()
@@ -72,8 +72,7 @@ class TemplatesModel(object):
# image does not exists: raise error
elif not os.path.exists(path):
- raise InvalidParameter("Unable to find file %(path)s" %
- {"path": path})
+ raise InvalidParameter("KCHTMPL0002E", {'path': path})
# create magic object to discover file type
file_type = magic.open(magic.MAGIC_NONE)
@@ -99,10 +98,6 @@ class TemplatesModel(object):
params["disks"] = params.get('disks', [])
params["disks"].append({"base": path})
- return self.save_template(params)
-
- def save_template(self, params):
-
# Creates the template class with necessary information
t = LibvirtVMTemplate(params, scan=True, conn=self.conn)
@@ -119,16 +114,18 @@ class TemplatesModel(object):
if 'volume' in disk.keys():
self.template_volume_validate(volume, disk['pool'])
- # template with the same name already exists: raise exception
- name = params['name']
- with self.objstore as session:
- if name in session.get_list('template'):
- raise InvalidOperation("KCHTMPL0001E", {'name':
name})
+ return t
+
+ def create(self, params):
+ template = self._validate_template_params(params)
# Store template on objectstore
+ name = params['name']
try:
with self.objstore as session:
- session.store('template', name, t.info,
+ if name in session.get_list('template'):
+ raise InvalidOperation("KCHTMPL0001E", {'name':
name})
+ session.store('template', name, template.info,
get_kimchi_version())
except InvalidOperation:
raise
@@ -191,7 +188,8 @@ class TemplateModel(object):
temp = self.lookup(name)
temp['name'] = clone_name
- ident = self.templates.save_template(temp)
+ temp['source_media'] = temp.get('base',
temp['cdrom'])
Not sure I understood this block.
To create a template the user must to pass a value for source_media and
cdrom or disks[base] are not allowed. Said that, I don't see reasons to
have it here.
+ ident = self.templates.create(temp)
return ident
def delete(self, name):
@@ -204,31 +202,36 @@ class TemplateModel(object):
raise OperationFailed('KCHTMPL0021E', {'err': e.message})
def update(self, name, params):
- old_t = self.lookup(name)
- new_t = copy.copy(old_t)
+ edit_template = self.lookup(name)
+
+ edit_template['source_media'] = edit_template.get(
+ 'base', edit_template['cdrom'])
+
+ if 'cdrom' in params:
+ edit_template['source_media'] = params['cdrom']
source_media is not a valid parameter for template update. It is only
required to create a new Template.
To update it, you need to use disks[base] or cdrom. The same it was
before source_media being added.
# Merge graphics settings
graph_args = params.get('graphics')
if graph_args:
- graphics = dict(new_t['graphics'])
+ graphics = dict(edit_template['graphics'])
graphics.update(graph_args)
params['graphics'] = graphics
# Merge cpu_info settings
new_cpu_info = params.get('cpu_info')
if new_cpu_info:
- cpu_info = dict(new_t['cpu_info'])
+ cpu_info = dict(edit_template['cpu_info'])
cpu_info.update(new_cpu_info)
params['cpu_info'] = cpu_info
# Fix memory values, because method update does not work recursively
new_mem = params.get('memory')
if new_mem is not None:
- params['memory'] = copy.copy(old_t.get('memory'))
+ params['memory'] = copy.copy(edit_template.get('memory'))
params['memory'].update(new_mem)
validate_memory(params['memory'])
- new_t.update(params)
+ edit_template.update(params)
for net_name in params.get(u'networks', []):
try:
@@ -238,13 +241,30 @@ class TemplateModel(object):
raise InvalidParameter("KCHTMPL0003E", {'network':
net_name,
'template': name})
- self.delete(name)
+ template = self.templates._validate_template_params(edit_template)
+
try:
- ident = self.templates.save_template(new_t)
- except:
- ident = self.templates.save_template(old_t)
+ with self.objstore as session:
+ if name not in session.get_list('template'):
+ raise InvalidOperation("KCHTMPL0005E", {'name':
name})
+
+ if template.info['name'] != name and \
+ template.info['name'] in
session.get_list('template'):
+ raise InvalidOperation("KCHTMPL0001E",
+ {'name':
template.info['name']})
+
+ if template.info['name'] != name:
+ session.delete('template', name)
+
+ session.store('template', template.info['name'],
+ template.info, get_kimchi_version())
+
+ except InvalidOperation:
raise
- return ident
+ except Exception, e:
+ raise OperationFailed('KCHTMPL0032E', {'err': e.message})
+
+ return template.info['name']
def validate_memory(memory):
diff --git a/tests/test_template.py b/tests/test_template.py
index 158bbeb..f0ef030 100644
--- a/tests/test_template.py
+++ b/tests/test_template.py
@@ -256,7 +256,11 @@ class TemplateTests(unittest.TestCase):
self.assertEquals(1024, update_tmpl['memory']['maxmemory'])
# Update cdrom
- cdrom_data = {'cdrom': '/tmp/mock2.iso'}
+ cdrom_data = {'cdrom': 'inexistent.iso'}
+ resp = self.request(new_tmpl_uri, json.dumps(cdrom_data), 'PUT')
+ self.assertEquals(400, resp.status)
+
+ cdrom_data = {'cdrom': '/tmp/existent.iso'}
resp = self.request(new_tmpl_uri, json.dumps(cdrom_data), 'PUT')
self.assertEquals(200, resp.status)
update_tmpl = json.loads(resp.read())