Migrations for extensions should not depend on Core's db schema
There should be a way to use and test extensions when there is no core database schema. * perform data migration from the core only when there is buffer table * add basic tests which are run separately from core's tests Change-Id: Ide0d2e619913675ff4fff3febc9707bec3bfb112 Closes-bug: #1477020
This commit is contained in:
parent
8ad73785cf
commit
c260a23091
|
@ -0,0 +1,27 @@
|
||||||
|
# Copyright 2015 Mirantis, Inc.
|
||||||
|
#
|
||||||
|
# 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.engine.reflection import Inspector
|
||||||
|
|
||||||
|
from nailgun.extensions.consts import extensions_migration_buffer_table_name
|
||||||
|
|
||||||
|
|
||||||
|
def is_buffer_table_exist(connection):
|
||||||
|
"""Performs check if buffer table exists in the database.
|
||||||
|
|
||||||
|
:returns: True if table exists, False otherwise
|
||||||
|
"""
|
||||||
|
inspector = Inspector.from_engine(connection)
|
||||||
|
return (extensions_migration_buffer_table_name in
|
||||||
|
inspector.get_table_names())
|
|
@ -24,22 +24,37 @@ Create Date: 2015-06-19 16:16:44.513714
|
||||||
revision = '086cde3de7cf'
|
revision = '086cde3de7cf'
|
||||||
down_revision = None
|
down_revision = None
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
from alembic import context
|
from alembic import context
|
||||||
from alembic import op
|
from alembic import op
|
||||||
from oslo.serialization import jsonutils
|
from oslo.serialization import jsonutils
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
from nailgun.db.sqlalchemy.models.fields import JSON
|
from nailgun.db.sqlalchemy.models.fields import JSON
|
||||||
from nailgun.extensions.consts import extensions_migration_buffer_table_name
|
from nailgun.extensions.consts import extensions_migration_buffer_table_name
|
||||||
|
from nailgun.extensions.utils import is_buffer_table_exist
|
||||||
|
|
||||||
|
logger = logging.getLogger('alembic.migration')
|
||||||
config = context.config
|
config = context.config
|
||||||
table_prefix = config.get_main_option('table_prefix')
|
table_prefix = config.get_main_option('table_prefix')
|
||||||
table_volumes_name = '{0}node_volumes'.format(table_prefix)
|
table_volumes_name = '{0}node_volumes'.format(table_prefix)
|
||||||
|
|
||||||
|
|
||||||
def migrate_data_from_core(connection):
|
def migrate_data_from_core(connection):
|
||||||
|
if not is_buffer_table_exist(connection):
|
||||||
|
# NOTE(eli): if there is no buffer table it means that there
|
||||||
|
# is no core database we should not run data migrations includes
|
||||||
|
# this case because extension might be installed and used
|
||||||
|
# separately from Nailgun core and its database
|
||||||
|
logger.warn(
|
||||||
|
"Cannot find buffer table '{0}'. "
|
||||||
|
"Don't run data migrations from buffer table, "
|
||||||
|
"because extension might be installed and used "
|
||||||
|
"separately from Nailgun core and its database".format(
|
||||||
|
extensions_migration_buffer_table_name))
|
||||||
|
return
|
||||||
|
|
||||||
ext_name = 'volume_manager'
|
ext_name = 'volume_manager'
|
||||||
|
|
||||||
select_query = sa.sql.text(
|
select_query = sa.sql.text(
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Copyright 2015 Mirantis, Inc.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
import alembic
|
||||||
|
|
||||||
|
from ..extension import VolumeManagerExtension
|
||||||
|
from nailgun import db
|
||||||
|
from nailgun.db.migration import make_alembic_config_from_extension
|
||||||
|
from nailgun.test import base
|
||||||
|
|
||||||
|
|
||||||
|
_test_revision = '086cde3de7cf'
|
||||||
|
|
||||||
|
|
||||||
|
def setup_module(module):
|
||||||
|
alembic_config = make_alembic_config_from_extension(VolumeManagerExtension)
|
||||||
|
db.dropdb()
|
||||||
|
alembic.command.upgrade(alembic_config, _test_revision)
|
||||||
|
|
||||||
|
|
||||||
|
class TestAddVolumes(base.BaseAlembicMigrationTest):
|
||||||
|
|
||||||
|
def test_works_without_core_migrations(self):
|
||||||
|
columns = [
|
||||||
|
t.name for t in
|
||||||
|
self.meta.tables['volume_manager_node_volumes'].columns]
|
||||||
|
|
||||||
|
self.assertItemsEqual(columns, ['id', 'node_id', 'volumes'])
|
44
run_tests.sh
44
run_tests.sh
|
@ -33,6 +33,8 @@ function usage {
|
||||||
echo " -U, --no-upgrade Don't run tests for UPGRADE system"
|
echo " -U, --no-upgrade Don't run tests for UPGRADE system"
|
||||||
echo " -w, --webui Run all UI tests"
|
echo " -w, --webui Run all UI tests"
|
||||||
echo " -W, --no-webui Don't run all UI tests"
|
echo " -W, --no-webui Don't run all UI tests"
|
||||||
|
echo " -e, --extensions Run EXTENSIONS unit/integration tests"
|
||||||
|
echo " -E, --no-extensions Don't run EXTENSIONS unit/integration tests"
|
||||||
echo " --ui-lint Run UI linting tasks"
|
echo " --ui-lint Run UI linting tasks"
|
||||||
echo " --no-ui-lint Don't run UI linting tasks"
|
echo " --no-ui-lint Don't run UI linting tasks"
|
||||||
echo " --ui-unit Run UI unit tests"
|
echo " --ui-unit Run UI unit tests"
|
||||||
|
@ -62,6 +64,8 @@ function process_options {
|
||||||
-P|--no-flake8) no_flake8_checks=1;;
|
-P|--no-flake8) no_flake8_checks=1;;
|
||||||
-w|--webui) ui_lint_checks=1; ui_unit_tests=1; ui_func_tests=1;;
|
-w|--webui) ui_lint_checks=1; ui_unit_tests=1; ui_func_tests=1;;
|
||||||
-W|--no-webui) no_ui_lint_checks=1; no_ui_unit_tests=1; no_ui_func_tests=1;;
|
-W|--no-webui) no_ui_lint_checks=1; no_ui_unit_tests=1; no_ui_func_tests=1;;
|
||||||
|
-e|--extensions) extensions_tests=1;;
|
||||||
|
-E|--no-extensions) no_extensions_tests=1;;
|
||||||
--ui-lint) ui_lint_checks=1;;
|
--ui-lint) ui_lint_checks=1;;
|
||||||
--no-ui-lint) no_ui_lint_checks=1;;
|
--no-ui-lint) no_ui_lint_checks=1;;
|
||||||
--ui-unit) ui_unit_tests=1;;
|
--ui-unit) ui_unit_tests=1;;
|
||||||
|
@ -94,6 +98,7 @@ testropts="--with-timer --timer-warning=10 --timer-ok=2 --timer-top-n=10"
|
||||||
NAILGUN_XUNIT=${NAILGUN_XUNIT:-"$ROOT/nailgun.xml"}
|
NAILGUN_XUNIT=${NAILGUN_XUNIT:-"$ROOT/nailgun.xml"}
|
||||||
FUELUPGRADE_XUNIT=${FUELUPGRADE_XUNIT:-"$ROOT/fuelupgrade.xml"}
|
FUELUPGRADE_XUNIT=${FUELUPGRADE_XUNIT:-"$ROOT/fuelupgrade.xml"}
|
||||||
SHOTGUN_XUNIT=${SHOTGUN_XUNIT:-"$ROOT/shotgun.xml"}
|
SHOTGUN_XUNIT=${SHOTGUN_XUNIT:-"$ROOT/shotgun.xml"}
|
||||||
|
EXTENSIONS_XUNIT=${EXTENSIONS_XUNIT:-"$ROOT/extensions.xml"}
|
||||||
UI_SERVER_PORT=${UI_SERVER_PORT:-5544}
|
UI_SERVER_PORT=${UI_SERVER_PORT:-5544}
|
||||||
NAILGUN_PORT=${NAILGUN_PORT:-8003}
|
NAILGUN_PORT=${NAILGUN_PORT:-8003}
|
||||||
TEST_NAILGUN_DB=${TEST_NAILGUN_DB:-nailgun}
|
TEST_NAILGUN_DB=${TEST_NAILGUN_DB:-nailgun}
|
||||||
|
@ -121,6 +126,8 @@ ui_unit_tests=0
|
||||||
no_ui_unit_tests=0
|
no_ui_unit_tests=0
|
||||||
ui_func_tests=0
|
ui_func_tests=0
|
||||||
no_ui_func_tests=0
|
no_ui_func_tests=0
|
||||||
|
extensions_tests=0
|
||||||
|
no_extensions_tests=0
|
||||||
certain_tests=0
|
certain_tests=0
|
||||||
ui_func_selenium_tests=0
|
ui_func_selenium_tests=0
|
||||||
|
|
||||||
|
@ -154,15 +161,18 @@ function run_tests {
|
||||||
$ui_func_selenium_tests -eq 0 && \
|
$ui_func_selenium_tests -eq 0 && \
|
||||||
$upgrade_system -eq 0 && \
|
$upgrade_system -eq 0 && \
|
||||||
$shotgun_tests -eq 0 && \
|
$shotgun_tests -eq 0 && \
|
||||||
|
$extensions_tests -eq 0 && \
|
||||||
$flake8_checks -eq 0 ]]; then
|
$flake8_checks -eq 0 ]]; then
|
||||||
|
|
||||||
if [ $no_nailgun_tests -ne 1 ]; then nailgun_tests=1; fi
|
if [ $no_nailgun_tests -ne 1 ]; then nailgun_tests=1; fi
|
||||||
if [ $no_ui_lint_checks -ne 1 ]; then ui_lint_checks=1; fi
|
if [ $no_ui_lint_checks -ne 1 ]; then ui_lint_checks=1; fi
|
||||||
if [ $no_ui_unit_tests -ne 1 ]; then ui_unit_tests=1; fi
|
if [ $no_ui_unit_tests -ne 1 ]; then ui_unit_tests=1; fi
|
||||||
if [ $no_ui_func_tests -ne 1 ]; then ui_func_tests=1; fi
|
if [ $no_ui_func_tests -ne 1 ]; then ui_func_tests=1; fi
|
||||||
if [ $no_upgrade_system -ne 1 ]; then upgrade_system=1; fi
|
if [ $no_upgrade_system -ne 1 ]; then upgrade_system=1; fi
|
||||||
if [ $no_shotgun_tests -ne 1 ]; then shotgun_tests=1; fi
|
if [ $no_shotgun_tests -ne 1 ]; then shotgun_tests=1; fi
|
||||||
if [ $no_flake8_checks -ne 1 ]; then flake8_checks=1; fi
|
if [ $no_flake8_checks -ne 1 ]; then flake8_checks=1; fi
|
||||||
|
if [ $no_extensions_tests -ne 1 ]; then extensions_tests=1; fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Run all enabled tests
|
# Run all enabled tests
|
||||||
|
@ -206,6 +216,11 @@ function run_tests {
|
||||||
run_shotgun_tests || errors+=" shotgun_tests"
|
run_shotgun_tests || errors+=" shotgun_tests"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ $extensions_tests -eq 1 ]; then
|
||||||
|
echo "Starting Extensions tests..."
|
||||||
|
run_extensions_tests || errors+=" extensions_tests"
|
||||||
|
fi
|
||||||
|
|
||||||
# print failed tests
|
# print failed tests
|
||||||
if [ -n "$errors" ]; then
|
if [ -n "$errors" ]; then
|
||||||
echo Failed tests: $errors
|
echo Failed tests: $errors
|
||||||
|
@ -440,6 +455,21 @@ function run_flake8_subproject {
|
||||||
return $result
|
return $result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Run tests for Nailgun extensions
|
||||||
|
function run_extensions_tests {
|
||||||
|
local EXTENSIONS_PATH="$ROOT/nailgun/nailgun/extensions/"
|
||||||
|
local NAILGUN_PATH="$ROOT/nailgun/"
|
||||||
|
local result=0
|
||||||
|
|
||||||
|
pushd "${NAILGUN_PATH}" >> /dev/null
|
||||||
|
tox -epy26 -- -vv "${EXTENSIONS_PATH}" --junit-xml $EXTENSIONS_XUNIT || result=1
|
||||||
|
popd >> /dev/null
|
||||||
|
|
||||||
|
return $result
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# Check python code with flake8 and pep8.
|
# Check python code with flake8 and pep8.
|
||||||
#
|
#
|
||||||
# Some settings description:
|
# Some settings description:
|
||||||
|
|
Loading…
Reference in New Issue