PowerShell Pool Member Availability

Problem this snippet solves:

This PowerShell script will query the status of the pool members for a specified poolname.

How to use this snippet:

PowerShellPoolMemberAvailability.ps1
  -BIGIP < bigip>
  -User < user>
  -Pass < pass>
  [-Pool < poolname>
    [-List]]
    

Code :

#----------------------------------------------------------------------------
# The contents of this file are subject to the "END USER LICENSE AGREEMENT 
# FOR F5 Software Development Kit for iControl"; you may not use this file 
# except in compliance with the License. The License is included in the 
# iControl Software Development Kit.
#
# Software distributed under the License is distributed on an "AS IS"
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
# the License for the specific language governing rights and limitations
# under the License.
#
# The Original Code is iControl Code and related documentation
# distributed by F5.
#
# The Initial Developer of the Original Code is F5 Networks,
# Inc. Seattle, WA, USA. Portions created by F5 are Copyright (C) 1996-2010 
# F5 Networks, Inc. All Rights Reserved.  iControl (TM) is a registered 
# trademark of F5 Networks, Inc.
#
# Alternatively, the contents of this file may be used under the terms
# of the GNU General Public License (the "GPL"), in which case the
# provisions of GPL are applicable instead of those above.  If you wish
# to allow use of your version of this file only under the terms of the
# GPL and not to allow others to use your version of this file under the
# License, indicate your decision by deleting the provisions above and
# replace them with the notice and other provisions required by the GPL.
# If you do not delete the provisions above, a recipient may use your
# version of this file under either the License or the GPL.
#----------------------------------------------------------------------------
param(
  [string]$BIGIP = $null,
  [string]$User = $null,
  [string]$Pass = $null,
  [string]$Pool = $null,
  [switch]$List = $false
);
Set-PSDebug -strict;

#-------------------------------------------------------------------------
function Write-Usage()
#
# Print Usage information for this script
#-------------------------------------------------------------------------
{
  Write-Host "Usage: $(Split-Path -Path $MyInvocation.ScriptName -Leaf) -BIGIP  -User  -Pass  [-Pool  [-List]]";
  exit;
}

#-------------------------------------------------------------------------
function Get-PoolList()
#-------------------------------------------------------------------------
{
  $pool_list = (Get-F5.iControl).LocalLBPool.get_list();
  Write-Host "Available Pools:";
  foreach ($pool in $pool_list)
  {
    Write-Host "  $pool";
  }
}

#-------------------------------------------------------------------------
function Get-PoolMemberAvailability()
#-------------------------------------------------------------------------
{
  param([string]$Pool);
  
  $avail_count = 0;
  $total_count = 0;
  
  if ( $Pool.Length -ne 0 )
  {
    $MemberObjectStatusAofA = (Get-F5.iControl).LocalLBPoolMember.get_object_status((, $Pool));
    # Only one pool, so let's access the members for first entry of returned array.
    $MemberObjectStatusA = $MemberObjectStatusAofA[0];
    foreach ($MemberObjectStatus in $MemberObjectStatusA)
    {
      $member = $MemberObjectStatus.member;
      $addr = $member.address;
      $port = $member.port;
      $Availability = $MemberObjectStatus.object_status.availability_status;
      $Enabled = $MemberObjectStatus.object_status.enabled_status;
      $Description = $MemberObjectStatus.object_status.status_description;
      
      $total_count++;
      if ( $Availability -eq "AVAILABILITY_STATUS_GREEN" )
      {
        $avail_count++;
      }
      
      if ($List)
      {
        Write-Host "$Pool,${addr}:${port},$Availability,$Enabled,$Description";
      }
    }
    if (!$List)
    {
      Write-Host "$avail_count/$total_count"
    }
  }
  
}

#-------------------------------------------------------------------------
function Do-Initialize()
#-------------------------------------------------------------------------
{
  if ( (Get-PSSnapin | Where-Object { $_.Name -eq "iControlSnapIn"}) -eq $null )
  {
    Add-PSSnapIn iControlSnapIn
  }
  $success = Initialize-F5.iControl -HostName $BIGIP -Username $User -Password $Pass;
  
  return $success;
}

#-------------------------------------------------------------------------
# Main Application Logic
#-------------------------------------------------------------------------
if ( ($BIGIP.Length -eq 0) -or ($User.Length -eq 0) -or ($Pass.Length -eq 0) )
{
  Write-Usage;
}

if ( Do-Initialize )
{
  if ( $Pool.Length -eq 0 )
  {
    Get-PoolList;
  }
  else
  {
    Get-PoolMemberAvailability -Pool $Pool;
  }
}
Published Mar 09, 2015
Version 1.0
  • Also Noticed - Doesnt Work with v11 due to ==> LocalLBPoolMember.get_object_status the v11 supports ==> LocalLBPool.get_member_object_status
  • Getting Error - Issue is the node belongs to a different partition and the pool belongs to a different partion - but the script assumes the pool partition as the node partition... Script works if both pool and node are in the same partition PowerShellPoolMemberAvailability.ps1 -BIGIP 1x.1x.x.x -User xx -Pass xx -Pool bi.dd.com Exception calling "get_object_status" with "1" argument(s): "Exception caught in LocalLB::urn:iControl:LocalLB/PoolMember::get_object_status() Exception: Common::OperationFailed primary_error_code : 16908342 (0x01020036) secondary_error_code : 0 error_string : 01020036:3: The requested Pool Member (/App_Admins/bi.dd.com /App_Admins/1x.x.x.x 80) was not found." At C:\pl\PowerShellPoolMemberAvailability.ps1:72 char:84 + $MemberObjectStatusAofA = (Get-F5.iControl).LocalLBPoolMember.get_object_status <<<< ((, $Pool)); + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException The variable '$MemberObjectStatusAofA' cannot be retrieved because it has not been set. At C:\pl\PowerShellPoolMemberAvailability.ps1:74 char:51 + $MemberObjectStatusA = $MemberObjectStatusAofA <<<< [0]; + CategoryInfo : InvalidOperation: (MemberObjectStatusAofA:Token) [], RuntimeException + FullyQualifiedErrorId : VariableIsUndefined The variable '$MemberObjectStatusA' cannot be retrieved because it has not been set. At C:\pl\PowerShellPoolMemberAvailability.ps1:75 char:57 + foreach ($MemberObjectStatus in $MemberObjectStatusA <<<< ) + CategoryInfo : InvalidOperation: (MemberObjectStatusA:Token) [], RuntimeException + FullyQualifiedErrorId : VariableIsUndefined 0/0