@@ -25,8 +25,10 @@ import (
2525"k8s.io/client-go/util/retry"
2626"k8s.io/utils/ptr"
2727ctrl "sigs.k8s.io/controller-runtime"
28+ "sigs.k8s.io/controller-runtime/pkg/builder"
2829"sigs.k8s.io/controller-runtime/pkg/client"
2930"sigs.k8s.io/controller-runtime/pkg/log"
31+ "sigs.k8s.io/controller-runtime/pkg/predicate"
3032"sigs.k8s.io/controller-runtime/pkg/reconcile"
3133
3234"github.com/apoxy-dev/apoxy/pkg/tunnel/connection"
@@ -50,6 +52,7 @@ type tunnelServerOptions struct {
5052keyPath string
5153ipam tunnet.IPAM
5254extIPv6Prefix netip.Prefix
55+ selector string
5356}
5457
5558func defaultServerOptions () * tunnelServerOptions {
@@ -60,6 +63,7 @@ func defaultServerOptions() *tunnelServerOptions {
6063keyPath : "/etc/apoxy/certs/tunnelproxy.key" ,
6164ipam : tunnet .NewRandomULA (),
6265extIPv6Prefix : netip .MustParsePrefix ("fd00::/64" ),
66+ selector : "" ,
6367}
6468}
6569
@@ -106,6 +110,13 @@ func WithExternalIPv6Prefix(prefix netip.Prefix) TunnelServerOption {
106110}
107111}
108112
113+ // WithLabelSelector sets the label selector to filter TunnelNodes.
114+ func WithLabelSelector (labelSelector string ) TunnelServerOption {
115+ return func (o * tunnelServerOptions ) {
116+ o .selector = labelSelector
117+ }
118+ }
119+
109120type TunnelServer struct {
110121http3.Server
111122client.Client
@@ -156,8 +167,21 @@ func NewTunnelServer(
156167}
157168
158169func (t * TunnelServer ) SetupWithManager (mgr ctrl.Manager ) error {
170+ lss , err := metav1 .ParseToLabelSelector (t .options .selector )
171+ if err != nil {
172+ return fmt .Errorf ("failed to parse label selector: %w" , err )
173+ }
174+ ls , err := predicate .LabelSelectorPredicate (* lss )
175+ if err != nil {
176+ return fmt .Errorf ("failed to create label selector predicate: %w" , err )
177+ }
159178return ctrl .NewControllerManagedBy (mgr ).
160- For (& corev1alpha.TunnelNode {}).
179+ For (& corev1alpha.TunnelNode {},
180+ builder .WithPredicates (
181+ & predicate.ResourceVersionChangedPredicate {},
182+ ls ,
183+ ),
184+ ).
161185Complete (reconcile .Func (t .reconcile )) // Using this contraption to keep reconcile method private.
162186}
163187
0 commit comments