monasca-api/monasca_api/db/alembic/versions/00597b5c8325_initial.py

589 lines
22 KiB
Python

# Copyright 2018 SUSE Linux GmbH
#
# 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.
"""Initial migration for full schema (Git revision 00597b5c8325664c2c534625525f59232d243d66).
Revision ID: 00597b5c8325
Revises: N/A
Create Date: 2018-04-12 09:09:48.212206
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '00597b5c8325'
down_revision = None
branch_labels = None
depends_on = None
def upgrade():
# Enum tables (will be prepopulated with values through bulk_insert)
alarm_states = op.create_table('alarm_state',
sa.Column('name',
sa.String(length=20),
nullable=False),
sa.PrimaryKeyConstraint('name'),
mysql_charset='utf8mb4',
mysql_collate='utf8mb4_unicode_ci'
)
op.bulk_insert(alarm_states,
[{'name': 'UNDETERMINED'},
{'name': 'OK'},
{'name': 'ALARM'}])
ad_severities = op.create_table(
'alarm_definition_severity',
sa.Column('name',
sa.String(length=20),
nullable=False),
sa.PrimaryKeyConstraint('name'),
mysql_charset='utf8mb4',
mysql_collate='utf8mb4_unicode_ci')
op.bulk_insert(ad_severities,
[{'name': 'LOW'},
{'name': 'MEDIUM'},
{'name': 'HIGH'},
{'name': 'CRITICAL'}])
nm_types = op.create_table(
'notification_method_type',
sa.Column('name',
sa.String(length=20),
nullable=False),
sa.PrimaryKeyConstraint('name'),
mysql_charset='utf8mb4',
mysql_collate='utf8mb4_unicode_ci')
op.bulk_insert(nm_types,
[{'name': 'EMAIL'},
{'name': 'WEBHOOK'},
{'name': 'PAGERDUTY'}])
stream_action_types = op.create_table(
'stream_actions_action_type',
sa.Column('name',
sa.String(length=20),
nullable=False),
sa.PrimaryKeyConstraint('name'),
mysql_charset='utf8mb4',
mysql_collate='utf8mb4_unicode_ci')
op.bulk_insert(stream_action_types,
[{'name': 'FIRE'},
{'name': 'EXPIRE'}])
op.create_table(
'alarm_definition',
sa.Column('id',
sa.String(length=36),
nullable=False),
sa.Column('tenant_id',
sa.String(length=36),
nullable=False),
sa.Column('name',
sa.String(length=255),
nullable=False,
server_default=''),
sa.Column('description',
sa.String(length=255),
nullable=True,
server_default=None),
sa.Column('expression',
sa.dialects.mysql.LONGTEXT(),
nullable=False),
sa.Column('severity',
sa.String(length=20),
nullable=False),
sa.Column('match_by',
sa.String(length=255),
nullable=True,
server_default=''),
sa.Column('actions_enabled',
sa.Boolean(),
nullable=False,
server_default='1'),
sa.Column('created_at',
sa.DateTime(),
nullable=False),
sa.Column('updated_at',
sa.DateTime(),
nullable=False),
sa.Column('deleted_at',
sa.DateTime(),
nullable=True,
server_default=None),
sa.PrimaryKeyConstraint('id'),
sa.Index('tenant_id', 'tenant_id'),
sa.Index('deleted_at', 'deleted_at'),
sa.Index('fk_alarm_definition_severity', 'severity'),
sa.ForeignKeyConstraint(['severity'],
['alarm_definition_severity.name']),
mysql_charset='utf8mb4',
mysql_collate='utf8mb4_unicode_ci')
op.create_table(
'alarm',
sa.Column('id',
sa.String(length=36),
nullable=False),
sa.Column('alarm_definition_id',
sa.String(length=36),
nullable=False,
server_default=''),
sa.Column('state',
sa.String(length=20),
nullable=False),
sa.Column('lifecycle_state',
sa.String(length=50, collation=False),
nullable=True,
server_default=None),
sa.Column('link',
sa.String(length=512, collation=False),
nullable=True,
server_default=None),
sa.Column('created_at',
sa.DateTime(),
nullable=False),
sa.Column('state_updated_at',
sa.DateTime(),
nullable=True),
sa.Column('updated_at',
sa.DateTime(),
nullable=False),
sa.PrimaryKeyConstraint('id'),
sa.Index('alarm_definition_id', 'alarm_definition_id'),
sa.Index('fk_alarm_alarm_state', 'state'),
sa.ForeignKeyConstraint(['alarm_definition_id'],
['alarm_definition.id'],
name='fk_alarm_definition_id',
ondelete='CASCADE'),
sa.ForeignKeyConstraint(['state'],
['alarm_state.name'],
name='fk_alarm_alarm_state'),
mysql_charset='utf8mb4',
mysql_collate='utf8mb4_unicode_ci')
op.create_table(
'notification_method',
sa.Column('id',
sa.String(length=36),
nullable=False),
sa.Column('tenant_id',
sa.String(length=36),
nullable=False),
sa.Column('name',
sa.String(length=250),
nullable=True,
server_default=None),
sa.Column('type',
sa.String(length=20),
# Note: the typo below is deliberate since we need to match
# the constraint name from the SQL script where it is
# misspelled as well.
sa.ForeignKey('notification_method_type.name',
name='fk_alarm_noticication_method_type'),
nullable=False),
sa.Column('address',
sa.String(length=512),
nullable=True,
server_default=None),
sa.Column('created_at',
sa.DateTime(),
nullable=False),
sa.Column('updated_at',
sa.DateTime(),
nullable=False),
sa.PrimaryKeyConstraint('id'),
mysql_charset='utf8mb4',
mysql_collate='utf8mb4_unicode_ci')
op.create_table(
'alarm_action',
sa.Column('alarm_definition_id',
sa.String(length=36),
nullable=False,),
sa.Column('alarm_state',
sa.String(length=20),
nullable=False),
sa.Column('action_id',
sa.String(length=36),
nullable=False),
sa.PrimaryKeyConstraint('alarm_definition_id', 'alarm_state',
'action_id'),
sa.ForeignKeyConstraint(['action_id'],
['notification_method.id'],
name='fk_alarm_action_notification_method_id',
ondelete='CASCADE'),
sa.ForeignKeyConstraint(['alarm_state'],
['alarm_state.name']),
sa.ForeignKeyConstraint(['alarm_definition_id'],
['alarm_definition.id'],
ondelete='CASCADE'),
mysql_charset='utf8mb4',
mysql_collate='utf8mb4_unicode_ci')
op.create_table(
'alarm_metric',
sa.Column('alarm_id',
sa.String(length=36),
nullable=False),
sa.Column('metric_definition_dimensions_id',
sa.BINARY(20),
nullable=False,
server_default='\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0'),
sa.PrimaryKeyConstraint('alarm_id', 'metric_definition_dimensions_id'),
sa.Index('alarm_id', 'alarm_id'),
sa.Index('metric_definition_dimensions_id', 'metric_definition_dimensions_id'),
mysql_charset='utf8mb4',
mysql_collate='utf8mb4_unicode_ci')
# For some mysterious alembic/sqlalchemy reason this foreign key constraint
# ends up missing when specified upon table creation. Hence we need to add
# it through an ALTER TABLE operation:
op.create_foreign_key('fk_alarm_id',
'alarm_metric',
'alarm',
['alarm_id'],
['id'], ondelete='CASCADE')
op.create_table(
'metric_definition',
sa.Column('id',
sa.BINARY(20),
nullable=False,
server_default='\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0'),
sa.Column('name',
sa.String(length=255),
nullable=False),
sa.Column('tenant_id',
sa.String(length=36),
nullable=False),
sa.Column('region',
sa.String(length=255),
nullable=False,
server_default=''),
sa.PrimaryKeyConstraint('id'),
mysql_charset='utf8mb4',
mysql_collate='utf8mb4_unicode_ci')
op.create_table(
'metric_definition_dimensions',
sa.Column('id',
sa.BINARY(20),
nullable=False,
server_default='\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0'),
sa.Column('metric_definition_id',
sa.BINARY(20),
nullable=False,
server_default='\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0'),
sa.Column('metric_dimension_set_id',
sa.BINARY(20),
nullable=False,
server_default='\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0'),
sa.PrimaryKeyConstraint('id'),
sa.Index('metric_definition_id', 'metric_definition_id'),
sa.Index('metric_dimension_set_id', 'metric_dimension_set_id'),
mysql_charset='utf8mb4',
mysql_collate='utf8mb4_unicode_ci')
# mysql limits the size of a unique key to 767 bytes. The utf8mb4 charset
# requires 4 bytes to be allocated for each character while the utf8
# charset requires 3 bytes. The utf8 charset should be sufficient for any
# reasonable characters, see the definition of supplementary characters for
# what it doesn't support. Even with utf8, the unique key length would be
# 785 bytes so only a subset of the name is used. Potentially the size of
# the name should be limited to 250 characters which would resolve this
# issue.
#
# The unique key is required to allow high performance inserts without
# doing a select by using the "insert into metric_dimension ... on
# duplicate key update dimension_set_id=dimension_set_id syntax
op.create_table(
'metric_dimension',
sa.Column('dimension_set_id',
sa.BINARY(20),
nullable=False,
server_default='\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0'),
sa.Column('name',
sa.String(length=255),
nullable=False,
server_default=''),
sa.Column('value',
sa.String(length=255),
nullable=False,
server_default=''),
sa.Index('metric_dimension_key',
'dimension_set_id', 'name',
unique=True,
mysql_length={'name': 252}),
sa.Index('dimension_set_id', 'dimension_set_id'),
mysql_charset='utf8',
mysql_collate='utf8_unicode_ci',
mysql_comment='PRIMARY KEY (`id`)')
op.create_table(
'sub_alarm_definition',
sa.Column('id',
sa.String(length=36),
nullable=False),
sa.Column('alarm_definition_id',
sa.String(length=36),
sa.ForeignKey('alarm_definition.id', ondelete='CASCADE',
name='fk_sub_alarm_definition'),
nullable=False,
server_default=''),
sa.Column('function',
sa.String(length=10),
nullable=False),
sa.Column('metric_name',
sa.String(length=100),
nullable=True,
server_default=None),
sa.Column('operator',
sa.String(length=5),
nullable=False),
sa.Column('threshold',
sa.dialects.mysql.DOUBLE(),
nullable=False),
sa.Column('period',
sa.Integer(),
nullable=False),
sa.Column('periods',
sa.Integer(),
nullable=False),
sa.Column('created_at',
sa.DateTime(),
nullable=False),
sa.Column('updated_at',
sa.DateTime(),
nullable=False),
sa.PrimaryKeyConstraint('id'),
mysql_charset='utf8mb4',
mysql_collate='utf8mb4_unicode_ci')
op.create_table(
'sub_alarm_definition_dimension',
sa.Column('sub_alarm_definition_id',
sa.String(length=36),
sa.ForeignKey('sub_alarm_definition.id', ondelete='CASCADE',
name='fk_sub_alarm_definition_dimension'),
nullable=False,
server_default=''),
sa.Column('dimension_name',
sa.String(length=255),
nullable=False,
server_default=''),
sa.Column('value',
sa.String(length=255),
nullable=True,
server_default=None),
mysql_charset='utf8mb4',
mysql_collate='utf8mb4_unicode_ci')
op.create_table(
'sub_alarm',
sa.Column('id',
sa.dialects.mysql.VARCHAR(length=36,
collation='utf8mb4_unicode_ci'),
nullable=False),
sa.Column('alarm_id',
sa.dialects.mysql.VARCHAR(length=36,
collation='utf8mb4_unicode_ci'),
sa.ForeignKey('alarm.id', ondelete='CASCADE',
name='fk_sub_alarm'),
nullable=False,
server_default=''),
sa.Column('sub_expression_id',
sa.dialects.mysql.VARCHAR(length=36,
collation='utf8mb4_unicode_ci'),
sa.ForeignKey('sub_alarm_definition.id',
name='fk_sub_alarm_expr'),
nullable=False,
server_default=''),
sa.Column('expression',
sa.dialects.mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
nullable=False),
sa.Column('created_at',
sa.DateTime(),
nullable=False),
sa.Column('updated_at',
sa.DateTime(),
nullable=False),
sa.PrimaryKeyConstraint('id'))
op.create_table(
'schema_migrations',
sa.Column('version',
sa.String(length=255),
nullable=False),
sa.UniqueConstraint('version', name='unique_schema_migrations'),
mysql_charset='latin1')
op.create_table(
'stream_definition',
sa.Column('id',
sa.String(length=36),
nullable=False),
sa.Column('tenant_id',
sa.String(length=36),
nullable=False),
sa.Column('name',
sa.String(length=190),
nullable=False,
server_default=''),
sa.Column('description',
sa.String(length=255),
nullable=True,
server_default=None),
sa.Column('select_by',
sa.dialects.mysql.LONGTEXT(),
nullable=True,
server_default=None),
sa.Column('group_by',
sa.dialects.mysql.LONGTEXT(length=20),
nullable=True,
server_default=None),
sa.Column('fire_criteria',
sa.dialects.mysql.LONGTEXT(length=20),
nullable=True,
server_default=None),
sa.Column('expiration',
sa.dialects.mysql.INTEGER(display_width=10,
unsigned=True),
nullable=True,
server_default='0'),
sa.Column('actions_enabled',
sa.Boolean(),
nullable=False,
server_default='1'),
sa.Column('created_at',
sa.DateTime(),
nullable=False),
sa.Column('updated_at',
sa.DateTime(),
nullable=False),
sa.Column('deleted_at',
sa.DateTime(),
nullable=True,
server_default=None),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('tenant_id', 'name', name='tenant_name'),
sa.Index('name', 'name'),
sa.Index('tenant_id', 'tenant_id'),
sa.Index('deleted_at', 'deleted_at'),
sa.Index('created_at', 'created_at'),
sa.Index('updated_at', 'updated_at'),
mysql_charset='utf8mb4',
mysql_collate='utf8mb4_unicode_ci')
op.create_table(
'stream_actions',
sa.Column('stream_definition_id',
sa.String(length=36),
sa.ForeignKey
('stream_definition.id',
name='fk_stream_action_stream_definition_id',
ondelete='CASCADE'),
nullable=False),
sa.Column('action_id',
sa.String(length=36),
sa.ForeignKey('notification_method.id',
name='fk_stream_action_notification_method_id',
ondelete='CASCADE'),
nullable=False),
sa.Column('action_type',
sa.String(length=20),
sa.ForeignKey('stream_actions_action_type.name'),
nullable=False),
sa.PrimaryKeyConstraint('stream_definition_id', 'action_id',
'action_type'),
sa.Index('stream_definition_id', 'stream_definition_id'),
sa.Index('action_type', 'action_type'),
mysql_charset='utf8mb4',
mysql_collate='utf8mb4_unicode_ci')
op.create_table(
'event_transform',
sa.Column('id',
sa.dialects.mysql.VARCHAR(length=36, charset='utf8mb4',
collation='utf8mb4_unicode_ci'),
nullable=False),
sa.Column('tenant_id',
sa.dialects.mysql.VARCHAR(length=36, charset='utf8mb4',
collation='utf8mb4_unicode_ci'),
nullable=False),
sa.Column('name',
sa.dialects.mysql.VARCHAR(length=64, charset='utf8mb4',
collation='utf8mb4_unicode_ci'),
nullable=False),
sa.Column('description',
sa.dialects.mysql.VARCHAR(length=250, charset='utf8mb4',
collation='utf8mb4_unicode_ci'),
nullable=False),
sa.Column('specification',
sa.dialects.mysql.LONGTEXT(charset='utf8mb4',
collation='utf8mb4_unicode_ci'),
nullable=False),
sa.Column('enabled',
sa.Boolean(),
nullable=True,
server_default=None),
sa.Column('created_at',
sa.DateTime(),
nullable=False),
sa.Column('updated_at',
sa.DateTime(),
nullable=False),
sa.Column('deleted_at',
sa.DateTime(),
nullable=True,
server_default=None),
sa.PrimaryKeyConstraint('id'),
sa.Index('name', 'name'),
sa.Index('tenant_id', 'tenant_id'),
sa.Index('deleted_at', 'deleted_at'),
sa.Index('created_at', 'created_at'),
sa.Index('updated_at', 'updated_at'),
sa.UniqueConstraint('tenant_id', 'name', name='tenant_name'),
mysql_charset='utf8mb4')
def downgrade():
op.drop_table('alarm_state')
op.drop_table('alarm_definition_severity')
op.drop_table('notification_method_type')
op.drop_table('stream_actions_action_type')
op.drop_table('alarm_definition')
op.drop_table('alarm')
op.drop_table('notification_method')
op.drop_table('alarm_action')
op.drop_table('alarm_metric')
op.drop_table('metric_definition')
op.drop_table('metric_definition_dimensions')
op.drop_table('metric_dimension')
op.drop_table('sub_alarm_definition')
op.drop_table('sub_alarm_definition_dimension')
op.drop_table('sub_alarm')
op.drop_table('schema_migrations')
op.drop_table('stream_definition')
op.drop_table('stream_actions')
op.drop_table('event_transform')