Skip to content

Commit

Permalink
indirect pod reconcile for more dynamic behavior
Browse files Browse the repository at this point in the history
Signed-off-by: Evan Baker <rbtr@users.noreply.github.com>
  • Loading branch information
rbtr committed Aug 18, 2023
1 parent 89bf269 commit 51f9c1f
Showing 1 changed file with 42 additions and 16 deletions.
58 changes: 42 additions & 16 deletions cns/kubecontroller/podwatcher/podwatcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,32 +21,58 @@ type podListener interface {
Update([]v1.Pod)
}

type podWatcher struct {
cli podcli
listOpt client.ListOption
listeners []podListener
type PodWatcher struct {
cli podcli
listOpt client.ListOption
ReconcileFuncs []reconcile.Func
}

func New(nodename string, listeners ...podListener) *podWatcher { //nolint:revive // private struct to force constructor
return &podWatcher{
listeners: listeners,
listOpt: &client.ListOptions{FieldSelector: fields.SelectorFromSet(fields.Set{"spec.nodeName": nodename})},
func New(nodename string) *PodWatcher { //nolint:revive // private struct to force constructor
return &PodWatcher{
listOpt: &client.ListOptions{FieldSelector: fields.SelectorFromSet(fields.Set{"spec.nodeName": nodename})},
}
}

func (p *podWatcher) Reconcile(ctx context.Context, _ reconcile.Request) (reconcile.Result, error) {
podList := &v1.PodList{}
if err := p.cli.List(ctx, podList, p.listOpt); err != nil {
return reconcile.Result{}, errors.Wrap(err, "failed to list pods")
}
for _, l := range p.listeners {
l.Update(podList.Items)
func (p *PodWatcher) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
for _, f := range p.ReconcileFuncs {
if _, err := f(ctx, req); err != nil {
return reconcile.Result{}, errors.Wrap(err, "failed to reconcile")
}
}
return reconcile.Result{}, nil
}

type PodFilter func([]v1.Pod) []v1.Pod

var PodNetworkFilter PodFilter = func(pods []v1.Pod) []v1.Pod {
var filtered []v1.Pod
for _, pod := range pods {
if !pod.Spec.HostNetwork {
filtered = append(filtered, pod)
}
}
return filtered
}

func (p *PodWatcher) PodNotifierFunc(f PodFilter, listeners ...podListener) reconcile.Func {
return func(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
podList := &v1.PodList{}
if err := p.cli.List(ctx, podList, p.listOpt); err != nil {
return reconcile.Result{}, errors.Wrap(err, "failed to list pods")
}
pods := podList.Items
if f != nil {
pods = f(pods)
}
for _, l := range listeners {
l.Update(pods)
}
return reconcile.Result{}, nil
}
}

// SetupWithManager Sets up the reconciler with a new manager, filtering using NodeNetworkConfigFilter on nodeName.
func (p *podWatcher) SetupWithManager(mgr ctrl.Manager) error {
func (p *PodWatcher) SetupWithManager(mgr ctrl.Manager) error {
p.cli = mgr.GetClient()
err := ctrl.NewControllerManagedBy(mgr).
For(&v1.Pod{}).
Expand Down

0 comments on commit 51f9c1f

Please sign in to comment.