Skip to content

air: Include run details in air get JSON - #7624

Draft
artemy-kolesnikov wants to merge 6 commits into
CNXT-2613-max-retries-nafrom
CNXT-2612-air-get-json-details
Draft

artemy-kolesnikov wants to merge 6 commits into
CNXT-2613-max-retries-nafrom
CNXT-2612-air-get-json-details

Conversation

@artemy-kolesnikov

Copy link
Copy Markdown

Changes

Add typed run details to air get -o json, including flat accelerator fields, environment, user, MLflow run name, retry-limit provenance and sweep details. --include-config opts into the stored config and its source. Downloaded configs larger than 1 MiB are omitted.

Why

The text view exposes run details that machine-readable output omits, forcing consumers to parse the text display. Config is opt-in because it can contain plaintext environment variables and parameters. Without the flag, JSON does not read the config, so a retry limit that is not reported by the run is null even when text can derive it from the stored config. This change depends on the retry-limit patch in #7623.

Tests

  • AIR and library Go tests, targeted race tests, AIR acceptance fixtures, Go lint and formatting, and changelog validation.
  • Read-only checks against a workspace on three existing runs compare text and existing JSON fields against the air: Stop showing Max Retries 0 when runs/get omits the retry limit #7623 baseline, and check default versus opted-in JSON. No workloads were submitted.
  • A transport-level regression test checks the 1 MiB limit before SDK response buffering, including JSON responses; sweep lookup failure serializes tasks as an empty array.

This pull request and its description were written by Isaac.

Expose typed accelerator, environment, retry, user, MLflow and sweep details without changing existing JSON fields. Read and emit the stored config only when --include-config is passed, because it may contain plaintext environment variables and parameters. Without it, config-derived retry limits remain unknown.

Bound config downloads before SDK response buffering and omit oversized files in text and JSON. Guarantee an empty array for sweep tasks when iteration lookup fails.

Co-authored-by: Isaac <no-reply@databricks.com>
@github-actions

github-actions Bot commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

Commit: cb575dd98 | Workflow run

Regression test report

Selected 4 changed tests (limit=20, 0 not selected)

4 tests: regression=4 unreleased=0 coverage=0 failing=0
test branch main (c4559ed) latest (v1.26.0)
TestAccept/air/get ✅ ❌ ❌
TestAccept/air/get-ai-runtime ✅ ❌ ❌
TestAccept/air/get-pending ✅ ❌ ❌
TestAccept/air/help ✅ ❌ ❌
TestAccept/air/get: branch ✅ | main (c4559ed) ❌ | latest (v1.26.0) ❌

main (c4559ed):

acceptance_test.go:1374: Diff:
        --- air/get/output.txt
        +++ /tmp/TestAcceptairget68607534/002/output.txt
        @@ -22,7 +22,7 @@
         │  Status        ● SUCCESS                                       │
         │  Submitted     2023-11-14 22:13 UTC                            │
         │  Retries       0                                               │
        -│  Max Retries   N/A                                             │
        +│  Max Retries   0                                               │
         │  Duration      12s                                             │
         │  Experiment    my-exp                                          │
         │  MLflow Run    my-run                                          │
        @@ -51,15 +51,7 @@
             "dashboard_url": "[DATABRICKS_URL]/jobs/runs/123?o=[WORKSPACE_ID]",
             "mlflow_url": "[DATABRICKS_URL]/ml/experiments/exp1/runs/run1/logs",
             "est_remaining_seconds": null,
        -    "est_percent_complete": null,
        -    "user": "user@example.com",
        -    "accelerator_type": "GPU_1xA10",
        -    "num_accelerators": 1,
        -    "environment_version": null,
        -    "base_environment": null,
        -    "max_retries": null,
        -    "mlflow_run_name": "my-run",
        -    "sweep": null
        +    "est_percent_complete": null
           }
         }

latest (v1.26.0):

acceptance_test.go:1374: Diff:
        --- air/get/output.txt
        +++ /tmp/TestAcceptairget2647717555/002/output.txt
        @@ -22,7 +22,7 @@
         │  Status        ● SUCCESS                                       │
         │  Submitted     2023-11-14 22:13 UTC                            │
         │  Retries       0                                               │
        -│  Max Retries   N/A                                             │
        +│  Max Retries   0                                               │
         │  Duration      12s                                             │
         │  Experiment    my-exp                                          │
         │  MLflow Run    my-run                                          │
        @@ -49,17 +49,9 @@
             "attempt_number": 0,
             "experiment_name": "my-exp",
             "dashboard_url": "[DATABRICKS_URL]/jobs/runs/123?o=[WORKSPACE_ID]",
        -    "mlflow_url": "[DATABRICKS_URL]/ml/experiments/exp1/runs/run1/logs",
        +    "mlflow_url": "[DATABRICKS_URL]/ml/experiments/exp1/runs/run1/artifacts/logs/node_0",
             "est_remaining_seconds": null,
        -    "est_percent_complete": null,
        -    "user": "user@example.com",
        -    "accelerator_type": "GPU_1xA10",
        -    "num_accelerators": 1,
        -    "environment_version": null,
        -    "base_environment": null,
        -    "max_retries": null,
        -    "mlflow_run_name": "my-run",
        -    "sweep": null
        +    "est_percent_complete": null
           }
         }
TestAccept/air/get-ai-runtime: branch ✅ | main (c4559ed) ❌ | latest (v1.26.0) ❌

main (c4559ed):

acceptance_test.go:1374: Diff:
        --- air/get-ai-runtime/output.txt
        +++ /tmp/TestAcceptairget-ai-runtime591571118/002/output.txt
        @@ -22,7 +22,7 @@
         │  Status        ● SUCCESS                                       │
         │  Submitted     2023-11-14 22:13 UTC                            │
         │  Retries       0                                               │
        -│  Max Retries   3 (CLI default)                                 │
        +│  Max Retries   0                                               │
         │  Duration      12s                                             │
         │  Experiment    my-exp                                          │
         │  MLflow Run    my-run                                          │
        @@ -51,142 +51,26 @@
             "dashboard_url": "[DATABRICKS_URL]/jobs/runs/123?o=[WORKSPACE_ID]",
             "mlflow_url": "[DATABRICKS_URL]/ml/experiments/exp1/runs/run1/logs",
             "est_remaining_seconds": null,
        -    "est_percent_complete": null,
        -    "user": "user@example.com",
        -    "accelerator_type": "GPU_1xA10",
        -    "num_accelerators": 1,
        -    "environment_version": "4",
        -    "base_environment": null,
        -    "max_retries": null,
        -    "mlflow_run_name": "my-run",
        -    "sweep": null
        +    "est_percent_complete": null
           }
         }
         
         === get (json, include config)
         
         >>> [CLI] air get 123 -o json --include-config
        -{
        -  "v": 1,
        -  "ts": "[TIMESTAMP]",
        -  "data": {
        -    "run_id": "123",
        -    "status": "SUCCESS",
        -    "started_at": "[TIMESTAMP]",
        -    "duration_seconds": 12,
        -    "attempt_number": 0,
        -    "experiment_name": "my-exp",
        -    "dashboard_url": "[DATABRICKS_URL]/jobs/runs/123?o=[WORKSPACE_ID]",
        -    "mlflow_url": "[DATABRICKS_URL]/ml/experiments/exp1/runs/run1/logs",
        -    "est_remaining_seconds": null,
        -    "est_percent_complete": null,
        -    "user": "user@example.com",
        -    "accelerator_type": "GPU_1xA10",
        -    "num_accelerators": 1,
        -    "environment_version": "4",
        -    "base_environment": null,
        -    "max_retries": {
        -      "limit": 3,
        -      "source": "cli_default"
        -    },
        -    "mlflow_run_name": "my-run",
        -    "sweep": null,
        -    "config": "experiment_name: my-exp\ncompute:\n  accelerator_type: a10\n  num_accelerators: 1\ncommand: |-\n  for i in $(seq 1 10); do\n    echo \"step $i\"\n  done\n",
        -    "config_source": "uploaded"
        -  }
        -}
        +Error: unknown flag: --include-config
         
        -=== get (text, max_retries set in the config)
        +Usage:
        +  databricks air get JOB_RUN_ID [flags]
         
        ->>> [CLI] air get 123
        +Flags:
        +  -h, --help   help for get
         
        -╭─ Configuration ────────────────────────────────────────────────╮
        -│                                                                │
        -│  experiment_name: my-exp                                       │
        -│  compute:                                                      │
        -│    accelerator_type: a10                                       │
        -│    num_accelerators: 1                                         │
        -│  max_retries: 1                                                │
        -│  command: echo ok                                              │
        -│                                                                │
        -╰────────────────────────────────────────────────────────────────╯
        +Global Flags:
        +      --debug            enable debug logging
        +  -o, --output type      output type: text or json (default text)
        +  -p, --profile string   ~/.databrickscfg profile
        +  -t, --target string    bundle target to use (if applicable)
         
        -╭─ Metadata ─────────────────────────────────────────────────────╮
        -│                                                                │
        -│  Run ID        123                                             │
        -│  Status        ● SUCCESS                                       │
        -│  Submitted     2023-11-14 22:13 UTC                            │
        -│  Retries       0                                               │
        -│  Max Retries   1                                               │
        -│  Duration      12s                                             │
        -│  Experiment    my-exp                                          │
        -│  MLflow Run    my-run                                          │
        -│  User          user@example.com                                │
        -│  Accelerators  1x A10                                          │
        -│  Environment   4                                               │
        -│                                                                │
        -╰────────────────────────────────────────────────────────────────╯
         
        -Run URL:    [DATABRICKS_URL]/jobs/runs/123?o=[WORKSPACE_ID]
        -MLflow URL: [DATABRICKS_URL]/ml/experiments/exp1/runs/run1
        -
        -=== get (json, max_retries set in the config)
        -
        ->>> [CLI] air get 123 -o json
        -{
        -  "v": 1,
        -  "ts": "[TIMESTAMP]",
        -  "data": {
        -    "run_id": "123",
        -    "status": "SUCCESS",
        -    "started_at": "[TIMESTAMP]",
        -    "duration_seconds": 12,
        -    "attempt_number": 0,
        -    "experiment_name": "my-exp",
        -    "dashboard_url": "[DATABRICKS_URL]/jobs/runs/123?o=[WORKSPACE_ID]",
        -    "mlflow_url": "[DATABRICKS_URL]/ml/experiments/exp1/runs/run1/logs",
        -    "est_remaining_seconds": null,
        -    "est_percent_complete": null,
        -    "user": "user@example.com",
        -    "accelerator_type": "GPU_1xA10",
        -    "num_accelerators": 1,
        -    "environment_version": "4",
        -    "base_environment": null,
        -    "max_retries": null,
        -    "mlflow_run_name": "my-run",
        -    "sweep": null
        -  }
        -}
        -
        -=== get (json, include config, max_retries set)
        -
        ->>> [CLI] air get 123 -o json --include-config
        -{
        -  "v": 1,
        -  "ts": "[TIMESTAMP]",
        -  "data": {
        -    "run_id": "123",
        -    "status": "SUCCESS",
        -    "started_at": "[TIMESTAMP]",
        -    "duration_seconds": 12,
        -    "attempt_number": 0,
        -    "experiment_name": "my-exp",
        -    "dashboard_url": "[DATABRICKS_URL]/jobs/runs/123?o=[WORKSPACE_ID]",
        -    "mlflow_url": "[DATABRICKS_URL]/ml/experiments/exp1/runs/run1/logs",
        -    "est_remaining_seconds": null,
        -    "est_percent_complete": null,
        -    "user": "user@example.com",
        -    "accelerator_type": "GPU_1xA10",
        -    "num_accelerators": 1,
        -    "environment_version": "4",
        -    "base_environment": null,
        -    "max_retries": {
        -      "limit": 1,
        -      "source": "configured"
        -    },
        -    "mlflow_run_name": "my-run",
        -    "sweep": null,
        -    "config": "experiment_name: my-exp\ncompute:\n  accelerator_type: a10\n  num_accelerators: 1\nmax_retries: 1\ncommand: echo ok\n",
        -    "config_source": "uploaded"
        -  }
        -}
        +Exit code: 1
        
    acceptance_test.go:1152: LOG.import: 
    acceptance_test.go:1152: LOG.mkdirs: 
FAIL

latest (v1.26.0):

acceptance_test.go:1374: Diff:
        --- air/get-ai-runtime/output.txt
        +++ /tmp/TestAcceptairget-ai-runtime4278991926/002/output.txt
        @@ -22,7 +22,7 @@
         │  Status        ● SUCCESS                                       │
         │  Submitted     2023-11-14 22:13 UTC                            │
         │  Retries       0                                               │
        -│  Max Retries   3 (CLI default)                                 │
        +│  Max Retries   0                                               │
         │  Duration      12s                                             │
         │  Experiment    my-exp                                          │
         │  MLflow Run    my-run                                          │
        @@ -49,144 +49,28 @@
             "attempt_number": 0,
             "experiment_name": "my-exp",
             "dashboard_url": "[DATABRICKS_URL]/jobs/runs/123?o=[WORKSPACE_ID]",
        -    "mlflow_url": "[DATABRICKS_URL]/ml/experiments/exp1/runs/run1/logs",
        +    "mlflow_url": "[DATABRICKS_URL]/ml/experiments/exp1/runs/run1/artifacts/logs/node_0",
             "est_remaining_seconds": null,
        -    "est_percent_complete": null,
        -    "user": "user@example.com",
        -    "accelerator_type": "GPU_1xA10",
        -    "num_accelerators": 1,
        -    "environment_version": "4",
        -    "base_environment": null,
        -    "max_retries": null,
        -    "mlflow_run_name": "my-run",
        -    "sweep": null
        +    "est_percent_complete": null
           }
         }
         
         === get (json, include config)
         
         >>> [CLI] air get 123 -o json --include-config
        -{
        -  "v": 1,
        -  "ts": "[TIMESTAMP]",
        -  "data": {
        -    "run_id": "123",
        -    "status": "SUCCESS",
        -    "started_at": "[TIMESTAMP]",
        -    "duration_seconds": 12,
        -    "attempt_number": 0,
        -    "experiment_name": "my-exp",
        -    "dashboard_url": "[DATABRICKS_URL]/jobs/runs/123?o=[WORKSPACE_ID]",
        -    "mlflow_url": "[DATABRICKS_URL]/ml/experiments/exp1/runs/run1/logs",
        -    "est_remaining_seconds": null,
        -    "est_percent_complete": null,
        -    "user": "user@example.com",
        -    "accelerator_type": "GPU_1xA10",
        -    "num_accelerators": 1,
        -    "environment_version": "4",
        -    "base_environment": null,
        -    "max_retries": {
        -      "limit": 3,
        -      "source": "cli_default"
        -    },
        -    "mlflow_run_name": "my-run",
        -    "sweep": null,
        -    "config": "experiment_name: my-exp\ncompute:\n  accelerator_type: a10\n  num_accelerators: 1\ncommand: |-\n  for i in $(seq 1 10); do\n    echo \"step $i\"\n  done\n",
        -    "config_source": "uploaded"
        -  }
        -}
        +Error: unknown flag: --include-config
         
        -=== get (text, max_retries set in the config)
        +Usage:
        +  databricks air get JOB_RUN_ID [flags]
         
        ->>> [CLI] air get 123
        +Flags:
        +  -h, --help   help for get
         
        -╭─ Configuration ────────────────────────────────────────────────╮
        -│                                                                │
        -│  experiment_name: my-exp                                       │
        -│  compute:                                                      │
        -│    accelerator_type: a10                                       │
        -│    num_accelerators: 1                                         │
        -│  max_retries: 1                                                │
        -│  command: echo ok                                              │
        -│                                                                │
        -╰────────────────────────────────────────────────────────────────╯
        +Global Flags:
        +      --debug            enable debug logging
        +  -o, --output type      output type: text or json (default text)
        +  -p, --profile string   ~/.databrickscfg profile
        +  -t, --target string    bundle target to use (if applicable)
         
        -╭─ Metadata ─────────────────────────────────────────────────────╮
        -│                                                                │
        -│  Run ID        123                                             │
        -│  Status        ● SUCCESS                                       │
        -│  Submitted     2023-11-14 22:13 UTC                            │
        -│  Retries       0                                               │
        -│  Max Retries   1                                               │
        -│  Duration      12s                                             │
        -│  Experiment    my-exp                                          │
        -│  MLflow Run    my-run                                          │
        -│  User          user@example.com                                │
        -│  Accelerators  1x A10                                          │
        -│  Environment   4                                               │
        -│                                                                │
        -╰────────────────────────────────────────────────────────────────╯
         
        -Run URL:    [DATABRICKS_URL]/jobs/runs/123?o=[WORKSPACE_ID]
        -MLflow URL: [DATABRICKS_URL]/ml/experiments/exp1/runs/run1
        -
        -=== get (json, max_retries set in the config)
        -
        ->>> [CLI] air get 123 -o json
        -{
        -  "v": 1,
        -  "ts": "[TIMESTAMP]",
        -  "data": {
        -    "run_id": "123",
        -    "status": "SUCCESS",
        -    "started_at": "[TIMESTAMP]",
        -    "duration_seconds": 12,
        -    "attempt_number": 0,
        -    "experiment_name": "my-exp",
        -    "dashboard_url": "[DATABRICKS_URL]/jobs/runs/123?o=[WORKSPACE_ID]",
        -    "mlflow_url": "[DATABRICKS_URL]/ml/experiments/exp1/runs/run1/logs",
        -    "est_remaining_seconds": null,
        -    "est_percent_complete": null,
        -    "user": "user@example.com",
        -    "accelerator_type": "GPU_1xA10",
        -    "num_accelerators": 1,
        -    "environment_version": "4",
        -    "base_environment": null,
        -    "max_retries": null,
        -    "mlflow_run_name": "my-run",
        -    "sweep": null
        -  }
        -}
        -
        -=== get (json, include config, max_retries set)
        -
        ->>> [CLI] air get 123 -o json --include-config
        -{
        -  "v": 1,
        -  "ts": "[TIMESTAMP]",
        -  "data": {
        -    "run_id": "123",
        -    "status": "SUCCESS",
        -    "started_at": "[TIMESTAMP]",
        -    "duration_seconds": 12,
        -    "attempt_number": 0,
        -    "experiment_name": "my-exp",
        -    "dashboard_url": "[DATABRICKS_URL]/jobs/runs/123?o=[WORKSPACE_ID]",
        -    "mlflow_url": "[DATABRICKS_URL]/ml/experiments/exp1/runs/run1/logs",
        -    "est_remaining_seconds": null,
        -    "est_percent_complete": null,
        -    "user": "user@example.com",
        -    "accelerator_type": "GPU_1xA10",
        -    "num_accelerators": 1,
        -    "environment_version": "4",
        -    "base_environment": null,
        -    "max_retries": {
        -      "limit": 1,
        -      "source": "configured"
        -    },
        -    "mlflow_run_name": "my-run",
        -    "sweep": null,
        -    "config": "experiment_name: my-exp\ncompute:\n  accelerator_type: a10\n  num_accelerators: 1\nmax_retries: 1\ncommand: echo ok\n",
        -    "config_source": "uploaded"
        -  }
        -}
        +Exit code: 1
        
    acceptance_test.go:1152: LOG.import: 
    acceptance_test.go:1152: LOG.mkdirs: 
FAIL
TestAccept/air/get-pending: branch ✅ | main (c4559ed) ❌ | latest (v1.26.0) ❌

main (c4559ed):

acceptance_test.go:1374: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1374
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1115
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:660
        	Error:      	Not equal: 
        	            	expected: "\n>>> [CLI] air get 123 -o json\n{\n  \"v\": 1,\n  \"ts\": \"[TIMESTAMP]\",\n  \"data\": {\n    \"run_id\": \"123\",\n    \"status\": \"PENDING\",\n    \"started_at\": null,\n    \"duration_seconds\": null,\n    \"attempt_number\": 0,\n    \"experiment_name\": \"my-exp\",\n    \"dashboard_url\": \"[DATABRICKS_URL]/jobs/runs/123?o=[WORKSPACE_ID]\",\n    \"mlflow_url\": null,\n    \"status_message\": \"Waiting for accelerator compute capacity to become available...\",\n    \"est_remaining_seconds\": null,\n    \"est_percent_complete\": null,\n    \"user\": \"user@example.com\",\n    \"accelerator_type\": \"GPU_1xA10\",\n    \"num_accelerators\": 1,\n    \"environment_version\": null,\n    \"base_environment\": null,\n    \"max_retries\": {\n      \"limit\": 0,\n      \"source\": \"reported\"\n    },\n    \"mlflow_run_name\": null,\n    \"sweep\": null\n  }\n}\n"
        	            	actual  : "\n>>> [CLI] air get 123 -o json\n{\n  \"v\": 1,\n  \"ts\": \"[TIMESTAMP]\",\n  \"data\": {\n    \"run_id\": \"123\",\n    \"status\": \"PENDING\",\n    \"started_at\": null,\n    \"duration_seconds\": null,\n    \"attempt_number\": 0,\n    \"experiment_name\": \"my-exp\",\n    \"dashboard_url\": \"[DATABRICKS_URL]/jobs/runs/123?o=[WORKSPACE_ID]\",\n    \"mlflow_url\": null,\n    \"status_message\": \"Waiting for accelerator compute capacity to become available...\",\n    \"est_remaining_seconds\": null,\n    \"est_percent_complete\": null\n  }\n}\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -16,14 +16,3 @@
        	            	     "est_remaining_seconds": null,
        	            	-    "est_percent_complete": null,
        	            	-    "user": "user@example.com",
        	            	-    "accelerator_type": "GPU_1xA10",
        	            	-    "num_accelerators": 1,
        	            	-    "environment_version": null,
        	            	-    "base_environment": null,
        	            	-    "max_retries": {
        	            	-      "limit": 0,
        	            	-      "source": "reported"
        	            	-    },
        	            	-    "mlflow_run_name": null,
        	            	-    "sweep": null
        	            	+    "est_percent_complete": null
        	            	   }
        	Test:       	TestAccept/air/get-pending
        	Messages:   	air/get-pending/output.txt vs /tmp/TestAcceptairget-pending24841256/002/output.txt

latest (v1.26.0):

acceptance_test.go:1374: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1374
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1115
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:660
        	Error:      	Not equal: 
        	            	expected: "\n>>> [CLI] air get 123 -o json\n{\n  \"v\": 1,\n  \"ts\": \"[TIMESTAMP]\",\n  \"data\": {\n    \"run_id\": \"123\",\n    \"status\": \"PENDING\",\n    \"started_at\": null,\n    \"duration_seconds\": null,\n    \"attempt_number\": 0,\n    \"experiment_name\": \"my-exp\",\n    \"dashboard_url\": \"[DATABRICKS_URL]/jobs/runs/123?o=[WORKSPACE_ID]\",\n    \"mlflow_url\": null,\n    \"status_message\": \"Waiting for accelerator compute capacity to become available...\",\n    \"est_remaining_seconds\": null,\n    \"est_percent_complete\": null,\n    \"user\": \"user@example.com\",\n    \"accelerator_type\": \"GPU_1xA10\",\n    \"num_accelerators\": 1,\n    \"environment_version\": null,\n    \"base_environment\": null,\n    \"max_retries\": {\n      \"limit\": 0,\n      \"source\": \"reported\"\n    },\n    \"mlflow_run_name\": null,\n    \"sweep\": null\n  }\n}\n"
        	            	actual  : "\n>>> [CLI] air get 123 -o json\n{\n  \"v\": 1,\n  \"ts\": \"[TIMESTAMP]\",\n  \"data\": {\n    \"run_id\": \"123\",\n    \"status\": \"RUNNING\",\n    \"started_at\": null,\n    \"duration_seconds\": null,\n    \"attempt_number\": 0,\n    \"experiment_name\": \"my-exp\",\n    \"dashboard_url\": \"[DATABRICKS_URL]/jobs/runs/123?o=[WORKSPACE_ID]\",\n    \"mlflow_url\": null,\n    \"est_remaining_seconds\": null,\n    \"est_percent_complete\": null\n  }\n}\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -7,3 +7,3 @@
        	            	     "run_id": "123",
        	            	-    "status": "PENDING",
        	            	+    "status": "RUNNING",
        	            	     "started_at": null,
        	            	@@ -14,16 +14,4 @@
        	            	     "mlflow_url": null,
        	            	-    "status_message": "Waiting for accelerator compute capacity to become available...",
        	            	     "est_remaining_seconds": null,
        	            	-    "est_percent_complete": null,
        	            	-    "user": "user@example.com",
        	            	-    "accelerator_type": "GPU_1xA10",
        	            	-    "num_accelerators": 1,
        	            	-    "environment_version": null,
        	            	-    "base_environment": null,
        	            	-    "max_retries": {
        	            	-      "limit": 0,
        	            	-      "source": "reported"
        	            	-    },
        	            	-    "mlflow_run_name": null,
        	            	-    "sweep": null
        	            	+    "est_percent_complete": null
        	            	   }
        	Test:       	TestAccept/air/get-pending
        	Messages:   	air/get-pending/output.txt vs /tmp/TestAcceptairget-pending601484558/002/output.txt
TestAccept/air/help: branch ✅ | main (c4559ed) ❌ | latest (v1.26.0) ❌

main (c4559ed):

acceptance_test.go:1374: Diff:
        --- air/help/output.txt
        +++ /tmp/TestAcceptairhelp2447875590/002/output.txt
        @@ -96,8 +96,7 @@
           databricks air get JOB_RUN_ID [flags]
         
         Flags:
        -  -h, --help             help for get
        -      --include-config   Include stored config in JSON (downloads over 1 MiB are omitted; may contain plaintext env_variables and parameters)
        +  -h, --help   help for get
         
         Global Flags:
               --debug            enable debug logging

latest (v1.26.0):

acceptance_test.go:1374: Diff:
        --- air/help/output.txt
        +++ /tmp/TestAcceptairhelp938314074/002/output.txt
        @@ -2,31 +2,23 @@
         === help
         
         >>> [CLI] air --help
        -Run GPU workloads on Databricks serverless compute.
        +Run and manage AI Runtime training workloads on Databricks serverless GPU compute.
         
        -Describe a workload in a YAML file and submit it with "databricks air run".
        -Follow a run with "databricks air logs" and "databricks air get", or see your
        -active runs with "databricks air list".
        +These commands are under active development.
         
         Usage:
           databricks air [command]
         
        -Run workloads:
        -  run             Submit a workload from a YAML config
        -
        -Manage runs:
        +Available Commands:
           cancel          Cancel one or more runs
        -  get             Show a run's status, configuration, and timing
        -  list            List your active runs
        -  logs            Stream or fetch a run's logs
        +  convert-to-dabs Convert an AIR run YAML into a Databricks Asset Bundle
        +  get             Show status, configuration, and timing details for a specified run
        +  images          Manage container images for AI Runtime
        +  list            List active runs for the current user
        +  logs            Stream or fetch logs for a run
        +  pools           View provisioned GPU pools
        +  run             Submit a training workload from a YAML config
         
        -Package and deploy:
        -  convert-to-dabs Convert a workload YAML into a Databricks Asset Bundle
        -  images          Push container images for custom environments
        -
        -Provisioned capacity:
        -  pools           View provisioned GPU pools, if any (not required to run)
        -
         Flags:
           -h, --help   help for air
         
        @@ -38,12 +23,6 @@
         
         Use "databricks air [command] --help" for more information about a command.
         
        -Learn more:
        -  YAML fields and example  databricks air run -h config
        -  Quickstart (AWS)         https://docs.databricks.com/aws/en/machine-learning/ai-runtime/quickstart
        -  Quickstart (Azure)       https://learn.microsoft.com/azure/databricks/machine-learning/ai-runtime/quickstart
        -  Coding agent skill       databricks aitools install --skills-only --skills databricks-ai-runtime
        -
         === list help
         
         >>> [CLI] air list --help
        @@ -52,9 +31,7 @@
         Filters:
           Use --filter KEY=VALUE per condition. A run must match every condition.
         
        -  accelerator_type  Accelerator family or full YAML type. Examples:
        -                    A10, H100, GPU_1xA10, GPU_8xH100.
        -                    Workspace types: databricks air run -h config.compute.accelerator_type
        +  accelerator_type  Accelerator type, such as A10 or H100.
           experiment        Case-insensitive glob matched against the experiment name.
           num_accelerators  Total GPU count.
           user              Run creator identifier.
        @@ -65,8 +42,6 @@
         Examples:
           databricks air list --filter accelerator_type=H100
         
        -  databricks air list --filter accelerator_type=GPU_8xH100
        -
           databricks air list --all-status \
             --filter 'experiment=qwen*' \
             --filter num_accelerators=8 \
        @@ -88,16 +63,15 @@
         === get help
         
         >>> [CLI] air get --help
        -Show a run's status, configuration, and timing.
        +Show status, configuration, and timing details for a specified run.
         
        -JOB_RUN_ID is the job run ID returned by "databricks air run".
        +JOB_RUN_ID is the job run ID returned by "air run".
         
         Usage:
           databricks air get JOB_RUN_ID [flags]
         
         Flags:
        -  -h, --help             help for get
        -      --include-config   Include stored config in JSON (downloads over 1 MiB are omitted; may contain plaintext env_variables and parameters)
        +  -h, --help   help for get
         
         Global Flags:
               --debug            enable debug logging
        @@ -108,18 +76,14 @@
         === pools help
         
         >>> [CLI] air pools --help
        -View GPU pools provisioned for your workspace.
        +View provisioned GPU pools
         
        -A GPU pool is dedicated accelerator capacity that your Databricks account team
        -provisions. Pools are optional: a run uses one only when its YAML sets
        -compute.pool_id.
        -
         Usage:
           databricks air pools [flags]
           databricks air pools [command]
         
         Available Commands:
        -  get         Show a GPU pool and its accelerator usage
        +  get         Show a GPU pool, including its accelerator usage (POOL_ID may be omitted when the workspace has exactly one pool)
           list        List the GPU pools available to the current workspace
         
         Flags:
        @@ -136,7 +94,7 @@
         === images help
         
         >>> [CLI] air images --help
        -Push container images for custom environments
        +Manage container images for AI Runtime
         
         Usage:
           databricks air images [flags]
        @@ -160,7 +118,7 @@
         
         >>> [CLI] air images push --help
         This CLI command is in Preview. For current feature status and requirements, see:
        -  AWS: https://docs.databricks.com/aws/en/machine-learning/ai-runtime/connecting/cli/docker-images
        +  AWS: https://docs.databricks.com/aws/en/machine-learning/ai-runtime/cli/docker-images
           Azure: https://learn.microsoft.com/azure/databricks/machine-learning/ai-runtime/connecting/cli/docker-images
         
         Push a container image to Databricks Artifact Registry under the specified Unity Catalog catalog and schema.
        @@ -196,7 +154,7 @@
         Stream logs from an active run until it completes, or fetch logs from a
         completed run.
         
        -JOB_RUN_ID is the job run ID returned by "databricks air run".
        +JOB_RUN_ID is the job run ID returned by "air run".
         
         Usage:
           databricks air logs JOB_RUN_ID [flags]

@eng-dev-ecosystem-bot

eng-dev-ecosystem-bot commented Nov 13, 2026 •

Copy link
Copy Markdown
Collaborator

✅ Integration test report

Commit: cb575dd

Run: 43533042655

Env ✅​pass 🙈​skip Time
✅​ aws linux-2core-8gb 271 19 5:23
✅​ aws-windows-latest-4core-16gb 273 17 5:14
✅​ azure linux-2core-8gb 270 19 4:37
✅​ azure-windows-latest-4core-16gb 272 17 4:42
✅​ gcp linux-2core-8gb 271 19 4:53
✅​ gcp-windows-latest-4core-16gb 273 17 5:59
Top 4 slowest tests (at least 2 minutes):
duration env testname
3:27 gcp-windows-latest-4core-16gb TestAccept
3:19 azure-windows-latest-4core-16gb TestAccept
3:08 aws-windows-latest-4core-16gb TestAccept
2:03 gcp-windows-latest-4core-16gb TestFilerReadWrite/workspace_files

artemy-kolesnikov and others added 5 commits November 13, 2026 23:48
Co-authored-by: Isaac <no-reply@databricks.com>
…etails

Co-authored-by: Isaac <no-reply@databricks.com>
…etails

Co-authored-by: Isaac <no-reply@databricks.com>
…etails

Co-authored-by: Isaac <no-reply@databricks.com>
The config downloaded for the JSON output is reported verbatim, so a config
uploaded from a Windows checkout (CRLF) produced different JSON than the
same config uploaded from Unix (LF). Normalize the line endings for the
machine-readable field; the text display already reformats the config.

Co-authored-by: Isaac <no-reply@databricks.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants