9467bc9eb3
This PR adds the 'choose' query parameter to the '/v1/service/<service>' endpoint. The value of 'choose' is in the form '<number>|<key>', number is the number of desired services and key is a value unique but consistent to the requester (e.g. allocID). Folks aren't really expected to use this API directly, but rather through consul-template which will soon be getting a new helper function making use of this query parameter. Example, curl 'localhost:4646/v1/service/redis?choose=2|abc123' Note: consul-templte v0.29.1 includes the necessary nomadServices functionality.
475 lines
15 KiB
Go
475 lines
15 KiB
Go
package structs
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/shoenig/test/must"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestServiceRegistration_Copy(t *testing.T) {
|
|
sr := &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
}
|
|
newSR := sr.Copy()
|
|
require.True(t, sr.Equals(newSR))
|
|
}
|
|
|
|
func TestServiceRegistration_Equal(t *testing.T) {
|
|
testCases := []struct {
|
|
serviceReg1 *ServiceRegistration
|
|
serviceReg2 *ServiceRegistration
|
|
expectedOutput bool
|
|
name string
|
|
}{
|
|
{
|
|
serviceReg1: nil,
|
|
serviceReg2: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
expectedOutput: false,
|
|
name: "nil service registration composed",
|
|
},
|
|
{
|
|
serviceReg1: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
serviceReg2: nil,
|
|
expectedOutput: false,
|
|
name: "nil service registration func input",
|
|
},
|
|
{
|
|
serviceReg1: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
serviceReg2: &ServiceRegistration{
|
|
ID: "_nomad-group-2873cf75-42e5-7c45-ca1c-415f3e18be3dcache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
expectedOutput: false,
|
|
name: "ID not equal",
|
|
},
|
|
{
|
|
serviceReg1: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
serviceReg2: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "platform-example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
expectedOutput: false,
|
|
name: "service name not equal",
|
|
},
|
|
{
|
|
serviceReg1: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
serviceReg2: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "ba991c17-7ce5-9c20-78b7-311e63578583",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
expectedOutput: false,
|
|
name: "node ID not equal",
|
|
},
|
|
{
|
|
serviceReg1: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
serviceReg2: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc2",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
expectedOutput: false,
|
|
name: "datacenter not equal",
|
|
},
|
|
{
|
|
serviceReg1: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
serviceReg2: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "platform-example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
expectedOutput: false,
|
|
name: "job ID not equal",
|
|
},
|
|
{
|
|
serviceReg1: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
serviceReg2: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "ba991c17-7ce5-9c20-78b7-311e63578583",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
expectedOutput: false,
|
|
name: "alloc ID not equal",
|
|
},
|
|
{
|
|
serviceReg1: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
serviceReg2: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "platform",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
expectedOutput: false,
|
|
name: "namespace not equal",
|
|
},
|
|
{
|
|
serviceReg1: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
serviceReg2: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "10.10.13.13",
|
|
Port: 23813,
|
|
},
|
|
expectedOutput: false,
|
|
name: "address not equal",
|
|
},
|
|
{
|
|
serviceReg1: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
serviceReg2: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 33813,
|
|
},
|
|
expectedOutput: false,
|
|
name: "port not equal",
|
|
},
|
|
{
|
|
serviceReg1: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
serviceReg2: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"canary"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
expectedOutput: false,
|
|
name: "tags not equal",
|
|
},
|
|
{
|
|
serviceReg1: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
serviceReg2: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
ServiceName: "example-cache",
|
|
Namespace: "default",
|
|
NodeID: "17a6d1c0-811e-2ca9-ded0-3d5d6a54904c",
|
|
Datacenter: "dc1",
|
|
JobID: "example",
|
|
AllocID: "2873cf75-42e5-7c45-ca1c-415f3e18be3d",
|
|
Tags: []string{"foo"},
|
|
Address: "192.168.13.13",
|
|
Port: 23813,
|
|
},
|
|
expectedOutput: true,
|
|
name: "both equal",
|
|
},
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
actualOutput := tc.serviceReg1.Equals(tc.serviceReg2)
|
|
require.Equal(t, tc.expectedOutput, actualOutput)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestServiceRegistration_GetID(t *testing.T) {
|
|
testCases := []struct {
|
|
inputServiceRegistration *ServiceRegistration
|
|
expectedOutput string
|
|
name string
|
|
}{
|
|
{
|
|
inputServiceRegistration: nil,
|
|
expectedOutput: "",
|
|
name: "nil input",
|
|
},
|
|
{
|
|
inputServiceRegistration: &ServiceRegistration{
|
|
ID: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
},
|
|
expectedOutput: "_nomad-task-2873cf75-42e5-7c45-ca1c-415f3e18be3d-group-cache-example-cache-db",
|
|
name: "generic input 1",
|
|
},
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
actualOutput := tc.inputServiceRegistration.GetID()
|
|
require.Equal(t, tc.expectedOutput, actualOutput)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestServiceRegistration_GetNamespace(t *testing.T) {
|
|
testCases := []struct {
|
|
inputServiceRegistration *ServiceRegistration
|
|
expectedOutput string
|
|
name string
|
|
}{
|
|
{
|
|
inputServiceRegistration: nil,
|
|
expectedOutput: "",
|
|
name: "nil input",
|
|
},
|
|
{
|
|
inputServiceRegistration: &ServiceRegistration{
|
|
Namespace: "platform",
|
|
},
|
|
expectedOutput: "platform",
|
|
name: "generic input 1",
|
|
},
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
actualOutput := tc.inputServiceRegistration.GetNamespace()
|
|
require.Equal(t, tc.expectedOutput, actualOutput)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestServiceRegistrationListRequest_StaleReadSupport(t *testing.T) {
|
|
req := &ServiceRegistrationListRequest{}
|
|
require.True(t, req.IsRead())
|
|
}
|
|
|
|
func TestServiceRegistrationByNameRequest_StaleReadSupport(t *testing.T) {
|
|
req := &ServiceRegistrationByNameRequest{}
|
|
require.True(t, req.IsRead())
|
|
}
|
|
|
|
func TestServiceRegistration_HashWith(t *testing.T) {
|
|
a := ServiceRegistration{
|
|
Address: "10.0.0.1",
|
|
Port: 9999,
|
|
}
|
|
|
|
// same service, same key -> same hash
|
|
must.Eq(t, a.HashWith("aaa"), a.HashWith("aaa"))
|
|
|
|
// same service, different key -> different hash
|
|
must.NotEq(t, a.HashWith("aaa"), a.HashWith("bbb"))
|
|
|
|
b := ServiceRegistration{
|
|
Address: "10.0.0.2",
|
|
Port: 9998,
|
|
}
|
|
|
|
// different service, same key -> different hash
|
|
must.NotEq(t, a.HashWith("aaa"), b.HashWith("aaa"))
|
|
|
|
// different service, different key -> different hash
|
|
must.NotEq(t, a.HashWith("aaa"), b.HashWith("bbb"))
|
|
}
|