From c1bc14b03ae41cc11b1851588603918fc2fc924c Mon Sep 17 00:00:00 2001 From: Richard Vanderpool <49568690+rvanderp3@users.noreply.github.com> Date: Tue, 14 Sep 2021 16:53:01 -0400 Subject: [PATCH] [test] create machineset spec based on spec created at install time The intent of this PR is to derive the Workspace for machinesets created during testing based on the compute machineset provisioned by the cluster at installation. The reason for this change is that a vCenter in IBM Cloud is being also used to run CI jobs from a shared lease pool to increase test coverage in some key configurations. Additionally, the vmTemplate can now be optionally defined as an environment variable in the e2e test script. --- test/e2e/providers/vsphere/vsphere.go | 63 +++++++++++++++++++++------ 1 file changed, 50 insertions(+), 13 deletions(-) diff --git a/test/e2e/providers/vsphere/vsphere.go b/test/e2e/providers/vsphere/vsphere.go index 2b6d45168e..ad71cafc6f 100644 --- a/test/e2e/providers/vsphere/vsphere.go +++ b/test/e2e/providers/vsphere/vsphere.go @@ -1,8 +1,10 @@ package vsphere import ( + "context" "encoding/json" "fmt" + "log" "os" "github.com/pkg/errors" @@ -32,10 +34,24 @@ func New(clientset *clusterinfo.OpenShift) (*Provider, error) { } // newVSphereMachineProviderSpec returns a vSphereMachineProviderSpec generated from the inputs, or an error -func newVSphereMachineProviderSpec(clusterID string) (*vsphere.VSphereMachineProviderSpec, error) { +func (p *Provider) newVSphereMachineProviderSpec(clusterID string) (*vsphere.VSphereMachineProviderSpec, error) { if clusterID == "" { return nil, fmt.Errorf("clusterID is empty") } + workspace, err := p.getWorkspaceFromExistingMachineSet(clusterID) + if err != nil { + return nil, err + } + log.Printf("creating machineset provider spec which targets %s\n", workspace.Server) + + // The template is an image which has been properly sysprepped. The image is derived from an environment variable + // defined in the job spec. + vmTemplate := os.Getenv("VM_TEMPLATE") + if vmTemplate == "" { + vmTemplate = "windows-golden-images/windows-server-2004-template" + } + + log.Printf("creating machineset based on template %s\n", vmTemplate) return &vsphere.VSphereMachineProviderSpec{ TypeMeta: meta.TypeMeta{ @@ -52,19 +68,40 @@ func newVSphereMachineProviderSpec(clusterID string) (*vsphere.VSphereMachinePro }, NumCPUs: int32(4), NumCoresPerSocket: int32(1), - // The template is hardcoded with an image which has been properly sysprepped. - // TODO: Find a way to automatically update this with latest image - Template: "windows-golden-images/windows-server-2004-template", - Workspace: &vsphere.Workspace{ - Datacenter: "SDDC-Datacenter", - Datastore: "WorkloadDatastore", - Folder: "/SDDC-Datacenter/vm/" + clusterID, - ResourcePool: "/SDDC-Datacenter/host/Cluster-1/Resources", - Server: "vcenter.sddc-44-236-21-251.vmwarevmc.com", - }, + Template: vmTemplate, + Workspace: workspace, }, nil } +// getWorkspaceFromExistingMachineSet returns Workspace from a machineset provisioned during installation +func (p *Provider) getWorkspaceFromExistingMachineSet(clusterID string) (*vsphere.Workspace, error) { + if clusterID == "" { + return nil, fmt.Errorf("clusterID is empty") + } + listOptions := meta.ListOptions{LabelSelector: "machine.openshift.io/cluster-api-cluster=" + clusterID} + machineSets, err := p.oc.Machine.MachineSets("openshift-machine-api").List(context.TODO(), listOptions) + if err != nil { + return nil, errors.Wrap(err, "unable to get machinesets") + } + + if len(machineSets.Items) == 0 { + return nil, errors.Wrap(err, "no matching machinesets found") + } + + machineSet := machineSets.Items[0] + providerSpecRaw := machineSet.Spec.Template.Spec.ProviderSpec.Value + if providerSpecRaw == nil || providerSpecRaw.Raw == nil { + return nil, errors.Wrap(err, "no provider spec found") + } + var providerSpec vsphere.VSphereMachineProviderSpec + err = json.Unmarshal(providerSpecRaw.Raw, &providerSpec) + if err != nil { + return nil, errors.Wrap(err, "unable to unmarshal providerSpec") + } + + return providerSpec.Workspace, nil +} + // getNetwork returns the network that needs to be used in the MachineSet func getNetwork() string { // Default network for dev environment @@ -84,11 +121,11 @@ func getNetwork() string { func (p *Provider) GenerateMachineSet(withWindowsLabel bool, replicas int32) (*mapi.MachineSet, error) { clusterID, err := p.oc.GetInfrastructureID() if err != nil { - return nil, fmt.Errorf("unable to get cluster id: %v", err) + return nil, errors.Wrap(err, "unable to get cluster id") } // create new machine provider spec for deploying Windows node - providerSpec, err := newVSphereMachineProviderSpec(clusterID) + providerSpec, err := p.newVSphereMachineProviderSpec(clusterID) if err != nil { return nil, errors.Wrap(err, "failed to create new vSphere machine provider spec") }