Skip to content

Commit 80d9577

Browse files
committed
Use typed client for ResourceSets
This complicates the tests a little but avoids marshalling to/from JSON.
1 parent 415b900 commit 80d9577

3 files changed

Lines changed: 127 additions & 103 deletions

File tree

src/go/pkg/synk/BUILD.bazel

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ go_library(
1111
visibility = ["//visibility:public"],
1212
deps = [
1313
"//src/go/pkg/apis/apps/v1alpha1:go_default_library",
14+
"//src/go/pkg/client/versioned:go_default_library",
1415
"@com_github_cenkalti_backoff//:go_default_library",
1516
"@com_github_googlecloudrobotics_ilog//:go_default_library",
1617
"@com_github_pkg_errors//:go_default_library",
@@ -45,6 +46,7 @@ go_test(
4546
embed = [":go_default_library"],
4647
deps = [
4748
"//src/go/pkg/apis/apps/v1alpha1:go_default_library",
49+
"//src/go/pkg/client/versioned/fake:go_default_library",
4850
"@com_github_pkg_errors//:go_default_library",
4951
"@io_k8s_api//core/v1:go_default_library",
5052
"@io_k8s_apimachinery//pkg/api/errors:go_default_library",

src/go/pkg/synk/synk.go

Lines changed: 23 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030

3131
"github.com/cenkalti/backoff"
3232
apps "github.com/googlecloudrobotics/core/src/go/pkg/apis/apps/v1alpha1"
33+
crcapi "github.com/googlecloudrobotics/core/src/go/pkg/client/versioned"
3334
"github.com/googlecloudrobotics/ilog"
3435
"github.com/pkg/errors"
3536
"go.opencensus.io/trace"
@@ -56,19 +57,24 @@ import (
5657
// src/k8s.io/apimachinery/pkg/api/validation/objectmeta.go
5758
const totalAnnotationSizeLimitB int = 256 * (1 << 10) // 256 kB
5859

60+
// Can be overridden for testing.
61+
var metav1Now = metav1.Now
62+
5963
// Synk allows to synchronize sets of resources with a fixed cluster.
6064
type Synk struct {
6165
discovery discovery.CachedDiscoveryInterface
6266
client dynamic.Interface
67+
rsClient crcapi.Interface
6368
mapper meta.RESTMapper
6469
resetMapper func()
6570
}
6671

6772
// New returns a new Synk object that acts against the cluster for the given configuration.
68-
func New(client dynamic.Interface, discovery discovery.CachedDiscoveryInterface) *Synk {
73+
func New(client dynamic.Interface, rsClient crcapi.Interface, discovery discovery.CachedDiscoveryInterface) *Synk {
6974
s := &Synk{
7075
discovery: discovery,
7176
client: client,
77+
rsClient: rsClient,
7278
}
7379
// Store reset function seperately to allow reasonable tests.
7480
m := restmapper.NewDeferredDiscoveryRESTMapper(discovery)
@@ -83,6 +89,10 @@ func NewForConfig(cfg *rest.Config) (*Synk, error) {
8389
if err != nil {
8490
return nil, err
8591
}
92+
rsClient, err := crcapi.NewForConfig(cfg)
93+
if err != nil {
94+
return nil, err
95+
}
8696
discovery, err := discovery.NewDiscoveryClientForConfig(cfg)
8797
if err != nil {
8898
return nil, err
@@ -91,7 +101,7 @@ func NewForConfig(cfg *rest.Config) (*Synk, error) {
91101
// Without initial invalidation all calls will fail.
92102
cachedDiscovery.Invalidate()
93103

94-
return New(client, cachedDiscovery), nil
104+
return New(client, rsClient, cachedDiscovery), nil
95105
}
96106

97107
// TODO: determine options that allow us to be semantically compatible with
@@ -215,7 +225,7 @@ func (s *Synk) Init() error {
215225
func (s *Synk) Delete(ctx context.Context, name string) error {
216226
policy := metav1.DeletePropagationForeground
217227
deleteOpts := metav1.DeleteOptions{PropagationPolicy: &policy}
218-
return s.client.Resource(resourceSetGVR).DeleteCollection(ctx, deleteOpts, metav1.ListOptions{
228+
return s.rsClient.AppsV1alpha1().ResourceSets().DeleteCollection(ctx, deleteOpts, metav1.ListOptions{
219229
LabelSelector: fmt.Sprintf("name=%s", name),
220230
})
221231
}
@@ -471,7 +481,7 @@ func (s *Synk) initialize(
471481

472482
rs.Status = apps.ResourceSetStatus{
473483
Phase: apps.ResourceSetPhasePending,
474-
StartedAt: metav1.Now(),
484+
StartedAt: metav1Now(),
475485
}
476486
if err := s.createResourceSet(ctx, &rs); err != nil {
477487
return nil, nil, errors.Wrapf(err, "create resources object %q", rs.Name)
@@ -862,25 +872,9 @@ func (s *Synk) crdAvailable(ucrd *unstructured.Unstructured) (bool, error) {
862872
return true, nil
863873
}
864874

865-
var resourceSetGVR = schema.GroupVersionResource{
866-
Group: "apps.cloudrobotics.com",
867-
Version: "v1alpha1",
868-
Resource: "resourcesets",
869-
}
870-
871875
func (s *Synk) createResourceSet(ctx context.Context, rs *apps.ResourceSet) error {
872-
rs.Kind = "ResourceSet"
873-
rs.APIVersion = "apps.cloudrobotics.com/v1alpha1"
874-
875-
var u unstructured.Unstructured
876-
if err := convert(rs, &u); err != nil {
877-
return err
878-
}
879-
res, err := s.client.Resource(resourceSetGVR).Create(ctx, &u, metav1.CreateOptions{})
880-
if err != nil {
881-
return err
882-
}
883-
return convert(res, rs)
876+
_, err := s.rsClient.AppsV1alpha1().ResourceSets().Create(ctx, rs, metav1.CreateOptions{})
877+
return err
884878
}
885879

886880
type applyResult struct {
@@ -959,41 +953,29 @@ func (s *Synk) updateResourceSetStatus(ctx context.Context, rs *apps.ResourceSet
959953
build(applied, &rs.Status.Applied)
960954
build(failed, &rs.Status.Failed)
961955

962-
rs.Status.FinishedAt = metav1.Now()
956+
rs.Status.FinishedAt = metav1Now()
963957
if len(rs.Status.Failed) > 0 {
964958
rs.Status.Phase = apps.ResourceSetPhaseFailed
965959
} else {
966960
rs.Status.Phase = apps.ResourceSetPhaseSettled
967961
}
968962

969-
var u unstructured.Unstructured
970-
if err := convert(rs, &u); err != nil {
971-
return err
972-
}
973-
res, err := s.client.Resource(resourceSetGVR).Update(ctx, &u, metav1.UpdateOptions{})
974-
if err != nil {
975-
return errors.Wrap(err, "update ResourceSet status")
976-
}
977-
return convert(res, rs)
963+
_, err := s.rsClient.AppsV1alpha1().ResourceSets().Update(ctx, rs, metav1.UpdateOptions{})
964+
return err
978965
}
979966

980967
// deleteFailedResourceSets deletes all failed ResourceSets of the given name
981968
// that have a lower version.
982969
func (s *Synk) deleteFailedResourceSets(ctx context.Context, name string, version int32) error {
983-
c := s.client.Resource(resourceSetGVR)
984-
970+
c := s.rsClient.AppsV1alpha1().ResourceSets()
985971
list, err := c.List(ctx, metav1.ListOptions{
986972
LabelSelector: "name=" + name,
987973
})
988974
if err != nil {
989975
return errors.Wrap(err, "list existing resources")
990976
}
991977
for _, r := range list.Items {
992-
phase, found, err := unstructured.NestedString(r.Object, "status", "phase")
993-
if err != nil {
994-
return errors.Wrapf(err, "failed to get status.phase from ResourceSet %q", r.GetName())
995-
}
996-
if !found || phase != "Failed" {
978+
if r.Status.Phase != apps.ResourceSetPhaseFailed {
997979
continue
998980
}
999981
n, v, ok := decodeResourceSetName(r.GetName())
@@ -1014,7 +996,7 @@ func (s *Synk) deleteFailedResourceSets(ctx context.Context, name string, versio
1014996
// deleteResourceSets deletes all ResourceSets of the given name that have a
1015997
// lower version.
1016998
func (s *Synk) deleteResourceSets(ctx context.Context, name string, version int32) error {
1017-
c := s.client.Resource(resourceSetGVR)
999+
c := s.rsClient.AppsV1alpha1().ResourceSets()
10181000

10191001
list, err := c.List(ctx, metav1.ListOptions{
10201002
LabelSelector: "name=" + name,
@@ -1040,7 +1022,7 @@ func (s *Synk) deleteResourceSets(ctx context.Context, name string, version int3
10401022

10411023
// next returns the next version for the resources name.
10421024
func (s *Synk) next(ctx context.Context, name string) (version int32, err error) {
1043-
list, err := s.client.Resource(resourceSetGVR).List(ctx, metav1.ListOptions{})
1025+
list, err := s.rsClient.AppsV1alpha1().ResourceSets().List(ctx, metav1.ListOptions{})
10441026
if err != nil {
10451027
return 0, errors.Wrap(err, "list existing ResourceSets")
10461028
}

0 commit comments

Comments
 (0)