From c7feef268664aa9c009344bb5a939cd7aa10c32a Mon Sep 17 00:00:00 2001 From: Bella Khizgiyaev Date: Fri, 15 Sep 2023 00:41:34 +0300 Subject: [PATCH] Add e2e test for ova provider Signed-off-by: Bella Khizgiyaev --- .github/workflows/pull-request.yml | 4 ++ tests/suit/BUILD.bazel | 1 + tests/suit/framework/BUILD.bazel | 1 + tests/suit/framework/framework.go | 8 +++ tests/suit/framework/ova.go | 71 ++++++++++++++++++++++++++ tests/suit/ova_test.go | 81 ++++++++++++++++++++++++++++++ tests/suit/utils/storagemap.go | 27 +++++++--- 7 files changed, 186 insertions(+), 7 deletions(-) create mode 100644 tests/suit/framework/ova.go create mode 100644 tests/suit/ova_test.go diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 910a77bcd..01f1693ae 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -28,6 +28,10 @@ jobs: - os: ubuntu-latest source_provider: openstack + - os: ubuntu-latest + source_provider: ova + + runs-on: ${{ matrix.os }} env: USE_BAZEL_VERSION: 5.4.0 diff --git a/tests/suit/BUILD.bazel b/tests/suit/BUILD.bazel index afe69d888..c67c02a0f 100644 --- a/tests/suit/BUILD.bazel +++ b/tests/suit/BUILD.bazel @@ -60,6 +60,7 @@ go_test( "forklift_test.go", "openstack_extended_test.go", "openstack_test.go", + "ova_test.go", "ovirt_test.go", "tests_suite_test.go", "vsphere_test.go", diff --git a/tests/suit/framework/BUILD.bazel b/tests/suit/framework/BUILD.bazel index 61cce68df..89323b9a8 100644 --- a/tests/suit/framework/BUILD.bazel +++ b/tests/suit/framework/BUILD.bazel @@ -6,6 +6,7 @@ go_library( "exec_util.go", "framework.go", "openstack.go", + "ova.go", "ovirt.go", ], importpath = "github.com/konveyor/forklift-controller/tests/suit/framework", diff --git a/tests/suit/framework/framework.go b/tests/suit/framework/framework.go index 43280baa2..e47fcdc2e 100644 --- a/tests/suit/framework/framework.go +++ b/tests/suit/framework/framework.go @@ -85,6 +85,8 @@ type Clients struct { OvirtClient OvirtClient // OpenStackClient provides a pointer to Openstack client. OpenStackClient OpenStackClient + // OVAClient + OvaClient OvaClient } // K8s returns Kubernetes Clientset @@ -292,6 +294,12 @@ func (c *Clients) GetOpenStackClient() (*OpenStackClient, error) { return &oc, nil } +// GetOvaClient instantiates and returns an OvaClient +func (c *Clients) GetOvaClient() (*OvaClient, error) { + oc := OvaClient{} + return &oc, nil +} + // GetRESTConfigForServiceAccount returns a RESTConfig for SA func (f *Framework) GetRESTConfigForServiceAccount(namespace, name string) (*rest.Config, error) { token, err := f.GetTokenForServiceAccount(namespace, name) diff --git a/tests/suit/framework/ova.go b/tests/suit/framework/ova.go new file mode 100644 index 000000000..07826108c --- /dev/null +++ b/tests/suit/framework/ova.go @@ -0,0 +1,71 @@ +package framework + +import ( + "context" + "os" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" +) + +// LoadSourceDetails - Load Source VM details from ova +func (r *OvaClient) LoadSourceDetails() (vm *OvaVM, err error) { + + r.storageClass = DefaultStorageClass + if sc := os.Getenv("STORAGE_CLASS"); sc != "" { + r.storageClass = sc + } + + r.vmData.testVMId = "b023ad5c55444c081c0837f5caa8dc3b2b9f" + r.vmData.testNetworkID = "ae1badc8c693926f492a01e2f357d6af321b" + r.vmData.testStorageName = "Dummy storage for source provider ova-provider" + return &r.vmData, nil +} + +func (r *OvaClient) GetNfsServerForOva(k8sClient *kubernetes.Clientset) (string, error) { + storageClass, err := k8sClient.StorageV1().StorageClasses().Get(context.TODO(), r.storageClass, metav1.GetOptions{}) + if err != nil { + return "", err + } + var nfsShare string + for parm, val := range storageClass.Parameters { + if parm == "server" { + nfsShare = nfsShare + val + } + if parm == "share" { + nfsShare = nfsShare + val + } + } + if nfsShare != "" { + r.nfsPath = nfsShare + } + return r.nfsPath, nil +} + +// GetNetworkId - return the network interface for the VM +func (r *OvaVM) GetNetworkId() string { + return r.testNetworkID +} + +// GetVolumeId - return storage domain IDs +func (r *OvaVM) GetStorageName() string { + return r.testStorageName +} + +// GetTestVMId - return the test VM ID +func (r *OvaVM) GetVmId() string { + return r.testVMId +} + +type OvaClient struct { + vmData OvaVM + CustomEnv bool + nfsPath string + storageClass string +} + +type OvaVM struct { + testVMId string + testNetworkID string + testStorageName string +} diff --git a/tests/suit/ova_test.go b/tests/suit/ova_test.go new file mode 100644 index 000000000..40c1bd016 --- /dev/null +++ b/tests/suit/ova_test.go @@ -0,0 +1,81 @@ +package suit_test + +import ( + "time" + + forkliftv1 "github.com/konveyor/forklift-controller/pkg/apis/forklift/v1beta1" + "github.com/konveyor/forklift-controller/tests/suit/framework" + "github.com/konveyor/forklift-controller/tests/suit/utils" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +const ( + ovaProviderName = "ova-provider" + ovaStorageClass = "nfs-csi" +) + +var _ = Describe("[level:component]Migration tests for OVA provider", func() { + f := framework.NewFramework("migration-func-test") + + It("[test] should create provider with NetworkMap", func() { + namespace := f.Namespace.Name + + By("Load Source VM Details from OVA") + vmData, err := f.Clients.OvaClient.LoadSourceDetails() + Expect(err).ToNot(HaveOccurred()) + + By("Get NFS share for OVA provider") + nfs, err := f.Clients.OvaClient.GetNfsServerForOva(f.K8sClient) + Expect(err).ToNot(HaveOccurred()) + By("Create Secret from Definition") + s, err := utils.CreateSecretFromDefinition(f.K8sClient, utils.NewSecretDefinition(nil, nil, + map[string][]byte{ + "url": []byte(nfs), + }, namespace, "provider-test-secret")) + Expect(err).ToNot(HaveOccurred()) + + targetNS, err := f.CreateNamespace("ova-migration-test", map[string]string{}) + Expect(err).ToNot(HaveOccurred()) + By("Create target Openshift provider") + targetPr := utils.NewProvider(utils.TargetProviderName, forkliftv1.OpenShift, namespace, map[string]string{}, map[string]string{}, "", nil) + err = utils.CreateProviderFromDefinition(f.CrClient, targetPr) + Expect(err).ToNot(HaveOccurred()) + _, err = utils.WaitForProviderReadyWithTimeout(f.CrClient, namespace, utils.TargetProviderName, 30*time.Second) + Expect(err).ToNot(HaveOccurred()) + By("Create OVA provider") + pr := utils.NewProvider(ovaProviderName, forkliftv1.Ova, namespace, map[string]string{}, map[string]string{}, "nfs_url", s) + err = utils.CreateProviderFromDefinition(f.CrClient, pr) + Expect(err).ToNot(HaveOccurred()) + provider, err := utils.WaitForProviderReadyWithTimeout(f.CrClient, namespace, ovaProviderName, 60*time.Second) + Expect(err).ToNot(HaveOccurred()) + By("Create Network Map") + networkMapDef := utils.NewNetworkMap(namespace, *provider, networkMapName, vmData.GetNetworkId()) + err = utils.CreateNetworkMapFromDefinition(f.CrClient, networkMapDef) + Expect(err).ToNot(HaveOccurred()) + err = utils.WaitForNetworkMapReadyWithTimeout(f.CrClient, namespace, networkMapName, 10*time.Second) + Expect(err).ToNot(HaveOccurred()) + By("Create Storage Map") + storageMapDef := utils.NewStorageMap(namespace, *provider, test_storage_map_name, []string{vmData.GetStorageName()}, ovaStorageClass) + err = utils.CreateStorageMapFromDefinition(f.CrClient, storageMapDef) + Expect(err).ToNot(HaveOccurred()) + err = utils.WaitForStorageMapReadyWithTimeout(f.CrClient, namespace, test_storage_map_name, 10*time.Second) + Expect(err).ToNot(HaveOccurred()) + + By("Creating plan") + planDef := utils.NewPlanWithVmName(*provider, namespace, test_plan_name, test_storage_map_name, networkMapName, []string{vmData.GetVmId()}, targetNS.Name) + + err = utils.CreatePlanFromDefinition(f.CrClient, planDef) + Expect(err).ToNot(HaveOccurred()) + err, _ = utils.WaitForPlanReadyWithTimeout(f.CrClient, namespace, test_plan_name, 15*time.Second) + Expect(err).ToNot(HaveOccurred()) + + By("Creating migration") + migrationDef := utils.NewMigration(provider.Namespace, test_migration_name, test_plan_name) + err = utils.CreateMigrationFromDefinition(f.CrClient, migrationDef) + Expect(err).ToNot(HaveOccurred()) + err = utils.WaitForMigrationSucceededWithTimeout(f.CrClient, provider.Namespace, test_migration_name, 900*time.Second) + Expect(err).ToNot(HaveOccurred()) + + }) +}) diff --git a/tests/suit/utils/storagemap.go b/tests/suit/utils/storagemap.go index 9a117874e..1f65df2fe 100644 --- a/tests/suit/utils/storagemap.go +++ b/tests/suit/utils/storagemap.go @@ -5,6 +5,7 @@ import ( "fmt" "time" + api "github.com/konveyor/forklift-controller/pkg/apis/forklift/v1beta1" forkliftv1 "github.com/konveyor/forklift-controller/pkg/apis/forklift/v1beta1" "github.com/konveyor/forklift-controller/pkg/apis/forklift/v1beta1/provider" "github.com/konveyor/forklift-controller/pkg/apis/forklift/v1beta1/ref" @@ -29,14 +30,26 @@ func NewStorageMap(namespace string, providerIdentifier forkliftv1.Provider, sto sdPairs := []forkliftv1.StoragePair{} - for _, sd := range storageIDs { - pair := forkliftv1.StoragePair{ - Source: ref.Ref{ID: sd}, - Destination: forkliftv1.DestinationStorage{ - StorageClass: storageClass, - }, + if providerIdentifier.Type() != api.Ova { + for _, sd := range storageIDs { + pair := forkliftv1.StoragePair{ + Source: ref.Ref{ID: sd}, + Destination: forkliftv1.DestinationStorage{ + StorageClass: storageClass, + }, + } + sdPairs = append(sdPairs, pair) + } + } else { + for _, sd := range storageIDs { + pair := forkliftv1.StoragePair{ + Source: ref.Ref{Name: sd}, + Destination: forkliftv1.DestinationStorage{ + StorageClass: storageClass, + }, + } + sdPairs = append(sdPairs, pair) } - sdPairs = append(sdPairs, pair) } storageMap := &forkliftv1.StorageMap{