databricks-cli/libs/dyn
Andrew Nester 913e10a037
Added support for Databricks Apps in DABs (#1928)
## Changes
Now it's possible to configure new `app` resource in bundle and point it
to the custom `source_code_path` location where Databricks App code is
defined.

On `databricks bundle deploy` DABs will create an app. All consecutive
`databricks bundle deploy` execution will update an existing app if
there are any updated

On `databricks bundle run <my_app>` DABs will execute app deployment. If
the app is not started yet, it will start the app first.

### Bundle configuration

```
bundle:
  name: apps

variables:
  my_job_id:
    description: "ID of job to run app"
    lookup:
      job: "My Job"
  databricks_name:
    description: "Name for app user"
  additional_flags:
    description: "Additional flags to run command app"
    default: ""
  my_app_config:
    type: complex
    description: "Configuration for my Databricks App"
    default:
      command:
        - flask
        - --app
        - hello
        - run
        - ${var.additional_flags}
      env:
        - name: DATABRICKS_NAME
          value: ${var.databricks_name}

resources:
  apps:
    my_app:
      name: "anester-app" # required and has to be unique
      description: "My App"
      source_code_path: ./app # required and points to location of app code
      config: ${var.my_app_config}
      resources:
        - name: "my-job"
          description: "A job for app to be able to run"
          job:
            id: ${var.my_job_id}
            permission: "CAN_MANAGE_RUN"
      permissions:
        - user_name: "foo@bar.com"
          level: "CAN_VIEW"
        - service_principal_name: "my_sp"
          level: "CAN_MANAGE"

targets:
  dev:
    variables:
      databricks_name: "Andrew (from dev)"
      additional_flags: --debug
  
  prod:
    variables:
      databricks_name: "Andrew (from prod)"
```

### Execution
1. `databricks bundle deploy -t dev`
2. `databricks bundle run my_app -t dev`

**If app is started**
```
✓ Getting the status of the app my-app
✓ App is in RUNNING state
✓ Preparing source code for new app deployment.
✓ Deployment is pending
✓ Starting app with command: flask --app hello run --debug
✓ App started successfully
You can access the app at <app-url>
```

**If app is not started**
```
✓ Getting the status of the app my-app
✓ App is in UNAVAILABLE state
✓ Starting the app my-app
✓ App is starting...
....
✓ App is starting...
✓ App is started!
✓ Preparing source code for new app deployment.
✓ Downloading source code from /Workspace/Users/...
✓ Starting app with command: flask --app hello run --debug
✓ App started successfully
You can access the app at <app-url>
```

## Tests
Added unit and config tests + manual test.

```
--- PASS: TestAccDeployBundleWithApp (404.59s)
PASS
coverage: 36.8% of statements in ./...
ok      github.com/databricks/cli/internal/bundle       405.035s        coverage: 36.8% of statements in ./...
```
2025-01-13 16:43:48 +00:00
..
convert Enable perfsprint linter and apply autofix (#2071) 2025-01-07 10:49:23 +00:00
dynassert Enable gofumpt and goimports in golangci-lint (#1999) 2024-12-12 10:28:42 +01:00
dynvar Add DABs support for Unity Catalog volumes (#1762) 2024-12-02 21:18:07 +00:00
jsonloader Enable perfsprint linter and apply autofix (#2071) 2025-01-07 10:49:23 +00:00
jsonsaver Add error checking in tests and enable errcheck there (#1980) 2024-12-09 13:56:41 +01:00
merge Added support for Databricks Apps in DABs (#1928) 2025-01-13 16:43:48 +00:00
yamlloader Enable gofumpt and goimports in golangci-lint (#1999) 2024-12-12 10:28:42 +01:00
yamlsaver Enable perfsprint linter and apply autofix (#2071) 2025-01-07 10:49:23 +00:00
kind.go Add `dyn.Time` to box a timestamp with its original string value (#1732) 2024-08-29 13:02:34 +00:00
kind_test.go Define `dyn.Mapping` to represent maps (#1301) 2024-03-25 11:01:09 +00:00
location.go Enable perfsprint linter and apply autofix (#2071) 2025-01-07 10:49:23 +00:00
location_test.go Define `dyn.Mapping` to represent maps (#1301) 2024-03-25 11:01:09 +00:00
mapping.go Enable gofumpt and goimports in golangci-lint (#1999) 2024-12-12 10:28:42 +01:00
mapping_test.go Enable perfsprint linter and apply autofix (#2071) 2025-01-07 10:49:23 +00:00
path.go Enable intrange linter and apply autofix (#2069) 2025-01-03 09:25:07 +00:00
path_string.go Rename libs/config -> libs/dyn (#1086) 2023-12-22 13:20:45 +00:00
path_string_test.go Enable perfsprint linter and apply autofix (#2071) 2025-01-07 10:49:23 +00:00
path_test.go Define `dyn.Mapping` to represent maps (#1301) 2024-03-25 11:01:09 +00:00
pattern.go Enable errcheck everywhere and fix or silent remaining issues (#1987) 2024-12-11 13:26:00 +01:00
pattern_test.go Define `dyn.Mapping` to represent maps (#1301) 2024-03-25 11:01:09 +00:00
time.go Add `dyn.Time` to box a timestamp with its original string value (#1732) 2024-08-29 13:02:34 +00:00
time_test.go Add `dyn.Time` to box a timestamp with its original string value (#1732) 2024-08-29 13:02:34 +00:00
value.go Add `dyn.Time` to box a timestamp with its original string value (#1732) 2024-08-29 13:02:34 +00:00
value_test.go Enable gofumpt and goimports in golangci-lint (#1999) 2024-12-12 10:28:42 +01:00
value_underlying.go Add `dyn.Time` to box a timestamp with its original string value (#1732) 2024-08-29 13:02:34 +00:00
value_underlying_test.go Add `dyn.Time` to box a timestamp with its original string value (#1732) 2024-08-29 13:02:34 +00:00
visit.go Enable errcheck everywhere and fix or silent remaining issues (#1987) 2024-12-11 13:26:00 +01:00
visit_get.go Add `dyn.MapByPattern` to map a function to values with matching paths (#1266) 2024-03-08 14:33:01 +00:00
visit_get_test.go Define `dyn.Mapping` to represent maps (#1301) 2024-03-25 11:01:09 +00:00
visit_map.go Enable errcheck everywhere and fix or silent remaining issues (#1987) 2024-12-11 13:26:00 +01:00
visit_map_test.go Enable perfsprint linter and apply autofix (#2071) 2025-01-07 10:49:23 +00:00
visit_set.go Enable errcheck everywhere and fix or silent remaining issues (#1987) 2024-12-11 13:26:00 +01:00
visit_set_test.go Define `dyn.Mapping` to represent maps (#1301) 2024-03-25 11:01:09 +00:00
visit_test.go Pass copy of `dyn.Path` to callback function (#1747) 2024-09-05 11:05:16 +00:00
walk.go Enable errcheck everywhere and fix or silent remaining issues (#1987) 2024-12-11 13:26:00 +01:00
walk_test.go Use `dyn.InvalidValue` to indicate absence (#1507) 2024-06-19 15:24:57 +00:00