Skip to content

Commit 571b054

Browse files
Merge pull request #2673 from dlom/HIVE-2270-mini
HIVE-2270: minimal e2e support for vSphere
2 parents 1016c11 + 2c213e9 commit 571b054

File tree

3 files changed

+56
-43
lines changed

3 files changed

+56
-43
lines changed

contrib/pkg/createcluster/create.go

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package createcluster
22

33
import (
44
"bytes"
5+
"encoding/json"
56
"fmt"
67
"os"
78
"os/user"
@@ -32,6 +33,7 @@ import (
3233
"github.com/openshift/hive/pkg/gcpclient"
3334
"github.com/openshift/hive/pkg/util/scheme"
3435
installertypes "github.com/openshift/installer/pkg/types"
36+
installervsphere "github.com/openshift/installer/pkg/types/vsphere"
3537
"github.com/openshift/installer/pkg/validate"
3638
)
3739

@@ -208,6 +210,7 @@ type Options struct {
208210
VSphereAPIVIP string
209211
VSphereIngressVIP string
210212
VSphereNetwork string
213+
VSpherePlatformSpecJSON string
211214
VSphereCACerts string
212215

213216
// Ovirt
@@ -380,6 +383,7 @@ OpenShift Installer publishes all the services of the cluster like API server an
380383
flags.StringVar(&opt.VSphereAPIVIP, "vsphere-api-vip", "", "Virtual IP address for the api endpoint")
381384
flags.StringVar(&opt.VSphereIngressVIP, "vsphere-ingress-vip", "", "Virtual IP address for ingress application routing")
382385
flags.StringVar(&opt.VSphereNetwork, "vsphere-network", "", "Name of the network to be used by the cluster")
386+
flags.StringVar(&opt.VSpherePlatformSpecJSON, "vsphere-platform-spec-json", "", "Installer vsphere platform spec, encoded as JSON")
383387
flags.StringVar(&opt.VSphereCACerts, "vsphere-ca-certs", "", "Path to vSphere CA certificate, multiple CA paths can be : delimited")
384388

385389
// Nutanix
@@ -786,22 +790,52 @@ func (o *Options) GenerateObjects() ([]runtime.Object, error) {
786790
if o.VSphereDatacenter != "" {
787791
vSphereDatacenter = o.VSphereDatacenter
788792
}
789-
if vSphereDatacenter == "" {
790-
return nil, fmt.Errorf("must provide --vsphere-datacenter or set %s env var", constants.VSphereDataCenterEnvVar)
791-
}
792793

793794
vSphereDatastore := os.Getenv(constants.VSphereDataStoreEnvVar)
794795
if o.VSphereDefaultDataStore != "" {
795796
vSphereDatastore = o.VSphereDefaultDataStore
796797
}
797-
if vSphereDatastore == "" {
798-
return nil, fmt.Errorf("must provide --vsphere-default-datastore or set %s env var", constants.VSphereDataStoreEnvVar)
799-
}
800798

801799
vSphereVCenter := os.Getenv(constants.VSphereVCenterEnvVar)
802800
if o.VSphereVCenter != "" {
803801
vSphereVCenter = o.VSphereVCenter
804802
}
803+
804+
vSphereFolder := o.VSphereFolder
805+
vSphereCluster := o.VSphereCluster
806+
vSphereAPIVIP := o.VSphereAPIVIP
807+
vSphereIngressVIP := o.VSphereIngressVIP
808+
809+
platformBytes := []byte(os.Getenv(constants.VSpherePlatformSpecJSONEnvVar))
810+
if o.VSpherePlatformSpecJSON != "" {
811+
platformBytes = []byte(o.VSpherePlatformSpecJSON)
812+
}
813+
814+
if len(platformBytes) > 0 {
815+
o.log.Info("using provided installer platform spec instead of other flags for vsphere (size: %v)", len(platformBytes))
816+
platform := installervsphere.Platform{}
817+
err = json.Unmarshal(platformBytes, &platform)
818+
if err != nil {
819+
return nil, fmt.Errorf("error decoding platform %s: %w", o.VSpherePlatformSpecJSON, err)
820+
}
821+
822+
vSphereVCenter = platform.VCenters[0].Server
823+
vSphereDatacenter = platform.VCenters[0].Datacenters[0]
824+
if vSphereDatacenter == "" {
825+
vSphereDatacenter = platform.FailureDomains[0].Topology.Datacenter
826+
}
827+
vSphereDatastore = platform.FailureDomains[0].Topology.Datastore
828+
vSphereFolder = platform.FailureDomains[0].Topology.Folder
829+
vSphereCluster = platform.FailureDomains[0].Topology.ComputeCluster
830+
vSphereNetwork = platform.FailureDomains[0].Topology.Networks[0]
831+
}
832+
833+
if vSphereDatacenter == "" {
834+
return nil, fmt.Errorf("must provide --vsphere-datacenter or set %s env var", constants.VSphereDataCenterEnvVar)
835+
}
836+
if vSphereDatastore == "" {
837+
return nil, fmt.Errorf("must provide --vsphere-default-datastore or set %s env var", constants.VSphereDataStoreEnvVar)
838+
}
805839
if vSphereVCenter == "" {
806840
return nil, fmt.Errorf("must provide --vsphere-vcenter or set %s env var", constants.VSphereVCenterEnvVar)
807841
}
@@ -812,10 +846,10 @@ func (o *Options) GenerateObjects() ([]runtime.Object, error) {
812846
Password: vspherePassword,
813847
Datacenter: vSphereDatacenter,
814848
DefaultDatastore: vSphereDatastore,
815-
Folder: o.VSphereFolder,
816-
Cluster: o.VSphereCluster,
817-
APIVIP: o.VSphereAPIVIP,
818-
IngressVIP: o.VSphereIngressVIP,
849+
Folder: vSphereFolder,
850+
Cluster: vSphereCluster,
851+
APIVIP: vSphereAPIVIP,
852+
IngressVIP: vSphereIngressVIP,
819853
Network: vSphereNetwork,
820854
CACert: bytes.Join(caCerts, []byte("\n")),
821855
}

hack/e2e-common.sh

Lines changed: 9 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
shopt -s expand_aliases
44
alias echo='/bin/echo -n `date -Ins --universal`" "; /bin/echo'
55

6+
# Workaround for upstream vsphere e2e setting SSL_CERT_FILE to a vsphere specific value (bad for us)
7+
unset SSL_CERT_FILE
8+
69
###
710
# TEMPORARY workaround for https://issues.redhat.com/browse/DPTP-2871
811
# The configured job timeout after isn't signaling the test script like it
@@ -223,23 +226,14 @@ case "${CLOUD}" in
223226
;;
224227
"vsphere")
225228
BASE_DOMAIN="${BASE_DOMAIN:-vmc.devcluster.openshift.com}"
226-
if [ -z "$NETWORK_NAME" ]; then
227-
echo "Variable 'NETWORK_NAME' not set."
228-
exit 1
229-
fi
230-
if [ -z "$VCENTER" ]; then
231-
echo "Variable 'VCENTER' not set."
229+
USE_MANAGED_DNS=false
230+
if [ -z "$VSPHERE_INSTALLER_PLATFORM_SPEC_JSON" ]; then
231+
echo "Variable 'VSPHERE_INSTALLER_PLATFORM_SPEC_JSON' not set."
232232
exit 1
233233
fi
234-
API_VIP=$(get_vips 3) # Get 3rd vip from file
235-
INGRESS_VIP=$(get_vips 4) # Get 4th vip from file
236-
EXTRA_CREATE_CLUSTER_ARGS="--vsphere-datacenter=${GOVC_DATACENTER:-DEVQEdatacenter} \
237-
--vsphere-default-datastore=${GOVC_DATASTORE:-vsanDatastore}\
238-
--vsphere-cluster=${VSPHERE_CLUSTER:-DEVQEcluster}
239-
--vsphere-api-vip=$API_VIP \
240-
--vsphere-ingress-vip=$INGRESS_VIP \
241-
--vsphere-network=$NETWORK_NAME \
242-
--vsphere-vcenter=$VCENTER"
234+
EXTRA_CREATE_CLUSTER_ARGS="--machine-network=$VSPHERE_MACHINE_NETWORK \
235+
--vsphere-api-vip=$VSPHERE_API_VIP \
236+
--vsphere-ingress-vip=$VSPHERE_INGRESS_VIP"
243237
;;
244238
*)
245239
echo "unknown cloud: ${CLOUD}"
@@ -317,22 +311,4 @@ function capture_cluster_logs() {
317311
${SRC_ROOT}/hack/logextractor.sh ${CLUSTER_NAME} "${ARTIFACT_DIR}/hive"
318312
exit 1
319313
fi
320-
}
321-
322-
function get_vips() {
323-
# Return vip at given index
324-
idx=${1:-1}
325-
if [ -z "$SHARED_DIR" ]; then
326-
echo "Variable 'SHARED_DIR' not set."
327-
exit 1
328-
fi
329-
330-
vips="${SHARED_DIR}/vips.txt"
331-
if [ ! -f "$vips" ]; then
332-
echo "Error: File '$vips' not found."
333-
exit 1
334-
fi
335-
336-
vip=$(sed -n "${idx}p" "$vips")
337-
echo "$vip"
338314
}

pkg/constants/constants.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,9 @@ const (
335335
// VSphereDataStoreEnvVar is the environment variable specifying the vSphere default datastore.
336336
VSphereDataStoreEnvVar = "GOVC_DATASTORE"
337337

338+
// VSpherePlatformSpecJSONEnvVar is the environment variable containing an installer vSphere platform spec, encoded as JSON
339+
VSpherePlatformSpecJSONEnvVar = "VSPHERE_INSTALLER_PLATFORM_SPEC_JSON"
340+
338341
// VSphereCredentialsDir is the directory containing VSphere credentials files.
339342
VSphereCredentialsDir = "/vsphere-credentials"
340343

0 commit comments

Comments
 (0)