# Copyright (C) 2005-2025 Splunk Inc. All Rights Reserved. import json import splunk.rest as rest from itsi.upgrade.constants import ENTITY_TYPE_OBJECT_URL from migration.migration_precheck import MigrationPreCheck class IMPrechecks(MigrationPreCheck): """ IM migration prechecks. The checks being performed are: * Check for dashboard drilldowns in entity type objects """ def __init__(self, session_key, logger, pre_checks, skip_pre_checks=[]): MigrationPreCheck.__init__( self, session_key, logger, pre_checks, skip_pre_checks) def precheck_DBOARD_DRILLDOWN(self): ''' * check splunk_dashboard should have empty base_url * check OOTB dashboards should have empty base_url * check navigation link dashboard should have non-empty base_url @rtype: list @return: list of dictionaries that has following key/values: {bool} if the precheck passed {string} corresponding recommendation ''' ret_list = [] preconfigured_ids = ['nix_overview_dashboard', 'addon_overview_dashboard', 'vmware_cluster_overview_dashboard', 'vmware_datastore_overview_dashboard', 'vmware_esxi_overview_dashboard', 'vmware_vcenter_overview_dashboard', 'vmware_vm_overview_dashboard', 'windows_overview_dashboard'] entity_types = self.get_entity_type_objects() if isinstance(entity_types, tuple): return [self._make_result(entity_types[0], entity_types[1], 'Error')] for entity_type in entity_types: dboard_drilldown = entity_type.get('dashboard_drilldowns') if dboard_drilldown: for dboard in dboard_drilldown: if 'is_splunk_dashboard' in dboard: if dboard.get('is_splunk_dashboard') and dboard.get('base_url') != '': ret_list.append(self._make_result(False, ('%s Entity type has %s dashboard (xml) for which' ' the base_url is %s but actual base_url should' ' be empty' % ( entity_type.get('title'), dboard.get( 'title'), dboard.get('base_url'))), 'Warn')) if (not dboard.get('is_splunk_dashboard') and dboard.get('id') in preconfigured_ids and dboard.get('base_url') != ''): ret_list.append(self._make_result( False, '%s Entity type has %s dashboard (udf) for which the base_url is %s' ' but actual base_url should be empty' % ( entity_type.get('title'), dboard.get( 'title'), dboard.get('base_url')), 'Warn')) if (not dboard.get('is_splunk_dashboard') and dboard.get('id') not in preconfigured_ids and dboard.get('base_url') == ''): ret_list.append(self._make_result( False, '%s Entity type has %s dashboard (navigation link) for which the' ' base_url is Empty but actual base_url' ' should not be empty' % ( entity_type.get('title'), dboard.get( 'title')), 'Warn')) if len(ret_list) == 0: return [self._make_result(True, 'dashboard prechecks passed', 'Success')] return ret_list def get_entity_type_objects(self): ''' Get entity type objects @rtype: list or tuple @return: list of entity types object if success, otherwise return tuple for any failures. ''' try: response, content = rest.simpleRequest(ENTITY_TYPE_OBJECT_URL, sessionKey=self.session_key, method='GET', getargs={'output_mode': 'json'}, rawResult=True) except Exception as e: self.logger.exception(e) return False, "Failed to fetch entity type objects." if response.status != 200: message = 'Error retrieving entity type objects. Response: %s, Content: %s' % ( response, content) self.logger.error(message) return False, message return json.loads(content)