Replace pool config parsing logic
- Move add_pool/remove_pool to Qubes class - Add Qubes.get_pool - Remove storage.conf
This commit is contained in:
parent
c791cb1935
commit
36470310a2
1
Makefile
1
Makefile
@ -60,7 +60,6 @@ endif
|
|||||||
# $(MAKE) install -C tests
|
# $(MAKE) install -C tests
|
||||||
$(MAKE) install -C relaxng
|
$(MAKE) install -C relaxng
|
||||||
mkdir -p $(DESTDIR)/etc/qubes
|
mkdir -p $(DESTDIR)/etc/qubes
|
||||||
cp etc/storage.conf $(DESTDIR)/etc/qubes/
|
|
||||||
ifeq ($(BACKEND_VMM),xen)
|
ifeq ($(BACKEND_VMM),xen)
|
||||||
# Currently supported only on xen
|
# Currently supported only on xen
|
||||||
cp etc/qmemman.conf $(DESTDIR)/etc/qubes/
|
cp etc/qmemman.conf $(DESTDIR)/etc/qubes/
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
[default] ; poolname
|
|
||||||
driver=xen ; the default xen storage
|
|
||||||
; class = qubes.storage.xen.XenStorage ; class always overwrites the driver
|
|
||||||
;
|
|
||||||
; To use our own pool driver it needs to provide `qubes.storage` entry_point
|
|
||||||
; see also: https://pythonhosted.org/setuptools/setuptools.html#dynamic-discovery-of-services-and-plugins
|
|
||||||
; class name
|
|
||||||
; [pool-b]
|
|
||||||
; driver = foo
|
|
||||||
;
|
|
||||||
; [test-dummy]
|
|
||||||
; driver=dummy
|
|
||||||
|
|
@ -48,8 +48,6 @@ import time
|
|||||||
|
|
||||||
import __builtin__
|
import __builtin__
|
||||||
|
|
||||||
import docutils.core
|
|
||||||
import docutils.io
|
|
||||||
import jinja2
|
import jinja2
|
||||||
import lxml.etree
|
import lxml.etree
|
||||||
import pkg_resources
|
import pkg_resources
|
||||||
@ -1190,8 +1188,8 @@ class Qubes(PropertyHolder):
|
|||||||
#: collection of all available labels for VMs
|
#: collection of all available labels for VMs
|
||||||
self.labels = {}
|
self.labels = {}
|
||||||
|
|
||||||
#: collection of all available pool configurations
|
#: collection of all pools
|
||||||
self.pool_configs = {}
|
self.pools = {}
|
||||||
|
|
||||||
#: Connection to VMM
|
#: Connection to VMM
|
||||||
self.vmm = VMMConnection()
|
self.vmm = VMMConnection()
|
||||||
@ -1262,9 +1260,11 @@ class Qubes(PropertyHolder):
|
|||||||
|
|
||||||
for node in self.xml.xpath('./pools/pool'):
|
for node in self.xml.xpath('./pools/pool'):
|
||||||
name = node.get('name')
|
name = node.get('name')
|
||||||
config_data = node.attrib
|
assert name, "Pool name '%s' is invalid " % name
|
||||||
del(config_data['name'])
|
try:
|
||||||
self.pool_configs[name] = config_data
|
self.pools[name] = self._get_pool(**node.attrib)
|
||||||
|
except qubes.exc.QubesException as e:
|
||||||
|
self.log.error(e.message)
|
||||||
|
|
||||||
# stage 2: load VMs
|
# stage 2: load VMs
|
||||||
for node in self.xml.xpath('./domains/domain'):
|
for node in self.xml.xpath('./domains/domain'):
|
||||||
@ -1400,7 +1400,9 @@ class Qubes(PropertyHolder):
|
|||||||
7: Label(7, '0x75507b', 'purple'),
|
7: Label(7, '0x75507b', 'purple'),
|
||||||
8: Label(8, '0x000000', 'black'),
|
8: Label(8, '0x000000', 'black'),
|
||||||
}
|
}
|
||||||
self.pool_configs['default'] = qubes.config.defaults['pool_config']
|
for name, config in qubes.config.defaults['pool_configs'].items():
|
||||||
|
self.pools[name] = self._get_pool(**config)
|
||||||
|
|
||||||
self.domains.add(
|
self.domains.add(
|
||||||
qubes.vm.adminvm.AdminVM(self, None, qid=0, name='dom0'))
|
qubes.vm.adminvm.AdminVM(self, None, qid=0, name='dom0'))
|
||||||
self.save()
|
self.save()
|
||||||
@ -1421,12 +1423,12 @@ class Qubes(PropertyHolder):
|
|||||||
|
|
||||||
def xml_pool_configs(self):
|
def xml_pool_configs(self):
|
||||||
""" Helper for converting pools config to xml """
|
""" Helper for converting pools config to xml """
|
||||||
pools = lxml.etree.Element('pools')
|
pools_xml = lxml.etree.Element('pools')
|
||||||
for config_data in self.pool_configs.values():
|
for pool in self.pools.values():
|
||||||
p = lxml.etree.Element('pool', **config_data)
|
p = lxml.etree.Element('pool', **pool.config)
|
||||||
pools.append(p)
|
pools_xml.append(p)
|
||||||
|
|
||||||
return pools
|
return pools_xml
|
||||||
|
|
||||||
def get_vm_class(self, clsname):
|
def get_vm_class(self, clsname):
|
||||||
'''Find the class for a domain.
|
'''Find the class for a domain.
|
||||||
@ -1487,6 +1489,48 @@ class Qubes(PropertyHolder):
|
|||||||
|
|
||||||
raise KeyError(label)
|
raise KeyError(label)
|
||||||
|
|
||||||
|
def add_pool(self, **kwargs):
|
||||||
|
""" Add a storage pool to config."""
|
||||||
|
name = kwargs['name']
|
||||||
|
self.pools[name] = self._get_pool(**kwargs)
|
||||||
|
self.save()
|
||||||
|
|
||||||
|
def remove_pool(self, name):
|
||||||
|
""" Remove a storage pool from config file. """
|
||||||
|
try:
|
||||||
|
del self.pools[name]
|
||||||
|
except KeyError:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.save()
|
||||||
|
|
||||||
|
def get_pool(self, name):
|
||||||
|
''' Returns a :py:class:`qubes.storage.Pool` instance '''
|
||||||
|
try:
|
||||||
|
return self.pools[name]
|
||||||
|
except KeyError:
|
||||||
|
raise qubes.exc.QubesException('Unknown storage pool ' + name)
|
||||||
|
|
||||||
|
def _get_pool(self, **kwargs):
|
||||||
|
try:
|
||||||
|
name = kwargs['name']
|
||||||
|
assert name, 'Name needs to be an non empty string'
|
||||||
|
except KeyError:
|
||||||
|
raise qubes.exc.QubesException('No pool name for pool')
|
||||||
|
|
||||||
|
try:
|
||||||
|
driver = kwargs['driver']
|
||||||
|
except KeyError:
|
||||||
|
raise qubes.exc.QubesException('No driver specified for pool ' +
|
||||||
|
name)
|
||||||
|
try:
|
||||||
|
klass = qubes.get_entry_point_one(
|
||||||
|
qubes.storage.STORAGE_ENTRY_POINT, driver)
|
||||||
|
del kwargs['driver']
|
||||||
|
return klass(**kwargs)
|
||||||
|
except KeyError:
|
||||||
|
raise qubes.exc.QubesException('Driver %s for pool %s' %
|
||||||
|
(driver, name))
|
||||||
|
|
||||||
@qubes.events.handler('domain-pre-delete')
|
@qubes.events.handler('domain-pre-delete')
|
||||||
def on_domain_pre_deleted(self, event, vm):
|
def on_domain_pre_deleted(self, event, vm):
|
||||||
|
@ -28,7 +28,6 @@
|
|||||||
|
|
||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
|
||||||
import ConfigParser
|
|
||||||
import os
|
import os
|
||||||
import os.path
|
import os.path
|
||||||
import shutil
|
import shutil
|
||||||
@ -40,7 +39,6 @@ import qubes.exc
|
|||||||
import qubes.utils
|
import qubes.utils
|
||||||
|
|
||||||
BLKSIZE = 512
|
BLKSIZE = 512
|
||||||
CONFIG_FILE = '/etc/qubes/storage.conf'
|
|
||||||
STORAGE_ENTRY_POINT = 'qubes.storage'
|
STORAGE_ENTRY_POINT = 'qubes.storage'
|
||||||
|
|
||||||
|
|
||||||
@ -353,89 +351,6 @@ def get_disk_usage(path):
|
|||||||
|
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
def get_pool(name, vm):
|
|
||||||
""" Instantiates the storage for the specified vm """
|
|
||||||
config = _get_storage_config_parser()
|
|
||||||
|
|
||||||
klass = _get_pool_klass(name, config)
|
|
||||||
|
|
||||||
keys = [k for k in config.options(name) if k != 'driver' and k != 'class']
|
|
||||||
values = [config.get(name, o) for o in keys]
|
|
||||||
config_kwargs = dict(zip(keys, values))
|
|
||||||
|
|
||||||
if name == 'default':
|
|
||||||
kwargs = qubes.config.defaults['pool_config'].copy()
|
|
||||||
kwargs.update(keys)
|
|
||||||
else:
|
|
||||||
kwargs = config_kwargs
|
|
||||||
|
|
||||||
return klass(vm, **kwargs)
|
|
||||||
|
|
||||||
|
|
||||||
def pool_exists(name):
|
|
||||||
""" Check if the specified pool exists """
|
|
||||||
try:
|
|
||||||
_get_pool_klass(name)
|
|
||||||
return True
|
|
||||||
except StoragePoolException:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def add_pool(name, **kwargs):
|
|
||||||
""" Add a storage pool to config."""
|
|
||||||
config = _get_storage_config_parser()
|
|
||||||
config.add_section(name)
|
|
||||||
for key, value in kwargs.iteritems():
|
|
||||||
config.set(name, key, value)
|
|
||||||
_write_config(config)
|
|
||||||
|
|
||||||
def remove_pool(name):
|
|
||||||
""" Remove a storage pool from config file. """
|
|
||||||
config = _get_storage_config_parser()
|
|
||||||
config.remove_section(name)
|
|
||||||
_write_config(config)
|
|
||||||
|
|
||||||
def _write_config(config):
|
|
||||||
with open(CONFIG_FILE, 'w') as configfile:
|
|
||||||
config.write(configfile)
|
|
||||||
|
|
||||||
def _get_storage_config_parser():
|
|
||||||
""" Instantiates a `ConfigParaser` for specified storage config file.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
RawConfigParser
|
|
||||||
"""
|
|
||||||
config = ConfigParser.RawConfigParser()
|
|
||||||
config.read(CONFIG_FILE)
|
|
||||||
return config
|
|
||||||
|
|
||||||
|
|
||||||
def _get_pool_klass(name, config=None):
|
|
||||||
""" Returns the storage klass for the specified pool.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
name: The pool name.
|
|
||||||
config: If ``config`` is not specified
|
|
||||||
`_get_storage_config_parser()` is called.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
type: A class inheriting from `QubesVmStorage`
|
|
||||||
"""
|
|
||||||
if config is None:
|
|
||||||
config = _get_storage_config_parser()
|
|
||||||
|
|
||||||
if not config.has_section(name):
|
|
||||||
raise StoragePoolException('Uknown storage pool ' + name)
|
|
||||||
elif not config.has_option(name, 'driver'):
|
|
||||||
raise StoragePoolException('No driver specified for pool ' + name)
|
|
||||||
|
|
||||||
|
|
||||||
driver = config.get(name, 'driver')
|
|
||||||
try:
|
|
||||||
return qubes.get_entry_point_one(STORAGE_ENTRY_POINT, driver)
|
|
||||||
except KeyError:
|
|
||||||
raise StoragePoolException('Driver %s for pool %s' % (driver, name))
|
|
||||||
|
|
||||||
class Pool(object):
|
class Pool(object):
|
||||||
def __init__(self, vm, dir_path):
|
def __init__(self, vm, dir_path):
|
||||||
assert vm is not None
|
assert vm is not None
|
||||||
|
@ -197,7 +197,6 @@ fi
|
|||||||
%files
|
%files
|
||||||
%defattr(-,root,root,-)
|
%defattr(-,root,root,-)
|
||||||
%config(noreplace) %attr(0664,root,qubes) %{_sysconfdir}/qubes/qmemman.conf
|
%config(noreplace) %attr(0664,root,qubes) %{_sysconfdir}/qubes/qmemman.conf
|
||||||
%config(noreplace) %attr(0664,root,qubes) %{_sysconfdir}/qubes/storage.conf
|
|
||||||
/usr/bin/qvm-*
|
/usr/bin/qvm-*
|
||||||
/usr/bin/qubes-*
|
/usr/bin/qubes-*
|
||||||
/usr/bin/qmemmand
|
/usr/bin/qmemmand
|
||||||
|
Loading…
Reference in New Issue
Block a user