Compare commits

...

5 Commits

Author SHA1 Message Date
Wojciech Pratkowiecki f4118d2af4
Merge fd67acbc7f into 7d732ceba8 2024-11-18 10:54:10 +01:00
Wojciech Pratkowiecki fd67acbc7f Move show plan to a function 2024-10-03 09:37:11 +02:00
Wojciech Pratkowiecki 9e53f117d2 Move dry run check before possible reutrns 2024-10-03 08:48:45 +02:00
Wojciech Pratkowiecki 12259b9837 Add test 2024-10-02 20:11:11 +02:00
Wojciech Pratkowiecki a64b88b93c Add --dry-run option for bundle deplot 2024-10-02 20:01:01 +02:00
4 changed files with 75 additions and 0 deletions

View File

@ -81,6 +81,9 @@ type Bundle struct {
// files // files
AutoApprove bool AutoApprove bool
// if true, the deploy changes are presented, but not applied
DryRun bool
// Tagging is used to normalize tag keys and values. // Tagging is used to normalize tag keys and values.
// The implementation depends on the cloud being targeted. // The implementation depends on the cloud being targeted.
Tagging tags.Cloud Tagging tags.Cloud

View File

@ -51,6 +51,43 @@ func parseTerraformActions(changes []*tfjson.ResourceChange, toInclude func(typ
return res return res
} }
func showDryRunChanges(ctx context.Context, plan *tfjson.Plan) {
updateActions := make([]terraformlib.Action, 0)
for _, rc := range plan.ResourceChanges {
if rc.Change.Actions.Update() {
updateActions = append(updateActions, terraformlib.Action{
Action: terraformlib.ActionTypeUpdate,
ResourceType: rc.Type,
ResourceName: rc.Name,
})
}
}
createActions := make([]terraformlib.Action, 0)
for _, rc := range plan.ResourceChanges {
if rc.Change.Actions.Create() {
createActions = append(createActions, terraformlib.Action{
Action: terraformlib.ActionTypeCreate,
ResourceType: rc.Type,
ResourceName: rc.Name,
})
}
}
if len(updateActions) > 0 {
cmdio.LogString(ctx, "The following resources will be updated:")
for _, a := range updateActions {
cmdio.Log(ctx, a)
}
cmdio.LogString(ctx, "")
}
if len(createActions) > 0 {
cmdio.LogString(ctx, "The following resources will be created:")
for _, a := range createActions {
cmdio.Log(ctx, a)
}
cmdio.LogString(ctx, "")
}
}
func approvalForDeploy(ctx context.Context, b *bundle.Bundle) (bool, error) { func approvalForDeploy(ctx context.Context, b *bundle.Bundle) (bool, error) {
tf := b.Terraform tf := b.Terraform
if tf == nil { if tf == nil {
@ -63,6 +100,11 @@ func approvalForDeploy(ctx context.Context, b *bundle.Bundle) (bool, error) {
return false, err return false, err
} }
if b.DryRun {
showDryRunChanges(ctx, plan)
return false, nil
}
schemaActions := parseTerraformActions(plan.ResourceChanges, func(typ string, actions tfjson.Actions) bool { schemaActions := parseTerraformActions(plan.ResourceChanges, func(typ string, actions tfjson.Actions) bool {
// Filter in only UC schema resources. // Filter in only UC schema resources.
if typ != "databricks_schema" { if typ != "databricks_schema" {

View File

@ -26,6 +26,7 @@ func newDeployCommand() *cobra.Command {
var failOnActiveRuns bool var failOnActiveRuns bool
var clusterId string var clusterId string
var autoApprove bool var autoApprove bool
var dryRyn bool
var verbose bool var verbose bool
cmd.Flags().BoolVar(&force, "force", false, "Force-override Git branch validation.") cmd.Flags().BoolVar(&force, "force", false, "Force-override Git branch validation.")
cmd.Flags().BoolVar(&forceLock, "force-lock", false, "Force acquisition of deployment lock.") cmd.Flags().BoolVar(&forceLock, "force-lock", false, "Force acquisition of deployment lock.")
@ -33,6 +34,7 @@ func newDeployCommand() *cobra.Command {
cmd.Flags().StringVar(&clusterId, "compute-id", "", "Override cluster in the deployment with the given compute ID.") cmd.Flags().StringVar(&clusterId, "compute-id", "", "Override cluster in the deployment with the given compute ID.")
cmd.Flags().StringVarP(&clusterId, "cluster-id", "c", "", "Override cluster in the deployment with the given cluster ID.") cmd.Flags().StringVarP(&clusterId, "cluster-id", "c", "", "Override cluster in the deployment with the given cluster ID.")
cmd.Flags().BoolVar(&autoApprove, "auto-approve", false, "Skip interactive approvals that might be required for deployment.") cmd.Flags().BoolVar(&autoApprove, "auto-approve", false, "Skip interactive approvals that might be required for deployment.")
cmd.Flags().BoolVar(&dryRyn, "dry-run", false, "Present changes that would be deployed without applying.")
cmd.Flags().MarkDeprecated("compute-id", "use --cluster-id instead") cmd.Flags().MarkDeprecated("compute-id", "use --cluster-id instead")
cmd.Flags().BoolVar(&verbose, "verbose", false, "Enable verbose output.") cmd.Flags().BoolVar(&verbose, "verbose", false, "Enable verbose output.")
// Verbose flag currently only affects file sync output, it's used by the vscode extension // Verbose flag currently only affects file sync output, it's used by the vscode extension
@ -47,6 +49,7 @@ func newDeployCommand() *cobra.Command {
b.Config.Bundle.Force = force b.Config.Bundle.Force = force
b.Config.Bundle.Deployment.Lock.Force = forceLock b.Config.Bundle.Deployment.Lock.Force = forceLock
b.AutoApprove = autoApprove b.AutoApprove = autoApprove
b.DryRun = dryRyn
if cmd.Flag("compute-id").Changed { if cmd.Flag("compute-id").Changed {
b.Config.Bundle.ClusterId = clusterId b.Config.Bundle.ClusterId = clusterId

View File

@ -127,6 +127,33 @@ func TestAccBundleDeployUcSchemaFailsWithoutAutoApprove(t *testing.T) {
assert.Contains(t, stdout.String(), "the deployment requires destructive actions, but current console does not support prompting. Please specify --auto-approve if you would like to skip prompts and proceed") assert.Contains(t, stdout.String(), "the deployment requires destructive actions, but current console does not support prompting. Please specify --auto-approve if you would like to skip prompts and proceed")
} }
func TestAccBundleDeployUcSchemaIsNotAppliedWhenDryRun(t *testing.T) {
ctx, wt := acc.UcWorkspaceTest(t)
w := wt.W
uniqueId := uuid.New().String()
schemaName := "test-schema-" + uniqueId
catalogName := "main"
bundleRoot := setupUcSchemaBundle(t, ctx, w, uniqueId)
// Remove the UC schema from the resource configuration.
err := os.Remove(filepath.Join(bundleRoot, "schema.yml"))
require.NoError(t, err)
// Run dry-run for the bundle deployment
t.Setenv("BUNDLE_ROOT", bundleRoot)
t.Setenv("TERM", "dumb")
c := internal.NewCobraTestRunnerWithContext(t, ctx, "bundle", "deploy", "--dry-run")
stdout, _, err := c.Run()
require.NoError(t, err)
// Assert the schema was not deleted
_, err = w.Schemas.GetByFullName(ctx, strings.Join([]string{catalogName, schemaName}, "."))
require.NoError(t, err)
assert.Contains(t, stdout.String(), "Following changes would be deployed:")
}
func TestAccBundlePipelineDeleteWithoutAutoApprove(t *testing.T) { func TestAccBundlePipelineDeleteWithoutAutoApprove(t *testing.T) {
ctx, wt := acc.WorkspaceTest(t) ctx, wt := acc.WorkspaceTest(t)
w := wt.W w := wt.W