1
0
Fork 0

Nomad provider to allow empty services

This commit is contained in:
chrispruitt 2024-04-04 05:54:04 -04:00 committed by GitHub
parent 2c6418e17a
commit ac1753a614
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
41 changed files with 3540 additions and 87 deletions

View file

@ -2,8 +2,11 @@ package nomad
import (
"context"
"fmt"
"net/http"
"net/http/httptest"
"os"
"path/filepath"
"strings"
"testing"
@ -12,6 +15,17 @@ import (
"github.com/traefik/traefik/v3/pkg/types"
)
var responses = map[string][]byte{}
func TestMain(m *testing.M) {
err := setup()
if err != nil {
fmt.Fprintf(os.Stderr, "%s", err.Error())
os.Exit(1)
}
m.Run()
}
func Test_globalConfig(t *testing.T) {
cases := []struct {
Name string
@ -131,15 +145,311 @@ func TestProvider_SetDefaults_Endpoint(t *testing.T) {
}
}
func Test_getNomadServiceDataWithEmptyServices_GroupService_Scaling1(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch {
case strings.HasSuffix(r.RequestURI, "/v1/jobs"):
_, _ = w.Write(responses["jobs_job1"])
case strings.HasSuffix(r.RequestURI, "/v1/job/job1"):
_, _ = w.Write(responses["job_job1_WithGroupService_Scaling1"])
case strings.HasSuffix(r.RequestURI, "/v1/service/job1"):
_, _ = w.Write(responses["service_job1"])
}
}))
t.Cleanup(ts.Close)
p := new(Provider)
p.SetDefaults()
p.Endpoint.Address = ts.URL
err := p.Init()
require.NoError(t, err)
// fudge client, avoid starting up via Provide
p.client, err = createClient(p.namespace, p.Endpoint)
require.NoError(t, err)
// make the query for services
items, err := p.getNomadServiceDataWithEmptyServices(context.TODO())
require.NoError(t, err)
require.Len(t, items, 1)
}
func Test_getNomadServiceDataWithEmptyServices_GroupService_Scaling0(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch {
case strings.HasSuffix(r.RequestURI, "/v1/jobs"):
_, _ = w.Write(responses["jobs_job2"])
case strings.HasSuffix(r.RequestURI, "/v1/job/job2"):
_, _ = w.Write(responses["job_job2_WithGroupService_Scaling0"])
case strings.HasSuffix(r.RequestURI, "/v1/service/job2"):
_, _ = w.Write(responses["service_job2"])
}
}))
t.Cleanup(ts.Close)
p := new(Provider)
p.SetDefaults()
p.Endpoint.Address = ts.URL
err := p.Init()
require.NoError(t, err)
// fudge client, avoid starting up via Provide
p.client, err = createClient(p.namespace, p.Endpoint)
require.NoError(t, err)
// make the query for services
items, err := p.getNomadServiceDataWithEmptyServices(context.TODO())
require.NoError(t, err)
require.Len(t, items, 1)
}
func Test_getNomadServiceDataWithEmptyServices_GroupService_ScalingDisabled(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch {
case strings.HasSuffix(r.RequestURI, "/v1/jobs"):
_, _ = w.Write(responses["jobs_job3"])
case strings.HasSuffix(r.RequestURI, "/v1/job/job3"):
_, _ = w.Write(responses["job_job3_WithGroupService_ScalingDisabled"])
case strings.HasSuffix(r.RequestURI, "/v1/service/job3"):
_, _ = w.Write(responses["service_job3"])
}
}))
t.Cleanup(ts.Close)
p := new(Provider)
p.SetDefaults()
p.Endpoint.Address = ts.URL
err := p.Init()
require.NoError(t, err)
// fudge client, avoid starting up via Provide
p.client, err = createClient(p.namespace, p.Endpoint)
require.NoError(t, err)
// make the query for services
items, err := p.getNomadServiceDataWithEmptyServices(context.TODO())
require.NoError(t, err)
require.Len(t, items, 1)
}
func Test_getNomadServiceDataWithEmptyServices_GroupService_ScalingDisabled_Stopped(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch {
case strings.HasSuffix(r.RequestURI, "/v1/jobs"):
_, _ = w.Write(responses["jobs_job4"])
case strings.HasSuffix(r.RequestURI, "/v1/job/job4"):
_, _ = w.Write(responses["job_job4_WithGroupService_ScalingDisabled_Stopped"])
case strings.HasSuffix(r.RequestURI, "/v1/service/job4"):
_, _ = w.Write(responses["service_job4"])
}
}))
t.Cleanup(ts.Close)
p := new(Provider)
p.SetDefaults()
p.Endpoint.Address = ts.URL
err := p.Init()
require.NoError(t, err)
// fudge client, avoid starting up via Provide
p.client, err = createClient(p.namespace, p.Endpoint)
require.NoError(t, err)
// make the query for services
items, err := p.getNomadServiceDataWithEmptyServices(context.TODO())
require.NoError(t, err)
// Should not be listed as job is stopped
require.Empty(t, items)
}
func Test_getNomadServiceDataWithEmptyServices_GroupTaskService_Scaling1(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch {
case strings.HasSuffix(r.RequestURI, "/v1/jobs"):
_, _ = w.Write(responses["jobs_job5"])
case strings.HasSuffix(r.RequestURI, "/v1/job/job5"):
_, _ = w.Write(responses["job_job5_WithGroupTaskService_Scaling1"])
case strings.HasSuffix(r.RequestURI, "/v1/service/job5task1"):
_, _ = w.Write(responses["service_job5task1"])
case strings.HasSuffix(r.RequestURI, "/v1/service/job5task2"):
_, _ = w.Write(responses["service_job5task2"])
}
}))
t.Cleanup(ts.Close)
p := new(Provider)
p.SetDefaults()
p.Endpoint.Address = ts.URL
err := p.Init()
require.NoError(t, err)
// fudge client, avoid starting up via Provide
p.client, err = createClient(p.namespace, p.Endpoint)
require.NoError(t, err)
// make the query for services
items, err := p.getNomadServiceDataWithEmptyServices(context.TODO())
require.NoError(t, err)
require.Len(t, items, 2)
}
func Test_getNomadServiceDataWithEmptyServices_GroupTaskService_Scaling0(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch {
case strings.HasSuffix(r.RequestURI, "/v1/jobs"):
_, _ = w.Write(responses["jobs_job6"])
case strings.HasSuffix(r.RequestURI, "/v1/job/job6"):
_, _ = w.Write(responses["job_job6_WithGroupTaskService_Scaling0"])
case strings.HasSuffix(r.RequestURI, "/v1/service/job6task1"):
_, _ = w.Write(responses["service_job6task1"])
case strings.HasSuffix(r.RequestURI, "/v1/service/job6task2"):
_, _ = w.Write(responses["service_job6task2"])
}
}))
t.Cleanup(ts.Close)
p := new(Provider)
p.SetDefaults()
p.Endpoint.Address = ts.URL
err := p.Init()
require.NoError(t, err)
// fudge client, avoid starting up via Provide
p.client, err = createClient(p.namespace, p.Endpoint)
require.NoError(t, err)
// make the query for services
items, err := p.getNomadServiceDataWithEmptyServices(context.TODO())
require.NoError(t, err)
require.Len(t, items, 2)
}
func Test_getNomadServiceDataWithEmptyServices_TCP(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch {
case strings.HasSuffix(r.RequestURI, "/v1/jobs"):
_, _ = w.Write(responses["jobs_job7"])
case strings.HasSuffix(r.RequestURI, "/v1/job/job7"):
_, _ = w.Write(responses["job_job7_TCP"])
case strings.HasSuffix(r.RequestURI, "/v1/service/job7"):
_, _ = w.Write(responses["service_job7"])
}
}))
t.Cleanup(ts.Close)
p := new(Provider)
p.SetDefaults()
p.Endpoint.Address = ts.URL
err := p.Init()
require.NoError(t, err)
// fudge client, avoid starting up via Provide
p.client, err = createClient(p.namespace, p.Endpoint)
require.NoError(t, err)
// make the query for services
items, err := p.getNomadServiceDataWithEmptyServices(context.TODO())
require.NoError(t, err)
require.Len(t, items, 1)
}
func Test_getNomadServiceDataWithEmptyServices_UDP(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch {
case strings.HasSuffix(r.RequestURI, "/v1/jobs"):
_, _ = w.Write(responses["jobs_job8"])
case strings.HasSuffix(r.RequestURI, "/v1/job/job8"):
_, _ = w.Write(responses["job_job8_UDP"])
case strings.HasSuffix(r.RequestURI, "/v1/service/job8"):
_, _ = w.Write(responses["service_job8"])
}
}))
t.Cleanup(ts.Close)
p := new(Provider)
p.SetDefaults()
p.Endpoint.Address = ts.URL
err := p.Init()
require.NoError(t, err)
// fudge client, avoid starting up via Provide
p.client, err = createClient(p.namespace, p.Endpoint)
require.NoError(t, err)
// make the query for services
items, err := p.getNomadServiceDataWithEmptyServices(context.TODO())
require.NoError(t, err)
require.Len(t, items, 1)
}
func Test_getNomadServiceDataWithEmptyServices_ScalingEnabled_Stopped(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch {
case strings.HasSuffix(r.RequestURI, "/v1/jobs"):
_, _ = w.Write(responses["jobs_job9"])
case strings.HasSuffix(r.RequestURI, "/v1/job/job9"):
_, _ = w.Write(responses["job_job9_ScalingEnabled_Stopped"])
case strings.HasSuffix(r.RequestURI, "/v1/service/job9"):
_, _ = w.Write(responses["service_job9"])
}
}))
t.Cleanup(ts.Close)
p := new(Provider)
p.SetDefaults()
p.Endpoint.Address = ts.URL
err := p.Init()
require.NoError(t, err)
// fudge client, avoid starting up via Provide
p.client, err = createClient(p.namespace, p.Endpoint)
require.NoError(t, err)
// make the query for services
items, err := p.getNomadServiceDataWithEmptyServices(context.TODO())
require.NoError(t, err)
// Should not be listed as job is stopped
require.Empty(t, items)
}
func setup() error {
responsesDir := "./fixtures"
files, err := os.ReadDir(responsesDir)
if err != nil {
return err
}
for _, file := range files {
if !file.IsDir() && filepath.Ext(file.Name()) == ".json" {
content, err := os.ReadFile(filepath.Join(responsesDir, file.Name()))
if err != nil {
return err
}
responses[strings.TrimSuffix(filepath.Base(file.Name()), filepath.Ext(file.Name()))] = content
}
}
return nil
}
func Test_getNomadServiceData(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch {
case strings.HasSuffix(r.RequestURI, "/v1/services"):
_, _ = w.Write([]byte(services))
_, _ = w.Write(responses["services"])
case strings.HasSuffix(r.RequestURI, "/v1/service/redis"):
_, _ = w.Write([]byte(redis))
_, _ = w.Write(responses["service_redis"])
case strings.HasSuffix(r.RequestURI, "/v1/service/hello-nomad"):
_, _ = w.Write([]byte(hello))
_, _ = w.Write(responses["service_hello"])
}
}))
t.Cleanup(ts.Close)
@ -159,71 +469,3 @@ func Test_getNomadServiceData(t *testing.T) {
require.NoError(t, err)
require.Len(t, items, 2)
}
const services = `
[
{
"Namespace": "default",
"Services": [
{
"ServiceName": "redis",
"Tags": [
"traefik.enable=true"
]
},
{
"ServiceName": "hello-nomad",
"Tags": [
"traefik.enable=true",
"traefik.http.routers.hellon.entrypoints=web",
"traefik.http.routers.hellon.service=hello-nomad"
]
}
]
}
]
`
const redis = `
[
{
"Address": "127.0.0.1",
"AllocID": "07501480-8175-8071-7da6-133bd1ff890f",
"CreateIndex": 46,
"Datacenter": "dc1",
"ID": "_nomad-task-07501480-8175-8071-7da6-133bd1ff890f-group-redis-redis-redis",
"JobID": "echo",
"ModifyIndex": 46,
"Namespace": "default",
"NodeID": "6d7f412e-e7ff-2e66-d47b-867b0e9d8726",
"Port": 30826,
"ServiceName": "redis",
"Tags": [
"traefik.enable=true"
]
}
]
`
const hello = `
[
{
"Address": "127.0.0.1",
"AllocID": "71a63a80-a98a-93ee-4fd7-73b808577c20",
"CreateIndex": 18,
"Datacenter": "dc1",
"ID": "_nomad-task-71a63a80-a98a-93ee-4fd7-73b808577c20-group-hello-nomad-hello-nomad-http",
"JobID": "echo",
"ModifyIndex": 18,
"Namespace": "default",
"NodeID": "6d7f412e-e7ff-2e66-d47b-867b0e9d8726",
"Port": 20627,
"ServiceName": "hello-nomad",
"Tags": [
"traefik.enable=true",
"traefik.http.routers.hellon.entrypoints=web",
"traefik.http.routers.hellon.service=hello-nomad"
]
}
]
`