HTTPS-only CDN URLs; блокировка private/loopback/metadata IP и DNS-resolve на fetch; проверка в httpapi при create/preview/patch CDN sources. Co-authored-by: Cursor <[email protected]>
73 lines
2.1 KiB
Go
73 lines
2.1 KiB
Go
package pipeline
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"evobgp/internal/store"
|
|
)
|
|
|
|
func TestCollectCDNPrefixRows_StaleOnFetchError(t *testing.T) {
|
|
t.Setenv("EVOBGP_STALE_ON_UPSTREAM_ERROR", "1")
|
|
t.Setenv("EVOBGP_CDN_ALLOW_PRIVATE", "1")
|
|
|
|
srv := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
http.Error(w, "upstream down", http.StatusServiceUnavailable)
|
|
}))
|
|
defer srv.Close()
|
|
|
|
st := store.NewMemory()
|
|
st.SeedDemo()
|
|
tenant, _, _, _, _ := st.DemoIDs()
|
|
mod, err := st.CreateModule(tenant, &store.Module{Type: "CDN_CIDRS", Name: "cdn", Enabled: true})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := st.CreateCDNSource(tenant, mod.ID, &store.CDNSource{
|
|
ID: "s1", URL: srv.URL, SourceKind: "plain",
|
|
}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
prior := []store.PrefixRow{
|
|
{Prefix: "203.0.113.0/24", Source: "cdn:s1"},
|
|
}
|
|
rows, err := collectCDNPrefixRows(context.Background(), st, srv.Client(), tenant, mod, []*store.CDNSource{{ID: "s1", URL: srv.URL, SourceKind: "plain"}}, prior)
|
|
if err != nil {
|
|
t.Fatalf("expected stale fallback, got err: %v", err)
|
|
}
|
|
if len(rows) != 1 || rows[0].Prefix != "203.0.113.0/24" {
|
|
t.Fatalf("unexpected rows: %+v", rows)
|
|
}
|
|
}
|
|
|
|
func TestCollectCDNPrefixRows_FailFastWhenNoStale(t *testing.T) {
|
|
t.Setenv("EVOBGP_STALE_ON_UPSTREAM_ERROR", "0")
|
|
t.Setenv("EVOBGP_CDN_ALLOW_PRIVATE", "1")
|
|
|
|
srv := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
http.Error(w, "upstream down", http.StatusServiceUnavailable)
|
|
}))
|
|
defer srv.Close()
|
|
|
|
st := store.NewMemory()
|
|
st.SeedDemo()
|
|
tenant, _, _, _, _ := st.DemoIDs()
|
|
mod, err := st.CreateModule(tenant, &store.Module{Type: "CDN_CIDRS", Name: "cdn", Enabled: true})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := st.CreateCDNSource(tenant, mod.ID, &store.CDNSource{
|
|
ID: "s1", URL: srv.URL, SourceKind: "plain",
|
|
}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
_, err = collectCDNPrefixRows(context.Background(), st, srv.Client(), tenant, mod, []*store.CDNSource{{ID: "s1", URL: srv.URL, SourceKind: "plain"}}, nil)
|
|
if err == nil {
|
|
t.Fatal("expected error when stale disabled and no cache")
|
|
}
|
|
}
|