Files
k3k/pkg/k3s/bootstrap_test.go
T
Hussein GalalandGitHub 3abffae92d External datastore support (#879)
* Adding new k3s function to get the config
* Adding a new way to get the bootstrap data directly from the server Pod
* Gate the bootstrap fetch if external datastore is in use
---------

Signed-off-by: galal-hussein <hussein.galal.ahmed.11@gmail.com>
2026-06-26 17:22:00 +03:00

153 lines
3.2 KiB
Go

package k3s
import (
"encoding/json"
"net/http"
"net/http/httptest"
"net/url"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func Test_GetServerConfig(t *testing.T) {
tests := []struct {
name string
serverResponse string
clientConfig ClientConfig
expectedConfig *K3SConfig
expectedErr error
isServerRunning bool
}{
{
name: "server not ready",
isServerRunning: false,
serverResponse: "",
expectedConfig: nil,
expectedErr: ErrServerNotReady,
clientConfig: ClientConfig{
ServerIP: "127.0.0.1:33333",
},
},
{
name: "cluster init is true",
isServerRunning: true,
serverResponse: `{"ClusterInit": true}`,
expectedConfig: &K3SConfig{ClusterInit: true},
expectedErr: ErrServerNotReady,
clientConfig: ClientConfig{},
},
{
name: "cluster init is false",
isServerRunning: true,
serverResponse: `{"ClusterInit": false}`,
expectedConfig: &K3SConfig{ClusterInit: false},
expectedErr: ErrServerNotReady,
clientConfig: ClientConfig{},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
mux := http.NewServeMux()
mockServer := httptest.NewUnstartedServer(mux)
if tt.isServerRunning {
mockServer.StartTLS()
defer mockServer.Close()
}
mux.Handle("/v1-k3s/config", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_, err := w.Write([]byte(tt.serverResponse))
require.NoError(t, err)
}))
if tt.clientConfig.ServerIP == "" {
u, err := url.Parse(mockServer.URL)
require.NoError(t, err)
tt.clientConfig.ServerIP = u.Host
}
k3sClient := New(tt.clientConfig)
k3sConfig, err := k3sClient.GetServerConfig()
if err != nil && tt.expectedErr != nil {
assert.EqualError(t, err, tt.expectedErr.Error())
} else {
require.NoError(t, err)
}
assert.Equal(t, tt.expectedConfig, k3sConfig)
})
}
}
func Test_GetServerBootstrap(t *testing.T) {
fakeBootstrap := &BootstrapData{
ClientCA: cert{
Content: "dGVzdA==",
},
ClientCAKey: cert{
Content: "dGVzdA==",
},
ServerCA: cert{
Content: "dGVzdA==",
},
ServerCAKey: cert{
Content: "dGVzdA==",
},
ETCDServerCA: cert{
Content: "dGVzdA==",
},
ETCDServerCAKey: cert{
Content: "dGVzdA==",
},
}
expectedBootstrap := &BootstrapData{
ClientCA: cert{
Content: "test",
},
ClientCAKey: cert{
Content: "test",
},
ServerCA: cert{
Content: "test",
},
ServerCAKey: cert{
Content: "test",
},
ETCDServerCA: cert{
Content: "test",
},
ETCDServerCAKey: cert{
Content: "test",
},
}
mux := http.NewServeMux()
mockServer := httptest.NewTLSServer(mux)
defer mockServer.Close()
serverResponse, err := json.Marshal(fakeBootstrap)
require.NoError(t, err)
mux.Handle("/v1-k3s/server-bootstrap", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_, err := w.Write(serverResponse)
require.NoError(t, err)
}))
u, err := url.Parse(mockServer.URL)
require.NoError(t, err)
k3sClient := New(ClientConfig{ServerIP: u.Host})
bootstrap, err := k3sClient.GetServerBootstrap()
require.NoError(t, err)
assert.Equal(t, expectedBootstrap, bootstrap)
}