package provision import ( "context" "errors" "github.com/carlosframework/platform/internal/controlname" "github.com/carlosframework/platform/internal/release" ) type RetireRef struct { Family, Account, App, Host, Name, By string // Required by rollbacks: never retire a successor to the failed attempt. Incarnation string } type ClaimRetirer interface { RetireRecord(context.Context, RetireRef) error } type RetireOptions struct { HostClaim bool Claims ClaimRetirer } var ErrClaimRetirer = errors.New("provision: claim retirement unavailable") func RetireRecord(ctx context.Context, s release.Store, ref RetireRef, opt RetireOptions) error { if !opt.HostClaim { switch ref.Family { case "instance": return DeleteRecord(ctx, s, ref.Account, ref.App, ref.Host) case "sidecar": return DeleteSidecarRecord(ctx, s, ref.Account, ref.App, ref.Name) default: return ErrClaimRetirer } } if opt.Claims == nil || !controlname.ValidAccount(ref.Account) || !controlname.ValidApp(ref.App) || !controlname.ValidHostShape(ref.Host) { return ErrClaimRetirer } switch ref.Family { case "instance": if ref.Name != "" { return ErrClaimRetirer } case "sidecar": if !controlname.ValidLabel(ref.Name) || ref.Host != SidecarHost(ref.Name, ref.App, ref.Account) { return ErrClaimRetirer } default: return ErrClaimRetirer } return opt.Claims.RetireRecord(ctx, ref) }