From 96e079b64ce70405a5c3934d0108e785a737398b Mon Sep 17 00:00:00 2001 From: Jian Qiu Date: Thu, 29 Aug 2024 11:27:29 +0800 Subject: [PATCH] Chart update Signed-off-by: Jian Qiu --- go.mod | 2 +- go.sum | 4 +- pkg/cmd/init/exec.go | 26 +++----- .../scenario/init/bootstrap_cluster_role.yaml | 36 ----------- pkg/cmd/init/scenario/init/bootstrap_sa.yaml | 6 -- pkg/cmd/init/scenario/init/namespace.yaml | 5 -- pkg/cmd/init/scenario/resources.go | 22 ------- pkg/cmd/join/exec.go | 17 +---- pkg/cmd/upgrade/clustermanager/exec.go | 6 +- pkg/cmd/upgrade/klusterlet/exec.go | 7 +-- vendor/modules.txt | 2 +- .../templates/bootstrap_cluster_role.yaml | 2 +- .../templates/bootstrap_sa.yaml | 7 +++ .../bootstrap_sa_cluster_role_binding.yaml | 5 +- .../templates/cluster_manager.yaml | 2 +- .../chart/cluster-manager/values.yaml | 3 + .../deploy/cluster-manager/chart/config.go | 4 ++ .../ocm/deploy/klusterlet/chart/config.go | 2 + .../ocm/pkg/operator/helpers/chart/render.go | 63 +++++++++++++++++-- 19 files changed, 98 insertions(+), 123 deletions(-) delete mode 100644 pkg/cmd/init/scenario/init/bootstrap_cluster_role.yaml delete mode 100644 pkg/cmd/init/scenario/init/bootstrap_sa.yaml delete mode 100644 pkg/cmd/init/scenario/init/namespace.yaml delete mode 100644 pkg/cmd/init/scenario/resources.go create mode 100644 vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/templates/bootstrap_sa.yaml rename {pkg/cmd/init/scenario/init => vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/templates}/bootstrap_sa_cluster_role_binding.yaml (73%) diff --git a/go.mod b/go.mod index c0b461812..47ff52206 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( open-cluster-management.io/api v0.14.1-0.20240627145512-bd6f2229b53c open-cluster-management.io/cluster-proxy v0.4.0 open-cluster-management.io/managed-serviceaccount v0.6.0 - open-cluster-management.io/ocm v0.14.1-0.20240819063207-0536c757af31 + open-cluster-management.io/ocm v0.14.1-0.20240829031425-567a9a4e188c open-cluster-management.io/sdk-go v0.14.1-0.20240628095929-9ffb1b19e566 sigs.k8s.io/apiserver-network-proxy v0.29.0 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0 diff --git a/go.sum b/go.sum index 494a5031b..1e373f188 100644 --- a/go.sum +++ b/go.sum @@ -577,8 +577,8 @@ open-cluster-management.io/cluster-proxy v0.4.0 h1:rm0UDaDWe3/P3xLzwqdHtqNksKwSz open-cluster-management.io/cluster-proxy v0.4.0/go.mod h1:gTvfDHAhGezhdg4BD3ECBn6jbg2Y5PbHhV2ceW5nrB0= open-cluster-management.io/managed-serviceaccount v0.6.0 h1:qIi5T9WQJBuoGqnYGIktXbtqfQoiN2H9XU2P/6lAQiw= open-cluster-management.io/managed-serviceaccount v0.6.0/go.mod h1:G4LUTbZiyrB8c0+rqi/xnDmGlsg7Rdr4T7MPLCWhyQI= -open-cluster-management.io/ocm v0.14.1-0.20240819063207-0536c757af31 h1:on+ek8B5821n8VlDKKk8+FnQMbiJl0WVBV8QDuvPWqI= -open-cluster-management.io/ocm v0.14.1-0.20240819063207-0536c757af31/go.mod h1:KWsyZ9g9AyPcgwi8x+8g+LFJQ9oHNIRfsP5YI/npKFA= +open-cluster-management.io/ocm v0.14.1-0.20240829031425-567a9a4e188c h1:j2exRpAeji0qZispaOnSHsq6VhX8XHbIGS8F4djNw4E= +open-cluster-management.io/ocm v0.14.1-0.20240829031425-567a9a4e188c/go.mod h1:KWsyZ9g9AyPcgwi8x+8g+LFJQ9oHNIRfsP5YI/npKFA= open-cluster-management.io/sdk-go v0.14.1-0.20240628095929-9ffb1b19e566 h1:8dgPiM3byX/rtOrFJIsea2haV4hSFTND65Tlj1EdK18= open-cluster-management.io/sdk-go v0.14.1-0.20240628095929-9ffb1b19e566/go.mod h1:xFmN3Db5nN68oLGnstmIRv4us8HJCdXFnBNMXVp0jWY= oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo= diff --git a/pkg/cmd/init/exec.go b/pkg/cmd/init/exec.go index 377113b47..527313218 100644 --- a/pkg/cmd/init/exec.go +++ b/pkg/cmd/init/exec.go @@ -18,7 +18,6 @@ import ( ocmfeature "open-cluster-management.io/api/feature" operatorv1 "open-cluster-management.io/api/operator/v1" "open-cluster-management.io/clusteradm/pkg/cmd/init/preflight" - "open-cluster-management.io/clusteradm/pkg/cmd/init/scenario" genericclioptionsclusteradm "open-cluster-management.io/clusteradm/pkg/genericclioptions" "open-cluster-management.io/clusteradm/pkg/helpers" "open-cluster-management.io/clusteradm/pkg/helpers/helm" @@ -161,32 +160,21 @@ func (o *Options) run() error { return err } } else { - files := []string{} - if o.createNamespace { - files = append(files, "init/namespace.yaml") - } else { + o.clusterManagerChartConfig.CreateNamespace = o.createNamespace + if !o.createNamespace { fmt.Fprintf(o.Streams.Out, "skip creating namespace\n") } if !o.useBootstrapToken { - files = append(files, - "init/bootstrap_sa.yaml", - "init/bootstrap_cluster_role.yaml", - "init/bootstrap_sa_cluster_role_binding.yaml", - ) + o.clusterManagerChartConfig.CreateBootstrapSA = true + } else { + o.clusterManagerChartConfig.CreateBootstrapToken = true } r := reader.NewResourceReader(o.ClusteradmFlags.KubectlFactory, o.ClusteradmFlags.DryRun, o.Streams) - err = r.Apply(scenario.Files, nil, files...) - if err != nil { - return err - } - - raw, err := chart.RenderChart[*clustermanagerchart.ChartConfig]( + raw, err := chart.RenderClusterManagerChart( o.clusterManagerChartConfig, - "open-cluster-management", - "cluster-manager", - clustermanagerchart.ChartFiles) + "open-cluster-management") if err != nil { return err } diff --git a/pkg/cmd/init/scenario/init/bootstrap_cluster_role.yaml b/pkg/cmd/init/scenario/init/bootstrap_cluster_role.yaml deleted file mode 100644 index fcb0d3f8c..000000000 --- a/pkg/cmd/init/scenario/init/bootstrap_cluster_role.yaml +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright Contributors to the Open Cluster Management project -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: system:open-cluster-management:bootstrap -rules: - - apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - apiGroups: - - certificates.k8s.io - resources: - - certificatesigningrequests - verbs: - - create - - get - - list - - watch - - apiGroups: - - cluster.open-cluster-management.io - resources: - - managedclusters - verbs: - - get - - create - - list - - watch - - apiGroups: - - "cluster.open-cluster-management.io" - resources: - - "managedclustersets/join" - verbs: - - "create" diff --git a/pkg/cmd/init/scenario/init/bootstrap_sa.yaml b/pkg/cmd/init/scenario/init/bootstrap_sa.yaml deleted file mode 100644 index 38d73f1c1..000000000 --- a/pkg/cmd/init/scenario/init/bootstrap_sa.yaml +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright Contributors to the Open Cluster Management project -apiVersion: v1 -kind: ServiceAccount -metadata: - name: cluster-bootstrap - namespace: open-cluster-management diff --git a/pkg/cmd/init/scenario/init/namespace.yaml b/pkg/cmd/init/scenario/init/namespace.yaml deleted file mode 100644 index 4283a5613..000000000 --- a/pkg/cmd/init/scenario/init/namespace.yaml +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright Contributors to the Open Cluster Management project -apiVersion: v1 -kind: Namespace -metadata: - name: open-cluster-management diff --git a/pkg/cmd/init/scenario/resources.go b/pkg/cmd/init/scenario/resources.go deleted file mode 100644 index bad0663f4..000000000 --- a/pkg/cmd/init/scenario/resources.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright Contributors to the Open Cluster Management project -package scenario - -import ( - "embed" -) - -//go:embed init -var Files embed.FS - -type BundleVersion struct { - // registration image version - RegistrationImageVersion string - // placement image version - PlacementImageVersion string - // work image version - WorkImageVersion string - // operator image version - OperatorImageVersion string - // addon manager image version - AddonManagerImageVersion string -} diff --git a/pkg/cmd/join/exec.go b/pkg/cmd/join/exec.go index 68b4a4689..0c2b5fdbd 100644 --- a/pkg/cmd/join/exec.go +++ b/pkg/cmd/join/exec.go @@ -35,7 +35,6 @@ import ( ocmfeature "open-cluster-management.io/api/feature" operatorv1 "open-cluster-management.io/api/operator/v1" "open-cluster-management.io/clusteradm/pkg/cmd/join/preflight" - "open-cluster-management.io/clusteradm/pkg/cmd/join/scenario" genericclioptionsclusteradm "open-cluster-management.io/clusteradm/pkg/genericclioptions" "open-cluster-management.io/clusteradm/pkg/helpers" preflightinterface "open-cluster-management.io/clusteradm/pkg/helpers/preflight" @@ -356,21 +355,11 @@ func (o *Options) applyKlusterlet(r *reader.ResourceReader, operatorClient opera // If Deployment/klusterlet is not deployed, deploy it if !available { - var files []string - if o.createNameSpace { - files = append(files, "join/namespace.yaml") - } - - err = r.Apply(scenario.Files, nil, files...) - if err != nil { - return err - } + o.klusterletChartConfig.CreateNamespace = o.createNameSpace - raw, err := chart.RenderChart[*klusterletchart.ChartConfig]( + raw, err := chart.RenderKlusterletChart( o.klusterletChartConfig, - "open-cluster-management", - "klusterlet", - klusterletchart.ChartFiles) + "open-cluster-management") if err != nil { return err } diff --git a/pkg/cmd/upgrade/clustermanager/exec.go b/pkg/cmd/upgrade/clustermanager/exec.go index 2fe94f599..4ca5bbb7e 100644 --- a/pkg/cmd/upgrade/clustermanager/exec.go +++ b/pkg/cmd/upgrade/clustermanager/exec.go @@ -81,11 +81,9 @@ func (o *Options) run() error { return err } - raw, err := chart.RenderChart[*clustermanagerchart.ChartConfig]( + raw, err := chart.RenderClusterManagerChart( o.clusterManagerChartConfig, - "open-cluster-management", - "cluster-manager", - clustermanagerchart.ChartFiles) + "open-cluster-management") if err != nil { return err } diff --git a/pkg/cmd/upgrade/klusterlet/exec.go b/pkg/cmd/upgrade/klusterlet/exec.go index 34a9f5c26..ccc43426e 100644 --- a/pkg/cmd/upgrade/klusterlet/exec.go +++ b/pkg/cmd/upgrade/klusterlet/exec.go @@ -13,7 +13,6 @@ import ( "open-cluster-management.io/clusteradm/pkg/helpers" "open-cluster-management.io/clusteradm/pkg/helpers/reader" "open-cluster-management.io/clusteradm/pkg/helpers/wait" - klusterletchart "open-cluster-management.io/ocm/deploy/klusterlet/chart" "open-cluster-management.io/ocm/pkg/operator/helpers/chart" ) @@ -87,11 +86,9 @@ func (o *Options) run() error { return err } - raw, err := chart.RenderChart[*klusterletchart.ChartConfig]( + raw, err := chart.RenderKlusterletChart( o.klusterletChartConfig, - "open-cluster-management", - "klusterlet", - klusterletchart.ChartFiles) + "open-cluster-management") if err != nil { return err } diff --git a/vendor/modules.txt b/vendor/modules.txt index 909862e22..2897aef67 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1261,7 +1261,7 @@ open-cluster-management.io/managed-serviceaccount/pkg/generated/clientset/versio open-cluster-management.io/managed-serviceaccount/pkg/generated/clientset/versioned/scheme open-cluster-management.io/managed-serviceaccount/pkg/generated/clientset/versioned/typed/authentication/v1alpha1 open-cluster-management.io/managed-serviceaccount/pkg/generated/clientset/versioned/typed/authentication/v1beta1 -# open-cluster-management.io/ocm v0.14.1-0.20240819063207-0536c757af31 +# open-cluster-management.io/ocm v0.14.1-0.20240829031425-567a9a4e188c ## explicit; go 1.22.6 open-cluster-management.io/ocm/deploy/cluster-manager/chart open-cluster-management.io/ocm/deploy/klusterlet/chart diff --git a/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/templates/bootstrap_cluster_role.yaml b/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/templates/bootstrap_cluster_role.yaml index 89b43c3cb..eec51cb13 100644 --- a/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/templates/bootstrap_cluster_role.yaml +++ b/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/templates/bootstrap_cluster_role.yaml @@ -1,4 +1,4 @@ -{{- if .Values.createBootstrapToken }} +{{- if or .Values.createBootstrapToken .Values.createBootstrapSA }} apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: diff --git a/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/templates/bootstrap_sa.yaml b/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/templates/bootstrap_sa.yaml new file mode 100644 index 000000000..f97cda884 --- /dev/null +++ b/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/templates/bootstrap_sa.yaml @@ -0,0 +1,7 @@ +{{- if .Values.createBootstrapSA }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: cluster-bootstrap + namespace: {{ .Release.Namespace }} +{{- end }} diff --git a/pkg/cmd/init/scenario/init/bootstrap_sa_cluster_role_binding.yaml b/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/templates/bootstrap_sa_cluster_role_binding.yaml similarity index 73% rename from pkg/cmd/init/scenario/init/bootstrap_sa_cluster_role_binding.yaml rename to vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/templates/bootstrap_sa_cluster_role_binding.yaml index aee9e0cec..e299bb38d 100644 --- a/pkg/cmd/init/scenario/init/bootstrap_sa_cluster_role_binding.yaml +++ b/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/templates/bootstrap_sa_cluster_role_binding.yaml @@ -1,4 +1,4 @@ -# Copyright Contributors to the Open Cluster Management project +{{- if .Values.createBootstrapSA }} apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: @@ -10,4 +10,5 @@ roleRef: subjects: - kind: ServiceAccount name: cluster-bootstrap - namespace: open-cluster-management + namespace: {{ .Release.Namespace }} +{{- end }} diff --git a/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/templates/cluster_manager.yaml b/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/templates/cluster_manager.yaml index 552c63df2..8a4e204f8 100644 --- a/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/templates/cluster_manager.yaml +++ b/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/templates/cluster_manager.yaml @@ -27,7 +27,7 @@ spec: workConfiguration: {{- toYaml . | nindent 4 }} {{- end }} - {{if .Values.clusterManager.addOnManagerConfiguration }} + {{- with .Values.clusterManager.addOnManagerConfiguration }} addOnManagerConfiguration: {{- toYaml . | nindent 4 }} {{- end }} diff --git a/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/values.yaml b/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/values.yaml index 685b72512..3944f7d59 100644 --- a/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/values.yaml +++ b/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/values.yaml @@ -72,6 +72,9 @@ affinity: # if true, will create a bootstrap secret for auto approve. createBootstrapToken: false +# if true, will create a serviceAccount to generate token +createBootstrapSA: false + # configurations for clusterManager CR. clusterManager: mode: Default diff --git a/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/config.go b/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/config.go index d40b87c58..9250eb046 100644 --- a/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/config.go +++ b/vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/config.go @@ -17,6 +17,8 @@ var ChartFiles embed.FS const ChartName = "cluster-manager" type ChartConfig struct { + // CreateNamespace is used in the render function to append the release ns in the objects. + CreateNamespace bool `json:"createNamespace,omitempty"` // ReplicaCount is the replicas for the clusterManager operator deployment. ReplicaCount int `json:"replicaCount,omitempty"` // Images is the configurations for all images used in operator deployment and clusterManager CR. @@ -35,6 +37,8 @@ type ChartConfig struct { Affinity corev1.Affinity `json:"affinity,omitempty"` // CreateBootstrapToken is to enable/disable the bootstrap token secret for auto approve. CreateBootstrapToken bool `json:"createBootstrapToken,omitempty"` + // CreateBootstrapSA is to create a serviceAccount to generate token. + CreateBootstrapSA bool `json:"createBootstrapSA,omitempty"` // ClusterManager is the configuration of clusterManager CR ClusterManager ClusterManagerConfig `json:"clusterManager,omitempty"` } diff --git a/vendor/open-cluster-management.io/ocm/deploy/klusterlet/chart/config.go b/vendor/open-cluster-management.io/ocm/deploy/klusterlet/chart/config.go index 3ade2f5b5..5b9eccbca 100644 --- a/vendor/open-cluster-management.io/ocm/deploy/klusterlet/chart/config.go +++ b/vendor/open-cluster-management.io/ocm/deploy/klusterlet/chart/config.go @@ -17,6 +17,8 @@ var ChartFiles embed.FS const ChartName = "klusterlet" type ChartConfig struct { + // CreateNamespace is used in the render function to append the release ns in the objects. + CreateNamespace bool `json:"createNamespace,omitempty"` // ReplicaCount is the replicas for the klusterlet operator deployment. ReplicaCount int `json:"replicaCount,omitempty"` // Images is the configurations for all images used in operator deployment and klusterlet CR. diff --git a/vendor/open-cluster-management.io/ocm/pkg/operator/helpers/chart/render.go b/vendor/open-cluster-management.io/ocm/pkg/operator/helpers/chart/render.go index 7d657e574..8c0049d20 100644 --- a/vendor/open-cluster-management.io/ocm/pkg/operator/helpers/chart/render.go +++ b/vendor/open-cluster-management.io/ocm/pkg/operator/helpers/chart/render.go @@ -11,10 +11,12 @@ import ( "helm.sh/helm/v3/pkg/chart/loader" "helm.sh/helm/v3/pkg/chartutil" "helm.sh/helm/v3/pkg/engine" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/util/json" - "k8s.io/apimachinery/pkg/util/yaml" "k8s.io/klog/v2" + "sigs.k8s.io/yaml" clustermanagerchart "open-cluster-management.io/ocm/deploy/cluster-manager/chart" klusterletchart "open-cluster-management.io/ocm/deploy/klusterlet/chart" @@ -33,8 +35,24 @@ func NewDefaultKlusterletChartConfig() *klusterletchart.ChartConfig { } } -func RenderChart[T *clustermanagerchart.ChartConfig | *klusterletchart.ChartConfig](config T, - namespace string, chartName string, fs embed.FS) ([][]byte, error) { +func RenderClusterManagerChart(config *clustermanagerchart.ChartConfig, namespace string) ([][]byte, error) { + if namespace == "" { + return nil, fmt.Errorf("cluster manager chart namespace is required") + } + return renderChart(config, namespace, config.CreateNamespace, + clustermanagerchart.ChartName, clustermanagerchart.ChartFiles) +} + +func RenderKlusterletChart(config *klusterletchart.ChartConfig, namespace string) ([][]byte, error) { + if namespace == "" { + return nil, fmt.Errorf("klusterlet chart namespace is required") + } + return renderChart(config, namespace, config.CreateNamespace, + klusterletchart.ChartName, klusterletchart.ChartFiles) +} + +func renderChart[T *clustermanagerchart.ChartConfig | *klusterletchart.ChartConfig](config T, + namespace string, createNamespace bool, chartName string, fs embed.FS) ([][]byte, error) { // chartName is the prefix of chart path here operatorChart, err := LoadChart(fs, chartName) if err != nil { @@ -63,7 +81,18 @@ func RenderChart[T *clustermanagerchart.ChartConfig | *klusterletchart.ChartConf return nil, fmt.Errorf("error rendering cluster manager chart: %v", err) } - return rawObjects, nil + // make sure the ns object is at the top of slice when createNamespace is true. + rstObjects := [][]byte{} + if createNamespace { + nsObj, err := newNamespaceRawObject(namespace) + if err != nil { + return nil, err + } + rstObjects = [][]byte{nsObj} + } + rstObjects = append(rstObjects, rawObjects...) + + return rstObjects, nil } func getFiles(manifestFS embed.FS) ([]string, error) { @@ -153,6 +182,7 @@ func renderManifests(chart *chart.Chart, values chartutil.Values) ([][]byte, err return rawObjects, err } + namespaceObjects := [][]byte{} for _, data := range templates { if len(data) == 0 { continue @@ -168,7 +198,32 @@ func renderManifests(chart *chart.Chart, values chartutil.Values) ([][]byte, err continue } + if kind == "Namespace" { + namespaceObjects = append(namespaceObjects, []byte(data)) + continue + } + rawObjects = append(rawObjects, []byte(data)) } + // will create open-cluster-management-agent ns in klusterlet operator, + // so need make sure namespaces are at the top of slice. + if len(namespaceObjects) != 0 { + result := append(namespaceObjects, rawObjects...) + return result, nil + } return rawObjects, nil } + +func newNamespaceRawObject(namespace string) ([]byte, error) { + ns := &corev1.Namespace{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "Namespace", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: namespace, + }, + } + + return yaml.Marshal(ns) +}