From 0666a4f1ab9d0734d3b19d40f676135ab64e2f98 Mon Sep 17 00:00:00 2001 From: Bogdan Albei Date: Fri, 31 May 2019 16:38:29 +0100 Subject: [PATCH] added support for consul EnableTagOverride #2057 --- api/tasks.go | 1 + command/agent/consul/client.go | 1 + command/agent/consul/unit_test.go | 30 ++++++++++++++++++++++++++++++ command/agent/job_endpoint.go | 11 ++++++----- command/agent/job_endpoint_test.go | 10 ++++++++++ nomad/structs/structs.go | 1 + 6 files changed, 49 insertions(+), 5 deletions(-) diff --git a/api/tasks.go b/api/tasks.go index 6932876734d9..5a9af30a5881 100644 --- a/api/tasks.go +++ b/api/tasks.go @@ -372,6 +372,7 @@ type Service struct { AddressMode string `mapstructure:"address_mode"` Checks []ServiceCheck CheckRestart *CheckRestart `mapstructure:"check_restart"` + EnableTagOverride bool } func (s *Service) Canonicalize(t *Task, tg *TaskGroup, job *Job) { diff --git a/command/agent/consul/client.go b/command/agent/consul/client.go index ae095c863174..18bb529630bf 100644 --- a/command/agent/consul/client.go +++ b/command/agent/consul/client.go @@ -695,6 +695,7 @@ func (c *ServiceClient) serviceRegs(ops *operations, service *structs.Service, t Meta: map[string]string{ "external-source": "nomad", }, + EnableTagOverride: service.EnableTagOverride, } ops.regServices = append(ops.regServices, serviceReg) diff --git a/command/agent/consul/unit_test.go b/command/agent/consul/unit_test.go index fc2d77053a28..2feaf1a39bfb 100644 --- a/command/agent/consul/unit_test.go +++ b/command/agent/consul/unit_test.go @@ -1296,6 +1296,36 @@ func TestConsul_CanaryTags_NoTags(t *testing.T) { require.Len(ctx.FakeConsul.services, 0) } +// TestConsul_EnableTagOverrideEnabled asserts EnableTagOverride is set when EnableTagOverride=true +func TestConsul_EnableTagOverrideEnabled(t *testing.T) { + t.Parallel() + require := require.New(t) + ctx := setupFake(t) + + ctx.Task.Services[0].EnableTagOverride = true + + require.NoError(ctx.ServiceClient.RegisterTask(ctx.Task)) + require.NoError(ctx.syncOnce()) + require.Len(ctx.FakeConsul.services, 1) + for _, service := range ctx.FakeConsul.services { + require.Equal(true, service.EnableTagOverride) + } +} + +// TestConsul_EnableTagOverrideIsDisabledByDefault asserts EnableTagOverride is disabled by default +func TestConsul_EnableTagOverrideIsDisabledByDefault(t *testing.T) { + t.Parallel() + require := require.New(t) + ctx := setupFake(t) + + require.NoError(ctx.ServiceClient.RegisterTask(ctx.Task)) + require.NoError(ctx.syncOnce()) + require.Len(ctx.FakeConsul.services, 1) + for _, service := range ctx.FakeConsul.services { + require.Equal(false, service.EnableTagOverride) + } +} + // TestConsul_PeriodicSync asserts that Nomad periodically reconciles with // Consul. func TestConsul_PeriodicSync(t *testing.T) { diff --git a/command/agent/job_endpoint.go b/command/agent/job_endpoint.go index d17bb91fdeee..665df1bffdeb 100644 --- a/command/agent/job_endpoint.go +++ b/command/agent/job_endpoint.go @@ -763,11 +763,12 @@ func ApiTaskToStructsTask(apiTask *api.Task, structsTask *structs.Task) { structsTask.Services = make([]*structs.Service, l) for i, service := range apiTask.Services { structsTask.Services[i] = &structs.Service{ - Name: service.Name, - PortLabel: service.PortLabel, - Tags: service.Tags, - CanaryTags: service.CanaryTags, - AddressMode: service.AddressMode, + Name: service.Name, + PortLabel: service.PortLabel, + Tags: service.Tags, + CanaryTags: service.CanaryTags, + AddressMode: service.AddressMode, + EnableTagOverride: service.EnableTagOverride, } if l := len(service.Checks); l != 0 { diff --git a/command/agent/job_endpoint_test.go b/command/agent/job_endpoint_test.go index 77329a127bb4..90daca7395bb 100644 --- a/command/agent/job_endpoint_test.go +++ b/command/agent/job_endpoint_test.go @@ -1398,6 +1398,11 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) { }, }, }, + { + Id: "id_serviceB", + Name: "serviceB", + EnableTagOverride: true, + }, }, Resources: &api.Resources{ CPU: helper.IntToPtr(100), @@ -1698,6 +1703,11 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) { }, }, }, + { + Name: "serviceB", + EnableTagOverride: true, + AddressMode: "auto", + }, }, Resources: &structs.Resources{ CPU: 100, diff --git a/nomad/structs/structs.go b/nomad/structs/structs.go index fead1a641d34..b7b2846e1c18 100644 --- a/nomad/structs/structs.go +++ b/nomad/structs/structs.go @@ -5116,6 +5116,7 @@ type Service struct { Tags []string // List of tags for the service CanaryTags []string // List of tags for the service when it is a canary Checks []*ServiceCheck // List of checks associated with the service + EnableTagOverride bool // Allow external agents to change the tags for a service } func (s *Service) Copy() *Service {