mirror of
https://github.com/rancher/k3k.git
synced 2026-08-18 03:46:31 +00:00
* fix EXTRA_ARGS parsing in the startup command and add multi server args test * fix lint * Refactor server config tests to improve readability and maintainability --------- Co-authored-by: Enrico Candino <enrico.candino@suse.com>
253 lines
7.4 KiB
Go
253 lines
7.4 KiB
Go
package server
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
|
|
"github.com/rancher/k3k/pkg/apis/k3k.io/v1beta1"
|
|
)
|
|
|
|
const (
|
|
defaultVirtualClusterCIDR = "10.52.0.0/16"
|
|
defaultVirtualServiceCIDR = "10.53.0.0/16"
|
|
defaultSharedClusterCIDR = "10.42.0.0/16"
|
|
defaultSharedServiceCIDR = "10.43.0.0/16"
|
|
testClusterDNS = "10.42.0.10"
|
|
testToken = "123456"
|
|
testServiceIP = "1.1.1.1"
|
|
testClusterName = "test-cluster"
|
|
testClusterNamespace = "test-ns"
|
|
)
|
|
|
|
var defaultTLSSANs = []string{
|
|
testServiceIP,
|
|
ServiceName(testClusterName),
|
|
fmt.Sprintf("%s.%s", ServiceName(testClusterName), testClusterNamespace),
|
|
}
|
|
|
|
func Test_buildServerConfig(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
cluster *v1beta1.Cluster
|
|
initServer bool
|
|
expected serverConfig
|
|
}{
|
|
{
|
|
name: "init server with default (shared) cluster spec",
|
|
cluster: &v1beta1.Cluster{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: testClusterName,
|
|
Namespace: testClusterNamespace,
|
|
},
|
|
Status: v1beta1.ClusterStatus{
|
|
ClusterCIDR: defaultSharedClusterCIDR,
|
|
ServiceCIDR: defaultSharedServiceCIDR,
|
|
},
|
|
},
|
|
initServer: true,
|
|
expected: serverConfig{
|
|
ClusterInit: true,
|
|
ClusterCIDR: defaultSharedClusterCIDR,
|
|
ServiceCIDR: defaultSharedServiceCIDR,
|
|
DisableAgent: true,
|
|
EgressSelectorMode: "disabled",
|
|
Token: testToken,
|
|
Disable: []string{"servicelb", "traefik", "metrics-server", "local-storage"},
|
|
TLSSAN: defaultTLSSANs,
|
|
},
|
|
},
|
|
{
|
|
name: "non-init server with default (shared) cluster spec",
|
|
cluster: &v1beta1.Cluster{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: testClusterName,
|
|
Namespace: testClusterNamespace,
|
|
},
|
|
Status: v1beta1.ClusterStatus{
|
|
ClusterCIDR: defaultSharedClusterCIDR,
|
|
ServiceCIDR: defaultSharedServiceCIDR,
|
|
},
|
|
},
|
|
initServer: false,
|
|
expected: serverConfig{
|
|
ClusterInit: true,
|
|
ClusterCIDR: defaultSharedClusterCIDR,
|
|
ServiceCIDR: defaultSharedServiceCIDR,
|
|
DisableAgent: true,
|
|
EgressSelectorMode: "disabled",
|
|
Token: testToken,
|
|
Disable: []string{"servicelb", "traefik", "metrics-server", "local-storage"},
|
|
TLSSAN: defaultTLSSANs,
|
|
Server: "https://" + testServiceIP,
|
|
},
|
|
},
|
|
{
|
|
name: "explicit shared mode cluster",
|
|
cluster: &v1beta1.Cluster{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: testClusterName,
|
|
Namespace: testClusterNamespace,
|
|
},
|
|
Spec: v1beta1.ClusterSpec{
|
|
Mode: v1beta1.SharedClusterMode,
|
|
},
|
|
Status: v1beta1.ClusterStatus{
|
|
ClusterCIDR: defaultSharedClusterCIDR,
|
|
ServiceCIDR: defaultSharedServiceCIDR,
|
|
},
|
|
},
|
|
initServer: true,
|
|
expected: serverConfig{
|
|
ClusterInit: true,
|
|
ClusterCIDR: defaultSharedClusterCIDR,
|
|
ServiceCIDR: defaultSharedServiceCIDR,
|
|
DisableAgent: true,
|
|
EgressSelectorMode: "disabled",
|
|
Token: testToken,
|
|
Disable: []string{"servicelb", "traefik", "metrics-server", "local-storage"},
|
|
TLSSAN: defaultTLSSANs,
|
|
},
|
|
},
|
|
{
|
|
name: "init server with virtual mode cluster",
|
|
cluster: &v1beta1.Cluster{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: testClusterName,
|
|
Namespace: testClusterNamespace,
|
|
},
|
|
Spec: v1beta1.ClusterSpec{
|
|
Mode: v1beta1.VirtualClusterMode,
|
|
},
|
|
Status: v1beta1.ClusterStatus{
|
|
ClusterCIDR: defaultVirtualClusterCIDR,
|
|
ServiceCIDR: defaultVirtualServiceCIDR,
|
|
},
|
|
},
|
|
initServer: true,
|
|
expected: serverConfig{
|
|
ClusterInit: true,
|
|
ClusterCIDR: defaultVirtualClusterCIDR,
|
|
ServiceCIDR: defaultVirtualServiceCIDR,
|
|
Token: testToken,
|
|
TLSSAN: defaultTLSSANs,
|
|
},
|
|
},
|
|
{
|
|
name: "non-init server with virtual mode cluster",
|
|
cluster: &v1beta1.Cluster{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: testClusterName,
|
|
Namespace: testClusterNamespace,
|
|
},
|
|
Spec: v1beta1.ClusterSpec{
|
|
Mode: v1beta1.VirtualClusterMode,
|
|
},
|
|
Status: v1beta1.ClusterStatus{
|
|
ClusterCIDR: defaultVirtualClusterCIDR,
|
|
ServiceCIDR: defaultVirtualServiceCIDR,
|
|
},
|
|
},
|
|
initServer: false,
|
|
expected: serverConfig{
|
|
ClusterInit: true,
|
|
ClusterCIDR: defaultVirtualClusterCIDR,
|
|
ServiceCIDR: defaultVirtualServiceCIDR,
|
|
Token: testToken,
|
|
TLSSAN: defaultTLSSANs,
|
|
Server: "https://" + testServiceIP,
|
|
},
|
|
},
|
|
{
|
|
name: "init server with clusterDNS cluster spec",
|
|
cluster: &v1beta1.Cluster{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: testClusterName,
|
|
Namespace: testClusterNamespace,
|
|
},
|
|
Spec: v1beta1.ClusterSpec{
|
|
ClusterDNS: testClusterDNS,
|
|
},
|
|
Status: v1beta1.ClusterStatus{
|
|
ClusterCIDR: defaultSharedClusterCIDR,
|
|
ServiceCIDR: defaultSharedServiceCIDR,
|
|
},
|
|
},
|
|
initServer: true,
|
|
expected: serverConfig{
|
|
ClusterInit: true,
|
|
ClusterDNS: testClusterDNS,
|
|
ClusterCIDR: defaultSharedClusterCIDR,
|
|
ServiceCIDR: defaultSharedServiceCIDR,
|
|
DisableAgent: true,
|
|
EgressSelectorMode: "disabled",
|
|
Token: testToken,
|
|
Disable: []string{"servicelb", "traefik", "metrics-server", "local-storage"},
|
|
TLSSAN: defaultTLSSANs,
|
|
},
|
|
},
|
|
{
|
|
name: "init server with custom TLSSANs merged and sorted",
|
|
cluster: &v1beta1.Cluster{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: testClusterName,
|
|
Namespace: testClusterNamespace,
|
|
},
|
|
Spec: v1beta1.ClusterSpec{
|
|
// intentionally unsorted and with a duplicate of serviceIP
|
|
TLSSANs: []string{"custom.example.com", testServiceIP},
|
|
},
|
|
Status: v1beta1.ClusterStatus{
|
|
ClusterCIDR: defaultSharedClusterCIDR,
|
|
ServiceCIDR: defaultSharedServiceCIDR,
|
|
},
|
|
},
|
|
initServer: true,
|
|
expected: serverConfig{
|
|
ClusterInit: true,
|
|
ClusterCIDR: defaultSharedClusterCIDR,
|
|
ServiceCIDR: defaultSharedServiceCIDR,
|
|
DisableAgent: true,
|
|
EgressSelectorMode: "disabled",
|
|
Token: testToken,
|
|
Disable: []string{"servicelb", "traefik", "metrics-server", "local-storage"},
|
|
// sets.List() returns a sorted, de-duplicated slice
|
|
TLSSAN: []string{
|
|
testServiceIP,
|
|
"custom.example.com",
|
|
ServiceName(testClusterName),
|
|
fmt.Sprintf("%s.%s", ServiceName(testClusterName), testClusterNamespace),
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
config := buildServerConfig(tt.cluster, tt.initServer, testServiceIP, testToken)
|
|
assert.Equal(t, tt.expected, config)
|
|
})
|
|
}
|
|
}
|
|
|
|
func Test_setupStartCommand_MultipleServerArgs(t *testing.T) {
|
|
cluster := &v1beta1.Cluster{
|
|
ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testClusterNamespace},
|
|
Spec: v1beta1.ClusterSpec{
|
|
Servers: new(int32(1)),
|
|
ServerArgs: []string{"--tls-san=foo.example.com", "--kubelet-arg=cgroups-per-qos=false", "--kubelet-arg=enforce-node-allocatable="},
|
|
},
|
|
}
|
|
s := &Server{cluster: cluster}
|
|
|
|
script, err := s.setupStartCommand()
|
|
require.NoError(t, err)
|
|
|
|
expected := `EXTRA_ARGS="--tls-san=foo.example.com --kubelet-arg=cgroups-per-qos=false --kubelet-arg=enforce-node-allocatable="`
|
|
assert.Contains(t, script, expected)
|
|
}
|