Implement catalog force replacement
This commit is contained in:
@@ -139,8 +139,15 @@ func Build(ctx context.Context, req Request) (Plan, error) {
|
||||
SupersededLegacy: status.SupersededLegacy,
|
||||
}
|
||||
if status.StateErr != nil {
|
||||
plan.Action = ActionFailConflict
|
||||
plan.Reason = status.StateErr.Error()
|
||||
if req.Force {
|
||||
plan.Action = ActionForceReplace
|
||||
plan.Force = true
|
||||
plan.ClearDestinationRoot = true
|
||||
plan.CatalogOutputsToWrite = catalogOutputsForPlan(req, outputs, nil, scope, now)
|
||||
return plan, nil
|
||||
}
|
||||
plan.Action = ActionFailConflict
|
||||
return plan, fmt.Errorf("%s: %s", plan.Action, plan.Reason)
|
||||
}
|
||||
|
||||
@@ -151,7 +158,7 @@ func Build(ctx context.Context, req Request) (Plan, error) {
|
||||
case status.SupersededLegacy != nil:
|
||||
details = planSupersededLegacy(req, outputs, workflow, scope, now)
|
||||
default:
|
||||
details, err = planWithoutCatalog(ctx, req, outputs, workflow, scope, now)
|
||||
details, err = planWithoutCatalog(ctx, req, outputs, workflow, scope, now, status.HasContents)
|
||||
}
|
||||
plan.Action = details.Action
|
||||
plan.Reason = details.Reason
|
||||
@@ -159,6 +166,15 @@ func Build(ctx context.Context, req Request) (Plan, error) {
|
||||
plan.CatalogOutputsToRetain = details.CatalogOutputsToRetain
|
||||
plan.CatalogOutputsToDelete = details.CatalogOutputsToDelete
|
||||
plan.ClearDestinationRoot = details.ClearDestinationRoot
|
||||
if err != nil && req.Force && forceCanReplace(details.Action) {
|
||||
plan.Action = ActionForceReplace
|
||||
plan.Force = true
|
||||
plan.ClearDestinationRoot = true
|
||||
plan.CatalogOutputsToWrite = catalogOutputsForPlan(req, outputs, nil, scope, now)
|
||||
plan.CatalogOutputsToRetain = nil
|
||||
plan.CatalogOutputsToDelete = nil
|
||||
return plan, nil
|
||||
}
|
||||
if err != nil {
|
||||
return plan, err
|
||||
}
|
||||
@@ -239,7 +255,14 @@ func planSupersededLegacy(req Request, outputs []Output, workflow string, scope
|
||||
return details
|
||||
}
|
||||
|
||||
func planWithoutCatalog(ctx context.Context, req Request, outputs []Output, workflow string, scope state.OwnerScope, now time.Time) (catalogPlanDetails, error) {
|
||||
func planWithoutCatalog(ctx context.Context, req Request, outputs []Output, workflow string, scope state.OwnerScope, now time.Time, hasContents bool) (catalogPlanDetails, error) {
|
||||
if hasContents {
|
||||
err := fmt.Errorf("destination has content but no distributor state")
|
||||
return catalogPlanDetails{
|
||||
Action: ActionFailUnmanaged,
|
||||
Reason: err.Error(),
|
||||
}, fmt.Errorf("%s: %s", ActionFailUnmanaged, err)
|
||||
}
|
||||
if err := rejectCatalogUnmanagedCollisions(ctx, req.DestinationBackend, req.DestinationBundlePath, nil, outputs); err != nil {
|
||||
return catalogPlanDetails{
|
||||
Action: ActionFailUnmanaged,
|
||||
@@ -252,6 +275,10 @@ func planWithoutCatalog(ctx context.Context, req Request, outputs []Output, work
|
||||
}, nil
|
||||
}
|
||||
|
||||
func forceCanReplace(action Action) bool {
|
||||
return action == ActionFailUnmanaged || action == ActionFailConflict
|
||||
}
|
||||
|
||||
func actionForWorkflow(workflow string) Action {
|
||||
if workflow == config.WorkflowReplacement {
|
||||
return ActionReplaceCatalog
|
||||
|
||||
Reference in New Issue
Block a user