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