Merge "Add upgrade check for networking-ovn db version"

This commit is contained in:
Zuul 2019-11-28 16:48:25 +00:00 committed by Gerrit Code Review
commit 1728d60ffd
2 changed files with 73 additions and 1 deletions

View File

@ -25,6 +25,11 @@ from neutron.db.models import agent as agent_model
from neutron.db import models_v2
OVN_ALEMBIC_TABLE_NAME = "ovn_alembic_version"
LAST_NETWORKING_OVN_EXPAND_HEAD = "e55d09277410"
LAST_NETWORKING_OVN_CONTRACT_HEAD = "1d271ead4eb6"
def get_l3_agents():
filters = {'agent_type': [constants.AGENT_TYPE_L3]}
ctx = context.get_admin_context()
@ -41,6 +46,18 @@ def get_networks():
return query.all()
def table_exists(table_name):
ctx = context.get_admin_context()
tables = [t[0] for t in ctx.session.execute("SHOW TABLES;")]
return table_name in tables
def get_ovn_db_revisions():
ctx = context.get_admin_context()
return [row[0] for row in ctx.session.execute(
"SELECT version_num from %s;" % OVN_ALEMBIC_TABLE_NAME)] # nosec
class CoreChecks(base.BaseChecks):
def get_checks(self):
@ -49,7 +66,8 @@ class CoreChecks(base.BaseChecks):
self.gateway_external_network_check),
(_("External network bridge"),
self.external_network_bridge_check),
(_("Worker counts configured"), self.worker_count_check)
(_("Worker counts configured"), self.worker_count_check),
(_("Networking-ovn database revision"), self.ovn_db_revision_check)
]
@staticmethod
@ -156,3 +174,27 @@ class CoreChecks(base.BaseChecks):
return upgradecheck.Result(
upgradecheck.Code.SUCCESS,
_("The 'mtu' attribute of all networks are set."))
@staticmethod
def ovn_db_revision_check(checker):
if not cfg.CONF.database.connection:
return upgradecheck.Result(
upgradecheck.Code.WARNING,
_("Database connection string is not set. Check of "
"networking-ovn database revision can't be done."))
if not table_exists(OVN_ALEMBIC_TABLE_NAME):
return upgradecheck.Result(
upgradecheck.Code.SUCCESS,
_("Networking-ovn alembic version table don't exists in "
"the database yet."))
revisions = get_ovn_db_revisions()
if (LAST_NETWORKING_OVN_EXPAND_HEAD not in revisions or
LAST_NETWORKING_OVN_CONTRACT_HEAD not in revisions):
return upgradecheck.Result(
upgradecheck.Code.FAILURE,
_("Networking-ovn database tables are not up to date. "
"Please firts update networking-ovn to the latest version "
"from Train release."))
return upgradecheck.Result(
upgradecheck.Code.SUCCESS,
_("Networking-ovn database tables are up to date."))

View File

@ -128,3 +128,33 @@ class TestChecks(base.BaseTestCase):
self.assertEqual(Code.WARNING, result.code)
self.assertIn('net-uuid-a', result.details)
self.assertNotIn('net-uuid-b', result.details)
def test_ovn_db_revision_check_no_networking_ovn_installed(self):
with mock.patch.object(checks, "table_exists", return_value=False),\
mock.patch.object(
checks, "get_ovn_db_revisions") as get_ovn_db_revisions:
result = checks.CoreChecks.ovn_db_revision_check(mock.Mock())
self.assertEqual(Code.SUCCESS, result.code)
get_ovn_db_revisions.assert_not_called()
def test_ovn_db_revision_check_networking_ovn_latest_revision(self):
revisions = [
checks.LAST_NETWORKING_OVN_EXPAND_HEAD,
checks.LAST_NETWORKING_OVN_CONTRACT_HEAD]
with mock.patch.object(checks, "table_exists", return_value=True),\
mock.patch.object(
checks, "get_ovn_db_revisions",
return_value=revisions) as get_ovn_db_revisions:
result = checks.CoreChecks.ovn_db_revision_check(mock.Mock())
self.assertEqual(Code.SUCCESS, result.code)
get_ovn_db_revisions.assert_called_once_with()
def test_ovn_db_revision_check_networking_ovn_not_latest_revision(self):
revisions = ["some_older_revision"]
with mock.patch.object(checks, "table_exists", return_value=True),\
mock.patch.object(
checks, "get_ovn_db_revisions",
return_value=revisions) as get_ovn_db_revisions:
result = checks.CoreChecks.ovn_db_revision_check(mock.Mock())
self.assertEqual(Code.FAILURE, result.code)
get_ovn_db_revisions.assert_called_once_with()