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.

189 lines
6.3 KiB

# 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': {}
}