good morning!!!!

Skip to content
Snippets Groups Projects
Commit 06d425f5 authored by Garet Halliday's avatar Garet Halliday
Browse files

generic filters

parent 487a5da6
No related branches found
No related tags found
No related merge requests found
package gatcaddyfile
import (
"github.com/caddyserver/caddy/v2"
"github.com/caddyserver/caddy/v2/caddyconfig"
"github.com/caddyserver/caddy/v2/caddyconfig/caddyfile"
"gfx.cafe/gfx/pggat/lib/gat/handlers/discovery/discoverers/digitalocean/filters/tag"
"gfx.cafe/gfx/pggat/lib/util/strutil"
)
func init() {
RegisterDirective(
DigitaloceanFilter,
"tag",
func(d *caddyfile.Dispenser, _ *[]caddyconfig.Warning) (caddy.Module, error) {
if !d.NextArg() {
return nil, d.ArgErr()
}
return &tag.Filter{
Tag: strutil.Matcher(d.Val()),
}, nil
},
)
}
......@@ -8,7 +8,6 @@ import (
"gfx.cafe/gfx/pggat/lib/gat/handlers/discovery/discoverers/digitalocean"
"gfx.cafe/gfx/pggat/lib/gat/handlers/discovery/discoverers/google_cloud_sql"
"gfx.cafe/gfx/pggat/lib/gat/handlers/discovery/discoverers/zalando_operator"
"gfx.cafe/gfx/pggat/lib/util/strutil"
)
func init() {
......@@ -53,7 +52,16 @@ func init() {
return nil, d.ArgErr()
}
module.Filter = strutil.Matcher(d.Val())
var err error
module.Filter, err = UnmarshalDirectiveJSONModuleObject(
d,
DigitaloceanFilter,
"filter",
warnings,
)
if err != nil {
return nil, err
}
default:
return nil, d.ArgErr()
}
......
......@@ -11,13 +11,14 @@ import (
)
const (
Discoverer = "pggat.handlers.discovery.discoverers"
Handler = "pggat.handlers"
Matcher = "pggat.matchers"
Pool = "pggat.handlers.pool.pools"
Pooler = "pggat.handlers.pool.poolers"
SSLServer = "pggat.ssl.servers"
SSLClient = "pggat.ssl.clients"
Discoverer = "pggat.handlers.discovery.discoverers"
DigitaloceanFilter = "pggat.handlers.discovery.discoverers.digitalocean.filters"
Handler = "pggat.handlers"
Matcher = "pggat.matchers"
Pool = "pggat.handlers.pool.pools"
Pooler = "pggat.handlers.pool.poolers"
SSLServer = "pggat.ssl.servers"
SSLClient = "pggat.ssl.clients"
)
var unmarshallers maps.TwoKey[string, string, Unmarshaller]
......
package digitalocean
import "gfx.cafe/gfx/pggat/lib/util/strutil"
import (
"encoding/json"
)
type Config struct {
APIKey string `json:"api_key"`
Private bool `json:"private,omitempty"`
Filter strutil.Matcher `json:"filter,omitempty"`
Filter json.RawMessage `json:"filter,omitempty" caddy:"namespace=pggat.handlers.discovery.discoverers.digitalocean.filters inline_key=filter"`
}
......@@ -2,6 +2,7 @@ package digitalocean
import (
"context"
"fmt"
"net"
"strconv"
......@@ -18,6 +19,8 @@ func init() {
type Discoverer struct {
Config
filter Filter
do *godo.Client
}
......@@ -31,17 +34,16 @@ func (T *Discoverer) CaddyModule() caddy.ModuleInfo {
}
func (T *Discoverer) Provision(ctx caddy.Context) error {
T.do = godo.NewFromToken(T.APIKey)
return nil
}
func (T *Discoverer) filter(tags []string) bool {
for _, tag := range tags {
if T.Filter.Matches(tag) {
return true
if T.Filter != nil {
val, err := ctx.LoadModule(T, "Filter")
if err != nil {
return fmt.Errorf("loading filter module: %v", err)
}
T.filter = val.(Filter)
}
return T.Filter.Matches("")
T.do = godo.NewFromToken(T.APIKey)
return nil
}
func (T *Discoverer) Clusters() ([]discovery.Cluster, error) {
......@@ -57,7 +59,7 @@ func (T *Discoverer) Clusters() ([]discovery.Cluster, error) {
}
// filter by tags
if !T.filter(cluster.Tags) {
if T.filter != nil && !T.filter.Allow(cluster) {
continue
}
......@@ -92,7 +94,7 @@ func (T *Discoverer) Clusters() ([]discovery.Cluster, error) {
c.Replicas = make(map[string]discovery.Node, len(replicas))
for _, replica := range replicas {
// filter by tags
if !T.filter(replica.Tags) {
if T.filter != nil && !T.filter.AllowReplica(replica) {
continue
}
......
package digitalocean
import "github.com/digitalocean/godo"
type Filter interface {
Allow(database godo.Database) bool
AllowReplica(database godo.DatabaseReplica) bool
}
package tag
import (
"github.com/caddyserver/caddy/v2"
"github.com/digitalocean/godo"
"gfx.cafe/gfx/pggat/lib/gat/handlers/discovery/discoverers/digitalocean"
"gfx.cafe/gfx/pggat/lib/util/strutil"
)
func init() {
caddy.RegisterModule((*Filter)(nil))
}
type Filter struct {
Tag strutil.Matcher `json:"tag"`
}
func (T *Filter) CaddyModule() caddy.ModuleInfo {
return caddy.ModuleInfo{
ID: "pggat.handlers.discovery.discoverers.digitalocean.filters.tag",
New: func() caddy.Module {
return new(Filter)
},
}
}
func (T *Filter) Allow(database godo.Database) bool {
for _, tag := range database.Tags {
if T.Tag.Matches(tag) {
return true
}
}
return false
}
func (T *Filter) AllowReplica(database godo.DatabaseReplica) bool {
for _, tag := range database.Tags {
if T.Tag.Matches(tag) {
return true
}
}
return false
}
var _ digitalocean.Filter = (*Filter)(nil)
var _ caddy.Module = (*Filter)(nil)
......@@ -34,6 +34,9 @@ import (
_ "gfx.cafe/gfx/pggat/lib/gat/handlers/discovery/discoverers/google_cloud_sql"
_ "gfx.cafe/gfx/pggat/lib/gat/handlers/discovery/discoverers/zalando_operator"
// digitalocean filters
_ "gfx.cafe/gfx/pggat/lib/gat/handlers/discovery/discoverers/digitalocean/filters/tag"
// poolers
_ "gfx.cafe/gfx/pggat/lib/gat/handlers/pool/poolers/lifo"
_ "gfx.cafe/gfx/pggat/lib/gat/handlers/pool/poolers/rob"
......
......@@ -72,7 +72,7 @@ func testStarver(sched *Scheduler, tab *ShareTable, id int, dur time.Duration) {
}
func similar(v0, v1 int, vn ...int) bool {
const margin = 0.25 // 25% margin of error
const margin = 0.5 // 50% margin of error
minimum := v0
maximum := v0
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment