...

Source file src/edge-infra.dev/pkg/edge/datasync/datasyncinit/datasync_init.go

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

     1  package datasyncinit
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"os"
     7  	"time"
     8  
     9  	"github.com/go-logr/logr"
    10  	corev1 "k8s.io/api/core/v1"
    11  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    12  	"k8s.io/apimachinery/pkg/types"
    13  	"sigs.k8s.io/controller-runtime/pkg/client"
    14  
    15  	"edge-infra.dev/pkg/edge/clientutils"
    16  	dsapi "edge-infra.dev/pkg/edge/datasync/apis/v1alpha1"
    17  	"edge-infra.dev/pkg/edge/datasync/controllers/couchctl"
    18  	"edge-infra.dev/pkg/edge/datasync/couchdb"
    19  	"edge-infra.dev/pkg/edge/k8objectsutils/ownerref"
    20  	nodemeta "edge-infra.dev/pkg/sds/ien/node"
    21  )
    22  
    23  func InitializeWorkload(ctx context.Context, cl client.WithWatch, cfg *Config) error {
    24  	log := logr.FromContextOrDiscard(ctx)
    25  
    26  	pod := &corev1.Pod{}
    27  	nn := types.NamespacedName{Name: cfg.PodName, Namespace: cfg.PodNameSpace}
    28  	if err := cl.Get(ctx, nn, pod); err != nil {
    29  		log.Error(err, "fail to get running pod")
    30  		return err
    31  	}
    32  
    33  	ownerRef, err := ownerref.GetOwnerRef(ctx, cl, pod)
    34  	if err != nil {
    35  		log.Error(err, "fail to get valid owner reference for pod", "Valid OwnerRefs", "Deployment,DaemonSet,StatefulSet")
    36  		return err
    37  	}
    38  
    39  	node := &corev1.Node{}
    40  	if err := cl.Get(ctx, types.NamespacedName{Name: cfg.NodeName}, node); err != nil {
    41  		log.Error(err, "fail to get container's node from pod's pod.Spec.NodeName")
    42  		return err
    43  	}
    44  
    45  	isCP, err := nodemeta.IsControlPlaneNode(node)
    46  	if err != nil {
    47  		log.Error(err, "invalid node")
    48  		return err
    49  	}
    50  	serverName := dsapi.CouchDBServerName(node)
    51  
    52  	userOwnerRef := *ownerRef
    53  	f := false
    54  	userOwnerRef.Controller = &f
    55  
    56  	secretName := ownerref.ResourceName(serverName, userOwnerRef, cfg.PodNameSpace, cfg.NodeName, !isCP)
    57  	log = log.WithValues("server", serverName, "secret", secretName)
    58  
    59  	server := &dsapi.CouchDBServer{}
    60  	nn = types.NamespacedName{Namespace: couchdb.Namespace, Name: serverName}
    61  	if err := cl.Get(ctx, nn, server); err != nil {
    62  		log.Error(err, "fail to get CouchDBServer")
    63  		return err
    64  	}
    65  
    66  	user := dsapi.NewCouchDBUser(dsapi.UserCredentials, secretName, serverName, cfg.SecretRole)
    67  	user.Namespace = cfg.PodNameSpace
    68  	user.Spec.User.Name = "" // generate unique name for user
    69  	if len(cfg.SecretProvider) > 0 {
    70  		user.Spec.Provider = &dsapi.Provider{Name: cfg.SecretProvider}
    71  	}
    72  
    73  	user.ObjectMeta.OwnerReferences = []metav1.OwnerReference{userOwnerRef}
    74  
    75  	if err := clientutils.CreateOrUpdateCouchDBUser(ctx, cl, user); err != nil {
    76  		log.Error(err, "fail to create/update CouchDBUser")
    77  		return err
    78  	}
    79  
    80  	timeout := time.Duration(cfg.WatchTimeout) * time.Minute
    81  	if err := couchctl.WatchCouchDBUser(ctx, cl, user, timeout); err != nil {
    82  		return err
    83  	}
    84  
    85  	log.Info("CouchDBUser setup successfully")
    86  
    87  	host := fmt.Sprintf("%s:%s", server.Spec.URI, couchdb.Port)
    88  	data := fmt.Sprintf("%s=%s\n%s=%s\n",
    89  		SecretName, secretName,
    90  		ServerURI, host,
    91  	)
    92  
    93  	if err := os.WriteFile(cfg.SecretPath, []byte(data), 0644); err != nil {
    94  		log.Error(err, "fail to write environment file")
    95  		return err
    96  	}
    97  
    98  	log.Info("Workload successfully initialized, environment file created.")
    99  	return nil
   100  }
   101  

View as plain text