Codebase list glance / 1a40831
Making DB sanity checking be optional for DB migration Adding a deprecated option to skip the DB sanity check to db_sync interface, to give deployer a chance to execute migration script. Without this change all migration scripts will be blocked before get execution. DocImpact Change-Id: If887ac6b814879a0140dc1065a060233aee7bc82 Partial-Bug: #1279000 Related-Id: I7f271d846141ac72dde3fb0d12159b125018eb2c Signed-off-by: Zhi Yan Liu <zhiyanl@cn.ibm.com> Zhi Yan Liu 10 years ago
3 changed file(s) with 119 addition(s) and 17 deletion(s). Raw diff Collapse all Expand all
549549 # Base directory that the Image Cache uses
550550 image_cache_dir = /var/lib/glance/image-cache/
551551
552
553 # =============== Manager Options =================================
554
555 # DEPRECATED. TO BE REMOVED IN THE JUNO RELEASE.
556 # Whether or not to enforce that all DB tables have charset utf8.
557 # If your database tables do not have charset utf8 you will
558 # need to convert before this option is removed. This option is
559 # only relevant if your database engine is MySQL.
560 #db_enforce_mysql_charset = True
561
552562 [keystone_authtoken]
553563 auth_host = 127.0.0.1
554564 auth_port = 35357
4747 from glance.openstack.common import log
4848 from glance.openstack.common import strutils
4949
50
51 LOG = log.getLogger(__name__)
52
53 manager_opts = [
54 cfg.BoolOpt('db_enforce_mysql_charset',
55 default=True,
56 help=_('DEPRECATED. TO BE REMOVED IN THE JUNO RELEASE. '
57 'Whether or not to enforce that all DB tables have '
58 'charset utf8. If your database tables do not have '
59 'charset utf8 you will need to convert before this '
60 'option is removed. This option is only relevant if '
61 'your database engine is MySQL.'))
62 ]
63
5064 CONF = cfg.CONF
65 CONF.register_opts(manager_opts)
5166 CONF.import_group("database", "glance.openstack.common.db.options")
5267
5368
6580 def __init__(self):
6681 pass
6782
83 def _need_sanity_check(self):
84 if not CONF.db_enforce_mysql_charset:
85 LOG.warning(_('Warning: '
86 'The db_enforce_mysql_charset option is now '
87 'deprecated and will be removed in the Juno '
88 'release. Please migrate DB manually e.g. '
89 'convert data of all tables to UTF-8 charset.'))
90 return CONF.db_enforce_mysql_charset
91
6892 def version(self):
6993 """Print database's current migration level"""
7094 print(migration.db_version(db_api.get_engine(),
76100 """Upgrade the database's migration level"""
77101 migration.db_sync(db_api.get_engine(),
78102 db_migration.MIGRATE_REPO_PATH,
79 version)
103 version,
104 sanity_check=self._need_sanity_check())
80105
81106 @args('--version', metavar='<version>', help='Database version')
82107 def downgrade(self, version=None):
83108 """Downgrade the database's migration level"""
84109 migration.db_sync(db_api.get_engine(),
85110 db_migration.MIGRATE_REPO_PATH,
86 version)
111 version,
112 sanity_check=self._need_sanity_check())
87113
88114 @args('--version', metavar='<version>', help='Database version')
89115 def version_control(self, version=None):
100126 Place a database under migration control and upgrade/downgrade it,
101127 creating first if necessary.
102128 """
103 if current_version is not None:
129 if current_version not in (None, 'None'):
104130 migration.db_version_control(db_api.get_engine(),
105131 db_migration.MIGRATE_REPO_PATH,
106 current_version)
132 version=current_version)
107133 migration.db_sync(db_api.get_engine(),
108134 db_migration.MIGRATE_REPO_PATH,
109 version)
135 version,
136 sanity_check=self._need_sanity_check())
110137
111138
112139 class DbLegacyCommands(object):
3131 def clear_conf():
3232 manage.CONF.reset()
3333 manage.CONF.unregister_opt(manage.command_opt)
34 manage.CONF.db_enforce_mysql_charset = True
3435 self.addCleanup(clear_conf)
3536
3637 self.patcher = mock.patch('glance.db.sqlalchemy.api.get_engine')
3738 self.patcher.start()
3839 self.addCleanup(self.patcher.stop)
3940
40 def _main_test_helper(self, argv, func_name=None, *exp_args):
41 def _main_test_helper(self, argv, func_name=None, *exp_args, **exp_kwargs):
4142 self.useFixture(fixtures.MonkeyPatch('sys.argv', argv))
4243 manage.main()
43 func_name.assert_called_once_with(*exp_args)
44 func_name.assert_called_once_with(*exp_args, **exp_kwargs)
4445
4546
4647 class TestLegacyManage(TestManageBase):
5960 glance.openstack.common.db.sqlalchemy.
6061 migration.db_sync,
6162 db_api.get_engine(),
62 db_migration.MIGRATE_REPO_PATH, None)
63 db_migration.MIGRATE_REPO_PATH, None,
64 sanity_check=True)
6365
6466 def test_legacy_db_upgrade(self):
6567 migration.db_sync = mock.Mock()
6668 self._main_test_helper(['glance.cmd.manage', 'db_upgrade'],
6769 migration.db_sync,
6870 db_api.get_engine(),
69 db_migration.MIGRATE_REPO_PATH, None)
71 db_migration.MIGRATE_REPO_PATH, None,
72 sanity_check=True)
7073
7174 def test_legacy_db_version_control(self):
7275 migration.db_version_control = mock.Mock()
8083 self._main_test_helper(['glance.cmd.manage', 'db_sync', '20'],
8184 migration.db_sync,
8285 db_api.get_engine(),
83 db_migration.MIGRATE_REPO_PATH, '20')
86 db_migration.MIGRATE_REPO_PATH, '20',
87 sanity_check=True)
8488
8589 def test_legacy_db_upgrade_version(self):
8690 migration.db_sync = mock.Mock()
8791 self._main_test_helper(['glance.cmd.manage', 'db_upgrade', '20'],
8892 migration.db_sync,
8993 db_api.get_engine(),
90 db_migration.MIGRATE_REPO_PATH, '20')
94 db_migration.MIGRATE_REPO_PATH, '20',
95 sanity_check=True)
9196
9297 def test_legacy_db_downgrade_version(self):
9398 migration.db_sync = mock.Mock()
9499 self._main_test_helper(['glance.cmd.manage', 'db_downgrade', '20'],
95100 migration.db_sync,
96101 db_api.get_engine(),
97 db_migration.MIGRATE_REPO_PATH, '20')
102 db_migration.MIGRATE_REPO_PATH, '20',
103 sanity_check=True)
104
105 def test_legacy_db_sync_version_without_sanity_check(self):
106 migration.db_sync = mock.Mock()
107 manage.CONF.db_enforce_mysql_charset = False
108 self._main_test_helper(['glance.cmd.manage', 'db_sync', '20'],
109 migration.db_sync,
110 db_api.get_engine(),
111 db_migration.MIGRATE_REPO_PATH, '20',
112 sanity_check=False)
113
114 def test_legacy_db_upgrade_version_without_sanity_check(self):
115 migration.db_sync = mock.Mock()
116 manage.CONF.db_enforce_mysql_charset = False
117 self._main_test_helper(['glance.cmd.manage', 'db_upgrade', '40'],
118 migration.db_sync,
119 db_api.get_engine(),
120 db_migration.MIGRATE_REPO_PATH, '40',
121 sanity_check=False)
122
123 def test_legacy_db_downgrade_version_without_sanity_check(self):
124 migration.db_sync = mock.Mock()
125 manage.CONF.db_enforce_mysql_charset = False
126 self._main_test_helper(['glance.cmd.manage', 'db_downgrade', '20'],
127 migration.db_sync,
128 db_api.get_engine(),
129 db_migration.MIGRATE_REPO_PATH, '20',
130 sanity_check=False)
98131
99132
100133 class TestManage(TestManageBase):
111144 self._main_test_helper(['glance.cmd.manage', 'db', 'sync'],
112145 migration.db_sync,
113146 db_api.get_engine(),
114 db_migration.MIGRATE_REPO_PATH, None)
147 db_migration.MIGRATE_REPO_PATH, None,
148 sanity_check=True)
115149
116150 def test_db_upgrade(self):
117151 migration.db_sync = mock.Mock()
118152 self._main_test_helper(['glance.cmd.manage', 'db', 'upgrade'],
119153 migration.db_sync,
120154 db_api.get_engine(),
121 db_migration.MIGRATE_REPO_PATH, None)
155 db_migration.MIGRATE_REPO_PATH, None,
156 sanity_check=True)
122157
123158 def test_db_version_control(self):
124159 migration.db_version_control = mock.Mock()
132167 self._main_test_helper(['glance.cmd.manage', 'db', 'sync', '20'],
133168 migration.db_sync,
134169 db_api.get_engine(),
135 db_migration.MIGRATE_REPO_PATH, u'20')
170 db_migration.MIGRATE_REPO_PATH, '20',
171 sanity_check=True)
136172
137173 def test_db_upgrade_version(self):
138174 migration.db_sync = mock.Mock()
139175 self._main_test_helper(['glance.cmd.manage', 'db', 'upgrade', '20'],
140176 migration.db_sync,
141177 db_api.get_engine(),
142 db_migration.MIGRATE_REPO_PATH, '20')
178 db_migration.MIGRATE_REPO_PATH, '20',
179 sanity_check=True)
143180
144181 def test_db_downgrade_version(self):
145182 migration.db_sync = mock.Mock()
146183 self._main_test_helper(['glance.cmd.manage', 'db', 'downgrade', '20'],
147184 migration.db_sync,
148185 db_api.get_engine(),
149 db_migration.MIGRATE_REPO_PATH, '20')
186 db_migration.MIGRATE_REPO_PATH, '20',
187 sanity_check=True)
188
189 def test_db_sync_version_without_sanity_check(self):
190 migration.db_sync = mock.Mock()
191 manage.CONF.db_enforce_mysql_charset = False
192 self._main_test_helper(['glance.cmd.manage', 'db', 'sync', '20'],
193 migration.db_sync,
194 db_api.get_engine(),
195 db_migration.MIGRATE_REPO_PATH, u'20',
196 sanity_check=False)
197
198 def test_db_upgrade_version_without_sanity_check(self):
199 migration.db_sync = mock.Mock()
200 manage.CONF.db_enforce_mysql_charset = False
201 self._main_test_helper(['glance.cmd.manage', 'db', 'upgrade', '40'],
202 migration.db_sync,
203 db_api.get_engine(),
204 db_migration.MIGRATE_REPO_PATH, '40',
205 sanity_check=False)
206
207 def test_db_downgrade_version_without_sanity_check(self):
208 migration.db_sync = mock.Mock()
209 manage.CONF.db_enforce_mysql_charset = False
210 self._main_test_helper(['glance.cmd.manage', 'db', 'downgrade', '20'],
211 migration.db_sync,
212 db_api.get_engine(),
213 db_migration.MIGRATE_REPO_PATH, '20',
214 sanity_check=False)