Remove finalizers from backups before syncing
Signed-off-by: Nolan Brubaker <nolan@heptio.com>pull/431/head
parent
1f6b496f5e
commit
300a010959
|
@ -29,6 +29,7 @@ import (
|
||||||
"github.com/heptio/ark/pkg/cloudprovider"
|
"github.com/heptio/ark/pkg/cloudprovider"
|
||||||
arkv1client "github.com/heptio/ark/pkg/generated/clientset/versioned/typed/ark/v1"
|
arkv1client "github.com/heptio/ark/pkg/generated/clientset/versioned/typed/ark/v1"
|
||||||
"github.com/heptio/ark/pkg/util/kube"
|
"github.com/heptio/ark/pkg/util/kube"
|
||||||
|
"github.com/heptio/ark/pkg/util/stringslice"
|
||||||
)
|
)
|
||||||
|
|
||||||
type backupSyncController struct {
|
type backupSyncController struct {
|
||||||
|
@ -68,6 +69,8 @@ func (c *backupSyncController) Run(ctx context.Context, workers int) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const gcFinalizer = "gc.ark.heptio.com"
|
||||||
|
|
||||||
func (c *backupSyncController) run() {
|
func (c *backupSyncController) run() {
|
||||||
c.logger.Info("Syncing backups from object storage")
|
c.logger.Info("Syncing backups from object storage")
|
||||||
backups, err := c.backupService.GetAllBackups(c.bucket)
|
backups, err := c.backupService.GetAllBackups(c.bucket)
|
||||||
|
@ -81,6 +84,10 @@ func (c *backupSyncController) run() {
|
||||||
logContext := c.logger.WithField("backup", kube.NamespaceAndName(cloudBackup))
|
logContext := c.logger.WithField("backup", kube.NamespaceAndName(cloudBackup))
|
||||||
logContext.Info("Syncing backup")
|
logContext.Info("Syncing backup")
|
||||||
|
|
||||||
|
// If we're syncing backups made by pre-0.8.0 versions, the server removes all finalizers
|
||||||
|
// faster than the sync finishes. Just process them as we find them.
|
||||||
|
cloudBackup.Finalizers = stringslice.Except(cloudBackup.Finalizers, gcFinalizer)
|
||||||
|
|
||||||
cloudBackup.ResourceVersion = ""
|
cloudBackup.ResourceVersion = ""
|
||||||
if _, err := c.client.Backups(cloudBackup.Namespace).Create(cloudBackup); err != nil && !kuberrs.IsAlreadyExists(err) {
|
if _, err := c.client.Backups(cloudBackup.Namespace).Create(cloudBackup); err != nil && !kuberrs.IsAlreadyExists(err) {
|
||||||
logContext.WithError(errors.WithStack(err)).Error("Error syncing backup from object storage")
|
logContext.WithError(errors.WithStack(err)).Error("Error syncing backup from object storage")
|
||||||
|
|
|
@ -27,6 +27,7 @@ import (
|
||||||
|
|
||||||
"github.com/heptio/ark/pkg/apis/ark/v1"
|
"github.com/heptio/ark/pkg/apis/ark/v1"
|
||||||
"github.com/heptio/ark/pkg/generated/clientset/versioned/fake"
|
"github.com/heptio/ark/pkg/generated/clientset/versioned/fake"
|
||||||
|
"github.com/heptio/ark/pkg/util/stringslice"
|
||||||
arktest "github.com/heptio/ark/pkg/util/test"
|
arktest "github.com/heptio/ark/pkg/util/test"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -51,6 +52,18 @@ func TestBackupSyncControllerRun(t *testing.T) {
|
||||||
arktest.NewTestBackup().WithNamespace("ns-2").WithName("backup-3").Backup,
|
arktest.NewTestBackup().WithNamespace("ns-2").WithName("backup-3").Backup,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "Finalizer gets removed on sync",
|
||||||
|
cloudBackups: []*v1.Backup{
|
||||||
|
arktest.NewTestBackup().WithNamespace("ns-1").WithFinalizers(gcFinalizer).Backup,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Only target finalizer is removed",
|
||||||
|
cloudBackups: []*v1.Backup{
|
||||||
|
arktest.NewTestBackup().WithNamespace("ns-1").WithFinalizers(gcFinalizer, "blah").Backup,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
|
@ -77,6 +90,8 @@ func TestBackupSyncControllerRun(t *testing.T) {
|
||||||
|
|
||||||
// we only expect creates for items within the target bucket
|
// we only expect creates for items within the target bucket
|
||||||
for _, cloudBackup := range test.cloudBackups {
|
for _, cloudBackup := range test.cloudBackups {
|
||||||
|
// Verify that the run function stripped the GC finalizer
|
||||||
|
assert.False(t, stringslice.Has(cloudBackup.Finalizers, gcFinalizer))
|
||||||
action := core.NewCreateAction(
|
action := core.NewCreateAction(
|
||||||
v1.SchemeGroupVersion.WithResource("backups"),
|
v1.SchemeGroupVersion.WithResource("backups"),
|
||||||
cloudBackup.Namespace,
|
cloudBackup.Namespace,
|
||||||
|
|
|
@ -124,3 +124,9 @@ func (b *TestBackup) WithResourceVersion(version string) *TestBackup {
|
||||||
b.ResourceVersion = version
|
b.ResourceVersion = version
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *TestBackup) WithFinalizers(finalizers ...string) *TestBackup {
|
||||||
|
b.ObjectMeta.Finalizers = append(b.ObjectMeta.Finalizers, finalizers...)
|
||||||
|
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue