From 766f1bfca8a76aac36c2b49ce6f893caf7255350 Mon Sep 17 00:00:00 2001 From: Mahmood Ali Date: Mon, 28 Oct 2019 10:41:51 -0400 Subject: [PATCH] add tests for consul connect validation --- nomad/job_endpoint_test.go | 92 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/nomad/job_endpoint_test.go b/nomad/job_endpoint_test.go index 7ba97d940..6ceeb35c8 100644 --- a/nomad/job_endpoint_test.go +++ b/nomad/job_endpoint_test.go @@ -1,6 +1,7 @@ package nomad import ( + "errors" "fmt" "reflect" "strings" @@ -4321,6 +4322,97 @@ func TestJobEndpoint_ImplicitConstraints_Vault(t *testing.T) { } } +func TestJobEndpoint_ValidateJob_ConsulConnect(t *testing.T) { + t.Parallel() + + s1 := TestServer(t, nil) + defer s1.Shutdown() + codec := rpcClient(t, s1) + testutil.WaitForLeader(t, s1.RPC) + + validateJob := func(j *structs.Job) error { + req := &structs.JobRegisterRequest{ + Job: j, + WriteRequest: structs.WriteRequest{ + Region: "global", + Namespace: j.Namespace, + }, + } + var resp structs.JobValidateResponse + if err := msgpackrpc.CallWithCodec(codec, "Job.Validate", req, &resp); err != nil { + return err + } + + if resp.Error != "" { + return errors.New(resp.Error) + } + + if len(resp.ValidationErrors) != 0 { + return errors.New(strings.Join(resp.ValidationErrors, ",")) + } + + if resp.Warnings != "" { + return errors.New(resp.Warnings) + } + + return nil + } + + tgServices := []*structs.Service{ + { + Name: "count-api", + PortLabel: "9001", + Connect: &structs.ConsulConnect{ + SidecarService: &structs.ConsulSidecarService{}, + }, + }, + } + + t.Run("plain job", func(t *testing.T) { + j := mock.Job() + require.NoError(t, validateJob(j)) + }) + t.Run("valid consul connect", func(t *testing.T) { + j := mock.Job() + + tg := j.TaskGroups[0] + tg.Services = tgServices + tg.Networks = structs.Networks{ + {Mode: "bridge"}, + } + + err := validateJob(j) + require.NoError(t, err) + }) + + t.Run("consul connect but missing network", func(t *testing.T) { + j := mock.Job() + + tg := j.TaskGroups[0] + tg.Services = tgServices + + err := validateJob(j) + require.Error(t, err) + require.Contains(t, err.Error(), `Consul Connect sidecars require exactly 1 network`) + }) + + t.Run("consul connect but non bridge network", func(t *testing.T) { + j := mock.Job() + + tg := j.TaskGroups[0] + tg.Services = tgServices + + tg.Networks = structs.Networks{ + {Mode: "host"}, + } + + err := validateJob(j) + require.Error(t, err) + require.Contains(t, err.Error(), `Consul Connect sidecar requires bridge network, found "host" in group "web"`) + }) + +} + func TestJobEndpoint_ImplicitConstraints_Signals(t *testing.T) { t.Parallel() s1 := TestServer(t, func(c *Config) {