package integration import ( "context" "net" "os" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "edge-infra.dev/pkg/sds/remoteaccess/constants" "edge-infra.dev/pkg/sds/remoteaccess/wireguard/store" v "edge-infra.dev/pkg/sds/remoteaccess/wireguard/vpn" "edge-infra.dev/test/f2" "edge-infra.dev/test/f2/x/ktest" v1cluster "edge-infra.dev/pkg/edge/apis/cluster/v1alpha1" v1vpnconfig "edge-infra.dev/pkg/sds/remoteaccess/k8s/apis/vpnconfigs/v1" ) var f f2.Framework var ( projectID = "ret-edge-b79we3ikmc7j9mihuwst2" testIPAddress = "172.16.16.12" clusterAName = "cluster-a" testClusterA = createCluster(clusterAName, "us-east1-c") testVPNConfig = createVPNConfig(clusterAName, testIPAddress, true) vpnNamespace = &corev1.Namespace{ ObjectMeta: metav1.ObjectMeta{ Name: constants.VPNNamespace, }, } ) func TestMain(m *testing.M) { f = f2.New(context.Background(), f2.WithExtensions( ktest.New(), )). Setup(func(ctx f2.Context) (f2.Context, error) { k, err := ktest.FromContext(ctx) if err != nil { return ctx, err } // Override timeouts if we aren't using a live cluster if !*k.Env.UseExistingCluster { k.Timeout = 5 * time.Second k.Tick = 10 * time.Millisecond } return ctx, nil }).Teardown() os.Exit(f.Run(m)) } func TestUpdateStore(t *testing.T) { var ( k *ktest.K8s vpn *v.VPN err error ) feature := f2.NewFeature("UpdateStore"). Setup("create VPN", func(ctx f2.Context, t *testing.T) f2.Context { k = ktest.FromContextT(ctx, t) require.NoError(t, k.Client.Create(ctx, vpnNamespace)) vpn, err = v.New() require.NoError(t, err) require.Equal(t, map[string]*store.Store{}, vpn.Stores()) return ctx }). Test("add new store", func(ctx f2.Context, t *testing.T) f2.Context { assert.NoError(t, vpn.UpdateStore(ctx, k.Client, testVPNConfig, testClusterA)) assert.Equal(t, 1, len(vpn.Stores())) assert.Equal(t, true, vpn.Stores()[clusterAName].IsEnabled) assert.Equal(t, net.ParseIP(testIPAddress), vpn.Stores()[clusterAName].GetIPAddress()) return ctx }). Test("update existing store with no changes", func(ctx f2.Context, t *testing.T) f2.Context { assert.NoError(t, vpn.UpdateStore(ctx, k.Client, testVPNConfig, testClusterA)) assert.Equal(t, 1, len(vpn.Stores())) assert.Equal(t, true, vpn.Stores()[clusterAName].IsEnabled) assert.Equal(t, net.ParseIP(testIPAddress), vpn.Stores()[clusterAName].GetIPAddress()) return ctx }). Test("update changes on existing store", func(ctx f2.Context, t *testing.T) f2.Context { testVPNConfig.Spec.Enabled = false testVPNConfig.Status.IP = "1.2.3.4" assert.NoError(t, vpn.UpdateStore(ctx, k.Client, testVPNConfig, testClusterA)) assert.Equal(t, 1, len(vpn.Stores())) assert.Equal(t, false, vpn.Stores()[clusterAName].IsEnabled) assert.Equal(t, net.ParseIP("1.2.3.4"), vpn.Stores()[clusterAName].GetIPAddress()) return ctx }).Feature() f.Test(t, feature) } func TestRemoveStore(t *testing.T) { var ( k *ktest.K8s vpn *v.VPN err error ) feature := f2.NewFeature("RemoveStore"). Setup("create VPN and store", func(ctx f2.Context, t *testing.T) f2.Context { k = ktest.FromContextT(ctx, t) vpn, err = v.New() require.NoError(t, err) require.NoError(t, vpn.UpdateStore(ctx, k.Client, testVPNConfig, testClusterA)) return ctx }). Test("do nothing when store does not exist", func(ctx f2.Context, t *testing.T) f2.Context { vpn.RemoveStore("not a store") assert.Equal(t, 1, len(vpn.Stores())) return ctx }). Test("store removed successfully", func(ctx f2.Context, t *testing.T) f2.Context { vpn.RemoveStore(clusterAName) assert.Equal(t, 0, len(vpn.Stores())) return ctx }). Feature() f.Test(t, feature) } func createCluster(name, location string) *v1cluster.Cluster { return &v1cluster.Cluster{ ObjectMeta: metav1.ObjectMeta{Name: name}, Spec: v1cluster.ClusterSpec{ Banner: "dev0-zynstra", Fleet: "store", Location: location, Name: "4c4d-30-05-22", Organization: "edge-dev0-retail-gmi062", ProjectID: projectID, Type: "sds", }, } } func createVPNConfig(name, ip string, enabled bool) *v1vpnconfig.VPNConfig { return &v1vpnconfig.VPNConfig{ TypeMeta: metav1.TypeMeta{Kind: "VPNConfig", APIVersion: "remoteaccess.edge.ncr.com"}, ObjectMeta: metav1.ObjectMeta{Namespace: constants.VPNNamespace, Name: name, UID: "1234"}, Spec: v1vpnconfig.VPNConfigSpec{ Enabled: enabled, }, Status: &v1vpnconfig.VPNConfigStatus{ IP: ip, }, } }