You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

101 lines
3.6 KiB

import json
import os
import sys
# Add the "lib" directory to the Python path so we can import our modules
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "lib"))
# Add the directory where this script resides to the Python path
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from splunk.persistconn.application import PersistentServerConnectionApplication
import splunklib
from constants import METHOD_NOT_ALLOWED, MISSING_KPI_ID, KPI_ID, USER, KVSTORE_KEY
from base_handler import BaseRestHandler
from logger import get_logger
logger = get_logger()
class DriftDetectionResultsHandler(BaseRestHandler, PersistentServerConnectionApplication):
"""
Handles requests for fetching drift detection results for a given KPI ID.
This handler is responsible for processing GET requests to retrieve
specific drift detection results stored in the Splunk KV Store. It can also
process DELETE requests to remove specific drift detection results associated
with a given KPI ID.
The `handle` method will distinguish between GET and DELETE requests based on
the request method and perform the corresponding operation.
"""
def __init__(self, command_line, command_arg):
BaseRestHandler.__init__(self)
def handle(self, in_string):
try:
request = json.loads(in_string)
method = request.get("method", "")
self.initialize_service_if_needed(request)
kpi_id = self.extract_kpi_id(request)
if not kpi_id:
return self.create_response(400, error=MISSING_KPI_ID)
logger.info(f"Processing request for kpi_id={kpi_id}")
if method == "GET":
drift_detection_results = self.handle_get(kpi_id)
return self.create_response(200, result=drift_detection_results)
elif method == "DELETE":
self.handle_delete(kpi_id)
return self.create_response(200, result=f"Drift detection results for KPI {kpi_id} deleted")
else:
return self.create_response(405, error=METHOD_NOT_ALLOWED)
except splunklib.binding.HTTPError as e:
logger.exception(e)
return self.create_response(e.status, error=e.reason)
except Exception as e:
logger.exception(e)
return self.create_response(500, error="Server error")
def handle_get(self, kpi_id):
results = self.get_drift_detection_results_from_kv_store(kpi_id)
if USER in results:
del results[USER]
if KVSTORE_KEY in results:
results[KPI_ID] = results.pop(KVSTORE_KEY)
return results
def handle_delete(self, kpi_id):
self.delete_drift_detection_results_from_kv_store(kpi_id)
def get_drift_detection_results_from_kv_store(self, kpi_id):
try:
collection = self.get_drift_detection_results_collection()
return collection.data.query_by_id(str(kpi_id))
except splunklib.binding.HTTPError as e:
logger.exception(f"Failed to query KV Store for kpi_id={kpi_id}, error: {e}")
raise e
def delete_drift_detection_results_from_kv_store(self, kpi_id):
try:
collection = self.get_drift_detection_results_collection()
return collection.data.delete_by_id(str(kpi_id))
except splunklib.binding.HTTPError as e:
logger.exception(f"Failed to delete _key={kpi_id} from KV Store, error: {e}")
raise e
def extract_kpi_id(self, request):
return self.extract_path_info(request)