From 1bb304a0f8209ab85ee719cabdf1c45499ab3c1a Mon Sep 17 00:00:00 2001 From: Bella Khizgiyaev Date: Thu, 16 Nov 2023 19:21:41 +0200 Subject: [PATCH] Draft: test CI Signed-off-by: Bella Khizgiyaev --- .github/workflows/pull-request.yml | 6 ++- Makefile | 6 ++- tests/suit/BUILD.bazel | 1 + tests/suit/framework/BUILD.bazel | 1 + tests/suit/framework/framework.go | 16 +++--- tests/suit/framework/ova.go | 72 +++++++++++++++++++++++++ tests/suit/ova_test.go | 84 ++++++++++++++++++++++++++++++ tests/suit/utils/storagemap.go | 9 +++- 8 files changed, 186 insertions(+), 9 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..24afeb52a 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 @@ -118,4 +122,4 @@ jobs: with: files: ./go/src/github.com/${{ github.repository }}/cover.out flags: unittests - fail_ci_if_error: false # see https://github.com/codecov/codecov-action/issues/598 + fail_ci_if_error: false # see https://github.com/codecov/codecov-action/issues/598 \ No newline at end of file diff --git a/Makefile b/Makefile index bce659e30..da6c8a709 100644 --- a/Makefile +++ b/Makefile @@ -106,6 +106,10 @@ e2e-sanity-openstack-extended: sudo bash -c 'echo "127.0.0.1 packstack.konveyor-forklift" >>/etc/hosts' go test ./tests/suit -v -ginkgo.focus ".*Migration Extended tests for OpenStack.*" -ginkgo.parallel.total 1 +e2e-sanity-ova: + # ova suit + go test ./tests/suit -v -ginkgo.focus ".*OVA.*" + # Build forklift-controller binary forklift-controller: generate fmt vet @@ -489,4 +493,4 @@ undeploy: kubectl @for ROLE_BINDING in forklift-{default,operator,controller,api,catalog,catalog-default} ; do \ $(KUBECTL) -n $(REGISTRY_ORG) get rolebinding $${ROLE_BINDING} -o name 2>/dev/null | xargs -r $(KUBECTL) -n $(REGISTRY_ORG) delete ; \ done; - @echo "Done!" + @echo "Done!" \ No newline at end of file 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..39d4e6a9d 100644 --- a/tests/suit/framework/framework.go +++ b/tests/suit/framework/framework.go @@ -77,14 +77,12 @@ type Clients struct { // CrClient is a controller runtime client CrClient crclient.Client - // RestConfig provides a pointer to our REST client config. - RestConfig *rest.Config // DynamicClient performs generic operations on arbitrary k8s API objects. - DynamicClient dynamic.Interface - // OvirtClient provides a pointer to ovirt client. - OvirtClient OvirtClient - // OpenStackClient provides a pointer to Openstack client. + DynamicClient dynamic.Interface + RestConfig *rest.Config + OvirtClient OvirtClient OpenStackClient OpenStackClient + OvaClient OvaClient } // K8s returns Kubernetes Clientset @@ -292,6 +290,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..cba013f0b --- /dev/null +++ b/tests/suit/framework/ova.go @@ -0,0 +1,72 @@ +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 + } else { + r.storageClass = "nfs-csi" + } + + r.vmData.testVMId = "21bf790bcdc4591ef01ec6fa7b4812e0d830" + 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 = 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..02d24f0e9 --- /dev/null +++ b/tests/suit/ova_test.go @@ -0,0 +1,84 @@ +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") + secret, err := utils.CreateSecretFromDefinition(f.K8sClient, utils.NewSecretDefinition( + map[string]string{ + "createdForProviderType": "ova", + }, 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, secret) + err = utils.CreateProviderFromDefinition(f.CrClient, pr) + Expect(err).ToNot(HaveOccurred()) + provider, err := utils.WaitForProviderReadyWithTimeout(f.CrClient, namespace, ovaProviderName, 5*time.Minute) + 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, 30*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.NewPlanWithVmId(*provider, namespace, test_plan_name, test_storage_map_name, networkMapName, targetNS.Name, []string{vmData.GetVmId()}) + + 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..418fefcd8 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" @@ -31,11 +32,17 @@ func NewStorageMap(namespace string, providerIdentifier forkliftv1.Provider, sto for _, sd := range storageIDs { pair := forkliftv1.StoragePair{ - Source: ref.Ref{ID: sd}, Destination: forkliftv1.DestinationStorage{ StorageClass: storageClass, }, } + + if providerIdentifier.Type() != api.Ova { + pair.Source = ref.Ref{ID: sd} + } else { + pair.Source = ref.Ref{Name: sd} + } + sdPairs = append(sdPairs, pair) }