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:
Evgeniy L 2015-07-22 15:35:40 +03:00
parent 8ad73785cf
commit c260a23091
5 changed files with 122 additions and 9 deletions

View File

@ -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())

View File

@ -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(

View File

@ -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'])

View File

@ -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: