From 5ef520b28d8831bd40adeb3387085f282e6c9393 Mon Sep 17 00:00:00 2001 From: Eyal Date: Sun, 14 Feb 2016 14:37:49 +0200 Subject: [PATCH] add rca mock Change-Id: I291eb72881af445fd9eb20a96a9096ec108a97fe --- etc/vitrage/alarms.sample.json | 36 +++ etc/vitrage/graph.sample.json | 276 ++++++++++++++++ etc/vitrage/rca.sample.json | 55 ++++ etc/vitrage/vitrage.conf.sample | 424 +++++++++++++++++++++++++ vitrage/api/controllers/v1/__init__.py | 4 + vitrage/api/controllers/v1/rca.py | 8 +- vitrage/api/controllers/v1/topology.py | 14 +- 7 files changed, 806 insertions(+), 11 deletions(-) create mode 100644 etc/vitrage/alarms.sample.json create mode 100644 etc/vitrage/graph.sample.json create mode 100644 etc/vitrage/rca.sample.json create mode 100644 etc/vitrage/vitrage.conf.sample diff --git a/etc/vitrage/alarms.sample.json b/etc/vitrage/alarms.sample.json new file mode 100644 index 000000000..8169a03cb --- /dev/null +++ b/etc/vitrage/alarms.sample.json @@ -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" + } + ] +} + diff --git a/etc/vitrage/graph.sample.json b/etc/vitrage/graph.sample.json new file mode 100644 index 000000000..d4fcdb692 --- /dev/null +++ b/etc/vitrage/graph.sample.json @@ -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 +} diff --git a/etc/vitrage/rca.sample.json b/etc/vitrage/rca.sample.json new file mode 100644 index 000000000..68ec23734 --- /dev/null +++ b/etc/vitrage/rca.sample.json @@ -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 +} diff --git a/etc/vitrage/vitrage.conf.sample b/etc/vitrage/vitrage.conf.sample new file mode 100644 index 000000000..2b2fde501 --- /dev/null +++ b/etc/vitrage/vitrage.conf.sample @@ -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 = + +# 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 = + +# 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 = + +# (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 = + +# 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 = + +# 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 = + +# 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 = + +# API version of the admin Identity API endpoint. (string value) +#auth_version = + +# 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 = + +# 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 = + +# Required if identity server requires client certificate (string value) +#certfile = + +# Required if identity server requires client certificate (string value) +#keyfile = + +# A PEM encoded Certificate Authority to use when verifying HTTPs connections. +# Defaults to system CAs. (string value) +#cafile = + +# Verify HTTPS connections. (boolean value) +#insecure = false + +# The region in which the identity server can be found. (string value) +#region_name = + +# Directory used to cache files related to PKI tokens. (string value) +#signing_dir = + +# 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 = + +# 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 = + +# (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 = + +# Config Section from which to load plugin specific options (unknown value) +#auth_section = + + +[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 = + +# Nagios password (string value) +#nagios_password = + +# Nagios url for querying the data. Example: http:///monitoring/nagios +# /cgi-bin/status.cgi (string value) +#nagios_url = diff --git a/vitrage/api/controllers/v1/__init__.py b/vitrage/api/controllers/v1/__init__.py index 1baeb62bf..8381b6a88 100644 --- a/vitrage/api/controllers/v1/__init__.py +++ b/vitrage/api/controllers/v1/__init__.py @@ -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}} diff --git a/vitrage/api/controllers/v1/rca.py b/vitrage/api/controllers/v1/rca.py index 006d8933d..1cfe44aee 100644 --- a/vitrage/api/controllers/v1/rca.py +++ b/vitrage/api/controllers/v1/rca.py @@ -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')) diff --git a/vitrage/api/controllers/v1/topology.py b/vitrage/api/controllers/v1/topology.py index 2e536ea0e..9f75d9742 100644 --- a/vitrage/api/controllers/v1/topology.py +++ b/vitrage/api/controllers/v1/topology.py @@ -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)