diff options
author | Bartosz Fic <bartosz.fic@intel.com> | 2014-10-07 18:13:51 +0200 |
---|---|---|
committer | Thierry Carrez <thierry@openstack.org> | 2014-10-08 13:56:47 +0200 |
commit | 76c66343a45cba0068c97d1ad21b46c63977e13d (patch) | |
tree | 4ac01d466be8587403f237bde93d0aaa93f31fdf | |
parent | da93f408dde9652a3f5e2daaa534852576b8f6f2 (diff) | |
download | glance-76c66343a45cba0068c97d1ad21b46c63977e13d.tar.gz |
Use ID for namespace generated by DB
In current implementation ID that is used in namespace to
insert data to DB is generated by built-in function - enumerate.
This causes problems with loading the metadata when there are already
namespaces in DB.
This patch removes 'enumerate' and asks for namespace ID
generated by database.
Closes-Bug: #1367771
Co-Authored-By: Bartosz Fic <bartosz.fic@intel.com>
Co-Authored-By: Pawel Koniszewski <pawel.koniszewski@intel.com>
(cherry picked from commit 89c04904416270d3c306d430f443a7127c5fc206)
Conflicts:
glance/db/sqlalchemy/metadata.py
Change-Id: I235c6310077526cafb898ac007c3601b4d66c9fe
-rw-r--r-- | glance/db/sqlalchemy/metadata.py | 112 |
1 files changed, 66 insertions, 46 deletions
diff --git a/glance/db/sqlalchemy/metadata.py b/glance/db/sqlalchemy/metadata.py index fb442a494..0bf85c1b3 100644 --- a/glance/db/sqlalchemy/metadata.py +++ b/glance/db/sqlalchemy/metadata.py @@ -27,6 +27,7 @@ from oslo.config import cfg import six import sqlalchemy from sqlalchemy.schema import MetaData +from sqlalchemy.sql import select from glance.common import utils from glance import i18n @@ -128,8 +129,7 @@ def _populate_metadata(meta, metadata_path=None): metadata_path) return - for namespace_id, json_schema_file in enumerate(json_schema_files, - start=1): + for json_schema_file in json_schema_files: try: file = join(metadata_path, json_schema_file) with open(file) as json_file: @@ -139,7 +139,6 @@ def _populate_metadata(meta, metadata_path=None): continue values = { - 'id': namespace_id, 'namespace': metadata.get('namespace', None), 'display_name': metadata.get('display_name', None), 'description': metadata.get('description', None), @@ -148,53 +147,74 @@ def _populate_metadata(meta, metadata_path=None): 'owner': metadata.get('owner', 'admin'), 'created_at': timeutils.utcnow() } - _insert_data_to_db(metadef_namespaces_table, values) - for resource_type in metadata.get('resource_type_associations', []): - try: - resource_type_id = \ - _get_resource_type_id(meta, resource_type['name']) - except AttributeError: + temp = metadef_namespaces_table.select( + whereclause='namespace = \'%s\'' % values['namespace'])\ + .execute().fetchone() + + if temp == None: + _insert_data_to_db(metadef_namespaces_table, values) + + db_namespace = select( + [metadef_namespaces_table.c.id] + ).where( + metadef_namespaces_table.c.namespace == values['namespace'] + ).select_from( + metadef_namespaces_table + ).execute().fetchone() + namespace_id = db_namespace['id'] + + for resource_type in metadata.get('resource_type_associations', + []): + try: + resource_type_id = \ + _get_resource_type_id(meta, resource_type['name']) + except AttributeError: + values = { + 'name': resource_type['name'], + 'protected': True, + 'created_at': timeutils.utcnow() + } + _insert_data_to_db(metadef_resource_types_table, + values) + resource_type_id =\ + _get_resource_type_id(meta, resource_type['name']) + values = { - 'name': resource_type['name'], - 'protected': True, - 'created_at': timeutils.utcnow() + 'resource_type_id': resource_type_id, + 'namespace_id': namespace_id, + 'created_at': timeutils.utcnow(), + 'properties_target': resource_type.get( + 'properties_target'), + 'prefix': resource_type.get('prefix', None) } - _insert_data_to_db(metadef_resource_types_table, + _insert_data_to_db(metadef_namespace_resource_types_tables, values) - resource_type_id =\ - _get_resource_type_id(meta, resource_type['name']) - - values = { - 'resource_type_id': resource_type_id, - 'namespace_id': namespace_id, - 'created_at': timeutils.utcnow(), - 'properties_target': resource_type.get('properties_target'), - 'prefix': resource_type.get('prefix', None) - } - _insert_data_to_db(metadef_namespace_resource_types_tables, - values) - - for property, schema in six.iteritems(metadata.get('properties', {})): - values = { - 'name': property, - 'namespace_id': namespace_id, - 'schema': json.dumps(schema), - 'created_at': timeutils.utcnow() - } - _insert_data_to_db(metadef_properties_table, values) - - for object in metadata.get('objects', []): - values = { - 'name': object.get('name', None), - 'description': object.get('description', None), - 'namespace_id': namespace_id, - 'schema': json.dumps(object.get('properties', None)), - 'created_at': timeutils.utcnow() - } - _insert_data_to_db(metadef_objects_table, values) - - LOG.info(_LI("File %s loaded to database."), file) + + for property, schema in six.iteritems(metadata.get('properties', + {})): + values = { + 'name': property, + 'namespace_id': namespace_id, + 'schema': json.dumps(schema), + 'created_at': timeutils.utcnow() + } + _insert_data_to_db(metadef_properties_table, values) + + for object in metadata.get('objects', []): + values = { + 'name': object.get('name', None), + 'description': object.get('description', None), + 'namespace_id': namespace_id, + 'schema': json.dumps(object.get('properties', None)), + 'created_at': timeutils.utcnow() + } + _insert_data_to_db(metadef_objects_table, values) + + LOG.info(_LI("File %s loaded to database."), file) + else: + LOG.info(_LI("Skipping namespace %s. It already exists in the " + "database."), values['namespace']) LOG.info(_LI("Metadata loading finished")) |