CI / changes (push) Successful in 11s
CI / openapi (push) Has been skipped
CI / go (push) Successful in 59s
CI / docker-web (deploy/docker/evobgp-web/Dockerfile, , evobgp-web) (push) Has been skipped
CI / docker-bird (push) Has been skipped
CI / docker-web (deploy/docker/evobgp-web/Dockerfile, evobgp-all, evobgp-web-all) (push) Has been skipped
CI / bird2 (push) Successful in 43s
CI / docker-go (evobgp-all, 1, deploy/docker/gobinary/Dockerfile, , evobgp-all) (push) Has been skipped
CI / docker-go (evobgp-api, 1, deploy/docker/gobinary/Dockerfile, , evobgp-api) (push) Has been skipped
CI / docker-go (evobgp-deploy, 0, deploy/docker/gobinary/Dockerfile, , evobgp-deploy) (push) Has been skipped
CI / docker-go (evobgp-ingest, 0, deploy/docker/gobinary/Dockerfile, , evobgp-ingest) (push) Has been skipped
CI / docker-go (evobgp-node, 0, deploy/docker/gobinary/Dockerfile, , evobgp-node) (push) Has been skipped
CI / docker-go (evobgp-render, 0, deploy/docker/gobinary/Dockerfile, , evobgp-render) (push) Has been skipped
CI / docker-go (evobgp-scheduler, 0, deploy/docker/gobinary/Dockerfile, , evobgp-scheduler) (push) Has been skipped
CI / docker-go-prime (push) Successful in 55s
CI / docker-go (deploy/docker/evobgp-agent/Dockerfile, , evobgp-agent) (push) Has been cancelled
Implemented a new endpoint for tenant refresh in the HTTP API, allowing for the refresh of modules associated with a tenant. Enhanced job processing to handle tenant refresh jobs, including logic for managing module IDs and job status updates. Updated the scheduler to enqueue tenant refresh jobs based on module due dates, improving the overall efficiency of module management. Additionally, introduced caching for ASN prefix data to optimize performance during refresh operations.
65 lines
1.7 KiB
Go
65 lines
1.7 KiB
Go
package pipeline
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"sync/atomic"
|
|
"testing"
|
|
"time"
|
|
|
|
"evobgp/internal/store"
|
|
)
|
|
|
|
func TestResolveASNForEntry_UsesTTLCache(t *testing.T) {
|
|
m := store.NewMemory()
|
|
t.Setenv("EVOBGP_ASN_CACHE_TTL_SEC", "3600")
|
|
|
|
var calls atomic.Int32
|
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
calls.Add(1)
|
|
if strings.Contains(r.URL.Path, "/announced") {
|
|
_, _ = w.Write([]byte(`{"status":"ok","data":{"prefixes":[{"prefix":"203.0.113.0/24"}]}}`))
|
|
return
|
|
}
|
|
_, _ = w.Write([]byte(`{"status":"ok","data":{"holder":"Test AS"}}`))
|
|
}))
|
|
defer srv.Close()
|
|
t.Setenv("EVOBGP_RIPESTAT_ANNOUNCED_PREFIXES_URL", srv.URL+"/announced")
|
|
t.Setenv("EVOBGP_RIPESTAT_AS_OVERVIEW_URL", srv.URL+"/overview")
|
|
|
|
ctx := context.Background()
|
|
hc := srv.Client()
|
|
p1, h1, err := resolveASNForEntry(ctx, m, hc, 64512)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(p1) != 1 || h1 != "Test AS" {
|
|
t.Fatalf("unexpected first resolve: %+v holder=%q", p1, h1)
|
|
}
|
|
if calls.Load() < 2 {
|
|
t.Fatalf("expected ripestat calls on first resolve, got %d", calls.Load())
|
|
}
|
|
firstCalls := calls.Load()
|
|
_, _, err = resolveASNForEntry(ctx, m, hc, 64512)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if calls.Load() != firstCalls {
|
|
t.Fatalf("expected cache hit (no new HTTP), calls went from %d to %d", firstCalls, calls.Load())
|
|
}
|
|
}
|
|
|
|
func TestModuleDueForScheduler_BucketRollover(t *testing.T) {
|
|
mod := &store.Module{Enabled: true, Type: "CDN_CIDRS", RefreshIntervalSec: 300}
|
|
boundary := time.Unix(300, 0)
|
|
if !ModuleDueForScheduler(mod, boundary) {
|
|
t.Fatal("expected due when refresh bucket rolls")
|
|
}
|
|
mid := time.Unix(330, 0)
|
|
if ModuleDueForScheduler(mod, mid) {
|
|
t.Fatal("expected not due within same bucket")
|
|
}
|
|
}
|