
From: Paulo Vital <pvital@linux.vnet.ibm.com> Changed API.json and model to accept 'netboot' as source media parameter while creating a new template. Now, when creating a new template and specifying 'netboot' as source media parameter, it is assumed the template will use netboot process - PXE/DHCP/TFTP/(NFS/HTTP/FTP). This is part of solution to Issue #372. Signed-off-by: Paulo Vital <pvital@linux.vnet.ibm.com> --- API.json | 18 ++++++++++++++---- i18n.py | 1 + model/templates.py | 27 ++++++++++++++++++++++++--- vmtemplate.py | 4 ++++ 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/API.json b/API.json index 5ef4f55..285b650 100644 --- a/API.json +++ b/API.json @@ -476,7 +476,6 @@ }, "templates_create": { "type": "object", - "error": "KCHTMPL0016E", "properties": { "name": { "description": "The name of the template", @@ -505,9 +504,20 @@ }, "memory": { "$ref": "#/kimchitype/memory" }, "source_media": { - "description": "Path for installation media (ISO, disk, remote ISO)", - "type" : "string", - "pattern" : "^((/)|(http)[s]?:|[t]?(ftp)[s]?:)+.*$", + "type" : "object", + "properties" : { + "type": { + "description": "Type of source media: disk or netboot", + "type": "string", + "pattern": "^disk|netboot$", + "required": true + }, + "path": { + "description": "Path for installation media (ISO, disk, remote ISO)", + "type": "string", + "pattern" : "^((/)|(http)[s]?:|[t]?(ftp)[s]?:)+.*$" + } + }, "required": true }, "disks": { diff --git a/i18n.py b/i18n.py index 6f88fae..0e1de77 100644 --- a/i18n.py +++ b/i18n.py @@ -157,6 +157,7 @@ messages = { "KCHTMPL0001E": _("Template %(name)s already exists"), "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": _("Invalid parameter specified for source media: '%(param)s'"), "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"), diff --git a/model/templates.py b/model/templates.py index a02099c..61314f1 100644 --- a/model/templates.py +++ b/model/templates.py @@ -62,10 +62,28 @@ class TemplatesModel(object): raise InvalidParameter("KCHTMPL0003E", {'network': net_name, 'template': name}) - # get source_media - path = params.pop("source_media") + # Get source_media + source_media = params.get("source_media", None) + + if source_media is None: + raise InvalidParameter("KCHTMPL0005E", {'param': 'type = None'}) + + if source_media['type'] == 'netboot': + params['os_distro'] = 'unknown' + params['os_version'] = 'unknown' + return self.save_template(params) + elif source_media['type'] == 'disk': + # Get path of source media if it's based on disk type. + path = source_media.get('path', None) + else: + raise InvalidParameter("KCHTMPL0005E", {'param': 'type = %s' % + source_media['type']}) + + if path is None: + raise InvalidParameter("KCHTMPL0016E") # not local image: set as remote ISO + path = path.encode('utf-8') if urlparse.urlparse(path).scheme in ["http", "https", "tftp", "ftp", "ftps"]: params["cdrom"] = path @@ -104,7 +122,10 @@ class TemplatesModel(object): def save_template(self, params): # Creates the template class with necessary information - t = LibvirtVMTemplate(params, scan=True, conn=self.conn) + if 'cdrom' not in params.keys(): + t = LibvirtVMTemplate(params, conn=self.conn) + else: + t = LibvirtVMTemplate(params, scan=True, conn=self.conn) # Validate cpu info t.cpuinfo_validate() diff --git a/vmtemplate.py b/vmtemplate.py index a223beb..3e4418f 100644 --- a/vmtemplate.py +++ b/vmtemplate.py @@ -123,6 +123,10 @@ class VMTemplate(object): def _get_os_info(self, args, scan): distro = version = 'unknown' + if 'source_media' in args.keys(): + if args['source_media']['type'] == 'netboot': + return distro, version + # Identify the cdrom if present iso = args.get('cdrom', '') if len(iso) > 0: -- 2.5.5