Merge "Add Datastore Version Registry Extension"
This commit is contained in:
commit
e19a7d4e50
|
@ -202,6 +202,8 @@ trove-manage datastore_version_update
|
||||||
datastore version_name manager
|
datastore version_name manager
|
||||||
image_id packages active
|
image_id packages active
|
||||||
--image-tags <image_tags>
|
--image-tags <image_tags>
|
||||||
|
--registry-ext <registry_ext>
|
||||||
|
--repl-strategy <repl_strategy>
|
||||||
|
|
||||||
Add or update a datastore version. If the datastore version already exists,
|
Add or update a datastore version. If the datastore version already exists,
|
||||||
all values except the datastore name and version will be updated.
|
all values except the datastore name and version will be updated.
|
||||||
|
@ -240,6 +242,14 @@ all values except the datastore name and version will be updated.
|
||||||
than ID especially when new guest image is uploaded to Glance, Trove can pick
|
than ID especially when new guest image is uploaded to Glance, Trove can pick
|
||||||
up the latest image automatically for creating instances.
|
up the latest image automatically for creating instances.
|
||||||
|
|
||||||
|
``--registry-ext``
|
||||||
|
Extension for default datastore version managers. Allows the use of custom managers
|
||||||
|
for each of the datastore versions supported by Trove.
|
||||||
|
|
||||||
|
``--repl-strategy``
|
||||||
|
Extension for default strategy for replication. Allows the use of custom
|
||||||
|
replication strategy for each of the datastores supported by Trove.
|
||||||
|
|
||||||
trove-manage db_downgrade
|
trove-manage db_downgrade
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
features:
|
||||||
|
- Users with the administrator role can configure the datastore registry external
|
||||||
|
for each datastore version using a command, without editing configuration files.
|
||||||
|
|
|
@ -28,14 +28,21 @@ from trove.guestagent import volume
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
# The guest_id opt definition must match the one in common/cfg.py
|
# The guest_id opt definition must match the one in common/cfg.py
|
||||||
CONF.register_opts([openstack_cfg.StrOpt('guest_id', default=None,
|
CONF.register_opts([
|
||||||
help="ID of the Guest Instance."),
|
openstack_cfg.StrOpt('guest_id', default=None,
|
||||||
openstack_cfg.StrOpt('instance_rpc_encr_key',
|
help="ID of the Guest Instance."),
|
||||||
help=('Key (OpenSSL aes_cbc) for '
|
openstack_cfg.StrOpt('instance_rpc_encr_key',
|
||||||
'instance RPC encryption.')),
|
help=('Key (OpenSSL aes_cbc) for '
|
||||||
openstack_cfg.BoolOpt('network_isolation',
|
'instance RPC encryption.')),
|
||||||
help='whether to plug user defined '
|
openstack_cfg.BoolOpt('network_isolation',
|
||||||
'port to database container')])
|
help='whether to plug user defined '
|
||||||
|
'port to database container'),
|
||||||
|
openstack_cfg.StrOpt('replication_strategy',
|
||||||
|
default='trove.guestagent.strategies.replication.'
|
||||||
|
'mysql_gtid.MysqlGTIDReplication',
|
||||||
|
help='Namespace to load replication strategies from.')
|
||||||
|
])
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
@ -61,7 +68,7 @@ def main():
|
||||||
|
|
||||||
if not CONF.guest_id:
|
if not CONF.guest_id:
|
||||||
msg = (_("The guest_id parameter is not set. guest_info.conf "
|
msg = (_("The guest_id parameter is not set. guest_info.conf "
|
||||||
"was not injected into the guest or not read by guestagent"))
|
"was not injected into the guest or not read by guestagent"))
|
||||||
raise RuntimeError(msg)
|
raise RuntimeError(msg)
|
||||||
if CONF.network_isolation:
|
if CONF.network_isolation:
|
||||||
# disable user-defined port to avoid potential default gateway
|
# disable user-defined port to avoid potential default gateway
|
||||||
|
|
|
@ -62,16 +62,19 @@ class Commands(object):
|
||||||
print(e)
|
print(e)
|
||||||
|
|
||||||
def datastore_version_update(self, datastore, version_name, manager,
|
def datastore_version_update(self, datastore, version_name, manager,
|
||||||
image_id, packages, active, image_tags=None,
|
image_id, packages, active, registry_ext,
|
||||||
version=None):
|
repl_strategy,
|
||||||
|
image_tags=None, version=None):
|
||||||
try:
|
try:
|
||||||
datastore_models.update_datastore_version(datastore,
|
datastore_models.update_datastore_version(
|
||||||
version_name,
|
datastore,
|
||||||
manager,
|
version_name,
|
||||||
image_id,
|
manager,
|
||||||
image_tags,
|
image_id,
|
||||||
packages, active,
|
image_tags,
|
||||||
version=version)
|
packages, active,
|
||||||
|
registry_ext, repl_strategy,
|
||||||
|
version=version)
|
||||||
print("Datastore version '%s(%s)' updated." %
|
print("Datastore version '%s(%s)' updated." %
|
||||||
(version_name, version or version_name))
|
(version_name, version or version_name))
|
||||||
except exception.DatastoreNotFound as e:
|
except exception.DatastoreNotFound as e:
|
||||||
|
@ -251,6 +254,16 @@ def main():
|
||||||
'image_id',
|
'image_id',
|
||||||
help='ID of the image used to create an instance of '
|
help='ID of the image used to create an instance of '
|
||||||
'the datastore version.')
|
'the datastore version.')
|
||||||
|
parser.add_argument(
|
||||||
|
'--registry-ext',
|
||||||
|
help='Extension for default datastore managers. '
|
||||||
|
'Allows the use of custom managers for each of '
|
||||||
|
'the datastores supported by Trove.')
|
||||||
|
parser.add_argument(
|
||||||
|
'--repl-strategy',
|
||||||
|
help='Extension for default strategy for replication. '
|
||||||
|
'Allows the use of custom managers for each of '
|
||||||
|
'the datastores supported by Trove.')
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'packages', help='Packages required by the datastore version that '
|
'packages', help='Packages required by the datastore version that '
|
||||||
'are installed on the guest image.')
|
'are installed on the guest image.')
|
||||||
|
|
|
@ -993,6 +993,8 @@ mgmt_datastore_version = {
|
||||||
"packages": package_list,
|
"packages": package_list,
|
||||||
"image": uuid,
|
"image": uuid,
|
||||||
"image_tags": image_tags,
|
"image_tags": image_tags,
|
||||||
|
"registry_ext": non_empty_string,
|
||||||
|
"repl_strategy": non_empty_string,
|
||||||
"active": {"enum": [True, False]},
|
"active": {"enum": [True, False]},
|
||||||
"default": {"enum": [True, False]},
|
"default": {"enum": [True, False]},
|
||||||
"version": non_empty_string
|
"version": non_empty_string
|
||||||
|
@ -1010,6 +1012,8 @@ mgmt_datastore_version = {
|
||||||
"packages": package_list,
|
"packages": package_list,
|
||||||
"image": uuid,
|
"image": uuid,
|
||||||
"image_tags": image_tags,
|
"image_tags": image_tags,
|
||||||
|
"registry_ext": non_empty_string,
|
||||||
|
"repl_strategy": non_empty_string,
|
||||||
"active": {"enum": [True, False]},
|
"active": {"enum": [True, False]},
|
||||||
"default": {"enum": [True, False]},
|
"default": {"enum": [True, False]},
|
||||||
"name": non_empty_string
|
"name": non_empty_string
|
||||||
|
|
|
@ -534,7 +534,7 @@ common_opts = [
|
||||||
cfg.BoolOpt(
|
cfg.BoolOpt(
|
||||||
'enable_volume_az', default=False,
|
'enable_volume_az', default=False,
|
||||||
help='If true create the volume in the same availability-zone as the '
|
help='If true create the volume in the same availability-zone as the '
|
||||||
'instance'),
|
'instance')
|
||||||
]
|
]
|
||||||
|
|
||||||
# Mysql
|
# Mysql
|
||||||
|
|
|
@ -20,3 +20,30 @@ DOCKER_HOST_NIC_MODE = "docker-hostnic"
|
||||||
DOCKER_BRIDGE_MODE = "bridge"
|
DOCKER_BRIDGE_MODE = "bridge"
|
||||||
MYSQL_HOST_SOCKET_PATH = "/var/lib/mysqld"
|
MYSQL_HOST_SOCKET_PATH = "/var/lib/mysqld"
|
||||||
POSTGRESQL_HOST_SOCKET_PATH = "/var/lib/postgresql-socket"
|
POSTGRESQL_HOST_SOCKET_PATH = "/var/lib/postgresql-socket"
|
||||||
|
|
||||||
|
REGISTRY_EXT_DEFAULTS = {
|
||||||
|
'mysql':
|
||||||
|
'trove.guestagent.datastore.mysql.manager.Manager',
|
||||||
|
'mariadb':
|
||||||
|
'trove.guestagent.datastore.mariadb.manager.Manager',
|
||||||
|
'postgresql':
|
||||||
|
'trove.guestagent.datastore.postgres.manager.PostgresManager',
|
||||||
|
'percona':
|
||||||
|
'trove.guestagent.datastore.experimental.percona.manager.Manager',
|
||||||
|
'pxc':
|
||||||
|
'trove.guestagent.datastore.experimental.pxc.manager.Manager',
|
||||||
|
'redis':
|
||||||
|
'trove.guestagent.datastore.experimental.redis.manager.Manager',
|
||||||
|
'cassandra':
|
||||||
|
'trove.guestagent.datastore.experimental.cassandra.manager.Manager',
|
||||||
|
'couchbase':
|
||||||
|
'trove.guestagent.datastore.experimental.couchbase.manager.Manager',
|
||||||
|
'mongodb':
|
||||||
|
'trove.guestagent.datastore.experimental.mongodb.manager.Manager',
|
||||||
|
'couchdb':
|
||||||
|
'trove.guestagent.datastore.experimental.couchdb.manager.Manager',
|
||||||
|
'vertica':
|
||||||
|
'trove.guestagent.datastore.experimental.vertica.manager.Manager',
|
||||||
|
'db2':
|
||||||
|
'trove.guestagent.datastore.experimental.db2.manager.Manager',
|
||||||
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ from oslo_utils import uuidutils
|
||||||
|
|
||||||
from trove.common import cfg
|
from trove.common import cfg
|
||||||
from trove.common.clients import create_nova_client
|
from trove.common.clients import create_nova_client
|
||||||
|
from trove.common import constants
|
||||||
from trove.common import exception
|
from trove.common import exception
|
||||||
from trove.common.i18n import _
|
from trove.common.i18n import _
|
||||||
from trove.common import timeutils
|
from trove.common import timeutils
|
||||||
|
@ -212,6 +213,7 @@ class CapabilityOverride(BaseCapability):
|
||||||
specific datastore version that overrides the default setting in the
|
specific datastore version that overrides the default setting in the
|
||||||
base capability's entry for Trove.
|
base capability's entry for Trove.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, db_info):
|
def __init__(self, db_info):
|
||||||
super(CapabilityOverride, self).__init__(db_info)
|
super(CapabilityOverride, self).__init__(db_info)
|
||||||
# This *may* be better solved with a join in the SQLAlchemy model but
|
# This *may* be better solved with a join in the SQLAlchemy model but
|
||||||
|
@ -467,6 +469,14 @@ class DatastoreVersion(object):
|
||||||
def packages(self):
|
def packages(self):
|
||||||
return self.db_info.packages
|
return self.db_info.packages
|
||||||
|
|
||||||
|
@property
|
||||||
|
def registry_ext(self):
|
||||||
|
return self.db_info.registry_ext
|
||||||
|
|
||||||
|
@property
|
||||||
|
def repl_strategy(self):
|
||||||
|
return self.db_info.repl_strategy
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def active(self):
|
def active(self):
|
||||||
return (True if self.db_info.active else False)
|
return (True if self.db_info.active else False)
|
||||||
|
@ -600,7 +610,8 @@ def update_datastore(name, default_version):
|
||||||
|
|
||||||
|
|
||||||
def update_datastore_version(datastore, name, manager, image_id, image_tags,
|
def update_datastore_version(datastore, name, manager, image_id, image_tags,
|
||||||
packages, active, version=None, new_name=None):
|
packages, active, registry_ext=None,
|
||||||
|
repl_strategy=None, version=None, new_name=None):
|
||||||
"""Create or update datastore version."""
|
"""Create or update datastore version."""
|
||||||
version = version or name
|
version = version or name
|
||||||
db_api.configure_db(CONF)
|
db_api.configure_db(CONF)
|
||||||
|
@ -622,6 +633,16 @@ def update_datastore_version(datastore, name, manager, image_id, image_tags,
|
||||||
if type(image_tags) is list else image_tags)
|
if type(image_tags) is list else image_tags)
|
||||||
ds_version.packages = packages
|
ds_version.packages = packages
|
||||||
ds_version.active = active
|
ds_version.active = active
|
||||||
|
if not registry_ext:
|
||||||
|
registry_ext = constants.REGISTRY_EXT_DEFAULTS.get(manager)
|
||||||
|
ds_version.registry_ext = registry_ext
|
||||||
|
|
||||||
|
if not repl_strategy:
|
||||||
|
repl_strategy = "%(repl_namespace)s.%(repl_strategy)s" % {
|
||||||
|
'repl_namespace': CONF.get(manager).replication_namespace,
|
||||||
|
'repl_strategy': CONF.get(manager).replication_strategy
|
||||||
|
}
|
||||||
|
ds_version.repl_strategy = repl_strategy
|
||||||
|
|
||||||
db_api.save(ds_version)
|
db_api.save(ds_version)
|
||||||
|
|
||||||
|
|
|
@ -84,14 +84,17 @@ class DatastoreVersionView(object):
|
||||||
"links": self._build_links(),
|
"links": self._build_links(),
|
||||||
}
|
}
|
||||||
if include_datastore_id:
|
if include_datastore_id:
|
||||||
datastore_version_dict["datastore"] = (self.datastore_version.
|
datastore_version_dict["datastore"] = (
|
||||||
datastore_id)
|
self.datastore_version.datastore_id)
|
||||||
if self.context.is_admin:
|
if self.context.is_admin:
|
||||||
datastore_version_dict['active'] = self.datastore_version.active
|
datastore_version_dict['active'] = self.datastore_version.active
|
||||||
datastore_version_dict['packages'] = (self.datastore_version.
|
datastore_version_dict['packages'] = (
|
||||||
packages)
|
self.datastore_version.packages)
|
||||||
datastore_version_dict['image'] = self.datastore_version.image_id
|
datastore_version_dict['image'] = self.datastore_version.image_id
|
||||||
|
datastore_version_dict[
|
||||||
|
'registry_ext'] = self.datastore_version.registry_ext
|
||||||
|
datastore_version_dict[
|
||||||
|
'repl_strategy'] = self.datastore_version.repl_strategy
|
||||||
image_tags = []
|
image_tags = []
|
||||||
if self.datastore_version.image_tags:
|
if self.datastore_version.image_tags:
|
||||||
image_tags = self.datastore_version.image_tags.split(',')
|
image_tags = self.datastore_version.image_tags.split(',')
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
# Copyright 2023 Bizfly Cloud
|
||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from sqlalchemy.schema import Column
|
||||||
|
from sqlalchemy.schema import MetaData
|
||||||
|
from sqlalchemy.sql.expression import select
|
||||||
|
from sqlalchemy.sql.expression import update
|
||||||
|
from sqlalchemy import text
|
||||||
|
|
||||||
|
from trove.common.constants import REGISTRY_EXT_DEFAULTS
|
||||||
|
from trove.db.sqlalchemy.migrate_repo.schema import Table
|
||||||
|
from trove.db.sqlalchemy.migrate_repo.schema import Text
|
||||||
|
|
||||||
|
|
||||||
|
repl_namespaces = {
|
||||||
|
"mariadb": "trove.guestagent.strategies.replication.mariadb_gtid",
|
||||||
|
"mongodb":
|
||||||
|
"trove.guestagent.strategies.replication.experimental.mongo_impl",
|
||||||
|
"mysql": "trove.guestagent.strategies.replication.mysql_gtid",
|
||||||
|
"percona": "trove.guestagent.strategies.replication.mysql_gtid",
|
||||||
|
"postgresql": "trove.guestagent.strategies.replication.postgresql",
|
||||||
|
"pxc": "trove.guestagent.strategies.replication.mysql_gtid",
|
||||||
|
"redis": "trove.guestagent.strategies.replication.experimental.redis_sync",
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
repl_strategies = {
|
||||||
|
"mariadb": "MariaDBGTIDReplication",
|
||||||
|
"mongodb": "Replication",
|
||||||
|
"mysql": "MysqlGTIDReplication",
|
||||||
|
"percona": "MysqlGTIDReplication",
|
||||||
|
"postgresql": "PostgresqlReplicationStreaming",
|
||||||
|
"pxc": "MysqlGTIDReplication",
|
||||||
|
"redis": "RedisSyncReplication",
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade(migrate_engine):
|
||||||
|
meta = MetaData()
|
||||||
|
meta.bind = migrate_engine
|
||||||
|
|
||||||
|
ds_version = Table('datastore_versions', meta, autoload=True)
|
||||||
|
ds_version.create_column(Column('registry_ext', Text(), nullable=True))
|
||||||
|
ds_version.create_column(Column('repl_strategy', Text(), nullable=True))
|
||||||
|
|
||||||
|
ds_versions = select(
|
||||||
|
columns=[text("id"), text("manager")],
|
||||||
|
from_obj=ds_version
|
||||||
|
).execute()
|
||||||
|
# Use 'name' value as init 'version' value
|
||||||
|
for version in ds_versions:
|
||||||
|
registry_ext = REGISTRY_EXT_DEFAULTS.get(version.manager, '')
|
||||||
|
repl_strategy = "%(repl_namespace)s.%(repl_strategy)s" % {
|
||||||
|
'repl_namespace': repl_namespaces.get(version.manager, ''),
|
||||||
|
'repl_strategy': repl_strategies.get(version.manager, '')
|
||||||
|
}
|
||||||
|
update(
|
||||||
|
table=ds_version,
|
||||||
|
whereclause=text("id='%s'" % version.id),
|
||||||
|
values=dict(
|
||||||
|
registry_ext=registry_ext,
|
||||||
|
repl_strategy=repl_strategy)
|
||||||
|
).execute()
|
||||||
|
|
||||||
|
ds_version.c.registry_ext.alter(nullable=False)
|
||||||
|
ds_version.c.repl_strategy.alter(nullable=False)
|
|
@ -52,6 +52,8 @@ class DatastoreVersionController(wsgi.Controller):
|
||||||
# For backward compatibility, use name as default value for version if
|
# For backward compatibility, use name as default value for version if
|
||||||
# not specified
|
# not specified
|
||||||
version_str = body['version'].get('version', version_name)
|
version_str = body['version'].get('version', version_name)
|
||||||
|
registry_ext = body['version'].get('registry_ext')
|
||||||
|
repl_strategy = body['version'].get('repl_strategy')
|
||||||
|
|
||||||
LOG.info("Tenant: '%(tenant)s' is adding the datastore "
|
LOG.info("Tenant: '%(tenant)s' is adding the datastore "
|
||||||
"version: '%(version)s' to datastore: '%(datastore)s'",
|
"version: '%(version)s' to datastore: '%(datastore)s'",
|
||||||
|
@ -80,10 +82,11 @@ class DatastoreVersionController(wsgi.Controller):
|
||||||
raise exception.DatastoreVersionAlreadyExists(
|
raise exception.DatastoreVersionAlreadyExists(
|
||||||
name=version_name, version=version_str)
|
name=version_name, version=version_str)
|
||||||
except exception.DatastoreVersionNotFound:
|
except exception.DatastoreVersionNotFound:
|
||||||
models.update_datastore_version(datastore.name, version_name,
|
models.update_datastore_version(
|
||||||
manager, image_id, image_tags,
|
datastore.name, version_name,
|
||||||
packages, active,
|
manager, image_id, image_tags,
|
||||||
version=version_str)
|
packages, active, registry_ext, repl_strategy,
|
||||||
|
version=version_str)
|
||||||
|
|
||||||
if default:
|
if default:
|
||||||
models.update_datastore(datastore.name, version_name)
|
models.update_datastore(datastore.name, version_name)
|
||||||
|
@ -129,6 +132,9 @@ class DatastoreVersionController(wsgi.Controller):
|
||||||
if type(packages) is list:
|
if type(packages) is list:
|
||||||
packages = ','.join(packages)
|
packages = ','.join(packages)
|
||||||
|
|
||||||
|
registry_ext = body.get('registry_ext', datastore_version.registry_ext)
|
||||||
|
repl_strategy = body.get(
|
||||||
|
'repl_strategy', datastore_version.repl_strategy)
|
||||||
if image_id or image_tags:
|
if image_id or image_tags:
|
||||||
client = clients.create_glance_client(context)
|
client = clients.create_glance_client(context)
|
||||||
common_glance.get_image_id(client, image_id, image_tags)
|
common_glance.get_image_id(client, image_id, image_tags)
|
||||||
|
@ -147,12 +153,12 @@ class DatastoreVersionController(wsgi.Controller):
|
||||||
if not image_id and not image_tags:
|
if not image_id and not image_tags:
|
||||||
raise exception.BadRequest("Image must be specified.")
|
raise exception.BadRequest("Image must be specified.")
|
||||||
|
|
||||||
models.update_datastore_version(datastore_version.datastore_name,
|
models.update_datastore_version(
|
||||||
datastore_version.name,
|
datastore_version.datastore_name,
|
||||||
manager, image_id, image_tags,
|
datastore_version.name,
|
||||||
packages, active,
|
manager, image_id, image_tags,
|
||||||
version=datastore_version.version,
|
packages, active, registry_ext, repl_strategy,
|
||||||
new_name=name)
|
version=datastore_version.version, new_name=name)
|
||||||
|
|
||||||
if default:
|
if default:
|
||||||
models.update_datastore(datastore_version.datastore_name,
|
models.update_datastore(datastore_version.datastore_name,
|
||||||
|
|
|
@ -32,6 +32,8 @@ class DatastoreVersionView(object):
|
||||||
"packages": (self.datastore_version.packages.split(
|
"packages": (self.datastore_version.packages.split(
|
||||||
',') if self.datastore_version.packages else ['']),
|
',') if self.datastore_version.packages else ['']),
|
||||||
"active": self.datastore_version.active,
|
"active": self.datastore_version.active,
|
||||||
|
"registry_ext": self.datastore_version.registry_ext,
|
||||||
|
"repl_strategy": self.datastore_version.repl_strategy,
|
||||||
"default": self.datastore_version.default}
|
"default": self.datastore_version.default}
|
||||||
|
|
||||||
return {'version': datastore_version_dict}
|
return {'version': datastore_version_dict}
|
||||||
|
|
|
@ -23,42 +23,18 @@ handles RPC calls relating to Platform specific operations.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from itertools import chain
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
from itertools import chain
|
||||||
|
|
||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
|
|
||||||
from trove.common import cfg
|
from trove.common import cfg
|
||||||
|
from trove.common import constants
|
||||||
from trove.common.i18n import _
|
from trove.common.i18n import _
|
||||||
from trove.common import utils
|
from trove.common import utils
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
defaults = {
|
|
||||||
'mysql':
|
|
||||||
'trove.guestagent.datastore.mysql.manager.Manager',
|
|
||||||
'mariadb':
|
|
||||||
'trove.guestagent.datastore.mariadb.manager.Manager',
|
|
||||||
'postgresql':
|
|
||||||
'trove.guestagent.datastore.postgres.manager.PostgresManager',
|
|
||||||
'percona':
|
|
||||||
'trove.guestagent.datastore.experimental.percona.manager.Manager',
|
|
||||||
'pxc':
|
|
||||||
'trove.guestagent.datastore.experimental.pxc.manager.Manager',
|
|
||||||
'redis':
|
|
||||||
'trove.guestagent.datastore.experimental.redis.manager.Manager',
|
|
||||||
'cassandra':
|
|
||||||
'trove.guestagent.datastore.experimental.cassandra.manager.Manager',
|
|
||||||
'couchbase':
|
|
||||||
'trove.guestagent.datastore.experimental.couchbase.manager.Manager',
|
|
||||||
'mongodb':
|
|
||||||
'trove.guestagent.datastore.experimental.mongodb.manager.Manager',
|
|
||||||
'couchdb':
|
|
||||||
'trove.guestagent.datastore.experimental.couchdb.manager.Manager',
|
|
||||||
'vertica':
|
|
||||||
'trove.guestagent.datastore.experimental.vertica.manager.Manager',
|
|
||||||
'db2':
|
|
||||||
'trove.guestagent.datastore.experimental.db2.manager.Manager',
|
|
||||||
}
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
|
|
||||||
|
|
||||||
|
@ -67,8 +43,8 @@ def get_custom_managers():
|
||||||
|
|
||||||
|
|
||||||
def datastore_registry():
|
def datastore_registry():
|
||||||
return dict(chain(defaults.items(),
|
return dict(chain(constants.REGISTRY_EXT_DEFAULTS.items(),
|
||||||
get_custom_managers().items()))
|
get_custom_managers().items()))
|
||||||
|
|
||||||
|
|
||||||
def get_filesystem_volume_stats(fs_path):
|
def get_filesystem_volume_stats(fs_path):
|
||||||
|
|
|
@ -37,6 +37,12 @@ def get_instance(manager):
|
||||||
if not __replication_instance or manager != __replication_manager:
|
if not __replication_instance or manager != __replication_manager:
|
||||||
replication_strategy = get_strategy(manager)
|
replication_strategy = get_strategy(manager)
|
||||||
__replication_namespace = CONF.get(manager).replication_namespace
|
__replication_namespace = CONF.get(manager).replication_namespace
|
||||||
|
|
||||||
|
if CONF.replication_strategy:
|
||||||
|
replication_strategy = CONF.replication_strategy.split('.')[-1]
|
||||||
|
__replication_namespace = '.'.join(
|
||||||
|
CONF.replication_strategy.split('.')[0:-1])
|
||||||
|
|
||||||
replication_strategy_cls = get_strategy_cls(
|
replication_strategy_cls = get_strategy_cls(
|
||||||
replication_strategy, __replication_namespace)
|
replication_strategy, __replication_namespace)
|
||||||
__replication_instance = replication_strategy_cls()
|
__replication_instance = replication_strategy_cls()
|
||||||
|
|
|
@ -33,6 +33,7 @@ from sqlalchemy import func
|
||||||
from trove.backup.models import Backup
|
from trove.backup.models import Backup
|
||||||
from trove.common import cfg
|
from trove.common import cfg
|
||||||
from trove.common import clients
|
from trove.common import clients
|
||||||
|
from trove.common import constants
|
||||||
from trove.common import crypto_utils as cu
|
from trove.common import crypto_utils as cu
|
||||||
from trove.common import exception
|
from trove.common import exception
|
||||||
from trove.common.i18n import _
|
from trove.common.i18n import _
|
||||||
|
@ -992,6 +993,28 @@ class BaseInstance(SimpleInstance):
|
||||||
|
|
||||||
return userdata if userdata else ""
|
return userdata if userdata else ""
|
||||||
|
|
||||||
|
@property
|
||||||
|
def datastore_registry_ext(self):
|
||||||
|
registry_ext = constants.REGISTRY_EXT_DEFAULTS.get(
|
||||||
|
self.ds_version.manager)
|
||||||
|
if self.ds_version.registry_ext:
|
||||||
|
registry_ext = self.ds_version.registry_ext
|
||||||
|
|
||||||
|
return "%(manager)s:%(registry_ext)s" % {
|
||||||
|
"manager": self.ds_version.manager,
|
||||||
|
"registry_ext": registry_ext
|
||||||
|
}
|
||||||
|
|
||||||
|
@property
|
||||||
|
def datastore_repl_strategy(self):
|
||||||
|
if self.ds_version.repl_strategy:
|
||||||
|
return self.ds_version.repl_strategy
|
||||||
|
|
||||||
|
return "%s.%s" % (
|
||||||
|
CONF.get(self.ds_version.manager).replication_namespace,
|
||||||
|
CONF.get(self.ds_version.manager).replication_strategy
|
||||||
|
)
|
||||||
|
|
||||||
def get_injected_files(self,
|
def get_injected_files(self,
|
||||||
datastore_manager,
|
datastore_manager,
|
||||||
datastore_version,
|
datastore_version,
|
||||||
|
@ -1014,8 +1037,11 @@ class BaseInstance(SimpleInstance):
|
||||||
"datastore_manager=%s\n"
|
"datastore_manager=%s\n"
|
||||||
"datastore_version=%s\n"
|
"datastore_version=%s\n"
|
||||||
"tenant_id=%s\n"
|
"tenant_id=%s\n"
|
||||||
|
"datastore_registry_ext=%s\n"
|
||||||
|
"replication_strategy=%s\n"
|
||||||
% (self.id, datastore_manager, datastore_version,
|
% (self.id, datastore_manager, datastore_version,
|
||||||
self.tenant_id)
|
self.tenant_id, self.datastore_registry_ext,
|
||||||
|
self.datastore_repl_strategy)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,8 @@ class TestDatastoreVersionController(trove_testtools.TestCase):
|
||||||
"datastore_manager": "mysql",
|
"datastore_manager": "mysql",
|
||||||
"image": image_id,
|
"image": image_id,
|
||||||
"image_tags": [],
|
"image_tags": [],
|
||||||
|
"registry_ext": "registry_ext",
|
||||||
|
"repl_strategy": "repl_strategy",
|
||||||
"active": True,
|
"active": True,
|
||||||
"default": False
|
"default": False
|
||||||
}
|
}
|
||||||
|
@ -85,6 +87,8 @@ class TestDatastoreVersionController(trove_testtools.TestCase):
|
||||||
"name": ver_name,
|
"name": ver_name,
|
||||||
"datastore_manager": "mysql",
|
"datastore_manager": "mysql",
|
||||||
"image_tags": ['a', 'b', 'c', 'd', 'e', 'f'],
|
"image_tags": ['a', 'b', 'c', 'd', 'e', 'f'],
|
||||||
|
"registry_ext": "registry_ext",
|
||||||
|
"repl_strategy": "repl_strategy",
|
||||||
"active": True,
|
"active": True,
|
||||||
"default": False
|
"default": False
|
||||||
}
|
}
|
||||||
|
@ -104,6 +108,8 @@ class TestDatastoreVersionController(trove_testtools.TestCase):
|
||||||
"datastore_manager": "mysql",
|
"datastore_manager": "mysql",
|
||||||
"image": image_id,
|
"image": image_id,
|
||||||
"image_tags": [],
|
"image_tags": [],
|
||||||
|
"registry_ext": "registry_ext",
|
||||||
|
"repl_strategy": "repl_strategy",
|
||||||
"active": True,
|
"active": True,
|
||||||
"default": False
|
"default": False
|
||||||
}
|
}
|
||||||
|
@ -129,6 +135,8 @@ class TestDatastoreVersionController(trove_testtools.TestCase):
|
||||||
"datastore_manager": "mysql",
|
"datastore_manager": "mysql",
|
||||||
"image": image_id,
|
"image": image_id,
|
||||||
"image_tags": [],
|
"image_tags": [],
|
||||||
|
"registry_ext": "registry_ext",
|
||||||
|
"repl_strategy": "repl_strategy",
|
||||||
"packages": "test-pkg",
|
"packages": "test-pkg",
|
||||||
"active": True,
|
"active": True,
|
||||||
"default": True
|
"default": True
|
||||||
|
@ -152,6 +160,8 @@ class TestDatastoreVersionController(trove_testtools.TestCase):
|
||||||
"datastore_manager": "mysql",
|
"datastore_manager": "mysql",
|
||||||
"image": image_id,
|
"image": image_id,
|
||||||
"image_tags": [],
|
"image_tags": [],
|
||||||
|
"registry_ext": "registry_ext",
|
||||||
|
"repl_strategy": "repl_strategy",
|
||||||
"packages": "",
|
"packages": "",
|
||||||
"active": True,
|
"active": True,
|
||||||
"default": False,
|
"default": False,
|
||||||
|
@ -177,6 +187,8 @@ class TestDatastoreVersionController(trove_testtools.TestCase):
|
||||||
"name": ver_name,
|
"name": ver_name,
|
||||||
"datastore_manager": "mysql",
|
"datastore_manager": "mysql",
|
||||||
"image_tags": ["trove", "mysql"],
|
"image_tags": ["trove", "mysql"],
|
||||||
|
"registry_ext": "registry_ext",
|
||||||
|
"repl_strategy": "repl_strategy",
|
||||||
"active": True,
|
"active": True,
|
||||||
"default": True
|
"default": True
|
||||||
}
|
}
|
||||||
|
@ -209,6 +221,8 @@ class TestDatastoreVersionController(trove_testtools.TestCase):
|
||||||
"datastore_manager": "mysql",
|
"datastore_manager": "mysql",
|
||||||
"image": image_id,
|
"image": image_id,
|
||||||
"image_tags": [],
|
"image_tags": [],
|
||||||
|
"registry_ext": "registry_ext",
|
||||||
|
"repl_strategy": "repl_strategy",
|
||||||
"packages": "test-pkg",
|
"packages": "test-pkg",
|
||||||
"active": True,
|
"active": True,
|
||||||
"default": True
|
"default": True
|
||||||
|
|
|
@ -63,6 +63,8 @@ class MockMgmtInstanceTest(trove_testtools.TestCase):
|
||||||
name='5.5' + str(uuid.uuid4()),
|
name='5.5' + str(uuid.uuid4()),
|
||||||
manager='mysql',
|
manager='mysql',
|
||||||
image_id=str(uuid.uuid4()),
|
image_id=str(uuid.uuid4()),
|
||||||
|
registry_ext="registry_ext",
|
||||||
|
repl_strategy="repl_strategy",
|
||||||
active=1,
|
active=1,
|
||||||
packages="mysql-server-5.5"
|
packages="mysql-server-5.5"
|
||||||
)
|
)
|
||||||
|
|
|
@ -136,6 +136,8 @@ class CreateInstanceTest(trove_testtools.TestCase):
|
||||||
manager="mysql",
|
manager="mysql",
|
||||||
image_id="image_id",
|
image_id="image_id",
|
||||||
packages="",
|
packages="",
|
||||||
|
registry_ext="registry_ext",
|
||||||
|
repl_strategy="repl_strategy",
|
||||||
active=True))
|
active=True))
|
||||||
self.volume_size = 1
|
self.volume_size = 1
|
||||||
self.az = "az"
|
self.az = "az"
|
||||||
|
@ -264,6 +266,8 @@ class TestInstanceUpgrade(trove_testtools.TestCase):
|
||||||
packages=str(uuid.uuid4()),
|
packages=str(uuid.uuid4()),
|
||||||
datastore_id=self.datastore.id,
|
datastore_id=self.datastore.id,
|
||||||
manager='test',
|
manager='test',
|
||||||
|
registry_ext="registry_ext",
|
||||||
|
repl_strategy="repl_strategy",
|
||||||
active=1)
|
active=1)
|
||||||
|
|
||||||
self.datastore_version2 = datastore_models.DBDatastoreVersion.create(
|
self.datastore_version2 = datastore_models.DBDatastoreVersion.create(
|
||||||
|
@ -273,6 +277,8 @@ class TestInstanceUpgrade(trove_testtools.TestCase):
|
||||||
packages=str(uuid.uuid4()),
|
packages=str(uuid.uuid4()),
|
||||||
datastore_id=self.datastore.id,
|
datastore_id=self.datastore.id,
|
||||||
manager='test',
|
manager='test',
|
||||||
|
registry_ext="registry_ext",
|
||||||
|
repl_strategy="repl_strategy",
|
||||||
active=1)
|
active=1)
|
||||||
|
|
||||||
self.safe_nova_client = clients.create_nova_client
|
self.safe_nova_client = clients.create_nova_client
|
||||||
|
@ -337,6 +343,8 @@ class TestReplication(trove_testtools.TestCase):
|
||||||
packages=str(uuid.uuid4()),
|
packages=str(uuid.uuid4()),
|
||||||
datastore_id=self.datastore.id,
|
datastore_id=self.datastore.id,
|
||||||
manager='mysql',
|
manager='mysql',
|
||||||
|
registry_ext="registry_ext",
|
||||||
|
repl_strategy="repl_strategy",
|
||||||
active=1)
|
active=1)
|
||||||
|
|
||||||
self.databases = []
|
self.databases = []
|
||||||
|
|
|
@ -59,6 +59,8 @@ class BaseInstanceStatusTestCase(trove_testtools.TestCase):
|
||||||
name='5.7' + str(uuid.uuid4()),
|
name='5.7' + str(uuid.uuid4()),
|
||||||
manager='mysql',
|
manager='mysql',
|
||||||
image_id=str(uuid.uuid4()),
|
image_id=str(uuid.uuid4()),
|
||||||
|
registry_ext="registry_ext",
|
||||||
|
repl_strategy="repl_strategy",
|
||||||
active=1,
|
active=1,
|
||||||
packages="mysql-server-5.7"
|
packages="mysql-server-5.7"
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue