diff --git a/api/services.go b/api/services.go index dbe0fcfe2..8630126ce 100644 --- a/api/services.go +++ b/api/services.go @@ -143,6 +143,7 @@ type ConsulConnect struct { // ConsulSidecarService represents a Consul Connect SidecarService jobspec // stanza. type ConsulSidecarService struct { + Tags []string Port string Proxy *ConsulProxy } diff --git a/command/agent/consul/client.go b/command/agent/consul/client.go index cdcd0b48c..9224fba1f 100644 --- a/command/agent/consul/client.go +++ b/command/agent/consul/client.go @@ -1473,6 +1473,7 @@ func newConnect(serviceName string, nc *structs.ConsulConnect, networks structs. // Advertise host IP:port cc.SidecarService = &api.AgentServiceRegistration{ + Tags: helper.CopySliceString(nc.SidecarService.Tags), Address: net.IP, Port: port.Value, diff --git a/command/agent/job_endpoint.go b/command/agent/job_endpoint.go index 54cac029f..710c94ec3 100644 --- a/command/agent/job_endpoint.go +++ b/command/agent/job_endpoint.go @@ -1063,6 +1063,7 @@ func ApiConsulConnectToStructs(in *api.ConsulConnect) *structs.ConsulConnect { if in.SidecarService != nil { out.SidecarService = &structs.ConsulSidecarService{ + Tags: helper.CopySliceString(in.SidecarService.Tags), Port: in.SidecarService.Port, } diff --git a/command/agent/job_endpoint_test.go b/command/agent/job_endpoint_test.go index e1934e29e..88deda125 100644 --- a/command/agent/job_endpoint_test.go +++ b/command/agent/job_endpoint_test.go @@ -1537,6 +1537,13 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) { TaskName: "task1", }, }, + Connect: &api.ConsulConnect{ + Native: false, + SidecarService: &api.ConsulSidecarService{ + Tags: []string{"f", "g"}, + Port: "9000", + }, + }, }, }, Tasks: []*api.Task{ @@ -1877,6 +1884,13 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) { TaskName: "task1", }, }, + Connect: &structs.ConsulConnect{ + Native: false, + SidecarService: &structs.ConsulSidecarService{ + Tags: []string{"f", "g"}, + Port: "9000", + }, + }, }, }, Tasks: []*structs.Task{ diff --git a/jobspec/parse_service.go b/jobspec/parse_service.go index 2100953c5..783b006bc 100644 --- a/jobspec/parse_service.go +++ b/jobspec/parse_service.go @@ -193,6 +193,7 @@ func parseSidecarService(o *ast.ObjectItem) (*api.ConsulSidecarService, error) { valid := []string{ "port", "proxy", + "tags", } if err := helper.CheckHCLKeys(o.Val, valid); err != nil { @@ -216,7 +217,7 @@ func parseSidecarService(o *ast.ObjectItem) (*api.ConsulSidecarService, error) { return nil, err } if err := dec.Decode(m); err != nil { - return nil, fmt.Errorf("foo: %v", err) + return nil, fmt.Errorf("sidecar_service: %v", err) } var proxyList *ast.ObjectList diff --git a/jobspec/parse_test.go b/jobspec/parse_test.go index ef2236f9a..95a2b6cdc 100644 --- a/jobspec/parse_test.go +++ b/jobspec/parse_test.go @@ -943,6 +943,7 @@ func TestParse(t *testing.T) { PortLabel: "1234", Connect: &api.ConsulConnect{ SidecarService: &api.ConsulSidecarService{ + Tags: []string{"side1", "side2"}, Proxy: &api.ConsulProxy{ Upstreams: []*api.ConsulUpstream{ { diff --git a/jobspec/test-fixtures/tg-network.hcl b/jobspec/test-fixtures/tg-network.hcl index 08a65b095..f35f6a83d 100644 --- a/jobspec/test-fixtures/tg-network.hcl +++ b/jobspec/test-fixtures/tg-network.hcl @@ -21,6 +21,7 @@ job "foo" { connect { sidecar_service { + tags = ["side1", "side2"] proxy { local_service_port = 8080 diff --git a/nomad/structs/services.go b/nomad/structs/services.go index 1b310d48f..abc79256e 100644 --- a/nomad/structs/services.go +++ b/nomad/structs/services.go @@ -597,6 +597,10 @@ func (c *ConsulConnect) Validate() error { // ConsulSidecarService represents a Consul Connect SidecarService jobspec // stanza. type ConsulSidecarService struct { + // Tags are optional service tags that get registered with the sidecar service + // in Consul. If unset, the sidecar service inherits the parent service tags. + Tags []string + // Port is the service's port that the sidecar will connect to. May be // a port label or a literal port number. Port string @@ -613,6 +617,7 @@ func (s *ConsulSidecarService) HasUpstreams() bool { // Copy the stanza recursively. Returns nil if nil. func (s *ConsulSidecarService) Copy() *ConsulSidecarService { return &ConsulSidecarService{ + Tags: helper.CopySliceString(s.Tags), Port: s.Port, Proxy: s.Proxy.Copy(), } @@ -628,6 +633,10 @@ func (s *ConsulSidecarService) Equals(o *ConsulSidecarService) bool { return false } + if !helper.CompareSliceSetString(s.Tags, o.Tags) { + return false + } + return s.Proxy.Equals(o.Proxy) } diff --git a/nomad/structs/services_test.go b/nomad/structs/services_test.go index ddd5d23d5..9e92a7d5d 100644 --- a/nomad/structs/services_test.go +++ b/nomad/structs/services_test.go @@ -34,6 +34,7 @@ func TestConsulConnect_CopyEquals(t *testing.T) { c := &ConsulConnect{ SidecarService: &ConsulSidecarService{ + Tags: []string{"tag1", "tag2"}, Port: "9001", Proxy: &ConsulProxy{ LocalServiceAddress: "127.0.0.1",