From b127068c2046f4abc71e30d89069ead1d6ba06a3 Mon Sep 17 00:00:00 2001 From: Bo Tran Van Date: Mon, 7 Aug 2023 10:51:00 +0700 Subject: [PATCH] Add Datastore Version Registry Extension Current, users can config default datastore registry for managers not by verions. This make you can flexible when have some experimental datastore. With this patch, users with the administrator role can configure the datastore registry external for each datastore version using a command, without editing configuration files. Story: #2010860 Task: #48534 Change-Id: I910a1ba4a9216ab29faeed03198113b4acb2cb81 --- doc/source/cli/trove-manage.rst | 10 +++ ...registry_external_to_datastore_verion.yaml | 5 ++ trove/cmd/guest.py | 25 +++--- trove/cmd/manage.py | 31 +++++--- trove/common/apischema.py | 4 + trove/common/cfg.py | 2 +- trove/common/constants.py | 27 +++++++ trove/datastore/models.py | 23 +++++- trove/datastore/views.py | 13 +-- ...9_add_registry_ext_to_datastore_version.py | 79 +++++++++++++++++++ trove/extensions/mgmt/datastores/service.py | 26 +++--- trove/extensions/mgmt/datastores/views.py | 2 + trove/guestagent/dbaas.py | 34 ++------ .../strategies/replication/__init__.py | 6 ++ trove/instance/models.py | 28 ++++++- .../mgmt/datastores/test_service.py | 14 ++++ .../extensions/mgmt/instances/test_models.py | 2 + .../instance/test_instance_models.py | 8 ++ .../instance/test_instance_status.py | 2 + 19 files changed, 276 insertions(+), 65 deletions(-) create mode 100644 releasenotes/notes/add_datastore_registry_external_to_datastore_verion.yaml create mode 100644 trove/db/sqlalchemy/migrate_repo/versions/049_add_registry_ext_to_datastore_version.py diff --git a/doc/source/cli/trove-manage.rst b/doc/source/cli/trove-manage.rst index 2e890739dc..1eccf98c37 100644 --- a/doc/source/cli/trove-manage.rst +++ b/doc/source/cli/trove-manage.rst @@ -202,6 +202,8 @@ trove-manage datastore_version_update datastore version_name manager image_id packages active --image-tags + --registry-ext + --repl-strategy Add or update a datastore version. If the datastore version already exists, 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 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 ~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/releasenotes/notes/add_datastore_registry_external_to_datastore_verion.yaml b/releasenotes/notes/add_datastore_registry_external_to_datastore_verion.yaml new file mode 100644 index 0000000000..68b19c6325 --- /dev/null +++ b/releasenotes/notes/add_datastore_registry_external_to_datastore_verion.yaml @@ -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. + diff --git a/trove/cmd/guest.py b/trove/cmd/guest.py index 556cab830e..f613283463 100644 --- a/trove/cmd/guest.py +++ b/trove/cmd/guest.py @@ -28,14 +28,21 @@ from trove.guestagent import volume CONF = cfg.CONF # The guest_id opt definition must match the one in common/cfg.py -CONF.register_opts([openstack_cfg.StrOpt('guest_id', default=None, - help="ID of the Guest Instance."), - openstack_cfg.StrOpt('instance_rpc_encr_key', - help=('Key (OpenSSL aes_cbc) for ' - 'instance RPC encryption.')), - openstack_cfg.BoolOpt('network_isolation', - help='whether to plug user defined ' - 'port to database container')]) +CONF.register_opts([ + openstack_cfg.StrOpt('guest_id', default=None, + help="ID of the Guest Instance."), + openstack_cfg.StrOpt('instance_rpc_encr_key', + help=('Key (OpenSSL aes_cbc) for ' + 'instance RPC encryption.')), + openstack_cfg.BoolOpt('network_isolation', + 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__) @@ -61,7 +68,7 @@ def main(): if not CONF.guest_id: 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) if CONF.network_isolation: # disable user-defined port to avoid potential default gateway diff --git a/trove/cmd/manage.py b/trove/cmd/manage.py index 424919e7ec..2ea9705295 100644 --- a/trove/cmd/manage.py +++ b/trove/cmd/manage.py @@ -62,16 +62,19 @@ class Commands(object): print(e) def datastore_version_update(self, datastore, version_name, manager, - image_id, packages, active, image_tags=None, - version=None): + image_id, packages, active, registry_ext, + repl_strategy, + image_tags=None, version=None): try: - datastore_models.update_datastore_version(datastore, - version_name, - manager, - image_id, - image_tags, - packages, active, - version=version) + datastore_models.update_datastore_version( + datastore, + version_name, + manager, + image_id, + image_tags, + packages, active, + registry_ext, repl_strategy, + version=version) print("Datastore version '%s(%s)' updated." % (version_name, version or version_name)) except exception.DatastoreNotFound as e: @@ -251,6 +254,16 @@ def main(): 'image_id', help='ID of the image used to create an instance of ' '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( 'packages', help='Packages required by the datastore version that ' 'are installed on the guest image.') diff --git a/trove/common/apischema.py b/trove/common/apischema.py index bc815fadab..25471273aa 100644 --- a/trove/common/apischema.py +++ b/trove/common/apischema.py @@ -993,6 +993,8 @@ mgmt_datastore_version = { "packages": package_list, "image": uuid, "image_tags": image_tags, + "registry_ext": non_empty_string, + "repl_strategy": non_empty_string, "active": {"enum": [True, False]}, "default": {"enum": [True, False]}, "version": non_empty_string @@ -1010,6 +1012,8 @@ mgmt_datastore_version = { "packages": package_list, "image": uuid, "image_tags": image_tags, + "registry_ext": non_empty_string, + "repl_strategy": non_empty_string, "active": {"enum": [True, False]}, "default": {"enum": [True, False]}, "name": non_empty_string diff --git a/trove/common/cfg.py b/trove/common/cfg.py index 8c9ed602bb..c73554a960 100644 --- a/trove/common/cfg.py +++ b/trove/common/cfg.py @@ -534,7 +534,7 @@ common_opts = [ cfg.BoolOpt( 'enable_volume_az', default=False, help='If true create the volume in the same availability-zone as the ' - 'instance'), + 'instance') ] # Mysql diff --git a/trove/common/constants.py b/trove/common/constants.py index 9133feea3b..42af5809d3 100644 --- a/trove/common/constants.py +++ b/trove/common/constants.py @@ -20,3 +20,30 @@ DOCKER_HOST_NIC_MODE = "docker-hostnic" DOCKER_BRIDGE_MODE = "bridge" MYSQL_HOST_SOCKET_PATH = "/var/lib/mysqld" 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', +} diff --git a/trove/datastore/models.py b/trove/datastore/models.py index f63136f16a..1a0916fb8f 100644 --- a/trove/datastore/models.py +++ b/trove/datastore/models.py @@ -20,6 +20,7 @@ from oslo_utils import uuidutils from trove.common import cfg from trove.common.clients import create_nova_client +from trove.common import constants from trove.common import exception from trove.common.i18n import _ from trove.common import timeutils @@ -212,6 +213,7 @@ class CapabilityOverride(BaseCapability): specific datastore version that overrides the default setting in the base capability's entry for Trove. """ + def __init__(self, db_info): super(CapabilityOverride, self).__init__(db_info) # This *may* be better solved with a join in the SQLAlchemy model but @@ -467,6 +469,14 @@ class DatastoreVersion(object): def packages(self): 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 def active(self): 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, - 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.""" version = version or name 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) ds_version.packages = packages 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) diff --git a/trove/datastore/views.py b/trove/datastore/views.py index be6072571e..7eb96b1588 100644 --- a/trove/datastore/views.py +++ b/trove/datastore/views.py @@ -84,14 +84,17 @@ class DatastoreVersionView(object): "links": self._build_links(), } if include_datastore_id: - datastore_version_dict["datastore"] = (self.datastore_version. - datastore_id) + datastore_version_dict["datastore"] = ( + self.datastore_version.datastore_id) if self.context.is_admin: datastore_version_dict['active'] = self.datastore_version.active - datastore_version_dict['packages'] = (self.datastore_version. - packages) + datastore_version_dict['packages'] = ( + self.datastore_version.packages) 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 = [] if self.datastore_version.image_tags: image_tags = self.datastore_version.image_tags.split(',') diff --git a/trove/db/sqlalchemy/migrate_repo/versions/049_add_registry_ext_to_datastore_version.py b/trove/db/sqlalchemy/migrate_repo/versions/049_add_registry_ext_to_datastore_version.py new file mode 100644 index 0000000000..977f3e631b --- /dev/null +++ b/trove/db/sqlalchemy/migrate_repo/versions/049_add_registry_ext_to_datastore_version.py @@ -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) diff --git a/trove/extensions/mgmt/datastores/service.py b/trove/extensions/mgmt/datastores/service.py index b63ffcf68b..a9039ea6ee 100644 --- a/trove/extensions/mgmt/datastores/service.py +++ b/trove/extensions/mgmt/datastores/service.py @@ -52,6 +52,8 @@ class DatastoreVersionController(wsgi.Controller): # For backward compatibility, use name as default value for version if # not specified 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 " "version: '%(version)s' to datastore: '%(datastore)s'", @@ -80,10 +82,11 @@ class DatastoreVersionController(wsgi.Controller): raise exception.DatastoreVersionAlreadyExists( name=version_name, version=version_str) except exception.DatastoreVersionNotFound: - models.update_datastore_version(datastore.name, version_name, - manager, image_id, image_tags, - packages, active, - version=version_str) + models.update_datastore_version( + datastore.name, version_name, + manager, image_id, image_tags, + packages, active, registry_ext, repl_strategy, + version=version_str) if default: models.update_datastore(datastore.name, version_name) @@ -129,6 +132,9 @@ class DatastoreVersionController(wsgi.Controller): if type(packages) is list: 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: client = clients.create_glance_client(context) 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: raise exception.BadRequest("Image must be specified.") - models.update_datastore_version(datastore_version.datastore_name, - datastore_version.name, - manager, image_id, image_tags, - packages, active, - version=datastore_version.version, - new_name=name) + models.update_datastore_version( + datastore_version.datastore_name, + datastore_version.name, + manager, image_id, image_tags, + packages, active, registry_ext, repl_strategy, + version=datastore_version.version, new_name=name) if default: models.update_datastore(datastore_version.datastore_name, diff --git a/trove/extensions/mgmt/datastores/views.py b/trove/extensions/mgmt/datastores/views.py index ca6328cb9a..f4a892859d 100644 --- a/trove/extensions/mgmt/datastores/views.py +++ b/trove/extensions/mgmt/datastores/views.py @@ -32,6 +32,8 @@ class DatastoreVersionView(object): "packages": (self.datastore_version.packages.split( ',') if self.datastore_version.packages else ['']), "active": self.datastore_version.active, + "registry_ext": self.datastore_version.registry_ext, + "repl_strategy": self.datastore_version.repl_strategy, "default": self.datastore_version.default} return {'version': datastore_version_dict} diff --git a/trove/guestagent/dbaas.py b/trove/guestagent/dbaas.py index 44de755c4d..dfb85f8ea3 100644 --- a/trove/guestagent/dbaas.py +++ b/trove/guestagent/dbaas.py @@ -23,42 +23,18 @@ handles RPC calls relating to Platform specific operations. """ -from itertools import chain import os +from itertools import chain + from oslo_log import log as logging from trove.common import cfg +from trove.common import constants from trove.common.i18n import _ from trove.common import utils 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 @@ -67,8 +43,8 @@ def get_custom_managers(): def datastore_registry(): - return dict(chain(defaults.items(), - get_custom_managers().items())) + return dict(chain(constants.REGISTRY_EXT_DEFAULTS.items(), + get_custom_managers().items())) def get_filesystem_volume_stats(fs_path): diff --git a/trove/guestagent/strategies/replication/__init__.py b/trove/guestagent/strategies/replication/__init__.py index 8087ffadbb..6a2d278afb 100644 --- a/trove/guestagent/strategies/replication/__init__.py +++ b/trove/guestagent/strategies/replication/__init__.py @@ -37,6 +37,12 @@ def get_instance(manager): if not __replication_instance or manager != __replication_manager: replication_strategy = get_strategy(manager) __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, __replication_namespace) __replication_instance = replication_strategy_cls() diff --git a/trove/instance/models.py b/trove/instance/models.py index 565d014575..bd9dfabba8 100644 --- a/trove/instance/models.py +++ b/trove/instance/models.py @@ -33,6 +33,7 @@ from sqlalchemy import func from trove.backup.models import Backup from trove.common import cfg from trove.common import clients +from trove.common import constants from trove.common import crypto_utils as cu from trove.common import exception from trove.common.i18n import _ @@ -992,6 +993,28 @@ class BaseInstance(SimpleInstance): 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, datastore_manager, datastore_version, @@ -1014,8 +1037,11 @@ class BaseInstance(SimpleInstance): "datastore_manager=%s\n" "datastore_version=%s\n" "tenant_id=%s\n" + "datastore_registry_ext=%s\n" + "replication_strategy=%s\n" % (self.id, datastore_manager, datastore_version, - self.tenant_id) + self.tenant_id, self.datastore_registry_ext, + self.datastore_repl_strategy) ) } diff --git a/trove/tests/unittests/extensions/mgmt/datastores/test_service.py b/trove/tests/unittests/extensions/mgmt/datastores/test_service.py index 79af2b07f6..8c98df3a78 100644 --- a/trove/tests/unittests/extensions/mgmt/datastores/test_service.py +++ b/trove/tests/unittests/extensions/mgmt/datastores/test_service.py @@ -67,6 +67,8 @@ class TestDatastoreVersionController(trove_testtools.TestCase): "datastore_manager": "mysql", "image": image_id, "image_tags": [], + "registry_ext": "registry_ext", + "repl_strategy": "repl_strategy", "active": True, "default": False } @@ -85,6 +87,8 @@ class TestDatastoreVersionController(trove_testtools.TestCase): "name": ver_name, "datastore_manager": "mysql", "image_tags": ['a', 'b', 'c', 'd', 'e', 'f'], + "registry_ext": "registry_ext", + "repl_strategy": "repl_strategy", "active": True, "default": False } @@ -104,6 +108,8 @@ class TestDatastoreVersionController(trove_testtools.TestCase): "datastore_manager": "mysql", "image": image_id, "image_tags": [], + "registry_ext": "registry_ext", + "repl_strategy": "repl_strategy", "active": True, "default": False } @@ -129,6 +135,8 @@ class TestDatastoreVersionController(trove_testtools.TestCase): "datastore_manager": "mysql", "image": image_id, "image_tags": [], + "registry_ext": "registry_ext", + "repl_strategy": "repl_strategy", "packages": "test-pkg", "active": True, "default": True @@ -152,6 +160,8 @@ class TestDatastoreVersionController(trove_testtools.TestCase): "datastore_manager": "mysql", "image": image_id, "image_tags": [], + "registry_ext": "registry_ext", + "repl_strategy": "repl_strategy", "packages": "", "active": True, "default": False, @@ -177,6 +187,8 @@ class TestDatastoreVersionController(trove_testtools.TestCase): "name": ver_name, "datastore_manager": "mysql", "image_tags": ["trove", "mysql"], + "registry_ext": "registry_ext", + "repl_strategy": "repl_strategy", "active": True, "default": True } @@ -209,6 +221,8 @@ class TestDatastoreVersionController(trove_testtools.TestCase): "datastore_manager": "mysql", "image": image_id, "image_tags": [], + "registry_ext": "registry_ext", + "repl_strategy": "repl_strategy", "packages": "test-pkg", "active": True, "default": True diff --git a/trove/tests/unittests/extensions/mgmt/instances/test_models.py b/trove/tests/unittests/extensions/mgmt/instances/test_models.py index 7e4add1930..c212b941ae 100644 --- a/trove/tests/unittests/extensions/mgmt/instances/test_models.py +++ b/trove/tests/unittests/extensions/mgmt/instances/test_models.py @@ -63,6 +63,8 @@ class MockMgmtInstanceTest(trove_testtools.TestCase): name='5.5' + str(uuid.uuid4()), manager='mysql', image_id=str(uuid.uuid4()), + registry_ext="registry_ext", + repl_strategy="repl_strategy", active=1, packages="mysql-server-5.5" ) diff --git a/trove/tests/unittests/instance/test_instance_models.py b/trove/tests/unittests/instance/test_instance_models.py index 640b7ddba3..64a5e6fa6b 100644 --- a/trove/tests/unittests/instance/test_instance_models.py +++ b/trove/tests/unittests/instance/test_instance_models.py @@ -136,6 +136,8 @@ class CreateInstanceTest(trove_testtools.TestCase): manager="mysql", image_id="image_id", packages="", + registry_ext="registry_ext", + repl_strategy="repl_strategy", active=True)) self.volume_size = 1 self.az = "az" @@ -264,6 +266,8 @@ class TestInstanceUpgrade(trove_testtools.TestCase): packages=str(uuid.uuid4()), datastore_id=self.datastore.id, manager='test', + registry_ext="registry_ext", + repl_strategy="repl_strategy", active=1) self.datastore_version2 = datastore_models.DBDatastoreVersion.create( @@ -273,6 +277,8 @@ class TestInstanceUpgrade(trove_testtools.TestCase): packages=str(uuid.uuid4()), datastore_id=self.datastore.id, manager='test', + registry_ext="registry_ext", + repl_strategy="repl_strategy", active=1) self.safe_nova_client = clients.create_nova_client @@ -337,6 +343,8 @@ class TestReplication(trove_testtools.TestCase): packages=str(uuid.uuid4()), datastore_id=self.datastore.id, manager='mysql', + registry_ext="registry_ext", + repl_strategy="repl_strategy", active=1) self.databases = [] diff --git a/trove/tests/unittests/instance/test_instance_status.py b/trove/tests/unittests/instance/test_instance_status.py index aaa8bcd48a..d792feaa87 100644 --- a/trove/tests/unittests/instance/test_instance_status.py +++ b/trove/tests/unittests/instance/test_instance_status.py @@ -59,6 +59,8 @@ class BaseInstanceStatusTestCase(trove_testtools.TestCase): name='5.7' + str(uuid.uuid4()), manager='mysql', image_id=str(uuid.uuid4()), + registry_ext="registry_ext", + repl_strategy="repl_strategy", active=1, packages="mysql-server-5.7" )