Author: arkurth
Date: Tue Feb  9 17:13:39 2016
New Revision: 1729416

URL: http://svn.apache.org/viewvc?rev=1729416&view=rev
Log:
VCL-912
Added subroutines to utils.pm:
get_provisioning_table_info
get_vmhost_assigned_vm_provisioning_info

These are not being called yet. They may be used in the future to try to 
dynamically determine which provisioning module to use for a VM host.

VCL-844
Added $no_cache argument to get_vmhost_assigned_vm_info.

Modified:
    vcl/trunk/managementnode/lib/VCL/utils.pm

Modified: vcl/trunk/managementnode/lib/VCL/utils.pm
URL: 
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/utils.pm?rev=1729416&r1=1729415&r2=1729416&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/utils.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/utils.pm Tue Feb  9 17:13:39 2016
@@ -168,6 +168,7 @@ our @EXPORT = qw(
        get_os_info
        get_production_imagerevision_info
        get_provisioning_osinstalltype_info
+       get_provisioning_table_info
        get_random_mac_address
        get_request_by_computerid
        get_request_current_state_name
@@ -186,6 +187,7 @@ our @EXPORT = qw(
        get_user_info
        get_variable
        get_vmhost_assigned_vm_info
+       get_vmhost_assigned_vm_provisioning_info
        get_vmhost_info
        getnewdbh
        getpw
@@ -12150,7 +12152,7 @@ sub get_management_node_vmhost_info {
 
 =head2 get_vmhost_assigned_vm_info
 
- Parameters  : $vmhost_id
+ Parameters  : $vmhost_id, $no_cache (optional)
  Returns     : hash reference
  Description : Returns a hash reference containing all of the computer IDs
                assigned to a VM host.
@@ -12158,12 +12160,16 @@ sub get_management_node_vmhost_info {
 =cut
 
 sub get_vmhost_assigned_vm_info {
-       my $vmhost_id = shift;
+       my ($vmhost_id, $no_cache) = @_;
        if (!$vmhost_id) {
                notify($ERRORS{'WARNING'}, 0, "VM host ID argument was not 
supplied");
                return;
        }
        
+       if (!$no_cache && defined($ENV{vmhost_assigned_vm_info}{$vmhost_id})) {
+               return $ENV{vmhost_assigned_vm_info}{$vmhost_id};
+       }
+       
        my $select_statement = <<EOF;
 SELECT
 computer.id
@@ -12182,12 +12188,106 @@ EOF
                $assigned_computer_info->{$computer_id} = $computer_info if 
$computer_info;
        }
        
+       $ENV{vmhost_assigned_vm_info}{$vmhost_id} = $assigned_computer_info;
        notify($ERRORS{'DEBUG'}, 0, "retrieved computer info for VMs assigned 
to VM host $vmhost_id: " . join(', ', sort keys %$assigned_computer_info));
        return $assigned_computer_info;
 }
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2  get_vmhost_assigned_vm_provisioning_info
+
+ Parameters  : $vmhost_identifier, $no_cache (optional)
+ Returns     : hash reference
+ Description : For a given vmhost entry, retrieves the provisioning ID for all
+               of the computers assigned to the VM host. This information can 
be
+               used to attempt to determine which provisioning module should be
+               used to control the VM host.
+               
+               There is currently no deterministic way to tie a VM host to a
+               provisioning table type. It's possible to assign VMs with
+               different computer.provisioningid values to the same VM host.
+               This is usually done by mistake.
+               
+               This subroutine constructs a hash refererence with keys
+               corresponding to provisioning.id values. Each key contains the
+               provisioning table information.
+               
+               An 'ASSIGNED_COMPUTER_IDS' key is added containing a hash
+               reference. The keys of this hash correspond to computer.id 
values
+               of VMs assigned to the host with the corresponding
+               computer.provisioningid value. An 'ASSIGNED_COMPUTER_COUNT' key
+               is added containing the number of VMs.
+               
+               Example where VM host has multiple VM provisioning types
+               assigned:
+               
+                  {
+                    14 => {
+                      "ASSIGNED_VM_COUNT" => 1,
+                      "id" => 14,
+                      "module" => {
+                        "description" => "",
+                        "id" => 33,
+                        "name" => "provisioning_libvirt",
+                        "perlpackage" => "VCL::Module::Provisioning::libvirt",
+                        "prettyname" => "Libvirt Provisioning"
+                      },
+                      "moduleid" => 33,
+                      "name" => "libvirt",
+                      "prettyname" => "Libvirt"
+                    },
+                    8 => {
+                      "ASSIGNED_VM_COUNT" => 27,
+                      "id" => 8,
+                      "module" => {
+                        "description" => "",
+                        "id" => 21,
+                        "name" => "provisioning_vmware_vsphere",
+                        "perlpackage" => 
"VCL::Module::Provisioning::VMware::VMware",
+                        "prettyname" => "VMware Provisioning Module"
+                      },
+                      "moduleid" => 21,
+                      "name" => "vmware",
+                      "prettyname" => "VMware Server 2.x and ESX/ESXi"
+                    }
+                  }
+
+=cut
+
+
+sub get_vmhost_assigned_vm_provisioning_info {
+       my ($vmhost_id, $no_cache) = @_;
+       
+       # Check the passed parameter
+       if (!defined($vmhost_id)) {
+               notify($ERRORS{'WARNING'}, 0, "VM host ID argument was not 
specified");
+               return;
+       }
+       
+       if (!$no_cache && 
defined($ENV{vmhost_assigned_vm_provisioning_info}{$vmhost_id})) {
+               return $ENV{vmhost_assigned_vm_provisioning_info}{$vmhost_id};
+       }
+       
+       my $vmhost_assigned_vm_info = get_vmhost_assigned_vm_info($vmhost_id, 
$no_cache) || return;
+
+       my $vmhost_assigned_vm_provisioning_info = {};
+       for my $computer_id (keys %$vmhost_assigned_vm_info) {
+               my $provisioning_id = 
$vmhost_assigned_vm_info->{$computer_id}{provisioning}{id};
+               if 
(!defined($vmhost_assigned_vm_provisioning_info->{$provisioning_id})) {
+                       
$vmhost_assigned_vm_provisioning_info->{$provisioning_id} = 
$vmhost_assigned_vm_info->{$computer_id}{provisioning};
+               }
+               
#$vmhost_assigned_vm_provisioning_info->{$provisioning_id}{ASSIGNED_COMPUTER_IDS}{$computer_id}
 = 1;
+               
$vmhost_assigned_vm_provisioning_info->{$provisioning_id}{ASSIGNED_VM_COUNT}++;
+       }
+       
+       $ENV{vmhost_assigned_vm_provisioning_info}{$vmhost_id} = 
$vmhost_assigned_vm_provisioning_info;
+       notify($ERRORS{'DEBUG'}, 0, "retrieved provisioning info for VMs 
assigned to VM host $vmhost_id:\n" . 
format_data($vmhost_assigned_vm_provisioning_info));
+       return $vmhost_assigned_vm_provisioning_info;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 =head2 sleep_uninterrupted
 
  Parameters  : $seconds
@@ -13969,6 +14069,123 @@ EOF
 }
 
 #/////////////////////////////////////////////////////////////////////////////
+
+=head2 get_provisioning_table_info
+
+ Parameters  : none
+ Returns     : hash reference
+ Description : Retrieves information from the provisioning and module tables
+               and assembles a hash. The hash keys are the provisioning.id
+               values. Example:
+               {
+                 1 => {
+                   "id" => 1,
+                   "module" => {
+                     "description" => "",
+                     "id" => 1,
+                     "name" => "provisioning_xCAT",
+                     "perlpackage" => "VCL::Module::Provisioning::xCAT",
+                     "prettyname" => "xCAT"
+                   },
+                   "moduleid" => 1,
+                   "name" => "xcat",
+                   "prettyname" => "xCAT"
+                 },
+                 13 => {
+                   "id" => 13,
+                   "module" => {
+                     "description" => "",
+                     "id" => 21,
+                     "name" => "provisioning_vmware_vsphere",
+                     "perlpackage" => 
"VCL::Module::Provisioning::VMware::VMware",
+                     "prettyname" => "VMware Provisioning Module"
+                   },
+                   "moduleid" => 21,
+                   "name" => "vmware_vsphere",
+                   "prettyname" => "VMware vSphere"
+                 },
+                 15 => {
+                   "id" => 15,
+                   "module" => {
+                     "description" => "",
+                     "id" => 26,
+                     "name" => "base_module",
+                     "perlpackage" => "VCL::Module",
+                     "prettyname" => "VCL Base Module"
+                   },
+                   "moduleid" => 26,
+                   "name" => "none",
+                   "prettyname" => "None"
+                 },
+               }
+
+=cut
+
+sub get_provisioning_table_info {
+       return $ENV{provisioning_table_info} if 
(defined($ENV{provisioning_table_info}));
+       
+       # Get a hash ref containing the database column names
+       my $database_table_columns = get_database_table_columns();
+       
+       my @tables = (
+               'provisioning',
+               'module',
+       );
+       
+       # Construct the select statement
+       my $select_statement = "SELECT DISTINCT\n";
+       
+       # Get the column names for each table and add them to the select 
statement
+       for my $table (@tables) {
+               my @columns = @{$database_table_columns->{$table}};
+               for my $column (@columns) {
+                       $select_statement .= "$table.$column AS 
'$table-$column',\n";
+               }
+       }
+       
+       # Remove the comma after the last column line
+       $select_statement =~ s/,$//;
+       
+       # Complete the select statement
+       $select_statement .= <<EOF;
+FROM
+provisioning,
+module
+WHERE
+provisioning.moduleid = module.id
+EOF
+
+       # Call the database select subroutine
+       my @selected_rows = database_select($select_statement);
+       
+       my $provisioning_table_info = {};
+       for my $row (@selected_rows) {
+               my $provisioning_id = $row->{'provisioning-id'};
+               
+               # Loop through all the columns returned
+               for my $key (keys %$row) {
+                       my $value = $row->{$key};
+                       
+                       # Split the table-column names
+                       my ($table, $column) = $key =~ /^([^-]+)-(.+)/;
+                       
+                       # Add the values for the primary table to the hash
+                       # Add values for other tables under separate keys
+                       if ($table eq 'provisioning') {
+                               
$provisioning_table_info->{$provisioning_id}{$column} = $value;
+                       }
+                       else {
+                               
$provisioning_table_info->{$provisioning_id}{$table}{$column} = $value;
+                       }
+               }
+       }
+       
+       $ENV{provisioning_table_info} = $provisioning_table_info;
+       notify($ERRORS{'DEBUG'}, 0, "retrieved provisioning info: " . 
format_data($provisioning_table_info));
+       return $provisioning_table_info;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
 
 =head2 ip_address_to_network_address
 


Reply via email to