diff --git a/cmd/bingo/bingo.go b/cmd/bingo/bingo.go index a11ced8..973046a 100644 --- a/cmd/bingo/bingo.go +++ b/cmd/bingo/bingo.go @@ -7,6 +7,7 @@ import ( "runtime" "time" + mapset "github.com/deckarep/golang-set/v2" "github.com/n6g7/bingo/internal/config" "github.com/n6g7/bingo/internal/nameserver" "github.com/n6g7/bingo/internal/proxy" @@ -87,7 +88,7 @@ func bingo(logger *log.Logger, ns nameserver.Nameserver, prox proxy.Proxy, conf logger.Error("error loading records from nameserver", "err", err) return } - newNSDomains := reconcile.NewDomainSet() + newNSDomains := mapset.NewSet[string]() for _, record := range records { // We only manage service domains if !conf.IsServiceDomain(record.Name) { @@ -109,7 +110,7 @@ func bingo(logger *log.Logger, ns nameserver.Nameserver, prox proxy.Proxy, conf logger.Error("error loading services from proxy", "err", err) return } - newProxyDomains := reconcile.NewDomainSet() + newProxyDomains := mapset.NewSet[string]() for _, service := range services { // We only manage service domains if !conf.IsServiceDomain(service.Domain) { diff --git a/go.mod b/go.mod index 69e68cd..f164551 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,9 @@ toolchain go1.21.5 require ( github.com/aws/aws-sdk-go-v2/config v1.18.8 github.com/aws/aws-sdk-go-v2/service/route53 v1.26.0 + github.com/deckarep/golang-set/v2 v2.6.0 github.com/lizongying/go-xpath v0.0.0-20221013102623-3e55fa3ceeed + github.com/mitchellh/mapstructure v1.5.0 github.com/n6g7/nomtail v0.2.0 github.com/prometheus/client_golang v1.17.0 github.com/spf13/viper v1.14.0 @@ -36,7 +38,6 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/magiconair/properties v1.8.6 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.5 // indirect github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect diff --git a/go.sum b/go.sum index 2479ebf..1d39ebc 100644 --- a/go.sum +++ b/go.sum @@ -83,6 +83,8 @@ github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnht github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= diff --git a/internal/proxy/traefik.go b/internal/proxy/traefik.go index b9ea71c..d7a83af 100644 --- a/internal/proxy/traefik.go +++ b/internal/proxy/traefik.go @@ -8,8 +8,8 @@ import ( "regexp" "strings" + mapset "github.com/deckarep/golang-set/v2" "github.com/n6g7/bingo/internal/config" - "github.com/n6g7/bingo/internal/set" "golang.org/x/exp/slices" ) @@ -17,7 +17,7 @@ type TraefikProxy struct { hosts []string adminPort uint16 scheme string - entryPoints *set.Set[string] + entryPoints mapset.Set[string] regexp *regexp.Regexp } @@ -26,7 +26,7 @@ func NewTraefikProxy(conf config.TraefikConf) *TraefikProxy { hosts: conf.Hosts, adminPort: conf.AdminPort, scheme: conf.Scheme, - entryPoints: set.NewSet(conf.EntryPoints), + entryPoints: mapset.NewSet[string](conf.EntryPoints...), } } @@ -86,8 +86,8 @@ func (t *TraefikProxy) ListServices() ([]Service, error) { continue } // Only track services on specified entrypoints - inter := set.NewSet(router.EntryPoints).Inter(t.entryPoints) - if inter.Length() == 0 { + inter := mapset.NewSet[string](router.EntryPoints...).Intersect(t.entryPoints) + if inter.Cardinality() == 0 { continue } diff --git a/internal/reconcile/domain_set.go b/internal/reconcile/domain_set.go deleted file mode 100644 index 2290622..0000000 --- a/internal/reconcile/domain_set.go +++ /dev/null @@ -1,9 +0,0 @@ -package reconcile - -import "github.com/n6g7/bingo/internal/set" - -type DomainSet = set.Set[string] - -func NewDomainSet() *DomainSet { - return set.NewSet([]string{}) -} diff --git a/internal/reconcile/reconciler.go b/internal/reconcile/reconciler.go index 8da4483..e373589 100644 --- a/internal/reconcile/reconciler.go +++ b/internal/reconcile/reconciler.go @@ -5,6 +5,7 @@ import ( "reflect" "time" + mapset "github.com/deckarep/golang-set/v2" "github.com/n6g7/bingo/internal/config" "github.com/n6g7/bingo/internal/nameserver" "github.com/n6g7/bingo/internal/proxy" @@ -30,15 +31,15 @@ var ( type Reconciler struct { logger *log.Logger - nameserverDomains *DomainSet - proxyDomains *DomainSet + nameserverDomains mapset.Set[string] + proxyDomains mapset.Set[string] needsDiff bool proxyBackend proxy.Proxy nsBackend nameserver.Nameserver lastReconciliation time.Time minimumWait time.Duration loopTimeout time.Duration - deletionQueue *DomainSet + deletionQueue mapset.Set[string] conf *config.Config } @@ -49,22 +50,22 @@ func NewReconciler( conf *config.Config, ) *Reconciler { return &Reconciler{ - logger.With("component", "reconciler"), - nil, - nil, - false, - prox, - ns, - time.Unix(0, 0), - conf.ReconciliationTimeout, - conf.ReconcilerLoopTimeout, - NewDomainSet(), - conf, + logger: logger.With("component", "reconciler"), + nameserverDomains: nil, + proxyDomains: nil, + needsDiff: false, + proxyBackend: prox, + nsBackend: ns, + lastReconciliation: time.Unix(0, 0), + minimumWait: conf.ReconciliationTimeout, + loopTimeout: conf.ReconcilerLoopTimeout, + deletionQueue: mapset.NewSet[string](), + conf: conf, } } -func (r *Reconciler) SetNameserverDomains(nsDomains *DomainSet) { - r.logger.Trace("received NS domains", "domains", nsDomains.AsSlice()) +func (r *Reconciler) SetNameserverDomains(nsDomains mapset.Set[string]) { + r.logger.Trace("received NS domains", "domains", nsDomains.ToSlice()) if reflect.DeepEqual(nsDomains, r.nameserverDomains) { return } @@ -72,8 +73,8 @@ func (r *Reconciler) SetNameserverDomains(nsDomains *DomainSet) { r.needsDiff = true } -func (r *Reconciler) SetProxyDomains(proxyDomains *DomainSet) { - r.logger.Trace("received proxy domains", "domains", proxyDomains.AsSlice()) +func (r *Reconciler) SetProxyDomains(proxyDomains mapset.Set[string]) { + r.logger.Trace("received proxy domains", "domains", proxyDomains.ToSlice()) if reflect.DeepEqual(proxyDomains, r.proxyDomains) { return } @@ -86,7 +87,7 @@ func (r *Reconciler) MarkForDeletion(domain string) { r.needsDiff = true } -func (r *Reconciler) Diff() (toCreate *DomainSet, toDelete *DomainSet) { +func (r *Reconciler) Diff() (toCreate mapset.Set[string], toDelete mapset.Set[string]) { if r.nameserverDomains == nil { r.logger.Debug("reconciler not ready to diff, no nameserver domains yet") return nil, nil @@ -96,15 +97,15 @@ func (r *Reconciler) Diff() (toCreate *DomainSet, toDelete *DomainSet) { return nil, nil } - toDelete = r.nameserverDomains.Diff(r.proxyDomains).Union(r.deletionQueue) // NS - P + D - toCreate = r.proxyDomains.Diff(r.nameserverDomains).Union(r.deletionQueue.Inter(r.proxyDomains)) // P - NS + (D&P) + toDelete = r.nameserverDomains.Difference(r.proxyDomains).Union(r.deletionQueue) // NS - P + D + toCreate = r.proxyDomains.Difference(r.nameserverDomains).Union(r.deletionQueue.Intersect(r.proxyDomains)) // P - NS + (D&P) - managedGauge.Set(float64(r.proxyDomains.Length())) + managedGauge.Set(float64(r.proxyDomains.Cardinality())) return } -func (r *Reconciler) Reconcile(toCreate, toDelete *DomainSet) error { +func (r *Reconciler) Reconcile(toCreate, toDelete mapset.Set[string]) error { r.lastReconciliation = time.Now() // Start by deleting, gives us a chance to immediately recreate domains in @@ -151,7 +152,7 @@ func (r *Reconciler) Run() error { if r.needsDiff { toCreate, toDelete := r.Diff() - if (toCreate == nil || toCreate.Length() == 0) && (toDelete == nil || toDelete.Length() == 0) { + if (toCreate == nil || toCreate.Cardinality() == 0) && (toDelete == nil || toDelete.Cardinality() == 0) { if !previouslyInSync { r.logger.Info("proxy and nameserver are in sync") previouslyInSync = true @@ -171,7 +172,7 @@ func (r *Reconciler) Run() error { if err != nil { r.logger.Error("error during reconciliation, will attempt again", "err", err) } else { - r.deletionQueue = NewDomainSet() + r.deletionQueue = mapset.NewSet[string]() r.needsDiff = false } tooEarlyWarningSent = false diff --git a/internal/set/set.go b/internal/set/set.go deleted file mode 100644 index 42b66e6..0000000 --- a/internal/set/set.go +++ /dev/null @@ -1,83 +0,0 @@ -package set - -type Set[T comparable] struct { - m map[T]bool -} - -func NewSet[T comparable](vals []T) *Set[T] { - s := &Set[T]{make(map[T]bool)} - for _, v := range vals { - s.Add(v) - } - return s -} - -func (s *Set[T]) Length() int { - return len(s.m) -} - -func (s *Set[T]) Add(val T) { - s.m[val] = true -} - -func (s *Set[T]) Iter() chan T { - ch := make(chan T) - go func() { - defer close(ch) - for v := range s.m { - ch <- v - } - }() - return ch -} - -func (s *Set[T]) Contains(key T) bool { - val, found := s.m[key] - return found && val -} - -func (s *Set[T]) AsSlice() (slice []T) { - for item := range s.Iter() { - slice = append(slice, item) - } - return -} - -func (s *Set[T]) Inter(other *Set[T]) (inter *Set[T]) { - var small, big *Set[T] - if s.Length() < other.Length() { - small = s - big = other - } else { - small = other - big = s - } - inter = NewSet([]T{}) - for v := range small.Iter() { - if big.Contains(v) { - inter.Add(v) - } - } - return -} - -func (s *Set[T]) Union(other *Set[T]) (union *Set[T]) { - union = NewSet([]T{}) - for v := range s.Iter() { - union.Add(v) - } - for v := range other.Iter() { - union.Add(v) - } - return -} - -func (s *Set[T]) Diff(other *Set[T]) *Set[T] { - diff := NewSet([]T{}) - for v := range s.m { - if _, found := other.m[v]; !found { - diff.Add(v) - } - } - return diff -}