add rca mock

Change-Id: I291eb72881af445fd9eb20a96a9096ec108a97fe
This commit is contained in:
Eyal 2016-02-14 14:37:49 +02:00
parent 67e9a8d19d
commit 5ef520b28d
7 changed files with 806 additions and 11 deletions

View File

@ -0,0 +1,36 @@
{
"alarms":
[
{
"id": "04cf683b-58a8-4b59-941a-9a1594fa0fe7",
"project_id": "da3a1ab32-1c62-22cb-bf04-660bd33cd74d",
"state": "available",
"update_timestamp": "2016-01-18T06:14:20.782134+00:00",
"category": "alarm",
"type": "CPU_HIGH",
"name": "cpu high",
"severity": "major"
},
{
"id": "05af123a-56a2-4b59-741a-7b1482dabac2",
"project_id": "da3a1ab32-1c62-22cb-bf04-660bd33cd74d",
"state": "available",
"update_timestamp": "2016-01-18T06:12:28.987651+00:00",
"category": "alarm",
"type": "NO_SPACE_ON_DISK",
"name": "no space on disk",
"severity": "critical"
},
{
"id": "123f456a-12b2-9c51-345d-8b2604adbada7",
"project_id": "da3a1ab32-1c62-22cb-bf04-660bd33cd74d",
"state": "available",
"update_timestamp": "2016-01-18T06:14:38.123456+00:00",
"category": "alarm",
"type": "OUT_OF_MEMORY",
"name": "out of memory",
"severity": "critical"
}
]
}

View File

@ -0,0 +1,276 @@
{
"directed": true,
"graph": {
},
"nodes": [
{
"state": "RUNNING",
"name": "node1",
"id": 0
},
{
"state": "ERROR",
"name": "zone0",
"id": 1
},
{
"state": "SUBOPTIMAL",
"name": "zone1",
"id": 2
},
{
"state": "RUNNING",
"name": "zone2",
"id": 3
},
{
"state": "ERROR",
"name": "host0",
"id": 4
},
{
"state": "SUBOPTIMAL",
"name": "host1",
"id": 5
},
{
"state": "RUNNING",
"name": "host2",
"id": 6
},
{
"state": "ERROR",
"name": "host3",
"id": 7
},
{
"state": "SUBOPTIMAL",
"name": "host4",
"id": 8
},
{
"state": "RUNNING",
"name": "host5",
"id": 9
},
{
"state": "ERROR",
"name": "host6",
"id": 10
},
{
"state": "SUBOPTIMAL",
"name": "vm0",
"id": 11
},
{
"state": "RUNNING",
"name": "vm1",
"id": 12
},
{
"state": "ERROR",
"name": "vm2",
"id": 13
},
{
"state": "SUBOPTIMAL",
"name": "vm3",
"id": 14
},
{
"state": "RUNNING",
"name": "vm4",
"id": 15
},
{
"state": "ERROR",
"name": "vm5",
"id": 16
},
{
"state": "SUBOPTIMAL",
"name": "vm6",
"id": 17
},
{
"state": "RUNNING",
"name": "vm7",
"id": 18
},
{
"state": "ERROR",
"name": "vm8",
"id": 19
},
{
"state": "SUBOPTIMAL",
"name": "vm9",
"id": 20
},
{
"state": "RUNNING",
"name": "vm10",
"id": 21
},
{
"state": "ERROR",
"name": "vm11",
"id": 22
},
{
"state": "SUBOPTIMAL",
"name": "vm12",
"id": 23
},
{
"state": "RUNNING",
"name": "vm13",
"id": 24
},
{
"state": "ERROR",
"name": "vm14",
"id": 25
},
{
"state": "SUBOPTIMAL",
"name": "vm15",
"id": 26
}
],
"links": [
{
"source": 1,
"target": 0,
"relationship": "contains"
},
{
"source": 2,
"target": 0,
"relationship": "contains"
},
{
"source": 3,
"target": 0,
"relationship": "contains"
},
{
"source": 4,
"target": 2,
"relationship": "contains"
},
{
"source": 5,
"target": 1,
"relationship": "contains"
},
{
"source": 6,
"target": 3,
"relationship": "contains"
},
{
"source": 7,
"target": 2,
"relationship": "contains"
},
{
"source": 8,
"target": 1,
"relationship": "contains"
},
{
"source": 9,
"target": 3,
"relationship": "contains"
},
{
"source": 10,
"target": 2,
"relationship": "contains"
},
{
"source": 11,
"target": 6,
"relationship": "contains"
},
{
"source": 12,
"target": 5,
"relationship": "contains"
},
{
"source": 13,
"target": 4,
"relationship": "contains"
},
{
"source": 14,
"target": 10,
"relationship": "contains"
},
{
"source": 15,
"target": 9,
"relationship": "contains"
},
{
"source": 16,
"target": 8,
"relationship": "contains"
},
{
"source": 17,
"target": 7,
"relationship": "contains"
},
{
"source": 18,
"target": 6,
"relationship": "contains"
},
{
"source": 19,
"target": 5,
"relationship": "contains"
},
{
"source": 20,
"target": 4,
"relationship": "contains"
},
{
"source": 21,
"target": 10,
"relationship": "contains"
},
{
"source": 22,
"target": 9,
"relationship": "contains"
},
{
"source": 23,
"target": 8,
"relationship": "contains"
},
{
"source": 24,
"target": 7,
"relationship": "contains"
},
{
"source": 25,
"target": 6,
"relationship": "contains"
},
{
"source": 26,
"target": 5,
"relationship": "contains"
}
],
"multigraph": false
}

View File

@ -0,0 +1,55 @@
{
"directed": true,
"graph": {
},
"nodes": [
{
"category": "ALARM",
"type": "nagios",
"name": "CPU load",
"state": "Active",
"severity": "WARNING",
"timestamp": "2015-12-01T12:46:41Z",
"info": "WARNING - 15min load 1.66 at 32 CPUs",
"resource_type": "nova.host",
"resource_name": "host0",
"id": 0
},
{
"category": "ALARM",
"type": "vitrage",
"name": "Machine might be suffering due to high CPU load on the host",
"state": "Active",
"severity": "WARNING",
"timestamp": "2015-12-01T12:46:41Z",
"resource_type": "nova.instance",
"resource_name": "vm0",
"id": 1
},
{
"category": "ALARM",
"type": "vitrage",
"name": "Machine might be suffering due to high CPU load on the host",
"state": "Active",
"severity": "WARNING",
"timestamp": "2015-12-01T12:46:41Z",
"resource_type": "nova.instance",
"resource_name": "vm1",
"id": 2
}
],
"links": [
{
"source": 0,
"target": 1,
"relationship": "causes"
},
{
"source": 0,
"target": 2,
"relationship": "causes"
}
],
"multigraph": false
}

View File

@ -0,0 +1,424 @@
[DEFAULT]
#
# From oslo.log
#
# If set to true, the logging level will be set to DEBUG instead of the default
# INFO level. (boolean value)
#debug = false
# If set to false, the logging level will be set to WARNING instead of the
# default INFO level. (boolean value)
# This option is deprecated for removal.
# Its value may be silently ignored in the future.
#verbose = true
# The name of a logging configuration file. This file is appended to any
# existing logging configuration files. For details about logging configuration
# files, see the Python logging module documentation. Note that when logging
# configuration files are used all logging configuration is defined in the
# configuration file and other logging configuration options are ignored (for
# example, log_format). (string value)
# Deprecated group/name - [DEFAULT]/log_config
#log_config_append = <None>
# DEPRECATED. A logging.Formatter log message format string which may use any
# of the available logging.LogRecord attributes. This option is deprecated.
# Please use logging_context_format_string and logging_default_format_string
# instead. This option is ignored if log_config_append is set. (string value)
#log_format = <None>
# Defines the format string for %%(asctime)s in log records. Default:
# %(default)s . This option is ignored if log_config_append is set. (string
# value)
#log_date_format = %Y-%m-%d %H:%M:%S
# (Optional) Name of log file to send logging output to. If no default is set,
# logging will go to stderr as defined by use_stderr. This option is ignored if
# log_config_append is set. (string value)
# Deprecated group/name - [DEFAULT]/logfile
#log_file = <None>
# (Optional) The base directory used for relative log_file paths. This option
# is ignored if log_config_append is set. (string value)
# Deprecated group/name - [DEFAULT]/logdir
#log_dir = <None>
# Uses logging handler designed to watch file system. When log file is moved or
# removed this handler will open a new log file with specified path
# instantaneously. It makes sense only if log_file option is specified and
# Linux platform is used. This option is ignored if log_config_append is set.
# (boolean value)
#watch_log_file = false
# Use syslog for logging. Existing syslog format is DEPRECATED and will be
# changed later to honor RFC5424. This option is ignored if log_config_append
# is set. (boolean value)
#use_syslog = false
# Enables or disables syslog rfc5424 format for logging. If enabled, prefixes
# the MSG part of the syslog message with APP-NAME (RFC5424). This option is
# ignored if log_config_append is set. (boolean value)
# This option is deprecated for removal.
# Its value may be silently ignored in the future.
# Reason: The format without the APP-NAME is deprecated in Kilo, and will be
# removed in Mitaka, along with this option.
#use_syslog_rfc_format = true
# Syslog facility to receive log lines. This option is ignored if
# log_config_append is set. (string value)
#syslog_log_facility = LOG_USER
# Log output to standard error. This option is ignored if log_config_append is
# set. (boolean value)
#use_stderr = true
# Format string to use for log messages with context. (string value)
#logging_context_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s
# Format string to use for log messages when context is undefined. (string
# value)
#logging_default_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s
# Additional data to append to log message when logging level for the message
# is DEBUG. (string value)
#logging_debug_format_suffix = %(funcName)s %(pathname)s:%(lineno)d
# Prefix each line of exception output with this format. (string value)
#logging_exception_prefix = %(asctime)s.%(msecs)03d %(process)d ERROR %(name)s %(instance)s
# Defines the format string for %(user_identity)s that is used in
# logging_context_format_string. (string value)
#logging_user_identity_format = %(user)s %(tenant)s %(domain)s %(user_domain)s %(project_domain)s
# List of package logging levels in logger=LEVEL pairs. This option is ignored
# if log_config_append is set. (list value)
#default_log_levels = amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,requests.packages.urllib3.util.retry=WARN,urllib3.util.retry=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN,taskflow=WARN,keystoneauth=WARN,oslo.cache=INFO,dogpile.core.dogpile=INFO
# Enables or disables publication of error events. (boolean value)
#publish_errors = false
# The format for an instance that is passed with the log message. (string
# value)
#instance_format = "[instance: %(uuid)s] "
# The format for an instance UUID that is passed with the log message. (string
# value)
#instance_uuid_format = "[instance: %(uuid)s] "
# Enables or disables fatal status of deprecations. (boolean value)
#fatal_deprecations = false
[api]
#
# From vitrage
#
# The port for the vitrage API server. (port value)
# Minimum value: 0
# Maximum value: 65535
#port = 8999
# The listen IP for the vitrage API server. (string value)
#host = 0.0.0.0
# Configuration file for WSGI definition of API. (string value)
#paste_config = api-paste.ini
# Number of workers for vitrage API server. (integer value)
# Minimum value: 1
#workers = 1
# Toggle Pecan Debug Middleware. (boolean value)
#pecan_debug = false
[consistency]
#
# From vitrage
#
# interval between consistency checks (in seconds) (integer value)
# Minimum value: 180
#consistency_interval = 600
# minimum time until deleting entity (in seconds) (integer value)
# Minimum value: 60
#min_time_to_delete = 60
[cors]
#
# From oslo.middleware
#
# Indicate whether this resource may be shared with the domain received in the
# requests "origin" header. (list value)
#allowed_origin = <None>
# Indicate that the actual request can include user credentials (boolean value)
#allow_credentials = true
# Indicate which headers are safe to expose to the API. Defaults to HTTP Simple
# Headers. (list value)
#expose_headers = Content-Type,Cache-Control,Content-Language,Expires,Last-Modified,Pragma
# Maximum cache age of CORS preflight requests. (integer value)
#max_age = 3600
# Indicate which methods can be used during the actual request. (list value)
#allow_methods = GET,POST,PUT,DELETE,OPTIONS
# Indicate which header field names may be used during the actual request.
# (list value)
#allow_headers = Content-Type,Cache-Control,Content-Language,Expires,Last-Modified,Pragma
[cors.subdomain]
#
# From oslo.middleware
#
# Indicate whether this resource may be shared with the domain received in the
# requests "origin" header. (list value)
#allowed_origin = <None>
# Indicate that the actual request can include user credentials (boolean value)
#allow_credentials = true
# Indicate which headers are safe to expose to the API. Defaults to HTTP Simple
# Headers. (list value)
#expose_headers = Content-Type,Cache-Control,Content-Language,Expires,Last-Modified,Pragma
# Maximum cache age of CORS preflight requests. (integer value)
#max_age = 3600
# Indicate which methods can be used during the actual request. (list value)
#allow_methods = GET,POST,PUT,DELETE,OPTIONS
# Indicate which header field names may be used during the actual request.
# (list value)
#allow_headers = Content-Type,Cache-Control,Content-Language,Expires,Last-Modified,Pragma
[evaluator]
#
# From vitrage
#
# A path for the templates used by the evaluator (string value)
#templates_dir = /etc/vitrage/templates
[keystone_authtoken]
#
# From keystonemiddleware.auth_token
#
# Complete public Identity API endpoint. (string value)
#auth_uri = <None>
# API version of the admin Identity API endpoint. (string value)
#auth_version = <None>
# Do not handle authorization requests within the middleware, but delegate the
# authorization decision to downstream WSGI components. (boolean value)
#delay_auth_decision = false
# Request timeout value for communicating with Identity API server. (integer
# value)
#http_connect_timeout = <None>
# How many times are we trying to reconnect when communicating with Identity
# API Server. (integer value)
#http_request_max_retries = 3
# Env key for the swift cache. (string value)
#cache = <None>
# Required if identity server requires client certificate (string value)
#certfile = <None>
# Required if identity server requires client certificate (string value)
#keyfile = <None>
# A PEM encoded Certificate Authority to use when verifying HTTPs connections.
# Defaults to system CAs. (string value)
#cafile = <None>
# Verify HTTPS connections. (boolean value)
#insecure = false
# The region in which the identity server can be found. (string value)
#region_name = <None>
# Directory used to cache files related to PKI tokens. (string value)
#signing_dir = <None>
# Optionally specify a list of memcached server(s) to use for caching. If left
# undefined, tokens will instead be cached in-process. (list value)
# Deprecated group/name - [DEFAULT]/memcache_servers
#memcached_servers = <None>
# In order to prevent excessive effort spent validating tokens, the middleware
# caches previously-seen tokens for a configurable duration (in seconds). Set
# to -1 to disable caching completely. (integer value)
#token_cache_time = 300
# Determines the frequency at which the list of revoked tokens is retrieved
# from the Identity service (in seconds). A high number of revocation events
# combined with a low cache duration may significantly reduce performance.
# (integer value)
#revocation_cache_time = 10
# (Optional) If defined, indicate whether token data should be authenticated or
# authenticated and encrypted. If MAC, token data is authenticated (with HMAC)
# in the cache. If ENCRYPT, token data is encrypted and authenticated in the
# cache. If the value is not one of these options or empty, auth_token will
# raise an exception on initialization. (string value)
# Allowed values: None, MAC, ENCRYPT
#memcache_security_strategy = None
# (Optional, mandatory if memcache_security_strategy is defined) This string is
# used for key derivation. (string value)
#memcache_secret_key = <None>
# (Optional) Number of seconds memcached server is considered dead before it is
# tried again. (integer value)
#memcache_pool_dead_retry = 300
# (Optional) Maximum total number of open connections to every memcached
# server. (integer value)
#memcache_pool_maxsize = 10
# (Optional) Socket timeout in seconds for communicating with a memcached
# server. (integer value)
#memcache_pool_socket_timeout = 3
# (Optional) Number of seconds a connection to memcached is held unused in the
# pool before it is closed. (integer value)
#memcache_pool_unused_timeout = 60
# (Optional) Number of seconds that an operation will wait to get a memcached
# client connection from the pool. (integer value)
#memcache_pool_conn_get_timeout = 10
# (Optional) Use the advanced (eventlet safe) memcached client pool. The
# advanced pool will only work under python 2.x. (boolean value)
#memcache_use_advanced_pool = false
# (Optional) Indicate whether to set the X-Service-Catalog header. If False,
# middleware will not ask for service catalog on token validation and will not
# set the X-Service-Catalog header. (boolean value)
#include_service_catalog = true
# Used to control the use and type of token binding. Can be set to: "disabled"
# to not check token binding. "permissive" (default) to validate binding
# information if the bind type is of a form known to the server and ignore it
# if not. "strict" like "permissive" but if the bind type is unknown the token
# will be rejected. "required" any form of token binding is needed to be
# allowed. Finally the name of a binding method that must be present in tokens.
# (string value)
#enforce_token_bind = permissive
# If true, the revocation list will be checked for cached tokens. This requires
# that PKI tokens are configured on the identity server. (boolean value)
#check_revocations_for_cached = false
# Hash algorithms to use for hashing PKI tokens. This may be a single algorithm
# or multiple. The algorithms are those supported by Python standard
# hashlib.new(). The hashes will be tried in the order given, so put the
# preferred one first for performance. The result of the first hash will be
# stored in the cache. This will typically be set to multiple values only while
# migrating from a less secure algorithm to a more secure one. Once all the old
# tokens are expired this option should be set to a single value for better
# performance. (list value)
#hash_algorithms = md5
# Authentication type to load (unknown value)
# Deprecated group/name - [DEFAULT]/auth_plugin
#auth_type = <None>
# Config Section from which to load plugin specific options (unknown value)
#auth_section = <None>
[oslo_middleware]
#
# From oslo.middleware
#
# The maximum body size for each request, in bytes. (integer value)
# Deprecated group/name - [DEFAULT]/osapi_max_request_body_size
# Deprecated group/name - [DEFAULT]/max_request_body_size
#max_request_body_size = 114688
# The HTTP Header that will be used to determine what the original request
# protocol scheme was, even if it was hidden by an SSL termination proxy.
# (string value)
# This option is deprecated for removal.
# Its value may be silently ignored in the future.
#secure_proxy_ssl_header = X-Forwarded-Proto
[oslo_policy]
#
# From oslo.policy
#
# The JSON file that defines policies. (string value)
# Deprecated group/name - [DEFAULT]/policy_file
#policy_file = policy.json
# Default rule. Enforced when a requested rule is not found. (string value)
# Deprecated group/name - [DEFAULT]/policy_default_rule
#policy_default_rule = default
# Directories where policy configuration files are stored. They can be relative
# to any directory in the search path defined by the config_dir option, or
# absolute paths. The file defined by policy_file must exist for these
# directories to be searched. Missing or empty directories are ignored. (multi
# valued)
# Deprecated group/name - [DEFAULT]/policy_dirs
#policy_dirs = policy.d
[synchronizer]
#
# From vitrage
#
# interval between full snapshots (integer value)
# Minimum value: 10
#snapshots_interval = 600
[synchronizer_plugins]
#
# From vitrage
#
# A path for the static plugins for the syncronizer (string value)
#static_plugins_dir = /etc/vitrage/static_plugins
# Nagios user (string value)
#nagios_user = <None>
# Nagios password (string value)
#nagios_password = <None>
# Nagios url for querying the data. Example: http://<ip>/monitoring/nagios
# /cgi-bin/status.cgi (string value)
#nagios_url = <None>

View File

@ -12,4 +12,8 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from vitrage.common.constants import EntityCategory
from vitrage.common.constants import VertexProperties as VProps
mock_file = True mock_file = True
RCA_QUERY = {'==': {VProps. CATEGORY: EntityCategory.ALARM}}

View File

@ -12,15 +12,15 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import json
import pecan import pecan
from oslo_log import log from oslo_log import log
from pecan import redirect from pecan import redirect
from pecan import rest from pecan import rest
from six.moves import urllib from six.moves import urllib
from vitrage.api.controllers.v1 import RCA_QUERY
from vitrage.api.policy import enforce from vitrage.api.policy import enforce
from vitrage.common.constants import EntityCategory
from vitrage.common.constants import VertexProperties as VProps
# noinspection PyProtectedMember # noinspection PyProtectedMember
from vitrage.i18n import _LI from vitrage.i18n import _LI
@ -35,9 +35,7 @@ class RCAController(rest.RestController):
pecan.request.enforcer, {}) pecan.request.enforcer, {})
LOG.info(_LI('received show rca with alarm id %s') % alarm_id) LOG.info(_LI('received show rca with alarm id %s') % alarm_id)
query = json.dumps(RCA_QUERY)
vals = {'category': VProps.CATEGORY, 'alarm': EntityCategory.ALARM}
query = '{"==":{"%(category)s":"%(alarm)s"}}' % vals
LOG.info(_LI('query is %s') % query) LOG.info(_LI('query is %s') % query)
params = urllib.parse.urlencode( params = urllib.parse.urlencode(
dict(query=query, root=alarm_id, graph_type='graph')) dict(query=query, root=alarm_id, graph_type='graph'))

View File

@ -24,6 +24,8 @@ from pecan.core import abort
from pecan import rest from pecan import rest
from vitrage.api.controllers.v1 import mock_file from vitrage.api.controllers.v1 import mock_file
from vitrage.api.controllers.v1 import RCA_QUERY
from vitrage.api.policy import enforce from vitrage.api.policy import enforce
# noinspection PyProtectedMember # noinspection PyProtectedMember
@ -40,7 +42,6 @@ def as_tree(graph, root='RESOURCE:node', reverse=False):
class TopologyController(rest.RestController): class TopologyController(rest.RestController):
def __init__(self): def __init__(self):
transport = oslo_messaging.get_transport(cfg.CONF) transport = oslo_messaging.get_transport(cfg.CONF)
cfg.CONF.set_override('rpc_backend', 'rabbit') cfg.CONF.set_override('rpc_backend', 'rabbit')
@ -67,7 +68,7 @@ class TopologyController(rest.RestController):
LOG.info(_LI("query is %s") % query) LOG.info(_LI("query is %s") % query)
if mock_file: if mock_file:
return self.get_mock_graph(graph_type) return self.get_mock_graph(graph_type, query)
else: else:
return self.get_graph(graph_type, depth, query, root) return self.get_graph(graph_type, depth, query, root)
@ -89,11 +90,12 @@ class TopologyController(rest.RestController):
abort(404, str(e)) abort(404, str(e))
@staticmethod @staticmethod
def get_mock_graph(graph_type): def get_mock_graph(graph_type, query):
# TODO(eyal) temporary mock file_name = 'rca.sample.json' if query == RCA_QUERY \
graph_file = pecan.request.cfg.find_file('graph.sample.json') else 'graph.sample.json'
graph_file = pecan.request.cfg.find_file(file_name)
if graph_file is None: if graph_file is None:
abort(404, 'file graph.sample.json not found') abort(404, 'file %s not found' % file_name)
try: try:
with open(graph_file) as data_file: with open(graph_file) as data_file:
graph = json.load(data_file) graph = json.load(data_file)