a8acc56242
The healthy query API request triggers sysinv to query the alarm list. The alarm query is attempted via a sysinv database API which is no longer supported. This results in the REST API request failure. This update contains the following changes to address the issue: 1.Add FM catalog info to sysinv puppet class and manifest 2.Add service catalog to the user request context 3.Add a FM client interface to communicate with FM API 4.Update the health query to retrieve the alarm list via FM client Closes-Bug: # 1789983 Change-Id: I31b256f6de22fe70cba59b08bf927c8b0ac119ee Signed-off-by: Tao Liu <tao.liu@windriver.com>
105 lines
3.5 KiB
Python
105 lines
3.5 KiB
Python
#
|
|
# Copyright (c) 2016-2018 Wind River Systems, Inc.
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
|
|
|
|
# FM Fault Management Handling
|
|
|
|
from keystoneauth1.access import service_catalog as k_service_catalog
|
|
from oslo_config import cfg
|
|
from fm_api import constants as fm_constants
|
|
from fm_api import fm_api
|
|
import fmclient as fm_client
|
|
from sysinv.openstack.common import log
|
|
|
|
CONF = cfg.CONF
|
|
|
|
LOG = log.getLogger(__name__)
|
|
|
|
|
|
fm_group = cfg.OptGroup(
|
|
'fm',
|
|
title='FM Options',
|
|
help="Configuration options for the fault management service")
|
|
|
|
fm_opts = [
|
|
cfg.StrOpt('catalog_info',
|
|
default='faultmanagement:fm:internalURL',
|
|
help="Service catalog Look up info."),
|
|
cfg.StrOpt('os_region_name',
|
|
default='RegionOne',
|
|
help="Region name of this node. It is used for catalog lookup")
|
|
]
|
|
|
|
CONF.register_group(fm_group)
|
|
CONF.register_opts(fm_opts, group=fm_group)
|
|
|
|
|
|
class FmCustomerLog(object):
|
|
"""
|
|
Fault Management Customer Log
|
|
"""
|
|
|
|
_fm_api = None
|
|
|
|
def __init__(self):
|
|
self._fm_api = fm_api.FaultAPIs()
|
|
|
|
def customer_log(self, log_data):
|
|
LOG.info("Generating FM Customer Log %s" % log_data)
|
|
fm_event_id = log_data.get('event_id', None)
|
|
if fm_event_id is not None:
|
|
fm_event_state = fm_constants.FM_ALARM_STATE_MSG
|
|
entity_type = log_data.get('entity_type', None)
|
|
entity = log_data.get('entity', None)
|
|
fm_severity = log_data.get('fm_severity', None)
|
|
reason_text = log_data.get('reason_text', None)
|
|
fm_event_type = log_data.get('fm_event_type', None)
|
|
fm_probable_cause = fm_constants.ALARM_PROBABLE_CAUSE_UNKNOWN
|
|
fm_uuid = None
|
|
fault = fm_api.Fault(fm_event_id,
|
|
fm_event_state,
|
|
entity_type,
|
|
entity,
|
|
fm_severity,
|
|
reason_text,
|
|
fm_event_type,
|
|
fm_probable_cause, "",
|
|
False, True)
|
|
|
|
response = self._fm_api.set_fault(fault)
|
|
if response is None:
|
|
LOG.error("Failed to generate customer log, fm_uuid=%s." %
|
|
fm_uuid)
|
|
else:
|
|
fm_uuid = response
|
|
LOG.info("Generated customer log, fm_uuid=%s." % fm_uuid)
|
|
else:
|
|
LOG.error("Unknown event id (%s) given." % fm_event_id)
|
|
|
|
|
|
def fmclient(context, version=1, endpoint=None):
|
|
"""Constructs a fm client object for making API requests.
|
|
|
|
:param context: The request context for auth.
|
|
:param version: API endpoint version.
|
|
:param endpoint: Optional If the endpoint is not available, it will be
|
|
retrieved from context
|
|
"""
|
|
auth_token = context.auth_token
|
|
if endpoint is None:
|
|
sc = k_service_catalog.ServiceCatalogV2(context.service_catalog)
|
|
service_type, service_name, interface = \
|
|
CONF.fm.catalog_info.split(':')
|
|
service_parameters = {'service_type': service_type,
|
|
'service_name': service_name,
|
|
'interface': interface,
|
|
'region_name': CONF.fm.os_region_name}
|
|
endpoint = sc.url_for(**service_parameters)
|
|
|
|
return fm_client.Client(version=version,
|
|
endpoint=endpoint,
|
|
auth_token=auth_token)
|