Skip to content

Commit

Permalink
Update API for Custom Resources (#22)
Browse files Browse the repository at this point in the history
  • Loading branch information
ohkinozomu authored Jun 26, 2024
1 parent 38aab8d commit 51f9d2c
Show file tree
Hide file tree
Showing 16 changed files with 52 additions and 47 deletions.
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
```
4 changes: 2 additions & 2 deletions add.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
6 changes: 4 additions & 2 deletions add_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand Down Expand Up @@ -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",
Expand Down
11 changes: 11 additions & 0 deletions client.go
Original file line number Diff line number Diff line change
@@ -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}
}
10 changes: 5 additions & 5 deletions common.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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
}
Expand All @@ -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)
Expand Down
7 changes: 4 additions & 3 deletions common_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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)
Expand Down
3 changes: 2 additions & 1 deletion e2e_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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{
Expand Down
5 changes: 3 additions & 2 deletions get.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,20 @@ 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
}

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
}
Expand Down
4 changes: 3 additions & 1 deletion get_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand All @@ -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",
Expand Down
1 change: 0 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 0 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand Down
5 changes: 3 additions & 2 deletions remove.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
}
Expand Down
4 changes: 3 additions & 1 deletion remove_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand Down Expand Up @@ -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",
Expand Down
16 changes: 0 additions & 16 deletions scheme.go

This file was deleted.

7 changes: 4 additions & 3 deletions update.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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
}
Expand All @@ -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
}
Expand Down
6 changes: 4 additions & 2 deletions update_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)
Expand Down Expand Up @@ -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",
Expand Down

0 comments on commit 51f9d2c

Please sign in to comment.