in managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm [3189:3324]
sub _get_resource_pool_view {
my $self = shift;
if (ref($self) !~ /VCL::Module/i) {
notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method");
return;
}
return $self->{resource_pool_view_object} if $self->{resource_pool_view_object};
my $vmhost_name = $self->data->get_vmhost_short_name();
# Get the resource path from the VM host profile if it is configured
my $vmhost_profile_resource_path = $self->data->get_vmhost_profile_resource_path(0);
# Retrieve all of the ResourcePool views on the VM host
my @resource_pool_views = $self->_find_entity_views('ResourcePool');
if (!@resource_pool_views) {
notify($ERRORS{'WARNING'}, 0, "failed to retrieve any resource pool views from VM host $vmhost_name");
return;
}
my $resource_pools;
my $root_resource_pool_path;
for my $resource_pool_view (@resource_pool_views) {
# Assemble the full path to the resource view - including Datacenters, folders, clusters...
my $resource_pool_path = $self->_get_managed_object_path($resource_pool_view->{mo_ref});
# The path of the resource pool retrieved from the VM host will contain levels which don't appear in vCenter
# For example, 'host' and 'Resources' don't appear in the tree view:
# /DC1/host/Folder1/cl1/Resources/rp1
# Check the actual path retrieved from the VM host and the path with these entries removed
my $resource_pool_path_fixed = $resource_pool_path;
$resource_pool_path_fixed =~ s/\/host\//\//g;
$resource_pool_path_fixed =~ s/\/Resources($|\/?)/$1/g;
$resource_pools->{$resource_pool_path_fixed} = $resource_pool_view;
# Save the top-level default resource pool path - use this if resource path is not configured
if ($resource_pool_path =~ /\/Resources$/) {
$root_resource_pool_path = $resource_pool_path_fixed;
}
}
if (!$resource_pools) {
notify($ERRORS{'WARNING'}, 0, "failed to retrieve any resource pools on host $vmhost_name");
return;
}
elsif (!$vmhost_profile_resource_path) {
if (scalar(keys %$resource_pools) > 1) {
if ($root_resource_pool_path) {
notify($ERRORS{'DEBUG'}, 0, "resource path not configured in VM profile, using root resource pool: $root_resource_pool_path");
my $resource_pool = $resource_pools->{$root_resource_pool_path};
$self->{resource_pool_view_object} = $resource_pool;
return $resource_pool;
}
else {
notify($ERRORS{'WARNING'}, 0, "unable to determine which resource pool to use, resource path not configured in VM profile and multiple resource paths exist on host $vmhost_name:\n" . join("\n", sort keys %$resource_pools));
return;
}
}
else {
my $resource_pool_name = (keys %$resource_pools)[0];
$self->{resource_pool_view_object} = $resource_pools->{$resource_pool_name};
notify($ERRORS{'DEBUG'}, 0, "resource path not configured in VM profile, returning the only resource pool found on VM host $vmhost_name: $resource_pool_name");
return $self->{resource_pool_view_object};
}
}
else {
notify($ERRORS{'DEBUG'}, 0, "retrieved resource pools on VM host $vmhost_name:\n" . join("\n", sort keys %$resource_pools));
}
my %potential_matches;
for my $resource_pool_path (sort keys %$resource_pools) {
my $resource_pool = $resource_pools->{$resource_pool_path};
# Check if the retrieved resource pool matches the profile resource path
if ($vmhost_profile_resource_path =~ /^$resource_pool_path$/i) {
notify($ERRORS{'DEBUG'}, 0, "found matching resource pool on VM host $vmhost_name\n" .
"VM host profile resource path: $vmhost_profile_resource_path\n" .
"resource pool path on host: $resource_pool_path"
);
$self->{resource_pool_view_object} = $resource_pool;
return $resource_pool;
}
# Check if the fixed retrieved resource pool path matches the profile resource path
if ($vmhost_profile_resource_path =~ /^$resource_pool_path$/i) {
notify($ERRORS{'DEBUG'}, 0, "found resource pool on VM host $vmhost_name matching VM host profile resource path with default hidden levels removed:\n" .
"path on VM host: '$resource_pool_path'\n" .
"VM profile path: '$vmhost_profile_resource_path'"
);
$self->{resource_pool_view_object} = $resource_pool;
return $resource_pool;
}
# Check if this is a potential match - resource pool path retrieved from VM host begins or ends with the profile value
if ($resource_pool_path =~ /^\/?$vmhost_profile_resource_path\//i) {
notify($ERRORS{'DEBUG'}, 0, "resource pool on VM host $vmhost_name '$resource_pool_path' is a potential match, it begins with VM host profile resource path '$vmhost_profile_resource_path'");
$potential_matches{$resource_pool_path} = $resource_pool;
}
elsif ($resource_pool_path =~ /\/$vmhost_profile_resource_path$/i) {
notify($ERRORS{'DEBUG'}, 0, "resource pool on VM host $vmhost_name '$resource_pool_path' is a potential match, it ends with VM host profile resource path '$vmhost_profile_resource_path'");
$potential_matches{$resource_pool_path} = $resource_pool;
}
else {
#notify($ERRORS{'DEBUG'}, 0, "resource pool on VM host $vmhost_name does NOT match VM host profile resource path:\n" .
# "path on VM host: '$resource_pool_path'\n" .
# "VM profile path: '$vmhost_profile_resource_path'"
#);
}
}
# Check if a single potential match was found - if so, assume it should be used
if (scalar(keys %potential_matches) == 1) {
my $resource_pool_path = (keys %potential_matches)[0];
my $resource_pool = $potential_matches{$resource_pool_path};
$self->{resource_pool_view_object} = $resource_pool;
notify($ERRORS{'DEBUG'}, 0, "single resource pool on VM host $vmhost_name which potentially matches VM host profile resource path will be used:\n" .
"path on VM host: '$resource_pool_path'\n" .
"VM profile path: '$vmhost_profile_resource_path'"
);
return $resource_pool;
}
# Resource pool was found
if ($vmhost_profile_resource_path) {
notify($ERRORS{'WARNING'}, 0, "resource path '$vmhost_profile_resource_path' configured in VM host profile does NOT match any of resource pool paths found on VM host $vmhost_name:\n" . join("\n", sort keys %$resource_pools));
}
elsif (scalar(keys %$resource_pools) > 1) {
notify($ERRORS{'WARNING'}, 0, "unable to determine correct resource pool to use, VM host $vmhost_name contains multiple resource pool paths, VM host profile resource path MUST be configured to one of the following values:\n" . join("\n", sort keys %$resource_pools));
}
else {
notify($ERRORS{'WARNING'}, 0, "failed to determine resource pool to use on VM host $vmhost_name:\n" . join("\n", sort keys %$resource_pools));
}
return;
}