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 = ""
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