code: def submit(
      obj,
      tasks,
      groups,
      params,
      job_prefix,
      config_path,
      arrow_version,
      arrow_remote,
      arrow_branch,
      arrow_sha,
      fetch,
      dry_run,
      no_push,
  ):
      output = obj["output"]
      queue, arrow = obj["queue"], obj["arrow"]
  
      # load available tasks configuration and groups from yaml
      config = Config.load_yaml(config_path)
      try:
          config.validate()
      except CrossbowError as e:
          raise click.ClickException(str(e))
  
      # Override the detected repo url / remote, branch and sha - this aims to
      # make release procedure a bit simpler.
      # Note, that the target revision's crossbow templates must be
      # compatible with the locally checked out version of crossbow (which is
      # in case of the release procedure), because the templates still
      # contain some business logic (dependency installation, deployments)
      # which will be reduced to a single command in the future.
      target = Target.from_repo(
          arrow,
          remote=arrow_remote,
          branch=arrow_branch,
          head=arrow_sha,
          version=arrow_version,
      )
  
      # parse additional job parameters
      params = dict([p.split("=") for p in params])
  
      # instantiate the job object
      try:
          job = Job.from_config(
              config=config,
              target=target,
              tasks=tasks,
              groups=groups,
              params=params,
          )
      except CrossbowError as e:
          raise click.ClickException(str(e))
  
      job.show(output)
      if dry_run:
          return
  
      if fetch:
          queue.fetch()
      queue.put(job, prefix=job_prefix)
  
      if no_push:
          click.echo(
              "Branches and commits created but not pushed: `{}`".format(
                  job.branch
              )
          )
      else:
          queue.push()
          click.echo(
              "Pushed job identifier is: `{}`".format(job.branch)
          )
  
imports: from datetime import date
  from pathlib import Path
  import time
  import sys
  import click
  from .core import Config, Repo, Queue, Target, Job, CrossbowError
  from .reports import ChatReport, Report, ReportUtils, ConsoleReport, EmailReport, CommentReport
  from ..utils.source import ArrowSources
label_desc: Use image node_id 3 for calling a global function with example usage: submit(obj, tasks, groups, params, job_prefix, config_path, arrow_version, arrow_remote, arrow_branch, arrow_sha, fetch, dry_run, no_push) without return types