From a9c39ef89b26ad9ef52d9fdfef5249da894ad7ad Mon Sep 17 00:00:00 2001 From: Darren Shepherd Date: Mon, 22 Jun 2020 09:42:18 -0700 Subject: [PATCH] Support watching names and selector --- pkg/resources/helm/store.go | 2 +- pkg/stores/partition/store.go | 8 ++++---- pkg/stores/proxy/proxy_store.go | 1 + pkg/stores/proxy/rbac_store.go | 14 +++++++++++++- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/pkg/resources/helm/store.go b/pkg/resources/helm/store.go index 04a8535..0d37fcc 100644 --- a/pkg/resources/helm/store.go +++ b/pkg/resources/helm/store.go @@ -67,7 +67,7 @@ func (p *partitioner) Lookup(apiOp *types.APIRequest, schema *types.APISchema, v return nil, validation.NotFound } -func (p *partitioner) All(apiOp *types.APIRequest, schema *types.APISchema, verb string) ([]partition.Partition, error) { +func (p *partitioner) All(apiOp *types.APIRequest, schema *types.APISchema, verb, id string) ([]partition.Partition, error) { return all, nil } diff --git a/pkg/stores/partition/store.go b/pkg/stores/partition/store.go index 3d5fb57..1961423 100644 --- a/pkg/stores/partition/store.go +++ b/pkg/stores/partition/store.go @@ -11,7 +11,7 @@ import ( type Partitioner interface { Lookup(apiOp *types.APIRequest, schema *types.APISchema, verb, id string) (Partition, error) - All(apiOp *types.APIRequest, schema *types.APISchema, verb string) ([]Partition, error) + All(apiOp *types.APIRequest, schema *types.APISchema, verb, id string) ([]Partition, error) Store(apiOp *types.APIRequest, partition Partition) (types.Store, error) } @@ -74,7 +74,7 @@ func (s *Store) List(apiOp *types.APIRequest, schema *types.APISchema) (types.AP result types.APIObjectList ) - paritions, err := s.Partitioner.All(apiOp, schema, "list") + paritions, err := s.Partitioner.All(apiOp, schema, "list", "") if err != nil { return result, err } @@ -123,13 +123,13 @@ func (s *Store) Update(apiOp *types.APIRequest, schema *types.APISchema, data ty } func (s *Store) Watch(apiOp *types.APIRequest, schema *types.APISchema, wr types.WatchRequest) (chan types.APIEvent, error) { - partitions, err := s.Partitioner.All(apiOp, schema, "watch") + partitions, err := s.Partitioner.All(apiOp, schema, "watch", wr.ID) if err != nil { return nil, err } ctx, cancel := context.WithCancel(apiOp.Context()) - apiOp = apiOp.WithContext(ctx) + apiOp = apiOp.Clone().WithContext(ctx) eg := errgroup.Group{} response := make(chan types.APIEvent) diff --git a/pkg/stores/proxy/proxy_store.go b/pkg/stores/proxy/proxy_store.go index 1ad337f..481f700 100644 --- a/pkg/stores/proxy/proxy_store.go +++ b/pkg/stores/proxy/proxy_store.go @@ -287,6 +287,7 @@ func (s *Store) listAndWatch(apiOp *types.APIRequest, k8sClient dynamic.Resource Watch: true, TimeoutSeconds: &timeout, ResourceVersion: rev, + LabelSelector: w.Selector, }) if err != nil { returnErr(errors.Wrapf(err, "stopping watch for %s: %v", schema.ID, err), result) diff --git a/pkg/stores/proxy/rbac_store.go b/pkg/stores/proxy/rbac_store.go index 679bacd..a5fc416 100644 --- a/pkg/stores/proxy/rbac_store.go +++ b/pkg/stores/proxy/rbac_store.go @@ -10,6 +10,7 @@ import ( "github.com/rancher/steve/pkg/accesscontrol" "github.com/rancher/steve/pkg/attributes" "github.com/rancher/steve/pkg/stores/partition" + "github.com/rancher/wrangler/pkg/kv" "k8s.io/apimachinery/pkg/util/sets" ) @@ -62,11 +63,22 @@ func (p *rbacPartitioner) Lookup(apiOp *types.APIRequest, schema *types.APISchem } } -func (p *rbacPartitioner) All(apiOp *types.APIRequest, schema *types.APISchema, verb string) ([]partition.Partition, error) { +func (p *rbacPartitioner) All(apiOp *types.APIRequest, schema *types.APISchema, verb, id string) ([]partition.Partition, error) { switch verb { case "list": fallthrough case "watch": + if id != "" { + ns, name := kv.RSplit(id, "/") + return []partition.Partition{ + Partition{ + Namespace: ns, + All: false, + Passthrough: false, + Names: sets.NewString(name), + }, + }, nil + } partitions, passthrough := isPassthrough(apiOp, schema, verb) if passthrough { return passthroughPartitions, nil