@@ -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
5758const 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.
6064type 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 {
215225func (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-
871875func (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
886880type 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.
982969func (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.
1016998func (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.
10421024func (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