# Copyright (C) 2005-2025 Splunk Inc. All Rights Reserved. import json import splunk.rest as rest from urllib.parse import urlencode from ..utils import get_nested def default_drilldown_url(item, session_key): """ Creates a deep dive path string containing url parameters for the default deep dive redirect :return: String for the redirect url with deep dive path and url parameters """ drilldown_url = '' deep_dive_path = rest.makeSplunkdUri() + 'servicesNS/nobody/SA-ITOA/deep_dive_services/redirect' service_id = item.get('parent', None) stat_model = item.get('statModel', None) if service_id: try: earliest_time = stat_model.get('earliest') if stat_model else '-60m' latest_time = stat_model.get('latest') if stat_model else 'now' postargs = { 'context_id': service_id, 'include_all_kpi': True, 'earliest': earliest_time, 'latest': latest_time } response, content = rest.simpleRequest( deep_dive_path, method='POST', postargs=postargs, sessionKey=session_key, raiseAllErrors=True ) content = json.loads(content) deep_dive_id = content.get('_key', None) if deep_dive_id: params = { 'savedDeepDiveID': deep_dive_id, 'earliest': earliest_time, 'latest': latest_time } drilldown_url = 'deep_dive?' + urlencode(params) except Exception: pass return drilldown_url def transform_drilldowns(item, session_key): """ Goes over drilldown settings in item and returns converted options dict to merge with UDF viz item :return: Object for merging with UDF widget viz options """ app_prefix = '/app/itsi/' use_drilldown = get_nested(item, ['drilldownModel', 'useCustomDrilldown']) drilldown_settings = get_nested(item, ['drilldownModel', 'drilldownSettingsModel']) if not drilldown_settings: return None drilldown_type = drilldown_settings.get('objType') params = drilldown_settings.get('params', {}) if not use_drilldown or not drilldown_type: return None earliest = params.get('earliest') latest = params.get('latest') object_drilldown_type = 'drilldown.customUrl' drilldown_url = '' saved_object_config = None if drilldown_type == 'custom': drilldown_url = drilldown_settings.get('customUrl') elif drilldown_type == 'default': drilldown_url = app_prefix + default_drilldown_url(item, session_key) elif drilldown_type == 'glass_table': obj_id = drilldown_settings.get('objId') qs = { 'savedGlassTableId': obj_id } if earliest is not None: qs['earliest'] = earliest if latest is not None: qs['latest'] = latest object_drilldown_type = 'drilldown.glassTableObject' # Drilldown to a UDF GT drilldown_url = app_prefix + 'glass_table?' + urlencode(qs) saved_object_config = { 'type': 'saved_glass_table', 'key': obj_id } elif drilldown_type == 'deep_dive': obj_id = drilldown_settings.get('objId') qs = { 'savedDeepDiveID': obj_id, } if earliest is not None: qs['earliest'] = earliest if latest is not None: qs['latest'] = latest object_drilldown_type = 'drilldown.deepDiveObject' drilldown_url = app_prefix + 'deep_dive?' + urlencode(qs) saved_object_config = { 'type': 'saved_deep_dive', 'key': obj_id } elif drilldown_type == 'dashboard': obj_id = drilldown_settings.get('objId') qs = {} if earliest is not None: qs['earliest'] = earliest if latest is not None: qs['latest'] = latest object_drilldown_type = 'drilldown.dashboardObject' drilldown_url = app_prefix + obj_id + "?" + urlencode(qs) saved_object_config = { 'type': 'saved_dashboard', 'key': obj_id } elif drilldown_type == 'event_management_state': obj_id = drilldown_settings.get('objId') qs = { 'emid': obj_id } if earliest is not None: qs['earliest'] = earliest if latest is not None: qs['latest'] = latest object_drilldown_type = 'drilldown.eventManagementObject' drilldown_url = app_prefix + 'itsi_event_management?' + urlencode(qs) saved_object_config = { 'type': 'saved_event_management', 'key': obj_id } elif drilldown_type == 'home_view': obj_id = drilldown_settings.get('objId') qs = { 'savedHomeViewId': obj_id } if earliest is not None: qs['earliest'] = earliest if latest is not None: qs['latest'] = latest if params and len(params) > 0: qs.update(params) object_drilldown_type = 'drilldown.homeViewObject' drilldown_url = app_prefix + 'homeview?' + urlencode(qs) saved_object_config = { 'type': 'saved_home_view', 'key': obj_id } drilldown_options = { 'url': drilldown_url, 'newTab': True } if saved_object_config: drilldown_options.update(saved_object_config) res = { 'eventHandlers': [ { 'type': object_drilldown_type, 'options': drilldown_options } ] } return res def set_off_custom_drilldown_on(item): """ This method takes care of upgrading pre itsi 3.1.0 GT definitions Updates drilldownModel property in item """ if not isinstance(item.get('drilldownModel'), dict): return model = item.get('drilldownModel') if model and not model.get('useCustomDrilldown'): # If useCustomDrilldown is False, set it True (ON) model['useCustomDrilldown'] = True # and set it to Default model['drilldownSettingsModel'] = { 'objectType': 'default', 'objPage': 'search', 'objOwner': 'nobody', 'objId': '', 'customUrl': '', 'params': {} }