From 51f9d2ca0b0f43b002a86ac72dc2f12d408cb47d Mon Sep 17 00:00:00 2001 From: Ohki Nozomu Date: Wed, 26 Jun 2024 22:12:08 +0900 Subject: [PATCH] Update API for Custom Resources (#22) --- README.md | 8 ++++---- add.go | 4 ++-- add_test.go | 6 ++++-- client.go | 11 +++++++++++ common.go | 10 +++++----- common_test.go | 7 ++++--- e2e_test.go | 3 ++- get.go | 5 +++-- get_test.go | 4 +++- go.mod | 1 - go.sum | 2 -- remove.go | 5 +++-- remove_test.go | 4 +++- scheme.go | 16 ---------------- update.go | 7 ++++--- update_test.go | 6 ++++-- 16 files changed, 52 insertions(+), 47 deletions(-) create mode 100644 client.go delete mode 100644 scheme.go diff --git a/README.md b/README.md index 2ab1bba..8acb06f 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,11 @@ Utilities for Open Cluster Management ManifestWork ```go -func Get(work workapiv1.ManifestWork, resource Resource) (runtime.Object, error) +func (client *WorkUtilsClient) Get(work workapiv1.ManifestWork, resource Resource) (runtime.Object, error) -func Add(work workapiv1.ManifestWork, obj runtime.Object) (workapiv1.ManifestWork, error) +func (client *WorkUtilsClient) Add(work workapiv1.ManifestWork, obj runtime.Object) (workapiv1.ManifestWork, error) -func Update(work workapiv1.ManifestWork, obj runtime.Object) (workapiv1.ManifestWork, error) +func (client *WorkUtilsClient) Update(work workapiv1.ManifestWork, obj runtime.Object) (workapiv1.ManifestWork, error) -func Remove(work workapiv1.ManifestWork, resource Resource) (workapiv1.ManifestWork, error) +func (client *WorkUtilsClient) Remove(work workapiv1.ManifestWork, resource Resource) (workapiv1.ManifestWork, error) ``` \ No newline at end of file diff --git a/add.go b/add.go index 86cf285..79b1b58 100644 --- a/add.go +++ b/add.go @@ -6,9 +6,9 @@ import ( ) // Add adds the given object to the ManifestWork -func Add(work workapiv1.ManifestWork, obj runtime.Object) (workapiv1.ManifestWork, error) { +func (client *WorkUtilsClient) Add(work workapiv1.ManifestWork, obj runtime.Object) (workapiv1.ManifestWork, error) { manifests := work.Spec.Workload.Manifests - rawExtension, err := objToRawExtension(obj) + rawExtension, err := objToRawExtension(obj, client.Scheme) if err != nil { return work, err } diff --git a/add_test.go b/add_test.go index ac827c8..5ee5da2 100644 --- a/add_test.go +++ b/add_test.go @@ -5,6 +5,7 @@ import ( "github.com/stretchr/testify/assert" appsv1 "k8s.io/api/apps/v1" + "k8s.io/client-go/kubernetes/scheme" workapiv1 "open-cluster-management.io/api/work/v1" ) @@ -55,10 +56,11 @@ spec: }, }, } - updatedWork, err := Add(work, deployment.Object) + client := NewWorkUtilsClient(scheme.Scheme) + updatedWork, err := client.Add(work, deployment.Object) assert.Nil(t, err) assert.Equal(t, len(updatedWork.Spec.Workload.Manifests), 2) - obj, err := Get(updatedWork, Resource{ + obj, err := client.Get(updatedWork, Resource{ Group: "apps", Version: "v1", Kind: "Deployment", diff --git a/client.go b/client.go new file mode 100644 index 0000000..f0d896b --- /dev/null +++ b/client.go @@ -0,0 +1,11 @@ +package workutils + +import "k8s.io/apimachinery/pkg/runtime" + +type WorkUtilsClient struct { + Scheme *runtime.Scheme +} + +func NewWorkUtilsClient(scheme *runtime.Scheme) *WorkUtilsClient { + return &WorkUtilsClient{Scheme: scheme} +} diff --git a/common.go b/common.go index 0cac57d..05c92e4 100644 --- a/common.go +++ b/common.go @@ -8,10 +8,10 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/apimachinery/pkg/runtime/serializer/json" + "k8s.io/client-go/kubernetes/scheme" ) -func decode(data []byte) (runtime.Object, *schema.GroupVersionKind, error) { - scheme := wellknownScheme +func decode(data []byte, scheme *runtime.Scheme) (runtime.Object, *schema.GroupVersionKind, error) { // https://github.com/kubernetes/apimachinery/issues/102#issue-713181306 codecs := serializer.NewCodecFactory(scheme) deserializer := codecs.UniversalDeserializer() @@ -44,7 +44,7 @@ func getNamespaceFromObject(obj runtime.Object) (string, error) { } func stringToRawExtension(manifest string) (runtime.RawExtension, error) { - obj, _, err := decode([]byte(manifest)) + obj, _, err := decode([]byte(manifest), scheme.Scheme) if err != nil { return runtime.RawExtension{}, err } @@ -57,10 +57,10 @@ func stringToRawExtension(manifest string) (runtime.RawExtension, error) { return raw, nil } -func objToRawExtension(obj runtime.Object) (runtime.RawExtension, error) { +func objToRawExtension(obj runtime.Object, scheme *runtime.Scheme) (runtime.RawExtension, error) { // Probably RawExtension.Raw should be JSON. // https://github.com/kubernetes/apimachinery/issues/102#issuecomment-707187760 - serializer := json.NewSerializer(json.DefaultMetaFactory, wellknownScheme, wellknownScheme, false) + serializer := json.NewSerializer(json.DefaultMetaFactory, scheme, scheme, false) var buffer bytes.Buffer err := serializer.Encode(obj, &buffer) diff --git a/common_test.go b/common_test.go index db88ce6..1148b69 100644 --- a/common_test.go +++ b/common_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "k8s.io/client-go/kubernetes/scheme" ) func TestStringToRawExtension(t *testing.T) { @@ -29,13 +30,13 @@ kind: Namespace metadata: name: test-namespace ` - obj, _, err := decode([]byte(nsStr)) + obj, _, err := decode([]byte(nsStr), scheme.Scheme) require.Nil(t, err) - rawExtension, err := objToRawExtension(obj) + rawExtension, err := objToRawExtension(obj, scheme.Scheme) require.Nil(t, err) - decoded, _, err := decode(rawExtension.Raw) + decoded, _, err := decode(rawExtension.Raw, scheme.Scheme) require.Nil(t, err) assert.Equal(t, obj, decoded) diff --git a/e2e_test.go b/e2e_test.go index aa48cef..d9eeccc 100644 --- a/e2e_test.go +++ b/e2e_test.go @@ -10,6 +10,7 @@ import ( appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/tools/clientcmd" "k8s.io/utils/pointer" workclient "open-cluster-management.io/api/client/work/clientset/versioned" @@ -92,7 +93,7 @@ func TestE2E(t *testing.T) { }, } - rawExtension, err := objToRawExtension(deployment) + rawExtension, err := objToRawExtension(deployment, scheme.Scheme) require.Nil(t, err) manifestWork := &workapiv1.ManifestWork{ ObjectMeta: metav1.ObjectMeta{ diff --git a/get.go b/get.go index 9f8cc83..afe25a9 100644 --- a/get.go +++ b/get.go @@ -2,11 +2,12 @@ package workutils import ( "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/kubernetes/scheme" workapiv1 "open-cluster-management.io/api/work/v1" ) // Get returns the resource with the given APIVersion, Kind, Name, and Namespace -func Get(work workapiv1.ManifestWork, resource Resource) (runtime.Object, error) { +func (client *WorkUtilsClient) Get(work workapiv1.ManifestWork, resource Resource) (runtime.Object, error) { err := validate(resource) if err != nil { return nil, err @@ -14,7 +15,7 @@ func Get(work workapiv1.ManifestWork, resource Resource) (runtime.Object, error) manifests := work.Spec.Workload.Manifests for _, manifest := range manifests { - obj, gvk, err := decode(manifest.Raw) + obj, gvk, err := decode(manifest.Raw, scheme.Scheme) if err != nil { return nil, err } diff --git a/get_test.go b/get_test.go index dbd2c74..379a914 100644 --- a/get_test.go +++ b/get_test.go @@ -5,6 +5,7 @@ import ( testify "github.com/stretchr/testify/assert" corev1 "k8s.io/api/core/v1" + "k8s.io/client-go/kubernetes/scheme" workapiv1 "open-cluster-management.io/api/work/v1" ) @@ -28,7 +29,8 @@ metadata: }, }, } - obj, err := Get(work, Resource{ + client := NewWorkUtilsClient(scheme.Scheme) + obj, err := client.Get(work, Resource{ Group: "", Version: "v1", Kind: "Namespace", diff --git a/go.mod b/go.mod index 91ecc57..5867d39 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,6 @@ require ( github.com/ohkinozomu/go-sh v0.0.1 github.com/stretchr/testify v1.9.0 k8s.io/api v0.29.1 - k8s.io/apiextensions-apiserver v0.28.0 k8s.io/apimachinery v0.29.1 k8s.io/client-go v0.29.1 k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 diff --git a/go.sum b/go.sum index 80bd0d3..4fa7ec7 100644 --- a/go.sum +++ b/go.sum @@ -156,8 +156,6 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= k8s.io/api v0.29.1 h1:DAjwWX/9YT7NQD4INu49ROJuZAAAP/Ijki48GUPzxqw= k8s.io/api v0.29.1/go.mod h1:7Kl10vBRUXhnQQI8YR/R327zXC8eJ7887/+Ybta+RoQ= -k8s.io/apiextensions-apiserver v0.28.0 h1:CszgmBL8CizEnj4sj7/PtLGey6Na3YgWyGCPONv7E9E= -k8s.io/apiextensions-apiserver v0.28.0/go.mod h1:uRdYiwIuu0SyqJKriKmqEN2jThIJPhVmOWETm8ud1VE= k8s.io/apimachinery v0.29.1 h1:KY4/E6km/wLBguvCZv8cKTeOwwOBqFNjwJIdMkMbbRc= k8s.io/apimachinery v0.29.1/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU= k8s.io/client-go v0.29.1 h1:19B/+2NGEwnFLzt0uB5kNJnfTsbV8w6TgQRz9l7ti7A= diff --git a/remove.go b/remove.go index de5ef58..de84747 100644 --- a/remove.go +++ b/remove.go @@ -3,11 +3,12 @@ package workutils import ( "slices" + "k8s.io/client-go/kubernetes/scheme" workapiv1 "open-cluster-management.io/api/work/v1" ) // Remove removes the resource with the given APIVersion, Kind, Name, and Namespace -func Remove(work workapiv1.ManifestWork, resource Resource) (workapiv1.ManifestWork, error) { +func (client *WorkUtilsClient) Remove(work workapiv1.ManifestWork, resource Resource) (workapiv1.ManifestWork, error) { err := validate(resource) if err != nil { return work, err @@ -16,7 +17,7 @@ func Remove(work workapiv1.ManifestWork, resource Resource) (workapiv1.ManifestW manifests := work.Spec.Workload.Manifests for i, manifest := range manifests { - o, gvk, err := decode(manifest.Raw) + o, gvk, err := decode(manifest.Raw, scheme.Scheme) if err != nil { return work, err } diff --git a/remove_test.go b/remove_test.go index e71d8e5..e7b3eb5 100644 --- a/remove_test.go +++ b/remove_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "k8s.io/client-go/kubernetes/scheme" workapiv1 "open-cluster-management.io/api/work/v1" ) @@ -57,7 +58,8 @@ spec: }, }, } - updatedWork, err := Remove(work, Resource{ + client := NewWorkUtilsClient(scheme.Scheme) + updatedWork, err := client.Remove(work, Resource{ Group: "", Version: "v1", Kind: "Namespace", diff --git a/scheme.go b/scheme.go deleted file mode 100644 index 4b54ede..0000000 --- a/scheme.go +++ /dev/null @@ -1,16 +0,0 @@ -package workutils - -import ( - apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/kubernetes/scheme" -) - -var wellknownScheme *runtime.Scheme - -func init() { - wellknownScheme = scheme.Scheme - apiextensionsv1.AddToScheme(wellknownScheme) - apiextensionsv1beta1.AddToScheme(wellknownScheme) -} diff --git a/update.go b/update.go index 79ecce1..bb38f35 100644 --- a/update.go +++ b/update.go @@ -2,11 +2,12 @@ package workutils import ( "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/kubernetes/scheme" workapiv1 "open-cluster-management.io/api/work/v1" ) // Update updates ManifestWork -func Update(work workapiv1.ManifestWork, obj runtime.Object) (workapiv1.ManifestWork, error) { +func (client *WorkUtilsClient) Update(work workapiv1.ManifestWork, obj runtime.Object) (workapiv1.ManifestWork, error) { manifests := work.Spec.Workload.Manifests group, version, kind, err := getGVKFromObject(obj) if err != nil { @@ -22,7 +23,7 @@ func Update(work workapiv1.ManifestWork, obj runtime.Object) (workapiv1.Manifest } for i, manifest := range manifests { - o, gvk, err := decode(manifest.Raw) + o, gvk, err := decode(manifest.Raw, scheme.Scheme) if err != nil { return work, err } @@ -44,7 +45,7 @@ func Update(work workapiv1.ManifestWork, obj runtime.Object) (workapiv1.Manifest return work, err } - rawExtension, err := objToRawExtension(obj) + rawExtension, err := objToRawExtension(obj, client.Scheme) if err != nil { return work, err } diff --git a/update_test.go b/update_test.go index 620b543..146c5e9 100644 --- a/update_test.go +++ b/update_test.go @@ -7,6 +7,7 @@ import ( appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes/scheme" "k8s.io/utils/pointer" workapiv1 "open-cluster-management.io/api/work/v1" ) @@ -101,11 +102,12 @@ spec: }, } - updatedWork, err := Update(work, deployment) + client := NewWorkUtilsClient(scheme.Scheme) + updatedWork, err := client.Update(work, deployment) require.Nil(t, err) require.Equal(t, len(updatedWork.Spec.Workload.Manifests), 1) - obj, err := Get(updatedWork, Resource{ + obj, err := client.Get(updatedWork, Resource{ Group: "apps", Version: "v1", Kind: "Deployment",