Skip to content

Commit

Permalink
sotw: dnspolicy init
Browse files Browse the repository at this point in the history
Add basic setup for DNSPolicy state of the world tasks, dnsrecord types,
watcher and linker function (Listener -> DNSRecord)

Signed-off-by: Michael Nairn <mnairn@redhat.com>
  • Loading branch information
mikenairn committed Oct 14, 2024
1 parent cd7f9c2 commit 4563a7b
Show file tree
Hide file tree
Showing 6 changed files with 189 additions and 12 deletions.
59 changes: 56 additions & 3 deletions controllers/dns_workflow.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,60 @@
package controllers

import "github.com/kuadrant/policy-machinery/controller"
import (
"github.com/samber/lo"

func NewDNSWorkflow() *controller.Workflow {
return &controller.Workflow{}
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/dynamic"
gwapiv1 "sigs.k8s.io/gateway-api/apis/v1"

kuadrantdnsv1alpha1 "github.com/kuadrant/dns-operator/api/v1alpha1"
"github.com/kuadrant/policy-machinery/controller"
"github.com/kuadrant/policy-machinery/machinery"

kuadrantv1alpha1 "github.com/kuadrant/kuadrant-operator/api/v1alpha1"
)

var (
DNSRecordResource = kuadrantdnsv1alpha1.GroupVersion.WithResource("dnsrecords")
DNSRecordGroupKind = schema.GroupKind{Group: kuadrantdnsv1alpha1.GroupVersion.Group, Kind: "DNSRecord"}
)

//+kubebuilder:rbac:groups=core,resources=namespaces,verbs=get;list;watch
//+kubebuilder:rbac:groups=kuadrant.io,resources=dnspolicies,verbs=get;list;watch;update;patch;delete
//+kubebuilder:rbac:groups=kuadrant.io,resources=dnspolicies/status,verbs=get;update;patch
//+kubebuilder:rbac:groups=kuadrant.io,resources=dnspolicies/finalizers,verbs=update

//+kubebuilder:rbac:groups=kuadrant.io,resources=dnsrecords,verbs=get;list;watch;create;update;patch;delete
//+kubebuilder:rbac:groups=kuadrant.io,resources=dnsrecords/status,verbs=get

func NewDNSWorkflow(client *dynamic.DynamicClient) *controller.Workflow {
return &controller.Workflow{
Precondition: NewDNSPoliciesValidator().Subscription().Reconcile,
Tasks: []controller.ReconcileFunc{(&controller.Workflow{
Tasks: []controller.ReconcileFunc{
NewEffectiveDNSPoliciesReconciler(client).Subscription().Reconcile,
},
}).Run},
Postcondition: NewDNSPolicyStatusUpdater(client).Subscription().Reconcile,
}
}

func LinkListenerToDNSRecord(objs controller.Store) machinery.LinkFunc {
gateways := lo.Map(objs.FilterByGroupKind(machinery.GatewayGroupKind), controller.ObjectAs[*gwapiv1.Gateway])
listeners := lo.FlatMap(lo.Map(gateways, func(g *gwapiv1.Gateway, _ int) *machinery.Gateway {
return &machinery.Gateway{Gateway: g}
}), machinery.ListenersFromGatewayFunc)

return machinery.LinkFunc{
From: machinery.ListenerGroupKind,
To: DNSRecordGroupKind,
Func: func(child machinery.Object) []machinery.Object {
return lo.FilterMap(listeners, func(l *machinery.Listener, _ int) (machinery.Object, bool) {
o := child.(*controller.RuntimeObject)
return l, isObjectOwnedByGroupKind(o, kuadrantv1alpha1.DNSPolicyGroupKind) &&
l.GetNamespace() == child.GetNamespace() &&
child.GetName() == dnsRecordName(l.Gateway.Name, string(l.Name))
})
},
}
}
44 changes: 44 additions & 0 deletions controllers/dnspolicies_validator.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package controllers

import (
"context"
"sync"

"github.com/kuadrant/policy-machinery/controller"
"github.com/kuadrant/policy-machinery/machinery"
"github.com/samber/lo"

kuadrantv1alpha1 "github.com/kuadrant/kuadrant-operator/api/v1alpha1"
)

var (
StateDNSPolicyValid = struct{}{}
)

func NewDNSPoliciesValidator() *DNSPoliciesValidator {
return &DNSPoliciesValidator{}
}

type DNSPoliciesValidator struct{}

func (r *DNSPoliciesValidator) Subscription() controller.Subscription {
return controller.Subscription{
ReconcileFunc: r.validate,
Events: []controller.ResourceEventMatcher{
{Kind: &machinery.GatewayGroupKind},
{Kind: &kuadrantv1alpha1.DNSPolicyGroupKind},
},
}
}

func (r *DNSPoliciesValidator) validate(_ context.Context, _ []controller.ResourceEvent, topology *machinery.Topology, _ error, state *sync.Map) error {
policies := topology.Policies().Items(func(o machinery.Object) bool {
return o.GroupVersionKind().GroupKind() == kuadrantv1alpha1.DNSPolicyGroupKind
})

state.Store(StateDNSPolicyValid, lo.SliceToMap(policies, func(policy machinery.Policy) (string, bool) {
return policy.GetLocator(), len(policy.GetTargetRefs()) == 0 || len(topology.Targetables().Parents(policy)) > 0
}))

return nil
}
8 changes: 0 additions & 8 deletions controllers/dnspolicy_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,6 @@ type DNSPolicyReconciler struct {
dnsHelper dnsHelper
}

//+kubebuilder:rbac:groups=core,resources=namespaces,verbs=get;list;watch
//+kubebuilder:rbac:groups=kuadrant.io,resources=dnspolicies,verbs=get;list;watch;update;patch;delete
//+kubebuilder:rbac:groups=kuadrant.io,resources=dnspolicies/status,verbs=get;update;patch
//+kubebuilder:rbac:groups=kuadrant.io,resources=dnspolicies/finalizers,verbs=update

//+kubebuilder:rbac:groups=kuadrant.io,resources=dnsrecords,verbs=get;list;watch;create;update;patch;delete
//+kubebuilder:rbac:groups=kuadrant.io,resources=dnsrecords/status,verbs=get

func (r *DNSPolicyReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
log := r.Logger().WithValues("DNSPolicy", req.NamespacedName)
log.Info("Reconciling DNSPolicy")
Expand Down
36 changes: 36 additions & 0 deletions controllers/dnspolicy_status_updater.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package controllers

import (
"context"
"sync"

"github.com/kuadrant/policy-machinery/controller"
"github.com/kuadrant/policy-machinery/machinery"
"k8s.io/client-go/dynamic"

kuadrantv1alpha1 "github.com/kuadrant/kuadrant-operator/api/v1alpha1"
)

func NewDNSPolicyStatusUpdater(client *dynamic.DynamicClient) *DNSPolicyStatusUpdater {
return &DNSPolicyStatusUpdater{client: client}
}

type DNSPolicyStatusUpdater struct {
client *dynamic.DynamicClient
}

func (r *DNSPolicyStatusUpdater) Subscription() controller.Subscription {
return controller.Subscription{
ReconcileFunc: r.update,
Events: []controller.ResourceEventMatcher{
{Kind: &machinery.GatewayGroupKind},
{Kind: &kuadrantv1alpha1.DNSPolicyGroupKind},
{Kind: &DNSRecordGroupKind},
},
}
}

func (r *DNSPolicyStatusUpdater) update(_ context.Context, _ []controller.ResourceEvent, _ *machinery.Topology, _ error, _ *sync.Map) error {
//ToDo Implement implement me !!!
return nil
}
35 changes: 35 additions & 0 deletions controllers/effective_dnspolicies_reconciler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package controllers

import (
"context"
"sync"

"github.com/kuadrant/policy-machinery/controller"
"github.com/kuadrant/policy-machinery/machinery"
"k8s.io/client-go/dynamic"

kuadrantv1alpha1 "github.com/kuadrant/kuadrant-operator/api/v1alpha1"
)

func NewEffectiveDNSPoliciesReconciler(client *dynamic.DynamicClient) *EffectiveDNSPoliciesReconciler {
return &EffectiveDNSPoliciesReconciler{client: client}
}

type EffectiveDNSPoliciesReconciler struct {
client *dynamic.DynamicClient
}

func (r *EffectiveDNSPoliciesReconciler) Subscription() controller.Subscription {
return controller.Subscription{
ReconcileFunc: r.reconcile,
Events: []controller.ResourceEventMatcher{
{Kind: &machinery.GatewayGroupKind},
{Kind: &kuadrantv1alpha1.DNSPolicyGroupKind},
{Kind: &DNSRecordGroupKind},
},
}
}

func (r *EffectiveDNSPoliciesReconciler) reconcile(ctx context.Context, _ []controller.ResourceEvent, topology *machinery.Topology, _ error, state *sync.Map) error {
return nil
}
19 changes: 18 additions & 1 deletion controllers/state_of_the_world.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
egv1alpha1 "github.com/envoyproxy/gateway/api/v1alpha1"
"github.com/go-logr/logr"
authorinov1beta1 "github.com/kuadrant/authorino-operator/api/v1beta1"
kuadrantdnsv1alpha1 "github.com/kuadrant/dns-operator/api/v1alpha1"
limitadorv1alpha1 "github.com/kuadrant/limitador-operator/api/v1alpha1"
"github.com/kuadrant/policy-machinery/controller"
consolev1 "github.com/openshift/api/console/v1"
Expand Down Expand Up @@ -155,6 +156,7 @@ func (b *BootOptionsBuilder) getOptions() []controller.ControllerOption {
opts = append(opts, b.getEnvoyGatewayOptions()...)
opts = append(opts, b.getCertManagerOptions()...)
opts = append(opts, b.getConsolePluginOptions()...)
opts = append(opts, b.getDNSOperatorOptions()...)

return opts
}
Expand Down Expand Up @@ -291,13 +293,28 @@ func (b *BootOptionsBuilder) getConsolePluginOptions() []controller.ControllerOp
return opts
}

func (b *BootOptionsBuilder) getDNSOperatorOptions() []controller.ControllerOption {
var opts []controller.ControllerOption
opts = append(opts,
controller.WithRunnable("dnsrecord watcher", controller.Watch(&kuadrantdnsv1alpha1.DNSRecord{}, DNSRecordResource, metav1.NamespaceAll)),
controller.WithObjectKinds(
DNSRecordGroupKind,
),
controller.WithObjectLinks(
LinkListenerToDNSRecord,
),
)

return opts
}

func (b *BootOptionsBuilder) Reconciler() controller.ReconcileFunc {
mainWorkflow := &controller.Workflow{
Precondition: initWorkflow(b.client).Run,
Tasks: []controller.ReconcileFunc{
NewAuthorinoReconciler(b.client).Subscription().Reconcile,
NewLimitadorReconciler(b.client).Subscription().Reconcile,
NewDNSWorkflow().Run,
NewDNSWorkflow(b.client).Run,
NewTLSWorkflow(b.client, b.isCertManagerInstalled).Run,
NewAuthWorkflow().Run,
NewRateLimitWorkflow().Run,
Expand Down

0 comments on commit 4563a7b

Please sign in to comment.