diff --git a/api/tasks.go b/api/tasks.go index a55e90f45a18..21c34911f51d 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 141454d1fd87..06439ebdb49e 100644 --- a/command/agent/consul/client.go +++ b/command/agent/consul/client.go @@ -671,6 +671,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 4d2009e5aa83..1f92570e0335 100644 --- a/command/agent/consul/unit_test.go +++ b/command/agent/consul/unit_test.go @@ -1404,6 +1404,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 e343af649870..ca6df67ad3d8 100644 --- a/command/agent/job_endpoint.go +++ b/command/agent/job_endpoint.go @@ -751,11 +751,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 acd103c4c909..fcdbc506adf4 100644 --- a/command/agent/job_endpoint_test.go +++ b/command/agent/job_endpoint_test.go @@ -1394,6 +1394,11 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) { }, }, }, + { + Id: "id_serviceB", + Name: "serviceB", + EnableTagOverride: true, + }, }, Resources: &api.Resources{ CPU: helper.IntToPtr(100), @@ -1693,6 +1698,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 88b2db3727c5..009fd122ae31 100644 --- a/nomad/structs/structs.go +++ b/nomad/structs/structs.go @@ -4958,6 +4958,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 {