From 6365f4141715c6806d40698add59c294613bc063 Mon Sep 17 00:00:00 2001 From: Lorin Hochstein Date: Wed, 25 May 2011 09:35:35 -0400 Subject: Added model for InstanceTypeMetadata --- nova/db/sqlalchemy/models.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py index 1215448f8..0c0a5a479 100644 --- a/nova/db/sqlalchemy/models.py +++ b/nova/db/sqlalchemy/models.py @@ -635,6 +635,19 @@ class InstanceMetadata(BASE, NovaBase): 'InstanceMetadata.instance_id == Instance.id,' 'InstanceMetadata.deleted == False)') +class InstanceTypeMetadata(BASE, NovaBase): + """Represents a metadata key/value pair for an instance_type""" + __tablename__ = 'instance_type_metadata' + id = Column(Integer, primary_key=True) + key = Column(String(255)) + value = Column(String(255)) + instance_type_id = Column(Integer, ForeignKey('instance_types.id'), nullable=False) + instance = relationship(InstanceType, backref="metadata", + foreign_keys=instance_type_id, + primaryjoin='and_(' + 'InstanceTypeMetadata.instance_type_id == InstanceType.id,' + 'InstanceTypeMetadata.deleted == False)') + class Zone(BASE, NovaBase): """Represents a child zone of this zone.""" -- cgit From f694bc15b921cd4affa5b5b63ed0eb9073516b44 Mon Sep 17 00:00:00 2001 From: Lorin Hochstein Date: Wed, 25 May 2011 12:07:40 -0400 Subject: Adding the migrate code to add the new table --- .../versions/019_add_instance_type_metadata.py | 68 ++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 nova/db/sqlalchemy/migrate_repo/versions/019_add_instance_type_metadata.py (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/migrate_repo/versions/019_add_instance_type_metadata.py b/nova/db/sqlalchemy/migrate_repo/versions/019_add_instance_type_metadata.py new file mode 100644 index 000000000..4ceb8c36d --- /dev/null +++ b/nova/db/sqlalchemy/migrate_repo/versions/019_add_instance_type_metadata.py @@ -0,0 +1,68 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 University of Southern California +# +# 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 import Boolean, Column, DateTime, ForeignKey, Integer +from sqlalchemy import MetaData, String, Table +from nova import log as logging + +meta = MetaData() + +# Just for the ForeignKey and column creation to succeed, these are not the +# actual definitions of instances or services. +instance_types = Table('instance_types', meta, + Column('id', Integer(), primary_key=True, nullable=False), + ) + + + +# +# New Tables +# + +instance_type_metadata_table = Table('instance_type_metadata', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('instance_type_id', + Integer(), + ForeignKey('instance_types.id'), + nullable=False), + Column('key', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('value', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False))) + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta.bind = migrate_engine + for table in (instance_type_metadata_table, ): + try: + table.create() + except Exception: + logging.info(repr(table)) + logging.exception('Exception while creating table') + raise + +def downgrade(migrate_engine): + # Operations to reverse the above upgrade go here. + for table in (instance_type_metadata_table, ): + table.drop() + -- cgit From 354b2303e684e50cccb28f7b8af13b19a27e0415 Mon Sep 17 00:00:00 2001 From: Lorin Hochstein Date: Wed, 25 May 2011 12:15:58 -0400 Subject: Fixing the InstanceTypesMetadata table definition --- nova/db/sqlalchemy/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py index 0c0a5a479..a32b22b39 100644 --- a/nova/db/sqlalchemy/models.py +++ b/nova/db/sqlalchemy/models.py @@ -642,10 +642,10 @@ class InstanceTypeMetadata(BASE, NovaBase): key = Column(String(255)) value = Column(String(255)) instance_type_id = Column(Integer, ForeignKey('instance_types.id'), nullable=False) - instance = relationship(InstanceType, backref="metadata", + instance_type = relationship(InstanceTypes, backref="metadata", foreign_keys=instance_type_id, primaryjoin='and_(' - 'InstanceTypeMetadata.instance_type_id == InstanceType.id,' + 'InstanceTypeMetadata.instance_type_id == InstanceTypes.id,' 'InstanceTypeMetadata.deleted == False)') -- cgit From 7aa62856ebff4242b123f5e0888276237176d066 Mon Sep 17 00:00:00 2001 From: Lorin Hochstein Date: Wed, 25 May 2011 12:19:52 -0400 Subject: InstanceTypesMetadata is now registered --- nova/db/sqlalchemy/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py index a32b22b39..e20feb71a 100644 --- a/nova/db/sqlalchemy/models.py +++ b/nova/db/sqlalchemy/models.py @@ -666,12 +666,12 @@ def register_models(): connection is lost and needs to be reestablished. """ from sqlalchemy import create_engine - models = (Service, Instance, InstanceActions, InstanceTypes, + models = (Service, Instance, InstanceActions, InstanceTypes, Volume, ExportDevice, IscsiTarget, FixedIp, FloatingIp, Network, SecurityGroup, SecurityGroupIngressRule, SecurityGroupInstanceAssociation, AuthToken, User, Project, Certificate, ConsolePool, Console, Zone, - InstanceMetadata, Migration) + InstanceMetadata, InstanceTypesMetadata, Migration) engine = create_engine(FLAGS.sql_connection, echo=False) for model in models: model.metadata.create_all(engine) -- cgit From 6141221d01026ce277d34ae329767139178b1ea0 Mon Sep 17 00:00:00 2001 From: Lorin Hochstein Date: Wed, 25 May 2011 12:29:23 -0400 Subject: pep8 fixes --- .../versions/019_add_instance_type_metadata.py | 5 ++--- nova/db/sqlalchemy/models.py | 14 ++++++++------ 2 files changed, 10 insertions(+), 9 deletions(-) (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/migrate_repo/versions/019_add_instance_type_metadata.py b/nova/db/sqlalchemy/migrate_repo/versions/019_add_instance_type_metadata.py index 4ceb8c36d..22b741614 100644 --- a/nova/db/sqlalchemy/migrate_repo/versions/019_add_instance_type_metadata.py +++ b/nova/db/sqlalchemy/migrate_repo/versions/019_add_instance_type_metadata.py @@ -26,8 +26,6 @@ instance_types = Table('instance_types', meta, Column('id', Integer(), primary_key=True, nullable=False), ) - - # # New Tables # @@ -49,6 +47,7 @@ instance_type_metadata_table = Table('instance_type_metadata', meta, String(length=255, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False))) + def upgrade(migrate_engine): # Upgrade operations go here. Don't create your own engine; # bind migrate_engine to your metadata @@ -61,8 +60,8 @@ def upgrade(migrate_engine): logging.exception('Exception while creating table') raise + def downgrade(migrate_engine): # Operations to reverse the above upgrade go here. for table in (instance_type_metadata_table, ): table.drop() - diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py index e20feb71a..f806becb5 100644 --- a/nova/db/sqlalchemy/models.py +++ b/nova/db/sqlalchemy/models.py @@ -635,18 +635,20 @@ class InstanceMetadata(BASE, NovaBase): 'InstanceMetadata.instance_id == Instance.id,' 'InstanceMetadata.deleted == False)') + class InstanceTypeMetadata(BASE, NovaBase): """Represents a metadata key/value pair for an instance_type""" __tablename__ = 'instance_type_metadata' id = Column(Integer, primary_key=True) key = Column(String(255)) value = Column(String(255)) - instance_type_id = Column(Integer, ForeignKey('instance_types.id'), nullable=False) + instance_type_id = Column(Integer, ForeignKey('instance_types.id'), + nullable=False) instance_type = relationship(InstanceTypes, backref="metadata", - foreign_keys=instance_type_id, - primaryjoin='and_(' - 'InstanceTypeMetadata.instance_type_id == InstanceTypes.id,' - 'InstanceTypeMetadata.deleted == False)') + foreign_keys=instance_type_id, + primaryjoin='and_(' + 'InstanceTypeMetadata.instance_type_id == InstanceTypes.id,' + 'InstanceTypeMetadata.deleted == False)') class Zone(BASE, NovaBase): @@ -666,7 +668,7 @@ def register_models(): connection is lost and needs to be reestablished. """ from sqlalchemy import create_engine - models = (Service, Instance, InstanceActions, InstanceTypes, + models = (Service, Instance, InstanceActions, InstanceTypes, Volume, ExportDevice, IscsiTarget, FixedIp, FloatingIp, Network, SecurityGroup, SecurityGroupIngressRule, SecurityGroupInstanceAssociation, AuthToken, User, -- cgit From 775566067a1f764baec5036357ad47a57316da03 Mon Sep 17 00:00:00 2001 From: Lorin Hochstein Date: Wed, 25 May 2011 16:58:12 -0400 Subject: Fixed a typo --- nova/db/sqlalchemy/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py index f806becb5..d57feddd5 100644 --- a/nova/db/sqlalchemy/models.py +++ b/nova/db/sqlalchemy/models.py @@ -673,7 +673,7 @@ def register_models(): Network, SecurityGroup, SecurityGroupIngressRule, SecurityGroupInstanceAssociation, AuthToken, User, Project, Certificate, ConsolePool, Console, Zone, - InstanceMetadata, InstanceTypesMetadata, Migration) + InstanceMetadata, InstanceTypeMetadata, Migration) engine = create_engine(FLAGS.sql_connection, echo=False) for model in models: model.metadata.create_all(engine) -- cgit From 65c26759fa8607f89614a6c90a55172805359538 Mon Sep 17 00:00:00 2001 From: Lorin Hochstein Date: Fri, 27 May 2011 13:03:36 -0400 Subject: Adding accessor methods for instance type metadata --- nova/db/api.py | 17 +++++++++++++ nova/db/sqlalchemy/api.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) (limited to 'nova/db') diff --git a/nova/db/api.py b/nova/db/api.py index ef8aa1143..4700d7f30 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -1208,3 +1208,20 @@ def instance_metadata_delete(context, instance_id, key): def instance_metadata_update_or_create(context, instance_id, metadata): """Create or update instance metadata.""" IMPL.instance_metadata_update_or_create(context, instance_id, metadata) + +#################### + + +def instance_type_metadata_get(context, instance_type_id): + """Get all metadata for an instance type.""" + return IMPL.instance_type_metadata_get(context, instance_type_id) + + +def instance_type_metadata_delete(context, instance_type_id, key): + """Delete the given metadata item.""" + IMPL.instance_type_metadata_delete(context, instance_type_id, key) + + +def instance_type_metadata_update_or_create(context, instance_type_id, metadata): + """Create or update instance type metadata.""" + IMPL.instance_type_metadata_update_or_create(context, instance_type_id, metadata) diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index b53e81053..9d33ff61f 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -2579,3 +2579,66 @@ def instance_metadata_update_or_create(context, instance_id, metadata): "deleted": 0}) meta_ref.save(session=session) return metadata + +#################### + +@require_context +def instance_type_metadata_get(context, instance_type_id): + session = get_session() + + meta_results = session.query(models.InstanceTypeMetadata).\ + filter_by(instance_type_id=instance_type_id).\ + filter_by(deleted=False).\ + all() + + meta_dict = {} + for i in meta_results: + meta_dict[i['key']] = i['value'] + return meta_dict + + +@require_context +def instance_type_metadata_delete(context, instance_type_id, key): + session = get_session() + session.query(models.InstanceTypeMetadata).\ + filter_by(instance_type_id=instance_type_id).\ + filter_by(key=key).\ + filter_by(deleted=False).\ + update({'deleted': True, + 'deleted_at': datetime.datetime.utcnow(), + 'updated_at': literal_column('updated_at')}) + + +@require_context +def instance_type_metadata_get_item(context, instance_type_id, key): + session = get_session() + + meta_result = session.query(models.InstanceMetadata).\ + filter_by(instance_type_id=instance_type_id).\ + filter_by(key=key).\ + filter_by(deleted=False).\ + first() + + if not meta_result: + raise exception.InstanceTypeMetadataNotFound(metadata_key=key, + instance_type_id=instance_type_id) + return meta_result + + +@require_context +def instance_type_metadata_update_or_create(context, instance_type_id, + metadata): + session = get_session() + meta_ref = None + for key, value in metadata.iteritems(): + try: + meta_ref = instance_type_metadata_get_item(context, + instance_type_id, key, + session) + except: + meta_ref = models.InstanceTypeMetadata() + meta_ref.update({"key": key, "value": value, + "instance_type_id": instance_id, + "deleted": 0}) + meta_ref.save(session=session) + return metadata -- cgit From 556ccd9b0d9c7809395b7720e5dcfb6af514f69f Mon Sep 17 00:00:00 2001 From: Lorin Hochstein Date: Fri, 27 May 2011 13:03:57 -0400 Subject: Changed metadata to meta to avoid sqlalchemy collision --- nova/db/sqlalchemy/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py index d57feddd5..b3e87e77c 100644 --- a/nova/db/sqlalchemy/models.py +++ b/nova/db/sqlalchemy/models.py @@ -644,7 +644,7 @@ class InstanceTypeMetadata(BASE, NovaBase): value = Column(String(255)) instance_type_id = Column(Integer, ForeignKey('instance_types.id'), nullable=False) - instance_type = relationship(InstanceTypes, backref="metadata", + instance_type = relationship(InstanceTypes, backref="meta", foreign_keys=instance_type_id, primaryjoin='and_(' 'InstanceTypeMetadata.instance_type_id == InstanceTypes.id,' -- cgit From aa18d32cf20c0bfbbc81ddf234ac59ecf310ccb0 Mon Sep 17 00:00:00 2001 From: Lorin Hochstein Date: Fri, 27 May 2011 13:44:40 -0400 Subject: Added test for instance type metadata update --- nova/db/sqlalchemy/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 9d33ff61f..14d53d9ed 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -2638,7 +2638,7 @@ def instance_type_metadata_update_or_create(context, instance_type_id, except: meta_ref = models.InstanceTypeMetadata() meta_ref.update({"key": key, "value": value, - "instance_type_id": instance_id, + "instance_type_id": instance_type_id, "deleted": 0}) meta_ref.save(session=session) return metadata -- cgit From 19e4a081509217ec04d92ae092917d590cbd8f30 Mon Sep 17 00:00:00 2001 From: Lorin Hochstein Date: Fri, 27 May 2011 14:20:08 -0400 Subject: Modified instance_type_create to take metadata --- nova/db/sqlalchemy/api.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 14d53d9ed..523bc2a56 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -2373,7 +2373,22 @@ def console_get(context, console_id, instance_id=None): @require_admin_context def instance_type_create(_context, values): + """Create a new instance type. In order to pass in metadata, + the values dict should contain a 'meta' key/value pair: + + {'meta' : {'k1': 'v1', 'k2': 'v2', ...}} + + """ try: + metadata = values.get('meta') + metadata_refs = [] + if metadata: + for k, v in metadata.iteritems(): + metadata_ref = models.InstanceTypeMetadata() + metadata_ref['key'] = k + metadata_ref['value'] = v + metadata_refs.append(metadata_ref) + values['meta'] = metadata_refs instance_type_ref = models.InstanceTypes() instance_type_ref.update(values) instance_type_ref.save() -- cgit From 69a49743d733459e532a47e6b588045fe65a6145 Mon Sep 17 00:00:00 2001 From: Lorin Hochstein Date: Fri, 27 May 2011 14:29:23 -0400 Subject: Fixing pep8 problems --- nova/db/api.py | 9 ++++++--- nova/db/sqlalchemy/api.py | 18 ++++++++++-------- 2 files changed, 16 insertions(+), 11 deletions(-) (limited to 'nova/db') diff --git a/nova/db/api.py b/nova/db/api.py index 4700d7f30..3582b7a44 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -1222,6 +1222,9 @@ def instance_type_metadata_delete(context, instance_type_id, key): IMPL.instance_type_metadata_delete(context, instance_type_id, key) -def instance_type_metadata_update_or_create(context, instance_type_id, metadata): - """Create or update instance type metadata.""" - IMPL.instance_type_metadata_update_or_create(context, instance_type_id, metadata) +def instance_type_metadata_update_or_create(context, instance_type_id, + metadata): + """Create or update instance type metadata. This adds or modifies the + key/value pairs specified in the metadata dict argument""" + IMPL.instance_type_metadata_update_or_create(context, instance_type_id, + metadata) diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 523bc2a56..3e783f534 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -2373,11 +2373,11 @@ def console_get(context, console_id, instance_id=None): @require_admin_context def instance_type_create(_context, values): - """Create a new instance type. In order to pass in metadata, - the values dict should contain a 'meta' key/value pair: - + """Create a new instance type. In order to pass in metadata, + the values dict should contain a 'meta' key/value pair: + {'meta' : {'k1': 'v1', 'k2': 'v2', ...}} - + """ try: metadata = values.get('meta') @@ -2597,6 +2597,7 @@ def instance_metadata_update_or_create(context, instance_id, metadata): #################### + @require_context def instance_type_metadata_get(context, instance_type_id): session = get_session() @@ -2635,19 +2636,20 @@ def instance_type_metadata_get_item(context, instance_type_id, key): first() if not meta_result: - raise exception.InstanceTypeMetadataNotFound(metadata_key=key, - instance_type_id=instance_type_id) + raise exception.\ + InstanceTypeMetadataNotFound(metadata_key=key, + instance_type_id=instance_type_id) return meta_result @require_context -def instance_type_metadata_update_or_create(context, instance_type_id, +def instance_type_metadata_update_or_create(context, instance_type_id, metadata): session = get_session() meta_ref = None for key, value in metadata.iteritems(): try: - meta_ref = instance_type_metadata_get_item(context, + meta_ref = instance_type_metadata_get_item(context, instance_type_id, key, session) except: -- cgit From 1a62d0a546e15b1e4e9dbc06b0bc422734594fdb Mon Sep 17 00:00:00 2001 From: Lorin Hochstein Date: Wed, 1 Jun 2011 11:38:10 -0400 Subject: Bumped migration number --- .../versions/019_add_instance_type_metadata.py | 67 ---------------------- .../versions/021_add_instance_type_metadata.py | 67 ++++++++++++++++++++++ 2 files changed, 67 insertions(+), 67 deletions(-) delete mode 100644 nova/db/sqlalchemy/migrate_repo/versions/019_add_instance_type_metadata.py create mode 100644 nova/db/sqlalchemy/migrate_repo/versions/021_add_instance_type_metadata.py (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/migrate_repo/versions/019_add_instance_type_metadata.py b/nova/db/sqlalchemy/migrate_repo/versions/019_add_instance_type_metadata.py deleted file mode 100644 index 22b741614..000000000 --- a/nova/db/sqlalchemy/migrate_repo/versions/019_add_instance_type_metadata.py +++ /dev/null @@ -1,67 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2011 University of Southern California -# -# 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 import Boolean, Column, DateTime, ForeignKey, Integer -from sqlalchemy import MetaData, String, Table -from nova import log as logging - -meta = MetaData() - -# Just for the ForeignKey and column creation to succeed, these are not the -# actual definitions of instances or services. -instance_types = Table('instance_types', meta, - Column('id', Integer(), primary_key=True, nullable=False), - ) - -# -# New Tables -# - -instance_type_metadata_table = Table('instance_type_metadata', meta, - Column('created_at', DateTime(timezone=False)), - Column('updated_at', DateTime(timezone=False)), - Column('deleted_at', DateTime(timezone=False)), - Column('deleted', Boolean(create_constraint=True, name=None)), - Column('id', Integer(), primary_key=True, nullable=False), - Column('instance_type_id', - Integer(), - ForeignKey('instance_types.id'), - nullable=False), - Column('key', - String(length=255, convert_unicode=False, assert_unicode=None, - unicode_error=None, _warn_on_bytestring=False)), - Column('value', - String(length=255, convert_unicode=False, assert_unicode=None, - unicode_error=None, _warn_on_bytestring=False))) - - -def upgrade(migrate_engine): - # Upgrade operations go here. Don't create your own engine; - # bind migrate_engine to your metadata - meta.bind = migrate_engine - for table in (instance_type_metadata_table, ): - try: - table.create() - except Exception: - logging.info(repr(table)) - logging.exception('Exception while creating table') - raise - - -def downgrade(migrate_engine): - # Operations to reverse the above upgrade go here. - for table in (instance_type_metadata_table, ): - table.drop() diff --git a/nova/db/sqlalchemy/migrate_repo/versions/021_add_instance_type_metadata.py b/nova/db/sqlalchemy/migrate_repo/versions/021_add_instance_type_metadata.py new file mode 100644 index 000000000..22b741614 --- /dev/null +++ b/nova/db/sqlalchemy/migrate_repo/versions/021_add_instance_type_metadata.py @@ -0,0 +1,67 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 University of Southern California +# +# 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 import Boolean, Column, DateTime, ForeignKey, Integer +from sqlalchemy import MetaData, String, Table +from nova import log as logging + +meta = MetaData() + +# Just for the ForeignKey and column creation to succeed, these are not the +# actual definitions of instances or services. +instance_types = Table('instance_types', meta, + Column('id', Integer(), primary_key=True, nullable=False), + ) + +# +# New Tables +# + +instance_type_metadata_table = Table('instance_type_metadata', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('instance_type_id', + Integer(), + ForeignKey('instance_types.id'), + nullable=False), + Column('key', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('value', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False))) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta.bind = migrate_engine + for table in (instance_type_metadata_table, ): + try: + table.create() + except Exception: + logging.info(repr(table)) + logging.exception('Exception while creating table') + raise + + +def downgrade(migrate_engine): + # Operations to reverse the above upgrade go here. + for table in (instance_type_metadata_table, ): + table.drop() -- cgit From b10621f5f85cccde3d159afddb78398544d4c32e Mon Sep 17 00:00:00 2001 From: Eldar Nugaev Date: Thu, 16 Jun 2011 17:30:36 +0400 Subject: First implementation of FloatingIpController --- nova/db/api.py | 3 +++ nova/db/sqlalchemy/api.py | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+) (limited to 'nova/db') diff --git a/nova/db/api.py b/nova/db/api.py index 4e0aa60a2..8348d90ae 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -223,6 +223,9 @@ def certificate_update(context, certificate_id, values): ################### +def floating_ip_get(context, floating_ip_id): + return IMPL.floating_ip_get(context, floating_ip_id) + def floating_ip_allocate_address(context, host, project_id): """Allocate free floating ip and return the address. diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 73870d2f3..c3b517492 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -428,6 +428,29 @@ def certificate_update(context, certificate_id, values): ################### +@require_context +def floating_ip_get(context, ip_id): + session = get_session() + result = None + if is_admin_context(context): + result = session.query(models.FloatingIp).\ + options(joinedload('fixed_ip')).\ + options(joinedload_all('fixed_ip.instance')).\ + filter_by(id=ip_id).\ + filter_by(deleted=can_read_deleted(context)).\ + first() + elif is_user_context(context): + result = session.query(models.FloatingIp).\ + options(joinedload('fixed_ip')).\ + options(joinedload_all('fixed_ip.instance')).\ + filter_by(project_id=context.project_id).\ + filter_by(id=ip_id).\ + filter_by(deleted=False).\ + first() + if not result: + raise exception.FloatingIpNotFound() + + return result @require_context -- cgit From d68f6de8d8275ec6dd9f231b9b52971f2ad15263 Mon Sep 17 00:00:00 2001 From: Lorin Hochstein Date: Thu, 16 Jun 2011 16:33:29 -0400 Subject: Rename: intance_type_metadata -> instance_type_extra_specs --- nova/db/api.py | 24 +++---- nova/db/sqlalchemy/api.py | 77 +++++++++++----------- .../versions/021_add_instance_type_extra_specs.py | 67 +++++++++++++++++++ .../versions/021_add_instance_type_metadata.py | 67 ------------------- nova/db/sqlalchemy/models.py | 12 ++-- 5 files changed, 124 insertions(+), 123 deletions(-) create mode 100644 nova/db/sqlalchemy/migrate_repo/versions/021_add_instance_type_extra_specs.py delete mode 100644 nova/db/sqlalchemy/migrate_repo/versions/021_add_instance_type_metadata.py (limited to 'nova/db') diff --git a/nova/db/api.py b/nova/db/api.py index 5ade51f02..a1a434d3d 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -1251,19 +1251,19 @@ def instance_metadata_update_or_create(context, instance_id, metadata): #################### -def instance_type_metadata_get(context, instance_type_id): - """Get all metadata for an instance type.""" - return IMPL.instance_type_metadata_get(context, instance_type_id) +def instance_type_extra_specs_get(context, instance_type_id): + """Get all extra specs for an instance type.""" + return IMPL.instance_type_extra_specs_get(context, instance_type_id) -def instance_type_metadata_delete(context, instance_type_id, key): - """Delete the given metadata item.""" - IMPL.instance_type_metadata_delete(context, instance_type_id, key) +def instance_type_extra_specs_delete(context, instance_type_id, key): + """Delete the given extra specs item.""" + IMPL.instance_type_extra_specs_delete(context, instance_type_id, key) -def instance_type_metadata_update_or_create(context, instance_type_id, - metadata): - """Create or update instance type metadata. This adds or modifies the - key/value pairs specified in the metadata dict argument""" - IMPL.instance_type_metadata_update_or_create(context, instance_type_id, - metadata) +def instance_type_extra_specs_update_or_create(context, instance_type_id, + extra_specs): + """Create or update instance type extra specs. This adds or modifies the + key/value pairs specified in the extra specs dict argument""" + IMPL.instance_type_extra_specs_update_or_create(context, instance_type_id, + extra_specs) diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 0c7f31366..e586bbc64 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -2456,22 +2456,22 @@ def console_get(context, console_id, instance_id=None): @require_admin_context def instance_type_create(_context, values): - """Create a new instance type. In order to pass in metadata, - the values dict should contain a 'meta' key/value pair: + """Create a new instance type. In order to pass in extra specs, + the values dict should contain a 'extra_specs' key/value pair: - {'meta' : {'k1': 'v1', 'k2': 'v2', ...}} + {'extra_specs' : {'k1': 'v1', 'k2': 'v2', ...}} """ try: - metadata = values.get('meta') - metadata_refs = [] - if metadata: - for k, v in metadata.iteritems(): - metadata_ref = models.InstanceTypeMetadata() - metadata_ref['key'] = k - metadata_ref['value'] = v - metadata_refs.append(metadata_ref) - values['meta'] = metadata_refs + specs = values.get('extra_specs') + specs_refs = [] + if specs: + for k, v in specs.iteritems(): + specs_ref = models.InstanceTypeExtraSpecs() + specs_ref['key'] = k + specs_ref['value'] = v + specs_refs.append(specs_ref) + values['extra_specs'] = specs_refs instance_type_ref = models.InstanceTypes() instance_type_ref.update(values) instance_type_ref.save() @@ -2697,24 +2697,24 @@ def instance_metadata_update_or_create(context, instance_id, metadata): @require_context -def instance_type_metadata_get(context, instance_type_id): +def instance_type_extra_specs_get(context, instance_type_id): session = get_session() - meta_results = session.query(models.InstanceTypeMetadata).\ + spec_results = session.query(models.InstanceTypeExtraSpecs).\ filter_by(instance_type_id=instance_type_id).\ filter_by(deleted=False).\ all() - meta_dict = {} - for i in meta_results: - meta_dict[i['key']] = i['value'] - return meta_dict + spec_dict = {} + for i in spec_results: + spec_dict[i['key']] = i['value'] + return spec_dict @require_context -def instance_type_metadata_delete(context, instance_type_id, key): +def instance_type_extra_specs_delete(context, instance_type_id, key): session = get_session() - session.query(models.InstanceTypeMetadata).\ + session.query(models.InstanceTypeExtraSpecs).\ filter_by(instance_type_id=instance_type_id).\ filter_by(key=key).\ filter_by(deleted=False).\ @@ -2724,36 +2724,37 @@ def instance_type_metadata_delete(context, instance_type_id, key): @require_context -def instance_type_metadata_get_item(context, instance_type_id, key): +def instance_type_extra_specs_get_item(context, instance_type_id, key): session = get_session() - meta_result = session.query(models.InstanceMetadata).\ + sppec_result = session.query(models.InstanceTypeExtraSpecs).\ filter_by(instance_type_id=instance_type_id).\ filter_by(key=key).\ filter_by(deleted=False).\ first() - if not meta_result: + if not spec_result: raise exception.\ - InstanceTypeMetadataNotFound(metadata_key=key, + InstanceTypeExtraSpecsNotFound(extra_specs_key=key, instance_type_id=instance_type_id) - return meta_result + return spec_result @require_context -def instance_type_metadata_update_or_create(context, instance_type_id, - metadata): +def instance_type_extra_specs_update_or_create(context, instance_type_id, + specs): session = get_session() - meta_ref = None - for key, value in metadata.iteritems(): + spec_ref = None + for key, value in specs.iteritems(): try: - meta_ref = instance_type_metadata_get_item(context, - instance_type_id, key, - session) + spec_ref = instance_type_extra_specs_get_item(context, + instance_type_id, + key, + session) except: - meta_ref = models.InstanceTypeMetadata() - meta_ref.update({"key": key, "value": value, - "instance_type_id": instance_type_id, - "deleted": 0}) - meta_ref.save(session=session) - return metadata + spec_ref = models.InstanceTypeExtraSpecs() + spec_ref.update({"key": key, "value": value, + "instance_type_id": instance_type_id, + "deleted": 0}) + spec_ref.save(session=session) + return specs diff --git a/nova/db/sqlalchemy/migrate_repo/versions/021_add_instance_type_extra_specs.py b/nova/db/sqlalchemy/migrate_repo/versions/021_add_instance_type_extra_specs.py new file mode 100644 index 000000000..f26ad6d2c --- /dev/null +++ b/nova/db/sqlalchemy/migrate_repo/versions/021_add_instance_type_extra_specs.py @@ -0,0 +1,67 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 University of Southern California +# +# 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 import Boolean, Column, DateTime, ForeignKey, Integer +from sqlalchemy import MetaData, String, Table +from nova import log as logging + +meta = MetaData() + +# Just for the ForeignKey and column creation to succeed, these are not the +# actual definitions of instances or services. +instance_types = Table('instance_types', meta, + Column('id', Integer(), primary_key=True, nullable=False), + ) + +# +# New Tables +# + +instance_type_extra_specs_table = Table('instance_type_extra_specs', meta, + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('instance_type_id', + Integer(), + ForeignKey('instance_types.id'), + nullable=False), + Column('key', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False)), + Column('value', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False))) + + +def upgrade(migrate_engine): + # Upgrade operations go here. Don't create your own engine; + # bind migrate_engine to your metadata + meta.bind = migrate_engine + for table in (instance_type_extra_specs_table, ): + try: + table.create() + except Exception: + logging.info(repr(table)) + logging.exception('Exception while creating table') + raise + + +def downgrade(migrate_engine): + # Operations to reverse the above upgrade go here. + for table in (instance_type_extra_specs_table, ): + table.drop() diff --git a/nova/db/sqlalchemy/migrate_repo/versions/021_add_instance_type_metadata.py b/nova/db/sqlalchemy/migrate_repo/versions/021_add_instance_type_metadata.py deleted file mode 100644 index 22b741614..000000000 --- a/nova/db/sqlalchemy/migrate_repo/versions/021_add_instance_type_metadata.py +++ /dev/null @@ -1,67 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2011 University of Southern California -# -# 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 import Boolean, Column, DateTime, ForeignKey, Integer -from sqlalchemy import MetaData, String, Table -from nova import log as logging - -meta = MetaData() - -# Just for the ForeignKey and column creation to succeed, these are not the -# actual definitions of instances or services. -instance_types = Table('instance_types', meta, - Column('id', Integer(), primary_key=True, nullable=False), - ) - -# -# New Tables -# - -instance_type_metadata_table = Table('instance_type_metadata', meta, - Column('created_at', DateTime(timezone=False)), - Column('updated_at', DateTime(timezone=False)), - Column('deleted_at', DateTime(timezone=False)), - Column('deleted', Boolean(create_constraint=True, name=None)), - Column('id', Integer(), primary_key=True, nullable=False), - Column('instance_type_id', - Integer(), - ForeignKey('instance_types.id'), - nullable=False), - Column('key', - String(length=255, convert_unicode=False, assert_unicode=None, - unicode_error=None, _warn_on_bytestring=False)), - Column('value', - String(length=255, convert_unicode=False, assert_unicode=None, - unicode_error=None, _warn_on_bytestring=False))) - - -def upgrade(migrate_engine): - # Upgrade operations go here. Don't create your own engine; - # bind migrate_engine to your metadata - meta.bind = migrate_engine - for table in (instance_type_metadata_table, ): - try: - table.create() - except Exception: - logging.info(repr(table)) - logging.exception('Exception while creating table') - raise - - -def downgrade(migrate_engine): - # Operations to reverse the above upgrade go here. - for table in (instance_type_metadata_table, ): - table.drop() diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py index dbe448ef8..d4c217450 100644 --- a/nova/db/sqlalchemy/models.py +++ b/nova/db/sqlalchemy/models.py @@ -663,19 +663,19 @@ class InstanceMetadata(BASE, NovaBase): 'InstanceMetadata.deleted == False)') -class InstanceTypeMetadata(BASE, NovaBase): - """Represents a metadata key/value pair for an instance_type""" - __tablename__ = 'instance_type_metadata' +class InstanceTypeExtraSpecs(BASE, NovaBase): + """Represents additional specs as key/value pairs for an instance_type""" + __tablename__ = 'instance_type_extra_specs' id = Column(Integer, primary_key=True) key = Column(String(255)) value = Column(String(255)) instance_type_id = Column(Integer, ForeignKey('instance_types.id'), nullable=False) - instance_type = relationship(InstanceTypes, backref="meta", + instance_type = relationship(InstanceTypes, backref="extra_specs", foreign_keys=instance_type_id, primaryjoin='and_(' - 'InstanceTypeMetadata.instance_type_id == InstanceTypes.id,' - 'InstanceTypeMetadata.deleted == False)') + 'InstanceTypeExtraSpecs.instance_type_id == InstanceTypes.id,' + 'InstanceTypeExtraSpecs.deleted == False)') class Zone(BASE, NovaBase): -- cgit From 060fd3921e876dcbd594270871ddaeee749259be Mon Sep 17 00:00:00 2001 From: Lorin Hochstein Date: Fri, 17 Jun 2011 09:19:55 -0400 Subject: Missed a InstanceTypeMetadata -> InstanceTypeExtraSpecs rename in register_models --- nova/db/sqlalchemy/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py index 52de9298a..96f85b4e5 100644 --- a/nova/db/sqlalchemy/models.py +++ b/nova/db/sqlalchemy/models.py @@ -701,7 +701,7 @@ def register_models(): Network, SecurityGroup, SecurityGroupIngressRule, SecurityGroupInstanceAssociation, AuthToken, User, Project, Certificate, ConsolePool, Console, Zone, - InstanceMetadata, InstanceTypeMetadata, Migration) + InstanceMetadata, InstanceTypeExtraSpecs, Migration) engine = create_engine(FLAGS.sql_connection, echo=False) for model in models: model.metadata.create_all(engine) -- cgit From 2e2c432e35bf9c283df83de8d76191855d2ce2be Mon Sep 17 00:00:00 2001 From: Lorin Hochstein Date: Wed, 22 Jun 2011 23:38:58 -0400 Subject: Returned code to original location --- nova/db/api.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'nova/db') diff --git a/nova/db/api.py b/nova/db/api.py index 0c9f45db6..0ac3153bc 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -1292,6 +1292,17 @@ def instance_metadata_update_or_create(context, instance_id, metadata): #################### +def agent_build_create(context, values): + """Create a new agent build entry.""" + return IMPL.agent_build_create(context, values) + + +def agent_build_get_by_triple(context, hypervisor, os, architecture): + """Get agent build by hypervisor/OS/architecture triple.""" + return IMPL.agent_build_get_by_triple(context, hypervisor, os, + architecture) + + def agent_build_get_all(context): """Get all agent builds.""" return IMPL.agent_build_get_all(context) @@ -1307,16 +1318,6 @@ def agent_build_update(context, agent_build_id, values): IMPL.agent_build_update(context, agent_build_id, values) -def agent_build_create(context, values): - """Create a new agent build entry.""" - return IMPL.agent_build_create(context, values) - - -def agent_build_get_by_triple(context, hypervisor, os, architecture): - """Get agent build by hypervisor/OS/architecture triple.""" - return IMPL.agent_build_get_by_triple(context, hypervisor, os, - architecture) - #################### -- cgit From 7f578a0f657c076bf97c33dca15f1c78bd11b607 Mon Sep 17 00:00:00 2001 From: Lorin Hochstein Date: Thu, 23 Jun 2011 22:55:51 -0400 Subject: Now automatically populates the instance_type dict with extra_specs upon being retrieved from the database. --- nova/db/api.py | 1 - nova/db/sqlalchemy/api.py | 26 ++++++++++++++++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) (limited to 'nova/db') diff --git a/nova/db/api.py b/nova/db/api.py index 0ac3153bc..636748168 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -1318,7 +1318,6 @@ def agent_build_update(context, agent_build_id, values): IMPL.agent_build_update(context, agent_build_id, values) - #################### diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 0692bc917..86950f109 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -2581,6 +2581,18 @@ def instance_type_create(_context, values): return instance_type_ref +def _inst_type_query_to_dict(inst_type_query): + """Takes an instance type query returned by sqlalchemy + and returns it as a dictionary. + """ + extra_specs_objs = inst_type_query['extra_specs'] + extra_specs = dict([(x['key'], x['value']) for x in \ + inst_type_query['extra_specs']]) + inst_type_dict = dict(inst_type_query) + inst_type_dict['extra_specs'] = extra_specs + return inst_type_dict + + @require_context def instance_type_get_all(context, inactive=False): """ @@ -2589,17 +2601,19 @@ def instance_type_get_all(context, inactive=False): session = get_session() if inactive: inst_types = session.query(models.InstanceTypes).\ + options(joinedload('extra_specs')).\ order_by("name").\ all() else: inst_types = session.query(models.InstanceTypes).\ + options(joinedload('extra_specs')).\ filter_by(deleted=False).\ order_by("name").\ all() if inst_types: inst_dict = {} for i in inst_types: - inst_dict[i['name']] = dict(i) + inst_dict[i['name']] = _inst_type_query_to_dict(i) return inst_dict else: raise exception.NoInstanceTypesFound() @@ -2610,12 +2624,14 @@ def instance_type_get_by_id(context, id): """Returns a dict describing specific instance_type""" session = get_session() inst_type = session.query(models.InstanceTypes).\ + options(joinedload('extra_specs')).\ filter_by(id=id).\ first() + if not inst_type: raise exception.InstanceTypeNotFound(instance_type=id) else: - return dict(inst_type) + return _inst_type_query_to_dict(inst_type) @require_context @@ -2623,12 +2639,13 @@ def instance_type_get_by_name(context, name): """Returns a dict describing specific instance_type""" session = get_session() inst_type = session.query(models.InstanceTypes).\ + options(joinedload('extra_specs')).\ filter_by(name=name).\ first() if not inst_type: raise exception.InstanceTypeNotFoundByName(instance_type_name=name) else: - return dict(inst_type) + return _inst_type_query_to_dict(inst_type) @require_context @@ -2636,12 +2653,13 @@ def instance_type_get_by_flavor_id(context, id): """Returns a dict describing specific flavor_id""" session = get_session() inst_type = session.query(models.InstanceTypes).\ + options(joinedload('extra_specs')).\ filter_by(flavorid=int(id)).\ first() if not inst_type: raise exception.FlavorNotFound(flavor_id=id) else: - return dict(inst_type) + return _inst_type_query_to_dict(inst_type) @require_admin_context -- cgit From 5e4d90b33ddb993294232eea168a768486ba0bf4 Mon Sep 17 00:00:00 2001 From: Eldar Nugaev Date: Sat, 25 Jun 2011 03:05:09 +0400 Subject: added disassociate method to tests --- nova/db/api.py | 2 ++ nova/db/sqlalchemy/api.py | 2 ++ 2 files changed, 4 insertions(+) (limited to 'nova/db') diff --git a/nova/db/api.py b/nova/db/api.py index 8d4b7c8b7..c6ba24478 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -291,10 +291,12 @@ def floating_ip_get_by_address(context, address): """Get a floating ip by address or raise if it doesn't exist.""" return IMPL.floating_ip_get_by_address(context, address) + def floating_ip_get_by_ip(context, ip): """Get a floating ip by floating address.""" return IMPL.floating_ip_get_by_ip(context, ip) + def floating_ip_update(context, address, values): """Update a floating ip by address or raise if it doesn't exist.""" return IMPL.floating_ip_update(context, address, values) diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 7735ec8c2..87f112588 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -609,6 +609,7 @@ def floating_ip_get_by_address(context, address, session=None): return result + @require_context def floating_ip_get_by_ip(context, ip, session=None): if not session: @@ -624,6 +625,7 @@ def floating_ip_get_by_ip(context, ip, session=None): return result + @require_context def floating_ip_update(context, address, values): session = get_session() -- cgit From 706bfc7e3f1cb1d5c56e988abf264c71c54ac0ce Mon Sep 17 00:00:00 2001 From: Lorin Hochstein Date: Fri, 24 Jun 2011 23:50:12 -0400 Subject: Renamed _inst_type_query_to_dict -> _dict_with_extra_specs. pep8 version is no longer explicitly specified in pip-requires --- nova/db/sqlalchemy/api.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 116c534f1..38fe2e2c6 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -2621,14 +2621,14 @@ def instance_type_create(_context, values): return instance_type_ref -def _inst_type_query_to_dict(inst_type_query): +def _dict_with_extra_specs(inst_type_query): """Takes an instance type query returned by sqlalchemy - and returns it as a dictionary. + and returns it as a dictionary, converting the extra_specs + from a list of key/value pairs to a dictionary """ - extra_specs_objs = inst_type_query['extra_specs'] + inst_type_dict = dict(inst_type_query) extra_specs = dict([(x['key'], x['value']) for x in \ inst_type_query['extra_specs']]) - inst_type_dict = dict(inst_type_query) inst_type_dict['extra_specs'] = extra_specs return inst_type_dict @@ -2653,7 +2653,7 @@ def instance_type_get_all(context, inactive=False): if inst_types: inst_dict = {} for i in inst_types: - inst_dict[i['name']] = _inst_type_query_to_dict(i) + inst_dict[i['name']] = _dict_with_extra_specs(i) return inst_dict else: raise exception.NoInstanceTypesFound() @@ -2671,7 +2671,7 @@ def instance_type_get_by_id(context, id): if not inst_type: raise exception.InstanceTypeNotFound(instance_type=id) else: - return _inst_type_query_to_dict(inst_type) + return _dict_with_extra_specs(inst_type) @require_context @@ -2685,7 +2685,7 @@ def instance_type_get_by_name(context, name): if not inst_type: raise exception.InstanceTypeNotFoundByName(instance_type_name=name) else: - return _inst_type_query_to_dict(inst_type) + return _dict_with_extra_specs(inst_type) @require_context @@ -2699,7 +2699,7 @@ def instance_type_get_by_flavor_id(context, id): if not inst_type: raise exception.FlavorNotFound(flavor_id=id) else: - return _inst_type_query_to_dict(inst_type) + return _dict_with_extra_specs(inst_type) @require_admin_context -- cgit From af4e663dee05c907d7ccddc3bb929ff114e876cc Mon Sep 17 00:00:00 2001 From: Lorin Hochstein Date: Sat, 25 Jun 2011 00:05:38 -0400 Subject: Updated _dict_with_extra_specs docstring --- nova/db/sqlalchemy/api.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 38fe2e2c6..55f4bf072 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -2624,7 +2624,14 @@ def instance_type_create(_context, values): def _dict_with_extra_specs(inst_type_query): """Takes an instance type query returned by sqlalchemy and returns it as a dictionary, converting the extra_specs - from a list of key/value pairs to a dictionary + entry from a list of dicts: + + 'extra_specs' : [{'key': 'k1', 'value': 'v1', ...}, ...] + + to a single dict: + + 'extra_specs' : {'k1': 'v1'} + """ inst_type_dict = dict(inst_type_query) extra_specs = dict([(x['key'], x['value']) for x in \ -- cgit From 0f5e7930b48ddd48a803ff5afd25f980df2e31b6 Mon Sep 17 00:00:00 2001 From: Lorin Hochstein Date: Sat, 25 Jun 2011 00:22:59 -0400 Subject: pep8 --- nova/db/sqlalchemy/api.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 55f4bf072..bf5cd5e23 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -2626,12 +2626,12 @@ def _dict_with_extra_specs(inst_type_query): and returns it as a dictionary, converting the extra_specs entry from a list of dicts: - 'extra_specs' : [{'key': 'k1', 'value': 'v1', ...}, ...] - + 'extra_specs' : [{'key': 'k1', 'value': 'v1', ...}, ...] + to a single dict: - + 'extra_specs' : {'k1': 'v1'} - + """ inst_type_dict = dict(inst_type_query) extra_specs = dict([(x['key'], x['value']) for x in \ -- cgit From ef1f4d33fa5763ea602c2fc1098a4b230b86e82b Mon Sep 17 00:00:00 2001 From: Ilya Alekseyev Date: Mon, 27 Jun 2011 16:33:01 +0400 Subject: review issues fixed --- nova/db/sqlalchemy/api.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 426ea5127..55badb9e0 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -448,7 +448,7 @@ def floating_ip_get(context, ip_id): filter_by(deleted=False).\ first() if not result: - raise exception.FloatingIpNotFound() + raise exception.FloatingIpNotFoundForFixedAddress() return result @@ -605,7 +605,7 @@ def floating_ip_get_by_address(context, address, session=None): filter_by(deleted=can_read_deleted(context)).\ first() if not result: - raise exception.FloatingIpNotFound(fixed_ip=address) + raise exception.FloatingIpNotFoundForFixedAddress(fixed_ip=address) return result @@ -621,7 +621,7 @@ def floating_ip_get_by_ip(context, ip, session=None): first() if not result: - raise exception.FloatingIpNotDefined(floating_ip=ip) + raise exception.FloatingIpNotFound(floating_ip=ip) return result @@ -761,7 +761,7 @@ def fixed_ip_get_by_address(context, address, session=None): options(joinedload('instance')).\ first() if not result: - raise exception.FloatingIpNotFound(fixed_ip=address) + raise exception.FloatingIpNotFoundForFixedAddress(fixed_ip=address) if is_user_context(context): authorize_project_context(context, result.instance.project_id) -- cgit From 75dd73b1246904fd11bf9b566bf2319d3e6bada5 Mon Sep 17 00:00:00 2001 From: Eldar Nugaev Date: Mon, 27 Jun 2011 17:05:35 +0400 Subject: fixed pep style --- nova/db/sqlalchemy/api.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 55badb9e0..d20e27617 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -429,14 +429,14 @@ def certificate_update(context, certificate_id, values): ################### @require_context -def floating_ip_get(context, ip_id): +def floating_ip_get(context, id): session = get_session() result = None if is_admin_context(context): result = session.query(models.FloatingIp).\ options(joinedload('fixed_ip')).\ options(joinedload_all('fixed_ip.instance')).\ - filter_by(id=ip_id).\ + filter_by(id=id).\ filter_by(deleted=can_read_deleted(context)).\ first() elif is_user_context(context): @@ -444,7 +444,7 @@ def floating_ip_get(context, ip_id): options(joinedload('fixed_ip')).\ options(joinedload_all('fixed_ip.instance')).\ filter_by(project_id=context.project_id).\ - filter_by(id=ip_id).\ + filter_by(id=id).\ filter_by(deleted=False).\ first() if not result: -- cgit From bd3dd9c95aef72f5e16e166af5b0ab16d39365b5 Mon Sep 17 00:00:00 2001 From: Trey Morris Date: Wed, 29 Jun 2011 13:04:04 -0500 Subject: renumbered migrations again --- .../migrate_repo/versions/028_multi_nic.py | 130 --------------------- .../029_fk_fixed_ips_virtual_interface_id.py | 56 --------- .../migrate_repo/versions/029_multi_nic.py | 130 +++++++++++++++++++++ .../migrate_repo/versions/029_sqlite_downgrade.sql | 48 -------- .../migrate_repo/versions/029_sqlite_update.sql | 48 -------- .../030_fk_fixed_ips_virtual_interface_id.py | 56 +++++++++ .../migrate_repo/versions/030_sqlite_downgrade.sql | 48 ++++++++ .../migrate_repo/versions/030_sqlite_upgrade.sql | 48 ++++++++ 8 files changed, 282 insertions(+), 282 deletions(-) delete mode 100644 nova/db/sqlalchemy/migrate_repo/versions/028_multi_nic.py delete mode 100644 nova/db/sqlalchemy/migrate_repo/versions/029_fk_fixed_ips_virtual_interface_id.py create mode 100644 nova/db/sqlalchemy/migrate_repo/versions/029_multi_nic.py delete mode 100644 nova/db/sqlalchemy/migrate_repo/versions/029_sqlite_downgrade.sql delete mode 100644 nova/db/sqlalchemy/migrate_repo/versions/029_sqlite_update.sql create mode 100644 nova/db/sqlalchemy/migrate_repo/versions/030_fk_fixed_ips_virtual_interface_id.py create mode 100644 nova/db/sqlalchemy/migrate_repo/versions/030_sqlite_downgrade.sql create mode 100644 nova/db/sqlalchemy/migrate_repo/versions/030_sqlite_upgrade.sql (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/migrate_repo/versions/028_multi_nic.py b/nova/db/sqlalchemy/migrate_repo/versions/028_multi_nic.py deleted file mode 100644 index 48fb4032f..000000000 --- a/nova/db/sqlalchemy/migrate_repo/versions/028_multi_nic.py +++ /dev/null @@ -1,130 +0,0 @@ -# Copyright 2011 OpenStack LLC. -# All Rights Reserved. -# -# 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 datetime - -from sqlalchemy import * -from migrate import * - -from nova import log as logging -from nova import utils - -meta = MetaData() - -# virtual interface table to add to DB -virtual_interfaces = Table('virtual_interfaces', meta, - Column('created_at', DateTime(timezone=False), - default=utils.utcnow()), - Column('updated_at', DateTime(timezone=False), - onupdate=utils.utcnow()), - Column('deleted_at', DateTime(timezone=False)), - Column('deleted', Boolean(create_constraint=True, name=None)), - Column('id', Integer(), primary_key=True, nullable=False), - Column('address', - String(length=255, convert_unicode=False, assert_unicode=None, - unicode_error=None, _warn_on_bytestring=False), - unique=True), - Column('network_id', - Integer(), - ForeignKey('networks.id'), - nullable=False), - Column('instance_id', - Integer(), - ForeignKey('instances.id'), - nullable=False), - Column('port_id', - String(length=255, convert_unicode=False, assert_unicode=None, - unicode_error=None, _warn_on_bytestring=False), - unique=True), - mysql_engine='InnoDB') - - -# bridge_interface column to add to networks table -interface = Column('bridge_interface', - String(length=255, convert_unicode=False, - assert_unicode=None, unicode_error=None, - _warn_on_bytestring=False)) - - -# virtual interface id column to add to fixed_ips table -# foreignkey added in next migration -virtual_interface_id = Column('virtual_interface_id', - Integer()) - - -def upgrade(migrate_engine): - meta.bind = migrate_engine - - # grab tables and (column for dropping later) - instances = Table('instances', meta, autoload=True) - networks = Table('networks', meta, autoload=True) - fixed_ips = Table('fixed_ips', meta, autoload=True) - c = instances.columns['mac_address'] - - # add interface column to networks table - # values will have to be set manually before running nova - try: - networks.create_column(interface) - except Exception: - logging.error(_("interface column not added to networks table")) - raise - - # create virtual_interfaces table - try: - virtual_interfaces.create() - except Exception: - logging.error(_("Table |%s| not created!"), repr(virtual_interfaces)) - raise - - # add virtual_interface_id column to fixed_ips table - try: - fixed_ips.create_column(virtual_interface_id) - except Exception: - logging.error(_("VIF column not added to fixed_ips table")) - raise - - # populate the virtual_interfaces table - # extract data from existing instance and fixed_ip tables - s = select([instances.c.id, instances.c.mac_address, - fixed_ips.c.network_id], - fixed_ips.c.instance_id == instances.c.id) - keys = ('instance_id', 'address', 'network_id') - join_list = [dict(zip(keys, row)) for row in s.execute()] - logging.debug(_("join list for moving mac_addresses |%s|"), join_list) - - # insert data into the table - if join_list: - i = virtual_interfaces.insert() - i.execute(join_list) - - # populate the fixed_ips virtual_interface_id column - s = select([fixed_ips.c.id, fixed_ips.c.instance_id], - fixed_ips.c.instance_id != None) - - for row in s.execute(): - m = select([virtual_interfaces.c.id]).\ - where(virtual_interfaces.c.instance_id == row['instance_id']).\ - as_scalar() - u = fixed_ips.update().values(virtual_interface_id=m).\ - where(fixed_ips.c.id == row['id']) - u.execute() - - # drop the mac_address column from instances - c.drop() - - -def downgrade(migrate_engine): - logging.error(_("Can't downgrade without losing data")) - raise Exception diff --git a/nova/db/sqlalchemy/migrate_repo/versions/029_fk_fixed_ips_virtual_interface_id.py b/nova/db/sqlalchemy/migrate_repo/versions/029_fk_fixed_ips_virtual_interface_id.py deleted file mode 100644 index 56e927717..000000000 --- a/nova/db/sqlalchemy/migrate_repo/versions/029_fk_fixed_ips_virtual_interface_id.py +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright 2011 OpenStack LLC. -# All Rights Reserved. -# -# 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 datetime - -from sqlalchemy import * -from migrate import * - -from nova import log as logging -from nova import utils - -meta = MetaData() - - -def upgrade(migrate_engine): - meta.bind = migrate_engine - dialect = migrate_engine.url.get_dialect().name - - # grab tables - fixed_ips = Table('fixed_ips', meta, autoload=True) - virtual_interfaces = Table('virtual_interfaces', meta, autoload=True) - - # add foreignkey if not sqlite - try: - if not dialect.startswith('sqlite'): - ForeignKeyConstraint(columns=[fixed_ips.c.virtual_interface_id], - refcolumns=[virtual_interfaces.c.id]).create() - except Exception: - logging.error(_("foreign key constraint couldn't be added")) - raise - - -def downgrade(migrate_engine): - meta.bind = migrate_engine - dialect = migrate_engine.url.get_dialect().name - - # drop foreignkey if not sqlite - try: - if not dialect.startswith('sqlite'): - ForeignKeyConstraint(columns=[fixed_ips.c.virtual_interface_id], - refcolumns=[virtual_interfaces.c.id]).drop() - except Exception: - logging.error(_("foreign key constraint couldn't be dropped")) - raise diff --git a/nova/db/sqlalchemy/migrate_repo/versions/029_multi_nic.py b/nova/db/sqlalchemy/migrate_repo/versions/029_multi_nic.py new file mode 100644 index 000000000..48fb4032f --- /dev/null +++ b/nova/db/sqlalchemy/migrate_repo/versions/029_multi_nic.py @@ -0,0 +1,130 @@ +# Copyright 2011 OpenStack LLC. +# All Rights Reserved. +# +# 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 datetime + +from sqlalchemy import * +from migrate import * + +from nova import log as logging +from nova import utils + +meta = MetaData() + +# virtual interface table to add to DB +virtual_interfaces = Table('virtual_interfaces', meta, + Column('created_at', DateTime(timezone=False), + default=utils.utcnow()), + Column('updated_at', DateTime(timezone=False), + onupdate=utils.utcnow()), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(create_constraint=True, name=None)), + Column('id', Integer(), primary_key=True, nullable=False), + Column('address', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + unique=True), + Column('network_id', + Integer(), + ForeignKey('networks.id'), + nullable=False), + Column('instance_id', + Integer(), + ForeignKey('instances.id'), + nullable=False), + Column('port_id', + String(length=255, convert_unicode=False, assert_unicode=None, + unicode_error=None, _warn_on_bytestring=False), + unique=True), + mysql_engine='InnoDB') + + +# bridge_interface column to add to networks table +interface = Column('bridge_interface', + String(length=255, convert_unicode=False, + assert_unicode=None, unicode_error=None, + _warn_on_bytestring=False)) + + +# virtual interface id column to add to fixed_ips table +# foreignkey added in next migration +virtual_interface_id = Column('virtual_interface_id', + Integer()) + + +def upgrade(migrate_engine): + meta.bind = migrate_engine + + # grab tables and (column for dropping later) + instances = Table('instances', meta, autoload=True) + networks = Table('networks', meta, autoload=True) + fixed_ips = Table('fixed_ips', meta, autoload=True) + c = instances.columns['mac_address'] + + # add interface column to networks table + # values will have to be set manually before running nova + try: + networks.create_column(interface) + except Exception: + logging.error(_("interface column not added to networks table")) + raise + + # create virtual_interfaces table + try: + virtual_interfaces.create() + except Exception: + logging.error(_("Table |%s| not created!"), repr(virtual_interfaces)) + raise + + # add virtual_interface_id column to fixed_ips table + try: + fixed_ips.create_column(virtual_interface_id) + except Exception: + logging.error(_("VIF column not added to fixed_ips table")) + raise + + # populate the virtual_interfaces table + # extract data from existing instance and fixed_ip tables + s = select([instances.c.id, instances.c.mac_address, + fixed_ips.c.network_id], + fixed_ips.c.instance_id == instances.c.id) + keys = ('instance_id', 'address', 'network_id') + join_list = [dict(zip(keys, row)) for row in s.execute()] + logging.debug(_("join list for moving mac_addresses |%s|"), join_list) + + # insert data into the table + if join_list: + i = virtual_interfaces.insert() + i.execute(join_list) + + # populate the fixed_ips virtual_interface_id column + s = select([fixed_ips.c.id, fixed_ips.c.instance_id], + fixed_ips.c.instance_id != None) + + for row in s.execute(): + m = select([virtual_interfaces.c.id]).\ + where(virtual_interfaces.c.instance_id == row['instance_id']).\ + as_scalar() + u = fixed_ips.update().values(virtual_interface_id=m).\ + where(fixed_ips.c.id == row['id']) + u.execute() + + # drop the mac_address column from instances + c.drop() + + +def downgrade(migrate_engine): + logging.error(_("Can't downgrade without losing data")) + raise Exception diff --git a/nova/db/sqlalchemy/migrate_repo/versions/029_sqlite_downgrade.sql b/nova/db/sqlalchemy/migrate_repo/versions/029_sqlite_downgrade.sql deleted file mode 100644 index c1d26b180..000000000 --- a/nova/db/sqlalchemy/migrate_repo/versions/029_sqlite_downgrade.sql +++ /dev/null @@ -1,48 +0,0 @@ -BEGIN TRANSACTION; - - CREATE TEMPORARY TABLE fixed_ips_backup ( - id INTEGER NOT NULL, - address VARCHAR(255), - virtual_interface_id INTEGER, - network_id INTEGER, - instance_id INTEGER, - allocated BOOLEAN default FALSE, - leased BOOLEAN default FALSE, - reserved BOOLEAN default FALSE, - created_at DATETIME NOT NULL, - updated_at DATETIME, - deleted_at DATETIME, - deleted BOOLEAN NOT NULL, - PRIMARY KEY (id), - FOREIGN KEY(virtual_interface_id) REFERENCES virtual_interfaces (id) - ); - - INSERT INTO fixed_ips_backup - SELECT id, address, virtual_interface_id, network_id, instance_id, allocated, leased, reserved, created_at, updated_at, deleted_at, deleted - FROM fixed_ips; - - DROP TABLE fixed_ips; - - CREATE TABLE fixed_ips ( - id INTEGER NOT NULL, - address VARCHAR(255), - virtual_interface_id INTEGER, - network_id INTEGER, - instance_id INTEGER, - allocated BOOLEAN default FALSE, - leased BOOLEAN default FALSE, - reserved BOOLEAN default FALSE, - created_at DATETIME NOT NULL, - updated_at DATETIME, - deleted_at DATETIME, - deleted BOOLEAN NOT NULL, - PRIMARY KEY (id) - ); - - INSERT INTO fixed_ips - SELECT id, address, virtual_interface_id, network_id, instance_id, allocated, leased, reserved, created_at, updated_at, deleted_at, deleted - FROM fixed_ips; - - DROP TABLE fixed_ips_backup; - -COMMIT; diff --git a/nova/db/sqlalchemy/migrate_repo/versions/029_sqlite_update.sql b/nova/db/sqlalchemy/migrate_repo/versions/029_sqlite_update.sql deleted file mode 100644 index 2a9362545..000000000 --- a/nova/db/sqlalchemy/migrate_repo/versions/029_sqlite_update.sql +++ /dev/null @@ -1,48 +0,0 @@ -BEGIN TRANSACTION; - - CREATE TEMPORARY TABLE fixed_ips_backup ( - id INTEGER NOT NULL, - address VARCHAR(255), - virtual_interface_id INTEGER, - network_id INTEGER, - instance_id INTEGER, - allocated BOOLEAN default FALSE, - leased BOOLEAN default FALSE, - reserved BOOLEAN default FALSE, - created_at DATETIME NOT NULL, - updated_at DATETIME, - deleted_at DATETIME, - deleted BOOLEAN NOT NULL, - PRIMARY KEY (id) - ); - - INSERT INTO fixed_ips_backup - SELECT id, address, virtual_interface_id, network_id, instance_id, allocated, leased, reserved, created_at, updated_at, deleted_at, deleted - FROM fixed_ips; - - DROP TABLE fixed_ips; - - CREATE TABLE fixed_ips ( - id INTEGER NOT NULL, - address VARCHAR(255), - virtual_interface_id INTEGER, - network_id INTEGER, - instance_id INTEGER, - allocated BOOLEAN default FALSE, - leased BOOLEAN default FALSE, - reserved BOOLEAN default FALSE, - created_at DATETIME NOT NULL, - updated_at DATETIME, - deleted_at DATETIME, - deleted BOOLEAN NOT NULL, - PRIMARY KEY (id), - FOREIGN KEY(virtual_interface_id) REFERENCES virtual_interfaces (id) - ); - - INSERT INTO fixed_ips - SELECT id, address, virtual_interface_id, network_id, instance_id, allocated, leased, reserved, created_at, updated_at, deleted_at, deleted - FROM fixed_ips; - - DROP TABLE fixed_ips_backup; - -COMMIT; diff --git a/nova/db/sqlalchemy/migrate_repo/versions/030_fk_fixed_ips_virtual_interface_id.py b/nova/db/sqlalchemy/migrate_repo/versions/030_fk_fixed_ips_virtual_interface_id.py new file mode 100644 index 000000000..56e927717 --- /dev/null +++ b/nova/db/sqlalchemy/migrate_repo/versions/030_fk_fixed_ips_virtual_interface_id.py @@ -0,0 +1,56 @@ +# Copyright 2011 OpenStack LLC. +# All Rights Reserved. +# +# 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 datetime + +from sqlalchemy import * +from migrate import * + +from nova import log as logging +from nova import utils + +meta = MetaData() + + +def upgrade(migrate_engine): + meta.bind = migrate_engine + dialect = migrate_engine.url.get_dialect().name + + # grab tables + fixed_ips = Table('fixed_ips', meta, autoload=True) + virtual_interfaces = Table('virtual_interfaces', meta, autoload=True) + + # add foreignkey if not sqlite + try: + if not dialect.startswith('sqlite'): + ForeignKeyConstraint(columns=[fixed_ips.c.virtual_interface_id], + refcolumns=[virtual_interfaces.c.id]).create() + except Exception: + logging.error(_("foreign key constraint couldn't be added")) + raise + + +def downgrade(migrate_engine): + meta.bind = migrate_engine + dialect = migrate_engine.url.get_dialect().name + + # drop foreignkey if not sqlite + try: + if not dialect.startswith('sqlite'): + ForeignKeyConstraint(columns=[fixed_ips.c.virtual_interface_id], + refcolumns=[virtual_interfaces.c.id]).drop() + except Exception: + logging.error(_("foreign key constraint couldn't be dropped")) + raise diff --git a/nova/db/sqlalchemy/migrate_repo/versions/030_sqlite_downgrade.sql b/nova/db/sqlalchemy/migrate_repo/versions/030_sqlite_downgrade.sql new file mode 100644 index 000000000..c1d26b180 --- /dev/null +++ b/nova/db/sqlalchemy/migrate_repo/versions/030_sqlite_downgrade.sql @@ -0,0 +1,48 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE fixed_ips_backup ( + id INTEGER NOT NULL, + address VARCHAR(255), + virtual_interface_id INTEGER, + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN default FALSE, + leased BOOLEAN default FALSE, + reserved BOOLEAN default FALSE, + created_at DATETIME NOT NULL, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY(virtual_interface_id) REFERENCES virtual_interfaces (id) + ); + + INSERT INTO fixed_ips_backup + SELECT id, address, virtual_interface_id, network_id, instance_id, allocated, leased, reserved, created_at, updated_at, deleted_at, deleted + FROM fixed_ips; + + DROP TABLE fixed_ips; + + CREATE TABLE fixed_ips ( + id INTEGER NOT NULL, + address VARCHAR(255), + virtual_interface_id INTEGER, + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN default FALSE, + leased BOOLEAN default FALSE, + reserved BOOLEAN default FALSE, + created_at DATETIME NOT NULL, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN NOT NULL, + PRIMARY KEY (id) + ); + + INSERT INTO fixed_ips + SELECT id, address, virtual_interface_id, network_id, instance_id, allocated, leased, reserved, created_at, updated_at, deleted_at, deleted + FROM fixed_ips; + + DROP TABLE fixed_ips_backup; + +COMMIT; diff --git a/nova/db/sqlalchemy/migrate_repo/versions/030_sqlite_upgrade.sql b/nova/db/sqlalchemy/migrate_repo/versions/030_sqlite_upgrade.sql new file mode 100644 index 000000000..2a9362545 --- /dev/null +++ b/nova/db/sqlalchemy/migrate_repo/versions/030_sqlite_upgrade.sql @@ -0,0 +1,48 @@ +BEGIN TRANSACTION; + + CREATE TEMPORARY TABLE fixed_ips_backup ( + id INTEGER NOT NULL, + address VARCHAR(255), + virtual_interface_id INTEGER, + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN default FALSE, + leased BOOLEAN default FALSE, + reserved BOOLEAN default FALSE, + created_at DATETIME NOT NULL, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN NOT NULL, + PRIMARY KEY (id) + ); + + INSERT INTO fixed_ips_backup + SELECT id, address, virtual_interface_id, network_id, instance_id, allocated, leased, reserved, created_at, updated_at, deleted_at, deleted + FROM fixed_ips; + + DROP TABLE fixed_ips; + + CREATE TABLE fixed_ips ( + id INTEGER NOT NULL, + address VARCHAR(255), + virtual_interface_id INTEGER, + network_id INTEGER, + instance_id INTEGER, + allocated BOOLEAN default FALSE, + leased BOOLEAN default FALSE, + reserved BOOLEAN default FALSE, + created_at DATETIME NOT NULL, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY(virtual_interface_id) REFERENCES virtual_interfaces (id) + ); + + INSERT INTO fixed_ips + SELECT id, address, virtual_interface_id, network_id, instance_id, allocated, leased, reserved, created_at, updated_at, deleted_at, deleted + FROM fixed_ips; + + DROP TABLE fixed_ips_backup; + +COMMIT; -- cgit