Skip to content

Commit

Permalink
updated error handling for query
Browse files Browse the repository at this point in the history
Signed-off-by: Dhruv-J <[email protected]>
  • Loading branch information
Dhruv-J committed Feb 12, 2025
1 parent 6b4339f commit 9bacd69
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 8 deletions.
10 changes: 8 additions & 2 deletions pkg/agent/apiserver/handlers/fqdncache/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"encoding/json"
"net/http"
"net/url"
"regexp"

"k8s.io/klog/v2"

Expand All @@ -27,7 +28,7 @@ import (

func HandleFunc(npq querier.AgentNetworkPolicyInfoQuerier) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
fqdnFilter := newFilterFromURLQuery(r.URL.Query())
fqdnFilter := newFilterFromURLQuery(w, r.URL.Query())
dnsEntryCache := npq.GetFQDNCache(fqdnFilter)
resp := make([]agentapi.FQDNCacheResponse, 0, len(dnsEntryCache))
for _, entry := range dnsEntryCache {
Expand All @@ -44,9 +45,14 @@ func HandleFunc(npq querier.AgentNetworkPolicyInfoQuerier) http.HandlerFunc {
}
}

func newFilterFromURLQuery(query url.Values) *querier.FQDNCacheFilter {
func newFilterFromURLQuery(w http.ResponseWriter, query url.Values) *querier.FQDNCacheFilter {
if len(query) == 0 {
return nil
}
_, err := regexp.Compile(query.Get("domain"))
if err != nil {
http.Error(w, "Regex formatted incorrectly to parse: "+err.Error(), http.StatusPreconditionFailed)
klog.ErrorS(err, "Regex formatted incorrectly to parse")
}
return &querier.FQDNCacheFilter{Domain: query.Get("domain")}
}
48 changes: 48 additions & 0 deletions pkg/agent/apiserver/handlers/fqdncache/handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"net"
"net/http"
"net/http/httptest"
"net/url"
"testing"
"time"

Expand All @@ -28,6 +29,7 @@ import (

"antrea.io/antrea/pkg/agent/apis"
"antrea.io/antrea/pkg/agent/types"
"antrea.io/antrea/pkg/querier"
queriertest "antrea.io/antrea/pkg/querier/testing"
)

Expand Down Expand Up @@ -108,3 +110,49 @@ func TestFqdnCacheQuery(t *testing.T) {
})
}
}

func TestNewFilterFromURLQuery(t *testing.T) {
tests := []struct {
name string
queryParams url.Values
expectedFilter *querier.FQDNCacheFilter
expectedStatus int
}{
{
name: "Empty query",
queryParams: url.Values{},
expectedFilter: nil,
expectedStatus: http.StatusOK, // No HTTP error
},
{
name: "Valid regex domain",
queryParams: url.Values{
"domain": {"^example\\.com$"},
},
expectedFilter: &querier.FQDNCacheFilter{Domain: "^example\\.com$"},
expectedStatus: http.StatusOK, // No HTTP error
},
{
name: "Invalid regex domain",
queryParams: url.Values{
"domain": {"[invalid("},
},
expectedFilter: &querier.FQDNCacheFilter{Domain: "[invalid("}, // Should still return filter, despite error
expectedStatus: http.StatusPreconditionFailed, // HTTP error expected
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
recorder := httptest.NewRecorder()
result := newFilterFromURLQuery(recorder, tt.queryParams)

assert.Equal(t, tt.expectedFilter, result)
assert.Equal(t, tt.expectedStatus, recorder.Code)

if tt.expectedStatus != http.StatusOK {
require.Contains(t, recorder.Body.String(), "Regex formatted incorrectly to parse")
}
})
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -543,15 +543,10 @@ func NewNetworkPolicyController(antreaClientGetter client.AntreaClientProvider,
func (c *Controller) GetFQDNCache(fqdnFilter *querier.FQDNCacheFilter) []types.DnsCacheEntry {
cacheEntryList := []types.DnsCacheEntry{}
var pattern *regexp.Regexp
var err error
if fqdnFilter != nil {
// have to convert human readable regex, i.e. *.example.com into regex that can be used
regexPattern := "^" + strings.ReplaceAll(regexp.QuoteMeta(fqdnFilter.Domain), `\*`, ".*") + "$"
pattern, err = regexp.Compile(regexPattern)
if err != nil {
// this pattern will match no strings if there is an error with the regex formatting or usage with the user specified --domain flag
pattern = regexp.MustCompile(`a\A`)
}
pattern, _ = regexp.Compile(regexPattern)
}
for fqdn, dnsMeta := range c.fqdnController.dnsEntryCache {
for _, ipWithExpiration := range dnsMeta.responseIPs {
Expand Down

0 comments on commit 9bacd69

Please sign in to comment.