mirror of
https://github.com/kemko/nomad.git
synced 2026-01-06 18:35:44 +03:00
Merge pull request #12862 from hashicorp/f-choose-services
api: enable selecting subset of services using rendezvous hashing
This commit is contained in:
@@ -90,7 +90,10 @@ func (s *HTTPServer) ServiceRegistrationRequest(resp http.ResponseWriter, req *h
|
||||
func (s *HTTPServer) serviceGetRequest(
|
||||
resp http.ResponseWriter, req *http.Request, serviceName string) (interface{}, error) {
|
||||
|
||||
args := structs.ServiceRegistrationByNameRequest{ServiceName: serviceName}
|
||||
args := structs.ServiceRegistrationByNameRequest{
|
||||
ServiceName: serviceName,
|
||||
Choose: req.URL.Query().Get("choose"),
|
||||
}
|
||||
if s.parse(resp, req, &args.Region, &args.QueryOptions) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/hashicorp/nomad/nomad/mock"
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
@@ -157,6 +158,7 @@ func TestHTTPServer_ServiceRegistrationRequest(t *testing.T) {
|
||||
name string
|
||||
}{
|
||||
{
|
||||
name: "delete by ID",
|
||||
testFn: func(s *TestAgent) {
|
||||
|
||||
// Grab the state, so we can manipulate it and test against it.
|
||||
@@ -186,9 +188,9 @@ func TestHTTPServer_ServiceRegistrationRequest(t *testing.T) {
|
||||
require.Nil(t, out)
|
||||
require.NoError(t, err)
|
||||
},
|
||||
name: "delete by ID",
|
||||
},
|
||||
{
|
||||
name: "get service by name",
|
||||
testFn: func(s *TestAgent) {
|
||||
|
||||
// Grab the state, so we can manipulate it and test against it.
|
||||
@@ -214,9 +216,99 @@ func TestHTTPServer_ServiceRegistrationRequest(t *testing.T) {
|
||||
require.NotZero(t, respW.Header().Get("X-Nomad-Index"))
|
||||
require.Equal(t, serviceReg, obj.([]*structs.ServiceRegistration)[0])
|
||||
},
|
||||
name: "get service by name",
|
||||
},
|
||||
{
|
||||
name: "get service using choose",
|
||||
testFn: func(s *TestAgent) {
|
||||
// Grab the state so we can manipulate and test against it.
|
||||
testState := s.Agent.server.State()
|
||||
|
||||
err := testState.UpsertServiceRegistrations(
|
||||
structs.MsgTypeTestSetup, 10,
|
||||
[]*structs.ServiceRegistration{{
|
||||
ID: "978d519a-46ad-fb04-966b-000000000001",
|
||||
ServiceName: "redis",
|
||||
Namespace: "default",
|
||||
NodeID: "node1",
|
||||
Datacenter: "dc1",
|
||||
JobID: "job1",
|
||||
AllocID: "8b83191f-cb29-e23a-d955-220b65ef676d",
|
||||
Tags: nil,
|
||||
Address: "10.0.0.1",
|
||||
Port: 8080,
|
||||
CreateIndex: 10,
|
||||
ModifyIndex: 10,
|
||||
}, {
|
||||
ID: "978d519a-46ad-fb04-966b-000000000002",
|
||||
ServiceName: "redis",
|
||||
Namespace: "default",
|
||||
NodeID: "node2",
|
||||
Datacenter: "dc1",
|
||||
JobID: "job1",
|
||||
AllocID: "df6de93c-9376-a774-bcdf-3bd817e18078",
|
||||
Tags: nil,
|
||||
Address: "10.0.0.2",
|
||||
Port: 8080,
|
||||
CreateIndex: 10,
|
||||
ModifyIndex: 10,
|
||||
}, {
|
||||
ID: "978d519a-46ad-fb04-966b-000000000003",
|
||||
ServiceName: "redis",
|
||||
Namespace: "default",
|
||||
NodeID: "node3",
|
||||
Datacenter: "dc1",
|
||||
JobID: "job1",
|
||||
AllocID: "df6de93c-9376-a774-bcdf-3bd817e18078",
|
||||
Tags: nil,
|
||||
Address: "10.0.0.3",
|
||||
Port: 8080,
|
||||
CreateIndex: 10,
|
||||
ModifyIndex: 10,
|
||||
}},
|
||||
)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Build the HTTP request for 1 instance of the service, using key=abc123
|
||||
req, err := http.NewRequest(http.MethodGet, "/v1/service/redis?choose=1|abc123", nil)
|
||||
must.NoError(t, err)
|
||||
respW := httptest.NewRecorder()
|
||||
|
||||
// Send the HTTP request.
|
||||
obj, err := s.Server.ServiceRegistrationRequest(respW, req)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Check we got the correct type back.
|
||||
services, ok := (obj).([]*structs.ServiceRegistration)
|
||||
must.True(t, ok)
|
||||
|
||||
// Check we got the expected number of services back.
|
||||
must.Len(t, 1, services)
|
||||
|
||||
// Build the HTTP request for 2 instances of the service, still using key=abc123
|
||||
req2, err := http.NewRequest(http.MethodGet, "/v1/service/redis?choose=2|abc123", nil)
|
||||
must.NoError(t, err)
|
||||
respW2 := httptest.NewRecorder()
|
||||
|
||||
// Send the 2nd HTTP request.
|
||||
obj2, err := s.Server.ServiceRegistrationRequest(respW2, req2)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Check we got the correct type back.
|
||||
services2, ok := (obj2).([]*structs.ServiceRegistration)
|
||||
must.True(t, ok)
|
||||
|
||||
// Check we got the expected number of services back.
|
||||
must.Len(t, 2, services2)
|
||||
|
||||
// Check the first service is the same as the previous service.
|
||||
must.Eq(t, services[0], services2[0])
|
||||
|
||||
// Check the second service is not the same as the first service.
|
||||
must.NotEq(t, services2[0], services2[1])
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "incorrect URI format",
|
||||
testFn: func(s *TestAgent) {
|
||||
|
||||
// Build the HTTP request.
|
||||
@@ -230,9 +322,9 @@ func TestHTTPServer_ServiceRegistrationRequest(t *testing.T) {
|
||||
require.Contains(t, err.Error(), "invalid URI")
|
||||
require.Nil(t, obj)
|
||||
},
|
||||
name: "incorrect URI format",
|
||||
},
|
||||
{
|
||||
name: "get service empty name",
|
||||
testFn: func(s *TestAgent) {
|
||||
|
||||
// Build the HTTP request.
|
||||
@@ -246,9 +338,9 @@ func TestHTTPServer_ServiceRegistrationRequest(t *testing.T) {
|
||||
require.Contains(t, err.Error(), "missing service name")
|
||||
require.Nil(t, obj)
|
||||
},
|
||||
name: "get service empty name",
|
||||
},
|
||||
{
|
||||
name: "get service incorrect method",
|
||||
testFn: func(s *TestAgent) {
|
||||
|
||||
// Build the HTTP request.
|
||||
@@ -262,9 +354,9 @@ func TestHTTPServer_ServiceRegistrationRequest(t *testing.T) {
|
||||
require.Contains(t, err.Error(), "Invalid method")
|
||||
require.Nil(t, obj)
|
||||
},
|
||||
name: "get service incorrect method",
|
||||
},
|
||||
{
|
||||
name: "delete service empty id",
|
||||
testFn: func(s *TestAgent) {
|
||||
|
||||
// Build the HTTP request.
|
||||
@@ -278,9 +370,9 @@ func TestHTTPServer_ServiceRegistrationRequest(t *testing.T) {
|
||||
require.Contains(t, err.Error(), "missing service id")
|
||||
require.Nil(t, obj)
|
||||
},
|
||||
name: "delete service empty id",
|
||||
},
|
||||
{
|
||||
name: "delete service incorrect method",
|
||||
testFn: func(s *TestAgent) {
|
||||
|
||||
// Build the HTTP request.
|
||||
@@ -294,7 +386,6 @@ func TestHTTPServer_ServiceRegistrationRequest(t *testing.T) {
|
||||
require.Contains(t, err.Error(), "Invalid method")
|
||||
require.Nil(t, obj)
|
||||
},
|
||||
name: "delete service incorrect method",
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user