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
# under the License.
from vitrage.common.constants import EntityCategory
from vitrage.common.constants import VertexProperties as VProps
mock_file = True
RCA_QUERY = {'==': {VProps. CATEGORY: EntityCategory.ALARM}}

View File

@ -12,15 +12,15 @@
# License for the specific language governing permissions and limitations
# under the License.
import json
import pecan
from oslo_log import log
from pecan import redirect
from pecan import rest
from six.moves import urllib
from vitrage.api.controllers.v1 import RCA_QUERY
from vitrage.api.policy import enforce
from vitrage.common.constants import EntityCategory
from vitrage.common.constants import VertexProperties as VProps
# noinspection PyProtectedMember
from vitrage.i18n import _LI
@ -35,9 +35,7 @@ class RCAController(rest.RestController):
pecan.request.enforcer, {})
LOG.info(_LI('received show rca with alarm id %s') % alarm_id)
vals = {'category': VProps.CATEGORY, 'alarm': EntityCategory.ALARM}
query = '{"==":{"%(category)s":"%(alarm)s"}}' % vals
query = json.dumps(RCA_QUERY)
LOG.info(_LI('query is %s') % query)
params = urllib.parse.urlencode(
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 vitrage.api.controllers.v1 import mock_file
from vitrage.api.controllers.v1 import RCA_QUERY
from vitrage.api.policy import enforce
# noinspection PyProtectedMember
@ -40,7 +42,6 @@ def as_tree(graph, root='RESOURCE:node', reverse=False):
class TopologyController(rest.RestController):
def __init__(self):
transport = oslo_messaging.get_transport(cfg.CONF)
cfg.CONF.set_override('rpc_backend', 'rabbit')
@ -67,7 +68,7 @@ class TopologyController(rest.RestController):
LOG.info(_LI("query is %s") % query)
if mock_file:
return self.get_mock_graph(graph_type)
return self.get_mock_graph(graph_type, query)
else:
return self.get_graph(graph_type, depth, query, root)
@ -89,11 +90,12 @@ class TopologyController(rest.RestController):
abort(404, str(e))
@staticmethod
def get_mock_graph(graph_type):
# TODO(eyal) temporary mock
graph_file = pecan.request.cfg.find_file('graph.sample.json')
def get_mock_graph(graph_type, query):
file_name = 'rca.sample.json' if query == RCA_QUERY \
else 'graph.sample.json'
graph_file = pecan.request.cfg.find_file(file_name)
if graph_file is None:
abort(404, 'file graph.sample.json not found')
abort(404, 'file %s not found' % file_name)
try:
with open(graph_file) as data_file:
graph = json.load(data_file)