Files
vitrage/vitrage/tests/mocks/trace_generator.py
hoa ngo bc54094285 Add kapacitor datasource
Enabling Kapacitor alerts and clusters in Vitrage Entity Graph.
Goal is integrate TICK monitor system with vitrage

Change-Id: I275135378a63b70c6859e5dfe36bdef9cb1b9c4b
Story: 2005428
Task: 30461
2019-05-05 18:17:59 +07:00

839 lines
29 KiB
Python

# Copyright 2015 - Alcatel-Lucent
#
# 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.
"""
Mock event generator.
Generator will generate events for a specific entity type, as defined
by a configuration file. A single generator can generate events for
multiple instances of the same entity type.
"""
from collections import defaultdict
from random import randint
# noinspection PyPep8Naming
from vitrage.common.constants import EdgeLabel
from vitrage.datasources.nova.host import NOVA_HOST_DATASOURCE
from vitrage.datasources.static import StaticFields
from vitrage.tests.mocks.entity_model import BasicEntityModel as Bem
import vitrage.tests.mocks.utils as utils
DYNAMIC_INFO_FKEY = 'filename'
DYNAMIC_INFO_FPATH = 'filepath'
STATIC_INFO_FKEY = 'static_filename'
NAME_KEY = 'name'
MAPPING_KEY = 'mapping'
EXTERNAL_INFO_KEY = 'external'
NUM_EVENTS = '#events'
GENERATOR = 'generator'
# specification files for input types
# Mock driver specs
MOCK_DRIVER_PATH = '%s/mock_configurations/driver' % \
utils.get_resources_dir()
DRIVER_AODH_UPDATE_D = 'driver_aodh_update_dynamic.json'
DRIVER_DOCTOR_UPDATE_D = 'driver_doctor_update_dynamic.json'
DRIVER_COLLECTD_UPDATE_D = 'driver_collectd_update_dynamic.json'
DRIVER_KAPACITOR_UPDATE_D = 'driver_kapacitor_update_dynamic.json'
DRIVER_HOST_SNAPSHOT_D = 'driver_host_snapshot_dynamic.json'
DRIVER_INST_SNAPSHOT_D = 'driver_inst_snapshot_dynamic.json'
DRIVER_INST_SNAPSHOT_S = 'driver_inst_snapshot_static.json'
DRIVER_INST_UPDATE_LEGACY_D = 'driver_inst_update_legacy_dynamic.json'
DRIVER_INST_UPDATE_VERSIONED_D = 'driver_inst_update_versioned_dynamic.json'
DRIVER_NAGIOS_SNAPSHOT_D = 'driver_nagios_snapshot_dynamic.json'
DRIVER_NAGIOS_SNAPSHOT_S = 'driver_nagios_snapshot_static.json'
DRIVER_PROMETHEUS_UPDATE_D = 'driver_prometheus_update_dynamic.json'
DRIVER_ZABBIX_SNAPSHOT_D = 'driver_zabbix_snapshot_dynamic.json'
DRIVER_STATIC_SNAPSHOT_D = 'driver_static_snapshot_dynamic.json'
DRIVER_STATIC_SNAPSHOT_S = 'driver_static_snapshot_static.json'
DRIVER_VOLUME_UPDATE_D = 'driver_volume_update_dynamic.json'
DRIVER_VOLUME_SNAPSHOT_D = 'driver_volume_snapshot_dynamic.json'
DRIVER_STACK_UPDATE_D = 'driver_stack_update_dynamic.json'
DRIVER_STACK_SNAPSHOT_D = 'driver_stack_snapshot_dynamic.json'
DRIVER_CONSISTENCY_UPDATE_D = 'driver_consistency_update_dynamic.json'
DRIVER_ZONE_SNAPSHOT_D = 'driver_zone_snapshot_dynamic.json'
DRIVER_KUBE_SNAPSHOT_D = 'driver_kubernetes_snapshot_dynamic.json'
DRIVER_TROVE_INSTANCE_SNAPSHOT_D = \
'driver_trove_instance_snapshot_dynamic.json'
DRIVER_TROVE_CLUSTER_SNAPSHOT_D = \
'driver_trove_cluster_snapshot_dynamic.json'
# Mock transformer Specs (i.e., what the transformer outputs)
MOCK_TRANSFORMER_PATH = '%s/mock_configurations/transformer' % \
utils.get_resources_dir()
TRANS_AODH_SNAPSHOT_D = 'transformer_aodh_snapshot_dynamic.json'
TRANS_AODH_UPDATE_D = 'transformer_aodh_update_dynamic.json'
TRANS_DOCTOR_UPDATE_D = 'transformer_doctor_update_dynamic.json'
TRANS_COLLECTD_UPDATE_D = 'transformer_collectd_update_dynamic.json'
TRANS_KAPACITOR_UPDATE_D = 'transformer_kapacitor_update_dynamic.json'
TRANS_PROMETHEUS_UPDATE_D = 'transformer_prometheus_update_dynamic.json'
TRANS_INST_SNAPSHOT_D = 'transformer_inst_snapshot_dynamic.json'
TRANS_HOST_SNAPSHOT_D = 'transformer_host_snapshot_dynamic.json'
TRANS_HOST_SNAPSHOT_S = 'transformer_host_snapshot_static.json'
TRANS_ZONE_SNAPSHOT_D = 'transformer_zone_snapshot_dynamic.json'
TRANS_ZONE_SNAPSHOT_S = 'transformer_zone_snapshot_static.json'
class EventTraceGenerator(object):
"""A generator for event traces.
A generator can generate events for several instances of the same type,
though with different static parameters (ids etc.).
A generator generates event based on (a) dynamic content JSON file,
(b) static content JSON file, and (c) mapping info to other entities,
such as host-to-vm mapping.
File is expected to be in the ../resources folder
"""
def __init__(self, spec):
"""Initializes the trace generator according to the specs.
NOTE: The dynamic file given determines the manner in which information
is extracted and overlapped between the three sources of info.
Any new spec file needs to be added here as well.
:param spec: specification of the trace characteristics.
:type spec: dict
Sample format:
{
tg.DYNAMIC_INFO_FKEY: tg.TRANS_INST_SNAPSHOT_D, # dynamic info file
tg.STATIC_INFO_FKEY: tg.TRANS_INST_SNAPSHOT_S, # static info file
tg.MAPPING_KEY: mapping, # inter-entity mapping, e.g., vm-host
tg.NAME_KEY: 'Instance (vm) snapshot generator', # name for gen
tg.NUM_EVENTS: 10 # how many events of this type to generate
}
"""
static_info_parsers = \
{DRIVER_AODH_UPDATE_D: _get_aodh_alarm_update_driver_values,
DRIVER_DOCTOR_UPDATE_D: _get_simple_update_driver_values,
DRIVER_COLLECTD_UPDATE_D: _get_simple_update_driver_values,
DRIVER_KAPACITOR_UPDATE_D: _get_simple_update_driver_values,
DRIVER_KUBE_SNAPSHOT_D: _get_k8s_node_snapshot_driver_values,
DRIVER_INST_SNAPSHOT_D: _get_vm_snapshot_driver_values,
DRIVER_INST_UPDATE_LEGACY_D: _get_vm_update_legacy_driver_values,
DRIVER_INST_UPDATE_VERSIONED_D:
_get_vm_update_versioned_driver_values,
DRIVER_HOST_SNAPSHOT_D: _get_host_snapshot_driver_values,
DRIVER_ZONE_SNAPSHOT_D: _get_zone_snapshot_driver_values,
DRIVER_VOLUME_SNAPSHOT_D: _get_volume_snapshot_driver_values,
DRIVER_VOLUME_UPDATE_D: _get_volume_update_driver_values,
DRIVER_STACK_SNAPSHOT_D: _get_stack_snapshot_driver_values,
DRIVER_STACK_UPDATE_D: _get_stack_update_driver_values,
DRIVER_STATIC_SNAPSHOT_D: _get_static_snapshot_driver_values,
DRIVER_NAGIOS_SNAPSHOT_D: _get_nagios_alarm_driver_values,
DRIVER_ZABBIX_SNAPSHOT_D: _get_zabbix_alarm_driver_values,
DRIVER_CONSISTENCY_UPDATE_D:
_get_consistency_update_driver_values,
DRIVER_PROMETHEUS_UPDATE_D: _get_simple_update_driver_values,
DRIVER_TROVE_INSTANCE_SNAPSHOT_D:
_get_trove_instance_snapshot_driver_values,
DRIVER_TROVE_CLUSTER_SNAPSHOT_D:
_get_trove_cluster_snapshot_driver_values,
TRANS_AODH_SNAPSHOT_D: _get_trans_aodh_alarm_snapshot_values,
TRANS_AODH_UPDATE_D: _get_trans_aodh_alarm_snapshot_values,
TRANS_DOCTOR_UPDATE_D: _get_simple_trans_alarm_update_values,
TRANS_COLLECTD_UPDATE_D: _get_simple_trans_alarm_update_values,
TRANS_KAPACITOR_UPDATE_D: _get_simple_trans_alarm_update_values,
TRANS_PROMETHEUS_UPDATE_D: _get_simple_trans_alarm_update_values,
TRANS_INST_SNAPSHOT_D: _get_trans_vm_snapshot_values,
TRANS_HOST_SNAPSHOT_D: _get_trans_host_snapshot_values,
TRANS_ZONE_SNAPSHOT_D: _get_trans_zone_snapshot_values}
target_folder = spec[DYNAMIC_INFO_FPATH] \
if spec.get(DYNAMIC_INFO_FPATH) else None
dynam_specs = utils.load_specs(spec[DYNAMIC_INFO_FKEY],
target_folder=target_folder)
dynamic_spec_filename = spec[DYNAMIC_INFO_FKEY].split('/')[-1]
static_specs = static_info_parsers[dynamic_spec_filename](spec)
self.name = spec.get(NAME_KEY, 'generator')
self._models = [Bem(dynam_specs, details) for details in static_specs]
@property
def models(self):
"""Returns the individual entity models for this generator.
:return: the individual entity models for this generator.
:rtype: list
"""
return self._models
def generate_data_stream(models, event_num=100):
"""Generates a list of events.
:param models:
:param event_num: number of events to generate
:type event_num: int
:return: list of generated events
:rtype: list
"""
instance_num = len(models)
data_stream = []
for _ in range(event_num):
random_model = models[randint(0, instance_num - 1)]
data_stream.append(random_model.params)
return data_stream
def generate_round_robin_data_stream(models, event_num=100):
"""Generates a list of events.
:param models:
:param event_num: number of events to generate
:type event_num: int
:return: list of generated events
:rtype: list
"""
instance_num = len(models)
data_stream = []
for i in range(event_num):
next_model = models[i % instance_num]
data_stream.append(next_model.params)
return data_stream
def _get_vm_snapshot_driver_values(spec):
"""Generates the static driver values for each vm.
:param spec: specification of event generation.
:type spec: dict
:return: list of static driver values for each vm.
:rtype: list
"""
vm_host_mapping = spec[MAPPING_KEY]
static_info = None
if spec[STATIC_INFO_FKEY] is not None:
static_info = utils.load_specs(spec[STATIC_INFO_FKEY])
static_values = []
host_ids = {}
for vm_name, host_name in vm_host_mapping:
if host_name not in host_ids.keys():
host_ids[host_name] = str(randint(0, 1000000))
mapping = {'hostid': host_ids[host_name],
'hostname': host_name,
"OS-EXT-SRV-ATTR:host": host_name,
"OS-EXT-SRV-ATTR:hypervisor_hostname": host_name,
'name': vm_name,
'id': str(randint(0, 1000000)),
}
static_values.append(combine_data(
static_info, mapping, spec.get(EXTERNAL_INFO_KEY, None)
))
return static_values
def _get_host_snapshot_driver_values(spec):
"""Generates the static driver values for each host.
:param spec: specification of event generation.
:type spec: dict
:return: list of static driver values for each host.
:rtype: list
"""
host_zone_mapping = spec[MAPPING_KEY]
static_info = None
if spec[STATIC_INFO_FKEY] is not None:
static_info = utils.load_specs(spec[STATIC_INFO_FKEY])
static_values = []
for host_name, zone_name in host_zone_mapping:
mapping = {'host': host_name,
'zone': zone_name,
'_info': {'host_name': host_name,
'zone': zone_name}}
static_values.append(combine_data(
static_info, mapping, spec.get(EXTERNAL_INFO_KEY, None)
))
return static_values
def _get_k8s_node_snapshot_driver_values(spec):
"""Generates the static driver values for each k8s node.
:param spec: specification of event generation.
:type spec: dict
:return: list of static driver values for each k8s node.
:rtype: list
"""
vm_host_mapping = spec[MAPPING_KEY]
static_values = []
for node_name in vm_host_mapping:
static_values.append(combine_data(node_name, None,
spec.get(EXTERNAL_INFO_KEY)))
return static_values
def _get_simple_update_driver_values(spec):
"""Generates the static driver values for Doctor monitor notification.
:param spec: specification of event generation.
:type spec: dict
:return: list of notifications of Doctor monitor
:rtype: list
"""
return [combine_data(None, None, spec.get(EXTERNAL_INFO_KEY, None))]
def _get_zone_snapshot_driver_values(spec):
"""Generates the static driver values for each zone.
:param spec: specification of event generation.
:type spec: dict
:return: list of static driver values for each host.
:rtype: list
"""
host_zone_mapping = spec[MAPPING_KEY]
static_info = None
if spec[STATIC_INFO_FKEY] is not None:
static_info = utils.load_specs(spec[STATIC_INFO_FKEY])
static_values = []
host_info = {
"nova-compute": {
"active": "True",
"available": "False",
"updated_at": "2016-01-05T06:39:52\\.000000"
}
}
zones_info = {}
for host_name, zone_name in host_zone_mapping:
zone_info = zones_info.get(zone_name, {})
zone_info[host_name] = host_info
zones_info[zone_name] = zone_info
for zone_name in zones_info.keys():
mapping = {
'zoneName': zone_name,
'hosts': zones_info.get(zone_name, {}),
'_info': {'zoneName': zone_name,
'hosts': zones_info.get(zone_name, {})
}
}
static_values.append(combine_data(
static_info, mapping, spec.get(EXTERNAL_INFO_KEY, None)
))
return static_values
def _get_volume_snapshot_driver_values(spec):
"""Generates the static driver values for each volume.
:param spec: specification of event generation.
:type spec: dict
:return: list of static driver values for each volume.
:rtype: list
"""
volume_instance_mapping = spec[MAPPING_KEY]
static_info = None
if spec[STATIC_INFO_FKEY] is not None:
static_info = utils.load_specs(spec[STATIC_INFO_FKEY])
static_values = []
for volume_name, instance_name in volume_instance_mapping:
mapping = {'id': volume_name,
'display_name': volume_name,
'attachments': [{'server_id': instance_name}]}
static_values.append(combine_data(
static_info, mapping, spec.get(EXTERNAL_INFO_KEY, None)
))
return static_values
def _get_volume_update_driver_values(spec):
"""Generates the static driver values for each volume.
:param spec: specification of event generation.
:type spec: dict
:return: list of static driver values for each volume.
:rtype: list
"""
volume_instance_mapping = spec[MAPPING_KEY]
static_info = None
if spec[STATIC_INFO_FKEY] is not None:
static_info = utils.load_specs(spec[STATIC_INFO_FKEY])
static_values = []
for volume_name, instance_name in volume_instance_mapping:
mapping = {'volume_id': volume_name,
'display_name': volume_name,
'volume_attachment': [{'instance_uuid': instance_name}]}
static_values.append(combine_data(
static_info, mapping, spec.get(EXTERNAL_INFO_KEY, None)
))
return static_values
def _get_stack_snapshot_driver_values(spec):
"""Generates the static driver values for each stack.
:param spec: specification of event generation.
:type spec: dict
:return: list of static driver values for each stack.
:rtype: list
"""
stack_instance_volume_mapping = spec[MAPPING_KEY]
static_info = None
if spec[STATIC_INFO_FKEY] is not None:
static_info = utils.load_specs(spec[STATIC_INFO_FKEY])
static_values = []
for stack_name, instance_name, volume_name \
in stack_instance_volume_mapping:
mapping = {'id': stack_name,
'stack_name': stack_name,
'resources': [{'resource_type': "OS::Nova::Server",
'physical_resource_id': instance_name},
{'resource_type': "OS::Cinder::Volume",
'physical_resource_id': volume_name}]}
static_values.append(combine_data(
static_info, mapping, spec.get(EXTERNAL_INFO_KEY, None)
))
return static_values
def _get_stack_update_driver_values(spec):
"""Generates the static driver values for each volume.
:param spec: specification of event generation.
:type spec: dict
:return: list of static driver values for each volume.
:rtype: list
"""
volume_instance_mapping = spec[MAPPING_KEY]
static_info = None
if spec[STATIC_INFO_FKEY] is not None:
static_info = utils.load_specs(spec[STATIC_INFO_FKEY])
static_values = []
for stack_name, instance_name, volume_name in volume_instance_mapping:
mapping = {'stack_identity': stack_name,
'stack_name': stack_name,
'resources': [{'resource_type': "OS::Nova::Server",
'physical_resource_id': instance_name},
{'resource_type': "OS::Cinder::Volume",
'physical_resource_id': volume_name}]}
static_values.append(combine_data(
static_info, mapping, spec.get(EXTERNAL_INFO_KEY, None)
))
return static_values
def _get_consistency_update_driver_values(spec):
"""Generates the static driver values for each consistency event.
:param spec: specification of event generation.
:type spec: dict
:return: list of static driver values for each consistency event.
:rtype: list
"""
entity_num = spec[MAPPING_KEY]
static_info = None
if spec[STATIC_INFO_FKEY] is not None:
static_info = utils.load_specs(spec[STATIC_INFO_FKEY])
static_values = []
for i in range(entity_num):
mapping = {}
static_values.append(combine_data(
static_info, mapping, spec.get(EXTERNAL_INFO_KEY, None)
))
return static_values
def _get_trans_vm_snapshot_values(spec):
"""Generates the static transformer values for each vm.
:param spec: specification of event generation.
:type spec: dict
:return: list of static transformer values for each vm.
:rtype: list
"""
vm_host_mapping = spec[MAPPING_KEY]
static_info = None
if spec[STATIC_INFO_FKEY] is not None:
static_info = utils.load_specs(spec[STATIC_INFO_FKEY])
static_values = []
for vm_name, host_name in vm_host_mapping:
mapping = {'hostname': host_name,
'id': vm_name,
'name': vm_name}
static_values.append(combine_data(
static_info, mapping, spec.get(EXTERNAL_INFO_KEY, None)
))
return static_values
def _get_vm_update_legacy_driver_values(spec):
"""Generates the static driver values for each vm, for updates.
:param spec: specification of event generation.
:type spec: dict
:return: list of static driver values for each vm updates.
:rtype: list
"""
vm_host_mapping = spec[MAPPING_KEY]
static_info = None
if spec[STATIC_INFO_FKEY] is not None:
static_info = utils.load_specs(spec[STATIC_INFO_FKEY])
static_values = []
for vm_name, host_name in vm_host_mapping:
mapping = {'payload': {'host': host_name,
'display_name': vm_name}}
static_values.append(combine_data(
static_info, mapping, spec.get(EXTERNAL_INFO_KEY, None)
))
return static_values
def _get_vm_update_versioned_driver_values(spec):
"""Generates the static driver values for each vm, for updates.
:param spec: specification of event generation.
:type spec: dict
:return: list of static driver values for each vm updates.
:rtype: list
"""
vm_host_mapping = spec[MAPPING_KEY]
static_info = None
if spec[STATIC_INFO_FKEY] is not None:
static_info = utils.load_specs(spec[STATIC_INFO_FKEY])
static_values = []
for vm_name, host_name in vm_host_mapping:
mapping = {
'nova_object.data': {
'host': host_name,
'display_name': vm_name
}
}
static_values.append(combine_data(
static_info, mapping, spec.get(EXTERNAL_INFO_KEY, None)
))
return static_values
def _get_static_snapshot_driver_values(spec):
"""Generates the static driver values for static datasource.
:param spec: specification of event generation.
:type spec: dict
:return: list of driver values for static datasource.
:rtype: list
"""
host_switch_mapping = spec[MAPPING_KEY]
if spec[STATIC_INFO_FKEY] is not None:
static_info_spec = utils.load_specs(spec[STATIC_INFO_FKEY])
else:
static_info_spec = None
static_values = []
# use defaultdict to create placeholder
relationships = defaultdict(lambda: [])
entities = defaultdict(lambda: {})
touched = set({})
for host_index, switch_index in host_switch_mapping:
host_id = "h{}".format(host_index)
switch_id = "s{}".format(switch_index)
relationship = {
StaticFields.SOURCE: switch_id,
StaticFields.TARGET: host_id,
StaticFields.RELATIONSHIP_TYPE: EdgeLabel.ATTACHED
}
rel = relationship.copy()
rel[StaticFields.TARGET] = entities[host_id]
relationships[switch_id].append(rel)
for host_index, switch_index in host_switch_mapping:
switch_id = "s{}".format(switch_index)
if switch_id not in touched:
switch_name = "switch-{}".format(switch_index)
vals = {
StaticFields.STATIC_ID: switch_id,
StaticFields.TYPE: 'switch',
StaticFields.ID: str(randint(0, 100000)),
StaticFields.NAME: switch_name,
StaticFields.RELATIONSHIPS: relationships[switch_id]
}
entities[switch_id].update(**vals)
touched.add(switch_id)
host_id = "h{}".format(host_index)
if host_id not in touched:
vals = {
StaticFields.STATIC_ID: host_id,
StaticFields.TYPE: NOVA_HOST_DATASOURCE,
StaticFields.ID: str(randint(0, 100000)),
StaticFields.RELATIONSHIPS: relationships[host_id]
}
entities[host_id].update(**vals)
touched.add(host_id)
for vals in entities.values():
static_values.append(combine_data(static_info_spec,
vals,
spec.get(EXTERNAL_INFO_KEY, None)))
custom_num = 10
for index in range(custom_num):
source_id = 'c{}'.format(index)
target_id = 'c{}'.format(custom_num - 1 - index)
source_name = 'custom-{}'.format(source_id)
vals = {
StaticFields.STATIC_ID: source_id,
StaticFields.TYPE: 'custom',
StaticFields.ID: str(randint(0, 100000)),
StaticFields.NAME: source_name,
StaticFields.RELATIONSHIPS: [{
StaticFields.SOURCE: source_id,
StaticFields.TARGET: entities[target_id],
StaticFields.RELATIONSHIP_TYPE: 'custom'}]
}
entities[source_id].update(**vals)
static_values.append(combine_data(static_info_spec,
vals,
spec.get(EXTERNAL_INFO_KEY, None)))
# TODO(yujunz) verify self-pointing relationship
return static_values
def _get_nagios_alarm_driver_values(spec):
hosts = spec[MAPPING_KEY]
static_info = None
if spec[STATIC_INFO_FKEY] is not None:
static_info = utils.load_specs(spec[STATIC_INFO_FKEY])
static_values = []
for host_name in hosts:
host_info = {'resource_name': host_name}
static_values.append(combine_data(
static_info, host_info, spec.get(EXTERNAL_INFO_KEY, None)
))
return static_values
def _get_zabbix_alarm_driver_values(spec):
hosts = spec[MAPPING_KEY]
static_info = None
if spec[STATIC_INFO_FKEY] is not None:
static_info = utils.load_specs(spec[STATIC_INFO_FKEY])
static_values = []
for host_name in hosts:
host_info = {'resource_name': host_name}
static_values.append(combine_data(
static_info, host_info, spec.get(EXTERNAL_INFO_KEY, None)
))
return static_values
def _get_trove_instance_snapshot_driver_values(spec):
inst_srv_mapping = spec[MAPPING_KEY]
static_info = None
if spec[STATIC_INFO_FKEY] is not None:
static_info = utils.load_specs(spec[STATIC_INFO_FKEY])
static_values = []
for inst_name, srv_name in inst_srv_mapping:
mapping = {'id': inst_name,
'name': inst_name,
'server_id': srv_name}
static_values.append(combine_data(
static_info, mapping, spec.get(EXTERNAL_INFO_KEY, None)))
return static_values
def _get_trove_cluster_snapshot_driver_values(spec):
clust_inst_mapping = spec[MAPPING_KEY]
static_info = None
if spec[STATIC_INFO_FKEY] is not None:
static_info = utils.load_specs(spec[STATIC_INFO_FKEY])
static_values = []
for clust_name, inst_name in clust_inst_mapping:
mapping = {'id': clust_name,
'name': clust_name,
'instances': [
{'id': inst_name, 'name': inst_name}
]}
static_values.append(combine_data(
static_info, mapping, spec.get(EXTERNAL_INFO_KEY, None)))
return static_values
def _get_trans_host_snapshot_values(spec):
"""Generates the static driver values for each host.
:param spec: specification of event generation.
:type spec: dict
:return: list of static driver values for each host.
:rtype: list
"""
host_zone_mapping = spec[MAPPING_KEY]
static_info = None
if spec[STATIC_INFO_FKEY] is not None:
static_info = utils.load_specs(spec[STATIC_INFO_FKEY])
static_values = []
for host_name, zone_name in host_zone_mapping:
mapping = {'zone_id': zone_name,
'name': host_name,
'id': host_name}
static_values.append(combine_data(
static_info, mapping, spec.get(EXTERNAL_INFO_KEY, None)
))
return static_values
def _get_trans_zone_snapshot_values(spec):
"""Generates the static driver values for each zone.
:param spec: specification of event generation.
:type spec: dict
:return: list of static driver values for each zone.
:rtype: list
"""
zone_cluster_mapping = spec[MAPPING_KEY]
static_info = None
if spec[STATIC_INFO_FKEY] is not None:
static_info = utils.load_specs(spec[STATIC_INFO_FKEY])
static_values = []
for zone_name, cluster_name in zone_cluster_mapping:
mapping = {'name': zone_name,
'id': zone_name}
static_values.append(combine_data(
static_info, mapping, spec.get(EXTERNAL_INFO_KEY, None)
))
return static_values
def _get_trans_aodh_alarm_snapshot_values(spec):
"""Generates the dynamic transformer values for Aodh datasource.
:param spec: specification of event generation.
:type spec: dict
:return: list of dynamic transformer values for Aodh datasource.
:rtype: list
"""
alarm_resources_mapping = spec[MAPPING_KEY]
static_info = None
if spec[STATIC_INFO_FKEY] is not None:
static_info = utils.load_specs(spec[STATIC_INFO_FKEY])
static_values = []
for alarm_id, resource_id in alarm_resources_mapping:
mapping = {'alarm_id': alarm_id,
'resource_id': resource_id,
'graph_query_result': [{'id': resource_id}]}
static_values.append(combine_data(
static_info, mapping, spec.get(EXTERNAL_INFO_KEY, None)
))
return static_values
def _get_aodh_alarm_update_driver_values(spec):
alarms = spec[MAPPING_KEY]
static_info = None
if spec[STATIC_INFO_FKEY] is not None:
static_info = utils.load_specs(spec[STATIC_INFO_FKEY])
static_values = []
for alarm in alarms:
alarm_id = {"alarm_id": alarm}
static_values.append(combine_data(
static_info, alarm_id, spec.get(EXTERNAL_INFO_KEY, None)))
return static_values
def _get_simple_trans_alarm_update_values(spec):
"""Generates the dynamic transformer values for a simple alarm
:param spec: specification of event generation.
:type spec: dict
:return: list of dynamic transformer values for a simple alarm
:rtype: list with one alarm
"""
static_info_re = None
if spec[STATIC_INFO_FKEY] is not None:
static_info_re = utils.load_specs(spec[STATIC_INFO_FKEY])
return [combine_data(static_info_re,
None, spec.get(EXTERNAL_INFO_KEY, None))]
def combine_data(static_info, mapping_info, external_info):
if external_info:
mapping_info = utils.merge_vals(mapping_info, external_info)
static_info = utils.generate_vals(static_info)
return utils.merge_vals(static_info, mapping_info)
def get_trace_generators(entity_spec_list, default_events=100):
"""Returns a collection of event generators.
:param default_events:
:param entity_spec_list: list of generator specs.
:type entity_spec_list: list
:return: list of generators
:rtype: list
"""
generator_spec_list = \
[
{GENERATOR: EventTraceGenerator(entity_spec),
NUM_EVENTS: entity_spec.get(NUM_EVENTS, default_events)}
for entity_spec in entity_spec_list
]
return generator_spec_list