Skip to content
This repository was archived by the owner on Dec 2, 2025. It is now read-only.

Commit de09866

Browse files
authored
Merge pull request #33 from f5devcentral/mirror
Enhance devops with adding dumping and trailing support.
2 parents c6a6155 + 8adb242 commit de09866

File tree

3 files changed

+38
-109
lines changed

3 files changed

+38
-109
lines changed

main.go

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,8 @@ func main() {
131131
prometheus.MustRegister(utils.FunctionDurationTimeCostTotal)
132132
prometheus.MustRegister(f5_bigip.BIGIPiControlTimeCostCount)
133133
prometheus.MustRegister(f5_bigip.BIGIPiControlTimeCostTotal)
134-
mgr.AddMetricsExtraHandler("/stats", promhttp.Handler())
135-
mgr.AddMetricsExtraHandler("/runtime", dumpRuntimeHandler())
134+
mgr.AddMetricsExtraHandler("/stats/", promhttp.Handler())
135+
mgr.AddMetricsExtraHandler("/runtime/", dumpRuntimeHandler())
136136

137137
setupReconcilers(mgr)
138138
if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil {
@@ -329,6 +329,7 @@ func setupBIGIPs(credsDir, confDir string) error {
329329
}
330330

331331
func dumpRuntimeHandler() http.HandlerFunc {
332+
slog := utils.LogFromContext(context.TODO())
332333
if level != utils.LogLevel_Type_DEBUG {
333334
return func(w http.ResponseWriter, r *http.Request) {
334335
w.Header().Add("Content-Type", "application/json")
@@ -338,12 +339,38 @@ func dumpRuntimeHandler() http.HandlerFunc {
338339
} else {
339340
return func(w http.ResponseWriter, r *http.Request) {
340341
w.Header().Add("Content-Type", "application/json")
341-
if rlt, err := pkg.ActiveSIGs.DumpsAllResources(); err != nil {
342-
w.WriteHeader(400)
343-
fmt.Fprintf(w, `{"error": "failed to dump runtime objects: %s"}`, err.Error())
344-
} else {
342+
slog.Debugf("dumping request: %s?%s", r.URL.Path, r.URL.Query().Encode())
343+
if r.URL.Path == "/runtime/" {
345344
w.WriteHeader(200)
346-
d, _ := json.MarshalIndent(rlt, "", " ")
345+
d, _ := json.MarshalIndent(pkg.ActiveSIGs, "", " ")
346+
fmt.Fprintf(w, "%s", string(d))
347+
return
348+
} else if strings.HasPrefix(r.URL.Path, "/runtime/trail") {
349+
rlts := map[string]interface{}{}
350+
351+
queries := r.URL.Query()
352+
for k, v := range queries {
353+
switch k {
354+
case "gatewayclass":
355+
for _, cls := range v {
356+
gwc := pkg.ActiveSIGs.GetGatewayClass(cls)
357+
gws := pkg.ActiveSIGs.AttachedGateways(gwc)
358+
if rlt, err := pkg.ParseGatewayRelatedForClass(cls, gws); err != nil {
359+
w.WriteHeader(500)
360+
fmt.Fprintf(w, `{"error": "failed to parse gateway class: %s: %s"}`, cls, err.Error())
361+
return
362+
} else {
363+
rlts[cls] = rlt
364+
}
365+
}
366+
default:
367+
w.WriteHeader(400)
368+
fmt.Fprintf(w, `{"error": "%s"}`, fmt.Sprintf("unsupported query type %s", k))
369+
return
370+
}
371+
}
372+
w.WriteHeader(200)
373+
d, _ := json.MarshalIndent(rlts, "", " ")
347374
fmt.Fprintf(w, "%s", string(d))
348375
}
349376
}

pkg/cache.go

Lines changed: 0 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package pkg
22

33
import (
44
"context"
5-
"encoding/json"
65
"fmt"
76
"os"
87
"reflect"
@@ -669,101 +668,3 @@ func (c *SIGCache) SyncAllResources(mgr manager.Manager) {
669668
slog.Infof("Finished syncing resources to local")
670669
c.SyncedAtStart = true
671670
}
672-
673-
func (c *SIGCache) DumpsAllResources() (map[string]interface{}, error) {
674-
defer utils.TimeItToPrometheus()()
675-
676-
c.mutex.Lock()
677-
defer c.mutex.Unlock()
678-
679-
rlt := map[string]interface{}{}
680-
681-
dump := func(k string, v interface{}, rlt *map[string]interface{}) error {
682-
if b, err := json.Marshal(v); err != nil {
683-
return fmt.Errorf("failed to dump %s: %s", k, err.Error())
684-
} else {
685-
var d map[string]interface{}
686-
if err := json.Unmarshal(b, &d); err != nil {
687-
return fmt.Errorf("failed to unmarshal data from sigcache: %s", err)
688-
} else {
689-
(*rlt)[k] = d
690-
}
691-
}
692-
return nil
693-
}
694-
695-
// TODO: use reflect to deduplicate the following code.
696-
697-
// Namespace
698-
namespaces := map[string]interface{}{}
699-
for k, v := range c.Namespace {
700-
if err := dump(k, v, &namespaces); err != nil {
701-
return nil, err
702-
}
703-
}
704-
rlt["Namespace"] = namespaces
705-
706-
// Endpoints
707-
endpoints := map[string]interface{}{}
708-
for k, v := range c.Endpoints {
709-
if err := dump(k, v, &endpoints); err != nil {
710-
return nil, err
711-
}
712-
}
713-
rlt["Endpoints"] = endpoints
714-
715-
// Service
716-
services := map[string]interface{}{}
717-
for k, v := range c.Service {
718-
if err := dump(k, v, &services); err != nil {
719-
return nil, err
720-
}
721-
}
722-
rlt["Service"] = services
723-
724-
// Gateway
725-
gateways := map[string]interface{}{}
726-
for k, v := range c.Gateway {
727-
if err := dump(k, v, &gateways); err != nil {
728-
return nil, err
729-
}
730-
}
731-
rlt["Gateway"] = gateways
732-
733-
// GatewayClass
734-
gatewayclasses := map[string]interface{}{}
735-
for k, v := range c.GatewayClass {
736-
if err := dump(k, v, &gatewayclasses); err != nil {
737-
return nil, err
738-
}
739-
}
740-
rlt["GatewayClass"] = gatewayclasses
741-
742-
// HTTPRoute
743-
httproutes := map[string]interface{}{}
744-
for k, v := range c.HTTPRoute {
745-
if err := dump(k, v, &httproutes); err != nil {
746-
return nil, err
747-
}
748-
}
749-
rlt["HTTPRoute"] = httproutes
750-
751-
// ReferenceGrant
752-
referencegrants := map[string]interface{}{}
753-
for k, v := range c.ReferenceGrant {
754-
if err := dump(k, v, &referencegrants); err != nil {
755-
return nil, err
756-
}
757-
}
758-
rlt["ReferenceGrant"] = referencegrants
759-
760-
// ControllerName
761-
rlt["ControllerName"] = c.ControllerName
762-
763-
// refFromTo
764-
if err := dump("refFromTo", refFromTo, &rlt); err != nil {
765-
return nil, err
766-
}
767-
768-
return rlt, nil
769-
}

pkg/irule_templates/rules.tmpl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@
3030
*/}}
3131
if { {{ parseMatches $Rule.Matches }} } {
3232
{{ parseReqFilters $Rule.Filters $hr }}
33-
34-
set pool $static::pools_{{ $RuleIndex }}([expr {int(rand()*$static::pools_{{ $RuleIndex }}_size)}])
35-
pool $pool
33+
if { $static::pools_{{ $RuleIndex }}_size != 0 }{
34+
set pool $static::pools_{{ $RuleIndex }}([expr {int(rand()*$static::pools_{{ $RuleIndex }}_size)}])
35+
pool $pool
36+
}
3637
return
3738
}
3839
{{ end }}

0 commit comments

Comments
 (0)