class_docstr: Handles preparing and sending data from the classifier function to Kinesis Firehose
docstr: Load and expand all declared and enabled Firehose log sources
  
  Args:
      firehose_config (dict): Loaded Firehose config from global.json
      log_sources (dict): Loaded logs.json file
      force_load (bool=False): Set to True if the log sources should be reloaded
          even if there is cached values
  
  Returns:
      dict: Enabled logs, key: sanitized table name, value: log type value
docstr_tok: ["Load","and","expand","all","declared","and","enabled","Firehose","log","sources","Args",":","firehose_config","(","dict",")",":","Loaded","Firehose","config","from","global.json","log_sources","(","dict",")",":","Loaded","logs.json","file","force_load","(","bool=False",")",":","Set","to","True","if","the","log","sources","should","be","reloaded","even","if","there","is","cached","values","Returns",":","dict",":","Enabled","logs",",","key",":","sanitized","table","name",",","value",":","log","type","value"]
code: def load_enabled_log_sources(
      cls, firehose_config, log_sources, force_load=False
  ):
      """Load and expand all declared and enabled Firehose log sources
  
      Args:
          firehose_config (dict): Loaded Firehose config from global.json
          log_sources (dict): Loaded logs.json file
          force_load (bool=False): Set to True if the log sources should be reloaded
              even if there is cached values
  
      Returns:
          dict: Enabled logs, key: sanitized table name, value: log type value
      """
      # Do not reload the logs if they are already cached
      if cls._ENABLED_LOGS and not force_load:
          return cls._ENABLED_LOGS
  
      # Nothing to load if no configs passed
      if not (firehose_config and log_sources):
          return cls._ENABLED_LOGS
  
      # Expand enabled logs into specific subtypes
      for enabled_log in firehose_config.get("enabled_logs", {}):
          enabled_log_parts = enabled_log.split(":")
  
          # Expand to all subtypes
          if len(enabled_log_parts) == 1:
              expanded_logs = {
                  cls.sanitized_value(log_name): log_name
                  for log_name in log_sources
                  if log_name.split(":")[0] == enabled_log_parts[0]
              }
  
              if not expanded_logs:
                  LOGGER.error(
                      "Enabled Firehose log %s not declared in logs.json",
                      enabled_log,
                  )
                  continue
  
              cls._ENABLED_LOGS.update(expanded_logs)
  
          elif len(enabled_log_parts) == 2:
              if enabled_log not in log_sources:
                  LOGGER.error(
                      "Enabled Firehose log %s not declared in logs.json",
                      enabled_log,
                  )
                  continue
  
              cls._ENABLED_LOGS[
                  cls.sanitized_value(enabled_log)
              ] = enabled_log
  
      return cls._ENABLED_LOGS
  
imports: from collections import defaultdict
  import json
  import hashlib
  import re
  import backoff
  import boto3
  from botocore.exceptions import ClientError, HTTPClientError
  from botocore.exceptions import ConnectionError
  from streamalert.shared import CLASSIFIER_FUNCTION_NAME
  import streamalert.shared.helpers.boto
  from streamalert.shared.logger import get_logger
  from streamalert.shared.metrics import MetricLogger
  from streamalert.shared.backoff_handlers import backoff_handler, giveup_handler, success_handler
label_desc: Use image node_id 14 for calling the FirehoseClient obj's underlying member method code with example usage: obj.load_enabled_log_sources(cls, firehose_config, log_sources, force_load) and returns: cls, cls, cls