Repository: vmware-tanzu/vm-operator
Pull request #965: 🌱 Report VM status.hostName
Author: login: akutz
Labels: name: size/L
description: Denotes a PR that changes 100-499 lines.
Created: 2025-05-09T13:55:05Z | Merged: 2025-05-12T14:19:17Z


<!--
Thanks for sending a pull request!

Please add one of the following icons to the title of this PR:

    ⚠️ (:warning:, a major or breaking change)
    ✨ (:sparkles:, feature additions)
    🐛 (:bug:, patch and bugfixes)
    📖 (:book:, documentation or proposals)
    🌱 (:seedling:, minor or other)

Some other tips:

    1. If this is your first time filing a PR, please read our contributor
       guidelines for submitting a change at https://vm-operator.readthedocs.io/en/stable/start/contrib/submit-change/.
    2. If this PR is unfinished, please prefix the subject with "WIP:".

Finally, before filing the PR, please delete all of the HTML comments.
-->

**What does this PR do, and why is it needed?**

This patch adds a new field to the VM status to report the hostName field surfaced by VMware Tools from within the guest.


**Which issue(s) is/are addressed by this PR?** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*:

Fixes `NA`


**Are there any special notes for your reviewer**:

I validated this on a real setup:

```yaml
apiVersion: vmoperator.vmware.com/v1alpha4
kind: VirtualMachine
metadata:
  name: my-vm-3
  namespace: my-namespace-1
spec:
  className: best-effort-small
  imageName: photon-hw15-5.0-dde71ec57.x86_64
  storageClass: wcpglobal-storage-profile
  network:
    hostName: a
    domainName: kutz
  bootstrap:
    cloudInit:
      cloudConfig:
        users:
        - name: akutz
          shell: /bin/bash
          sudo: ALL=(ALL) NOPASSWD:ALL
          ssh_authorized_keys:
          - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDE0c5FczvcGSh/tG4iw+Fhfi/O5/EvUM/96js65tly4++YTXK1d9jcznPS5ruDlbIZ30oveCBd3kT8LLVFwzh6hepYTf0YmCTpF4eDunyqmpCXDvVscQYRXyasEm5olGmVe05RrCJSeSShAeptv4ueIn40kZKOghinGWLDSZG4+FFfgrmcMCpx5YSCtX2gvnEYZJr0czt4rxOZuuP7PkJKgC/mt2PcPjooeX00vAj81jjU2f3XKrjjz2u2+KIt9eba+vOQ6HiC8c2IzRkUAJ5i1atLy8RIbejo23+0P4N2jjk17QySFOVHwPBDTYb0/0M/4ideeU74EN/CgVsvO6JrLsPBR4dojkV5qNbMNxIVv5cUwIy2ThlLgqpNCeFIDLCWNZEFKlEuNeSQ2mPtIO7ETxEL2Cz5y/7AIuildzYMc6wi2bofRC8HmQ7rMXRWdwLKWsR0L7SKjHblIwarxOGqLnUI+k2E71YoP7SZSlxaKi17pqkr0OMCF+kKqvcvHAQuwGqyumTEWOlH6TCx1dSPrW+pVCZSHSJtSTfDW2uzL6y8k10MT06+pVunSrWo5LHAXcS91htHV1M1UrH/tZKSpjYtjMb5+RonfhaFRNzvj7cCE1f3Kp8UVqAdcGBTtReoE8eRUT63qIxjw03a7VwAyB2w+9cu1R9/vAo8SBeRqw== sakutz@gmail.com
```

```shell
$ kubectl -n my-namespace-1 get vm my-vm-3 -ojsonpath='{.status.hostName}{"\n"}'
a.kutz
```

![image](https://github.com/user-attachments/assets/9decfc8f-10a0-438d-84a3-3bac2b465f13)



**Please add a release note if necessary**:

<!--
Write your release note:

    1. Enter your extended release note in the below block. If the PR requires
       additional action from users switching to the new release, please include
       the string "action required".
    2. If a release note is not required, please write "NONE".
-->

```release-note
Report guest's host name / FQDN via `status.hostName`.
```


Diff:
diff --git a/api/v1alpha1/virtualmachine_conversion.go b/api/v1alpha1/virtualmachine_conversion.go
index bfd8d44e3..207c5f057 100644
--- a/api/v1alpha1/virtualmachine_conversion.go
+++ b/api/v1alpha1/virtualmachine_conversion.go
@@ -702,6 +702,14 @@ func Convert_v1alpha1_VirtualMachineStatus_To_v1alpha4_VirtualMachineStatus(
 
 	out.PowerState = convert_v1alpha1_VirtualMachinePowerState_To_v1alpha4_VirtualMachinePowerState(in.PowerState)
 	out.Network = convert_v1alpha1_Network_To_v1alpha4_NetworkStatus(in.VmIp, in.NetworkInterfaces)
+	out.NodeName = in.Host
+
+	if in.HostName != "" {
+		if out.Network == nil {
+			out.Network = &vmopv1.VirtualMachineNetworkStatus{}
+		}
+		out.Network.HostName = in.HostName
+	}
 
 	// WARNING: in.Phase requires manual conversion: does not exist in peer-type
 
@@ -820,6 +828,12 @@ func Convert_v1alpha4_VirtualMachineStatus_To_v1alpha1_VirtualMachineStatus(
 	// WARNING: in.Image requires manual conversion: does not exist in peer-type
 	// WARNING: in.Class requires manual conversion: does not exist in peer-type
 
+	out.Host = in.NodeName
+
+	if in.Network != nil {
+		out.HostName = in.Network.HostName
+	}
+
 	return nil
 }
 
diff --git a/api/v1alpha1/virtualmachine_conversion_test.go b/api/v1alpha1/virtualmachine_conversion_test.go
index 8a686c960..84379ba48 100644
--- a/api/v1alpha1/virtualmachine_conversion_test.go
+++ b/api/v1alpha1/virtualmachine_conversion_test.go
@@ -551,7 +551,7 @@ func TestVirtualMachineConversion(t *testing.T) {
 		now := time.Now()
 		hub := vmopv1.VirtualMachine{
 			Status: vmopv1.VirtualMachineStatus{
-				Host:       "my-host",
+				NodeName:   "my-host",
 				PowerState: vmopv1.VirtualMachinePowerStateOn,
 				Conditions: []metav1.Condition{
 					{
@@ -603,7 +603,7 @@ func TestVirtualMachineConversion(t *testing.T) {
 		spoke := &vmopv1a1.VirtualMachine{}
 		g.Expect(spoke.ConvertFrom(&hub)).To(Succeed())
 
-		g.Expect(spoke.Status.Host).To(Equal(hub.Status.Host))
+		g.Expect(spoke.Status.Host).To(Equal(hub.Status.NodeName))
 		g.Expect(spoke.Status.PowerState).To(Equal(vmopv1a1.VirtualMachinePoweredOn))
 		g.Expect(spoke.Status.VmIp).To(Equal(hub.Status.Network.PrimaryIP4))
 		g.Expect(spoke.Status.NetworkInterfaces[0].MacAddress).To(Equal("my-mac"))
@@ -667,7 +667,7 @@ func TestVirtualMachineConversion(t *testing.T) {
 		hub := &vmopv1.VirtualMachine{}
 		g.Expect(spoke.ConvertTo(hub)).To(Succeed())
 
-		g.Expect(hub.Status.Host).To(Equal(spoke.Status.Host))
+		g.Expect(hub.Status.NodeName).To(Equal(spoke.Status.Host))
 		g.Expect(hub.Status.PowerState).To(Equal(vmopv1.VirtualMachinePowerStateOff))
 		g.Expect(hub.Status.Conditions).To(HaveLen(1))
 		g.Expect(hub.Status.Conditions[0].Type).To(Equal("Cond"))
diff --git a/api/v1alpha1/virtualmachine_types.go b/api/v1alpha1/virtualmachine_types.go
index bdf21d81f..a30fb59dd 100644
--- a/api/v1alpha1/virtualmachine_types.go
+++ b/api/v1alpha1/virtualmachine_types.go
@@ -617,6 +617,16 @@ type VirtualMachineStatus struct {
 	// +optional
 	Host string `json:"host,omitempty"`
 
+	// +optional
+
+	// HostName describes the observed hostname reported by the VirtualMachine's
+	// guest operating system.
+	//
+	// Please note, this value is only reported if VMware Tools is installed in
+	// the guest, and the value may or may not be a fully qualified domain name
+	// (FQDN), it simply depends on what is reported by the guest.
+	HostName string `json:"hostName,omitempty"`
+
 	// PowerState describes the current power state of the VirtualMachine.
 	// +optional
 	PowerState VirtualMachinePowerState `json:"powerState,omitempty"`
diff --git a/api/v1alpha1/zz_generated.conversion.go b/api/v1alpha1/zz_generated.conversion.go
index 0ba7db26a..94621a3e5 100644
--- a/api/v1alpha1/zz_generated.conversion.go
+++ b/api/v1alpha1/zz_generated.conversion.go
@@ -2102,7 +2102,8 @@ func autoConvert_v1alpha4_VirtualMachineSpec_To_v1alpha1_VirtualMachineSpec(in *
 }
 
 func autoConvert_v1alpha1_VirtualMachineStatus_To_v1alpha4_VirtualMachineStatus(in *VirtualMachineStatus, out *v1alpha4.VirtualMachineStatus, s conversion.Scope) error {
-	out.Host = in.Host
+	// WARNING: in.Host requires manual conversion: does not exist in peer-type
+	// WARNING: in.HostName requires manual conversion: does not exist in peer-type
 	out.PowerState = v1alpha4.VirtualMachinePowerState(in.PowerState)
 	// WARNING: in.Phase requires manual conversion: does not exist in peer-type
 	if in.Conditions != nil {
@@ -2141,7 +2142,7 @@ func autoConvert_v1alpha1_VirtualMachineStatus_To_v1alpha4_VirtualMachineStatus(
 
 func autoConvert_v1alpha4_VirtualMachineStatus_To_v1alpha1_VirtualMachineStatus(in *v1alpha4.VirtualMachineStatus, out *VirtualMachineStatus, s conversion.Scope) error {
 	// WARNING: in.Class requires manual conversion: does not exist in peer-type
-	out.Host = in.Host
+	// WARNING: in.NodeName requires manual conversion: does not exist in peer-type
 	out.PowerState = VirtualMachinePowerState(in.PowerState)
 	if in.Conditions != nil {
 		in, out := &in.Conditions, &out.Conditions
diff --git a/api/v1alpha2/virtualmachine_conversion.go b/api/v1alpha2/virtualmachine_conversion.go
index 6fadde1f7..6635d0c24 100644
--- a/api/v1alpha2/virtualmachine_conversion.go
+++ b/api/v1alpha2/virtualmachine_conversion.go
@@ -82,13 +82,21 @@ func Convert_v1alpha4_VirtualMachineStatus_To_v1alpha2_VirtualMachineStatus(
 		}
 	}
 
+	out.Host = in.NodeName
+
 	return nil
 }
 
 func Convert_v1alpha2_VirtualMachineStatus_To_v1alpha4_VirtualMachineStatus(
 	in *VirtualMachineStatus, out *vmopv1.VirtualMachineStatus, s apiconversion.Scope) error {
 
-	return autoConvert_v1alpha2_VirtualMachineStatus_To_v1alpha4_VirtualMachineStatus(in, out, s)
+	if err := autoConvert_v1alpha2_VirtualMachineStatus_To_v1alpha4_VirtualMachineStatus(in, out, s); err != nil {
+		return err
+	}
+
+	out.NodeName = in.Host
+
+	return nil
 }
 
 func Convert_v1alpha4_VirtualMachineVolumeStatus_To_v1alpha2_VirtualMachineVolumeStatus(
diff --git a/api/v1alpha2/virtualmachine_network_types.go b/api/v1alpha2/virtualmachine_network_types.go
index bdbe6d80b..8f48583ae 100644
--- a/api/v1alpha2/virtualmachine_network_types.go
+++ b/api/v1alpha2/virtualmachine_network_types.go
@@ -610,6 +610,16 @@ type VirtualMachineNetworkStatus struct {
 	// +optional
 	Config *VirtualMachineNetworkConfigStatus `json:"config,omitempty"`
 
+	// +optional
+
+	// HostName describes the observed hostname reported by the VirtualMachine's
+	// guest operating system.
+	//
+	// Please note, this value is only reported if VMware Tools is installed in
+	// the guest, and the value may or may not be a fully qualified domain name
+	// (FQDN), it simply depends on what is reported by the guest.
+	HostName string `json:"hostName,omitempty"`
+
 	// Interfaces describes the status of the VM's network interfaces.
 	//
 	// +optional
diff --git a/api/v1alpha2/zz_generated.conversion.go b/api/v1alpha2/zz_generated.conversion.go
index e355d3f44..af38b6f00 100644
--- a/api/v1alpha2/zz_generated.conversion.go
+++ b/api/v1alpha2/zz_generated.conversion.go
@@ -2577,6 +2577,7 @@ func autoConvert_v1alpha2_VirtualMachineNetworkStatus_To_v1alpha4_VirtualMachine
 	} else {
 		out.Config = nil
 	}
+	out.HostName = in.HostName
 	out.Interfaces = *(*[]v1alpha4.VirtualMachineNetworkInterfaceStatus)(unsafe.Pointer(&in.Interfaces))
 	out.IPStacks = *(*[]v1alpha4.VirtualMachineNetworkIPStackStatus)(unsafe.Pointer(&in.IPStacks))
 	out.PrimaryIP4 = in.PrimaryIP4
@@ -2599,6 +2600,7 @@ func autoConvert_v1alpha4_VirtualMachineNetworkStatus_To_v1alpha2_VirtualMachine
 	} else {
 		out.Config = nil
 	}
+	out.HostName = in.HostName
 	out.Interfaces = *(*[]VirtualMachineNetworkInterfaceStatus)(unsafe.Pointer(&in.Interfaces))
 	out.IPStacks = *(*[]VirtualMachineNetworkIPStackStatus)(unsafe.Pointer(&in.IPStacks))
 	out.PrimaryIP4 = in.PrimaryIP4
@@ -3226,7 +3228,7 @@ func autoConvert_v1alpha4_VirtualMachineSpec_To_v1alpha2_VirtualMachineSpec(in *
 func autoConvert_v1alpha2_VirtualMachineStatus_To_v1alpha4_VirtualMachineStatus(in *VirtualMachineStatus, out *v1alpha4.VirtualMachineStatus, s conversion.Scope) error {
 	// WARNING: in.Image requires manual conversion: does not exist in peer-type
 	out.Class = (*common.LocalObjectRef)(unsafe.Pointer(in.Class))
-	out.Host = in.Host
+	// WARNING: in.Host requires manual conversion: does not exist in peer-type
 	out.PowerState = v1alpha4.VirtualMachinePowerState(in.PowerState)
 	out.Conditions = *(*[]v1.Condition)(unsafe.Pointer(&in.Conditions))
 	if in.Network != nil {
@@ -3261,7 +3263,7 @@ func autoConvert_v1alpha2_VirtualMachineStatus_To_v1alpha4_VirtualMachineStatus(
 
 func autoConvert_v1alpha4_VirtualMachineStatus_To_v1alpha2_VirtualMachineStatus(in *v1alpha4.VirtualMachineStatus, out *VirtualMachineStatus, s conversion.Scope) error {
 	out.Class = (*v1alpha2common.LocalObjectRef)(unsafe.Pointer(in.Class))
-	out.Host = in.Host
+	// WARNING: in.NodeName requires manual conversion: does not exist in peer-type
 	out.PowerState = VirtualMachinePowerState(in.PowerState)
 	out.Conditions = *(*[]v1.Condition)(unsafe.Pointer(&in.Conditions))
 	// WARNING: in.Crypto requires manual conversion: does not exist in peer-type
diff --git a/api/v1alpha3/virtualmachine_conversion.go b/api/v1alpha3/virtualmachine_conversion.go
index 4865bca79..fe9df2ba8 100644
--- a/api/v1alpha3/virtualmachine_conversion.go
+++ b/api/v1alpha3/virtualmachine_conversion.go
@@ -35,6 +35,20 @@ func Convert_v1alpha4_VirtualMachineStatus_To_v1alpha3_VirtualMachineStatus(
 		return err
 	}
 
+	out.Host = in.NodeName
+
+	return nil
+}
+
+func Convert_v1alpha3_VirtualMachineStatus_To_v1alpha4_VirtualMachineStatus(
+	in *VirtualMachineStatus, out *vmopv1.VirtualMachineStatus, s apiconversion.Scope) error {
+
+	if err := autoConvert_v1alpha3_VirtualMachineStatus_To_v1alpha4_VirtualMachineStatus(in, out, s); err != nil {
+		return err
+	}
+
+	out.NodeName = in.Host
+
 	return nil
 }
 
diff --git a/api/v1alpha3/virtualmachine_network_types.go b/api/v1alpha3/virtualmachine_network_types.go
index 39d402918..933b44d45 100644
--- a/api/v1alpha3/virtualmachine_network_types.go
+++ b/api/v1alpha3/virtualmachine_network_types.go
@@ -673,6 +673,16 @@ type VirtualMachineNetworkStatus struct {
 
 	// +optional
 
+	// HostName describes the observed hostname reported by the VirtualMachine's
+	// guest operating system.
+	//
+	// Please note, this value is only reported if VMware Tools is installed in
+	// the guest, and the value may or may not be a fully qualified domain name
+	// (FQDN), it simply depends on what is reported by the guest.
+	HostName string `json:"hostName,omitempty"`
+
+	// +optional
+
 	// Interfaces describes the status of the VM's network interfaces.
 	Interfaces []VirtualMachineNetworkInterfaceStatus `json:"interfaces,omitempty"`
 
diff --git a/api/v1alpha3/zz_generated.conversion.go b/api/v1alpha3/zz_generated.conversion.go
index 118821a11..983ab1175 100644
--- a/api/v1alpha3/zz_generated.conversion.go
+++ b/api/v1alpha3/zz_generated.conversion.go
@@ -1005,11 +1005,6 @@ func RegisterConversions(s *runtime.Scheme) error {
 	}); err != nil {
 		return err
 	}
-	if err := s.AddGeneratedConversionFunc((*VirtualMachineStatus)(nil), (*v1alpha4.VirtualMachineStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
-		return Convert_v1alpha3_VirtualMachineStatus_To_v1alpha4_VirtualMachineStatus(a.(*VirtualMachineStatus), b.(*v1alpha4.VirtualMachineStatus), scope)
-	}); err != nil {
-		return err
-	}
 	if err := s.AddGeneratedConversionFunc((*VirtualMachineStorageStatus)(nil), (*v1alpha4.VirtualMachineStorageStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
 		return Convert_v1alpha3_VirtualMachineStorageStatus_To_v1alpha4_VirtualMachineStorageStatus(a.(*VirtualMachineStorageStatus), b.(*v1alpha4.VirtualMachineStorageStatus), scope)
 	}); err != nil {
@@ -1130,6 +1125,11 @@ func RegisterConversions(s *runtime.Scheme) error {
 	}); err != nil {
 		return err
 	}
+	if err := s.AddConversionFunc((*VirtualMachineStatus)(nil), (*v1alpha4.VirtualMachineStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1alpha3_VirtualMachineStatus_To_v1alpha4_VirtualMachineStatus(a.(*VirtualMachineStatus), b.(*v1alpha4.VirtualMachineStatus), scope)
+	}); err != nil {
+		return err
+	}
 	if err := s.AddConversionFunc((*v1alpha4.VirtualMachineBootstrapCloudInitSpec)(nil), (*VirtualMachineBootstrapCloudInitSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
 		return Convert_v1alpha4_VirtualMachineBootstrapCloudInitSpec_To_v1alpha3_VirtualMachineBootstrapCloudInitSpec(a.(*v1alpha4.VirtualMachineBootstrapCloudInitSpec), b.(*VirtualMachineBootstrapCloudInitSpec), scope)
 	}); err != nil {
@@ -2999,6 +2999,7 @@ func Convert_v1alpha4_VirtualMachineNetworkSpec_To_v1alpha3_VirtualMachineNetwor
 
 func autoConvert_v1alpha3_VirtualMachineNetworkStatus_To_v1alpha4_VirtualMachineNetworkStatus(in *VirtualMachineNetworkStatus, out *v1alpha4.VirtualMachineNetworkStatus, s conversion.Scope) error {
 	out.Config = (*v1alpha4.VirtualMachineNetworkConfigStatus)(unsafe.Pointer(in.Config))
+	out.HostName = in.HostName
 	out.Interfaces = *(*[]v1alpha4.VirtualMachineNetworkInterfaceStatus)(unsafe.Pointer(&in.Interfaces))
 	out.IPStacks = *(*[]v1alpha4.VirtualMachineNetworkIPStackStatus)(unsafe.Pointer(&in.IPStacks))
 	out.PrimaryIP4 = in.PrimaryIP4
@@ -3013,6 +3014,7 @@ func Convert_v1alpha3_VirtualMachineNetworkStatus_To_v1alpha4_VirtualMachineNetw
 
 func autoConvert_v1alpha4_VirtualMachineNetworkStatus_To_v1alpha3_VirtualMachineNetworkStatus(in *v1alpha4.VirtualMachineNetworkStatus, out *VirtualMachineNetworkStatus, s conversion.Scope) error {
 	out.Config = (*VirtualMachineNetworkConfigStatus)(unsafe.Pointer(in.Config))
+	out.HostName = in.HostName
 	out.Interfaces = *(*[]VirtualMachineNetworkInterfaceStatus)(unsafe.Pointer(&in.Interfaces))
 	out.IPStacks = *(*[]VirtualMachineNetworkIPStackStatus)(unsafe.Pointer(&in.IPStacks))
 	out.PrimaryIP4 = in.PrimaryIP4
@@ -3761,7 +3763,7 @@ func autoConvert_v1alpha4_VirtualMachineSpec_To_v1alpha3_VirtualMachineSpec(in *
 
 func autoConvert_v1alpha3_VirtualMachineStatus_To_v1alpha4_VirtualMachineStatus(in *VirtualMachineStatus, out *v1alpha4.VirtualMachineStatus, s conversion.Scope) error {
 	out.Class = (*common.LocalObjectRef)(unsafe.Pointer(in.Class))
-	out.Host = in.Host
+	// WARNING: in.Host requires manual conversion: does not exist in peer-type
 	out.PowerState = v1alpha4.VirtualMachinePowerState(in.PowerState)
 	out.Conditions = *(*[]v1.Condition)(unsafe.Pointer(&in.Conditions))
 	out.Crypto = (*v1alpha4.VirtualMachineCryptoStatus)(unsafe.Pointer(in.Crypto))
@@ -3778,14 +3780,9 @@ func autoConvert_v1alpha3_VirtualMachineStatus_To_v1alpha4_VirtualMachineStatus(
 	return nil
 }
 
-// Convert_v1alpha3_VirtualMachineStatus_To_v1alpha4_VirtualMachineStatus is an autogenerated conversion function.
-func Convert_v1alpha3_VirtualMachineStatus_To_v1alpha4_VirtualMachineStatus(in *VirtualMachineStatus, out *v1alpha4.VirtualMachineStatus, s conversion.Scope) error {
-	return autoConvert_v1alpha3_VirtualMachineStatus_To_v1alpha4_VirtualMachineStatus(in, out, s)
-}
-
 func autoConvert_v1alpha4_VirtualMachineStatus_To_v1alpha3_VirtualMachineStatus(in *v1alpha4.VirtualMachineStatus, out *VirtualMachineStatus, s conversion.Scope) error {
 	out.Class = (*v1alpha3common.LocalObjectRef)(unsafe.Pointer(in.Class))
-	out.Host = in.Host
+	// WARNING: in.NodeName requires manual conversion: does not exist in peer-type
 	out.PowerState = VirtualMachinePowerState(in.PowerState)
 	out.Conditions = *(*[]v1.Condition)(unsafe.Pointer(&in.Conditions))
 	out.Crypto = (*VirtualMachineCryptoStatus)(unsafe.Pointer(in.Crypto))
diff --git a/api/v1alpha4/virtualmachine_network_types.go b/api/v1alpha4/virtualmachine_network_types.go
index b0cf9d9f9..b358b8236 100644
--- a/api/v1alpha4/virtualmachine_network_types.go
+++ b/api/v1alpha4/virtualmachine_network_types.go
@@ -673,6 +673,16 @@ type VirtualMachineNetworkStatus struct {
 
 	// +optional
 
+	// HostName describes the observed hostname reported by the VirtualMachine's
+	// guest operating system.
+	//
+	// Please note, this value is only reported if VMware Tools is installed in
+	// the guest, and the value may or may not be a fully qualified domain name
+	// (FQDN), it simply depends on what is reported by the guest.
+	HostName string `json:"hostName,omitempty"`
+
+	// +optional
+
 	// Interfaces describes the status of the VM's network interfaces.
 	Interfaces []VirtualMachineNetworkInterfaceStatus `json:"interfaces,omitempty"`
 
diff --git a/api/v1alpha4/virtualmachine_types.go b/api/v1alpha4/virtualmachine_types.go
index 8bc410607..d7b6b6c82 100644
--- a/api/v1alpha4/virtualmachine_types.go
+++ b/api/v1alpha4/virtualmachine_types.go
@@ -884,9 +884,9 @@ type VirtualMachineStatus struct {
 
 	// +optional
 
-	// Host describes the hostname or IP address of the infrastructure host
-	// where the VM is executed.
-	Host string `json:"host,omitempty"`
+	// NodeName describes the observed name of the node where the VirtualMachine
+	// is scheduled.
+	NodeName string `json:"nodeName,omitempty"`
 
 	// +optional
 
diff --git a/config/crd/bases/vmoperator.vmware.com_virtualmachines.yaml b/config/crd/bases/vmoperator.vmware.com_virtualmachines.yaml
index 1b414876f..05c4e3044 100644
--- a/config/crd/bases/vmoperator.vmware.com_virtualmachines.yaml
+++ b/config/crd/bases/vmoperator.vmware.com_virtualmachines.yaml
@@ -586,6 +586,15 @@ spec:
                 description: Host describes the hostname or IP address of the infrastructure
                   host that the VirtualMachine is executing on.
                 type: string
+              hostName:
+                description: |-
+                  HostName describes the observed hostname reported by the VirtualMachine's
+                  guest operating system.
+
+                  Please note, this value is only reported if VMware Tools is installed in
+                  the guest, and the value may or may not be a fully qualified domain name
+                  (FQDN), it simply depends on what is reported by the guest.
+                type: string
               instanceUUID:
                 description: InstanceUUID describes the unique instance UUID provided
                   by the underlying infrastructure provider, such as vSphere.
@@ -2416,6 +2425,15 @@ spec:
                           type: object
                         type: array
                     type: object
+                  hostName:
+                    description: |-
+                      HostName describes the observed hostname reported by the VirtualMachine's
+                      guest operating system.
+
+                      Please note, this value is only reported if VMware Tools is installed in
+                      the guest, and the value may or may not be a fully qualified domain name
+                      (FQDN), it simply depends on what is reported by the guest.
+                    type: string
                   interfaces:
                     description: Interfaces describes the status of the VM's network
                       interfaces.
@@ -4963,6 +4981,15 @@ spec:
                           type: object
                         type: array
                     type: object
+                  hostName:
+                    description: |-
+                      HostName describes the observed hostname reported by the VirtualMachine's
+                      guest operating system.
+
+                      Please note, this value is only reported if VMware Tools is installed in
+                      the guest, and the value may or may not be a fully qualified domain name
+                      (FQDN), it simply depends on what is reported by the guest.
+                    type: string
                   interfaces:
                     description: Interfaces describes the status of the VM's network
                       interfaces.
@@ -7443,11 +7470,6 @@ spec:
                   information on the topic of a VM's hardware version.
                 format: int32
                 type: integer
-              host:
-                description: |-
-                  Host describes the hostname or IP address of the infrastructure host
-                  where the VM is executed.
-                type: string
               instanceUUID:
                 description: |-
                   InstanceUUID describes the unique instance UUID provided by the
@@ -7617,6 +7639,15 @@ spec:
                           type: object
                         type: array
                     type: object
+                  hostName:
+                    description: |-
+                      HostName describes the observed hostname reported by the VirtualMachine's
+                      guest operating system.
+
+                      Please note, this value is only reported if VMware Tools is installed in
+                      the guest, and the value may or may not be a fully qualified domain name
+                      (FQDN), it simply depends on what is reported by the guest.
+                    type: string
                   interfaces:
                     description: Interfaces describes the status of the VM's network
                       interfaces.
@@ -8070,6 +8101,11 @@ spec:
                       https://bit.ly/3Au0jM4 for more information.
                     type: string
                 type: object
+              nodeName:
+                description: |-
+                  NodeName describes the observed name of the node where the VirtualMachine
+                  is scheduled.
+                type: string
               powerState:
                 description: PowerState describes the observed power state of the
                   VirtualMachine.
diff --git a/controllers/virtualmachinewebconsolerequest/v1alpha1/patch/patch_test.go b/controllers/virtualmachinewebconsolerequest/v1alpha1/patch/patch_test.go
index bbfa01dd9..2d777a725 100644
--- a/controllers/virtualmachinewebconsolerequest/v1alpha1/patch/patch_test.go
+++ b/controllers/virtualmachinewebconsolerequest/v1alpha1/patch/patch_test.go
@@ -555,7 +555,7 @@ func intgTestsPatch() {
 				Expect(err).NotTo(HaveOccurred())
 
 				By("Updating the object status")
-				obj.Status.Host = "vm-host"
+				obj.Status.HardwareVersion = 5
 
 				By("Patching the object")
 				Expect(patcher.Patch(ctx, obj)).To(Succeed())
@@ -589,7 +589,7 @@ func intgTestsPatch() {
 				obj.Spec.ImageName = "image-name"
 
 				By("Updating the object status")
-				obj.Status.Host = "vm-host"
+				obj.Status.HardwareVersion = 5
 
 				By("Setting Ready condition")
 				conditions.MarkTrue(obj, vmopv1a1.ReadyCondition)
@@ -604,7 +604,7 @@ func intgTestsPatch() {
 						return false
 					}
 
-					return obj.Status.Host == objAfter.Status.Host &&
+					return obj.Status.HardwareVersion == objAfter.Status.HardwareVersion &&
 						conditions.IsTrue(objAfter, vmopv1a1.ReadyCondition) &&
 						reflect.DeepEqual(obj.Spec, objAfter.Spec)
 				}, timeout).Should(BeTrue())
diff --git a/hack/deploy-local.sh b/hack/deploy-local.sh
index bf1f40776..4328d9612 100755
--- a/hack/deploy-local.sh
+++ b/hack/deploy-local.sh
@@ -65,7 +65,7 @@ if [ -z "${VERIFY_MANIFESTS:-}" ]; then
 fi
 
 # Apply the infrastructure YAML.
-$KUBECTL apply -f "$YAML"
+$KUBECTL apply --server-side=true -f "$YAML"
 
 # If VERIFY_MANIFESTS is set then we can go ahead and exit.
 if [ -n "${VERIFY_MANIFESTS:-}" ]; then
@@ -87,7 +87,7 @@ if [[ $# -eq 2 ]]; then
   # validating webhook is available.
   VMOP_VMCLASSES_ATTEMPTS=0
   while true; do
-    $KUBECTL apply -f "${VMCLASSES_YAML}" && break
+    $KUBECTL apply --server-side=true -f "${VMCLASSES_YAML}" && break
     VMOP_VMCLASSES_ATTEMPTS=$((VMOP_VMCLASSES_ATTEMPTS + 1))
     if [[ $VMOP_VMCLASSES_ATTEMPTS -ge 60 ]]; then
       echo "Failed to apply default VM Classes"
diff --git a/pkg/patch/patch_test.go b/pkg/patch/patch_test.go
index 5d903c0bb..077c7954a 100644
--- a/pkg/patch/patch_test.go
+++ b/pkg/patch/patch_test.go
@@ -545,7 +545,7 @@ func intgTests() {
 				Expect(err).NotTo(HaveOccurred())
 
 				By("Updating the object status")
-				obj.Status.Host = "vm-host"
+				obj.Status.NodeName = "vm-host"
 
 				By("Patching the object")
 				Expect(patcher.Patch(ctx, obj)).To(Succeed())
@@ -579,7 +579,7 @@ func intgTests() {
 				obj.Spec.ImageName = "image-name"
 
 				By("Updating the object status")
-				obj.Status.Host = "vm-host"
+				obj.Status.NodeName = "vm-host"
 
 				By("Setting Ready condition")
 				conditions.MarkTrue(obj, vmopv1.ReadyConditionType)
@@ -594,7 +594,7 @@ func intgTests() {
 						return false
 					}
 
-					return obj.Status.Host == objAfter.Status.Host &&
+					return obj.Status.NodeName == objAfter.Status.NodeName &&
 						conditions.IsTrue(objAfter, vmopv1.ReadyConditionType) &&
 						reflect.DeepEqual(obj.Spec, objAfter.Spec)
 				}, timeout).Should(BeTrue())
diff --git a/pkg/providers/vsphere/vmlifecycle/update_status.go b/pkg/providers/vsphere/vmlifecycle/update_status.go
index 94c371aa3..bbb07f3d4 100644
--- a/pkg/providers/vsphere/vmlifecycle/update_status.go
+++ b/pkg/providers/vsphere/vmlifecycle/update_status.go
@@ -103,11 +103,18 @@ func UpdateStatus(
 		updateProbeStatus(vmCtx, vm, vmCtx.MoVM)
 	}
 
-	vm.Status.Host, err = getRuntimeHostHostname(vmCtx, vcVM, summary.Runtime.Host)
+	vm.Status.NodeName, err = getRuntimeHostHostname(vmCtx, vcVM, summary.Runtime.Host)
 	if err != nil {
 		errs = append(errs, err)
 	}
 
+	if summary.Guest != nil && summary.Guest.HostName != "" {
+		if vm.Status.Network == nil {
+			vm.Status.Network = &vmopv1.VirtualMachineNetworkStatus{}
+		}
+		vm.Status.Network.HostName = summary.Guest.HostName
+	}
+
 	MarkReconciliationCondition(vmCtx.VM)
 	MarkVMToolsRunningStatusCondition(vmCtx.VM, vmCtx.MoVM.Guest)
 	MarkCustomizationInfoCondition(vmCtx.VM, vmCtx.MoVM.Guest)
diff --git a/pkg/providers/vsphere/vmlifecycle/update_status_test.go b/pkg/providers/vsphere/vmlifecycle/update_status_test.go
index 5bded88ee..0c1c09529 100644
--- a/pkg/providers/vsphere/vmlifecycle/update_status_test.go
+++ b/pkg/providers/vsphere/vmlifecycle/update_status_test.go
@@ -105,7 +105,8 @@ var _ = Describe("UpdateStatus", func() {
 			Expect(vmCtx.VM.Status.BiosUUID).To(Equal(moVM.Summary.Config.Uuid))
 			Expect(vmCtx.VM.Status.InstanceUUID).To(Equal(moVM.Summary.Config.InstanceUuid))
 			Expect(vmCtx.VM.Status.Network).ToNot(BeNil())
-			Expect(vmCtx.VM.Status.Network.PrimaryIP4).To(Equal(moVM.Guest.IpAddress))
+			Expect(vmCtx.VM.Status.Network.HostName).To(Equal(moVM.Summary.Guest.HostName))
+			Expect(vmCtx.VM.Status.Network.PrimaryIP4).To(Equal(moVM.Summary.Guest.IpAddress))
 		})
 	})
 
diff --git a/pkg/providers/vsphere/vmprovider_vm_test.go b/pkg/providers/vsphere/vmprovider_vm_test.go
index 22f32bcb9..aaf1ef896 100644
--- a/pkg/providers/vsphere/vmprovider_vm_test.go
+++ b/pkg/providers/vsphere/vmprovider_vm_test.go
@@ -1288,7 +1288,7 @@ func vmTests() {
 
 				By("has expected Status values", func() {
 					Expect(vm.Status.PowerState).To(Equal(vm.Spec.PowerState))
-					Expect(vm.Status.Host).ToNot(BeEmpty())
+					Expect(vm.Status.NodeName).ToNot(BeEmpty())
 					Expect(vm.Status.InstanceUUID).To(And(Not(BeEmpty()), Equal(o.Config.InstanceUuid)))
 					Expect(vm.Status.BiosUUID).To(And(Not(BeEmpty()), Equal(o.Config.Uuid)))
 
@@ -2219,7 +2219,7 @@ func vmTests() {
 
 					By("has expected Status values", func() {
 						Expect(vm.Status.PowerState).To(Equal(vm.Spec.PowerState))
-						Expect(vm.Status.Host).ToNot(BeEmpty())
+						Expect(vm.Status.NodeName).ToNot(BeEmpty())
 						Expect(vm.Status.InstanceUUID).To(And(Not(BeEmpty()), Equal(o.Config.InstanceUuid)))
 						Expect(vm.Status.BiosUUID).To(And(Not(BeEmpty()), Equal(o.Config.Uuid)))
 


Reviews:
user: login: dilyar85
body: LGTM, thanks @akutz!
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-09T15:03:59Z
user: login: bryanv
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-09T15:47:01Z
user: login: akutz
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-09T17:01:18Z
user: login: bryanv
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-09T17:11:20Z
user: login: akutz
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-09T20:12:14Z
user: login: yanjunz97
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-12T03:16:40Z
user: login: akutz
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-12T14:19:08Z

Review comments:
diff_hunk: @@ -884,9 +884,19 @@ type VirtualMachineStatus struct {
 
 	// +optional
 
-	// Host describes the hostname or IP address of the infrastructure host
-	// where the VM is executed.
-	Host string `json:"host,omitempty"`
+	// NodeName describes the observed name or IP address of the node where the
path: api/v1alpha4/virtualmachine_types.go
user: login: bryanv
body: It is the host's object name. Our nimbus env uses the assigned IP as the name.
created_at: 2025-05-09T15:44:31Z
author_association: CONTRIBUTOR
diff_hunk: @@ -884,9 +884,19 @@ type VirtualMachineStatus struct {
 
 	// +optional
 
-	// Host describes the hostname or IP address of the infrastructure host
-	// where the VM is executed.
-	Host string `json:"host,omitempty"`
+	// NodeName describes the observed name or IP address of the node where the
path: api/v1alpha4/virtualmachine_types.go
user: login: akutz
body: I am aware. I was just making it consistent with the Kube naming as well as to distinguish this from `hostName`. That's why I said it's the observed name or IP address, same as the previous comment. I 
created_at: 2025-05-09T17:01:18Z
author_association: COLLABORATOR
diff_hunk: @@ -884,9 +884,19 @@ type VirtualMachineStatus struct {
 
 	// +optional
 
-	// Host describes the hostname or IP address of the infrastructure host
-	// where the VM is executed.
-	Host string `json:"host,omitempty"`
+	// NodeName describes the observed name or IP address of the node where the
path: api/v1alpha4/virtualmachine_types.go
user: login: bryanv
body: I was referring to the field description `...IP address of...` which isn't quite right -we don't have fallback code or anything that fetches the ESX host IP.
created_at: 2025-05-09T17:11:20Z
author_association: CONTRIBUTOR
diff_hunk: @@ -884,9 +884,19 @@ type VirtualMachineStatus struct {
 
 	// +optional
 
-	// Host describes the hostname or IP address of the infrastructure host
-	// where the VM is executed.
-	Host string `json:"host,omitempty"`
+	// NodeName describes the observed name or IP address of the node where the
path: api/v1alpha4/virtualmachine_types.go
user: login: akutz
body: I just copied the original comment. Want me to remove the IP address from the comment then?
created_at: 2025-05-09T20:12:13Z
author_association: COLLABORATOR
diff_hunk: @@ -617,6 +617,16 @@ type VirtualMachineStatus struct {
 	// +optional
 	Host string `json:"host,omitempty"`
 
+	// +optional
+
+	// HostName describes the observed hostname reported by the VirtualMachine's
+	// guest operating system.
+	//
+	// Please note, this value is only reported if VMware Tools is installed in
+	// the guest, and the value may or may not be a fully qualified domain name
+	// (FQDN), it simply depends on what is reported by the guest.
+	HostName string `json:"hostName,omitempty"`
path: api/v1alpha1/virtualmachine_types.go
user: login: yanjunz97
body: Is this intended to set status.hostName in v1 while status.network.hostName in v2/v3/v4?
created_at: 2025-05-12T03:11:40Z
author_association: NONE
diff_hunk: @@ -617,6 +617,16 @@ type VirtualMachineStatus struct {
 	// +optional
 	Host string `json:"host,omitempty"`
 
+	// +optional
+
+	// HostName describes the observed hostname reported by the VirtualMachine's
+	// guest operating system.
+	//
+	// Please note, this value is only reported if VMware Tools is installed in
+	// the guest, and the value may or may not be a fully qualified domain name
+	// (FQDN), it simply depends on what is reported by the guest.
+	HostName string `json:"hostName,omitempty"`
path: api/v1alpha1/virtualmachine_types.go
user: login: akutz
body: Yes, as `status.network` does not exist in `v1`.
created_at: 2025-05-12T14:19:08Z
author_association: COLLABORATOR

PR comments:
user: login: bryanv
created_at: 2025-05-09T15:46:51Z
body: Is under `Status.Network` a better location for this?
author_association: CONTRIBUTOR
user: login: akutz
created_at: 2025-05-09T17:01:56Z
body: > Is under `Status.Network` a better location for this?

Ah, yeah, duh. Will change.
author_association: COLLABORATOR
user: login: github-actions[bot]
created_at: 2025-05-09T21:05:23Z
body: ![Code Coverage](https://img.shields.io/badge/Code%20Coverage-82%25-yellow?style=flat)

Package | Line Rate | Health
-------- | --------- | ------
github.com/vmware-tanzu/vm-operator/controllers/contentlibrary/clustercontentlibraryitem | 100% | ✔
github.com/vmware-tanzu/vm-operator/controllers/contentlibrary/contentlibraryitem | 100% | ✔
github.com/vmware-tanzu/vm-operator/controllers/contentlibrary/utils | 89% | ➖
github.com/vmware-tanzu/vm-operator/controllers/infra/capability/configmap | 92% | ✔
github.com/vmware-tanzu/vm-operator/controllers/infra/capability/crd | 100% | ✔
github.com/vmware-tanzu/vm-operator/controllers/infra/configmap | 74% | ❌
github.com/vmware-tanzu/vm-operator/controllers/infra/node | 77% | ❌
github.com/vmware-tanzu/vm-operator/controllers/infra/secret | 76% | ❌
github.com/vmware-tanzu/vm-operator/controllers/infra/validatingwebhookconfiguration | 85% | ➖
github.com/vmware-tanzu/vm-operator/controllers/infra/zone | 73% | ❌
github.com/vmware-tanzu/vm-operator/controllers/storageclass | 95% | ✔
github.com/vmware-tanzu/vm-operator/controllers/storagepolicyquota | 97% | ✔
github.com/vmware-tanzu/vm-operator/controllers/util/encoding | 73% | ❌
github.com/vmware-tanzu/vm-operator/controllers/virtualmachine/storagepolicyusage | 97% | ✔
github.com/vmware-tanzu/vm-operator/controllers/virtualmachine/virtualmachine | 71% | ❌
github.com/vmware-tanzu/vm-operator/controllers/virtualmachine/volume | 87% | ➖
github.com/vmware-tanzu/vm-operator/controllers/virtualmachineclass | 75% | ❌
github.com/vmware-tanzu/vm-operator/controllers/virtualmachineimagecache | 90% | ✔
github.com/vmware-tanzu/vm-operator/controllers/virtualmachinepublishrequest | 81% | ➖
github.com/vmware-tanzu/vm-operator/controllers/virtualmachinereplicaset | 68% | ❌
github.com/vmware-tanzu/vm-operator/controllers/virtualmachineservice | 83% | ➖
github.com/vmware-tanzu/vm-operator/controllers/virtualmachineservice/providers | 92% | ✔
github.com/vmware-tanzu/vm-operator/controllers/virtualmachinesetresourcepolicy | 82% | ➖
github.com/vmware-tanzu/vm-operator/controllers/virtualmachinewebconsolerequest | 72% | ❌
github.com/vmware-tanzu/vm-operator/controllers/virtualmachinewebconsolerequest/v1alpha1 | 72% | ❌
github.com/vmware-tanzu/vm-operator/controllers/virtualmachinewebconsolerequest/v1alpha1/conditions | 88% | ➖
github.com/vmware-tanzu/vm-operator/controllers/virtualmachinewebconsolerequest/v1alpha1/patch | 78% | ❌
github.com/vmware-tanzu/vm-operator/pkg/bitmask | 100% | ✔
github.com/vmware-tanzu/vm-operator/pkg/builder | 95% | ✔
github.com/vmware-tanzu/vm-operator/pkg/conditions | 90% | ✔
github.com/vmware-tanzu/vm-operator/pkg/config | 100% | ✔
github.com/vmware-tanzu/vm-operator/pkg/config/capabilities | 100% | ✔
github.com/vmware-tanzu/vm-operator/pkg/config/env | 100% | ✔
github.com/vmware-tanzu/vm-operator/pkg/context/generic | 100% | ✔
github.com/vmware-tanzu/vm-operator/pkg/context/operation | 100% | ✔
github.com/vmware-tanzu/vm-operator/pkg/errors | 100% | ✔
github.com/vmware-tanzu/vm-operator/pkg/exit | 100% | ✔
github.com/vmware-tanzu/vm-operator/pkg/mem | 100% | ✔
github.com/vmware-tanzu/vm-operator/pkg/patch | 78% | ❌
github.com/vmware-tanzu/vm-operator/pkg/prober | 91% | ✔
github.com/vmware-tanzu/vm-operator/pkg/prober/probe | 90% | ✔
github.com/vmware-tanzu/vm-operator/pkg/prober/worker | 77% | ❌
github.com/vmware-tanzu/vm-operator/pkg/providers/vsphere | 76% | ❌
github.com/vmware-tanzu/vm-operator/pkg/providers/vsphere/client | 80% | ➖
github.com/vmware-tanzu/vm-operator/pkg/providers/vsphere/clustermodules | 73% | ❌
github.com/vmware-tanzu/vm-operator/pkg/providers/vsphere/config | 88% | ➖
github.com/vmware-tanzu/vm-operator/pkg/providers/vsphere/contentlibrary | 72% | ❌
github.com/vmware-tanzu/vm-operator/pkg/providers/vsphere/credentials | 100% | ✔
github.com/vmware-tanzu/vm-operator/pkg/providers/vsphere/network | 81% | ➖
github.com/vmware-tanzu/vm-operator/pkg/providers/vsphere/placement | 80% | ➖
github.com/vmware-tanzu/vm-operator/pkg/providers/vsphere/session | 57% | ❌
github.com/vmware-tanzu/vm-operator/pkg/providers/vsphere/storage | 44% | ❌
github.com/vmware-tanzu/vm-operator/pkg/providers/vsphere/sysprep | 100% | ✔
github.com/vmware-tanzu/vm-operator/pkg/providers/vsphere/vcenter | 86% | ➖
github.com/vmware-tanzu/vm-operator/pkg/providers/vsphere/virtualmachine | 85% | ➖
github.com/vmware-tanzu/vm-operator/pkg/providers/vsphere/vmlifecycle | 63% | ❌
github.com/vmware-tanzu/vm-operator/pkg/record | 87% | ➖
github.com/vmware-tanzu/vm-operator/pkg/topology | 91% | ✔
github.com/vmware-tanzu/vm-operator/pkg/util | 86% | ➖
github.com/vmware-tanzu/vm-operator/pkg/util/cloudinit | 89% | ✔
github.com/vmware-tanzu/vm-operator/pkg/util/cloudinit/validate | 91% | ✔
github.com/vmware-tanzu/vm-operator/pkg/util/image | 100% | ✔
github.com/vmware-tanzu/vm-operator/pkg/util/kube | 89% | ➖
github.com/vmware-tanzu/vm-operator/pkg/util/kube/cource | 100% | ✔
github.com/vmware-tanzu/vm-operator/pkg/util/kube/internal | 100% | ✔
github.com/vmware-tanzu/vm-operator/pkg/util/kube/proxyaddr | 73% | ❌
github.com/vmware-tanzu/vm-operator/pkg/util/kube/spq | 99% | ✔
github.com/vmware-tanzu/vm-operator/pkg/util/netplan | 100% | ✔
github.com/vmware-tanzu/vm-operator/pkg/util/ovfcache | 75% | ❌
github.com/vmware-tanzu/vm-operator/pkg/util/ovfcache/internal | 100% | ✔
github.com/vmware-tanzu/vm-operator/pkg/util/paused | 100% | ✔
github.com/vmware-tanzu/vm-operator/pkg/util/ptr | 100% | ✔
github.com/vmware-tanzu/vm-operator/pkg/util/resize | 99% | ✔
github.com/vmware-tanzu/vm-operator/pkg/util/vmopv1 | 94% | ✔
github.com/vmware-tanzu/vm-operator/pkg/util/vsphere/client | 64% | ❌
github.com/vmware-tanzu/vm-operator/pkg/util/vsphere/library | 98% | ✔
github.com/vmware-tanzu/vm-operator/pkg/util/vsphere/vm | 79% | ❌
github.com/vmware-tanzu/vm-operator/pkg/util/vsphere/watcher | 85% | ➖
github.com/vmware-tanzu/vm-operator/pkg/vmconfig | 95% | ✔
github.com/vmware-tanzu/vm-operator/pkg/vmconfig/crypto | 91% | ✔
github.com/vmware-tanzu/vm-operator/pkg/vmconfig/diskpromo | 91% | ✔
github.com/vmware-tanzu/vm-operator/pkg/webconsolevalidation | 100% | ✔
github.com/vmware-tanzu/vm-operator/services/vm-watcher | 94% | ✔
github.com/vmware-tanzu/vm-operator/webhooks/common | 100% | ✔
github.com/vmware-tanzu/vm-operator/webhooks/persistentvolumeclaim/validation | 95% | ✔
github.com/vmware-tanzu/vm-operator/webhooks/unifiedstoragequota/validation | 90% | ✔
github.com/vmware-tanzu/vm-operator/webhooks/virtualmachine/mutation | 87% | ➖
github.com/vmware-tanzu/vm-operator/webhooks/virtualmachine/validation | 95% | ✔
github.com/vmware-tanzu/vm-operator/webhooks/virtualmachineclass/mutation | 62% | ❌
github.com/vmware-tanzu/vm-operator/webhooks/virtualmachineclass/validation | 89% | ➖
github.com/vmware-tanzu/vm-operator/webhooks/virtualmachinepublishrequest/validation | 92% | ✔
github.com/vmware-tanzu/vm-operator/webhooks/virtualmachinereplicaset/validation | 90% | ✔
github.com/vmware-tanzu/vm-operator/webhooks/virtualmachineservice/mutation | 67% | ❌
github.com/vmware-tanzu/vm-operator/webhooks/virtualmachineservice/validation | 92% | ✔
github.com/vmware-tanzu/vm-operator/webhooks/virtualmachinesetresourcepolicy/validation | 89% | ✔
github.com/vmware-tanzu/vm-operator/webhooks/virtualmachinewebconsolerequest/v1alpha1/validation | 92% | ✔
github.com/vmware-tanzu/vm-operator/webhooks/virtualmachinewebconsolerequest/validation | 92% | ✔
**Summary** | **82%** (11648 / 14121) | ➖

_Minimum allowed line rate is `79%`_

<!-- Sticky Pull Request Comment -->
author_association: NONE