mirror of https://github.com/hashicorp/consul
Chris S. Kim
9 months ago
committed by
GitHub
3 changed files with 707 additions and 14 deletions
@ -0,0 +1,428 @@ |
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: BUSL-1.1
|
||||||
|
|
||||||
|
package v1compat |
||||||
|
|
||||||
|
import ( |
||||||
|
"context" |
||||||
|
"fmt" |
||||||
|
"testing" |
||||||
|
|
||||||
|
"github.com/stretchr/testify/require" |
||||||
|
"github.com/stretchr/testify/suite" |
||||||
|
|
||||||
|
"github.com/hashicorp/consul/acl" |
||||||
|
svctest "github.com/hashicorp/consul/agent/grpc-external/services/resource/testing" |
||||||
|
"github.com/hashicorp/consul/agent/structs" |
||||||
|
"github.com/hashicorp/consul/internal/catalog" |
||||||
|
"github.com/hashicorp/consul/internal/controller" |
||||||
|
"github.com/hashicorp/consul/internal/multicluster/internal/types" |
||||||
|
"github.com/hashicorp/consul/internal/resource" |
||||||
|
rtest "github.com/hashicorp/consul/internal/resource/resourcetest" |
||||||
|
pbmulticluster "github.com/hashicorp/consul/proto-public/pbmulticluster/v2" |
||||||
|
"github.com/hashicorp/consul/proto-public/pbresource" |
||||||
|
"github.com/hashicorp/consul/sdk/testutil" |
||||||
|
"github.com/hashicorp/consul/version/versiontest" |
||||||
|
) |
||||||
|
|
||||||
|
type controllerSuite struct { |
||||||
|
suite.Suite |
||||||
|
ctx context.Context |
||||||
|
ctl *controller.TestController |
||||||
|
isEnterprise bool |
||||||
|
tenancies []*pbresource.Tenancy |
||||||
|
config *MockAggregatedConfig |
||||||
|
} |
||||||
|
|
||||||
|
func (suite *controllerSuite) SetupTest() { |
||||||
|
suite.tenancies = rtest.TestTenancies() |
||||||
|
suite.isEnterprise = versiontest.IsEnterprise() |
||||||
|
suite.ctx = testutil.TestContext(suite.T()) |
||||||
|
client := svctest.NewResourceServiceBuilder(). |
||||||
|
WithRegisterFns(types.Register, catalog.RegisterTypes). |
||||||
|
WithTenancies(suite.tenancies...). |
||||||
|
Run(suite.T()) |
||||||
|
|
||||||
|
suite.config = NewMockAggregatedConfig(suite.T()) |
||||||
|
suite.config.EXPECT().EventChannel().Return(make(chan controller.Event)) |
||||||
|
suite.ctl = controller.NewTestController( |
||||||
|
Controller(suite.config), |
||||||
|
client, |
||||||
|
).WithLogger(testutil.Logger(suite.T())) |
||||||
|
} |
||||||
|
|
||||||
|
// Test that we do nothing if V1 exports have not been replicated to v2 resources compatible with this controller
|
||||||
|
func (suite *controllerSuite) TestReconcile_V1ExportsExist() { |
||||||
|
incompatibleConfig := &structs.ExportedServicesConfigEntry{ |
||||||
|
Name: "v1Legacy", |
||||||
|
Meta: map[string]string{controllerMetaKey: "foo-controller"}, |
||||||
|
} |
||||||
|
|
||||||
|
suite.runTestCaseWithTenancies(func(tenancy *pbresource.Tenancy) { |
||||||
|
entMeta := acl.DefaultEnterpriseMeta() |
||||||
|
entMeta.OverridePartition(tenancy.Partition) |
||||||
|
|
||||||
|
suite.config.EXPECT(). |
||||||
|
GetExportedServicesConfigEntry(suite.ctx, tenancy.Partition, entMeta). |
||||||
|
Return(incompatibleConfig, nil) |
||||||
|
|
||||||
|
resID := &pbresource.ID{ |
||||||
|
Type: pbmulticluster.ComputedExportedServicesType, |
||||||
|
Tenancy: &pbresource.Tenancy{Partition: tenancy.Partition}, |
||||||
|
Name: types.ComputedExportedServicesName, |
||||||
|
} |
||||||
|
err := suite.ctl.Reconcile(suite.ctx, controller.Request{ID: resID}) |
||||||
|
require.NoError(suite.T(), err) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
// Test that we do not stop reconciler even when we fail to retrieve the config entry
|
||||||
|
func (suite *controllerSuite) TestReconcile_GetExportedServicesConfigEntry_Error() { |
||||||
|
suite.runTestCaseWithTenancies(func(tenancy *pbresource.Tenancy) { |
||||||
|
entMeta := acl.DefaultEnterpriseMeta() |
||||||
|
entMeta.OverridePartition(tenancy.Partition) |
||||||
|
|
||||||
|
suite.config.EXPECT(). |
||||||
|
GetExportedServicesConfigEntry(suite.ctx, tenancy.Partition, entMeta). |
||||||
|
Return(nil, fmt.Errorf("failed to retrieve config entry")) |
||||||
|
|
||||||
|
resID := &pbresource.ID{ |
||||||
|
Type: pbmulticluster.ComputedExportedServicesType, |
||||||
|
Tenancy: &pbresource.Tenancy{Partition: tenancy.Partition}, |
||||||
|
Name: types.ComputedExportedServicesName, |
||||||
|
} |
||||||
|
err := suite.ctl.Reconcile(suite.ctx, controller.Request{ID: resID}) |
||||||
|
require.NoError(suite.T(), err) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
// Delete config entry for case where resources aren't found
|
||||||
|
func (suite *controllerSuite) TestReconcile_DeleteConfig_MissingResources() { |
||||||
|
suite.runTestCaseWithTenancies(func(tenancy *pbresource.Tenancy) { |
||||||
|
entMeta := acl.DefaultEnterpriseMeta() |
||||||
|
entMeta.OverridePartition(tenancy.Partition) |
||||||
|
|
||||||
|
configEntry := &structs.ExportedServicesConfigEntry{ |
||||||
|
// v1 exported-services config entries must have a Name that is the partitions name
|
||||||
|
Name: tenancy.Partition, |
||||||
|
Meta: map[string]string{ |
||||||
|
controllerMetaKey: ControllerName, |
||||||
|
}, |
||||||
|
EnterpriseMeta: acl.NewEnterpriseMetaWithPartition(tenancy.Partition, ""), |
||||||
|
} |
||||||
|
|
||||||
|
suite.config.EXPECT().GetExportedServicesConfigEntry(suite.ctx, tenancy.Partition, entMeta).Return(configEntry, nil) |
||||||
|
suite.config.EXPECT().DeleteExportedServicesConfigEntry(suite.ctx, tenancy.Partition, entMeta).Return(nil) |
||||||
|
|
||||||
|
resID := &pbresource.ID{ |
||||||
|
Type: pbmulticluster.ComputedExportedServicesType, |
||||||
|
Tenancy: &pbresource.Tenancy{Partition: tenancy.Partition}, |
||||||
|
Name: types.ComputedExportedServicesName, |
||||||
|
} |
||||||
|
err := suite.ctl.Reconcile(suite.ctx, controller.Request{ID: resID}) |
||||||
|
require.NoError(suite.T(), err) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
func (suite *controllerSuite) TestReconcile_NewExport_PartitionExport() { |
||||||
|
if !suite.isEnterprise { |
||||||
|
suite.T().Skip("this test should only run against the enterprise build") |
||||||
|
} |
||||||
|
|
||||||
|
suite.runTestCaseWithTenancies(func(tenancy *pbresource.Tenancy) { |
||||||
|
entMeta := acl.DefaultEnterpriseMeta() |
||||||
|
entMeta.OverridePartition(tenancy.Partition) |
||||||
|
|
||||||
|
// used as a return value for GetExportedServicesConfigEntry
|
||||||
|
existingCE := &structs.ExportedServicesConfigEntry{ |
||||||
|
// v1 exported-services config entries must have a Name that is the partitions name
|
||||||
|
Name: tenancy.Partition, |
||||||
|
Meta: map[string]string{ |
||||||
|
controllerMetaKey: ControllerName, |
||||||
|
}, |
||||||
|
EnterpriseMeta: acl.NewEnterpriseMetaWithPartition(tenancy.Partition, ""), |
||||||
|
} |
||||||
|
suite.config.EXPECT().GetExportedServicesConfigEntry(suite.ctx, tenancy.Partition, entMeta).Return(existingCE, nil) |
||||||
|
|
||||||
|
// expected config entry to be written by reconcile
|
||||||
|
expectedCE := &structs.ExportedServicesConfigEntry{ |
||||||
|
Name: tenancy.Partition, |
||||||
|
Services: []structs.ExportedService{ |
||||||
|
{ |
||||||
|
Name: "s1", |
||||||
|
Namespace: resource.DefaultNamespaceName, |
||||||
|
Consumers: []structs.ServiceConsumer{ |
||||||
|
{ |
||||||
|
Partition: "p1", |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
Meta: map[string]string{ |
||||||
|
controllerMetaKey: ControllerName, |
||||||
|
}, |
||||||
|
EnterpriseMeta: *entMeta, |
||||||
|
} |
||||||
|
suite.config.EXPECT().WriteExportedServicesConfigEntry(suite.ctx, expectedCE).Return(nil) |
||||||
|
|
||||||
|
name := "s1" |
||||||
|
expSv := &pbmulticluster.ExportedServices{ |
||||||
|
Services: []string{name}, |
||||||
|
Consumers: []*pbmulticluster.ExportedServicesConsumer{ |
||||||
|
{ConsumerTenancy: &pbmulticluster.ExportedServicesConsumer_Partition{Partition: "p1"}}, |
||||||
|
}, |
||||||
|
} |
||||||
|
rtest.Resource(pbmulticluster.ExportedServicesType, "exported-svcs"). |
||||||
|
WithData(suite.T(), expSv). |
||||||
|
WithTenancy(&pbresource.Tenancy{Partition: tenancy.Partition}). |
||||||
|
Write(suite.T(), suite.ctl.Runtime().Client) |
||||||
|
cesID := &pbresource.ID{ |
||||||
|
Type: pbmulticluster.ComputedExportedServicesType, |
||||||
|
Tenancy: &pbresource.Tenancy{Partition: tenancy.Partition}, |
||||||
|
Name: types.ComputedExportedServicesName, |
||||||
|
} |
||||||
|
err := suite.ctl.Reconcile(suite.ctx, controller.Request{ID: cesID}) |
||||||
|
require.NoError(suite.T(), err) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
func (suite *controllerSuite) TestReconcile_NewExport_PeerExport() { |
||||||
|
if !suite.isEnterprise { |
||||||
|
suite.T().Skip("this test should only run against the enterprise build") |
||||||
|
} |
||||||
|
|
||||||
|
suite.runTestCaseWithTenancies(func(tenancy *pbresource.Tenancy) { |
||||||
|
entMeta := acl.DefaultEnterpriseMeta() |
||||||
|
entMeta.OverridePartition(tenancy.Partition) |
||||||
|
|
||||||
|
// used as a return value for GetExportedServicesConfigEntry
|
||||||
|
existingCE := &structs.ExportedServicesConfigEntry{ |
||||||
|
// v1 exported-services config entries must have a Name that is the partitions name
|
||||||
|
Name: tenancy.Partition, |
||||||
|
Meta: map[string]string{ |
||||||
|
controllerMetaKey: ControllerName, |
||||||
|
}, |
||||||
|
EnterpriseMeta: acl.NewEnterpriseMetaWithPartition(tenancy.Partition, ""), |
||||||
|
} |
||||||
|
suite.config.EXPECT().GetExportedServicesConfigEntry(suite.ctx, tenancy.Partition, entMeta).Return(existingCE, nil) |
||||||
|
|
||||||
|
// expected config entry to be written by reconcile
|
||||||
|
expectedCE := &structs.ExportedServicesConfigEntry{ |
||||||
|
Name: tenancy.Partition, |
||||||
|
Services: []structs.ExportedService{ |
||||||
|
{ |
||||||
|
Name: "s1", |
||||||
|
Namespace: resource.DefaultNamespaceName, |
||||||
|
Consumers: []structs.ServiceConsumer{ |
||||||
|
{ |
||||||
|
Peer: "peer1", |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
Meta: map[string]string{ |
||||||
|
controllerMetaKey: ControllerName, |
||||||
|
}, |
||||||
|
EnterpriseMeta: *entMeta, |
||||||
|
} |
||||||
|
suite.config.EXPECT().WriteExportedServicesConfigEntry(suite.ctx, expectedCE).Return(nil) |
||||||
|
|
||||||
|
name := "s1" |
||||||
|
expSv := &pbmulticluster.ExportedServices{ |
||||||
|
Services: []string{name}, |
||||||
|
Consumers: []*pbmulticluster.ExportedServicesConsumer{ |
||||||
|
{ConsumerTenancy: &pbmulticluster.ExportedServicesConsumer_Peer{Peer: "peer1"}}, |
||||||
|
}, |
||||||
|
} |
||||||
|
rtest.Resource(pbmulticluster.ExportedServicesType, "exported-svcs"). |
||||||
|
WithData(suite.T(), expSv). |
||||||
|
WithTenancy(&pbresource.Tenancy{Partition: tenancy.Partition}). |
||||||
|
Write(suite.T(), suite.ctl.Runtime().Client) |
||||||
|
cesID := &pbresource.ID{ |
||||||
|
Type: pbmulticluster.ComputedExportedServicesType, |
||||||
|
Tenancy: &pbresource.Tenancy{Partition: tenancy.Partition}, |
||||||
|
Name: types.ComputedExportedServicesName, |
||||||
|
} |
||||||
|
err := suite.ctl.Reconcile(suite.ctx, controller.Request{ID: cesID}) |
||||||
|
require.NoError(suite.T(), err) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
func (suite *controllerSuite) TestReconcile_NewExport_SamenessGroupsExport() { |
||||||
|
if !suite.isEnterprise { |
||||||
|
suite.T().Skip("this test should only run against the enterprise build") |
||||||
|
} |
||||||
|
|
||||||
|
suite.runTestCaseWithTenancies(func(tenancy *pbresource.Tenancy) { |
||||||
|
entMeta := acl.DefaultEnterpriseMeta() |
||||||
|
entMeta.OverridePartition(tenancy.Partition) |
||||||
|
|
||||||
|
// used as a return value for GetExportedServicesConfigEntry
|
||||||
|
existingCE := &structs.ExportedServicesConfigEntry{ |
||||||
|
// v1 exported-services config entries must have a Name that is the partitions name
|
||||||
|
Name: tenancy.Partition, |
||||||
|
Meta: map[string]string{ |
||||||
|
controllerMetaKey: ControllerName, |
||||||
|
}, |
||||||
|
EnterpriseMeta: acl.NewEnterpriseMetaWithPartition(tenancy.Partition, ""), |
||||||
|
} |
||||||
|
suite.config.EXPECT().GetExportedServicesConfigEntry(suite.ctx, tenancy.Partition, entMeta).Return(existingCE, nil) |
||||||
|
|
||||||
|
// expected config entry to be written by reconcile
|
||||||
|
expectedCE := &structs.ExportedServicesConfigEntry{ |
||||||
|
Name: tenancy.Partition, |
||||||
|
Services: []structs.ExportedService{ |
||||||
|
{ |
||||||
|
Name: "s1", |
||||||
|
Namespace: resource.DefaultNamespaceName, |
||||||
|
Consumers: []structs.ServiceConsumer{ |
||||||
|
{ |
||||||
|
SamenessGroup: "sg1", |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
Meta: map[string]string{ |
||||||
|
controllerMetaKey: ControllerName, |
||||||
|
}, |
||||||
|
EnterpriseMeta: *entMeta, |
||||||
|
} |
||||||
|
suite.config.EXPECT().WriteExportedServicesConfigEntry(suite.ctx, expectedCE).Return(nil) |
||||||
|
|
||||||
|
name := "s1" |
||||||
|
expSv := &pbmulticluster.ExportedServices{ |
||||||
|
Services: []string{name}, |
||||||
|
Consumers: []*pbmulticluster.ExportedServicesConsumer{ |
||||||
|
{ConsumerTenancy: &pbmulticluster.ExportedServicesConsumer_SamenessGroup{SamenessGroup: "sg1"}}, |
||||||
|
}, |
||||||
|
} |
||||||
|
rtest.Resource(pbmulticluster.ExportedServicesType, "exported-svcs"). |
||||||
|
WithData(suite.T(), expSv). |
||||||
|
WithTenancy(&pbresource.Tenancy{Partition: tenancy.Partition}). |
||||||
|
Write(suite.T(), suite.ctl.Runtime().Client) |
||||||
|
cesID := &pbresource.ID{ |
||||||
|
Type: pbmulticluster.ComputedExportedServicesType, |
||||||
|
Tenancy: &pbresource.Tenancy{Partition: tenancy.Partition}, |
||||||
|
Name: types.ComputedExportedServicesName, |
||||||
|
} |
||||||
|
err := suite.ctl.Reconcile(suite.ctx, controller.Request{ID: cesID}) |
||||||
|
require.NoError(suite.T(), err) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
func (suite *controllerSuite) TestReconcile_MultipleExports() { |
||||||
|
if !suite.isEnterprise { |
||||||
|
suite.T().Skip("this test should only run against the enterprise build") |
||||||
|
} |
||||||
|
|
||||||
|
suite.runTestCaseWithTenancies(func(tenancy *pbresource.Tenancy) { |
||||||
|
entMeta := acl.DefaultEnterpriseMeta() |
||||||
|
entMeta.OverridePartition(tenancy.Partition) |
||||||
|
configCE := &structs.ExportedServicesConfigEntry{ |
||||||
|
// v1 exported-services config entries must have a Name that is the partitions name
|
||||||
|
Name: tenancy.Partition, |
||||||
|
Meta: map[string]string{ |
||||||
|
controllerMetaKey: ControllerName, |
||||||
|
}, |
||||||
|
EnterpriseMeta: acl.NewEnterpriseMetaWithPartition(tenancy.Partition, ""), |
||||||
|
} |
||||||
|
|
||||||
|
suite.config.EXPECT(). |
||||||
|
GetExportedServicesConfigEntry(suite.ctx, tenancy.Partition, entMeta). |
||||||
|
Return(configCE, nil) |
||||||
|
|
||||||
|
expSv1 := &pbmulticluster.ExportedServices{ |
||||||
|
Services: []string{"s1"}, |
||||||
|
Consumers: []*pbmulticluster.ExportedServicesConsumer{ |
||||||
|
{ConsumerTenancy: &pbmulticluster.ExportedServicesConsumer_Partition{Partition: "p1"}}, |
||||||
|
{ConsumerTenancy: &pbmulticluster.ExportedServicesConsumer_Partition{Partition: "p4"}}, |
||||||
|
}, |
||||||
|
} |
||||||
|
expSv2 := &pbmulticluster.ExportedServices{ |
||||||
|
Services: []string{"s2"}, |
||||||
|
Consumers: []*pbmulticluster.ExportedServicesConsumer{ |
||||||
|
{ConsumerTenancy: &pbmulticluster.ExportedServicesConsumer_Partition{Partition: "p2"}}, |
||||||
|
{ConsumerTenancy: &pbmulticluster.ExportedServicesConsumer_Peer{Peer: "peer1"}}, |
||||||
|
}, |
||||||
|
} |
||||||
|
expSv3 := &pbmulticluster.ExportedServices{ |
||||||
|
Services: []string{"s1", "s3"}, |
||||||
|
Consumers: []*pbmulticluster.ExportedServicesConsumer{ |
||||||
|
{ConsumerTenancy: &pbmulticluster.ExportedServicesConsumer_Partition{Partition: "p3"}}, |
||||||
|
{ConsumerTenancy: &pbmulticluster.ExportedServicesConsumer_SamenessGroup{SamenessGroup: "sg1"}}, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
for i, s := range []*pbmulticluster.ExportedServices{expSv1, expSv2, expSv3} { |
||||||
|
rtest.Resource(pbmulticluster.ExportedServicesType, fmt.Sprintf("exported-svcs-%d", i)). |
||||||
|
WithData(suite.T(), s). |
||||||
|
WithTenancy(&pbresource.Tenancy{Partition: tenancy.Partition}). |
||||||
|
Write(suite.T(), suite.ctl.Runtime().Client) |
||||||
|
} |
||||||
|
|
||||||
|
cesID := &pbresource.ID{ |
||||||
|
Type: pbmulticluster.ComputedExportedServicesType, |
||||||
|
Tenancy: &pbresource.Tenancy{Partition: tenancy.Partition}, |
||||||
|
Name: types.ComputedExportedServicesName, |
||||||
|
} |
||||||
|
|
||||||
|
// expected computed config entry to be written by reconcile
|
||||||
|
computedConfigEntry := &structs.ExportedServicesConfigEntry{ |
||||||
|
Name: tenancy.Partition, |
||||||
|
Meta: map[string]string{ |
||||||
|
controllerMetaKey: ControllerName, |
||||||
|
}, |
||||||
|
Services: []structs.ExportedService{ |
||||||
|
{ |
||||||
|
Name: "s3", |
||||||
|
Namespace: resource.DefaultNamespaceName, |
||||||
|
Consumers: []structs.ServiceConsumer{ |
||||||
|
{Partition: "p3"}, |
||||||
|
{SamenessGroup: "sg1"}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
Name: "s2", |
||||||
|
Namespace: resource.DefaultNamespaceName, |
||||||
|
Consumers: []structs.ServiceConsumer{ |
||||||
|
{Partition: "p2"}, |
||||||
|
{Peer: "peer1"}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
Name: "s1", |
||||||
|
Namespace: resource.DefaultNamespaceName, |
||||||
|
Consumers: []structs.ServiceConsumer{ |
||||||
|
{Partition: "p1"}, |
||||||
|
{Partition: "p3"}, |
||||||
|
{Partition: "p4"}, |
||||||
|
{SamenessGroup: "sg1"}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
EnterpriseMeta: acl.NewEnterpriseMetaWithPartition(tenancy.Partition, resource.DefaultNamespaceName), |
||||||
|
} |
||||||
|
suite.config.EXPECT(). |
||||||
|
WriteExportedServicesConfigEntry(suite.ctx, computedConfigEntry). |
||||||
|
Return(nil) |
||||||
|
|
||||||
|
err := suite.ctl.Reconcile(suite.ctx, controller.Request{ID: cesID}) |
||||||
|
require.NoError(suite.T(), err) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
func (suite *controllerSuite) runTestCaseWithTenancies(testFunc func(*pbresource.Tenancy)) { |
||||||
|
for _, tenancy := range suite.tenancies { |
||||||
|
suite.Run(suite.appendTenancyInfo(tenancy), func() { |
||||||
|
testFunc(tenancy) |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func (suite *controllerSuite) appendTenancyInfo(tenancy *pbresource.Tenancy) string { |
||||||
|
return fmt.Sprintf("%s_Namespace_%s_Partition", tenancy.Namespace, tenancy.Partition) |
||||||
|
} |
||||||
|
|
||||||
|
func TestController(t *testing.T) { |
||||||
|
suite.Run(t, new(controllerSuite)) |
||||||
|
} |
@ -0,0 +1,262 @@ |
|||||||
|
// Code generated by mockery v2.20.0. DO NOT EDIT.
|
||||||
|
|
||||||
|
package v1compat |
||||||
|
|
||||||
|
import ( |
||||||
|
context "context" |
||||||
|
|
||||||
|
acl "github.com/hashicorp/consul/acl" |
||||||
|
|
||||||
|
controller "github.com/hashicorp/consul/internal/controller" |
||||||
|
|
||||||
|
mock "github.com/stretchr/testify/mock" |
||||||
|
|
||||||
|
structs "github.com/hashicorp/consul/agent/structs" |
||||||
|
) |
||||||
|
|
||||||
|
// MockAggregatedConfig is an autogenerated mock type for the AggregatedConfig type
|
||||||
|
type MockAggregatedConfig struct { |
||||||
|
mock.Mock |
||||||
|
} |
||||||
|
|
||||||
|
type MockAggregatedConfig_Expecter struct { |
||||||
|
mock *mock.Mock |
||||||
|
} |
||||||
|
|
||||||
|
func (_m *MockAggregatedConfig) EXPECT() *MockAggregatedConfig_Expecter { |
||||||
|
return &MockAggregatedConfig_Expecter{mock: &_m.Mock} |
||||||
|
} |
||||||
|
|
||||||
|
// DeleteExportedServicesConfigEntry provides a mock function with given fields: _a0, _a1, _a2
|
||||||
|
func (_m *MockAggregatedConfig) DeleteExportedServicesConfigEntry(_a0 context.Context, _a1 string, _a2 *acl.EnterpriseMeta) error { |
||||||
|
ret := _m.Called(_a0, _a1, _a2) |
||||||
|
|
||||||
|
var r0 error |
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, string, *acl.EnterpriseMeta) error); ok { |
||||||
|
r0 = rf(_a0, _a1, _a2) |
||||||
|
} else { |
||||||
|
r0 = ret.Error(0) |
||||||
|
} |
||||||
|
|
||||||
|
return r0 |
||||||
|
} |
||||||
|
|
||||||
|
// MockAggregatedConfig_DeleteExportedServicesConfigEntry_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteExportedServicesConfigEntry'
|
||||||
|
type MockAggregatedConfig_DeleteExportedServicesConfigEntry_Call struct { |
||||||
|
*mock.Call |
||||||
|
} |
||||||
|
|
||||||
|
// DeleteExportedServicesConfigEntry is a helper method to define mock.On call
|
||||||
|
// - _a0 context.Context
|
||||||
|
// - _a1 string
|
||||||
|
// - _a2 *acl.EnterpriseMeta
|
||||||
|
func (_e *MockAggregatedConfig_Expecter) DeleteExportedServicesConfigEntry(_a0 interface{}, _a1 interface{}, _a2 interface{}) *MockAggregatedConfig_DeleteExportedServicesConfigEntry_Call { |
||||||
|
return &MockAggregatedConfig_DeleteExportedServicesConfigEntry_Call{Call: _e.mock.On("DeleteExportedServicesConfigEntry", _a0, _a1, _a2)} |
||||||
|
} |
||||||
|
|
||||||
|
func (_c *MockAggregatedConfig_DeleteExportedServicesConfigEntry_Call) Run(run func(_a0 context.Context, _a1 string, _a2 *acl.EnterpriseMeta)) *MockAggregatedConfig_DeleteExportedServicesConfigEntry_Call { |
||||||
|
_c.Call.Run(func(args mock.Arguments) { |
||||||
|
run(args[0].(context.Context), args[1].(string), args[2].(*acl.EnterpriseMeta)) |
||||||
|
}) |
||||||
|
return _c |
||||||
|
} |
||||||
|
|
||||||
|
func (_c *MockAggregatedConfig_DeleteExportedServicesConfigEntry_Call) Return(_a0 error) *MockAggregatedConfig_DeleteExportedServicesConfigEntry_Call { |
||||||
|
_c.Call.Return(_a0) |
||||||
|
return _c |
||||||
|
} |
||||||
|
|
||||||
|
func (_c *MockAggregatedConfig_DeleteExportedServicesConfigEntry_Call) RunAndReturn(run func(context.Context, string, *acl.EnterpriseMeta) error) *MockAggregatedConfig_DeleteExportedServicesConfigEntry_Call { |
||||||
|
_c.Call.Return(run) |
||||||
|
return _c |
||||||
|
} |
||||||
|
|
||||||
|
// EventChannel provides a mock function with given fields:
|
||||||
|
func (_m *MockAggregatedConfig) EventChannel() chan controller.Event { |
||||||
|
ret := _m.Called() |
||||||
|
|
||||||
|
var r0 chan controller.Event |
||||||
|
if rf, ok := ret.Get(0).(func() chan controller.Event); ok { |
||||||
|
r0 = rf() |
||||||
|
} else { |
||||||
|
if ret.Get(0) != nil { |
||||||
|
r0 = ret.Get(0).(chan controller.Event) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return r0 |
||||||
|
} |
||||||
|
|
||||||
|
// MockAggregatedConfig_EventChannel_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EventChannel'
|
||||||
|
type MockAggregatedConfig_EventChannel_Call struct { |
||||||
|
*mock.Call |
||||||
|
} |
||||||
|
|
||||||
|
// EventChannel is a helper method to define mock.On call
|
||||||
|
func (_e *MockAggregatedConfig_Expecter) EventChannel() *MockAggregatedConfig_EventChannel_Call { |
||||||
|
return &MockAggregatedConfig_EventChannel_Call{Call: _e.mock.On("EventChannel")} |
||||||
|
} |
||||||
|
|
||||||
|
func (_c *MockAggregatedConfig_EventChannel_Call) Run(run func()) *MockAggregatedConfig_EventChannel_Call { |
||||||
|
_c.Call.Run(func(args mock.Arguments) { |
||||||
|
run() |
||||||
|
}) |
||||||
|
return _c |
||||||
|
} |
||||||
|
|
||||||
|
func (_c *MockAggregatedConfig_EventChannel_Call) Return(_a0 chan controller.Event) *MockAggregatedConfig_EventChannel_Call { |
||||||
|
_c.Call.Return(_a0) |
||||||
|
return _c |
||||||
|
} |
||||||
|
|
||||||
|
func (_c *MockAggregatedConfig_EventChannel_Call) RunAndReturn(run func() chan controller.Event) *MockAggregatedConfig_EventChannel_Call { |
||||||
|
_c.Call.Return(run) |
||||||
|
return _c |
||||||
|
} |
||||||
|
|
||||||
|
// GetExportedServicesConfigEntry provides a mock function with given fields: _a0, _a1, _a2
|
||||||
|
func (_m *MockAggregatedConfig) GetExportedServicesConfigEntry(_a0 context.Context, _a1 string, _a2 *acl.EnterpriseMeta) (*structs.ExportedServicesConfigEntry, error) { |
||||||
|
ret := _m.Called(_a0, _a1, _a2) |
||||||
|
|
||||||
|
var r0 *structs.ExportedServicesConfigEntry |
||||||
|
var r1 error |
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, string, *acl.EnterpriseMeta) (*structs.ExportedServicesConfigEntry, error)); ok { |
||||||
|
return rf(_a0, _a1, _a2) |
||||||
|
} |
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, string, *acl.EnterpriseMeta) *structs.ExportedServicesConfigEntry); ok { |
||||||
|
r0 = rf(_a0, _a1, _a2) |
||||||
|
} else { |
||||||
|
if ret.Get(0) != nil { |
||||||
|
r0 = ret.Get(0).(*structs.ExportedServicesConfigEntry) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if rf, ok := ret.Get(1).(func(context.Context, string, *acl.EnterpriseMeta) error); ok { |
||||||
|
r1 = rf(_a0, _a1, _a2) |
||||||
|
} else { |
||||||
|
r1 = ret.Error(1) |
||||||
|
} |
||||||
|
|
||||||
|
return r0, r1 |
||||||
|
} |
||||||
|
|
||||||
|
// MockAggregatedConfig_GetExportedServicesConfigEntry_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetExportedServicesConfigEntry'
|
||||||
|
type MockAggregatedConfig_GetExportedServicesConfigEntry_Call struct { |
||||||
|
*mock.Call |
||||||
|
} |
||||||
|
|
||||||
|
// GetExportedServicesConfigEntry is a helper method to define mock.On call
|
||||||
|
// - _a0 context.Context
|
||||||
|
// - _a1 string
|
||||||
|
// - _a2 *acl.EnterpriseMeta
|
||||||
|
func (_e *MockAggregatedConfig_Expecter) GetExportedServicesConfigEntry(_a0 interface{}, _a1 interface{}, _a2 interface{}) *MockAggregatedConfig_GetExportedServicesConfigEntry_Call { |
||||||
|
return &MockAggregatedConfig_GetExportedServicesConfigEntry_Call{Call: _e.mock.On("GetExportedServicesConfigEntry", _a0, _a1, _a2)} |
||||||
|
} |
||||||
|
|
||||||
|
func (_c *MockAggregatedConfig_GetExportedServicesConfigEntry_Call) Run(run func(_a0 context.Context, _a1 string, _a2 *acl.EnterpriseMeta)) *MockAggregatedConfig_GetExportedServicesConfigEntry_Call { |
||||||
|
_c.Call.Run(func(args mock.Arguments) { |
||||||
|
run(args[0].(context.Context), args[1].(string), args[2].(*acl.EnterpriseMeta)) |
||||||
|
}) |
||||||
|
return _c |
||||||
|
} |
||||||
|
|
||||||
|
func (_c *MockAggregatedConfig_GetExportedServicesConfigEntry_Call) Return(_a0 *structs.ExportedServicesConfigEntry, _a1 error) *MockAggregatedConfig_GetExportedServicesConfigEntry_Call { |
||||||
|
_c.Call.Return(_a0, _a1) |
||||||
|
return _c |
||||||
|
} |
||||||
|
|
||||||
|
func (_c *MockAggregatedConfig_GetExportedServicesConfigEntry_Call) RunAndReturn(run func(context.Context, string, *acl.EnterpriseMeta) (*structs.ExportedServicesConfigEntry, error)) *MockAggregatedConfig_GetExportedServicesConfigEntry_Call { |
||||||
|
_c.Call.Return(run) |
||||||
|
return _c |
||||||
|
} |
||||||
|
|
||||||
|
// Start provides a mock function with given fields: _a0
|
||||||
|
func (_m *MockAggregatedConfig) Start(_a0 context.Context) { |
||||||
|
_m.Called(_a0) |
||||||
|
} |
||||||
|
|
||||||
|
// MockAggregatedConfig_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start'
|
||||||
|
type MockAggregatedConfig_Start_Call struct { |
||||||
|
*mock.Call |
||||||
|
} |
||||||
|
|
||||||
|
// Start is a helper method to define mock.On call
|
||||||
|
// - _a0 context.Context
|
||||||
|
func (_e *MockAggregatedConfig_Expecter) Start(_a0 interface{}) *MockAggregatedConfig_Start_Call { |
||||||
|
return &MockAggregatedConfig_Start_Call{Call: _e.mock.On("Start", _a0)} |
||||||
|
} |
||||||
|
|
||||||
|
func (_c *MockAggregatedConfig_Start_Call) Run(run func(_a0 context.Context)) *MockAggregatedConfig_Start_Call { |
||||||
|
_c.Call.Run(func(args mock.Arguments) { |
||||||
|
run(args[0].(context.Context)) |
||||||
|
}) |
||||||
|
return _c |
||||||
|
} |
||||||
|
|
||||||
|
func (_c *MockAggregatedConfig_Start_Call) Return() *MockAggregatedConfig_Start_Call { |
||||||
|
_c.Call.Return() |
||||||
|
return _c |
||||||
|
} |
||||||
|
|
||||||
|
func (_c *MockAggregatedConfig_Start_Call) RunAndReturn(run func(context.Context)) *MockAggregatedConfig_Start_Call { |
||||||
|
_c.Call.Return(run) |
||||||
|
return _c |
||||||
|
} |
||||||
|
|
||||||
|
// WriteExportedServicesConfigEntry provides a mock function with given fields: _a0, _a1
|
||||||
|
func (_m *MockAggregatedConfig) WriteExportedServicesConfigEntry(_a0 context.Context, _a1 *structs.ExportedServicesConfigEntry) error { |
||||||
|
ret := _m.Called(_a0, _a1) |
||||||
|
|
||||||
|
var r0 error |
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, *structs.ExportedServicesConfigEntry) error); ok { |
||||||
|
r0 = rf(_a0, _a1) |
||||||
|
} else { |
||||||
|
r0 = ret.Error(0) |
||||||
|
} |
||||||
|
|
||||||
|
return r0 |
||||||
|
} |
||||||
|
|
||||||
|
// MockAggregatedConfig_WriteExportedServicesConfigEntry_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WriteExportedServicesConfigEntry'
|
||||||
|
type MockAggregatedConfig_WriteExportedServicesConfigEntry_Call struct { |
||||||
|
*mock.Call |
||||||
|
} |
||||||
|
|
||||||
|
// WriteExportedServicesConfigEntry is a helper method to define mock.On call
|
||||||
|
// - _a0 context.Context
|
||||||
|
// - _a1 *structs.ExportedServicesConfigEntry
|
||||||
|
func (_e *MockAggregatedConfig_Expecter) WriteExportedServicesConfigEntry(_a0 interface{}, _a1 interface{}) *MockAggregatedConfig_WriteExportedServicesConfigEntry_Call { |
||||||
|
return &MockAggregatedConfig_WriteExportedServicesConfigEntry_Call{Call: _e.mock.On("WriteExportedServicesConfigEntry", _a0, _a1)} |
||||||
|
} |
||||||
|
|
||||||
|
func (_c *MockAggregatedConfig_WriteExportedServicesConfigEntry_Call) Run(run func(_a0 context.Context, _a1 *structs.ExportedServicesConfigEntry)) *MockAggregatedConfig_WriteExportedServicesConfigEntry_Call { |
||||||
|
_c.Call.Run(func(args mock.Arguments) { |
||||||
|
run(args[0].(context.Context), args[1].(*structs.ExportedServicesConfigEntry)) |
||||||
|
}) |
||||||
|
return _c |
||||||
|
} |
||||||
|
|
||||||
|
func (_c *MockAggregatedConfig_WriteExportedServicesConfigEntry_Call) Return(_a0 error) *MockAggregatedConfig_WriteExportedServicesConfigEntry_Call { |
||||||
|
_c.Call.Return(_a0) |
||||||
|
return _c |
||||||
|
} |
||||||
|
|
||||||
|
func (_c *MockAggregatedConfig_WriteExportedServicesConfigEntry_Call) RunAndReturn(run func(context.Context, *structs.ExportedServicesConfigEntry) error) *MockAggregatedConfig_WriteExportedServicesConfigEntry_Call { |
||||||
|
_c.Call.Return(run) |
||||||
|
return _c |
||||||
|
} |
||||||
|
|
||||||
|
type mockConstructorTestingTNewMockAggregatedConfig interface { |
||||||
|
mock.TestingT |
||||||
|
Cleanup(func()) |
||||||
|
} |
||||||
|
|
||||||
|
// NewMockAggregatedConfig creates a new instance of MockAggregatedConfig. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
|
||||||
|
func NewMockAggregatedConfig(t mockConstructorTestingTNewMockAggregatedConfig) *MockAggregatedConfig { |
||||||
|
mock := &MockAggregatedConfig{} |
||||||
|
mock.Mock.Test(t) |
||||||
|
|
||||||
|
t.Cleanup(func() { mock.AssertExpectations(t) }) |
||||||
|
|
||||||
|
return mock |
||||||
|
} |
Loading…
Reference in new issue