245 lines
7.8 KiB
Python
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.')
|