Forum Discussion

Cloverleaf_5340's avatar
Cloverleaf_5340
Icon for Nimbostratus rankNimbostratus
Jun 14, 2014

DIsabling nodes in iControl REST shows related members as "up". How do you discover true state?

When disabling a node by PUTing the state to "user-down", the node goes down, and the GUI reflects this. Pool members of that node also show their state as down as well in the GUI (as you'd expect), but when you query the state of the member with REST, the state is shown as "up". I suppose you could say this is ~technically~ true, in that the member itself is not disabled, it's just inheriting the state of the node, but how would I then get the "overall" state of the member? It seems... messy... to have to query the nodes and then do a comparison with the member names against the node names to see if the member state is being overridden by the node state.

 

Does anyone have any suggestions here? This is on 11.5.1 HF2, so we're pretty up-to-date.

 

1 Reply

  • Hi!

    You can actually check it, but you need to check the enabled status for that.

    Evaluate the following script (written in Powershell but the methods are the same):

    Initialize Snapin
    
    if ( (Get-PSSnapin | Where-Object { $_.Name -eq "iControlSnapIn"}) -eq $null ){
        Add-PSSnapIn iControlSnapIn
    }
    
    Add a custom class with properties matching the object you got before
    Add-Type @'
    public class Member
    {
        public string Pool;
        public string Address;
        public string Port;
        public string Name;
        public string Availability;
        public string Enabled;
        public string Status;
    }
    '@
    
    
    Function Get-Pool-Members {
    
        Param([string]$BigIP, [string]$User, [string]$Password, [string]$Partition="Common") 
    
        Declare variables
        $ObjMembers = @()
        $NodeDict = @{}
    
        Connect to the BigIP
        $Success = Initialize-F5.iControl -HostName $BigIP -Username $User -Password $Password
    
        Get an iControl Handle
        $F5 = Get-F5.iControl
    
        Change Partition
        $F5.ManagementPartition.set_active_partition($Partition)
    
        Get Pool Lists, statuses, nodes etc
        $PoolList = $f5.LocalLBPool.get_list()
        $Poolmembers = $f5.LocalLBPool.get_member_v2($PoolList)
        $PoolMemberstatuses = $F5.LocalLBPool.get_member_object_status($PoolList, $Poolmembers)
        $NodeList = $F5.LocalLBNodeAddressV2.get_list()
        $NodeIPList = $f5.LocalLBNodeAddressV2.get_address($NodeList)
    
        Save the nodes in a dictionary for convenient access
        for($i=0;$i -lt ($NodeList.Count);$i++){
            $NodeDict.Add($NodeList[$i], $NodeIPList[$i])
        }
    
        for($i=0;$i -lt ($PoolList.Count);$i++){
    
            for($x=0;$x -lt ($PoolMembers[$i].Count);$x++){
    
                Create a new temporary object of the member class
                $objTempMember = New-Object Member
    
                Populate the object
                $objTempMember.Pool = $PoolList[$i]
                $objTempMember.name = $PoolMembers[$i][$x].address
                $objTempMember.Address = $NodeDict[$objTempMember.name]
                $objTempMember.Port = $PoolMembers[$i][$x].port
                $objTempMember.Availability = $PoolMemberstatuses[$i][$x].availability_status
                $objTempMember.Enabled = $PoolMemberstatuses[$i][$x].enabled_status
                $objTempMember.Status = $PoolMemberstatuses[$i][$x].status_description
    
                Add the object to a list
                $ObjMembers += $objTempMember
            }
    
        }
        Return the object list
        Return $ObjMembers
    
    }
    
    $poolmembers = Get-Pool-Members -BigIP "192.168.161.10" -User "iUser" -Password "mypassword" -Partition "Common"
    

    This would generate the following output in my config:

    Pool         : /Common/SorryPool
    Address      : 192.168.174.1
    Port         : 8090
    Name         : /Common/PajoIIS
    Availability : AVAILABILITY_STATUS_GREEN
    Enabled      : ENABLED_STATUS_DISABLED_BY_PARENT
    Status       : Pool member is available
    
    Pool         : /Common/allpool
    Address      : 192.168.174.1
    Port         : 8082
    Name         : /Common/PajoIIS
    Availability : AVAILABILITY_STATUS_GREEN
    Enabled      : ENABLED_STATUS_DISABLED_BY_PARENT
    Status       : Pool member is available
    
    Pool         : /Common/PajoIIS-8080-8081_pool
    Address      : 192.168.174.1
    Port         : 8080
    Name         : /Common/PajoIIS
    Availability : AVAILABILITY_STATUS_GREEN
    Enabled      : ENABLED_STATUS_DISABLED
    Status       : Pool member is available, user disabled
    
    Pool         : /Common/PajoIIS-8080-8081_pool
    Address      : 192.168.174.1
    Port         : 8081
    Name         : /Common/PajoIIS
    Availability : AVAILABILITY_STATUS_GREEN
    Enabled      : ENABLED_STATUS_DISABLED_BY_PARENT
    Status       : Pool member is available
    

    The key here would be this method:

    https://devcentral.f5.com/wiki/iControl.LocalLB__Pool__get_member_object_status.ashx
    

    Which would return an objectstatus object:

    https://devcentral.f5.com/wiki/iControl.LocalLB__ObjectStatus.ashx
    

    Hope that helped!

    /Patrik