diff --git a/test-integ/peering_commontopo/ac6_failovers_test.go b/test-integ/peering_commontopo/ac6_failovers_test.go index 25e734200f36..71fedc7342bc 100644 --- a/test-integ/peering_commontopo/ac6_failovers_test.go +++ b/test-integ/peering_commontopo/ac6_failovers_test.go @@ -7,11 +7,10 @@ import ( "fmt" "testing" - "github.com/hashicorp/consul/testing/deployer/topology" - "github.com/stretchr/testify/require" - "github.com/hashicorp/consul/api" "github.com/hashicorp/consul/test/integration/consul-container/libs/utils" + "github.com/hashicorp/consul/testing/deployer/topology" + "github.com/stretchr/testify/require" ) type ac6FailoversSuite struct { @@ -199,8 +198,13 @@ func (s *ac6FailoversSuite) testName() (ret string) { } func (s *ac6FailoversSuite) setup(t *testing.T, ct *commonTopo) { - if !utils.IsEnterprise() && (s.NearInPartAlt || s.FarInPartAlt) { - t.Skip("ENT required for nondefault partitions") + if !utils.IsEnterprise() { + if s.NearInPartAlt || s.FarInPartAlt { + t.Skip("ENT required for nondefault partitions") + } + if s.NearInNSAlt || s.FarInNSAlt { + t.Skip("ENT required for nondefault namespaces") + } } nearClu := ct.DC1 @@ -215,8 +219,8 @@ func (s *ac6FailoversSuite) setup(t *testing.T, ct *commonTopo) { // - server in clientPartition/DC (main target) nearServerSID := topology.ServiceID{ Name: "ac6-server", - Partition: ConfigEntryPartition("default"), - Namespace: "default", + Partition: defaultToEmptyForCE("default"), + Namespace: defaultToEmptyForCE("default"), } if s.NearInPartAlt { nearServerSID.Partition = "part1" @@ -235,16 +239,16 @@ func (s *ac6FailoversSuite) setup(t *testing.T, ct *commonTopo) { &api.ServiceConfigEntry{ Kind: api.ServiceDefaults, Name: nearServerSID.Name, - Partition: ConfigEntryPartition(nearServerSID.Partition), - Namespace: nearServerSID.Namespace, + Partition: defaultToEmptyForCE(nearServerSID.Partition), + Namespace: defaultToEmptyForCE(nearServerSID.Namespace), Protocol: "http", }, ) // - server in otherPartition/otherDC farServerSID := topology.ServiceID{ Name: nearServerSID.Name, - Partition: "default", - Namespace: "default", + Partition: defaultToEmptyForCE("default"), + Namespace: defaultToEmptyForCE("default"), } if s.FarInPartAlt { farServerSID.Partition = "part1" @@ -262,7 +266,7 @@ func (s *ac6FailoversSuite) setup(t *testing.T, ct *commonTopo) { ct.ExportService(farClu, farServerSID.Partition, api.ExportedService{ Name: farServerSID.Name, - Namespace: farServerSID.Namespace, + Namespace: defaultToEmptyForCE(farServerSID.Namespace), Consumers: []api.ServiceConsumer{ { Peer: LocalPeerName(nearClu, nearServerSID.Partition), @@ -274,7 +278,7 @@ func (s *ac6FailoversSuite) setup(t *testing.T, ct *commonTopo) { ct.ExportService(farClu, farServerSID.Partition, api.ExportedService{ Name: farServerSID.Name, - Namespace: farServerSID.Namespace, + Namespace: defaultToEmptyForCE(farServerSID.Namespace), Consumers: []api.ServiceConsumer{ { // this must not be "", or else it is basically ignored altogether @@ -292,7 +296,7 @@ func (s *ac6FailoversSuite) setup(t *testing.T, ct *commonTopo) { { Service: farServerSID.Name, Peer: LocalPeerName(farClu, farServerSID.Partition), - Namespace: farServerSID.Namespace, + Namespace: defaultToEmptyForCE(farServerSID.Namespace), }, } } else { @@ -306,8 +310,8 @@ func (s *ac6FailoversSuite) setup(t *testing.T, ct *commonTopo) { targets = []api.ServiceResolverFailoverTarget{ { Service: farServerSID.Name, - Partition: part, - Namespace: farServerSID.Namespace, + Partition: defaultToEmptyForCE(part), + Namespace: defaultToEmptyForCE(farServerSID.Namespace), }, } } @@ -316,15 +320,15 @@ func (s *ac6FailoversSuite) setup(t *testing.T, ct *commonTopo) { &api.ServiceConfigEntry{ Kind: api.ServiceDefaults, Name: farServerSID.Name, - Partition: ConfigEntryPartition(farServerSID.Partition), - Namespace: farServerSID.Namespace, + Partition: defaultToEmptyForCE(farServerSID.Partition), + Namespace: defaultToEmptyForCE(farServerSID.Namespace), Protocol: "http", }, &api.ServiceResolverConfigEntry{ Kind: api.ServiceResolver, Name: nearServerSID.Name, - Partition: ConfigEntryPartition(nearServerSID.Partition), - Namespace: nearServerSID.Namespace, + Partition: defaultToEmptyForCE(nearServerSID.Partition), + Namespace: defaultToEmptyForCE(nearServerSID.Namespace), Failover: map[string]api.ServiceResolverFailover{ "*": { Targets: targets, @@ -335,8 +339,8 @@ func (s *ac6FailoversSuite) setup(t *testing.T, ct *commonTopo) { clientSID := topology.ServiceID{ Name: "ac6-client", - Partition: nearServerSID.Partition, - Namespace: nearServerSID.Namespace, + Partition: defaultToEmptyForCE(nearServerSID.Partition), + Namespace: defaultToEmptyForCE(nearServerSID.Namespace), } client := NewFortioServiceWithDefaults( nearClu.Datacenter, @@ -347,8 +351,8 @@ func (s *ac6FailoversSuite) setup(t *testing.T, ct *commonTopo) { { ID: topology.ServiceID{ Name: nearServerSID.Name, - Partition: nearServerSID.Partition, - Namespace: nearServerSID.Namespace, + Partition: defaultToEmptyForCE(nearServerSID.Partition), + Namespace: defaultToEmptyForCE(nearServerSID.Namespace), }, LocalPort: 5000, // exposed so we can hit it directly @@ -363,8 +367,8 @@ func (s *ac6FailoversSuite) setup(t *testing.T, ct *commonTopo) { &api.ServiceConfigEntry{ Kind: api.ServiceDefaults, Name: clientSID.Name, - Partition: ConfigEntryPartition(clientSID.Partition), - Namespace: clientSID.Namespace, + Partition: defaultToEmptyForCE(clientSID.Partition), + Namespace: defaultToEmptyForCE(clientSID.Namespace), Protocol: "http", }, ) @@ -374,21 +378,21 @@ func (s *ac6FailoversSuite) setup(t *testing.T, ct *commonTopo) { &api.ServiceIntentionsConfigEntry{ Kind: api.ServiceIntentions, Name: nearServerSID.Name, - Partition: ConfigEntryPartition(nearServerSID.Partition), - Namespace: nearServerSID.Namespace, + Partition: defaultToEmptyForCE(nearServerSID.Partition), + Namespace: defaultToEmptyForCE(nearServerSID.Namespace), Sources: []*api.SourceIntention{{ Name: clientSID.Name, - Namespace: clientSID.Namespace, + Namespace: defaultToEmptyForCE(clientSID.Namespace), // in this field, "" -> destination partition, so no ConfigEntryPartition :eyeroll: // https://developer.hashicorp.com/consul/docs/connect/config-entries/service-intentions#sources-partition - Partition: topology.PartitionOrDefault(clientSID.Partition), + Partition: defaultToEmptyForCE(clientSID.Partition), Action: api.IntentionActionAllow, }}, }, ) farSource := api.SourceIntention{ Name: clientSID.Name, - Namespace: clientSID.Namespace, + Namespace: defaultToEmptyForCE(clientSID.Namespace), Peer: LocalPeerName(nearClu, clientSID.Partition), Action: api.IntentionActionAllow, } @@ -402,8 +406,8 @@ func (s *ac6FailoversSuite) setup(t *testing.T, ct *commonTopo) { &api.ServiceIntentionsConfigEntry{ Kind: api.ServiceIntentions, Name: farServerSID.Name, - Partition: ConfigEntryPartition(farServerSID.Partition), - Namespace: farServerSID.Namespace, + Partition: defaultToEmptyForCE(farServerSID.Partition), + Namespace: defaultToEmptyForCE(farServerSID.Namespace), Sources: []*api.SourceIntention{&farSource}, }, ) @@ -464,3 +468,10 @@ func (s *ac6FailoversSuite) test(t *testing.T, ct *commonTopo) { expectSID.Normalize() ct.Assert.FortioFetch2FortioName(t, client, upstream, farClu.Name, expectSID) } + +func defaultToEmptyForCE(tenancy string) string { + if utils.IsEnterprise() { + return tenancy + } + return topology.DefaultToEmpty(tenancy) +} diff --git a/test-integ/peering_commontopo/commontopo.go b/test-integ/peering_commontopo/commontopo.go index be2ae79cd64f..253bddb2eb61 100644 --- a/test-integ/peering_commontopo/commontopo.go +++ b/test-integ/peering_commontopo/commontopo.go @@ -327,8 +327,8 @@ func (ct *commonTopo) ExportService(clu *topology.Cluster, partition string, svc if !found { clu.InitialConfigEntries = append(clu.InitialConfigEntries, &api.ExportedServicesConfigEntry{ - Name: partition, // this NEEDs to be "default" in CE - Partition: ConfigEntryPartition(partition), + Name: topology.PartitionOrDefault(partition), // this NEEDs to be "default" in CE + Partition: topology.DefaultToEmpty(partition), Services: svcs, }, ) diff --git a/test-integ/topoutil/fixtures.go b/test-integ/topoutil/fixtures.go index a0c72e246a93..9b1f958f4451 100644 --- a/test-integ/topoutil/fixtures.go +++ b/test-integ/topoutil/fixtures.go @@ -105,7 +105,7 @@ func NewTopologyMeshGatewaySet( node := &topology.Node{ Kind: nodeKind, - Partition: partition, + Partition: sid.Partition, Name: name, Services: []*topology.Service{{ ID: sid, diff --git a/testing/deployer/sprawl/peering.go b/testing/deployer/sprawl/peering.go index 12c6f3e3ce62..96791a9ae90d 100644 --- a/testing/deployer/sprawl/peering.go +++ b/testing/deployer/sprawl/peering.go @@ -208,10 +208,7 @@ func (s *Sprawl) awaitMeshGateways() { logger.Info("awaiting MGW readiness") RETRY: // TODO: not sure if there's a better way to check if the MGW is ready - svcs, _, err := cl.Catalog().Service(mgw.ID.Name, "", &api.QueryOptions{ - Namespace: mgw.ID.Namespace, - Partition: mgw.ID.Partition, - }) + svcs, _, err := cl.Catalog().Service(mgw.ID.Name, "", mgw.ID.QueryOptions()) if err != nil { logger.Debug("fetching MGW service", "err", err) time.Sleep(time.Second) @@ -227,10 +224,7 @@ func (s *Sprawl) awaitMeshGateways() { log.Fatalf("expected 1 MGW service, actually: %#v", svcs) } - entries, _, err := cl.Health().Service(mgw.ID.Name, "", true, &api.QueryOptions{ - Namespace: mgw.ID.Namespace, - Partition: mgw.ID.Partition, - }) + entries, _, err := cl.Health().Service(mgw.ID.Name, "", true, mgw.ID.QueryOptions()) if err != nil { logger.Debug("fetching MGW checks", "err", err) time.Sleep(time.Second) diff --git a/testing/deployer/topology/ids.go b/testing/deployer/topology/ids.go index 73106ff4c91b..e1e109181bfd 100644 --- a/testing/deployer/topology/ids.go +++ b/testing/deployer/topology/ids.go @@ -125,6 +125,13 @@ func (id ServiceID) NamespaceOrDefault() string { return NamespaceOrDefault(id.Namespace) } +func (id ServiceID) QueryOptions() *api.QueryOptions { + return &api.QueryOptions{ + Partition: DefaultToEmpty(id.Partition), + Namespace: DefaultToEmpty(id.Namespace), + } +} + func PartitionOrDefault(name string) string { if name == "" { return "default"