Merge "Changing file owner when upgrading mariadb"
This commit is contained in:
commit
d5d84653cf
@ -16,6 +16,7 @@
|
|||||||
import inspect
|
import inspect
|
||||||
import operator
|
import operator
|
||||||
import os
|
import os
|
||||||
|
import pwd
|
||||||
import re
|
import re
|
||||||
import stat
|
import stat
|
||||||
import tempfile
|
import tempfile
|
||||||
@ -861,3 +862,8 @@ def is_mount(path):
|
|||||||
directory_dev = get_device(path, as_root=True)
|
directory_dev = get_device(path, as_root=True)
|
||||||
parent_dev = get_device(os.path.join(path, '..'), as_root=True)
|
parent_dev = get_device(os.path.join(path, '..'), as_root=True)
|
||||||
return directory_dev != parent_dev
|
return directory_dev != parent_dev
|
||||||
|
|
||||||
|
|
||||||
|
def get_current_user():
|
||||||
|
"""Returns name of the current OS user"""
|
||||||
|
return pwd.getpwuid(os.getuid())[0]
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
import abc
|
import abc
|
||||||
import operator
|
import operator
|
||||||
|
import os
|
||||||
|
|
||||||
from oslo_config import cfg as oslo_cfg
|
from oslo_config import cfg as oslo_cfg
|
||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
@ -409,6 +410,21 @@ class Manager(periodic_task.PeriodicTasks):
|
|||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def _restore_directory(self, restore_dir, target_dir, owner=None):
|
||||||
|
restore_path = os.path.join(restore_dir, ".")
|
||||||
|
operating_system.copy(restore_path, target_dir,
|
||||||
|
preserve=True, as_root=True)
|
||||||
|
if owner is not None:
|
||||||
|
operating_system.chown(path=target_dir, user=owner, group=owner,
|
||||||
|
recursive=True, as_root=True)
|
||||||
|
|
||||||
|
def _restore_home_directory(self, saved_home_dir):
|
||||||
|
home_dir = os.path.expanduser("~")
|
||||||
|
home_owner = operating_system.get_current_user()
|
||||||
|
self._restore_directory(restore_dir=saved_home_dir,
|
||||||
|
target_dir=home_dir,
|
||||||
|
owner=home_owner)
|
||||||
|
|
||||||
#################
|
#################
|
||||||
# Service related
|
# Service related
|
||||||
#################
|
#################
|
||||||
|
@ -278,17 +278,20 @@ class MySqlManager(manager.Manager):
|
|||||||
self.mount_volume(context, mount_point=upgrade_info['mount_point'],
|
self.mount_volume(context, mount_point=upgrade_info['mount_point'],
|
||||||
device_path=upgrade_info['device'],
|
device_path=upgrade_info['device'],
|
||||||
write_to_fstab=True)
|
write_to_fstab=True)
|
||||||
|
operating_system.chown(path=upgrade_info['mount_point'],
|
||||||
|
user=service.MYSQL_OWNER,
|
||||||
|
group=service.MYSQL_OWNER,
|
||||||
|
recursive=True, as_root=True)
|
||||||
|
|
||||||
|
self._restore_home_directory(upgrade_info['home_save'])
|
||||||
|
|
||||||
if operating_system.exists(upgrade_info['save_etc_dir'],
|
if operating_system.exists(upgrade_info['save_etc_dir'],
|
||||||
is_directory=True, as_root=True):
|
is_directory=True, as_root=True):
|
||||||
operating_system.copy("%s/." % upgrade_info['save_etc_dir'],
|
self._restore_directory(upgrade_info['save_etc_dir'], "/etc")
|
||||||
"/etc", preserve=True, as_root=True)
|
|
||||||
|
self._restore_directory("%s/." % upgrade_info['save_dir'],
|
||||||
|
"/etc/mysql")
|
||||||
|
|
||||||
operating_system.copy("%s/." % upgrade_info['save_dir'], "/etc/mysql",
|
|
||||||
preserve=True, as_root=True)
|
|
||||||
operating_system.copy("%s/." % upgrade_info['home_save'],
|
|
||||||
os.path.expanduser('~'),
|
|
||||||
preserve=True, as_root=True)
|
|
||||||
self.configuration_manager.refresh_cache()
|
self.configuration_manager.refresh_cache()
|
||||||
app.start_mysql()
|
app.start_mysql()
|
||||||
app.status.end_restart()
|
app.status.end_restart()
|
||||||
|
@ -81,9 +81,10 @@ class BaseDbStatus(object):
|
|||||||
# Set the value of __prepared_completed based on the existence of
|
# Set the value of __prepared_completed based on the existence of
|
||||||
# the file. This is required as the state is cached so this method
|
# the file. This is required as the state is cached so this method
|
||||||
# must be called any time the existence of the file changes.
|
# must be called any time the existence of the file changes.
|
||||||
self.__prepare_completed = os.path.isfile(
|
is_file = os.path.isfile(
|
||||||
guestagent_utils.build_file_path(
|
guestagent_utils.build_file_path(
|
||||||
self.GUESTAGENT_DIR, self.PREPARE_END_FILENAME))
|
self.GUESTAGENT_DIR, self.PREPARE_END_FILENAME))
|
||||||
|
self.__prepare_completed = is_file if is_file else None
|
||||||
|
|
||||||
def begin_install(self):
|
def begin_install(self):
|
||||||
"""First call of the DB prepare."""
|
"""First call of the DB prepare."""
|
||||||
|
@ -484,6 +484,42 @@ class ManagerTest(trove_testtools.TestCase):
|
|||||||
error_occurred=True,
|
error_occurred=True,
|
||||||
post_processing=ANY)
|
post_processing=ANY)
|
||||||
|
|
||||||
|
@patch.object(operating_system, 'copy')
|
||||||
|
@patch.object(operating_system, 'chown')
|
||||||
|
def test_restore_directory_with_owner(self, chown_mock, copy_mock):
|
||||||
|
restore_dir = '/restore_directory'
|
||||||
|
restore_files = '/restore_directory/.'
|
||||||
|
target_dir = '/target_directory'
|
||||||
|
owner = 'owner'
|
||||||
|
self.manager._restore_directory(restore_dir, target_dir, owner)
|
||||||
|
copy_mock.assert_called_once_with(restore_files, target_dir,
|
||||||
|
preserve=True, as_root=True)
|
||||||
|
chown_mock.assert_called_once_with(path=target_dir, user=owner,
|
||||||
|
group=owner, recursive=True,
|
||||||
|
as_root=True)
|
||||||
|
|
||||||
|
@patch.object(operating_system, 'copy')
|
||||||
|
@patch.object(operating_system, 'chown')
|
||||||
|
def test_restore_directory_without_owner(self, chown_mock, copy_mock):
|
||||||
|
restore_dir = '/restore_directory'
|
||||||
|
restore_files = '/restore_directory/.'
|
||||||
|
target_dir = '/target_directory'
|
||||||
|
self.manager._restore_directory(restore_dir, target_dir)
|
||||||
|
copy_mock.assert_called_once_with(restore_files, target_dir,
|
||||||
|
preserve=True, as_root=True)
|
||||||
|
chown_mock.assert_not_called()
|
||||||
|
|
||||||
|
@patch.object(manager.Manager, '_restore_directory')
|
||||||
|
@patch.object(operating_system, 'get_current_user', return_value='trove')
|
||||||
|
def test_restore_home_directory(self, os_mock, restore_mock):
|
||||||
|
saved_home_dir = '/old_home'
|
||||||
|
with patch.object(os.path, 'expanduser', return_value='/home/trove'):
|
||||||
|
self.manager._restore_home_directory(saved_home_dir)
|
||||||
|
os_mock.assert_any_call()
|
||||||
|
restore_mock.assert_called_once_with(restore_dir=saved_home_dir,
|
||||||
|
target_dir='/home/trove',
|
||||||
|
owner='trove')
|
||||||
|
|
||||||
def test_module_list(self):
|
def test_module_list(self):
|
||||||
with patch.object(module_manager.ModuleManager, 'read_module_results',
|
with patch.object(module_manager.ModuleManager, 'read_module_results',
|
||||||
return_value=[
|
return_value=[
|
||||||
|
Loading…
Reference in New Issue
Block a user