86 lines
2.3 KiB
Go
86 lines
2.3 KiB
Go
package testutil
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
|
|
"git.dws.rip/dubey/kat/internal/store"
|
|
"github.com/stretchr/testify/require"
|
|
"go.etcd.io/etcd/server/v3/embed"
|
|
)
|
|
|
|
// SetupEmbeddedEtcd creates a temporary directory and starts an embedded etcd server for testing
|
|
func SetupEmbeddedEtcd(t *testing.T) (string, *embed.Etcd, string) {
|
|
// Create a temporary directory for etcd data
|
|
tempDir, err := os.MkdirTemp("", "etcd-test-*")
|
|
require.NoError(t, err)
|
|
|
|
// Configure and start embedded etcd
|
|
etcdConfig := store.EtcdEmbedConfig{
|
|
Name: "test-node",
|
|
DataDir: tempDir,
|
|
ClientURLs: []string{"http://localhost:0"}, // Use port 0 to get a random available port
|
|
PeerURLs: []string{"http://localhost:0"},
|
|
InitialCluster: "test-node=http://localhost:0",
|
|
}
|
|
|
|
etcdServer, err := store.StartEmbeddedEtcd(etcdConfig)
|
|
require.NoError(t, err)
|
|
|
|
// Get the actual client URL that was assigned
|
|
clientURL := etcdServer.Clients[0].Addr().String()
|
|
|
|
return tempDir, etcdServer, clientURL
|
|
}
|
|
|
|
// CreateTestClusterConfig creates a test cluster.kat file in the specified directory
|
|
func CreateTestClusterConfig(t *testing.T, dir string) string {
|
|
configContent := `apiVersion: kat.dws.rip/v1alpha1
|
|
kind: ClusterConfiguration
|
|
metadata:
|
|
name: test-cluster
|
|
spec:
|
|
clusterCidr: "10.100.0.0/16"
|
|
serviceCidr: "10.101.0.0/16"
|
|
nodeSubnetBits: 7
|
|
clusterDomain: "test.cluster.local"
|
|
agentPort: 9116
|
|
apiPort: 9115
|
|
etcdPeerPort: 2380
|
|
etcdClientPort: 2379
|
|
volumeBasePath: "~/.kat/volumes"
|
|
backupPath: "~/.kat/backups"
|
|
backupIntervalMinutes: 30
|
|
agentTickSeconds: 15
|
|
nodeLossTimeoutSeconds: 60
|
|
`
|
|
configPath := filepath.Join(dir, "cluster.kat")
|
|
err := os.WriteFile(configPath, []byte(configContent), 0644)
|
|
require.NoError(t, err)
|
|
return configPath
|
|
}
|
|
|
|
// WaitForCondition waits for the given condition function to return true or times out
|
|
func WaitForCondition(t *testing.T, condition func() bool, timeout time.Duration, message string) {
|
|
ctx, cancel := context.WithTimeout(context.Background(), timeout)
|
|
defer cancel()
|
|
|
|
ticker := time.NewTicker(50 * time.Millisecond)
|
|
defer ticker.Stop()
|
|
|
|
for {
|
|
select {
|
|
case <-ctx.Done():
|
|
require.Fail(t, "Timed out waiting for condition: "+message)
|
|
return
|
|
case <-ticker.C:
|
|
if condition() {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|