...

Source file src/edge-infra.dev/pkg/edge/datasync/cushion/resource_migration.go

Documentation: edge-infra.dev/pkg/edge/datasync/cushion

     1  package cushion
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"time"
     7  
     8  	"k8s.io/apimachinery/pkg/labels"
     9  	"k8s.io/apimachinery/pkg/types"
    10  	"sigs.k8s.io/controller-runtime/pkg/client"
    11  
    12  	dsapi "edge-infra.dev/pkg/edge/datasync/apis/v1alpha1"
    13  	"edge-infra.dev/pkg/edge/datasync/couchdb"
    14  )
    15  
    16  // migrateCushionK8sDBs migrates the cushion k8s dbs to avoid naming collisions
    17  func migrateCushionK8sDBs(ctx context.Context, cl client.Client) error {
    18  	k8sDBs := &dsapi.CouchDBDatabaseList{}
    19  	r, err := labels.NewRequirement(componentLabel, "!", []string{})
    20  	if err != nil {
    21  		return fmt.Errorf("error creating componentLabel requirement for migration: %w", err)
    22  	}
    23  	err = cl.List(ctx, k8sDBs, &client.ListOptions{
    24  		LabelSelector: labels.NewSelector().Add(*r),
    25  		Namespace:     cushionNamespace,
    26  	})
    27  	if err != nil {
    28  		return fmt.Errorf("error listing k8s dbs for migration: %w", err)
    29  	}
    30  	if len(k8sDBs.Items) == 0 {
    31  		return nil // already migrated
    32  	}
    33  	for _, k8sDB := range k8sDBs.Items {
    34  		if err := migrateCushionK8sDB(ctx, cl, &k8sDB); err != nil {
    35  			return fmt.Errorf("error migrating k8s db: %w", err)
    36  		}
    37  		time.Sleep(1 * time.Second) // avoid rate limiting
    38  	}
    39  	return nil
    40  }
    41  
    42  func migrateCushionK8sDB(ctx context.Context, cl client.Client, c *dsapi.CouchDBDatabase) error {
    43  	nn := types.NamespacedName{Name: K8sDBName(c.Spec.Name), Namespace: cushionNamespace}
    44  	// technically db names are already normalized
    45  	k8sDB := newCouchDBDatabase(nn, normalizeDBName(c.Spec.Name), couchdb.Namespace)
    46  	if err := cl.Create(ctx, k8sDB); err != nil && client.IgnoreAlreadyExists(err) != nil {
    47  		return fmt.Errorf("error creating k8s db: %w", err)
    48  	}
    49  	// finally delete the old resource
    50  	if err := cl.Delete(ctx, c); err != nil {
    51  		return fmt.Errorf("error deleting old CouchDBDatabase resource: %w", err)
    52  	}
    53  	return nil
    54  }
    55  

View as plain text