Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,6 @@ tmp/

# Preserve files
!.gitkeep

# Output of the go coverage tool, specifically when used with LiteIDE
*.out
58 changes: 58 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
version: "2"
run:
allow-parallel-runners: true
linters:
default: none
enable:
- copyloopvar
- dupl
- errcheck
- ginkgolinter
- goconst
- gocyclo
- govet
- ineffassign
- lll
- misspell
- nakedret
- prealloc
- revive
- staticcheck
- unconvert
- unparam
- unused
settings:
revive:
rules:
- name: comment-spacings
- name: import-shadowing
exclusions:
generated: lax
rules:
- path: (.+)_test.go
linters:
- goconst
- linters:
- lll
path: api/*
- linters:
- dupl
- lll
path: internal/*
- linters:
- dupl
path: test/*
paths:
- third_party$
- builtin$
- examples$
formatters:
enable:
- gofmt
- goimports
exclusions:
generated: lax
paths:
- third_party$
- builtin$
- examples$
22 changes: 22 additions & 0 deletions .lefthook.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
[pre-commit]
parallel = true

[pre-commit.commands.format-just]
run = """
for file in {staged_files}; do
just --justfile "$file" --fmt --unstable
done
"""
glob = ["*.just", ".justfile"]
stage_fixed = true

[pre-commit.commands.format-go]
run = "make lint-fix"
glob = ["*.go"]
tags = "lint"
stage_fixed = true

[pre-commit.commands.format-yaml]
run = "yamlfmt {staged_files}"
glob = ["*.yaml"]
stage_fixed = true
80 changes: 80 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
SHELL = /usr/bin/env bash -o pipefail
.SHELLFLAGS = -ec

.PHONY: all
all: build

##@ General

# The help target prints out all targets with their descriptions organized
# beneath their categories. The categories are represented by '##@' and the
# target descriptions by '##'. The awk command is responsible for reading the
# entire set of makefiles included in this invocation, looking for lines of the
# file as xyz: ## something, and then pretty-format the target and help. Then,
# if there's a line with ##@ something, that gets pretty-printed as a category.
# More info on the usage of ANSI control characters for terminal formatting:
# https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters
# More info on the awk command:
# http://linuxcommand.org/lc3_adv_awk.php

.PHONY: help
help: ## Display this help.
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)

##@ Development

.PHONY: fmt
fmt: ## Run go fmt against code.
go fmt ./...

.PHONY: vet
vet: ## Run go vet against code.
go vet ./...

.PHONY: test
test: ## Run tests.
go test $$(go list ./... ) -coverprofile cover.out

.PHONY: lint
lint: golangci-lint ## Run golangci-lint linter
$(GOLANGCI_LINT) run

.PHONY: lint-fix
lint-fix: golangci-lint ## Run golangci-lint linter and perform fixes
$(GOLANGCI_LINT) run --fix


##@ Dependencies

## Location to install dependencies to
LOCALBIN ?= $(shell pwd)/bin
$(LOCALBIN):
mkdir -p $(LOCALBIN)

## Tool Binaries
GOLANGCI_LINT = $(LOCALBIN)/golangci-lint

## Tool Versions
GOLANGCI_LINT_VERSION ?= v2.9.0

.PHONY: golangci-lint
golangci-lint: $(GOLANGCI_LINT) ## Download golangci-lint locally if necessary.
$(GOLANGCI_LINT): $(LOCALBIN)
$(call go-install-tool,$(GOLANGCI_LINT),github.com/golangci/golangci-lint/v2/cmd/golangci-lint,$(GOLANGCI_LINT_VERSION))


# go-install-tool will 'go install' any package with custom target and name of binary, if it doesn't exist
# $1 - target path with name of binary
# $2 - package url which can be installed
# $3 - specific version of package
define go-install-tool
@[ -f "$(1)-$(3)" ] || { \
set -e; \
package=$(2)@$(3) ;\
echo "Downloading $${package}" ;\
rm -f $(1) || true ;\
GOBIN=$(LOCALBIN) go install $${package} ;\
mv $(1) $(1)-$(3) ;\
} ;\
ln -sf $(1)-$(3) $(1)
endef
9 changes: 8 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,28 @@ require (
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-openapi/jsonpointer v0.21.2 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
github.com/go-openapi/swag v0.23.1 // indirect
github.com/google/gnostic-models v0.7.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/mailru/easyjson v0.9.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/spf13/pflag v1.0.10 // indirect
github.com/x448/float16 v0.8.4 // indirect
go.yaml.in/yaml/v2 v2.4.3 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/net v0.50.0 // indirect
golang.org/x/oauth2 v0.35.0 // indirect
golang.org/x/sys v0.41.0 // indirect
golang.org/x/term v0.40.0 // indirect
golang.org/x/text v0.34.0 // indirect
golang.org/x/time v0.14.0 // indirect
google.golang.org/protobuf v1.36.11 // indirect
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
k8s.io/klog/v2 v2.130.1 // indirect
k8s.io/kube-openapi v0.0.0-20260127142750-a19766b6e2d4 // indirect
Expand Down
18 changes: 17 additions & 1 deletion go.sum
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
Expand All @@ -15,11 +17,15 @@ github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF
github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU=
github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo=
github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8=
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
Expand All @@ -40,6 +46,10 @@ github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFd
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/onsi/ginkgo/v2 v2.27.2 h1:LzwLj0b89qtIy6SSASkzlNvX6WktqurSHwkk2ipF/Ns=
github.com/onsi/ginkgo/v2 v2.27.2/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo=
github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A=
github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
Expand All @@ -59,10 +69,14 @@ go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0=
go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c=
golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU=
golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60=
golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM=
golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ=
golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k=
golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg=
Expand All @@ -71,6 +85,8 @@ golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=
golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=
golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc=
golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg=
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
Expand Down
8 changes: 4 additions & 4 deletions internal/controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,20 +165,20 @@ func (c *Controller) handleEvent(ctx context.Context, cfg *config.Config, obj me
}

// Create and configure endpoint
endpoint := &endpoint.Endpoint{
e := &endpoint.Endpoint{
Name: name,
URL: url,
Interval: cfg.DefaultInterval.String(),
Guarded: c.isGuardedEndpoint(templateData),
}

c.handler.ApplyTemplate(cfg, obj, endpoint)
c.handler.ApplyTemplate(cfg, obj, e)
if templateData != nil {
endpoint.ApplyTemplate(templateData)
e.ApplyTemplate(templateData)
}

// Update state
changed := c.stateManager.AddOrUpdate(key, endpoint, write)
changed := c.stateManager.AddOrUpdate(key, e, write)
if changed {
slog.Info("updated endpoint in state", "resource", resource, "name", name, "namespace", namespace, "write", write)
}
Expand Down
4 changes: 2 additions & 2 deletions internal/resources/definition.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,10 @@ type AutoConfigFunc func(cfg *config.Config) bool
type URLExtractor func(obj metav1.Object) string

// ConditionFunc applies appropriate conditions based on resource type
type ConditionFunc func(cfg *config.Config, obj metav1.Object, endpoint *endpoint.Endpoint)
type ConditionFunc func(cfg *config.Config, obj metav1.Object, e *endpoint.Endpoint)

// GuardedFunc determines if an endpoint should be guarded and applies guarded template
type GuardedFunc func(obj metav1.Object, endpoint *endpoint.Endpoint)
type GuardedFunc func(obj metav1.Object, e *endpoint.Endpoint)

// ParentExtractor gets parent annotations for hierarchical resources
type ParentExtractor func(ctx context.Context, obj metav1.Object, client dynamic.Interface) map[string]string
Expand Down
10 changes: 5 additions & 5 deletions internal/resources/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ type ResourceHandler interface {
// ExtractURL extracts the URL from the resource
ExtractURL(obj metav1.Object) string
// ApplyTemplate applies the resource-specific template to the endpoint
ApplyTemplate(cfg *config.Config, obj metav1.Object, endpoint *endpoint.Endpoint)
ApplyTemplate(cfg *config.Config, obj metav1.Object, e *endpoint.Endpoint)
// GetParentAnnotations retrieves annotations from the parent resource, if applicable
GetParentAnnotations(ctx context.Context, obj metav1.Object) map[string]string
}
Expand Down Expand Up @@ -61,16 +61,16 @@ func (h *Handler) ExtractURL(obj metav1.Object) string {
return h.definition.URLExtractor(obj)
}

func (h *Handler) ApplyTemplate(cfg *config.Config, obj metav1.Object, endpoint *endpoint.Endpoint) {
func (h *Handler) ApplyTemplate(cfg *config.Config, obj metav1.Object, e *endpoint.Endpoint) {
// Apply guarded template if needed
if endpoint.Guarded && h.definition.GuardedFunc != nil {
h.definition.GuardedFunc(obj, endpoint)
if e.Guarded && h.definition.GuardedFunc != nil {
h.definition.GuardedFunc(obj, e)
return
}

// Apply normal conditions
if h.definition.ConditionFunc != nil {
h.definition.ConditionFunc(cfg, obj, endpoint)
h.definition.ConditionFunc(cfg, obj, e)
}
}

Expand Down
16 changes: 8 additions & 8 deletions internal/resources/httproute/httproute.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,23 +72,23 @@ func urlExtractor(obj metav1.Object) string {
return hostname
}

func conditionFunc(cfg *config.Config, obj metav1.Object, endpoint *endpoint.Endpoint) {
endpoint.Conditions = []string{"[STATUS] == 200"}
func conditionFunc(cfg *config.Config, obj metav1.Object, e *endpoint.Endpoint) {
e.Conditions = []string{"[STATUS] == 200"}
}

func guardedFunc(obj metav1.Object, endpoint *endpoint.Endpoint) {
func guardedFunc(obj metav1.Object, e *endpoint.Endpoint) {
if route, ok := obj.(*gatewayv1.HTTPRoute); ok {
applyGuardedTemplate(getFirstHostname(route), endpoint)
applyGuardedTemplate(getFirstHostname(route), e)
}
}

func applyGuardedTemplate(dnsQueryName string, endpoint *endpoint.Endpoint) {
endpoint.URL = dnsTestURL
endpoint.DNS = map[string]any{
func applyGuardedTemplate(dnsQueryName string, e *endpoint.Endpoint) {
e.URL = dnsTestURL
e.DNS = map[string]any{
"query-name": dnsQueryName,
"query-type": dnsQueryType,
}
endpoint.Conditions = []string{dnsEmptyBodyCondition}
e.Conditions = []string{dnsEmptyBodyCondition}
}

func parentExtractor(ctx context.Context, obj metav1.Object, client dynamic.Interface) map[string]string {
Expand Down
16 changes: 8 additions & 8 deletions internal/resources/ingress/ingress.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,23 +76,23 @@ func urlExtractor(obj metav1.Object) string {
return hostname
}

func conditionFunc(cfg *config.Config, obj metav1.Object, endpoint *endpoint.Endpoint) {
endpoint.Conditions = []string{"[STATUS] == 200"}
func conditionFunc(cfg *config.Config, obj metav1.Object, e *endpoint.Endpoint) {
e.Conditions = []string{"[STATUS] == 200"}
}

func guardedFunc(obj metav1.Object, endpoint *endpoint.Endpoint) {
func guardedFunc(obj metav1.Object, e *endpoint.Endpoint) {
if ingress, ok := obj.(*networkingv1.Ingress); ok {
applyGuardedTemplate(getFirstHostname(ingress), endpoint)
applyGuardedTemplate(getFirstHostname(ingress), e)
}
}

func applyGuardedTemplate(dnsQueryName string, endpoint *endpoint.Endpoint) {
endpoint.URL = dnsTestURL
endpoint.DNS = map[string]any{
func applyGuardedTemplate(dnsQueryName string, e *endpoint.Endpoint) {
e.URL = dnsTestURL
e.DNS = map[string]any{
"query-name": dnsQueryName,
"query-type": dnsQueryType,
}
endpoint.Conditions = []string{dnsEmptyBodyCondition}
e.Conditions = []string{dnsEmptyBodyCondition}
}

// Helper functions
Expand Down
Loading