You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vcl.apache.org by ar...@apache.org on 2014/10/08 18:52:32 UTC

svn commit: r1630176 - /vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm

Author: arkurth
Date: Wed Oct  8 16:52:31 2014
New Revision: 1630176

URL: http://svn.apache.org/r1630176
Log:
VCL-685
Added subroutines to vSphere_SDK.pm:
_get_view
_find_entity_view
_find_entity_views
_get_service_content

Replaced all direct calls to Vim::* with calls to these subroutines. Most of the previous Vim:: calls were not surrounded with eval blocks. As a result, a process could terminate abruptly. This should prevent that from happening.

Modified:
    vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm

Modified: vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm?rev=1630176&r1=1630175&r2=1630176&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm Wed Oct  8 16:52:31 2014
@@ -200,9 +200,12 @@ sub get_registered_vms {
 	# Override the die handler
 	local $SIG{__DIE__} = sub{};
 	
-	my @vms;
-	eval { @vms = @{Vim::find_entity_views(view_type => 'VirtualMachine', begin_entity => $self->_get_resource_pool_view())}; };
-	
+	my @vms = $self->_find_entity_views('VirtualMachine',
+		{
+			begin_entity => $self->_get_resource_pool_view()
+		}
+	);
+
 	my @vmx_paths;
 	for my $vm (@vms) {
 		my $vmx_path = $vm->summary->config->vmPathName;
@@ -301,7 +304,7 @@ sub vm_unregister {
 	if (my $type = ref($argument)) {
 		if ($type eq 'ManagedObjectReference') {
 			notify($ERRORS{'DEBUG'}, 0, "argument is a ManagedObjectReference, retrieving VM view");
-			$vm_view = Vim::get_view(mo_ref => $argument)
+			$vm_view = $self->_get_view($argument);
 		}
 		elsif ($type eq 'VirtualMachine') {
 			$vm_view = $argument;
@@ -846,7 +849,7 @@ EOF
 		);
 		if ($source_vm) {
 			notify($ERRORS{'DEBUG'}, 0, "created temporary source VM which will be cloned: $source_vm_name");
-			$source_vm_view = Vim::get_view(mo_ref => $source_vm);
+			$source_vm_view = $self->_get_view($source_vm);
 		}
 		else {
 			notify($ERRORS{'WARNING'}, 0, "failed to create temporary source VM which will be cloned: $source_vm_name");
@@ -900,7 +903,7 @@ EOF
 	};
 	
 	if ($clone_vm) {
-		$clone_vm_view = Vim::get_view(mo_ref => $clone_vm);
+		$clone_vm_view = $self->_get_view($clone_vm);
 		notify($ERRORS{'DEBUG'}, 0, "cloned VM: $source_vm_name --> $clone_vm_name");
 	}
 	else {
@@ -1171,7 +1174,7 @@ sub create_nfs_datastore {
 	}
 	
 	# Get the datastore system object
-	my $datastore_system = Vim::get_view(mo_ref => $self->_get_datastore_view->configManager->datastoreSystem);
+	my $datastore_system = $self->_get_view($self->_get_datastore_view->configManager->datastoreSystem);
 	if (!$datastore_system) {
 		notify($ERRORS{'WARNING'}, 0, "failed to retrieve datastore system object");
 		return;
@@ -1381,7 +1384,7 @@ sub get_vmware_product_name {
 	
 	my $vmhost_hostname = $self->data->get_vmhost_hostname();
 	
-	my $service_content = Vim::get_service_content();
+	my $service_content = $self->_get_service_content();
 	my $product_name = $service_content->{about}->{fullName};
 	if ($product_name) {
 		notify($ERRORS{'DEBUG'}, 0, "VMware product being used on VM host $vmhost_hostname: '$product_name'");
@@ -1453,7 +1456,7 @@ sub is_restricted {
 	
 	my $service_content;
 	eval {
-		$service_content = Vim::get_service_content();
+		$service_content = $self->_get_service_content();
 	};
 	
 	if ($EVAL_ERROR) {
@@ -1473,7 +1476,7 @@ sub is_restricted {
 	}
 	
 	# Get a fileManager object
-	my $file_manager = Vim::get_view(mo_ref => $service_content->{fileManager}) || return;
+	my $file_manager = $self->_get_view($service_content->{fileManager}) || return;
 	if (!$file_manager) {
 		notify($ERRORS{'WARNING'}, 0, "unable to determine if access to the VM host via the vSphere SDK is restricted due to the license, failed to retrieve file manager object");
 		return 1;
@@ -2396,8 +2399,8 @@ sub get_license_info {
 	
 	return $self->{license_info} if $self->{license_info};
 	
-	my $service_content = Vim::get_service_content() || return;
-	my $licenses = Vim::get_view(mo_ref => $service_content->{licenseManager})->licenses;
+	my $service_content = $self->_get_service_content() || return;
+	my $licenses = $self->_get_view($service_content->{licenseManager})->licenses;
 	
 	my $license_info;
 	for my $license (@$licenses) {
@@ -2438,6 +2441,319 @@ sub get_license_info {
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 _get_service_content
+
+ Parameters  : none
+ Returns     : ServiceInstance object
+ Description : Calls Vim::get_service_content to retrieve the a ServiceInstance
+               object. All calls to Vim::get_service_content should be handled by
+               this subroutine. The call needs to be wrapped in an eval block to
+               prevent the process from dying abruptly.
+
+=cut
+
+sub _get_service_content {
+	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;
+	}
+	
+	# Override the die handler
+	local $SIG{__DIE__} = sub{};
+	
+	my $service_content;
+	eval {
+		$service_content = Vim::get_service_content();
+	};
+	if ($EVAL_ERROR) {
+		notify($ERRORS{'WARNING'}, 0, "failed to retrieve ServiceInstance object\nerror: $EVAL_ERROR");
+		return;
+	}
+	elsif (!$service_content) {
+		notify($ERRORS{'WARNING'}, 0, "failed to retrieve ServiceInstance object");
+		return;
+	}
+	else {
+		return $service_content;
+	}
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 _get_view
+
+ Parameters  : $managed_object_ref, $view_type (optional)
+ Returns     : view object
+ Description : Calls Vim::get_view to retrieve the properties of a single
+               managed object. All calls to Vim::get_view should be handled by
+               this subroutine. The call needs to be wrapped in an eval block to
+               prevent the process from dying abruptly.
+
+=cut
+
+sub _get_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;
+	}
+	
+	# Get the argument
+	my ($managed_object_ref, $view_type) = @_;
+	if (!$managed_object_ref) {
+		notify($ERRORS{'WARNING'}, 0, "managed object reference argument was not specified");
+		return;
+	}
+	
+	# Make sure the 1st argument is a ManagedObjectReference
+	my $type = ref($managed_object_ref);
+	if (!$type) {
+		notify($ERRORS{'WARNING'}, 0, "1st argument is not a reference, it must be a ManagedObjectReference");
+		return;
+	}
+	elsif ($type !~ /ManagedObjectReference/) {
+		notify($ERRORS{'WARNING'}, 0, "1st argument type is '$type', it must be a ManagedObjectReference");
+		return;
+	}
+	
+	my %parameters = (
+		mo_ref => $managed_object_ref,
+	);
+	if ($view_type) {
+		$parameters{view_type} = $view_type;
+	}
+	
+	# Override the die handler
+	local $SIG{__DIE__} = sub{};
+	
+	my $view;
+	eval {
+		$view = Vim::get_view(%parameters);
+	};
+	if ($EVAL_ERROR) {
+		notify($ERRORS{'WARNING'}, 0, "failed to retrieve view object\nerror: $EVAL_ERROR\nparameters:\n" . format_data(\%parameters));
+		return;
+	}
+	elsif (!$view) {
+		notify($ERRORS{'WARNING'}, 0, "failed to retrieve view object, parameters:\n" . format_data(\%parameters));
+		return;
+	}
+	else {
+		#my $view_type = ref($view);
+		#notify($ERRORS{'DEBUG'}, 0, "retrieved $view_type view object");
+		return $view;
+	}
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 _find_entity_view
+
+ Parameters  : $view_type, $parameters_hash_ref
+ Returns     : view object
+ Description : Calls _find_entity_views to retrieve an array of managed
+               objects. This does not call Vim::find_entity_view. Instead, it
+               checks the array returned by _find_entity_views. If a single
+               object is returned, that object is returned by this subroutine.
+               If multiple objects are returned, a warning is generated and the
+               first object found is returned.
+               
+               All calls to Vim::find_entity_view should be handled by
+               this subroutine. The call needs to be wrapped in an eval block to
+               prevent the process from dying abruptly.
+               
+               The $parameters_hash_ref argument must contain the
+               following key:
+               * filter - The value must be a hash reference of name/value
+                 pairs. If multiple pairs are specified, all must match.
+               
+               The $parameters_hash_ref argument may contain the following keys:
+               * begin_entity - The value must be a managed object reference.
+                 This specifies the starting point to search in the inventory in
+                 order to narrow the scope to improve performance.
+               
+               * properties - The value must be an array reference. By default,
+                 all properties are retrieved. Using a filter may improve
+                 performance.
+               
+               Example:
+               my $vm = $self->_find_entity_view('VirtualMachine',
+                  {
+                     filter => {
+                        'name' => 'cent7vm'
+                     },
+                     begin_entity => $self->_get_resource_pool_view(),
+                     properties => [
+                        'name',
+                        'runtime.powerState',
+                        'config.guestId',
+                     ],
+                  }
+               );
+
+=cut
+
+sub _find_entity_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;
+	}
+	
+	# Get the argument
+	my ($view_type, $parameters_hash_ref) = @_;
+	if (!$view_type) {
+		notify($ERRORS{'WARNING'}, 0, "view type argument was not specified");
+		return;
+	}
+	
+	my %parameters = (
+		'view_type' => $view_type,
+	);
+	
+	if (!defined($parameters_hash_ref)) {
+		notify($ERRORS{'WARNING'}, 0, "parameters hash reference argument was not specified");
+		return;
+	}
+	
+	my $parameters_argument_type = ref($parameters_hash_ref);
+	if (!$parameters_argument_type) {
+		notify($ERRORS{'WARNING'}, 0, "parameters argument is not a reference, it must be a hash reference");
+		return;
+	}
+	elsif ($parameters_argument_type ne 'HASH') {
+		notify($ERRORS{'WARNING'}, 0, "parameters argument is '$parameters_argument_type' reference, it must be a hash reference");
+		return;
+	}
+	elsif (!defined($parameters_hash_ref->{filter})) {
+		notify($ERRORS{'WARNING'}, 0, "parameters hash reference argument must contain a 'filter' key");
+		return;
+	}
+	
+	my @views = $self->_find_entity_views($view_type, $parameters_hash_ref);
+	if (!@views) {
+		return;
+	}
+	elsif (scalar(@views) > 1) {
+		notify($ERRORS{'WARNING'}, 0, "returning the first object retrieved, multiple $view_type views match filter:\n" . format_data($parameters_hash_ref->{filter}));
+	}
+	return $views[0];
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 _find_entity_views
+
+ Parameters  : $view_type, $parameters_hash_ref (optional)
+ Returns     : array of view objects
+ Description : Calls Vim::find_entity_views to retrieve an array of managed
+               objects. All calls to Vim::find_entity_views should be handled by
+               this subroutine. The call needs to be wrapped in an eval block to
+               prevent the process from dying abruptly.
+               
+               The optional $parameters_hash_ref argument may contain the
+               following keys:
+               * begin_entity - The value must be a managed object reference.
+                 This specifies the starting point to search in the inventory in
+                 order to narrow the scope to improve performance.
+               * filter - The value must be a hash reference of name/value
+                 pairs. If multiple pairs are specified, all must match.
+               * properties - The value must be an array reference. By default,
+                 all properties are retrieved. Using a filter may improve
+                 performance.
+               
+               Example:
+               my @vms = $self->_find_entity_views('VirtualMachine',
+                  {
+                     begin_entity => $self->_get_resource_pool_view(),
+                     properties => [
+                        'name',
+                        'runtime.powerState',
+                        'config.guestId',
+                     ],
+                     filter => {
+                        'name' => 'cent7vm'
+                     },
+                  }
+               );
+
+=cut
+
+sub _find_entity_views {
+	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;
+	}
+	
+	# Get the argument
+	my ($view_type, $parameters_hash_ref) = @_;
+	if (!$view_type) {
+		notify($ERRORS{'WARNING'}, 0, "view type argument was not specified");
+		return;
+	}
+	
+	my %parameters = (
+		'view_type' => $view_type,
+	);
+	
+	if ($parameters_hash_ref) {
+		my $parameters_argument_type = ref($parameters_hash_ref);
+		if (!$parameters_argument_type) {
+			notify($ERRORS{'WARNING'}, 0, "parameters argument is not a reference, it must be a hash reference");
+			return;
+		}
+		elsif ($parameters_argument_type ne 'HASH') {
+			notify($ERRORS{'WARNING'}, 0, "parameters argument is '$parameters_argument_type' reference, it must be a hash reference");
+			return;
+		}
+		else {
+			%parameters = (%parameters, %$parameters_hash_ref);
+		}
+	}
+	
+	# Override the die handler
+	local $SIG{__DIE__} = sub{};
+	
+	my $views;
+	eval {
+		$views = Vim::find_entity_views(%parameters);
+	};
+	if ($EVAL_ERROR) {
+		notify($ERRORS{'WARNING'}, 0, "failed to retrieve view objects\nerror: $EVAL_ERROR\nparameters:\n" . format_data(\%parameters));
+		return;
+	}
+	elsif (!$views) {
+		notify($ERRORS{'WARNING'}, 0, "failed to retrieve view objects, parameters:\n" . format_data(\%parameters));
+		return;
+	}
+	
+	my $views_type = ref($views);
+	if (!$views_type) {
+		notify($ERRORS{'WARNING'}, 0, "find_entity_views did not return a reference, it should be an array reference, value returned:\n$views");
+		return;
+	}
+	elsif ($views_type ne 'ARRAY') {
+		notify($ERRORS{'WARNING'}, 0, "find_entity_views did not return an array reference, type returned: $views_type");
+		return;
+	}
+	else {
+		my @views_array = @$views;
+		my $view_count = scalar(@views_array);
+		# For debugging:
+		#my $info_string;
+		#for my $view (@views_array) {
+		#	$info_string .= '.' x 50 . "\n" . $self->_mo_ref_to_string($view);
+		#}
+		#notify($ERRORS{'DEBUG'}, 0, "retrieved $view_count $view_type view" . ($view_count == 1 ? '' : 's') . "\n$info_string");
+		notify($ERRORS{'DEBUG'}, 0, "retrieved $view_count $view_type view" . ($view_count == 1 ? '' : 's'));
+		return @views_array;
+	}
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 =head2 _get_file_info
 
  Parameters  : $file_path
@@ -2489,7 +2805,7 @@ sub _get_file_info {
 	
 	# Get a datastore object and host datastore browser object
 	my $datastore = $self->_get_datastore_object($datastore_name) || return;
-	my $host_datastore_browser = Vim::get_view(mo_ref => $datastore->browser);
+	my $host_datastore_browser = $self->_get_view($datastore->browser);
 	
 	# Create HostDatastoreBrowserSearchSpec spec
    my $file_query_flags = FileQueryFlags->new(
@@ -2626,7 +2942,7 @@ sub _get_datacenter_view {
 		# Return datacenter view only if 1 datacenter was retrieved
 		notify($ERRORS{'WARNING'}, 0, "unable to retrieve parent datacenter for resource pool object");
 		
-		my @datacenters = @{Vim::find_entity_views(view_type => 'Datacenter')};
+		my @datacenters = $self->_find_entity_views('Datacenter');
 		if (!scalar(@datacenters)) {
 			notify($ERRORS{'WARNING'}, 0, "failed to retrieve Datacenter view from VM host $vmhost_name");
 			return;
@@ -2723,7 +3039,7 @@ sub _get_host_system_views {
 	}
 	
 	return @{$self->{host_system_views}} if $self->{host_system_views};
-	my @host_system_views = @{Vim::find_entity_views(view_type => 'HostSystem')};
+	my @host_system_views = $self->_find_entity_views('HostSystem');
 	$self->{host_system_views} = \@host_system_views;
 	return @host_system_views;
 }
@@ -2810,7 +3126,7 @@ sub _get_resource_pool_view {
 	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 = @{Vim::find_entity_views(view_type => 'ResourcePool')};
+	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;
@@ -2949,10 +3265,11 @@ sub _get_vm_folder_view {
 	my $datacenter_view = $self->_get_datacenter_view() || return;
 	
 	# Retrieve all of the Folder views on the VM host
-	my @folder_views = @{Vim::find_entity_views(
-		view_type => 'Folder',
-		begin_entity => $datacenter_view,
-	)};
+	my @folder_views = $self->_find_entity_views('Folder',
+		{
+			begin_entity => $datacenter_view,
+		}
+	);
 	if (!@folder_views) {
 		notify($ERRORS{'WARNING'}, 0, "failed to retrieve any folder views from VM host $vmhost_name");
 		return;
@@ -3050,7 +3367,7 @@ sub _get_managed_object_path {
 	my $type = $mo_ref_argument->{type};
 	my $value = $mo_ref_argument->{value};
 	
-	my $view = Vim::get_view('mo_ref' => $mo_ref_argument) || return;
+	my $view = $self->_get_view($mo_ref_argument) || return;
 	my $name = $view->{name} || return;
 
 	my $parent_mo_ref;
@@ -3126,7 +3443,7 @@ sub _get_parent_managed_object_view {
 	}
 	
 	# Retrieve a view for the mo_ref argument
-	my $view = Vim::get_view('mo_ref' => $mo_ref_argument);
+	my $view = $self->_get_view($mo_ref_argument);
 	if (!$view) {
 		notify($ERRORS{'WARNING'}, 0, "failed to retrieve view for managed object reference argument:\n" . format_data($mo_ref_argument));
 		return;
@@ -3142,7 +3459,7 @@ sub _get_parent_managed_object_view {
 		if ($parent_type eq $parent_type_argument) {
 			#notify($ERRORS{'DEBUG'}, 0, "found parent view matching type '$parent_type_argument': $parent_value");
 			
-			my $parent_view = Vim::get_view('mo_ref' => $parent_mo_ref);
+			my $parent_view = $self->_get_view($parent_mo_ref);
 			return $parent_view;
 		}
 		else {
@@ -3178,11 +3495,15 @@ sub _get_vm_view {
 	my $vmx_path = shift || $self->get_vmx_file_path();
 	$vmx_path = $self->_get_datastore_path($vmx_path);
 	
-	# Override the die handler
-	local $SIG{__DIE__} = sub{};
+	my $vm_view = $self->_find_entity_view('VirtualMachine',
+		{
+			begin_entity => $self->_get_datacenter_view(),
+			filter => {
+				'config.files.vmPathName' => $vmx_path
+			}
+		}
+	);
 	
-	my $vm_view;
-	eval { $vm_view = Vim::find_entity_view(view_type => 'VirtualMachine', begin_entity => $self->_get_datacenter_view(), filter => {'config.files.vmPathName' => $vmx_path}); };
 	if (!$vm_view) {
 		notify($ERRORS{'WARNING'}, 0, "failed to retrieve view object for VM: $vmx_path");
 		return;
@@ -3212,13 +3533,13 @@ sub _get_virtual_disk_manager_view {
 	return $self->{virtual_disk_manager_object} if $self->{virtual_disk_manager_object};
 	
 	# Get a virtual disk manager object
-	my $service_content = Vim::get_service_content() || return;
+	my $service_content = $self->_get_service_content() || return;
 	if (!$service_content->{virtualDiskManager}) {
 		notify($ERRORS{'WARNING'}, 0, "failed to retrieve virtual disk manager object, it is not available via the vSphere SDK");
 		return;
 	}
 	
-	my $virtual_disk_manager = Vim::get_view(mo_ref => $service_content->{virtualDiskManager});
+	my $virtual_disk_manager = $self->_get_view($service_content->{virtualDiskManager});
 	if ($virtual_disk_manager) {
 		#notify($ERRORS{'DEBUG'}, 0, "retrieved virtual disk manager object:\n" . format_data($virtual_disk_manager));
 	}
@@ -3250,8 +3571,8 @@ sub _get_file_manager_view {
 	
 	return $self->{file_manager_object} if $self->{file_manager_object};
 	
-	my $service_content = Vim::get_service_content() || return;
-	my $file_manager = Vim::get_view(mo_ref => $service_content->{fileManager});
+	my $service_content = $self->_get_service_content() || return;
+	my $file_manager = $self->_get_view($service_content->{fileManager});
 	if (!$file_manager) {
 		notify($ERRORS{'WARNING'}, 0, "failed to retrieve file manager object");
 		return;
@@ -3297,7 +3618,7 @@ sub _get_datastore_object {
 	# Get a datastore view, add the view's summary to the return hash
 	my @datastore_names_found;
 	for my $datastore_mo_ref (@datastore_mo_refs) {
-		my $datastore = Vim::get_view(mo_ref => $datastore_mo_ref);
+		my $datastore = $self->_get_view($datastore_mo_ref);
 		my $datastore_name = $datastore->summary->name;
 		$self->{datastore_objects}{$datastore_name} = $datastore;
 	}
@@ -3353,7 +3674,7 @@ sub _get_datastore_info {
 	# Get a datastore view, add the view's summary to the return hash
 	my $datastore_info;
 	for my $datastore_mo_ref (@datastore_mo_refs) {
-		my $datastore_view = Vim::get_view(mo_ref => $datastore_mo_ref);
+		my $datastore_view = $self->_get_view($datastore_mo_ref);
 		my $datastore_name = $datastore_view->summary->name;
 		
 		# Make sure the datastore is accessible
@@ -3479,7 +3800,7 @@ sub _is_vcenter {
 		return;
 	}
 	
-	my $service_content = Vim::get_service_content();
+	my $service_content = $self->_get_service_content();
 	my $api_type = $service_content->{about}->{apiType};
 	
 	# apiType should either be:
@@ -3502,15 +3823,20 @@ sub _is_vcenter {
 =cut
 
 sub _mo_ref_to_string {
-	my $mo_ref = shift;
+	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;
+	}
 	
 	# Check the argument, either a mo_ref or view can be supplied
+	my $mo_ref = shift;
 	if (!ref($mo_ref)) {
 		notify($ERRORS{'WARNING'}, 0, "argument is not a reference: $mo_ref");
 		return;
 	}
 	elsif (ref($mo_ref) eq 'ManagedObjectReference') {
-		$mo_ref = Vim::get_view(mo_ref => $mo_ref)
+		$mo_ref = $self->_get_view($mo_ref)
 	}
 	
 	my $return_string = '';
@@ -3580,7 +3906,7 @@ sub get_host_network_info {
 	my $datacenter_view = $self->_get_datacenter_view();
 	
 	# Get the NetworkFolder view
-	my $network_folder_view = Vim::get_view(mo_ref => $datacenter_view->networkFolder);
+	my $network_folder_view = $self->_get_view($datacenter_view->networkFolder);
 	if (!$network_folder_view) {
 		notify($ERRORS{'WARNING'}, 0, "failed to retrieve networkFolder view from $vmhost_hostname");
 		return;
@@ -3588,7 +3914,7 @@ sub get_host_network_info {
 	
 	my $child_array = $network_folder_view->{childEntity};
 	if (!$child_array) {
-		notify($ERRORS{'WARNING'}, 0, "networkFolder does not contain a 'childEntity' key:\n" . _mo_ref_to_string($network_folder_view));
+		notify($ERRORS{'WARNING'}, 0, "networkFolder does not contain a 'childEntity' key:\n" . $self->_mo_ref_to_string($network_folder_view));
 		return;
 	}
 	
@@ -3598,7 +3924,7 @@ sub get_host_network_info {
 		my $value = $child->{value};
 		
 		# Get a view for the child entity
-		my $child_view = Vim::get_view(mo_ref => $child);
+		my $child_view = $self->_get_view($child);
 		if (!$child_view) {
 			notify($ERRORS{'WARNING'}, 0, "failed to retrieve view for networkFolder child:\n" . format_data($child));
 			next CHILD;
@@ -3623,7 +3949,7 @@ sub get_host_network_info {
 			# Each portgroup belongs to a distributed virtual switch
 			# The UUID of the switch is required when adding the portgroup to a VM
 			# Get the dvSwitch view
-			my $dv_switch_view = Vim::get_view(mo_ref => $child_view->config->distributedVirtualSwitch);
+			my $dv_switch_view = $self->_get_view($child_view->config->distributedVirtualSwitch);
 			if (!$dv_switch_view) {
 				notify($ERRORS{'WARNING'}, 0, "failed to retrieve DistributedVirtualSwitch view for portgroup $name");
 				next CHILD;
@@ -3833,7 +4159,7 @@ sub is_multiextent_disabled {
 	HOST: for my $host_system_view (@host_system_views) {
 		my $host_system_name = $host_system_view->{name};
 		
-		my $kernel_module_system = Vim::get_view(mo_ref => $host_system_view->configManager->kernelModuleSystem);
+		my $kernel_module_system = $self->_get_view($host_system_view->configManager->kernelModuleSystem);
 		if (!$kernel_module_system) {
 			notify($ERRORS{'WARNING'}, 0, "unable to determine if multiextent kernel module is enabled on $host_system_name, kernelModuleSystem could not be retrieved");
 			$multiextent_info->{$host_system_name} = 'unknown';