Fix container rescue/unrescue with lvm

Fix container resuce/unrescue with lvm.

Signed-off-by: Chuck Short <chuck.short@canonical.com>
This commit is contained in:
Chuck Short
2015-10-01 20:46:58 -04:00
parent 2e97a07ba8
commit bbc5944def
4 changed files with 53 additions and 43 deletions

View File

@@ -20,6 +20,7 @@ from nova import exception
from nova import i18n
from nova.virt import configdrive
from nova.virt import driver
import os
import pprint
from oslo_config import cfg
@@ -175,7 +176,15 @@ class LXDContainerConfig(object):
def configure_container_rescuedisk(self, container_config, instance):
LOG.debug('Creating LXD rescue disk')
rescue_path = self.container_dir.get_container_rescue(instance.name)
instance_name = '%s-backup' % instance.name
if self.container_dir.is_lvm(instance_name):
self.container_utils.mount_filesystem(
self.container_dir.get_container_lvm(instance_name),
(os.path.join(self.container_dir.get_container_dir(
instance), instance_name)))
rescue_path = self.container_dir.get_container_rescue(instance_name)
self.add_config(container_config, 'devices', 'rescue',
data={'path': 'mnt',
'source': rescue_path,

View File

@@ -281,8 +281,8 @@ class LXDContainerOperations(object):
utils.execute('chmod', '755',
os.path.join(
self.container_dir.get_container_dir(
instance.name), instance.name),
run_as_root=True)
instance.name), instance.name),
run_as_root=True)
with open(console_log, 'rb') as fp:
log_data, remaning = utils.last_bytes(fp,
MAX_CONSOLE_BYTES)

View File

@@ -16,12 +16,15 @@
from nova import exception
from nova import i18n
from nova import utils
import os
import container_client
from oslo_concurrency import processutils
from oslo_config import cfg
from oslo_log import log as logging
from oslo_utils import excutils
import six
_ = i18n._
@@ -247,6 +250,23 @@ class LXDContainerUtils(object):
{'instance': instance.name,
'reason': ex}, instance=instance)
def mount_filesystem(self, dev_path, dir_path):
try:
_out, err = utils.execute('mount',
'-t', 'ext4',
dev_path, dir_path, run_as_root=True)
except processutils.ProcessExecutionError as e:
err = six.text_type(e)
return err
def umount_filesystem(self, dir_path):
try:
_out, err = utils.execute('umount',
dir_path, run_as_root=True)
except processutils.ProcessExecutionError as e:
err = six.text_type(e)
return err
class LXDContainerDirectories(object):
@@ -299,7 +319,24 @@ class LXDContainerDirectories(object):
'rootfs')
def get_container_rescue(self, instance):
return os.path.join(CONF.lxd.root_dir,
'containers',
'%s-backup' % instance,
'rootfs')
if self.is_lvm(instance):
return os.path.join(CONF.lxd.root_dir,
'containers',
instance)
else:
return os.path.join(CONF.lxd.root_dir,
'containers',
instance,
'rootfs')
def get_container_lvm(self, instance):
return '%s/%s.lv' % (self.get_container_dir(instance),
instance)
def is_lvm(self, instance):
try:
if os.path.exists(os.readlink(
self.get_container_lvm(instance))):
return True
except Exception:
return False