Skip to content

Commit

Permalink
vsphere installer terraform changes
Browse files Browse the repository at this point in the history
  • Loading branch information
jcpowermac committed Apr 11, 2024
1 parent 85938bb commit 23a5e69
Show file tree
Hide file tree
Showing 5 changed files with 7 additions and 446 deletions.
104 changes: 3 additions & 101 deletions pkg/asset/cluster/tfvars/tfvars.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"fmt"
"math/rand"
"os"
"path"
"strconv"
"strings"
"time"
Expand All @@ -16,8 +15,6 @@ import (
coreosarch "github.com/coreos/stream-metadata-go/arch"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/vmware/govmomi/object"
"github.com/vmware/govmomi/vim25/mo"
"sigs.k8s.io/yaml"

configv1 "github.com/openshift/api/config/v1"
Expand All @@ -38,7 +35,6 @@ import (
ibmcloudconfig "github.com/openshift/installer/pkg/asset/installconfig/ibmcloud"
ovirtconfig "github.com/openshift/installer/pkg/asset/installconfig/ovirt"
powervsconfig "github.com/openshift/installer/pkg/asset/installconfig/powervs"
vsphereconfig "github.com/openshift/installer/pkg/asset/installconfig/vsphere"
"github.com/openshift/installer/pkg/asset/machines"
"github.com/openshift/installer/pkg/asset/manifests"
"github.com/openshift/installer/pkg/asset/openshiftinstall"
Expand All @@ -55,7 +51,6 @@ import (
openstacktfvars "github.com/openshift/installer/pkg/tfvars/openstack"
ovirttfvars "github.com/openshift/installer/pkg/tfvars/ovirt"
powervstfvars "github.com/openshift/installer/pkg/tfvars/powervs"
vspheretfvars "github.com/openshift/installer/pkg/tfvars/vsphere"
"github.com/openshift/installer/pkg/types"
"github.com/openshift/installer/pkg/types/aws"
"github.com/openshift/installer/pkg/types/azure"
Expand Down Expand Up @@ -1034,102 +1029,9 @@ func (t *TerraformVariables) Generate(parents asset.Parents) error {
})

case vsphere.Name:
networkFailureDomainMap := make(map[string]string)
ctx, cancel := context.WithTimeout(context.TODO(), 60*time.Second)
defer cancel()

vim25Client, _, cleanup, err := vsphereconfig.CreateVSphereClients(context.TODO(),
installConfig.Config.VSphere.VCenters[0].Server,
installConfig.Config.VSphere.VCenters[0].Username,
installConfig.Config.VSphere.VCenters[0].Password)
if err != nil {
return errors.Wrapf(err, "unable to connect to vCenter %s. Ensure provided information is correct and client certs have been added to system trust", installConfig.Config.VSphere.VCenters[0].Server)
}
defer cleanup()

finder := vsphereconfig.NewFinder(vim25Client)

controlPlanes, err := mastersAsset.Machines()
if err != nil {
return err
}
ipAddresses, err := mastersAsset.IPAddresses()
if err != nil {
return err
}
controlPlaneConfigs := make([]*machinev1beta1.VSphereMachineProviderSpec, len(controlPlanes))
for i, c := range controlPlanes {
var clusterMo mo.ClusterComputeResource
controlPlaneConfigs[i] = c.Spec.ProviderSpec.Value.Object.(*machinev1beta1.VSphereMachineProviderSpec) //nolint:errcheck // legacy, pre-linter

rpObj, err := finder.ResourcePool(ctx, controlPlaneConfigs[i].Workspace.ResourcePool)
if err != nil {
return err
}

clusterRef, err := rpObj.Owner(ctx)
if err != nil {
return err
}

// When using finder.ObjectReference the InventoryPath is defined
// NewClusterComputeResource I don't believe assigns that value.
clusterObjRef, err := finder.ObjectReference(ctx, clusterRef.Reference())
if err != nil {
return err
}

clusterObj, ok := clusterObjRef.(*object.ClusterComputeResource)
if !ok {
return errors.New("unable to convert cluster object reference to object cluster compute resource")
}
err = clusterObj.Properties(ctx, clusterRef.Reference(), []string{"name", "summary"}, &clusterMo)
if err != nil {
return err
}

networkPath := path.Join(clusterObj.InventoryPath, controlPlaneConfigs[i].Network.Devices[0].NetworkName)
netObj, err := finder.Network(ctx, networkPath)
if err != nil {
return err
}

controlPlaneConfigs[i].Network.Devices[0].NetworkName = netObj.Reference().Value
}

for _, fd := range installConfig.Config.VSphere.FailureDomains {
// Must use the Managed Object ID for a port group (e.g. dvportgroup-5258)
// instead of the name since port group names aren't always unique in vSphere.
// https://bugzilla.redhat.com/show_bug.cgi?id=1918005

networkPath := path.Join(fd.Topology.ComputeCluster, fd.Topology.Networks[0])
netObj, err := finder.Network(ctx, networkPath)
if err != nil {
return errors.Wrap(err, "failed to get vSphere network ID")
}

networkFailureDomainMap[fd.Name] = netObj.Reference().Value
}

data, err = vspheretfvars.TFVars(
vspheretfvars.TFVarsSources{
ControlPlaneConfigs: controlPlaneConfigs,
ImageURL: string(*rhcosImage),
DiskType: installConfig.Config.Platform.VSphere.DiskType,
NetworksInFailureDomain: networkFailureDomainMap,
InfraID: clusterID.InfraID,
InstallConfig: installConfig,
ControlPlaneMachines: controlPlanes,
IPAddresses: ipAddresses,
},
)
if err != nil {
return errors.Wrapf(err, "failed to get %s Terraform variables", platform)
}
t.FileList = append(t.FileList, &asset.File{
Filename: TfPlatformVarsFileName,
Data: data,
})
logrus.Warn("installing on vSphere via terraform is no longer supported")
t.FileList = make([]*asset.File, 0)
return nil
case nutanix.Name:
controlPlanes, err := mastersAsset.Machines()
if err != nil {
Expand Down
4 changes: 0 additions & 4 deletions pkg/terraform/providers/providers.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,6 @@ var (
OVirt = provider("ovirt")
// Time is the provider for adding create and sleep requirements for resources.
Time = provider("time")
// VSphere is the provider for creating resource in vSphere.
VSphere = provider("vsphere")
// VSpherePrivate is an internal provider augmenting the VSphere provider by adding functionality.
VSpherePrivate = provider("vsphereprivate")
)

// Provider is a terraform provider.
Expand Down
125 changes: 4 additions & 121 deletions pkg/terraform/stages/vsphere/stages.go
Original file line number Diff line number Diff line change
@@ -1,124 +1,7 @@
package vsphere

import (
"context"
"time"
import "github.com/openshift/installer/pkg/terraform"

"github.com/pkg/errors"
"github.com/vmware/govmomi/object"
"github.com/vmware/govmomi/vim25"
vmwaretypes "github.com/vmware/govmomi/vim25/types"

"github.com/openshift/installer/pkg/asset/installconfig/vsphere"
"github.com/openshift/installer/pkg/terraform"
"github.com/openshift/installer/pkg/terraform/providers"
"github.com/openshift/installer/pkg/terraform/stages"
"github.com/openshift/installer/pkg/types"
)

// PlatformStages are the stages to run to provision the infrastructure in a
// multiple region and zone vsphere environment.
var PlatformStages = []terraform.Stage{
stages.NewStage(
"vsphere",
"pre-bootstrap",
[]providers.Provider{providers.VSphere, providers.VSpherePrivate},
),
stages.NewStage(
"vsphere",
"bootstrap",
[]providers.Provider{providers.VSphere},
stages.WithNormalBootstrapDestroy(),
stages.WithCustomExtractHostAddresses(extractOutputHostAddresses),
),
stages.NewStage(
"vsphere",
"master",
[]providers.Provider{providers.VSphere},
stages.WithCustomExtractHostAddresses(extractOutputHostAddresses),
),
}

func extractOutputHostAddresses(s stages.SplitStage, directory string, config *types.InstallConfig) (bootstrap string, port int, masters []string, err error) {
port = 22

outputs, err := stages.GetTerraformOutputs(s, directory)
if err != nil {
return "", 0, nil, err
}

var bootstrapMoid string
if bootstrapRaw, ok := outputs["bootstrap_moid"]; ok {
bootstrapMoid, ok = bootstrapRaw.(string)
if !ok {
return "", 0, nil, errors.New("could not read bootstrap MOID from terraform outputs")
}
}

var mastersMoids []string
if mastersRaw, ok := outputs["control_plane_moids"]; ok {
mastersSlice, ok := mastersRaw.([]interface{})
if !ok {
return "", 0, nil, errors.New("could not read control plane MOIDs from terraform outputs")
}
mastersMoids = make([]string, len(mastersSlice))
for i, moidRaw := range mastersSlice {
moid, ok := moidRaw.(string)
if !ok {
return "", 0, nil, errors.New("could not read control plane MOIDs from terraform outputs")
}
mastersMoids[i] = moid
}
}

bootstrap, err = hostIP(config, bootstrapMoid)
if err != nil {
return "", 0, nil, errors.Errorf("could not extract IP with bootstrap MOID: %s", bootstrapMoid)
}

masters = make([]string, len(mastersMoids))
for i, moid := range mastersMoids {
masters[i], err = hostIP(config, moid)
if err != nil {
return "", 0, nil, errors.Errorf("could not extract IP with control node MOID: %s", moid)
}
}

return bootstrap, port, masters, nil
}

// hostIP returns the ip address for a host
func hostIP(config *types.InstallConfig, moid string) (string, error) {
client, _, cleanup, err := vsphere.CreateVSphereClients(context.TODO(), config.VSphere.VCenters[0].Server, config.VSphere.VCenters[0].Username, config.VSphere.VCenters[0].Password)
if err != nil {
return "", err
}
defer cleanup()

ip, err := waitForVirtualMachineIP(client, moid)
if err != nil {
return "", errors.Wrapf(err, "failed to lookup ipv4 address from given moid %s", moid)
}

return ip, nil
}

func waitForVirtualMachineIP(client *vim25.Client, moRefValue string) (string, error) {
moRef := vmwaretypes.ManagedObjectReference{
Type: "VirtualMachine",
Value: moRefValue,
}

vm := object.NewVirtualMachine(client, moRef)
if vm == nil {
return "", errors.Errorf("VirtualMachine was not found")
}
ctx, cancel := context.WithTimeout(context.TODO(), 60*time.Second)
defer cancel()

ip, err := vm.WaitForIP(ctx, true)
if err != nil {
return "", err
}
return ip, nil
}
// PlatformStages contains the empty list of terraform stages for vSphere
// This is empty because vSphere no longer uses terraform for installation.
var PlatformStages []terraform.Stage
7 changes: 0 additions & 7 deletions pkg/tfvars/vsphere/OWNERS

This file was deleted.

0 comments on commit 23a5e69

Please sign in to comment.