move datastore manager to the datastore version
This moves the datastore manager field to the datastore version object so that we can have managers per datastore version and they can be shared if nessesary. implements blueprint move-manager-to-datastore-version Change-Id: I1c889a01005ec482bcd44e0e19475bc972e1af04
This commit is contained in:
parent
1085ea267b
commit
f14c87f015
|
@ -67,19 +67,21 @@ class Commands(object):
|
||||||
kwargs[arg] = getattr(CONF.action, arg)
|
kwargs[arg] = getattr(CONF.action, arg)
|
||||||
exec_method(**kwargs)
|
exec_method(**kwargs)
|
||||||
|
|
||||||
def datastore_update(self, datastore_name, manager, default_version):
|
def datastore_update(self, datastore_name, default_version):
|
||||||
try:
|
try:
|
||||||
datastore_models.update_datastore(datastore_name, manager,
|
datastore_models.update_datastore(datastore_name,
|
||||||
default_version)
|
default_version)
|
||||||
print("Datastore '%s' updated." % datastore_name)
|
print("Datastore '%s' updated." % datastore_name)
|
||||||
except exception.DatastoreVersionNotFound as e:
|
except exception.DatastoreVersionNotFound as e:
|
||||||
print(e)
|
print(e)
|
||||||
|
|
||||||
def datastore_version_update(self, datastore, version_name, image_id,
|
def datastore_version_update(self, datastore, version_name, manager,
|
||||||
packages, active):
|
image_id, packages, active):
|
||||||
try:
|
try:
|
||||||
datastore_models.update_datastore_version(datastore,
|
datastore_models.update_datastore_version(datastore,
|
||||||
version_name, image_id,
|
version_name,
|
||||||
|
manager,
|
||||||
|
image_id,
|
||||||
packages, active)
|
packages, active)
|
||||||
print("Datastore version '%s' updated." % version_name)
|
print("Datastore version '%s' updated." % version_name)
|
||||||
except exception.DatastoreNotFound as e:
|
except exception.DatastoreNotFound as e:
|
||||||
|
@ -100,22 +102,27 @@ def main():
|
||||||
def actions(subparser):
|
def actions(subparser):
|
||||||
parser = subparser.add_parser('db_sync')
|
parser = subparser.add_parser('db_sync')
|
||||||
parser.add_argument('--repo_path')
|
parser.add_argument('--repo_path')
|
||||||
|
|
||||||
parser = subparser.add_parser('db_upgrade')
|
parser = subparser.add_parser('db_upgrade')
|
||||||
parser.add_argument('--version')
|
parser.add_argument('--version')
|
||||||
parser.add_argument('--repo_path')
|
parser.add_argument('--repo_path')
|
||||||
|
|
||||||
parser = subparser.add_parser('db_downgrade')
|
parser = subparser.add_parser('db_downgrade')
|
||||||
parser.add_argument('version')
|
parser.add_argument('version')
|
||||||
parser.add_argument('--repo_path')
|
parser.add_argument('--repo_path')
|
||||||
|
|
||||||
parser = subparser.add_parser('datastore_update')
|
parser = subparser.add_parser('datastore_update')
|
||||||
parser.add_argument('datastore_name')
|
parser.add_argument('datastore_name')
|
||||||
parser.add_argument('manager')
|
|
||||||
parser.add_argument('default_version')
|
parser.add_argument('default_version')
|
||||||
|
|
||||||
parser = subparser.add_parser('datastore_version_update')
|
parser = subparser.add_parser('datastore_version_update')
|
||||||
parser.add_argument('datastore')
|
parser.add_argument('datastore')
|
||||||
parser.add_argument('version_name')
|
parser.add_argument('version_name')
|
||||||
|
parser.add_argument('manager')
|
||||||
parser.add_argument('image_id')
|
parser.add_argument('image_id')
|
||||||
parser.add_argument('packages')
|
parser.add_argument('packages')
|
||||||
parser.add_argument('active')
|
parser.add_argument('active')
|
||||||
|
|
||||||
parser = subparser.add_parser('db_wipe')
|
parser = subparser.add_parser('db_wipe')
|
||||||
parser.add_argument('repo_path')
|
parser.add_argument('repo_path')
|
||||||
|
|
||||||
|
|
|
@ -73,17 +73,20 @@ def initialize_trove(config_file):
|
||||||
def datastore_init():
|
def datastore_init():
|
||||||
# Adds the datastore for mysql (needed to make most calls work).
|
# Adds the datastore for mysql (needed to make most calls work).
|
||||||
from trove.datastore import models
|
from trove.datastore import models
|
||||||
|
|
||||||
models.DBDatastore.create(id="a00000a0-00a0-0a00-00a0-000a000000aa",
|
models.DBDatastore.create(id="a00000a0-00a0-0a00-00a0-000a000000aa",
|
||||||
name=CONFIG.dbaas_datastore, manager='mysql',
|
name=CONFIG.dbaas_datastore,
|
||||||
default_version_id=
|
default_version_id=
|
||||||
"b00000b0-00b0-0b00-00b0-000b000000bb")
|
"b00000b0-00b0-0b00-00b0-000b000000bb")
|
||||||
models.DBDatastore.create(id="e00000e0-00e0-0e00-00e0-000e000000ee",
|
models.DBDatastore.create(id="e00000e0-00e0-0e00-00e0-000e000000ee",
|
||||||
name='Test_Datastore_1', manager='manager1',
|
name='Test_Datastore_1',
|
||||||
default_version_id=None)
|
default_version_id=None)
|
||||||
|
|
||||||
models.DBDatastoreVersion.create(id="b00000b0-00b0-0b00-00b0-000b000000bb",
|
models.DBDatastoreVersion.create(id="b00000b0-00b0-0b00-00b0-000b000000bb",
|
||||||
datastore_id=
|
datastore_id=
|
||||||
"a00000a0-00a0-0a00-00a0-000a000000aa",
|
"a00000a0-00a0-0a00-00a0-000a000000aa",
|
||||||
name=CONFIG.dbaas_datastore_version,
|
name=CONFIG.dbaas_datastore_version,
|
||||||
|
manager="mysql",
|
||||||
image_id=
|
image_id=
|
||||||
'c00000c0-00c0-0c00-00c0-000c000000cc',
|
'c00000c0-00c0-0c00-00c0-000c000000cc',
|
||||||
packages='test packages',
|
packages='test packages',
|
||||||
|
@ -92,6 +95,7 @@ def datastore_init():
|
||||||
datastore_id=
|
datastore_id=
|
||||||
"a00000a0-00a0-0a00-00a0-000a000000aa",
|
"a00000a0-00a0-0a00-00a0-000a000000aa",
|
||||||
name='mysql_inactive_version',
|
name='mysql_inactive_version',
|
||||||
|
manager="mysql",
|
||||||
image_id=
|
image_id=
|
||||||
'c00000c0-00c0-0c00-00c0-000c000000cc',
|
'c00000c0-00c0-0c00-00c0-000c000000cc',
|
||||||
packages=None, active=0)
|
packages=None, active=0)
|
||||||
|
|
|
@ -21,8 +21,10 @@ from trove.common import exception
|
||||||
from trove.common import utils
|
from trove.common import utils
|
||||||
from trove.db import models as dbmodels
|
from trove.db import models as dbmodels
|
||||||
from trove.db import get_db_api
|
from trove.db import get_db_api
|
||||||
|
from trove.openstack.common import log as logging
|
||||||
|
|
||||||
|
|
||||||
|
LOG = logging.getLogger(__name__)
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
db_api = get_db_api()
|
db_api = get_db_api()
|
||||||
|
|
||||||
|
@ -36,13 +38,13 @@ def persisted_models():
|
||||||
|
|
||||||
class DBDatastore(dbmodels.DatabaseModelBase):
|
class DBDatastore(dbmodels.DatabaseModelBase):
|
||||||
|
|
||||||
_data_fields = ['id', 'name', 'manager', 'default_version_id']
|
_data_fields = ['id', 'name', 'default_version_id']
|
||||||
|
|
||||||
|
|
||||||
class DBDatastoreVersion(dbmodels.DatabaseModelBase):
|
class DBDatastoreVersion(dbmodels.DatabaseModelBase):
|
||||||
|
|
||||||
_data_fields = ['id', 'datastore_id', 'name', 'image_id', 'packages',
|
_data_fields = ['id', 'datastore_id', 'name', 'manager', 'image_id',
|
||||||
'active']
|
'packages', 'active']
|
||||||
|
|
||||||
|
|
||||||
class Datastore(object):
|
class Datastore(object):
|
||||||
|
@ -68,10 +70,6 @@ class Datastore(object):
|
||||||
def name(self):
|
def name(self):
|
||||||
return self.db_info.name
|
return self.db_info.name
|
||||||
|
|
||||||
@property
|
|
||||||
def manager(self):
|
|
||||||
return self.db_info.manager
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def default_version_id(self):
|
def default_version_id(self):
|
||||||
return self.db_info.default_version_id
|
return self.db_info.default_version_id
|
||||||
|
@ -130,6 +128,10 @@ class DatastoreVersion(object):
|
||||||
def active(self):
|
def active(self):
|
||||||
return self.db_info.active
|
return self.db_info.active
|
||||||
|
|
||||||
|
@property
|
||||||
|
def manager(self):
|
||||||
|
return self.db_info.manager
|
||||||
|
|
||||||
|
|
||||||
class DatastoreVersions(object):
|
class DatastoreVersions(object):
|
||||||
|
|
||||||
|
@ -166,7 +168,7 @@ def get_datastore_version(type=None, version=None):
|
||||||
return (datastore, datastore_version)
|
return (datastore, datastore_version)
|
||||||
|
|
||||||
|
|
||||||
def update_datastore(name, manager, default_version):
|
def update_datastore(name, default_version):
|
||||||
db_api.configure_db(CONF)
|
db_api.configure_db(CONF)
|
||||||
if default_version:
|
if default_version:
|
||||||
version = DatastoreVersion.load(default_version)
|
version = DatastoreVersion.load(default_version)
|
||||||
|
@ -180,13 +182,13 @@ def update_datastore(name, manager, default_version):
|
||||||
datastore = DBDatastore()
|
datastore = DBDatastore()
|
||||||
datastore.id = utils.generate_uuid()
|
datastore.id = utils.generate_uuid()
|
||||||
datastore.name = name
|
datastore.name = name
|
||||||
datastore.manager = manager
|
|
||||||
if default_version:
|
if default_version:
|
||||||
datastore.default_version_id = version.id
|
datastore.default_version_id = version.id
|
||||||
db_api.save(datastore)
|
db_api.save(datastore)
|
||||||
|
|
||||||
|
|
||||||
def update_datastore_version(datastore, name, image_id, packages, active):
|
def update_datastore_version(datastore, name, manager, image_id, packages,
|
||||||
|
active):
|
||||||
db_api.configure_db(CONF)
|
db_api.configure_db(CONF)
|
||||||
datastore = Datastore.load(datastore)
|
datastore = Datastore.load(datastore)
|
||||||
try:
|
try:
|
||||||
|
@ -197,6 +199,7 @@ def update_datastore_version(datastore, name, image_id, packages, active):
|
||||||
version.id = utils.generate_uuid()
|
version.id = utils.generate_uuid()
|
||||||
version.name = name
|
version.name = name
|
||||||
version.datastore_id = datastore.id
|
version.datastore_id = datastore.id
|
||||||
|
version.manager = manager
|
||||||
version.image_id = image_id
|
version.image_id = image_id
|
||||||
version.packages = packages
|
version.packages = packages
|
||||||
version.active = active
|
version.active = active
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
# Copyright 2012 OpenStack Foundation
|
||||||
|
#
|
||||||
|
# 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 trove.db.sqlalchemy.migrate_repo.schema import String
|
||||||
|
from trove.db.sqlalchemy.migrate_repo.schema import Table
|
||||||
|
|
||||||
|
|
||||||
|
def migrate_datastore_manager(datastores, datastore_versions):
|
||||||
|
versions = select([datastore_versions]).execute()
|
||||||
|
for ds_v in versions:
|
||||||
|
ds = select([datastores]).\
|
||||||
|
where(datastores.c.id == ds_v.datastore_id).\
|
||||||
|
execute().fetchone()
|
||||||
|
datastore_versions.update().\
|
||||||
|
where(datastore_versions.c.id == ds_v.id).\
|
||||||
|
values(manager=ds.manager).\
|
||||||
|
execute()
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade(migrate_engine):
|
||||||
|
meta = MetaData()
|
||||||
|
meta.bind = migrate_engine
|
||||||
|
|
||||||
|
datastores = Table('datastores', meta, autoload=True)
|
||||||
|
datastore_versions = Table('datastore_versions', meta, autoload=True)
|
||||||
|
|
||||||
|
# add column to datastore_versions
|
||||||
|
manager = Column('manager', String(255))
|
||||||
|
datastore_versions.create_column(manager)
|
||||||
|
migrate_datastore_manager(datastores, datastore_versions)
|
||||||
|
|
||||||
|
# drop column from datastores
|
||||||
|
datastores.drop_column('manager')
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade(migrate_engine):
|
||||||
|
meta = MetaData()
|
||||||
|
meta.bind = migrate_engine
|
||||||
|
|
||||||
|
datastores = Table('datastores', meta, autoload=True)
|
||||||
|
datastore_versions = Table('datastore_versions', meta, autoload=True)
|
||||||
|
|
||||||
|
# drop column from datastore_versions
|
||||||
|
datastore_versions.drop_column('manager')
|
||||||
|
|
||||||
|
# add column to datastores
|
||||||
|
manager = Column('manager', String(255))
|
||||||
|
datastores.create_column(manager)
|
|
@ -207,7 +207,7 @@ class NotificationTransformer(object):
|
||||||
'tenant_id': instance.tenant_id
|
'tenant_id': instance.tenant_id
|
||||||
}
|
}
|
||||||
payload['service_id'] = self._get_service_id(
|
payload['service_id'] = self._get_service_id(
|
||||||
instance.datastore.manager, CONF.notification_service_id)
|
instance.datastore_version.manager, CONF.notification_service_id)
|
||||||
return payload
|
return payload
|
||||||
|
|
||||||
def __call__(self):
|
def __call__(self):
|
||||||
|
@ -250,7 +250,8 @@ class NovaNotificationTransformer(NotificationTransformer):
|
||||||
instances):
|
instances):
|
||||||
message = {
|
message = {
|
||||||
'instance_type': self._lookup_flavor(instance.flavor_id),
|
'instance_type': self._lookup_flavor(instance.flavor_id),
|
||||||
'user_id': instance.server.user_id}
|
'user_id': instance.server.user_id
|
||||||
|
}
|
||||||
message.update(self.transform_instance(instance,
|
message.update(self.transform_instance(instance,
|
||||||
audit_start,
|
audit_start,
|
||||||
audit_end))
|
audit_end))
|
||||||
|
|
|
@ -509,7 +509,7 @@ class Instance(BuiltInstance):
|
||||||
|
|
||||||
task_api.API(context).create_instance(db_info.id, name, flavor,
|
task_api.API(context).create_instance(db_info.id, name, flavor,
|
||||||
image_id, databases, users,
|
image_id, databases, users,
|
||||||
datastore.manager,
|
datastore_version.manager,
|
||||||
datastore_version.packages,
|
datastore_version.packages,
|
||||||
volume_size, backup_id,
|
volume_size, backup_id,
|
||||||
availability_zone,
|
availability_zone,
|
||||||
|
|
|
@ -111,7 +111,8 @@ class API(proxy.RpcProxy):
|
||||||
image_id=image_id,
|
image_id=image_id,
|
||||||
databases=databases,
|
databases=databases,
|
||||||
users=users,
|
users=users,
|
||||||
datastore_manager=datastore_manager,
|
datastore_manager=
|
||||||
|
datastore_manager,
|
||||||
packages=packages,
|
packages=packages,
|
||||||
volume_size=volume_size,
|
volume_size=volume_size,
|
||||||
backup_id=backup_id,
|
backup_id=backup_id,
|
||||||
|
|
|
@ -117,7 +117,7 @@ class NotifyMixin(object):
|
||||||
})
|
})
|
||||||
|
|
||||||
payload['service_id'] = self._get_service_id(
|
payload['service_id'] = self._get_service_id(
|
||||||
self.datastore.manager, CONF.notification_service_id)
|
self.datastore_version.manager, CONF.notification_service_id)
|
||||||
|
|
||||||
# Update payload with all other kwargs
|
# Update payload with all other kwargs
|
||||||
payload.update(kwargs)
|
payload.update(kwargs)
|
||||||
|
@ -1015,8 +1015,11 @@ class ResizeAction(ResizeActionBase):
|
||||||
% self.instance.id)
|
% self.instance.id)
|
||||||
LOG.debug(_("Repairing config."))
|
LOG.debug(_("Repairing config."))
|
||||||
try:
|
try:
|
||||||
config = self._render_config(self.instance.datastore.manager,
|
config = self._render_config(
|
||||||
self.old_flavor, self.instance.id)
|
self.instance.datastore_version.manager,
|
||||||
|
self.old_flavor,
|
||||||
|
self.instance.id
|
||||||
|
)
|
||||||
config = {'config_contents': config.config_contents}
|
config = {'config_contents': config.config_contents}
|
||||||
self.instance.guest.reset_configuration(config)
|
self.instance.guest.reset_configuration(config)
|
||||||
except GuestTimeout:
|
except GuestTimeout:
|
||||||
|
@ -1036,7 +1039,7 @@ class ResizeAction(ResizeActionBase):
|
||||||
modify_at=timeutils.isotime(self.instance.updated))
|
modify_at=timeutils.isotime(self.instance.updated))
|
||||||
|
|
||||||
def _start_mysql(self):
|
def _start_mysql(self):
|
||||||
config = self._render_config(self.instance.datastore.manager,
|
config = self._render_config(self.instance.datastore_version.manager,
|
||||||
self.new_flavor, self.instance.id)
|
self.new_flavor, self.instance.id)
|
||||||
self.instance.guest.start_db_with_conf_changes(config.config_contents)
|
self.instance.guest.start_db_with_conf_changes(config.config_contents)
|
||||||
|
|
||||||
|
|
|
@ -81,10 +81,19 @@ class TestNotificationTransformer(MockMgmtInstanceTest):
|
||||||
|
|
||||||
when(DatabaseModelBase).find_all(deleted=False).thenReturn(
|
when(DatabaseModelBase).find_all(deleted=False).thenReturn(
|
||||||
[db_instance])
|
[db_instance])
|
||||||
stub_datastore = mock()
|
stub_dsv_db_info = mock(datastore_models.DBDatastoreVersion)
|
||||||
stub_datastore.datastore_id = "stub"
|
stub_dsv_db_info.id = "test_datastore_version"
|
||||||
stub_datastore.manager = "mysql"
|
stub_dsv_db_info.datastore_id = "mysql_test_version"
|
||||||
when(DatabaseModelBase).find_by(id=any()).thenReturn(stub_datastore)
|
stub_dsv_db_info.name = "test_datastore_name"
|
||||||
|
stub_dsv_db_info.image_id = "test_datastore_image_id"
|
||||||
|
stub_dsv_db_info.packages = "test_datastore_pacakges"
|
||||||
|
stub_dsv_db_info.active = 1
|
||||||
|
stub_dsv_db_info.manager = "mysql"
|
||||||
|
stub_datastore_version = datastore_models.DatastoreVersion(
|
||||||
|
stub_dsv_db_info)
|
||||||
|
when(DatabaseModelBase).find_by(id=any()).thenReturn(
|
||||||
|
stub_datastore_version)
|
||||||
|
|
||||||
when(DatabaseModelBase).find_by(instance_id='1').thenReturn(
|
when(DatabaseModelBase).find_by(instance_id='1').thenReturn(
|
||||||
InstanceServiceStatus(rd_instance.ServiceStatuses.BUILDING))
|
InstanceServiceStatus(rd_instance.ServiceStatuses.BUILDING))
|
||||||
|
|
||||||
|
@ -141,6 +150,19 @@ class TestNovaNotificationTransformer(MockMgmtInstanceTest):
|
||||||
db_instance = MockMgmtInstanceTest.build_db_instance(
|
db_instance = MockMgmtInstanceTest.build_db_instance(
|
||||||
status, task_status=InstanceTasks.BUILDING)
|
status, task_status=InstanceTasks.BUILDING)
|
||||||
|
|
||||||
|
stub_dsv_db_info = mock(datastore_models.DBDatastoreVersion)
|
||||||
|
stub_dsv_db_info.id = "test_datastore_version"
|
||||||
|
stub_dsv_db_info.datastore_id = "mysql_test_version"
|
||||||
|
stub_dsv_db_info.name = "test_datastore_name"
|
||||||
|
stub_dsv_db_info.image_id = "test_datastore_image_id"
|
||||||
|
stub_dsv_db_info.packages = "test_datastore_pacakges"
|
||||||
|
stub_dsv_db_info.active = 1
|
||||||
|
stub_dsv_db_info.manager = "mysql"
|
||||||
|
stub_datastore_version = datastore_models.DatastoreVersion(
|
||||||
|
stub_dsv_db_info)
|
||||||
|
when(DatabaseModelBase).find_by(id=any()).thenReturn(
|
||||||
|
stub_datastore_version)
|
||||||
|
|
||||||
server = mock(Server)
|
server = mock(Server)
|
||||||
server.user_id = 'test_user_id'
|
server.user_id = 'test_user_id'
|
||||||
mgmt_instance = mgmtmodels.SimpleMgmtInstance(self.context,
|
mgmt_instance = mgmtmodels.SimpleMgmtInstance(self.context,
|
||||||
|
@ -179,8 +201,14 @@ class TestNovaNotificationTransformer(MockMgmtInstanceTest):
|
||||||
|
|
||||||
server = mock(Server)
|
server = mock(Server)
|
||||||
server.user_id = 'test_user_id'
|
server.user_id = 'test_user_id'
|
||||||
|
stub_datastore_version = mock()
|
||||||
|
stub_datastore_version.id = "stub_datastore_version"
|
||||||
|
stub_datastore_version.manager = "m0ng0"
|
||||||
|
when(datastore_models.
|
||||||
|
DatastoreVersion).load(any()).thenReturn(stub_datastore_version)
|
||||||
|
|
||||||
stub_datastore = mock()
|
stub_datastore = mock()
|
||||||
stub_datastore.manager = "m0ng0"
|
stub_datastore.default_datastore_version = "stub_datastore_version"
|
||||||
when(datastore_models.
|
when(datastore_models.
|
||||||
Datastore).load(any()).thenReturn(stub_datastore)
|
Datastore).load(any()).thenReturn(stub_datastore)
|
||||||
mgmt_instance = mgmtmodels.SimpleMgmtInstance(self.context,
|
mgmt_instance = mgmtmodels.SimpleMgmtInstance(self.context,
|
||||||
|
|
Loading…
Reference in New Issue