def run_rule()

in gcpdiag/lint/datafusion/warn_2024_005_datafusion_dataproc_compatability_preference.py [0:0]


def run_rule(context: models.Context, report: lint.LintReportRuleInterface):
  """Checks if the datafusion version is compatible with dataproc version

  from the corresponding compute profiles.
  """
  if not apis.is_enabled(context.project_id, 'datafusion'):
    report.add_skipped(
        None,
        'Cloud Data Fusion API is not enabled in'
        f' {crm.get_project(context.project_id)}',
    )
    return

  datafusion_instances = projects_instances[context.project_id]

  if not datafusion_instances:
    report.add_skipped(None, f'no Cloud Data Fusion instances found {context}')
    return

  if not datafusion_dataproc_version:
    report.add_skipped(None,
                       "No datafusion and dataproc version's data obtained")

  for _, datafusion_instance in sorted(datafusion_instances.items()):
    system_preferences = datafusion.get_system_preferences(
        context, datafusion_instance)
    namespace_preferences = datafusion.get_namespace_preferences(
        context, datafusion_instance)
    application_preferences = datafusion.get_application_preferences(
        context, datafusion_instance)
    datafusion_version = datafusion_instance.version
    if application_preferences:
      for (
          application_name,
          application_preference,
      ) in application_preferences.items():
        if application_preference.image_version:
          dataproc_version = application_preference.image_version
          dataproc_valid_version = check_dataproc_version_valid(
              dataproc_version)
          if not dataproc_valid_version:
            report.add_skipped(
                None, f'Dataproc version : {dataproc_version} is not valid')
          else:
            compatible = check_datafusion_dataproc_version_compatibility(
                datafusion_version, dataproc_valid_version)
            if compatible:
              report.add_ok(
                  datafusion_instance,
                  'Application preferences found\npipeline name :'
                  f' {application_name}\n\tDatafusion version :'
                  f' {datafusion_version}\n\tDataproc version :'
                  f' {dataproc_version}\n',
              )
            else:
              report.add_failed(
                  datafusion_instance,
                  'Application preferences found\npipeline name :'
                  f' {application_name}\n\tDatafusion version :'
                  f' {datafusion_version}\n\tDataproc version :'
                  f' {dataproc_version}\n\tCheck Datafusion version is'
                  ' compatible with Dataproc version (VERSION INCOMPATIBILITY'
                  ' FOUND)\n',
              )
    if namespace_preferences:
      for namespace_name, namespace_preference in namespace_preferences.items():
        if namespace_preference.image_version:
          dataproc_version = namespace_preference.image_version
          dataproc_valid_version = check_dataproc_version_valid(
              dataproc_version)
          if not dataproc_valid_version:
            report.add_skipped(
                None, f'Dataproc version : {dataproc_version} is not valid')
          else:
            compatible = check_datafusion_dataproc_version_compatibility(
                datafusion_version, dataproc_valid_version)
            if compatible:
              report.add_ok(
                  datafusion_instance,
                  '\n\tNamespace preferences found'
                  f'\n\tnamespace name : {namespace_name}'
                  '\n\tDatafusion version :'
                  f' {datafusion_version}\n\tDataproc version :'
                  f' {dataproc_version}\n',
              )
            else:
              report.add_failed(
                  datafusion_instance,
                  '\tNamespace preferences found\n\tnamespace name :'
                  f' {namespace_name}\n\tDatafusion version :'
                  f' {datafusion_version}\n\tDataproc version :'
                  f' {dataproc_version}\n\tCheck Datafusion version is'
                  ' compatible with Dataproc version (VERSION INCOMPATIBILITY'
                  ' FOUND)\n',
              )
    if system_preferences.image_version:
      dataproc_version = system_preferences.image_version
      dataproc_valid_version = check_dataproc_version_valid(dataproc_version)
      if not dataproc_valid_version:
        report.add_skipped(
            None, f'Dataproc version : {dataproc_version} is not valid')
      else:
        compatible = check_datafusion_dataproc_version_compatibility(
            datafusion_version, dataproc_valid_version)
        if compatible:
          report.add_ok(
              datafusion_instance,
              '\n\tSystem preferences found\n\tDatafusion version :'
              f' {datafusion_version}\n\tDataproc version :'
              f' {dataproc_version}\n',
          )
        else:
          report.add_failed(
              datafusion_instance,
              '\tSystem preferences found\n\tDatafusion version :'
              f' {datafusion_version}\n\tDataproc version :'
              f' {dataproc_version}\n'
              '\tCheck Datafusion version compatible with Dataproc'
              ' version (VERSION INCOMPATIBILITY FOUND)\n',
          )