Merge "Support datastore version number for creating configuration"

This commit is contained in:
Zuul 2020-11-19 02:31:11 +00:00 committed by Gerrit Code Review
commit ac0db3aec7
7 changed files with 84 additions and 19 deletions

View File

@ -85,18 +85,21 @@ class Commands(object):
def db_load_datastore_config_parameters(self,
datastore,
datastore_version_name,
config_file_location):
config_file_location,
version=None):
print("Loading config parameters for datastore (%s) version (%s)"
% (datastore, datastore_version_name))
config_models.load_datastore_configuration_parameters(
datastore, datastore_version_name, config_file_location)
datastore, datastore_version_name, config_file_location,
version_number=version)
def db_remove_datastore_config_parameters(self, datastore,
datastore_version_name):
datastore_version_name,
version=None):
print("Removing config parameters for datastore (%s) version (%s)"
% (datastore, datastore_version_name))
config_models.remove_datastore_configuration_parameters(
datastore, datastore_version_name)
datastore, datastore_version_name, version_number=version)
def datastore_version_flavor_add(self, datastore_name,
datastore_version_name, flavor_ids,
@ -282,6 +285,11 @@ def main():
'config_file_location',
help='Fully qualified file path to the configuration group '
'parameter validation rules.')
parser.add_argument(
'--version',
help='The version number of the datastore version, e.g. 5.7.30. '
'If not specified, use <datastore_version_name> as default '
'value.')
parser = subparser.add_parser(
'db_remove_datastore_config_parameters',
@ -293,6 +301,11 @@ def main():
parser.add_argument(
'datastore_version_name',
help='Name of the datastore version.')
parser.add_argument(
'--version',
help='The version number of the datastore version, e.g. 5.7.30. '
'If not specified, use <datastore_version_name> as default '
'value.')
parser = subparser.add_parser(
'datastore_version_flavor_add',

View File

@ -821,7 +821,8 @@ configuration = {
"additionalProperties": True,
"properties": {
"type": non_empty_string,
"version": non_empty_string
"version": non_empty_string,
"version_number": non_empty_string
}
}
}

View File

@ -354,17 +354,16 @@ def create_or_update_datastore_configuration_parameter(name,
data_type=data_type,
max_size=max_size,
min_size=min_size,
deleted=False,
)
get_db_api().save(config)
def load_datastore_configuration_parameters(datastore,
datastore_version,
config_file):
def load_datastore_configuration_parameters(datastore, datastore_version,
config_file, version_number=None):
get_db_api().configure_db(CONF)
(ds, ds_v) = dstore_models.get_datastore_version(
type=datastore, version=datastore_version, return_inactive=True)
type=datastore, version=datastore_version, return_inactive=True,
version_number=version_number)
with open(config_file) as f:
config = json.load(f)
for param in config['configuration-parameters']:
@ -378,10 +377,12 @@ def load_datastore_configuration_parameters(datastore,
)
def remove_datastore_configuration_parameters(datastore, datastore_version):
def remove_datastore_configuration_parameters(datastore, datastore_version,
version_number=None):
get_db_api().configure_db(CONF)
(ds, ds_version) = dstore_models.get_datastore_version(
type=datastore, version=datastore_version, return_inactive=True)
type=datastore, version=datastore_version, return_inactive=True,
version_number=version_number)
db_params = DatastoreConfigurationParameters.load_parameters(ds_version.id)
for db_param in db_params:
db_param.delete()

View File

@ -11,19 +11,20 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import sqlalchemy
from sqlalchemy import schema
from sqlalchemy.schema import MetaData
from trove.db.sqlalchemy.migrate_repo import schema as trove_schema
from trove.db.sqlalchemy.migrate_repo.schema import Table
meta = MetaData()
meta = schema.MetaData()
def upgrade(migrate_engine):
meta.bind = migrate_engine
ds_config_param = Table('datastore_configuration_parameters', meta,
autoload=True)
ds_config_param = trove_schema.Table('datastore_configuration_parameters',
meta,
autoload=True)
# Remove records with deleted=1
if 'deleted' in ds_config_param.c:
@ -35,3 +36,32 @@ def upgrade(migrate_engine):
if migrate_engine.name != "sqlite":
ds_config_param.drop_column('deleted')
ds_config_param.drop_column('deleted_at')
else:
# It is not possible to remove a column from a table in SQLite.
# SQLite is just for testing, so we re-create the table.
ds_config_param.drop()
meta.clear()
trove_schema.Table('datastore_versions', meta, autoload=True)
new_table = trove_schema.Table(
'datastore_configuration_parameters',
meta,
schema.Column('id', trove_schema.String(36),
primary_key=True, nullable=False),
schema.Column('name', trove_schema.String(128),
primary_key=True, nullable=False),
schema.Column('datastore_version_id', trove_schema.String(36),
sqlalchemy.ForeignKey("datastore_versions.id"),
primary_key=True, nullable=False),
schema.Column('restart_required', trove_schema.Boolean(),
nullable=False, default=False),
schema.Column('max_size', trove_schema.String(40)),
schema.Column('min_size', trove_schema.String(40)),
schema.Column('data_type', trove_schema.String(128),
nullable=False),
schema.UniqueConstraint(
'datastore_version_id', 'name',
name=('UQ_datastore_configuration_parameters_datastore_'
'version_id_name')
)
)
trove_schema.create_tables([new_table])

View File

@ -188,6 +188,13 @@ class DatastoreVersionController(wsgi.Controller):
{'tenant': tenant_id, 'version': datastore_version.name,
'datastore': datastore.name})
# Remove the config parameters associated with the datastore version
LOG.debug(f"Deleting config parameters for datastore version {id}")
db_params = config_model.DatastoreConfigurationParameters. \
load_parameters(id)
for db_param in db_params:
db_param.delete()
if datastore.default_version_id == datastore_version.id:
models.update_datastore(datastore.name, None)
datastore_version.delete()

View File

@ -2112,7 +2112,7 @@ class RebuildAction(ResizeActionBase):
LOG.info(f"Sending rebuild request to the instance {self.instance.id}")
self.instance.guest.rebuild(
self.instance.datastore_version.name,
self.instance.datastore_version.version,
config_contents=config_contents, config_overrides=overrides)
LOG.info(f"Waiting for instance {self.instance.id} healthy")

View File

@ -21,6 +21,7 @@ import jsonschema
from trove.common import clients
from trove.common import exception
from trove.configuration import models as config_models
from trove.datastore import models
from trove.extensions.mgmt.datastores.service import DatastoreVersionController
from trove.tests.unittests import trove_testtools
@ -318,6 +319,12 @@ class TestDatastoreVersionController(trove_testtools.TestCase):
self.ds_name, name, 'mysql', self.random_uuid(), '', '', 1)
ver = models.DatastoreVersion.load(self.ds, name)
# Add config param for the datastore version. Should be automatically
# removed.
param_name = self.random_name('param')
config_models.create_or_update_datastore_configuration_parameter(
param_name, ver.id, False, 'string', None, None)
output = self.version_controller.delete(MagicMock(),
mock.ANY,
ver.id)
@ -327,6 +334,12 @@ class TestDatastoreVersionController(trove_testtools.TestCase):
exception.DatastoreVersionNotFound,
models.DatastoreVersion.load_by_uuid, ver.id)
config_params_cls = config_models.DatastoreConfigurationParameters
self.assertRaises(
exception.NotFound,
config_params_cls.load_parameter_by_name,
ver.id, param_name)
def test_index(self):
output = self.version_controller.index(MagicMock(), mock.ANY)
self.assertEqual(200, output.status)