package host import ( "context" "errors" "os" "github.com/carlosframework/platform/internal/hostbox" "github.com/carlosframework/platform/internal/hostguard" ) type claimBoundUnitCleanup struct { inner hostbox.RetirementAuthority retire func(context.Context, hostguard.FenceTarget) error } func (c claimBoundUnitCleanup) WithCleanup(ctx context.Context, t hostguard.FenceTarget, fn func() error) error { return c.inner.WithCleanup(ctx, t, func() error { if err := c.retire(ctx, t); err != nil { return err } return fn() }) } func retireClaimBoundUnit(ctx context.Context, t hostguard.FenceTarget, b *claimUnitBindings, m claimUnitMaterializer, gone func(context.Context, string, string) error) error { captured, err := b.read(t.Host) if errors.Is(err, os.ErrNotExist) { return nil } if err != nil { return err } if captured.Owner.Host != t.Host || captured.Owner.Incarnation != t.Incarnation || captured.Owner.Stamp != t.Stamp || captured.Owner.Box != t.Box || captured.Owner.Enrollment != t.Enrollment || gone == nil { return os.ErrPermission } captured.Retiring, captured.Retired = false, false return b.retire(ctx, captured, func(claimUnitBinding) error { return m.retire(ctx, captured, func() error { return gone(ctx, t.Host, "") }) }) }