mirror of https://github.com/hashicorp/consul
PR comments and addtl tests
parent
0956624e39
commit
15c3cfce5e
|
@ -114,7 +114,7 @@ func (m *Internal) ServiceDump(args *structs.ServiceDumpRequest, reply *structs.
|
|||
}
|
||||
reply.Nodes = nodes
|
||||
|
||||
if err := m.srv.filterACL(args.Token, reply.Nodes); err != nil {
|
||||
if err := m.srv.filterACL(args.Token, &reply.Nodes); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -130,7 +130,7 @@ func (m *Internal) ServiceDump(args *structs.ServiceDumpRequest, reply *structs.
|
|||
}
|
||||
reply.Index = maxIdx
|
||||
|
||||
if err := m.srv.filterACL(args.Token, reply.Gateways); err != nil {
|
||||
if err := m.srv.filterACL(args.Token, &reply.Gateways); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
|
@ -568,7 +568,30 @@ func TestInternal_ServiceDump(t *testing.T) {
|
|||
// prep the cluster with some data we can use in our filters
|
||||
registerTestCatalogEntries(t, codec)
|
||||
|
||||
doRequest := func(t *testing.T, filter string) structs.CheckServiceNodes {
|
||||
// Register a gateway config entry to ensure gateway-services is dumped
|
||||
{
|
||||
req := structs.ConfigEntryRequest{
|
||||
Op: structs.ConfigEntryUpsert,
|
||||
Datacenter: "dc1",
|
||||
Entry: &structs.TerminatingGatewayConfigEntry{
|
||||
Name: "terminating-gateway",
|
||||
Kind: structs.TerminatingGateway,
|
||||
Services: []structs.LinkedService{
|
||||
{
|
||||
Name: "api",
|
||||
},
|
||||
{
|
||||
Name: "cache",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
var configOutput bool
|
||||
require.NoError(t, msgpackrpc.CallWithCodec(codec, "ConfigEntry.Apply", &req, &configOutput))
|
||||
require.True(t, configOutput)
|
||||
}
|
||||
|
||||
doRequest := func(t *testing.T, filter string) structs.IndexedNodesWithGateways {
|
||||
t.Helper()
|
||||
args := structs.DCSpecificRequest{
|
||||
Datacenter: "dc1",
|
||||
|
@ -577,26 +600,51 @@ func TestInternal_ServiceDump(t *testing.T) {
|
|||
|
||||
var out structs.IndexedNodesWithGateways
|
||||
require.NoError(t, msgpackrpc.CallWithCodec(codec, "Internal.ServiceDump", &args, &out))
|
||||
return out.Nodes
|
||||
|
||||
// The GatewayServices dump is currently cannot be bexpr filtered
|
||||
// so the response should be the same in all subtests
|
||||
expectedGW := structs.GatewayServices{
|
||||
{
|
||||
Service: structs.ServiceName{Name: "api"},
|
||||
Gateway: structs.ServiceName{Name: "terminating-gateway"},
|
||||
GatewayKind: structs.ServiceKindTerminatingGateway,
|
||||
},
|
||||
{
|
||||
Service: structs.ServiceName{Name: "cache"},
|
||||
Gateway: structs.ServiceName{Name: "terminating-gateway"},
|
||||
GatewayKind: structs.ServiceKindTerminatingGateway,
|
||||
},
|
||||
}
|
||||
assert.Len(t, out.Gateways, 2)
|
||||
assert.Equal(t, expectedGW[0].Service, out.Gateways[0].Service)
|
||||
assert.Equal(t, expectedGW[0].Gateway, out.Gateways[0].Gateway)
|
||||
assert.Equal(t, expectedGW[0].GatewayKind, out.Gateways[0].GatewayKind)
|
||||
|
||||
assert.Equal(t, expectedGW[1].Service, out.Gateways[1].Service)
|
||||
assert.Equal(t, expectedGW[1].Gateway, out.Gateways[1].Gateway)
|
||||
assert.Equal(t, expectedGW[1].GatewayKind, out.Gateways[1].GatewayKind)
|
||||
|
||||
return out
|
||||
}
|
||||
|
||||
// Run the tests against the test server
|
||||
t.Run("No Filter", func(t *testing.T) {
|
||||
nodes := doRequest(t, "")
|
||||
// redis (3), web (3), critical (1), warning (1) and consul (1)
|
||||
require.Len(t, nodes, 9)
|
||||
require.Len(t, nodes.Nodes, 9)
|
||||
|
||||
})
|
||||
|
||||
t.Run("Filter Node foo and service version 1", func(t *testing.T) {
|
||||
nodes := doRequest(t, "Node.Node == foo and Service.Meta.version == 1")
|
||||
require.Len(t, nodes, 1)
|
||||
require.Equal(t, "redis", nodes[0].Service.Service)
|
||||
require.Equal(t, "redisV1", nodes[0].Service.ID)
|
||||
resp := doRequest(t, "Node.Node == foo and Service.Meta.version == 1")
|
||||
require.Len(t, resp.Nodes, 1)
|
||||
require.Equal(t, "redis", resp.Nodes[0].Service.Service)
|
||||
require.Equal(t, "redisV1", resp.Nodes[0].Service.ID)
|
||||
})
|
||||
|
||||
t.Run("Filter service web", func(t *testing.T) {
|
||||
nodes := doRequest(t, "Service.Service == web")
|
||||
require.Len(t, nodes, 3)
|
||||
resp := doRequest(t, "Service.Service == web")
|
||||
require.Len(t, resp.Nodes, 3)
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -2700,13 +2700,16 @@ func (s *Store) DumpGatewayServices(ws memdb.WatchSet) (uint64, structs.GatewayS
|
|||
tx := s.db.ReadTxn()
|
||||
defer tx.Abort()
|
||||
|
||||
gatewayServices, err := tx.Get(gatewayServicesTableName, "id")
|
||||
iter, err := tx.Get(gatewayServicesTableName, "id")
|
||||
if err != nil {
|
||||
return 0, nil, fmt.Errorf("failed to dump gateway-services: %s", err)
|
||||
}
|
||||
ws.Add(gatewayServices.WatchCh())
|
||||
ws.Add(iter.WatchCh())
|
||||
|
||||
return s.collectGatewayServices(tx, ws, gatewayServices)
|
||||
maxIdx, results, err := s.collectGatewayServices(tx, ws, iter)
|
||||
idx := maxIndexTxn(tx, gatewayServicesTableName)
|
||||
|
||||
return lib.MaxUint64(maxIdx, idx), results, nil
|
||||
}
|
||||
|
||||
func (s *Store) collectGatewayServices(tx *txn, ws memdb.WatchSet, iter memdb.ResultIterator) (uint64, structs.GatewayServices, error) {
|
||||
|
@ -2715,14 +2718,15 @@ func (s *Store) collectGatewayServices(tx *txn, ws memdb.WatchSet, iter memdb.Re
|
|||
|
||||
for obj := iter.Next(); obj != nil; obj = iter.Next() {
|
||||
gs := obj.(*structs.GatewayService)
|
||||
maxIdx = lib.MaxUint64(maxIdx, gs.ModifyIndex)
|
||||
|
||||
if gs.Service.Name != structs.WildcardSpecifier {
|
||||
idx, matches, err := s.checkProtocolMatch(tx, ws, gs)
|
||||
if err != nil {
|
||||
return 0, nil, fmt.Errorf("failed checking protocol: %s", err)
|
||||
}
|
||||
|
||||
maxIdx = lib.MaxUint64(maxIdx, idx)
|
||||
|
||||
if matches {
|
||||
results = append(results, gs)
|
||||
}
|
||||
|
|
|
@ -5678,3 +5678,415 @@ func setupIngressState(t *testing.T, s *Store) memdb.WatchSet {
|
|||
|
||||
return ws
|
||||
}
|
||||
|
||||
func TestStateStore_DumpGatewayServices(t *testing.T) {
|
||||
s := testStateStore(t)
|
||||
|
||||
// Listing with no results returns an empty list.
|
||||
ws := memdb.NewWatchSet()
|
||||
idx, nodes, err := s.DumpGatewayServices(ws)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, idx, uint64(0))
|
||||
assert.Len(t, nodes, 0)
|
||||
|
||||
// Create some nodes
|
||||
assert.Nil(t, s.EnsureNode(10, &structs.Node{Node: "foo", Address: "127.0.0.1"}))
|
||||
assert.Nil(t, s.EnsureNode(11, &structs.Node{Node: "bar", Address: "127.0.0.2"}))
|
||||
assert.Nil(t, s.EnsureNode(12, &structs.Node{Node: "baz", Address: "127.0.0.2"}))
|
||||
|
||||
// Typical services and some consul services spread across two nodes
|
||||
assert.Nil(t, s.EnsureService(13, "foo", &structs.NodeService{ID: "db", Service: "db", Tags: nil, Address: "", Port: 5000}))
|
||||
assert.Nil(t, s.EnsureService(15, "bar", &structs.NodeService{ID: "api", Service: "api", Tags: nil, Address: "", Port: 5000}))
|
||||
assert.Nil(t, s.EnsureService(16, "bar", &structs.NodeService{ID: "consul", Service: "consul", Tags: nil}))
|
||||
assert.Nil(t, s.EnsureService(17, "bar", &structs.NodeService{ID: "consul", Service: "consul", Tags: nil}))
|
||||
|
||||
ingressNS := &structs.NodeService{
|
||||
Kind: structs.ServiceKindIngressGateway,
|
||||
ID: "ingress",
|
||||
Service: "ingress",
|
||||
Port: 8443,
|
||||
}
|
||||
assert.Nil(t, s.EnsureService(18, "baz", ingressNS))
|
||||
|
||||
// Register a gateway
|
||||
terminatingNS := &structs.NodeService{
|
||||
Kind: structs.ServiceKindTerminatingGateway,
|
||||
ID: "gateway",
|
||||
Service: "gateway",
|
||||
Port: 443,
|
||||
}
|
||||
assert.Nil(t, s.EnsureService(20, "baz", terminatingNS))
|
||||
|
||||
t.Run("add-tgw-config", func(t *testing.T) {
|
||||
// Associate gateway with db and api
|
||||
assert.Nil(t, s.EnsureConfigEntry(21, &structs.TerminatingGatewayConfigEntry{
|
||||
Kind: "terminating-gateway",
|
||||
Name: "gateway",
|
||||
Services: []structs.LinkedService{
|
||||
{
|
||||
Name: "api",
|
||||
CAFile: "api/ca.crt",
|
||||
CertFile: "api/client.crt",
|
||||
KeyFile: "api/client.key",
|
||||
SNI: "my-domain",
|
||||
},
|
||||
{
|
||||
Name: "db",
|
||||
},
|
||||
{
|
||||
Name: "*",
|
||||
CAFile: "ca.crt",
|
||||
CertFile: "client.crt",
|
||||
KeyFile: "client.key",
|
||||
SNI: "my-alt-domain",
|
||||
},
|
||||
},
|
||||
}, nil))
|
||||
assert.True(t, watchFired(ws))
|
||||
|
||||
// Read everything back.
|
||||
ws = memdb.NewWatchSet()
|
||||
idx, out, err := s.DumpGatewayServices(ws)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, idx, uint64(21))
|
||||
assert.Len(t, out, 2)
|
||||
|
||||
expect := structs.GatewayServices{
|
||||
{
|
||||
Service: structs.NewServiceName("api", nil),
|
||||
Gateway: structs.NewServiceName("gateway", nil),
|
||||
GatewayKind: structs.ServiceKindTerminatingGateway,
|
||||
CAFile: "api/ca.crt",
|
||||
CertFile: "api/client.crt",
|
||||
KeyFile: "api/client.key",
|
||||
SNI: "my-domain",
|
||||
RaftIndex: structs.RaftIndex{
|
||||
CreateIndex: 21,
|
||||
ModifyIndex: 21,
|
||||
},
|
||||
},
|
||||
{
|
||||
Service: structs.NewServiceName("db", nil),
|
||||
Gateway: structs.NewServiceName("gateway", nil),
|
||||
GatewayKind: structs.ServiceKindTerminatingGateway,
|
||||
RaftIndex: structs.RaftIndex{
|
||||
CreateIndex: 21,
|
||||
ModifyIndex: 21,
|
||||
},
|
||||
},
|
||||
}
|
||||
assert.Equal(t, expect, out)
|
||||
})
|
||||
|
||||
t.Run("no-op", func(t *testing.T) {
|
||||
// Check watch doesn't fire on same exact config
|
||||
assert.Nil(t, s.EnsureConfigEntry(21, &structs.TerminatingGatewayConfigEntry{
|
||||
Kind: "terminating-gateway",
|
||||
Name: "gateway",
|
||||
Services: []structs.LinkedService{
|
||||
{
|
||||
Name: "api",
|
||||
CAFile: "api/ca.crt",
|
||||
CertFile: "api/client.crt",
|
||||
KeyFile: "api/client.key",
|
||||
SNI: "my-domain",
|
||||
},
|
||||
{
|
||||
Name: "db",
|
||||
},
|
||||
{
|
||||
Name: "*",
|
||||
CAFile: "ca.crt",
|
||||
CertFile: "client.crt",
|
||||
KeyFile: "client.key",
|
||||
SNI: "my-alt-domain",
|
||||
},
|
||||
},
|
||||
}, nil))
|
||||
assert.False(t, watchFired(ws))
|
||||
|
||||
idx, out, err := s.DumpGatewayServices(ws)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, idx, uint64(21))
|
||||
assert.Len(t, out, 2)
|
||||
|
||||
expect := structs.GatewayServices{
|
||||
{
|
||||
Service: structs.NewServiceName("api", nil),
|
||||
Gateway: structs.NewServiceName("gateway", nil),
|
||||
GatewayKind: structs.ServiceKindTerminatingGateway,
|
||||
CAFile: "api/ca.crt",
|
||||
CertFile: "api/client.crt",
|
||||
KeyFile: "api/client.key",
|
||||
SNI: "my-domain",
|
||||
RaftIndex: structs.RaftIndex{
|
||||
CreateIndex: 21,
|
||||
ModifyIndex: 21,
|
||||
},
|
||||
},
|
||||
{
|
||||
Service: structs.NewServiceName("db", nil),
|
||||
Gateway: structs.NewServiceName("gateway", nil),
|
||||
GatewayKind: structs.ServiceKindTerminatingGateway,
|
||||
RaftIndex: structs.RaftIndex{
|
||||
CreateIndex: 21,
|
||||
ModifyIndex: 21,
|
||||
},
|
||||
},
|
||||
}
|
||||
assert.Equal(t, expect, out)
|
||||
})
|
||||
|
||||
// Add a service covered by wildcard
|
||||
t.Run("add-wc-service", func(t *testing.T) {
|
||||
assert.Nil(t, s.EnsureService(22, "bar", &structs.NodeService{ID: "redis", Service: "redis", Tags: nil, Address: "", Port: 6379}))
|
||||
assert.True(t, watchFired(ws))
|
||||
|
||||
ws = memdb.NewWatchSet()
|
||||
idx, out, err := s.DumpGatewayServices(ws)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, idx, uint64(22))
|
||||
assert.Len(t, out, 3)
|
||||
|
||||
expect := structs.GatewayServices{
|
||||
{
|
||||
Service: structs.NewServiceName("api", nil),
|
||||
Gateway: structs.NewServiceName("gateway", nil),
|
||||
GatewayKind: structs.ServiceKindTerminatingGateway,
|
||||
CAFile: "api/ca.crt",
|
||||
CertFile: "api/client.crt",
|
||||
KeyFile: "api/client.key",
|
||||
SNI: "my-domain",
|
||||
RaftIndex: structs.RaftIndex{
|
||||
CreateIndex: 21,
|
||||
ModifyIndex: 21,
|
||||
},
|
||||
},
|
||||
{
|
||||
Service: structs.NewServiceName("db", nil),
|
||||
Gateway: structs.NewServiceName("gateway", nil),
|
||||
GatewayKind: structs.ServiceKindTerminatingGateway,
|
||||
RaftIndex: structs.RaftIndex{
|
||||
CreateIndex: 21,
|
||||
ModifyIndex: 21,
|
||||
},
|
||||
},
|
||||
{
|
||||
Service: structs.NewServiceName("redis", nil),
|
||||
Gateway: structs.NewServiceName("gateway", nil),
|
||||
GatewayKind: structs.ServiceKindTerminatingGateway,
|
||||
CAFile: "ca.crt",
|
||||
CertFile: "client.crt",
|
||||
KeyFile: "client.key",
|
||||
SNI: "my-alt-domain",
|
||||
FromWildcard: true,
|
||||
RaftIndex: structs.RaftIndex{
|
||||
CreateIndex: 22,
|
||||
ModifyIndex: 22,
|
||||
},
|
||||
},
|
||||
}
|
||||
assert.Equal(t, expect, out)
|
||||
})
|
||||
|
||||
// Delete a service covered by wildcard
|
||||
t.Run("delete-wc-service", func(t *testing.T) {
|
||||
assert.Nil(t, s.DeleteService(23, "bar", "redis", nil))
|
||||
assert.True(t, watchFired(ws))
|
||||
|
||||
ws = memdb.NewWatchSet()
|
||||
idx, out, err := s.DumpGatewayServices(ws)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, idx, uint64(23))
|
||||
assert.Len(t, out, 2)
|
||||
|
||||
expect := structs.GatewayServices{
|
||||
{
|
||||
Service: structs.NewServiceName("api", nil),
|
||||
Gateway: structs.NewServiceName("gateway", nil),
|
||||
GatewayKind: structs.ServiceKindTerminatingGateway,
|
||||
CAFile: "api/ca.crt",
|
||||
CertFile: "api/client.crt",
|
||||
KeyFile: "api/client.key",
|
||||
SNI: "my-domain",
|
||||
RaftIndex: structs.RaftIndex{
|
||||
CreateIndex: 21,
|
||||
ModifyIndex: 21,
|
||||
},
|
||||
},
|
||||
{
|
||||
Service: structs.NewServiceName("db", nil),
|
||||
Gateway: structs.NewServiceName("gateway", nil),
|
||||
GatewayKind: structs.ServiceKindTerminatingGateway,
|
||||
RaftIndex: structs.RaftIndex{
|
||||
CreateIndex: 21,
|
||||
ModifyIndex: 21,
|
||||
},
|
||||
},
|
||||
}
|
||||
assert.Equal(t, expect, out)
|
||||
})
|
||||
|
||||
t.Run("delete-config-entry-svc", func(t *testing.T) {
|
||||
// Update the entry that only leaves one service
|
||||
assert.Nil(t, s.EnsureConfigEntry(24, &structs.TerminatingGatewayConfigEntry{
|
||||
Kind: "terminating-gateway",
|
||||
Name: "gateway",
|
||||
Services: []structs.LinkedService{
|
||||
{
|
||||
Name: "db",
|
||||
},
|
||||
},
|
||||
}, nil))
|
||||
assert.True(t, watchFired(ws))
|
||||
|
||||
idx, out, err := s.DumpGatewayServices(ws)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, idx, uint64(24))
|
||||
assert.Len(t, out, 1)
|
||||
|
||||
// previously associated service (api) should not be present
|
||||
expect := structs.GatewayServices{
|
||||
{
|
||||
Service: structs.NewServiceName("db", nil),
|
||||
Gateway: structs.NewServiceName("gateway", nil),
|
||||
GatewayKind: structs.ServiceKindTerminatingGateway,
|
||||
RaftIndex: structs.RaftIndex{
|
||||
CreateIndex: 24,
|
||||
ModifyIndex: 24,
|
||||
},
|
||||
},
|
||||
}
|
||||
assert.Equal(t, expect, out)
|
||||
})
|
||||
|
||||
t.Run("add-ingress-config", func(t *testing.T) {
|
||||
svcDefault := &structs.ServiceConfigEntry{
|
||||
Name: "web",
|
||||
Kind: structs.ServiceDefaults,
|
||||
Protocol: "http",
|
||||
}
|
||||
assert.NoError(t, s.EnsureConfigEntry(25, svcDefault, nil))
|
||||
|
||||
// Associate gateway with db and api
|
||||
assert.Nil(t, s.EnsureConfigEntry(26, &structs.IngressGatewayConfigEntry{
|
||||
Kind: "ingress-gateway",
|
||||
Name: "ingress",
|
||||
Listeners: []structs.IngressListener{
|
||||
{
|
||||
Port: 1111,
|
||||
Protocol: "tcp",
|
||||
Services: []structs.IngressService{
|
||||
{
|
||||
Name: "api",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Port: 2222,
|
||||
Protocol: "http",
|
||||
Services: []structs.IngressService{
|
||||
{
|
||||
Name: "web",
|
||||
Hosts: []string{"web.example.com"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}, nil))
|
||||
assert.True(t, watchFired(ws))
|
||||
|
||||
// Read everything back.
|
||||
ws = memdb.NewWatchSet()
|
||||
idx, out, err := s.DumpGatewayServices(ws)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, idx, uint64(26))
|
||||
assert.Len(t, out, 3)
|
||||
|
||||
expect := structs.GatewayServices{
|
||||
{
|
||||
Service: structs.NewServiceName("db", nil),
|
||||
Gateway: structs.NewServiceName("gateway", nil),
|
||||
GatewayKind: structs.ServiceKindTerminatingGateway,
|
||||
RaftIndex: structs.RaftIndex{
|
||||
CreateIndex: 24,
|
||||
ModifyIndex: 24,
|
||||
},
|
||||
},
|
||||
{
|
||||
Service: structs.NewServiceName("api", nil),
|
||||
Gateway: structs.NewServiceName("ingress", nil),
|
||||
GatewayKind: structs.ServiceKindIngressGateway,
|
||||
Protocol: "tcp",
|
||||
Port: 1111,
|
||||
RaftIndex: structs.RaftIndex{
|
||||
CreateIndex: 26,
|
||||
ModifyIndex: 26,
|
||||
},
|
||||
},
|
||||
{
|
||||
Service: structs.NewServiceName("web", nil),
|
||||
Gateway: structs.NewServiceName("ingress", nil),
|
||||
GatewayKind: structs.ServiceKindIngressGateway,
|
||||
Protocol: "http",
|
||||
Port: 2222,
|
||||
Hosts: []string{"web.example.com"},
|
||||
RaftIndex: structs.RaftIndex{
|
||||
CreateIndex: 26,
|
||||
ModifyIndex: 26,
|
||||
},
|
||||
},
|
||||
}
|
||||
assert.Equal(t, expect, out)
|
||||
})
|
||||
|
||||
t.Run("delete-tgw-entry", func(t *testing.T) {
|
||||
// Deleting the config entry should remove existing mappings
|
||||
assert.Nil(t, s.DeleteConfigEntry(27, "terminating-gateway", "gateway", nil))
|
||||
assert.True(t, watchFired(ws))
|
||||
|
||||
idx, out, err := s.DumpGatewayServices(ws)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, idx, uint64(27))
|
||||
assert.Len(t, out, 2)
|
||||
|
||||
// Only ingress entries should remain
|
||||
expect := structs.GatewayServices{
|
||||
{
|
||||
Service: structs.NewServiceName("api", nil),
|
||||
Gateway: structs.NewServiceName("ingress", nil),
|
||||
GatewayKind: structs.ServiceKindIngressGateway,
|
||||
Protocol: "tcp",
|
||||
Port: 1111,
|
||||
RaftIndex: structs.RaftIndex{
|
||||
CreateIndex: 26,
|
||||
ModifyIndex: 26,
|
||||
},
|
||||
},
|
||||
{
|
||||
Service: structs.NewServiceName("web", nil),
|
||||
Gateway: structs.NewServiceName("ingress", nil),
|
||||
GatewayKind: structs.ServiceKindIngressGateway,
|
||||
Protocol: "http",
|
||||
Port: 2222,
|
||||
Hosts: []string{"web.example.com"},
|
||||
RaftIndex: structs.RaftIndex{
|
||||
CreateIndex: 26,
|
||||
ModifyIndex: 26,
|
||||
},
|
||||
},
|
||||
}
|
||||
assert.Equal(t, expect, out)
|
||||
})
|
||||
|
||||
t.Run("delete-ingress-entry", func(t *testing.T) {
|
||||
// Deleting the config entry should remove existing mappings
|
||||
assert.Nil(t, s.DeleteConfigEntry(28, "ingress-gateway", "ingress", nil))
|
||||
assert.True(t, watchFired(ws))
|
||||
|
||||
idx, out, err := s.DumpGatewayServices(ws)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, idx, uint64(28))
|
||||
assert.Len(t, out, 0)
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue