databricks-cli/bundle/config/mutator
Pieter Noordhuis 87dd46a3f8
Use dynamic configuration model in bundles (#1098)
## Changes

This is a fundamental change to how we load and process bundle
configuration. We now depend on the configuration being represented as a
`dyn.Value`. This representation is functionally equivalent to Go's
`any` (it is variadic) and allows us to capture metadata associated with
a value, such as where it was defined (e.g. file, line, and column). It
also allows us to represent Go's zero values properly (e.g. empty
string, integer equal to 0, or boolean false).

Using this representation allows us to let the configuration model
deviate from the typed structure we have been relying on so far
(`config.Root`). We need to deviate from these types when using
variables for fields that are not a string themselves. For example,
using `${var.num_workers}` for an integer `workers` field was impossible
until now (though not implemented in this change).

The loader for a `dyn.Value` includes functionality to capture any and
all type mismatches between the user-defined configuration and the
expected types. These mismatches can be surfaced as validation errors in
future PRs.

Given that many mutators expect the typed struct to be the source of
truth, this change converts between the dynamic representation and the
typed representation on mutator entry and exit. Existing mutators can
continue to modify the typed representation and these modifications are
reflected in the dynamic representation (see `MarkMutatorEntry` and
`MarkMutatorExit` in `bundle/config/root.go`).

Required changes included in this change:
* The existing interpolation package is removed in favor of
`libs/dyn/dynvar`.
* Functionality to merge job clusters, job tasks, and pipeline clusters
are now all broken out into their own mutators.

To be implemented later:
* Allow variable references for non-string types.
* Surface diagnostics about the configuration provided by the user in
the validation output.
* Some mutators use a resource's configuration file path to resolve
related relative paths. These depend on `bundle/config/paths.Path` being
set and populated through `ConfigureConfigFilePath`. Instead, they
should interact with the dynamically typed configuration directly. Doing
this also unlocks being able to differentiate different base paths used
within a job (e.g. a task override with a relative path defined in a
directory other than the base job).

## Tests

* Existing unit tests pass (some have been modified to accommodate)
* Integration tests pass
2024-02-16 19:41:58 +00:00
..
default_target.go Renamed `environments` to `targets` in bundle configuration (#670) 2023-08-17 15:22:32 +00:00
default_target_test.go Replace direct calls with `bundle.Apply` (#990) 2023-11-15 14:19:18 +00:00
default_workspace_paths.go Make `file_path` and `artifact_path` fields consistent with json tag (#987) 2023-11-15 13:37:26 +00:00
default_workspace_paths_test.go Replace direct calls with `bundle.Apply` (#990) 2023-11-15 14:19:18 +00:00
default_workspace_root.go Renamed `environments` to `targets` in bundle configuration (#670) 2023-08-17 15:22:32 +00:00
default_workspace_root_test.go Replace direct calls with `bundle.Apply` (#990) 2023-11-15 14:19:18 +00:00
environments_compat.go Use dynamic configuration model in bundles (#1098) 2024-02-16 19:41:58 +00:00
environments_compat_test.go Use dynamic configuration model in bundles (#1098) 2024-02-16 19:41:58 +00:00
expand_pipeline_glob_paths.go Do not replace pipeline libraries if there are no matches for pattern (#1021) 2023-11-29 13:20:13 +00:00
expand_pipeline_glob_paths_test.go Use dynamic configuration model in bundles (#1098) 2024-02-16 19:41:58 +00:00
expand_workspace_root.go Added support for bundle.Seq, simplified Mutator.Apply interface (#403) 2023-05-24 14:45:19 +02:00
expand_workspace_root_test.go Replace direct calls with `bundle.Apply` (#990) 2023-11-15 14:19:18 +00:00
if.go Make a notebook wrapper for Python wheel tasks optional (#797) 2023-09-26 14:32:20 +00:00
initialize_variables.go Initialize variable definitions that are defined without properties (#966) 2023-11-08 11:01:14 +00:00
initialize_variables_test.go Initialize variable definitions that are defined without properties (#966) 2023-11-08 11:01:14 +00:00
initialize_workspace_client.go Fix panic when bundle auth resolution fails (#1002) 2023-11-30 14:28:01 +00:00
load_git_details.go Persist deployment metadata in WSFS (#845) 2023-10-27 12:55:43 +00:00
merge_job_clusters.go Use dynamic configuration model in bundles (#1098) 2024-02-16 19:41:58 +00:00
merge_job_clusters_test.go Use dynamic configuration model in bundles (#1098) 2024-02-16 19:41:58 +00:00
merge_job_tasks.go Use dynamic configuration model in bundles (#1098) 2024-02-16 19:41:58 +00:00
merge_job_tasks_test.go Use dynamic configuration model in bundles (#1098) 2024-02-16 19:41:58 +00:00
merge_pipeline_clusters.go Use dynamic configuration model in bundles (#1098) 2024-02-16 19:41:58 +00:00
merge_pipeline_clusters_test.go Use dynamic configuration model in bundles (#1098) 2024-02-16 19:41:58 +00:00
mutator.go Use dynamic configuration model in bundles (#1098) 2024-02-16 19:41:58 +00:00
noop.go Make a notebook wrapper for Python wheel tasks optional (#797) 2023-09-26 14:32:20 +00:00
override_compute.go Consolidate environment variable interaction (#747) 2023-09-11 08:18:43 +00:00
override_compute_test.go Use dynamic configuration model in bundles (#1098) 2024-02-16 19:41:58 +00:00
populate_current_user.go Add short_name helper function to bundle init templates (#1167) 2024-02-01 16:46:07 +00:00
populate_current_user_test.go Add short_name helper function to bundle init templates (#1167) 2024-02-01 16:46:07 +00:00
process_include.go Added support for bundle.Seq, simplified Mutator.Apply interface (#403) 2023-05-24 14:45:19 +02:00
process_include_test.go Replace direct calls with `bundle.Apply` (#990) 2023-11-15 14:19:18 +00:00
process_root_includes.go Consolidate environment variable interaction (#747) 2023-09-11 08:18:43 +00:00
process_root_includes_test.go Replace direct calls with `bundle.Apply` (#990) 2023-11-15 14:19:18 +00:00
process_target_mode.go Change recommended production deployment path from /Shared to /Users (#1091) 2024-01-02 19:58:24 +00:00
process_target_mode_test.go Use dynamic configuration model in bundles (#1098) 2024-02-16 19:41:58 +00:00
resolve_resource_references.go Allow referencing bundle resources by name (#872) 2024-01-04 21:04:42 +00:00
resolve_resource_references_test.go Use MockWorkspaceClient from SDK instead of WithImpl mocking (#1134) 2024-01-19 14:12:58 +00:00
resolve_variable_references.go Use dynamic configuration model in bundles (#1098) 2024-02-16 19:41:58 +00:00
resolve_variable_references_test.go Use dynamic configuration model in bundles (#1098) 2024-02-16 19:41:58 +00:00
rewrite_sync_paths.go Use dynamic configuration model in bundles (#1098) 2024-02-16 19:41:58 +00:00
rewrite_sync_paths_test.go Use dynamic configuration model in bundles (#1098) 2024-02-16 19:41:58 +00:00
run_as.go Added run_as section for bundle configuration (#692) 2023-08-23 16:47:07 +00:00
select_default_target.go Replace direct calls with `bundle.Apply` (#990) 2023-11-15 14:19:18 +00:00
select_default_target_test.go Replace direct calls with `bundle.Apply` (#990) 2023-11-15 14:19:18 +00:00
select_target.go Use dynamic configuration model in bundles (#1098) 2024-02-16 19:41:58 +00:00
select_target_test.go Replace direct calls with `bundle.Apply` (#990) 2023-11-15 14:19:18 +00:00
set_variables.go Allow referencing bundle resources by name (#872) 2024-01-04 21:04:42 +00:00
set_variables_test.go Replace direct calls with `bundle.Apply` (#990) 2023-11-15 14:19:18 +00:00
trampoline.go Make `file_path` and `artifact_path` fields consistent with json tag (#987) 2023-11-15 13:37:26 +00:00
trampoline_test.go Consolidate environment variable interaction (#747) 2023-09-11 08:18:43 +00:00
translate_paths.go Make `file_path` and `artifact_path` fields consistent with json tag (#987) 2023-11-15 13:37:26 +00:00
translate_paths_artifacts.go Make resource and artifact paths in bundle config relative to config folder (#708) 2023-09-04 09:55:01 +00:00
translate_paths_jobs.go Enable `spark_jar_task` with local JAR libraries (#993) 2023-11-21 10:15:09 +00:00
translate_paths_pipelines.go Make resource and artifact paths in bundle config relative to config folder (#708) 2023-09-04 09:55:01 +00:00
translate_paths_test.go Use dynamic configuration model in bundles (#1098) 2024-02-16 19:41:58 +00:00
validate_git_details.go Add validation for Git settings in bundles (#578) 2023-07-30 12:44:33 +00:00
validate_git_details_test.go Replace direct calls with `bundle.Apply` (#990) 2023-11-15 14:19:18 +00:00