open-nomad/command/agent/namespace_endpoint_test.go
2023-04-10 15:36:59 +00:00

175 lines
4.7 KiB
Go

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package agent
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/hashicorp/nomad/ci"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/stretchr/testify/assert"
)
func TestHTTP_NamespaceList(t *testing.T) {
ci.Parallel(t)
assert := assert.New(t)
httpTest(t, nil, func(s *TestAgent) {
ns1 := mock.Namespace()
ns2 := mock.Namespace()
ns3 := mock.Namespace()
args := structs.NamespaceUpsertRequest{
Namespaces: []*structs.Namespace{ns1, ns2, ns3},
WriteRequest: structs.WriteRequest{Region: "global"},
}
var resp structs.GenericResponse
assert.Nil(s.Agent.RPC("Namespace.UpsertNamespaces", &args, &resp))
// Make the HTTP request
req, err := http.NewRequest("GET", "/v1/namespaces", nil)
assert.Nil(err)
respW := httptest.NewRecorder()
// Make the request
obj, err := s.Server.NamespacesRequest(respW, req)
assert.Nil(err)
// Check for the index
assert.NotZero(respW.HeaderMap.Get("X-Nomad-Index"))
assert.Equal("true", respW.HeaderMap.Get("X-Nomad-KnownLeader"))
assert.NotZero(respW.HeaderMap.Get("X-Nomad-LastContact"))
// Check the output (the 3 we register + default)
assert.Len(obj.([]*structs.Namespace), 4)
})
}
func TestHTTP_NamespaceQuery(t *testing.T) {
ci.Parallel(t)
assert := assert.New(t)
httpTest(t, nil, func(s *TestAgent) {
ns1 := mock.Namespace()
args := structs.NamespaceUpsertRequest{
Namespaces: []*structs.Namespace{ns1},
WriteRequest: structs.WriteRequest{Region: "global"},
}
var resp structs.GenericResponse
assert.Nil(s.Agent.RPC("Namespace.UpsertNamespaces", &args, &resp))
// Make the HTTP request
req, err := http.NewRequest("GET", "/v1/namespace/"+ns1.Name, nil)
assert.Nil(err)
respW := httptest.NewRecorder()
// Make the request
obj, err := s.Server.NamespaceSpecificRequest(respW, req)
assert.Nil(err)
// Check for the index
assert.NotZero(respW.HeaderMap.Get("X-Nomad-Index"))
assert.Equal("true", respW.HeaderMap.Get("X-Nomad-KnownLeader"))
assert.NotZero(respW.HeaderMap.Get("X-Nomad-LastContact"))
// Check the output
assert.Equal(ns1.Name, obj.(*structs.Namespace).Name)
})
}
func TestHTTP_NamespaceCreate(t *testing.T) {
ci.Parallel(t)
assert := assert.New(t)
httpTest(t, nil, func(s *TestAgent) {
// Make the HTTP request
ns1 := mock.Namespace()
buf := encodeReq(ns1)
req, err := http.NewRequest("PUT", "/v1/namespace", buf)
assert.Nil(err)
respW := httptest.NewRecorder()
// Make the request
obj, err := s.Server.NamespaceCreateRequest(respW, req)
assert.Nil(err)
assert.Nil(obj)
// Check for the index
assert.NotZero(respW.HeaderMap.Get("X-Nomad-Index"))
// Check policy was created
state := s.Agent.server.State()
out, err := state.NamespaceByName(nil, ns1.Name)
assert.Nil(err)
assert.NotNil(out)
ns1.CreateIndex, ns1.ModifyIndex = out.CreateIndex, out.ModifyIndex
assert.Equal(ns1.Name, out.Name)
assert.Equal(ns1, out)
})
}
func TestHTTP_NamespaceUpdate(t *testing.T) {
ci.Parallel(t)
assert := assert.New(t)
httpTest(t, nil, func(s *TestAgent) {
// Make the HTTP request
ns1 := mock.Namespace()
buf := encodeReq(ns1)
req, err := http.NewRequest("PUT", "/v1/namespace/"+ns1.Name, buf)
assert.Nil(err)
respW := httptest.NewRecorder()
// Make the request
obj, err := s.Server.NamespaceSpecificRequest(respW, req)
assert.Nil(err)
assert.Nil(obj)
// Check for the index
assert.NotZero(respW.HeaderMap.Get("X-Nomad-Index"))
// Check policy was created
state := s.Agent.server.State()
out, err := state.NamespaceByName(nil, ns1.Name)
assert.Nil(err)
assert.NotNil(out)
ns1.CreateIndex, ns1.ModifyIndex = out.CreateIndex, out.ModifyIndex
assert.Equal(ns1.Name, out.Name)
assert.Equal(ns1, out)
})
}
func TestHTTP_NamespaceDelete(t *testing.T) {
ci.Parallel(t)
assert := assert.New(t)
httpTest(t, nil, func(s *TestAgent) {
ns1 := mock.Namespace()
args := structs.NamespaceUpsertRequest{
Namespaces: []*structs.Namespace{ns1},
WriteRequest: structs.WriteRequest{Region: "global"},
}
var resp structs.GenericResponse
assert.Nil(s.Agent.RPC("Namespace.UpsertNamespaces", &args, &resp))
// Make the HTTP request
req, err := http.NewRequest("DELETE", "/v1/namespace/"+ns1.Name, nil)
assert.Nil(err)
respW := httptest.NewRecorder()
// Make the request
obj, err := s.Server.NamespaceSpecificRequest(respW, req)
assert.Nil(err)
assert.Nil(obj)
// Check for the index
assert.NotZero(respW.HeaderMap.Get("X-Nomad-Index"))
// Check policy was created
state := s.Agent.server.State()
out, err := state.NamespaceByName(nil, ns1.Name)
assert.Nil(err)
assert.Nil(out)
})
}