package cushion import ( "context" "fmt" "time" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" dsapi "edge-infra.dev/pkg/edge/datasync/apis/v1alpha1" "edge-infra.dev/pkg/edge/datasync/couchdb" ) // migrateCushionK8sDBs migrates the cushion k8s dbs to avoid naming collisions func migrateCushionK8sDBs(ctx context.Context, cl client.Client) error { k8sDBs := &dsapi.CouchDBDatabaseList{} r, err := labels.NewRequirement(componentLabel, "!", []string{}) if err != nil { return fmt.Errorf("error creating componentLabel requirement for migration: %w", err) } err = cl.List(ctx, k8sDBs, &client.ListOptions{ LabelSelector: labels.NewSelector().Add(*r), Namespace: cushionNamespace, }) if err != nil { return fmt.Errorf("error listing k8s dbs for migration: %w", err) } if len(k8sDBs.Items) == 0 { return nil // already migrated } for _, k8sDB := range k8sDBs.Items { if err := migrateCushionK8sDB(ctx, cl, &k8sDB); err != nil { return fmt.Errorf("error migrating k8s db: %w", err) } time.Sleep(1 * time.Second) // avoid rate limiting } return nil } func migrateCushionK8sDB(ctx context.Context, cl client.Client, c *dsapi.CouchDBDatabase) error { nn := types.NamespacedName{Name: K8sDBName(c.Spec.Name), Namespace: cushionNamespace} // technically db names are already normalized k8sDB := newCouchDBDatabase(nn, normalizeDBName(c.Spec.Name), couchdb.Namespace) if err := cl.Create(ctx, k8sDB); err != nil && client.IgnoreAlreadyExists(err) != nil { return fmt.Errorf("error creating k8s db: %w", err) } // finally delete the old resource if err := cl.Delete(ctx, c); err != nil { return fmt.Errorf("error deleting old CouchDBDatabase resource: %w", err) } return nil }