Add new sysinv tables k8s upgrades

The commit creates two new sysinv tables called kube_upgrade and
kube_host_upgrade in preparation for kubernetes upgrades.

Tested an install to ensure the new tables are defined in the
database.

Story: 2006590
Task: 36941
Change-Id: I8eed72b4a6ca34a1ac96dacb789669f91829af8e
Signed-off-by: Kristine Bujold <kristine.bujold@windriver.com>
This commit is contained in:
Kristine Bujold 2019-10-07 13:29:21 -04:00
parent 9077e37762
commit 83ae827e1c
13 changed files with 783 additions and 2 deletions

View File

@ -1,2 +1,2 @@
SRC_DIR="sysinv"
TIS_PATCH_VER=334
TIS_PATCH_VER=335

View File

@ -1388,4 +1388,21 @@ class FilesystemAlreadyExists(Conflict):
class FilesystemNotFound(NotFound):
message = _("No Host FS with id %(fs_id)s not found")
message = _("Host FS with id %(fs_id)s not found")
class KubeHostUpgradeAlreadyExists(Conflict):
message = _("A Kube Host Upgrade with id %(host_upgrade_id)s already exists.")
class KubeHostUpgradeNotFound(NotFound):
message = _("Kube Host Upgrade with id %(host_upgrade_id)s not found")
class KubeUpgradeAlreadyExists(Conflict):
message = _(
"A Kube Upgrade with id %(upgrade_id)s already exists.")
class KubeUpgradeNotFound(NotFound):
message = _("Kube Upgrade with id %(upgrade_id)s not found")

View File

@ -4434,3 +4434,111 @@ class Connection(object):
:param fs_id: The id or uuid of a filesystem.
"""
@abc.abstractmethod
def kube_host_upgrade_create(self, forhostid, values):
"""Create a new kube_host_upgrade for a host.
:param forhostid: uuid or id of an ihost
:param values: A dict containing several items used to identify
and track the kube_host_upgrade.
:returns: A kube_host_upgrade.
"""
@abc.abstractmethod
def kube_host_upgrade_get(self, host_upgrade_id):
"""Return kube_host_upgrade.
:param host_upgrade_id: The id or uuid of a kube_host_upgrade.
:returns: A kube_host_upgrade.
"""
@abc.abstractmethod
def kube_host_upgrade_get_list(self, limit=None, marker=None,
sort_key=None, sort_dir=None):
"""Return a list of kube_host_upgrade.
:param limit: Maximum number of kube_host_upgrade to return.
:param marker: the last item of the previous page; we return the next
result set.
:param sort_key: Attribute by which results should be sorted.
:param sort_dir: direction in which results should be sorted.
(asc, desc)
"""
@abc.abstractmethod
def kube_host_upgrade_get_by_host(self, host_id):
"""List all the kube_host_upgrade for a given ihost.
:param host_id: The id or uuid of an ihost.
:returns: A list of kube_host_upgrade.
"""
@abc.abstractmethod
def kube_host_upgrade_update(self, host_upgrade_id, values):
"""Update properties of a kube_host_upgrade.
:param host_upgrade_id: The id or uuid of a kube_host_upgrade.
:param values: Dict of values to update. May be a partial list.
:returns: A kube_host_upgrade.
"""
@abc.abstractmethod
def kube_host_upgrade_destroy(self, host_upgrade_id):
"""Destroy a kube_host_upgrade.
:param host_upgrade_id: The id or uuid of a kube_host_upgrade.
"""
@abc.abstractmethod
def kube_upgrade_create(self, values):
"""Create a new kube_upgrade for an isystem.
:param values: A dict containing several items used to identify
and track the kube_upgrade settings.
:returns: A kube_upgrade.
"""
@abc.abstractmethod
def kube_upgrade_get(self, upgrade_id):
"""Return an kube_upgrade.
:param upgrade_id: The id or uuid of an kube_upgrade.
:returns: A kube_upgrade.
"""
@abc.abstractmethod
def kube_upgrade_get_one(self):
"""Return exactly one kube_upgrade.
:returns: A kube_upgrade.
"""
@abc.abstractmethod
def kube_upgrade_get_list(self, limit=None, marker=None,
sort_key=None, sort_dir=None):
"""Return a list of kube_upgrade.
:param limit: Maximum number of kube_upgrade to return.
:param marker: the last item of the previous page; we return the next
result set.
:param sort_key: Attribute by which results should be sorted.
:param sort_dir: direction in which results should be sorted.
(asc, desc)
"""
@abc.abstractmethod
def kube_upgrade_update(self, upgrade_id, values):
"""Update properties of an kube_upgrade.
:param upgrade_id: The id or uuid of a kube_upgrade.
:param values: Dict of values to update.
:returns: A kube_upgrade.
"""
@abc.abstractmethod
def kube_upgrade_destroy(self, upgrade_id):
"""Destroy an kube_upgrade.
:param upgrade_id: The id or uuid of a kube_upgrade.
"""

View File

@ -1132,6 +1132,25 @@ def add_host_fs_filter(query, value):
return add_identity_filter(query, value, use_fsname=True)
def add_kube_host_upgrade_filter_by_host(query, value):
if utils.is_int_like(value):
return query.filter_by(host_id=value)
else:
query = query.join(models.ihost,
models.KubeHostUpgrade.host_id == models.ihost.id)
return query.filter(models.ihost.uuid == value)
def add_kube_host_upgrade_filter(query, value):
"""Adds an upgrade-specific filter to a query.
:param query: Initial query to add filter to.
:param value: Value for filtering results by.
:return: Modified query.
"""
return add_identity_filter(query, value)
def add_host_fs_filter_by_ihost(query, value):
if utils.is_int_like(value):
return query.filter_by(forihostid=value)
@ -8061,3 +8080,140 @@ class Connection(api.Connection):
model_query(models.HostFs, read_deleted="no").\
filter_by(id=fs_id).\
delete()
def _kube_host_upgrade_get(self, host_upgrade_id):
query = model_query(models.KubeHostUpgrade)
query = add_identity_filter(query, host_upgrade_id)
try:
result = query.one()
except NoResultFound:
raise exception.KubeHostUpgradeNotFound(
host_upgrade_id=host_upgrade_id)
return result
@objects.objectify(objects.kube_host_upgrade)
def kube_host_upgrade_create(self, host_id, values):
if not values.get('uuid'):
values['uuid'] = uuidutils.generate_uuid()
values['host_id'] = int(host_id)
upgrade = models.KubeHostUpgrade()
upgrade.update(values)
with _session_for_write() as session:
try:
session.add(upgrade)
session.flush()
except db_exc.DBDuplicateEntry:
raise exception.KubeHostUpgradeAlreadyExists(
uuid=values['uuid'], host=host_id)
return self._kube_host_upgrade_get(values['uuid'])
@objects.objectify(objects.kube_host_upgrade)
def kube_host_upgrade_get(self, host_upgrade_id):
return self._kube_host_upgrade_get(host_upgrade_id)
@objects.objectify(objects.kube_host_upgrade)
def kube_host_upgrade_get_list(self, limit=None, marker=None,
sort_key=None, sort_dir=None):
return _paginate_query(models.KubeHostUpgrade, limit, marker,
sort_key, sort_dir)
@objects.objectify(objects.kube_host_upgrade)
def kube_host_upgrade_get_by_host(self, host_id):
query = model_query(models.KubeHostUpgrade)
query = add_kube_host_upgrade_filter_by_host(query, host_id)
return query.one()
@objects.objectify(objects.kube_host_upgrade)
def kube_host_upgrade_update(self, host_upgrade_id, values):
with _session_for_write() as session:
query = model_query(models.KubeHostUpgrade, read_deleted="no",
session=session)
query = add_kube_host_upgrade_filter(query, host_upgrade_id)
count = query.update(values, synchronize_session='fetch')
if count != 1:
raise exception.KubeHostUpgradeNotFound(
host_upgrade_id=host_upgrade_id)
return query.one()
def kube_host_upgrade_destroy(self, host_upgrade_id):
with _session_for_write() as session:
# Delete physically since it has unique columns
if uuidutils.is_uuid_like(host_upgrade_id):
model_query(models.KubeHostUpgrade,
read_deleted="no", session=session).filter_by(
uuid=host_upgrade_id).delete()
else:
model_query(models.KubeHostUpgrade, read_deleted="no").\
filter_by(id=host_upgrade_id).delete()
def _kube_upgrade_get(self, upgrade_id):
query = model_query(models.KubeUpgrade)
query = add_identity_filter(query, upgrade_id)
try:
return query.one()
except NoResultFound:
raise exception.KubeUpgradeNotFound(upgrade_id=upgrade_id)
@objects.objectify(objects.kube_upgrade)
def kube_upgrade_create(self, values):
if not values.get('uuid'):
values['uuid'] = uuidutils.generate_uuid()
kube_upgrade = models.KubeUpgrade()
kube_upgrade.update(values)
with _session_for_write() as session:
try:
session.add(kube_upgrade)
session.flush()
except db_exc.DBDuplicateEntry:
raise exception.KubeUpgradeAlreadyExists(uuid=values['uuid'])
return self._kube_upgrade_get(values['uuid'])
@objects.objectify(objects.kube_upgrade)
def kube_upgrade_get(self, server):
return self._kube_upgrade_get(server)
@objects.objectify(objects.kube_upgrade)
def kube_upgrade_get_one(self):
query = model_query(models.KubeUpgrade)
try:
return query.one()
except NoResultFound:
raise exception.NotFound()
@objects.objectify(objects.kube_upgrade)
def kube_upgrade_get_list(self, limit=None, marker=None,
sort_key=None, sort_dir=None):
query = model_query(models.KubeUpgrade)
return _paginate_query(models.KubeUpgrade, limit, marker,
sort_key, sort_dir, query)
@objects.objectify(objects.kube_upgrade)
def kube_upgrade_update(self, upgrade_id, values):
with _session_for_write() as session:
query = model_query(models.KubeUpgrade, session=session)
query = add_identity_filter(query, upgrade_id)
count = query.update(values, synchronize_session='fetch')
if count != 1:
raise exception.KubeUpgradeNotFound(upgrade_id=upgrade_id)
return query.one()
def kube_upgrade_destroy(self, upgrade_id):
with _session_for_write() as session:
query = model_query(models.KubeUpgrade, session=session)
query = add_identity_filter(query, upgrade_id)
try:
query.one()
except NoResultFound:
raise exception.KubeUpgradeNotFound(upgrade_id=upgrade_id)
query.delete()

View File

@ -0,0 +1,88 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright (c) 2019 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
from sqlalchemy import DateTime, String, Integer
from sqlalchemy import Column, MetaData, Table, ForeignKey
ENGINE = 'InnoDB'
CHARSET = 'utf8'
def upgrade(migrate_engine):
"""
This database upgrade creates a new kube_upgrade and kube_host_upgrade
tables for storing kubernetes upgrade info.
"""
meta = MetaData()
meta.bind = migrate_engine
meta = MetaData()
meta.bind = migrate_engine
kube_upgrade = Table(
'kube_upgrade',
meta,
Column('created_at', DateTime),
Column('updated_at', DateTime),
Column('deleted_at', DateTime),
Column('id', Integer, primary_key=True, nullable=False),
Column('uuid', String(36), unique=True),
Column('from_version', String(255)),
Column('to_version', String(255)),
Column('state', String(128)),
Column('reserved_1', String(255)),
Column('reserved_2', String(255)),
Column('reserved_3', String(255)),
Column('reserved_4', String(255)),
mysql_engine=ENGINE,
mysql_charset=CHARSET,
)
kube_upgrade.create()
Table('i_host',
meta,
Column('id', Integer, primary_key=True, nullable=False),
mysql_engine=ENGINE, mysql_charset=CHARSET, autoload=True)
kube_host_upgrade = Table(
'kube_host_upgrade',
meta,
Column('created_at', DateTime),
Column('updated_at', DateTime),
Column('deleted_at', DateTime),
Column('id', Integer, primary_key=True, nullable=False),
Column('uuid', String(36), unique=True),
Column('target_version', String(255)),
Column('status', String(128)),
Column('reserved_1', String(255)),
Column('reserved_2', String(255)),
Column('reserved_3', String(255)),
Column('reserved_4', String(255)),
Column('host_id', Integer,
ForeignKey('i_host.id', ondelete='CASCADE')),
mysql_engine=ENGINE,
mysql_charset=CHARSET,
)
kube_host_upgrade.create()
def downgrade(migrate_engine):
meta = MetaData()
meta.bind = migrate_engine
# Downgrade is unsupported.
raise NotImplementedError('SysInv database downgrade is unsupported.')

View File

@ -242,6 +242,7 @@ class ihost(Base):
system = relationship("isystem")
host_upgrade = relationship("HostUpgrade", uselist=False)
kube_host_upgrade = relationship("KubeHostUpgrade", uselist=False)
class inode(Base):
@ -1725,6 +1726,39 @@ class KubeAppReleases(Base):
UniqueConstraint('release', 'namespace', 'app_id', name='u_app_release_namespace')
class KubeHostUpgrade(Base):
__tablename__ = 'kube_host_upgrade'
id = Column(Integer, primary_key=True)
uuid = Column(String(36))
target_version = Column(String(255), nullable=False)
status = Column(String(128), nullable=False)
reserved_1 = Column(String(255))
reserved_2 = Column(String(255))
reserved_3 = Column(String(255))
reserved_4 = Column(String(255))
host_id = Column(Integer, ForeignKey('i_host.id', ondelete='CASCADE'))
host = relationship("ihost", lazy="joined", join_depth=1)
class KubeUpgrade(Base):
__tablename__ = 'kube_upgrade'
id = Column(Integer, primary_key=True)
uuid = Column(String(36))
from_version = Column(String(255), nullable=False)
to_version = Column(String(255), nullable=False)
state = Column(String(128), nullable=False)
reserved_1 = Column(String(255))
reserved_2 = Column(String(255))
reserved_3 = Column(String(255))
reserved_4 = Column(String(255))
class HostFs(Base):
__tablename__ = 'host_fs'

View File

@ -38,6 +38,8 @@ from sysinv.objects import host
from sysinv.objects import host_upgrade
from sysinv.objects import kube_app
from sysinv.objects import kube_app_releases
from sysinv.objects import kube_host_upgrade
from sysinv.objects import kube_upgrade
from sysinv.objects import interface
from sysinv.objects import interface_ae
from sysinv.objects import interface_ethernet
@ -185,6 +187,8 @@ helm_overrides = helm_overrides.HelmOverrides
label = label.Label
kube_app = kube_app.KubeApp
kube_app_releases = kube_app_releases.KubeAppReleases
kube_host_upgrade = kube_host_upgrade.KubeHostUpgrade
kube_upgrade = kube_upgrade.KubeUpgrade
datanetwork = datanetwork.DataNetwork
host_fs = host_fs.HostFS
@ -254,6 +258,8 @@ __all__ = (system,
helm_overrides,
kube_app,
kube_app_releases,
kube_host_upgrade,
kube_upgrade,
datanetwork,
interface_network,
host_fs,

View File

@ -0,0 +1,47 @@
#
# Copyright (c) 2019 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# coding=utf-8
#
from sysinv.db import api as db_api
from sysinv.objects import base
from sysinv.objects import utils
class KubeHostUpgrade(base.SysinvObject):
dbapi = db_api.get_instance()
fields = {
'id': int,
'uuid': utils.str_or_none,
'target_version': utils.int_or_none,
'status': utils.str_or_none,
'reserved_1': utils.str_or_none,
'reserved_2': utils.str_or_none,
'reserved_3': utils.str_or_none,
'reserved_4': utils.str_or_none,
'host_id': int,
'host_uuid': utils.str_or_none,
}
_foreign_fields = {'host_uuid': 'host:uuid'}
@base.remotable_classmethod
def get_by_uuid(cls, context, uuid):
return cls.dbapi.kube_host_upgrade_get(uuid)
@base.remotable_classmethod
def get_by_host_id(cls, context, host_id):
return cls.dbapi.kube_host_upgrade_get_by_host(host_id)
def save_changes(self, context, updates):
self.dbapi.kube_host_upgrade_update(self.uuid, # pylint: disable=no-member
updates)

View File

@ -0,0 +1,39 @@
#
# Copyright (c) 2019 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# coding=utf-8
#
from sysinv.db import api as db_api
from sysinv.objects import base
from sysinv.objects import utils
class KubeUpgrade(base.SysinvObject):
dbapi = db_api.get_instance()
fields = {
'id': int,
'uuid': utils.str_or_none,
'from_version': utils.str_or_none,
'to_version': utils.int_or_none,
'state': utils.str_or_none,
'reserved_1': utils.str_or_none,
'reserved_2': utils.str_or_none,
'reserved_3': utils.str_or_none,
'reserved_4': utils.str_or_none,
}
@base.remotable_classmethod
def get_by_uuid(cls, context, uuid):
return cls.dbapi.kube_upgrade_get(uuid)
def save_changes(self, context, updates):
self.dbapi.kube_upgrade_update(self.uuid, # pylint: disable=no-member
updates)

View File

@ -132,6 +132,7 @@ class BaseSystemTestCase(BaseIPv4Mixin, DbTestCase):
def _create_test_common(self):
self._create_test_system()
self._create_test_load()
self._create_test_kube_upgrades()
self._create_test_drbd()
self._create_test_remotelogging()
self._create_test_user()
@ -178,6 +179,29 @@ class BaseSystemTestCase(BaseIPv4Mixin, DbTestCase):
self.ptp = dbutils.create_test_ptp(
system_id=self.system.id)
def _create_test_kube_upgrades(self):
# Test kube_upgrade and kube_host_upgrade table creation
upgrade = dbutils.create_test_kube_upgrade()
host_upgrade = dbutils.create_test_kube_host_upgrade()
# Test updating state in kube_upgrade table
old_state = upgrade['state']
new_state = 'upgrading'
self.assertNotEqual(old_state, new_state)
res = self.dbapi.kube_upgrade_update(
upgrade['id'], {'state': new_state})
self.assertEqual(new_state, res['state'])
# Test updating status in kube_host_upgrade table
old_status = host_upgrade['status']
new_status = new_state
self.assertNotEqual(old_status, new_status)
res = self.dbapi.kube_host_upgrade_update(
host_upgrade['uuid'], {'status': new_status})
self.assertEqual(new_status, res['status'])
def _create_test_network(self, name, nettype, subnet, ranges=None):
if not ranges:
ranges = [(str(subnet[2]), str(subnet[-2]))]

View File

@ -26,6 +26,8 @@ from sysinv.openstack.common import jsonutils as json
from sysinv.db import api as db_api
from sysinv.openstack.common import uuidutils
fake_info = {"foo": "bar"}
ipmi_info = json.dumps(
@ -234,6 +236,68 @@ def create_test_load(**kw):
return dbapi.load_create(load)
def get_test_kube_upgrade():
upgrade = {
'id': 1,
'uuid': uuidutils.generate_uuid(),
"from_version": 1,
"to_version": 2,
"state": "tbd",
"reserved_1": "res1",
"reserved_2": "res2",
"reserved_3": "res3",
"reserved_4": "res4",
}
return upgrade
def get_test_kube_host_upgrade():
upgrade = {
'id': 1,
'uuid': uuidutils.generate_uuid(),
"target_version": 2,
"status": "tbd",
"reserved_1": "",
"reserved_2": "",
"reserved_3": "",
"reserved_4": "",
"host_id": 1,
}
return upgrade
def create_test_kube_upgrade():
upgrade = get_test_kube_upgrade()
# Let DB generate ID and uuid
if 'id' in upgrade:
del upgrade['id']
if 'uuid' in upgrade:
del upgrade['uuid']
dbapi = db_api.get_instance()
return dbapi.kube_upgrade_create(upgrade)
def create_test_kube_host_upgrade():
upgrade = get_test_kube_upgrade()
# Let DB generate ID, uuid and host_id
if 'id' in upgrade:
del upgrade['id']
if 'uuid' in upgrade:
del upgrade['uuid']
if 'host_id' in upgrade:
del upgrade['host_id']
dbapi = db_api.get_instance()
hostid = 1
return dbapi.kube_host_upgrade_create(hostid, upgrade)
# Create test user object
def get_test_user(**kw):
user = {

View File

@ -0,0 +1,99 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# coding=utf-8
#
#
# Copyright (c) 2019 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
#
from sysinv.db import api as db_api
from sysinv.db.sqlalchemy import models
from sysinv import objects
from sysinv.tests.db import base
from sysinv.tests.db import utils
class TestKubeHostUpgradesObject(base.DbTestCase):
def setUp(self):
super(TestKubeHostUpgradesObject, self).setUp()
self.fake_upgrade_data = utils.get_test_kube_host_upgrade()
self.obj_data = objects.kube_host_upgrade.from_db_object(
self._get_db_data(self.fake_upgrade_data))
self.dbapi = db_api.get_instance()
def test_load(self):
uuid = self.fake_upgrade_data['uuid']
self.mox.StubOutWithMock(self.dbapi, 'kube_host_upgrade_get')
self.dbapi.kube_host_upgrade_get(uuid).AndReturn(self.obj_data)
self.mox.ReplayAll()
objects.kube_host_upgrade.get_by_uuid(self.admin_context, uuid)
self.mox.VerifyAll()
def test_save(self):
uuid = self.fake_upgrade_data['uuid']
self.mox.StubOutWithMock(self.dbapi, 'kube_host_upgrade_get')
self.mox.StubOutWithMock(self.dbapi, 'kube_host_upgrade_update')
self.dbapi.kube_host_upgrade_get(uuid).AndReturn(self.obj_data)
self.dbapi.kube_host_upgrade_update(uuid, {'status': "upgrading"})
self.mox.ReplayAll()
n = objects.kube_host_upgrade.get_by_uuid(self.admin_context, uuid)
n.status = "upgrading"
n.save()
self.mox.VerifyAll()
def test_refresh(self):
uuid = self.fake_upgrade_data['uuid']
self.mox.StubOutWithMock(self.dbapi, 'kube_host_upgrade_get')
first_obj = objects.kube_host_upgrade.from_db_object(self._get_db_data(
dict(self.fake_upgrade_data, target_version=1)))
second_obj = objects.kube_host_upgrade.from_db_object(self._get_db_data(
dict(self.fake_upgrade_data, target_version=2)))
self.dbapi.kube_host_upgrade_get(uuid).AndReturn(first_obj)
self.dbapi.kube_host_upgrade_get(uuid).AndReturn(second_obj)
self.mox.ReplayAll()
n = objects.kube_host_upgrade.get_by_uuid(self.admin_context, uuid)
self.assertEqual(n.target_version, 1)
n.refresh()
self.assertEqual(n.target_version, 2)
self.mox.VerifyAll()
def test_objectify(self):
@objects.objectify(objects.kube_host_upgrade)
def _convert_db_data():
return self._get_db_data(self.fake_upgrade_data)
self.assertIsInstance(self._get_db_data(self.fake_upgrade_data),
models.KubeHostUpgrade)
self.assertIsInstance(_convert_db_data(), objects.kube_host_upgrade)
def test_objectify_many(self):
def _get_db_data_many():
data = []
for i in range(5):
data.append(self._get_db_data(self.fake_upgrade_data))
return data
@objects.objectify(objects.kube_host_upgrade)
def _convert_db_data_many():
return _get_db_data_many()
for n in _get_db_data_many():
self.assertIsInstance(n, models.KubeHostUpgrade)
for n in _convert_db_data_many():
self.assertIsInstance(n, objects.kube_host_upgrade)
def _get_db_data(self, fake_upgrade_data):
n = models.KubeHostUpgrade()
n.update(fake_upgrade_data)
return n

View File

@ -0,0 +1,99 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# coding=utf-8
#
#
# Copyright (c) 2019 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
#
from sysinv.db import api as db_api
from sysinv.db.sqlalchemy import models
from sysinv import objects
from sysinv.tests.db import base
from sysinv.tests.db import utils
class TestKubeUpgradesObject(base.DbTestCase):
def setUp(self):
super(TestKubeUpgradesObject, self).setUp()
self.fake_upgrade_data = utils.get_test_kube_upgrade()
self.obj_data = objects.kube_upgrade.from_db_object(
self._get_db_data(self.fake_upgrade_data))
self.dbapi = db_api.get_instance()
def test_load(self):
uuid = self.fake_upgrade_data['uuid']
self.mox.StubOutWithMock(self.dbapi, 'kube_upgrade_get')
self.dbapi.kube_upgrade_get(uuid).AndReturn(self.obj_data)
self.mox.ReplayAll()
objects.kube_upgrade.get_by_uuid(self.admin_context, uuid)
self.mox.VerifyAll()
def test_save(self):
uuid = self.fake_upgrade_data['uuid']
self.mox.StubOutWithMock(self.dbapi, 'kube_upgrade_get')
self.mox.StubOutWithMock(self.dbapi, 'kube_upgrade_update')
self.dbapi.kube_upgrade_get(uuid).AndReturn(self.obj_data)
self.dbapi.kube_upgrade_update(uuid, {'state': "upgrading"})
self.mox.ReplayAll()
n = objects.kube_upgrade.get_by_uuid(self.admin_context, uuid)
n.state = "upgrading"
n.save()
self.mox.VerifyAll()
def test_refresh(self):
uuid = self.fake_upgrade_data['uuid']
self.mox.StubOutWithMock(self.dbapi, 'kube_upgrade_get')
first_obj = objects.kube_upgrade.from_db_object(self._get_db_data(
dict(self.fake_upgrade_data, to_version=1)))
second_obj = objects.kube_upgrade.from_db_object(self._get_db_data(
dict(self.fake_upgrade_data, to_version=2)))
self.dbapi.kube_upgrade_get(uuid).AndReturn(first_obj)
self.dbapi.kube_upgrade_get(uuid).AndReturn(second_obj)
self.mox.ReplayAll()
n = objects.kube_upgrade.get_by_uuid(self.admin_context, uuid)
self.assertEqual(n.to_version, 1)
n.refresh()
self.assertEqual(n.to_version, 2)
self.mox.VerifyAll()
def test_objectify(self):
@objects.objectify(objects.kube_upgrade)
def _convert_db_data():
return self._get_db_data(self.fake_upgrade_data)
self.assertIsInstance(self._get_db_data(self.fake_upgrade_data),
models.KubeUpgrade)
self.assertIsInstance(_convert_db_data(), objects.kube_upgrade)
def test_objectify_many(self):
def _get_db_data_many():
data = []
for i in range(5):
data.append(self._get_db_data(self.fake_upgrade_data))
return data
@objects.objectify(objects.kube_upgrade)
def _convert_db_data_many():
return _get_db_data_many()
for n in _get_db_data_many():
self.assertIsInstance(n, models.KubeUpgrade)
for n in _convert_db_data_many():
self.assertIsInstance(n, objects.kube_upgrade)
def _get_db_data(self, fake_upgrade_data):
n = models.KubeUpgrade()
n.update(fake_upgrade_data)
return n