consul/proto-public/pbcatalog/v2beta1/service_addon_test.go
Nitya Dhanushkodi 92aab7ea31
[NET-5586][rebased] v2: Support virtual port references in config (#20371)
[OG Author: michael.zalimeni@hashicorp.com, rebase needed a separate PR]

* v2: support virtual port in Service port references

In addition to Service target port references, allow users to specify a
port by stringified virtual port value. This is useful in environments
such as Kubernetes where typical configuration is written in terms of
Service virtual ports rather than workload (pod) target port names.

Retaining the option of referencing target ports by name supports VMs,
Nomad, and other use cases where virtual ports are not used by default.

To support both uses cases at once, we will strictly interpret port
references based on whether the value is numeric. See updated
`ServicePort` docs for more details.

* v2: update service ref docs for virtual port support

Update proto and generated .go files with docs reflecting virtual port
reference support.

* v2: add virtual port references to L7 topo test

Add coverage for mixed virtual and target port references to existing
test.

* update failover policy controller tests to work with computed failover policy and assert error conditions against FailoverPolicy and ComputedFailoverPolicy resources

* accumulate services; don't overwrite them in enterprise

---------

Co-authored-by: Michael Zalimeni <michael.zalimeni@hashicorp.com>
Co-authored-by: R.B. Boyer <rb@hashicorp.com>
2024-01-29 10:43:41 -08:00

209 lines
4.2 KiB
Go

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package catalogv2beta1
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestServiceIsMeshEnabled(t *testing.T) {
cases := map[string]struct {
service *Service
exp bool
}{
"nil": {service: nil, exp: false},
"no ports": {
service: &Service{},
exp: false,
},
"no mesh ports": {
service: &Service{
Ports: []*ServicePort{
{
TargetPort: "foo",
Protocol: Protocol_PROTOCOL_HTTP,
},
{
TargetPort: "bar",
Protocol: Protocol_PROTOCOL_TCP,
},
},
},
exp: false,
},
"with mesh ports": {
service: &Service{
Ports: []*ServicePort{
{
TargetPort: "foo",
Protocol: Protocol_PROTOCOL_HTTP,
},
{
TargetPort: "bar",
Protocol: Protocol_PROTOCOL_TCP,
},
{
TargetPort: "baz",
Protocol: Protocol_PROTOCOL_MESH,
},
},
},
exp: true,
},
}
for name, c := range cases {
t.Run(name, func(t *testing.T) {
require.Equal(t, c.exp, c.service.IsMeshEnabled())
})
}
}
func TestFindPort(t *testing.T) {
cases := map[string]struct {
service *Service
port string
expById *ServicePort
expByTargetPort *ServicePort
}{
"nil": {service: nil, port: "foo", expById: nil, expByTargetPort: nil},
"no ports": {
service: &Service{},
port: "foo",
expById: nil,
expByTargetPort: nil,
},
"non-existing port": {
service: &Service{
Ports: []*ServicePort{
{
TargetPort: "foo",
Protocol: Protocol_PROTOCOL_HTTP,
},
{
TargetPort: "bar",
Protocol: Protocol_PROTOCOL_TCP,
},
},
},
port: "not-found",
expById: nil,
expByTargetPort: nil,
},
"existing port": {
service: &Service{
Ports: []*ServicePort{
{
TargetPort: "foo",
Protocol: Protocol_PROTOCOL_HTTP,
},
{
TargetPort: "bar",
Protocol: Protocol_PROTOCOL_TCP,
},
{
TargetPort: "baz",
Protocol: Protocol_PROTOCOL_MESH,
},
},
},
port: "bar",
expById: &ServicePort{
TargetPort: "bar",
Protocol: Protocol_PROTOCOL_TCP,
},
expByTargetPort: &ServicePort{
TargetPort: "bar",
Protocol: Protocol_PROTOCOL_TCP,
},
},
"existing port by virtual port": {
service: &Service{
Ports: []*ServicePort{
{
TargetPort: "foo",
VirtualPort: 8080,
Protocol: Protocol_PROTOCOL_HTTP,
},
{
TargetPort: "bar",
VirtualPort: 8081,
Protocol: Protocol_PROTOCOL_TCP,
},
{
TargetPort: "baz",
VirtualPort: 8081,
Protocol: Protocol_PROTOCOL_MESH,
},
},
},
port: "8081",
expById: &ServicePort{
TargetPort: "bar",
VirtualPort: 8081,
Protocol: Protocol_PROTOCOL_TCP,
},
expByTargetPort: nil,
},
}
for name, c := range cases {
t.Run(name, func(t *testing.T) {
require.Equal(t, c.expById, c.service.FindPortByID(c.port))
require.Equal(t, c.expByTargetPort, c.service.FindTargetPort(c.port))
})
}
}
func TestMatchesPortId(t *testing.T) {
testPort := &ServicePort{VirtualPort: 8080, TargetPort: "http"}
cases := map[string]struct {
port *ServicePort
id string
expected bool
}{
"nil": {port: nil, id: "foo", expected: false},
"empty": {port: testPort, id: "", expected: false},
"non-existing virtual port": {
port: testPort,
id: "9090",
expected: false,
},
"non-existing target port": {
port: testPort,
id: "other-port",
expected: false,
},
"existing virtual port": {
port: testPort,
id: "8080",
expected: true,
},
"existing target port": {
port: testPort,
id: "http",
expected: true,
},
"virtual and target mismatch": {
port: &ServicePort{VirtualPort: 8080, TargetPort: "9090"},
id: "9090",
expected: false,
},
"virtual and target match": {
port: &ServicePort{VirtualPort: 9090, TargetPort: "9090"},
id: "9090",
expected: true,
},
}
for name, c := range cases {
t.Run(name, func(t *testing.T) {
require.Equal(t, c.expected, c.port.MatchesPortId(c.id))
})
}
}