示例#1
0
    def template_update(self, name, params):
        old_t = self.template_lookup(name)
        new_t = copy.copy(old_t)

        new_t.update(params)
        ident = name

        new_storagepool = new_t.get(u'storagepool', '')
        try:
            self._get_storagepool(pool_name_from_uri(new_storagepool))
        except Exception:
            msg_args = {'pool': new_storagepool, 'template': name}
            raise InvalidParameter("KCHTMPL0004E", msg_args)

        for net_name in params.get(u'networks', []):
            try:
                self._get_network(net_name)
            except NotFoundError:
                msg_args = {'network': net_name, 'template': name}
                raise InvalidParameter("KCHTMPL0003E", msg_args)

        self.template_delete(name)
        try:
            ident = self.templates_create(new_t)
        except:
            ident = self.templates_create(old_t)
            raise
        return ident
示例#2
0
    def _get_disks_xml(self, vm_uuid):
        # Current implementation just allows to create disk in one single
        # storage pool, so we cannot mix the types (scsi volumes vs img file)
        storage_type = self._get_storage_type()
        storage_path = self._get_storage_path()

        base_disk_params = {'type': 'disk', 'disk': 'file',
                            'bus': self.info['disk_bus']}
        logical_disk_params = {'format': 'raw'}
        iscsi_disk_params = {'disk': 'block', 'format': 'raw'}

        scsi_disk = 'volume' if self.fc_host_support else 'block'
        scsi_disk_params = {'disk': scsi_disk, 'type': 'lun',
                            'format': 'raw', 'bus': 'scsi'}

        disks_xml = ''
        pool_name = pool_name_from_uri(self.info['storagepool'])
        for index, disk in enumerate(self.info['disks']):
            params = dict(base_disk_params)
            params['format'] = disk['format']
            params.update(locals().get('%s_disk_params' % storage_type, {}))
            params['index'] = index

            volume = disk.get('volume')
            if volume is not None:
                params['path'] = self._get_volume_path(pool_name, volume)
            else:
                volume = "%s-%s.img" % (vm_uuid, params['index'])
                params['path'] = os.path.join(storage_path, volume)

            disks_xml += get_disk_xml(params)[1]

        return unicode(disks_xml, 'utf-8')
示例#3
0
    def create(self, params):
        name = params['name']
        conn = self.conn.get()

        pool_uri = params.get(u'storagepool', '')
        if pool_uri:
            pool_name = pool_name_from_uri(pool_uri)
            try:
                conn.storagePoolLookupByName(pool_name.encode("utf-8"))
            except Exception:
                raise InvalidParameter("KCHTMPL0004E", {'pool': pool_name,
                                                        'template': name})

        for net_name in params.get(u'networks', []):
            try:
                conn.networkLookupByName(net_name)
            except Exception:
                raise InvalidParameter("KCHTMPL0003E", {'network': net_name,
                                                        'template': name})

        with self.objstore as session:
            if name in session.get_list('template'):
                raise InvalidOperation("KCHTMPL0001E", {'name': name})
            t = LibvirtVMTemplate(params, scan=True)
            session.store('template', name, t.info)
        return name
示例#4
0
    def _get_iscsi_disks_xml(self):
        def build_disk_xml(children=[]):
            disk = E.disk(type='volume', device='disk')
            disk.extend(children)
            return etree.tostring(disk)

        ret = ""
        children = []
        auth = self._get_storage_auth()
        if auth:
            etree_auth = E.auth(username=auth['username'])
            etree_auth.append(
                E.secret(type=auth['type'], usage=auth['libvirtiscsi']))
            children.append(etree_auth)
        children.append(E.driver(name='qemu', type='raw'))
        disk_bus = self.info['disk_bus']
        dev_prefix = self._bus_to_dev[disk_bus]
        pool_name = pool_name_from_uri(self.info['storagepool'])
        for i, d in enumerate(self.info['disks']):
            source = E.source(pool=pool_name,
                              volume=d.get('volume'),
                              mode='host')
            # FIXME if more than 26 disks
            target = E.target(dev=dev_prefix + string.lowercase[i],
                              bus=disk_bus)
            ret += build_disk_xml(children + [source, target])

        return ret
示例#5
0
    def create(self, params):
        name = params.get('name', '').strip()
        if not name:
            iso = params['cdrom']
            iso_name = os.path.splitext(iso[iso.rfind('/') + 1:])[0]
            name = iso_name + str(int(time.time()*1000))
            params['name'] = name

        conn = self.conn.get()

        pool_uri = params.get(u'storagepool', '')
        if pool_uri:
            pool_name = pool_name_from_uri(pool_uri)
            try:
                conn.storagePoolLookupByName(pool_name.encode("utf-8"))
            except Exception:
                raise InvalidParameter("KCHTMPL0004E", {'pool': pool_name,
                                                        'template': name})

        for net_name in params.get(u'networks', []):
            try:
                conn.networkLookupByName(net_name)
            except Exception:
                raise InvalidParameter("KCHTMPL0003E", {'network': net_name,
                                                        'template': name})

        with self.objstore as session:
            if name in session.get_list('template'):
                raise InvalidOperation("KCHTMPL0001E", {'name': name})
            t = LibvirtVMTemplate(params, scan=True)
            session.store('template', name, t.info)
        return name
示例#6
0
    def _get_disks_xml(self, vm_uuid):
        # Current implementation just allows to create disk in one single
        # storage pool, so we cannot mix the types (scsi volumes vs img file)
        storage_type = self._get_storage_type()
        storage_path = self._get_storage_path()

        base_disk_params = {"type": "disk", "disk": "file", "bus": self.info["disk_bus"], "format": "qcow2"}
        logical_disk_params = {"format": "raw"}
        iscsi_disk_params = {"disk": "block", "format": "raw"}

        scsi_disk = "volume" if self.fc_host_support else "block"
        scsi_disk_params = {"disk": scsi_disk, "type": "lun", "format": "raw", "bus": "scsi"}

        disks_xml = ""
        pool_name = pool_name_from_uri(self.info["storagepool"])
        for index, disk in enumerate(self.info["disks"]):
            params = dict(base_disk_params)
            params["format"] = disk.get("format", params["format"])
            params.update(locals().get("%s_disk_params" % storage_type, {}))
            params["index"] = index

            volume = disk.get("volume")
            if volume is not None:
                params["path"] = self._get_volume_path(pool_name, volume)
            else:
                volume = "%s-%s.img" % (vm_uuid, params["index"])
                params["path"] = os.path.join(storage_path, volume)

            disks_xml += get_disk_xml(params)[1]

        return unicode(disks_xml, "utf-8")
示例#7
0
    def _get_iscsi_disks_xml(self):
        def build_disk_xml(children=[]):
            disk = E.disk(type='volume', device='disk')
            disk.extend(children)
            return etree.tostring(disk)

        ret = ""
        children = []
        auth = self._get_storage_auth()
        if auth:
            etree_auth = E.auth(username=auth['username'])
            etree_auth.append(E.secret(type=auth['type'],
                              usage=auth['libvirtiscsi']))
            children.append(etree_auth)
        children.append(E.driver(name='qemu', type='raw'))
        disk_bus = self.info['disk_bus']
        dev_prefix = self._bus_to_dev[disk_bus]
        pool_name = pool_name_from_uri(self.info['storagepool'])
        for i, d in enumerate(self.info['disks']):
            source = E.source(pool=pool_name,
                              volume=d.get('volume'), mode='host')
            # FIXME if more than 26 disks
            target = E.target(dev=dev_prefix + string.lowercase[i],
                              bus=disk_bus)
            ret += build_disk_xml(children+[source, target])

        return ret
示例#8
0
    def _get_disks_xml(self, vm_uuid):
        # Current implementation just allows to create disk in one single
        # storage pool, so we cannot mix the types (scsi volumes vs img file)
        storage_type = self._get_storage_type()
        storage_path = self._get_storage_path()

        base_disk_params = {'type': 'disk', 'disk': 'file',
                            'bus': self.info['disk_bus'], 'format': 'qcow2'}
        logical_disk_params = {'format': 'raw'}
        iscsi_disk_params = {'disk': 'block', 'format': 'raw'}

        scsi_disk = 'volume' if self.fc_host_support else 'block'
        scsi_disk_params = {'disk': scsi_disk, 'type': 'lun',
                            'format': 'raw', 'bus': 'scsi'}

        disks_xml = ''
        pool_name = pool_name_from_uri(self.info['storagepool'])
        for index, disk in enumerate(self.info['disks']):
            params = dict(base_disk_params)
            params['format'] = disk.get('format', params['format'])
            params.update(locals().get('%s_disk_params' % storage_type, {}))
            params['index'] = index

            volume = disk.get('volume')
            if volume is not None:
                params['path'] = self._get_volume_path(pool_name, volume)
            else:
                volume = "%s-%s.img" % (vm_uuid, params['index'])
                params['path'] = os.path.join(storage_path, volume)

            disks_xml += get_disk_xml(params)[1]

        return unicode(disks_xml, 'utf-8')
示例#9
0
    def validate_integrity(self):
        invalid = {}
        # validate networks integrity
        invalid_networks = list(set(self.info['networks']) -
                                set(self._get_all_networks_name()))
        if invalid_networks:
            invalid['networks'] = invalid_networks

        # validate storagepools integrity
        pool_uri = self.info['storagepool']
        pool_name = pool_name_from_uri(pool_uri)
        if pool_name not in self._get_all_storagepools_name():
            invalid['storagepools'] = [pool_name]

        # validate iso integrity
        # FIXME when we support multiples cdrom devices
        iso = self.info.get('cdrom')
        if iso:
            if os.path.exists(iso):
                st_mode = os.stat(iso).st_mode
                if not (stat.S_ISREG(st_mode) or stat.S_ISBLK(st_mode)):
                    invalid['cdrom'] = [iso]
            elif not check_url_path(iso):
                invalid['cdrom'] = [iso]

        self.info['invalid'] = invalid

        return self.info
示例#10
0
    def template_update(self, name, params):
        old_t = self.template_lookup(name)
        new_t = copy.copy(old_t)

        new_t.update(params)
        ident = name

        new_storagepool = new_t.get(u'storagepool', '')
        try:
            self._get_storagepool(pool_name_from_uri(new_storagepool))
        except Exception as e:
            raise InvalidParameter("Storagepool specified is not valid: %s." % e.message)

        for net_name in params.get(u'networks', []):
            try:
                self._get_network(net_name)
            except NotFoundError:
                raise InvalidParameter("Network '%s' specified by template "
                                       "does not exist" % net_name)

        self.template_delete(name)
        try:
            ident = self.templates_create(new_t)
        except:
            ident = self.templates_create(old_t)
            raise
        return ident
示例#11
0
    def update(self, name, params):
        old_t = self.lookup(name)
        new_t = copy.copy(old_t)
        new_t.update(params)
        ident = name

        pool_uri = new_t.get(u'storagepool', '')
        pool_name = pool_name_from_uri(pool_uri)
        try:
            conn = self.conn.get()
            conn.storagePoolLookupByName(pool_name.encode("utf-8"))
        except Exception:
            raise InvalidParameter("KCHTMPL0004E", {
                'pool': pool_name,
                'template': name
            })

        for net_name in params.get(u'networks', []):
            try:
                conn = self.conn.get()
                conn.networkLookupByName(net_name)
            except Exception:
                raise InvalidParameter("KCHTMPL0003E", {
                    'network': net_name,
                    'template': name
                })

        self.delete(name)
        try:
            ident = self.templates.create(new_t)
        except:
            ident = self.templates.create(old_t)
            raise
        return ident
示例#12
0
    def template_update(self, name, params):
        old_t = self.template_lookup(name)
        new_t = copy.copy(old_t)

        new_t.update(params)
        ident = name

        new_storagepool = new_t.get(u'storagepool', '')
        try:
            self._get_storagepool(pool_name_from_uri(new_storagepool))
        except Exception:
            msg_args = {'pool': new_storagepool, 'template': name}
            raise InvalidParameter("KCHTMPL0004E", msg_args)

        for net_name in params.get(u'networks', []):
            try:
                self._get_network(net_name)
            except NotFoundError:
                msg_args = {'network': net_name, 'template': name}
                raise InvalidParameter("KCHTMPL0003E", msg_args)

        self.template_delete(name)
        try:
            ident = self.templates_create(new_t)
        except:
            ident = self.templates_create(old_t)
            raise
        return ident
示例#13
0
    def update(self, name, params):
        old_t = self.lookup(name)
        new_t = copy.copy(old_t)
        new_t.update(params)
        ident = name

        pool_uri = new_t.get(u'storagepool', '')
        pool_name = pool_name_from_uri(pool_uri)
        try:
            conn = self.conn.get()
            conn.storagePoolLookupByName(pool_name.encode("utf-8"))
        except Exception:
            raise InvalidParameter("KCHTMPL0004E", {'pool': pool_name,
                                                    'template': name})

        for net_name in params.get(u'networks', []):
            try:
                conn = self.conn.get()
                conn.networkLookupByName(net_name)
            except Exception:
                raise InvalidParameter("KCHTMPL0003E", {'network': net_name,
                                                        'template': name})

        self.delete(name)
        try:
            ident = self.templates.create(new_t)
        except:
            ident = self.templates.create(old_t)
            raise
        return ident
示例#14
0
    def validate_integrity(self):
        invalid = {}
        # validate networks integrity
        invalid_networks = list(
            set(self.info['networks']) - set(self._get_all_networks_name()))
        if invalid_networks:
            invalid['networks'] = invalid_networks

        # validate storagepools integrity
        pool_uri = self.info['storagepool']
        pool_name = pool_name_from_uri(pool_uri)
        if pool_name not in self._get_all_storagepools_name():
            invalid['storagepools'] = [pool_name]

        # validate iso integrity
        # FIXME when we support multiples cdrom devices
        iso = self.info.get('cdrom')
        if iso:
            if os.path.exists(iso):
                st_mode = os.stat(iso).st_mode
                if not (stat.S_ISREG(st_mode) or stat.S_ISBLK(st_mode)):
                    invalid['cdrom'] = [iso]
            elif not check_url_path(iso):
                invalid['cdrom'] = [iso]

        self.info['invalid'] = invalid

        return self.info
示例#15
0
    def create(self, params):
        name = params.get('name', '').strip()
        iso = params['cdrom']
        # check search permission
        if iso.startswith('/') and os.path.isfile(iso):
            user = UserTests().probe_user()
            ret, excp = probe_file_permission_as_user(iso, user)
            if ret is False:
                raise InvalidParameter('KCHISO0008E', {
                    'filename': iso,
                    'user': user,
                    'err': excp
                })

        if not name:
            iso_name = os.path.splitext(iso[iso.rfind('/') + 1:])[0]
            name = iso_name + str(int(time.time() * 1000))
            params['name'] = name

        conn = self.conn.get()
        pool_uri = params.get(u'storagepool', '')
        if pool_uri:
            try:
                pool_name = pool_name_from_uri(pool_uri)
                pool = conn.storagePoolLookupByName(pool_name.encode("utf-8"))
            except Exception:
                raise InvalidParameter("KCHTMPL0004E", {
                    'pool': pool_name,
                    'template': name
                })
            tmp_volumes = [
                disk['volume'] for disk in params.get('disks', [])
                if 'volume' in disk
            ]
            self.template_volume_validate(tmp_volumes, pool)

        for net_name in params.get(u'networks', []):
            try:
                conn.networkLookupByName(net_name)
            except Exception:
                raise InvalidParameter("KCHTMPL0003E", {
                    'network': net_name,
                    'template': name
                })
        # Creates the template class with necessary information
        # Checkings will be done while creating this class, so any exception
        # will be raised here
        t = LibvirtVMTemplate(params, scan=True)

        try:
            with self.objstore as session:
                if name in session.get_list('template'):
                    raise InvalidOperation("KCHTMPL0001E", {'name': name})
                session.store('template', name, t.info)
        except Exception as e:
            raise OperationFailed('KCHTMPL0020E', {'err': e.message})

        return name
示例#16
0
 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
示例#17
0
 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
示例#18
0
    def _storage_validate(self):
        pool_uri = self.info['storagepool']
        pool_name = pool_name_from_uri(pool_uri)
        try:
            pool = self.model._get_storagepool(pool_name)
        except NotFoundError:
            raise InvalidParameter('Storage specified by template does not exist')
        if pool.info['state'] != 'active':
            raise InvalidParameter('Storage specified by template is not active')

        return pool
示例#19
0
    def _storage_validate(self):
        pool_uri = self.info['storagepool']
        pool_name = pool_name_from_uri(pool_uri)
        try:
            pool = self.model._get_storagepool(pool_name)
        except NotFoundError:
            msg_args = {'pool': pool_name, 'template': self.name}
            raise InvalidParameter("KCHTMPL0004E", msg_args)

        if pool.info['state'] != 'active':
            msg_args = {'pool': pool_name, 'template': self.name}
            raise InvalidParameter("KCHTMPL0005E", msg_args)

        return pool
示例#20
0
    def _storage_validate(self):
        pool_uri = self.info['storagepool']
        pool_name = pool_name_from_uri(pool_uri)
        try:
            pool = self.model._get_storagepool(pool_name)
        except NotFoundError:
            msg_args = {'pool': pool_name, 'template': self.name}
            raise InvalidParameter("KCHTMPL0004E", msg_args)

        if pool.info['state'] != 'active':
            msg_args = {'pool': pool_name, 'template': self.name}
            raise InvalidParameter("KCHTMPL0005E", msg_args)

        return pool
示例#21
0
    def create(self, params):
        name = params.get('name', '').strip()
        iso = params['cdrom']
        # check search permission
        if iso.startswith('/') and os.path.isfile(iso):
            user = UserTests().probe_user()
            ret, excp = probe_file_permission_as_user(iso, user)
            if ret is False:
                raise InvalidParameter('KCHISO0008E',
                                       {'filename': iso, 'user': user,
                                        'err': excp})

        if not name:
            iso_name = os.path.splitext(iso[iso.rfind('/') + 1:])[0]
            name = iso_name + str(int(time.time() * 1000))
            params['name'] = name

        conn = self.conn.get()
        pool_uri = params.get(u'storagepool', '')
        if pool_uri:
            try:
                pool_name = pool_name_from_uri(pool_uri)
                pool = conn.storagePoolLookupByName(pool_name.encode("utf-8"))
            except Exception:
                raise InvalidParameter("KCHTMPL0004E", {'pool': pool_name,
                                                        'template': name})
            tmp_volumes = [disk['volume'] for disk in params.get('disks', [])
                           if 'volume' in disk]
            self.template_volume_validate(tmp_volumes, pool)

        for net_name in params.get(u'networks', []):
            try:
                conn.networkLookupByName(net_name)
            except Exception:
                raise InvalidParameter("KCHTMPL0003E", {'network': net_name,
                                                        'template': name})
        # Creates the template class with necessary information
        # Checkings will be done while creating this class, so any exception
        # will be raised here
        t = LibvirtVMTemplate(params, scan=True)

        try:
            with self.objstore as session:
                if name in session.get_list('template'):
                    raise InvalidOperation("KCHTMPL0001E", {'name': name})
                session.store('template', name, t.info)
        except Exception as e:
            raise OperationFailed('KCHTMPL0020E', {'err': e.message})

        return name
示例#22
0
    def _storage_validate(self):
        pool_uri = self.info['storagepool']
        pool_name = pool_name_from_uri(pool_uri)
        try:
            conn = self.conn.get()
            pool = conn.storagePoolLookupByName(pool_name.encode("utf-8"))
        except libvirt.libvirtError:
            raise InvalidParameter("KCHTMPL0004E", {'pool': pool_name,
                                                    'template': self.name})

        if not pool.isActive():
            raise InvalidParameter("KCHTMPL0005E", {'pool': pool_name,
                                                    'template': self.name})

        return pool
示例#23
0
    def update(self, name, params):
        old_t = self.lookup(name)
        new_t = copy.copy(old_t)
        new_t.update(params)

        if not self._validate_updated_cpu_params(new_t):
            raise InvalidParameter('KCHTMPL0025E')

        ident = name

        conn = self.conn.get()
        pool_uri = new_t.get(u'storagepool', '')

        if pool_uri:
            try:
                pool_name = pool_name_from_uri(pool_uri)
                pool = conn.storagePoolLookupByName(pool_name.encode("utf-8"))
            except Exception:
                raise InvalidParameter("KCHTMPL0004E", {
                    'pool': pool_name,
                    'template': name
                })
            tmp_volumes = [
                disk['volume'] for disk in new_t.get('disks', [])
                if 'volume' in disk
            ]
            self.templates.template_volume_validate(tmp_volumes, pool)

        for net_name in params.get(u'networks', []):
            try:
                conn.networkLookupByName(net_name.encode('utf-8'))
            except Exception:
                raise InvalidParameter("KCHTMPL0003E", {
                    'network': net_name,
                    'template': name
                })

        self.delete(name)
        try:
            ident = self.templates.create(new_t)
        except:
            ident = self.templates.create(old_t)
            raise
        return ident
示例#24
0
    def _storage_validate(self):
        pool_uri = self.info['storagepool']
        pool_name = pool_name_from_uri(pool_uri)
        try:
            conn = self.conn.get()
            pool = conn.storagePoolLookupByName(pool_name.encode("utf-8"))
        except libvirt.libvirtError:
            raise InvalidParameter("KCHTMPL0004E", {
                'pool': pool_name,
                'template': self.name
            })

        if not pool.isActive():
            raise InvalidParameter("KCHTMPL0005E", {
                'pool': pool_name,
                'template': self.name
            })

        return pool
示例#25
0
    def _get_iscsi_disks_xml(self):
        def build_disk_xml(children=[]):
            disk = E.disk(type='block', device='disk')
            disk.extend(children)
            return etree.tostring(disk)

        ret = ""
        children = []
        children.append(E.driver(name='qemu', type='raw'))
        disk_bus = self.info['disk_bus']
        dev_prefix = self._bus_to_dev[disk_bus]
        pool_name = pool_name_from_uri(self.info['storagepool'])
        for i, d in enumerate(self.info['disks']):
            source = E.source(dev=self._get_volume_path(pool_name,
                                                        d.get('volume')))
            # FIXME if more than 26 disks
            target = E.target(dev=dev_prefix + string.lowercase[i],
                              bus=disk_bus)
            ret += build_disk_xml(children+[source, target])

        return ret
示例#26
0
    def update(self, name, params):
        old_t = self.lookup(name)
        new_t = copy.copy(old_t)
        new_t.update(params)

        if not self._validate_updated_cpu_params(new_t):
            raise InvalidParameter('KCHTMPL0025E')

        ident = name

        conn = self.conn.get()
        pool_uri = new_t.get(u'storagepool', '')

        if pool_uri:
            try:
                pool_name = pool_name_from_uri(pool_uri)
                pool = conn.storagePoolLookupByName(pool_name.encode("utf-8"))
            except Exception:
                raise InvalidParameter("KCHTMPL0004E", {'pool': pool_name,
                                                        'template': name})
            tmp_volumes = [disk['volume'] for disk in new_t.get('disks', [])
                           if 'volume' in disk]
            self.templates.template_volume_validate(tmp_volumes, pool)

        for net_name in params.get(u'networks', []):
            try:
                conn.networkLookupByName(net_name)
            except Exception:
                raise InvalidParameter("KCHTMPL0003E", {'network': net_name,
                                                        'template': name})

        self.delete(name)
        try:
            ident = self.templates.create(new_t)
        except:
            ident = self.templates.create(old_t)
            raise
        return ident
示例#27
0
    def validate_integrity(self):
        invalid = {}
        # validate networks integrity
        invalid_networks = list(
            set(self.info['networks']) - set(self._get_all_networks_name()))
        if invalid_networks:
            invalid['networks'] = invalid_networks

        # validate storagepools integrity
        pool_uri = self.info['storagepool']
        pool_name = pool_name_from_uri(pool_uri)
        if pool_name not in self._get_all_storagepools_name():
            invalid['storagepools'] = [pool_name]

        # validate iso integrity
        # FIXME when we support multiples cdrom devices
        iso = self.info.get('cdrom')
        if iso and not (os.path.isfile(iso) or check_url_path(iso)):
            invalid['cdrom'] = [iso]

        self.info['invalid'] = invalid

        return self.info
示例#28
0
    def validate_integrity(self):
        invalid = {}
        # validate networks integrity
        invalid_networks = list(set(self.info['networks']) -
                                set(self._get_all_networks_name()))
        if invalid_networks:
            invalid['networks'] = invalid_networks

        # validate storagepools integrity
        pool_uri = self.info['storagepool']
        pool_name = pool_name_from_uri(pool_uri)
        if pool_name not in self._get_all_storagepools_name():
            invalid['storagepools'] = [pool_name]

        # validate iso integrity
        # FIXME when we support multiples cdrom devices
        iso = self.info['cdrom']
        if not (os.path.isfile(iso) or check_url_path(iso)):
            invalid['cdrom'] = [iso]

        self.info['invalid'] = invalid

        return self.info
示例#29
0
    def create(self, params):
        name = params.get('name', '').strip()
        if not name:
            iso = params['cdrom']
            iso_name = os.path.splitext(iso[iso.rfind('/') + 1:])[0]
            name = iso_name + str(int(time.time() * 1000))
            params['name'] = name

        conn = self.conn.get()

        pool_uri = params.get(u'storagepool', '')
        if pool_uri:
            pool_name = pool_name_from_uri(pool_uri)
            try:
                conn.storagePoolLookupByName(pool_name.encode("utf-8"))
            except Exception:
                raise InvalidParameter("KCHTMPL0004E", {
                    'pool': pool_name,
                    'template': name
                })

        for net_name in params.get(u'networks', []):
            try:
                conn.networkLookupByName(net_name)
            except Exception:
                raise InvalidParameter("KCHTMPL0003E", {
                    'network': net_name,
                    'template': name
                })

        with self.objstore as session:
            if name in session.get_list('template'):
                raise InvalidOperation("KCHTMPL0001E", {'name': name})
            t = LibvirtVMTemplate(params, scan=True)
            session.store('template', name, t.info)
        return name
示例#30
0
    def create(self, params):
        name = params.get('name', '').strip()
        iso = params.get('cdrom')
        # check search permission
        if iso and iso.startswith('/') and os.path.isfile(iso):
            user = UserTests().probe_user()
            ret, excp = probe_file_permission_as_user(iso, user)
            if ret is False:
                raise InvalidParameter('KCHISO0008E',
                                       {'filename': iso, 'user': user,
                                        'err': excp})

        cpu_info = params.get('cpu_info')
        if cpu_info:
            topology = cpu_info.get('topology')
            # Check, even though currently only topology
            #   is supported.
            if topology:
                sockets = topology['sockets']
                cores = topology['cores']
                threads = topology['threads']
                if params.get('cpus') is None:
                    params['cpus'] = sockets * cores * threads
                # check_topoology will raise the appropriate
                # exception if a topology is invalid.
                CPUInfoModel(conn=self.conn).\
                    check_topology(params['cpus'], topology)
        else:
            params['cpu_info'] = dict()

        conn = self.conn.get()
        pool_uri = params.get(u'storagepool', '')
        if pool_uri:
            try:
                pool_name = pool_name_from_uri(pool_uri)
                pool = conn.storagePoolLookupByName(pool_name.encode("utf-8"))
            except Exception:
                raise InvalidParameter("KCHTMPL0004E", {'pool': pool_name,
                                                        'template': name})

            tmp_volumes = [disk['volume'] for disk in params.get('disks', [])
                           if 'volume' in disk]
            self.template_volume_validate(tmp_volumes, pool)

        for net_name in params.get(u'networks', []):
            try:
                conn.networkLookupByName(net_name)
            except Exception:
                raise InvalidParameter("KCHTMPL0003E", {'network': net_name,
                                                        'template': name})
        # Creates the template class with necessary information
        # Checkings will be done while creating this class, so any exception
        # will be raised here
        t = LibvirtVMTemplate(params, scan=True)
        name = params['name']
        try:
            with self.objstore as session:
                if name in session.get_list('template'):
                    raise InvalidOperation("KCHTMPL0001E", {'name': name})
                session.store('template', name, t.info)
        except InvalidOperation:
            raise
        except Exception, e:
            raise OperationFailed('KCHTMPL0020E', {'err': e.message})
示例#31
0
    def create(self, params):
        name = params.get('name', '').strip()
        iso = params.get('cdrom')
        # check search permission
        if iso and iso.startswith('/') and os.path.exists(iso):
            st_mode = os.stat(iso).st_mode
            if stat.S_ISREG(st_mode) or stat.S_ISBLK(st_mode):
                user = UserTests().probe_user()
                run_setfacl_set_attr(iso, user=user)
                ret, excp = probe_file_permission_as_user(iso, user)
                if ret is False:
                    raise InvalidParameter('KCHISO0008E', {
                        'filename': iso,
                        'user': user,
                        'err': excp
                    })

        cpu_info = params.get('cpu_info')
        if cpu_info:
            topology = cpu_info.get('topology')
            # Check, even though currently only topology
            #   is supported.
            if topology:
                sockets = topology['sockets']
                cores = topology['cores']
                threads = topology['threads']
                if params.get('cpus') is None:
                    params['cpus'] = sockets * cores * threads
                # check_topoology will raise the appropriate
                # exception if a topology is invalid.
                CPUInfoModel(conn=self.conn).\
                    check_topology(params['cpus'], topology)
        else:
            params['cpu_info'] = dict()

        conn = self.conn.get()
        pool_uri = params.get(u'storagepool', '')
        if pool_uri:
            try:
                pool_name = pool_name_from_uri(pool_uri)
                pool = conn.storagePoolLookupByName(pool_name.encode("utf-8"))
            except Exception:
                raise InvalidParameter("KCHTMPL0004E", {
                    'pool': pool_name,
                    'template': name
                })

            tmp_volumes = [
                disk['volume'] for disk in params.get('disks', [])
                if 'volume' in disk
            ]
            self.template_volume_validate(tmp_volumes, pool)

        for net_name in params.get(u'networks', []):
            try:
                conn.networkLookupByName(net_name.encode('utf-8'))
            except Exception:
                raise InvalidParameter("KCHTMPL0003E", {
                    'network': net_name,
                    'template': name
                })
        # Creates the template class with necessary information
        # Checkings will be done while creating this class, so any exception
        # will be raised here
        t = LibvirtVMTemplate(params, scan=True, conn=self.conn)
        name = params['name']
        try:
            with self.objstore as session:
                if name in session.get_list('template'):
                    raise InvalidOperation("KCHTMPL0001E", {'name': name})
                session.store('template', name, t.info)
        except InvalidOperation:
            raise
        except Exception, e:
            raise OperationFailed('KCHTMPL0020E', {'err': e.message})