diff --git a/pkg/types/vsphere/validation/platform.go b/pkg/types/vsphere/validation/platform.go index 6a8a57001b..e63e0615c1 100644 --- a/pkg/types/vsphere/validation/platform.go +++ b/pkg/types/vsphere/validation/platform.go @@ -214,7 +214,7 @@ func validateFailureDomains(p *vsphere.Platform, fldPath *field.Path, isLegacyUp } datacenterName := clusterPathParts[1] - if len(failureDomain.Topology.Datacenter) != 0 && datacenterName != failureDomain.Topology.Datacenter { + if len(failureDomain.Topology.Datacenter) != 0 && !strings.Contains(failureDomain.Topology.Datacenter, datacenterName) { return append(allErrs, field.Invalid(topologyFld.Child("computeCluster"), computeCluster, fmt.Sprintf("compute cluster must be in datacenter %s", failureDomain.Topology.Datacenter))) } p.FailureDomains[index].Topology.ComputeCluster = filepath.Clean(p.FailureDomains[index].Topology.ComputeCluster) @@ -229,7 +229,7 @@ func validateFailureDomains(p *vsphere.Platform, fldPath *field.Path, isLegacyUp } datacenterName := resourcePoolPathParts[1] clusterName := resourcePoolPathParts[2] - if len(failureDomain.Topology.Datacenter) != 0 && datacenterName != failureDomain.Topology.Datacenter { + if len(failureDomain.Topology.Datacenter) != 0 && !strings.Contains(failureDomain.Topology.Datacenter, datacenterName) { return append(allErrs, field.Invalid(topologyFld.Child("resourcePool"), resourcePool, fmt.Sprintf("resource pool must be in datacenter %s", failureDomain.Topology.Datacenter))) } if len(failureDomain.Topology.ComputeCluster) != 0 && !strings.Contains(failureDomain.Topology.ComputeCluster, clusterName) { diff --git a/pkg/types/vsphere/validation/platform_test.go b/pkg/types/vsphere/validation/platform_test.go index 238e9f6d09..95272893b2 100644 --- a/pkg/types/vsphere/validation/platform_test.go +++ b/pkg/types/vsphere/validation/platform_test.go @@ -2,7 +2,9 @@ package validation import ( "fmt" + "path" "regexp" + "strings" "testing" "github.com/stretchr/testify/assert" @@ -205,6 +207,30 @@ func TestValidatePlatform(t *testing.T) { return p }(), }, + { + name: "Datacenter as a child of a folder", + platform: func() *vsphere.Platform { + p := validPlatform() + + for i, v := range p.VCenters { + for j, dc := range v.Datacenters { + p.VCenters[i].Datacenters[j] = path.Join("/dcfolder", dc) + } + } + + for i, fd := range p.FailureDomains { + dcAsChild := path.Join("/dcfolder", fd.Topology.Datacenter) + + p.FailureDomains[i].Topology.Datacenter = dcAsChild + p.FailureDomains[i].Topology.ResourcePool = strings.ReplaceAll(fd.Topology.ResourcePool, fd.Topology.Datacenter, dcAsChild) + p.FailureDomains[i].Topology.Folder = strings.ReplaceAll(fd.Topology.Folder, fd.Topology.Datacenter, dcAsChild) + p.FailureDomains[i].Topology.ComputeCluster = strings.ReplaceAll(fd.Topology.ComputeCluster, fd.Topology.Datacenter, dcAsChild) + p.FailureDomains[i].Topology.Datastore = strings.ReplaceAll(fd.Topology.Datastore, fd.Topology.Datacenter, dcAsChild) + } + + return p + }(), + }, { name: "Additional invalid tag IDs provided", platform: func() *vsphere.Platform {