Set metadata fields required to enable break-glass UI for jobs (#880)

## Changes

This PR sets the following fields for all jobs that are deployed from a
DAB
1. `deployment`: This provides the platform with the path to a file to
read the metadata from.
2. `edit_mode`: This tells the platform to display the break-glass UI
for jobs deployed from a DAB. Setting this is required to re-lock the UI
after a user clicks "disconnect from source".
3. `format = MULTI_TASK`. This makes the Terraform provider always use
jobs API 2.1 for creating/updating the job. Required because
`deployment` and `edit_mode` are only available in API 2.1.

## Tests

Unit test and manually. Manually verified that deployments trigger the
break glass UI. Manually verified there is no Terraform drift when all
three fields are set.

---------

Co-authored-by: Pieter Noordhuis <pieter.noordhuis@databricks.com>
This commit is contained in:
shreyas-goenka 2023-12-19 13:08:52 +05:30 committed by GitHub
parent 5526cd3fb2
commit 2d93f62f21
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 110 additions and 0 deletions

View File

@ -0,0 +1,36 @@
package metadata
import (
"context"
"path"
"github.com/databricks/cli/bundle"
"github.com/databricks/databricks-sdk-go/service/jobs"
)
type annotateJobs struct{}
func AnnotateJobs() bundle.Mutator {
return &annotateJobs{}
}
func (m *annotateJobs) Name() string {
return "metadata.AnnotateJobs"
}
func (m *annotateJobs) Apply(_ context.Context, b *bundle.Bundle) error {
for _, job := range b.Config.Resources.Jobs {
if job.JobSettings == nil {
continue
}
job.JobSettings.Deployment = &jobs.JobDeployment{
Kind: jobs.JobDeploymentKindBundle,
MetadataFilePath: path.Join(b.Config.Workspace.StatePath, MetadataFileName),
}
job.JobSettings.EditMode = jobs.JobSettingsEditModeUiLocked
job.JobSettings.Format = jobs.FormatMultiTask
}
return nil
}

View File

@ -0,0 +1,72 @@
package metadata
import (
"context"
"testing"
"github.com/databricks/cli/bundle"
"github.com/databricks/cli/bundle/config"
"github.com/databricks/cli/bundle/config/resources"
"github.com/databricks/databricks-sdk-go/service/jobs"
"github.com/stretchr/testify/assert"
)
func TestAnnotateJobsMutator(t *testing.T) {
b := &bundle.Bundle{
Config: config.Root{
Workspace: config.Workspace{
StatePath: "/a/b/c",
},
Resources: config.Resources{
Jobs: map[string]*resources.Job{
"my-job-1": {
JobSettings: &jobs.JobSettings{
Name: "My Job One",
},
},
"my-job-2": {
JobSettings: &jobs.JobSettings{
Name: "My Job Two",
},
},
},
},
},
}
err := AnnotateJobs().Apply(context.Background(), b)
assert.NoError(t, err)
assert.Equal(t,
&jobs.JobDeployment{
Kind: jobs.JobDeploymentKindBundle,
MetadataFilePath: "/a/b/c/metadata.json",
},
b.Config.Resources.Jobs["my-job-1"].JobSettings.Deployment)
assert.Equal(t, jobs.JobSettingsEditModeUiLocked, b.Config.Resources.Jobs["my-job-1"].EditMode)
assert.Equal(t, jobs.FormatMultiTask, b.Config.Resources.Jobs["my-job-1"].Format)
assert.Equal(t,
&jobs.JobDeployment{
Kind: jobs.JobDeploymentKindBundle,
MetadataFilePath: "/a/b/c/metadata.json",
},
b.Config.Resources.Jobs["my-job-2"].JobSettings.Deployment)
assert.Equal(t, jobs.JobSettingsEditModeUiLocked, b.Config.Resources.Jobs["my-job-2"].EditMode)
assert.Equal(t, jobs.FormatMultiTask, b.Config.Resources.Jobs["my-job-2"].Format)
}
func TestAnnotateJobsMutatorJobWithoutSettings(t *testing.T) {
b := &bundle.Bundle{
Config: config.Root{
Resources: config.Resources{
Jobs: map[string]*resources.Job{
"my-job-1": {},
},
},
},
}
err := AnnotateJobs().Apply(context.Background(), b)
assert.NoError(t, err)
}

View File

@ -6,6 +6,7 @@ import (
"github.com/databricks/cli/bundle/config/interpolation"
"github.com/databricks/cli/bundle/config/mutator"
"github.com/databricks/cli/bundle/config/variable"
"github.com/databricks/cli/bundle/deploy/metadata"
"github.com/databricks/cli/bundle/deploy/terraform"
"github.com/databricks/cli/bundle/permissions"
"github.com/databricks/cli/bundle/python"
@ -37,6 +38,7 @@ func Initialize() bundle.Mutator {
mutator.TranslatePaths(),
python.WrapperWarning(),
permissions.ApplyBundlePermissions(),
metadata.AnnotateJobs(),
terraform.Initialize(),
scripts.Execute(config.ScriptPostInit),
},