config/sysinv/sysinv/sysinv/sysinv/db/sqlalchemy/migrate_repo/versions/030_eventlog.py

245 lines
7.8 KiB
Python

# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright (c) 2013-2016 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
import os
import time
from sqlalchemy import Boolean, Integer, DateTime
from sqlalchemy import Column, MetaData, String, Table
from sqlalchemy.schema import ForeignKeyConstraint
from sysinv.openstack.common import log
ENGINE = 'InnoDB'
CHARSET = 'utf8'
LOG = log.getLogger(__name__)
def logInfo(msg):
msg = "UPGRADE EVENTLOG: {}".format(msg)
LOG.info(msg)
def _tableFromName(migrate_engine, tableName):
meta = MetaData()
meta.bind = migrate_engine
t = Table(tableName, meta, autoload=True)
return t
def _tableExists(migrate_engine, tableName):
return _tableFromName(migrate_engine, tableName).exists()
def _tableDrop(migrate_engine, tableName):
if _tableExists(migrate_engine, tableName):
logInfo("Dropping table {}.".format(tableName))
return _tableFromName(migrate_engine, tableName).drop()
def countTable(migrate_engine, tableName):
r = migrate_engine.execute('select count(*) from {}'.format(tableName))
for row in r:
break # grab first row of result in order to get count
return row[0]
def populateEventLogFromAlarmHistoryAndCustomerLogs(migrate_engine):
#
# Raw postgres SQL to populate the i_event_log from
# existing data in the i_alarm_history and i_customer_log tables
#
if not _tableExists(migrate_engine, 'i_alarm_history') or \
not _tableExists(migrate_engine, 'i_customer_log'):
logInfo("Not performing event log data migration since source tables do not exist")
return
populateEventLogSQL = """
insert into i_event_log
( created_at,
updated_at,
deleted_at,
uuid,
event_log_id,
state,
entity_type_id,
entity_instance_id,
timestamp,
severity,
reason_text,
event_log_type,
probable_cause,
proposed_repair_action,
service_affecting,
suppression )
select
created_at,
updated_at,
deleted_at,
uuid,
alarm_id as event_log_id,
alarm_state as state,
entity_type_id,
entity_instance_id,
timestamp,
severity,
reason_text,
alarm_type as event_log_type,
probable_cause,
proposed_repair_action,
service_affecting,
suppression
from i_alarm_history
union
select
created_at,
updated_at,
deleted_at,
uuid,
log_id as event_log_id,
'log' as state,
entity_type_id,
entity_instance_id,
timestamp,
severity,
reason_text,
log_type as event_log_type,
probable_cause,
null as proposed_repair_action,
service_affecting,
null as suppression
from i_customer_log
order by created_at
"""
start = time.time()
iAlarmHistoryCount = countTable(migrate_engine, 'i_alarm_history')
iCustomerLogCount = countTable(migrate_engine, 'i_customer_log')
logInfo("Data migration started.")
if iAlarmHistoryCount > 0 or iCustomerLogCount > 0:
logInfo("Migrating {} i_alarm_history records. \
Migrating {} i_customer_log records.".format(iAlarmHistoryCount, iCustomerLogCount))
result = migrate_engine.execute(populateEventLogSQL)
elapsedTime = time.time() - start
logInfo("Data migration end. Elapsed time is {} seconds.".format(elapsedTime))
return result
def get_events_yaml_filename():
events_yaml_name = os.environ.get("EVENTS_YAML")
if events_yaml_name is not None and os.path.isfile(events_yaml_name):
return events_yaml_name
return "/etc/fm/events.yaml"
def is_execute_alter_table():
alter_table = True
if os.environ.get("SYSINV_TEST_ENV") == 'True':
alter_table = False
return alter_table
def add_alarm_table_foreign_key(migrate_engine):
add_event_suppression_foreign_key = """
alter table i_alarm
add constraint fk_ialarm_esuppression_alarm_id
foreign key (alarm_id)
references event_suppression (alarm_id)
match full
"""
migrate_engine.execute(add_event_suppression_foreign_key)
def upgrade(migrate_engine):
start = time.time()
meta = MetaData()
meta.bind = migrate_engine
event_suppression = Table(
'event_suppression',
meta,
Column('created_at', DateTime),
Column('updated_at', DateTime),
Column('deleted_at', DateTime),
Column('id', Integer, primary_key=True, nullable=False),
Column('uuid', String(36), unique=True, index=True),
Column('alarm_id', String(15), unique=True, index=True),
Column('description', String(255)),
Column('suppression_status', String(15)),
Column('set_for_deletion', Boolean),
mysql_engine=ENGINE,
mysql_charset=CHARSET,
)
event_suppression.create()
if is_execute_alter_table():
add_alarm_table_foreign_key(migrate_engine)
i_event_log = Table(
'i_event_log',
meta,
Column('created_at', DateTime),
Column('updated_at', DateTime),
Column('deleted_at', DateTime),
Column('id', Integer, primary_key=True, nullable=False),
Column('uuid', String(255), unique=True, index=True),
Column('event_log_id', String(255), index=True),
Column('state', String(255)),
Column('entity_type_id', String(255), index=True),
Column('entity_instance_id', String(255), index=True),
Column('timestamp', DateTime(timezone=False)),
Column('severity', String(255), index=True),
Column('reason_text', String(255)),
Column('event_log_type', String(255), index=True),
Column('probable_cause', String(255)),
Column('proposed_repair_action', String(255)),
Column('service_affecting', Boolean),
Column('suppression', Boolean),
Column('alarm_id', String(255), nullable=True),
ForeignKeyConstraint(
['alarm_id'],
['event_suppression.alarm_id'],
use_alter=True,
name='fk_elog_alarm_id_esuppression_alarm_id'
),
mysql_engine=ENGINE,
mysql_charset=CHARSET,
)
i_event_log.create()
populateEventLogFromAlarmHistoryAndCustomerLogs(migrate_engine)
_tableDrop(migrate_engine, 'i_alarm_history')
_tableDrop(migrate_engine, 'i_customer_log')
elapsedTime = time.time() - start
logInfo("Elapsed time for eventlog table create and migrate is {} seconds.".format(elapsedTime))
def downgrade(migrate_engine):
# As per other openstack components, downgrade is
# unsupported in this release.
raise NotImplementedError('SysInv database downgrade is unsupported.')