From c92383e1cafbe01238b3c7e44ff7599c370cbc7d Mon Sep 17 00:00:00 2001 From: Svetlana Shturm Date: Thu, 8 Aug 2013 12:35:36 +0400 Subject: [PATCH] Change meter.resource_metadata column type The existing schema limits for meter.resource_metadata column to 5000 characters, which may not be enough for a large metadata payload encoded as JSON. Using a Text column will let us store an arbitrary amount of data in that column without worrying about overflowing. Closes-Bug: #1204638 Change-Id: I5eb1cdbb3d4770a8348682634a78ccb0f843c141 --- .../17738166b91_fix_meter_resource_m.py | 50 +++++++++++++++++++ ceilometer/storage/sqlalchemy/models.py | 2 +- 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 ceilometer/storage/sqlalchemy/alembic/versions/17738166b91_fix_meter_resource_m.py diff --git a/ceilometer/storage/sqlalchemy/alembic/versions/17738166b91_fix_meter_resource_m.py b/ceilometer/storage/sqlalchemy/alembic/versions/17738166b91_fix_meter_resource_m.py new file mode 100644 index 000000000..6b6b5a349 --- /dev/null +++ b/ceilometer/storage/sqlalchemy/alembic/versions/17738166b91_fix_meter_resource_m.py @@ -0,0 +1,50 @@ +# -*- encoding: utf-8 -*- +# +# Authors: Svetlana Shturm +# +# 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. +"""fix_meter_resource_metadata_type + +Revision ID: 17738166b91 +Revises: 43b1a023dfaa +Create Date: 2013-08-08 11:20:56.514012 + +""" + +# revision identifiers, used by Alembic. +revision = '17738166b91' +down_revision = '43b1a023dfaa' + +from alembic import op +import sqlalchemy as sa + + +def change_type(type): + column_old = 'resource_metadata' + column_new = column_old + '_new' + bind = op.get_bind() + meta = sa.MetaData(bind.engine) + meter = sa.Table('meter', meta, autoload=True) + new_column = sa.Column(column_new, type) + new_column.create(meter) + meter.update().values(resource_metadata_new=meter.c[column_old]).execute() + meter.c[column_old].drop() + meter.c[column_new].alter(name=column_old) + + +def upgrade(): + change_type(sa.Text) + + +def downgrade(): + change_type(sa.Stryng(5000)) diff --git a/ceilometer/storage/sqlalchemy/models.py b/ceilometer/storage/sqlalchemy/models.py index 1639afd5b..fe65b3fb7 100644 --- a/ceilometer/storage/sqlalchemy/models.py +++ b/ceilometer/storage/sqlalchemy/models.py @@ -127,7 +127,7 @@ class Meter(Base): user_id = Column(String(255), ForeignKey('user.id')) project_id = Column(String(255), ForeignKey('project.id')) resource_id = Column(String(255), ForeignKey('resource.id')) - resource_metadata = Column(JSONEncodedDict(5000)) + resource_metadata = Column(JSONEncodedDict()) counter_type = Column(String(255)) counter_unit = Column(String(255)) counter_volume = Column(Float(53))