package util import ( "context" corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes" workapiv1 "open-cluster-management.io/api/work/v1" ) func NewManifestWork(namespace, name string, manifests []workapiv1.Manifest) *workapiv1.ManifestWork { work := &workapiv1.ManifestWork{ ObjectMeta: metav1.ObjectMeta{ Namespace: namespace, }, Spec: workapiv1.ManifestWorkSpec{ Workload: workapiv1.ManifestsTemplate{ Manifests: manifests, }, }, } if name != "" { work.Name = name } else { work.GenerateName = "work-" } return work } func NewConfigmap(namespace, name string, data map[string]string, finalizers []string) *corev1.ConfigMap { cm := &corev1.ConfigMap{ TypeMeta: metav1.TypeMeta{ Kind: "ConfigMap", APIVersion: "v1", }, ObjectMeta: metav1.ObjectMeta{ Namespace: namespace, Name: name, Finalizers: finalizers, }, Data: data, } return cm } func NewRoleForManifest(namespace, name string, rules ...rbacv1.PolicyRule) *rbacv1.Role { return &rbacv1.Role{ TypeMeta: metav1.TypeMeta{ Kind: "Role", APIVersion: "rbac.authorization.k8s.io/v1", }, ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: namespace, }, Rules: rules, } } func NewRoleBindingForManifest(namespace, name string, rule rbacv1.RoleRef, subjects ...rbacv1.Subject) *rbacv1.RoleBinding { return &rbacv1.RoleBinding{ TypeMeta: metav1.TypeMeta{ Kind: "RoleBinding", APIVersion: "rbac.authorization.k8s.io/v1", }, ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: namespace, }, Subjects: subjects, RoleRef: rule, } } func ToManifest(object runtime.Object) workapiv1.Manifest { manifest := workapiv1.Manifest{} manifest.Object = object return manifest } func RemoveConfigmapFinalizers(kubeClient kubernetes.Interface, namespace string, names ...string) error { for _, name := range names { cm, err := kubeClient.CoreV1().ConfigMaps(namespace).Get(context.Background(), name, metav1.GetOptions{}) if errors.IsNotFound(err) { continue } if err != nil { return err } cm.Finalizers = nil _, err = kubeClient.CoreV1().ConfigMaps(cm.Namespace).Update(context.Background(), cm, metav1.UpdateOptions{}) if err != nil { return err } } return nil }