summaryrefslogtreecommitdiff
path: root/trove/guestagent/datastore/mysql_common/service.py
diff options
context:
space:
mode:
authorLingxian Kong <anlin.kong@gmail.com>2020-08-26 00:36:19 +1200
committerLingxian Kong <anlin.kong@gmail.com>2020-09-01 13:58:05 +1200
commitd0cfb41b25ab600fef5708c3058c8057e38689b7 (patch)
tree42dac4977c934177127f0695af24c83b56572429 /trove/guestagent/datastore/mysql_common/service.py
parent8daade000cc242507429a762b0df1e167801144b (diff)
downloadtrove-d0cfb41b25ab600fef5708c3058c8057e38689b7.tar.gz
PostgreSQL support
Change-Id: I7c77b210f5a1438739daebffea104eda3bda1a45
Diffstat (limited to 'trove/guestagent/datastore/mysql_common/service.py')
-rw-r--r--trove/guestagent/datastore/mysql_common/service.py104
1 files changed, 17 insertions, 87 deletions
diff --git a/trove/guestagent/datastore/mysql_common/service.py b/trove/guestagent/datastore/mysql_common/service.py
index 1f51aa39..6e13380b 100644
--- a/trove/guestagent/datastore/mysql_common/service.py
+++ b/trove/guestagent/datastore/mysql_common/service.py
@@ -31,7 +31,6 @@ from trove.common import utils
from trove.common.configurations import MySQLConfParser
from trove.common.db.mysql import models
from trove.common.i18n import _
-from trove.common.stream_codecs import IniCodec
from trove.conductor import api as conductor_api
from trove.guestagent.common import guestagent_utils
from trove.guestagent.common import operating_system
@@ -39,7 +38,6 @@ from trove.guestagent.common import sql_query
from trove.guestagent.common.configuration import ConfigurationManager
from trove.guestagent.common.configuration import ImportOverrideStrategy
from trove.guestagent.datastore import service
-from trove.guestagent.datastore.mysql_common import service as commmon_service
from trove.guestagent.utils import docker as docker_util
from trove.guestagent.utils import mysql as mysql_util
from trove.instance import service_status
@@ -72,8 +70,7 @@ class BaseMySqlAppStatus(service.BaseDbStatus):
"""Check database service status."""
status = docker_util.get_container_status(self.docker_client)
if status == "running":
- root_pass = commmon_service.BaseMySqlApp.get_auth_password(
- file="root.cnf")
+ root_pass = service.BaseDbApp.get_auth_password(file="root.cnf")
cmd = 'mysql -uroot -p%s -e "select 1;"' % root_pass
try:
docker_util.run_command(self.docker_client, cmd)
@@ -87,6 +84,8 @@ class BaseMySqlAppStatus(service.BaseDbStatus):
return service_status.ServiceStatuses.RUNNING
elif status == "not running":
return service_status.ServiceStatuses.SHUTDOWN
+ elif status == "restarting":
+ return service_status.ServiceStatuses.SHUTDOWN
elif status == "paused":
return service_status.ServiceStatuses.PAUSED
elif status == "exited":
@@ -165,7 +164,7 @@ class BaseMySqlAdmin(object):
t = text(str(uu))
client.execute(t)
- def create_database(self, databases):
+ def create_databases(self, databases):
"""Create the list of specified databases."""
with mysql_util.SqlClient(self.mysql_app.get_engine()) as client:
for item in databases:
@@ -178,7 +177,7 @@ class BaseMySqlAdmin(object):
LOG.debug('Creating database, command: %s', str(cd))
client.execute(t)
- def create_user(self, users):
+ def create_users(self, users):
"""Create users and grant them privileges for the
specified databases.
"""
@@ -424,22 +423,13 @@ class BaseMySqlAdmin(object):
return user.databases
-@six.add_metaclass(abc.ABCMeta)
-class BaseMySqlApp(object):
- """Prepares DBaaS on a Guest container."""
-
- CFG_CODEC = IniCodec()
+class BaseMySqlApp(service.BaseDbApp):
configuration_manager = ConfigurationManager(
MYSQL_CONFIG, CONF.database_service_uid, CONF.database_service_uid,
- CFG_CODEC, requires_root=True,
+ service.BaseDbApp.CFG_CODEC, requires_root=True,
override_strategy=ImportOverrideStrategy(CNF_INCLUDE_DIR, CNF_EXT)
)
- def __init__(self, status, docker_client):
- """By default login with root no password for initial setup."""
- self.status = status
- self.docker_client = docker_client
-
def get_engine(self):
"""Create the default engine with the updated admin user.
@@ -471,12 +461,6 @@ class BaseMySqlApp(object):
return client.execute(sql_statement)
@classmethod
- def get_auth_password(cls, file="os_admin.cnf"):
- auth_config = operating_system.read_file(
- cls.get_client_auth_file(file), codec=cls.CFG_CODEC, as_root=True)
- return auth_config['client']['password']
-
- @classmethod
def get_data_dir(cls):
return cls.configuration_manager.get_value(
MySQLConfParser.SERVER_CONF_SECTION).get('datadir')
@@ -486,13 +470,6 @@ class BaseMySqlApp(object):
cls.configuration_manager.apply_system_override(
{MySQLConfParser.SERVER_CONF_SECTION: {'datadir': value}})
- @classmethod
- def get_client_auth_file(cls, file="os_admin.cnf"):
- # Save the password inside the mount point directory so we could
- # restore everyting when rebuilding the instance.
- conf_dir = guestagent_utils.get_conf_dir()
- return guestagent_utils.build_file_path(conf_dir, file)
-
def _create_admin_user(self, client, password):
"""
Create a os_admin user with a random password
@@ -520,16 +497,6 @@ class BaseMySqlApp(object):
client.execute(t)
LOG.info("Trove admin user '%s' created.", ADMIN_USER_NAME)
- @staticmethod
- def save_password(user, password):
- content = {'client': {'user': user,
- 'password': password,
- 'host': "localhost"}}
-
- conf_dir = guestagent_utils.get_conf_dir()
- operating_system.write_file(
- f'{conf_dir}/{user}.cnf', content, codec=IniCodec(), as_root=True)
-
def secure(self):
LOG.info("Securing MySQL now.")
@@ -572,9 +539,6 @@ class BaseMySqlApp(object):
self.configuration_manager.apply_user_override(
{MySQLConfParser.SERVER_CONF_SECTION: overrides})
- def remove_overrides(self):
- self.configuration_manager.remove_user_override()
-
def apply_overrides(self, overrides):
LOG.info("Applying overrides to running MySQL, overrides: %s",
overrides)
@@ -608,7 +572,7 @@ class BaseMySqlApp(object):
# Create folders for mysql on localhost
for folder in ['/etc/mysql', '/var/run/mysqld']:
- operating_system.create_directory(
+ operating_system.ensure_directory(
folder, user=CONF.database_service_uid,
group=CONF.database_service_uid, force=True,
as_root=True)
@@ -644,37 +608,12 @@ class BaseMySqlApp(object):
LOG.exception("Failed to start mysql")
raise exception.TroveError(_("Failed to start mysql"))
- if not self.status.wait_for_real_status_to_change_to(
+ if not self.status.wait_for_status(
service_status.ServiceStatuses.HEALTHY,
CONF.state_change_wait_time, update_db
):
raise exception.TroveError(_("Failed to start mysql"))
- def start_db_with_conf_changes(self, config_contents, ds_version):
- LOG.info(f"Starting database service with new configuration and "
- f"datastore version {ds_version}.")
-
- if self.status.is_running:
- LOG.info("Stopping MySQL before applying changes.")
- self.stop_db()
-
- self._reset_configuration(config_contents)
- self.start_db(update_db=True, ds_version=ds_version)
-
- def stop_db(self, update_db=False):
- LOG.info("Stopping MySQL.")
-
- try:
- docker_util.stop_container(self.docker_client)
- except Exception:
- LOG.exception("Failed to stop mysql")
- raise exception.TroveError("Failed to stop mysql")
-
- if not self.status.wait_for_real_status_to_change_to(
- service_status.ServiceStatuses.SHUTDOWN,
- CONF.state_change_wait_time, update_db):
- raise exception.TroveError("Failed to stop mysql")
-
def wipe_ib_logfiles(self):
"""Destroys the iblogfiles.
@@ -695,23 +634,17 @@ class BaseMySqlApp(object):
LOG.exception("Could not delete logfile.")
raise
- def _reset_configuration(self, configuration, admin_password=None):
- self.configuration_manager.save_configuration(configuration)
- if admin_password:
- self.save_password(ADMIN_USER_NAME, admin_password)
- self.wipe_ib_logfiles()
-
def reset_configuration(self, configuration):
- config_contents = configuration['config_contents']
LOG.info("Resetting configuration.")
- self._reset_configuration(config_contents)
+ self.configuration_manager.save_configuration(configuration)
+ self.wipe_ib_logfiles()
def restart(self):
LOG.info("Restarting mysql")
# Ensure folders permission for database.
for folder in ['/etc/mysql', '/var/run/mysqld']:
- operating_system.create_directory(
+ operating_system.ensure_directory(
folder, user=CONF.database_service_uid,
group=CONF.database_service_uid, force=True,
as_root=True)
@@ -722,9 +655,10 @@ class BaseMySqlApp(object):
LOG.exception("Failed to restart mysql")
raise exception.TroveError("Failed to restart mysql")
- if not self.status.wait_for_real_status_to_change_to(
+ if not self.status.wait_for_status(
service_status.ServiceStatuses.HEALTHY,
- CONF.state_change_wait_time, update_db=False):
+ CONF.state_change_wait_time, update_db=False
+ ):
raise exception.TroveError("Failed to start mysql")
LOG.info("Finished restarting mysql")
@@ -754,14 +688,10 @@ class BaseMySqlApp(object):
f'datastore:{backup_info["datastore"]},'
f'datastore_version:{backup_info["datastore_version"]}'
)
- swift_params = f'--swift-extra-metadata={swift_metadata}'
swift_container = backup_info.get('swift_container',
CONF.backup_swift_container)
- if backup_info.get('swift_container'):
- swift_params = (
- f'{swift_params} '
- f'--swift-container {swift_container}'
- )
+ swift_params = (f'--swift-extra-metadata={swift_metadata} '
+ f'--swift-container {swift_container}')
command = (
f'/usr/bin/python3 main.py --backup --backup-id={backup_id} '