...

Source file src/edge-infra.dev/pkg/edge/k8objectsutils/syncedobject.go

Documentation: edge-infra.dev/pkg/edge/k8objectsutils

     1  package k8objectsutils
     2  
     3  import (
     4  	"encoding/base64"
     5  	"encoding/json"
     6  	"fmt"
     7  
     8  	"edge-infra.dev/pkg/edge/api/utils"
     9  	clusterApi "edge-infra.dev/pkg/edge/apis/cluster/v1alpha1"
    10  	syncedobjectApi "edge-infra.dev/pkg/edge/apis/syncedobject/apis/v1alpha1"
    11  
    12  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    13  	"sigs.k8s.io/controller-runtime/pkg/client"
    14  )
    15  
    16  const (
    17  	SyncedObjectNameFormat = "%s-%s"
    18  )
    19  
    20  func NameWithPrefix(prefix, name string) string {
    21  	return fmt.Sprintf(SyncedObjectNameFormat, prefix, name)
    22  }
    23  
    24  // BuildClusterSyncedObject accepts a k8s object as part of synced object, and adds owner references for the cluster
    25  func BuildClusterSyncedObject(cluster *clusterApi.Cluster, obj client.Object, prefix string) (*syncedobjectApi.SyncedObject, error) {
    26  	return BuildClusterSyncedObjectWithDir(cluster, obj, prefix, "")
    27  }
    28  
    29  // BuildClusterSyncedObjectWithDir is like BuildClusterSyncedObject but the object is written to the specified directory
    30  func BuildClusterSyncedObjectWithDir(cluster *clusterApi.Cluster, obj client.Object, prefix, dir string) (*syncedobjectApi.SyncedObject, error) {
    31  	data, err := ToBase64JSONString(obj)
    32  	if err != nil {
    33  		return nil, err
    34  	}
    35  	return &syncedobjectApi.SyncedObject{
    36  		TypeMeta: metav1.TypeMeta{
    37  			Kind:       "SyncedObject",
    38  			APIVersion: syncedobjectApi.GroupVersion.String(),
    39  		},
    40  		ObjectMeta: metav1.ObjectMeta{
    41  			Name:            NameWithPrefix(prefix, cluster.Name),
    42  			Namespace:       cluster.Name,
    43  			OwnerReferences: cluster.NewOwnerReference(),
    44  		},
    45  		Spec: syncedobjectApi.SyncedObjectSpec{
    46  			Banner:    cluster.Spec.ProjectID,
    47  			Cluster:   cluster.Name,
    48  			Object:    data,
    49  			Directory: &dir,
    50  		},
    51  	}, nil
    52  }
    53  
    54  // ToBase64JSONString marshal k8 object to json and base64 encode them.
    55  func ToBase64JSONString(obj client.Object) (string, error) {
    56  	data, err := json.Marshal(obj)
    57  	if err != nil {
    58  		return "", err
    59  	}
    60  	return base64.StdEncoding.EncodeToString(data), nil
    61  }
    62  
    63  // FromBase64JSONString unmarshals a base64 string into provided k8s obj.
    64  func FromBase64JSONString(obj string, into client.Object) error {
    65  	data, err := base64.StdEncoding.DecodeString(obj)
    66  	if err != nil {
    67  		return err
    68  	}
    69  	return json.Unmarshal(data, into)
    70  }
    71  
    72  // BuildSyncedObject accepts a k8s object as part of synced object
    73  func BuildSyncedObject(obj client.Object, projectID, clusterEdgeID, namespace, name string) (*syncedobjectApi.SyncedObject, error) {
    74  	data, err := ToBase64JSONString(obj)
    75  	if err != nil {
    76  		return nil, err
    77  	}
    78  	return &syncedobjectApi.SyncedObject{
    79  		TypeMeta: metav1.TypeMeta{
    80  			Kind:       syncedobjectApi.Kind,
    81  			APIVersion: syncedobjectApi.GroupVersion.String(),
    82  		},
    83  		ObjectMeta: metav1.ObjectMeta{
    84  			Name:      name,
    85  			Namespace: namespace,
    86  		},
    87  		Spec: syncedobjectApi.SyncedObjectSpec{
    88  			Banner:  projectID,
    89  			Cluster: clusterEdgeID,
    90  			Object:  data,
    91  		},
    92  	}, nil
    93  }
    94  
    95  // BuildSyncedObjectCoreV1 accepts a struct as part of a synced object.
    96  // Useful for creating synced objects for corev1 resources, such as
    97  // ConfigMaps, Namespaces, Services, etc.
    98  func BuildSyncedObjectCoreV1(s interface{}, projectID, clusterEdgeID, namespace, name string) (*syncedobjectApi.SyncedObject, error) {
    99  	data, err := utils.ConvertStructToBase64(s)
   100  	if err != nil {
   101  		return nil, err
   102  	}
   103  	return &syncedobjectApi.SyncedObject{
   104  		TypeMeta: metav1.TypeMeta{
   105  			Kind:       syncedobjectApi.Kind,
   106  			APIVersion: syncedobjectApi.GroupVersion.String(),
   107  		},
   108  		ObjectMeta: metav1.ObjectMeta{
   109  			Name:      name,
   110  			Namespace: namespace,
   111  		},
   112  		Spec: syncedobjectApi.SyncedObjectSpec{
   113  			Banner:  projectID,
   114  			Cluster: clusterEdgeID,
   115  			Object:  data,
   116  		},
   117  	}, nil
   118  }
   119  

View as plain text