mirror of
https://github.com/siderolabs/talos.git
synced 2025-10-10 07:01:12 +02:00
This introduces new configuration settings to configure advertised/listen subnets. For backwards compatibility when using no settings or old 'subnet' argument, etcd still listens on all addresses. If new `advertisedSubnets` is being used, this automatically limits etcd listen addresses to the same value. `listenSubnets` can be configured also explicitly e.g. to listen on additional addresses for some other scenarios (e.g. accessing etcd from outside of the cluster). See #5668 One more thing left (for a separate PR) is to update etcd advertised URLs on the fly. Signed-off-by: Andrey Smirnov <andrey.smirnov@talos-systems.com>
131 lines
3.9 KiB
Go
131 lines
3.9 KiB
Go
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
package etcd_test
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/cosi-project/runtime/pkg/safe"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"github.com/stretchr/testify/suite"
|
|
|
|
"github.com/talos-systems/talos/internal/app/machined/pkg/controllers/ctest"
|
|
etcdctrl "github.com/talos-systems/talos/internal/app/machined/pkg/controllers/etcd"
|
|
"github.com/talos-systems/talos/pkg/machinery/config/types/v1alpha1"
|
|
"github.com/talos-systems/talos/pkg/machinery/config/types/v1alpha1/machine"
|
|
"github.com/talos-systems/talos/pkg/machinery/resources/config"
|
|
"github.com/talos-systems/talos/pkg/machinery/resources/etcd"
|
|
)
|
|
|
|
func TestConfigSuite(t *testing.T) {
|
|
suite.Run(t, &ConfigSuite{
|
|
DefaultSuite: ctest.DefaultSuite{
|
|
AfterSetup: func(suite *ctest.DefaultSuite) {
|
|
suite.Require().NoError(suite.Runtime().RegisterController(&etcdctrl.ConfigController{}))
|
|
},
|
|
},
|
|
})
|
|
}
|
|
|
|
type ConfigSuite struct {
|
|
ctest.DefaultSuite
|
|
}
|
|
|
|
func (suite *ConfigSuite) TestReconcile() {
|
|
machineType := config.NewMachineType()
|
|
machineType.SetMachineType(machine.TypeControlPlane)
|
|
suite.Require().NoError(suite.State().Create(suite.Ctx(), machineType))
|
|
|
|
for _, tt := range []struct {
|
|
name string
|
|
etcdConfig *v1alpha1.EtcdConfig
|
|
expectedConfig etcd.ConfigSpec
|
|
}{
|
|
{
|
|
name: "default config",
|
|
etcdConfig: &v1alpha1.EtcdConfig{
|
|
ContainerImage: "foo/bar:v1.0.0",
|
|
},
|
|
expectedConfig: etcd.ConfigSpec{
|
|
Image: "foo/bar:v1.0.0",
|
|
ExtraArgs: map[string]string{},
|
|
AdvertiseValidSubnets: nil,
|
|
ListenValidSubnets: nil,
|
|
},
|
|
},
|
|
{
|
|
name: "legacy subnet",
|
|
etcdConfig: &v1alpha1.EtcdConfig{
|
|
ContainerImage: "foo/bar:v1.0.0",
|
|
EtcdExtraArgs: map[string]string{
|
|
"arg": "value",
|
|
},
|
|
EtcdSubnet: "10.0.0.0/8",
|
|
},
|
|
expectedConfig: etcd.ConfigSpec{
|
|
Image: "foo/bar:v1.0.0",
|
|
ExtraArgs: map[string]string{
|
|
"arg": "value",
|
|
},
|
|
AdvertiseValidSubnets: []string{"10.0.0.0/8"},
|
|
ListenValidSubnets: nil,
|
|
},
|
|
},
|
|
{
|
|
name: "advertised subnets",
|
|
etcdConfig: &v1alpha1.EtcdConfig{
|
|
ContainerImage: "foo/bar:v1.0.0",
|
|
EtcdAdvertisedSubnets: []string{"10.0.0.0/8", "192.168.0.0/24"},
|
|
},
|
|
expectedConfig: etcd.ConfigSpec{
|
|
Image: "foo/bar:v1.0.0",
|
|
ExtraArgs: map[string]string{},
|
|
AdvertiseValidSubnets: []string{"10.0.0.0/8", "192.168.0.0/24"},
|
|
ListenValidSubnets: []string{"10.0.0.0/8", "192.168.0.0/24"},
|
|
},
|
|
},
|
|
{
|
|
name: "advertised and listen subnets",
|
|
etcdConfig: &v1alpha1.EtcdConfig{
|
|
ContainerImage: "foo/bar:v1.0.0",
|
|
EtcdAdvertisedSubnets: []string{"10.0.0.0/8", "192.168.0.0/24"},
|
|
EtcdListenSubnets: []string{"10.0.0.0/8"},
|
|
},
|
|
expectedConfig: etcd.ConfigSpec{
|
|
Image: "foo/bar:v1.0.0",
|
|
ExtraArgs: map[string]string{},
|
|
AdvertiseValidSubnets: []string{"10.0.0.0/8", "192.168.0.0/24"},
|
|
ListenValidSubnets: []string{"10.0.0.0/8"},
|
|
},
|
|
},
|
|
} {
|
|
suite.Run(tt.name, func() {
|
|
cfg := &v1alpha1.Config{
|
|
ClusterConfig: &v1alpha1.ClusterConfig{
|
|
EtcdConfig: tt.etcdConfig,
|
|
},
|
|
}
|
|
|
|
machineConfig := config.NewMachineConfig(cfg)
|
|
suite.Require().NoError(suite.State().Create(suite.Ctx(), machineConfig))
|
|
|
|
suite.AssertWithin(3*time.Second, 100*time.Millisecond, ctest.WrapRetry(func(assert *assert.Assertions, require *require.Assertions) {
|
|
etcdConfig, err := safe.StateGet[*etcd.Config](suite.Ctx(), suite.State(), etcd.NewConfig(etcd.NamespaceName, etcd.ConfigID).Metadata())
|
|
if err != nil {
|
|
assert.NoError(err)
|
|
|
|
return
|
|
}
|
|
|
|
assert.Equal(tt.expectedConfig, *etcdConfig.TypedSpec())
|
|
}))
|
|
|
|
suite.Require().NoError(suite.State().Destroy(suite.Ctx(), machineConfig.Metadata()))
|
|
})
|
|
}
|
|
}
|