CodeShare
Have some code. Share some code.
cancel
Showing results for 
Search instead for 
Did you mean: 
JRahm
Community Manager
Community Manager

Problem this snippet solves:

This iCall script can be used to disable an interface (int 1.3 in this case) if the member availability of a pool drops below a certain threshold (70% in this example.)

How to use this snippet:

Implementation Details

This iCall script requires v11.4 or higher. The script is called by a periodic handler, but could be converted to a triggered handler with some custom work in /config/user_alert.conf on the pool members.

Code :

## Script ##
sys icall script poolCheck.v1.0.0 {
    app-service none
    definition {
        set pn "/Common/pool4"
        set total 0
        set usable 0
        foreach obj [tmsh::get_status /ltm pool $pn detail] {
            #puts $obj
            foreach member [tmsh::get_field_value $obj members] {
                #puts $member
                incr total
                if { [tmsh::get_field_value $member status.availability-state] == "available" && \
                     [tmsh::get_field_value $member status.enabled-state] == "enabled" } {
                         incr usable
                }
            }
        }
        if { [expr $usable.0 / $total] < 0.7 } {
            tmsh::log "Not enough pool members in pool $pn, interface 1.3 disabled"
            tmsh::modify /net interface 1.3 disabled
        } else {
            tmsh::log "Enough pool members in pool $pn,  interface 1.3 enabled"
            tmsh::modify /net interface 1.3 enabled
        }
    }
    description none
    events none
}
## Handler ##
sys icall handler periodic poolCheck.v1.0.0 {
    first-occurrence 2014-09-16:11:00:00
    interval 60
    script poolCheck.v1.0.0
}
Comments
Sumanta_88744
Cirrus
Cirrus
Hi Jason Can I use this example to track pool member availability and based on that I would trigger tmsh command to disable specific member of another pool? Please refer to my query on i-call script.
RiverFish
Altostratus
Altostratus

How can you add more than one pool to this script? Currently I am creating a separate script for each pool.

 

RiverFish
Altostratus
Altostratus

For multiple pools this works:

admin@(f5-device-001)(cfg-sync Standalone)(/S1-green-P:Active)(/Common)(tmos) list sys icall script check-members-script 
sys icall script check-members-script {
    app-service none
    definition {
        set pool_names "/Common/pool-fooapp1.example.com /Common/pool-fooapp2.example.com /Common/pool-fooapp3.example.com"
        foreach pn $pool_names {
        set total 0
        set usable 0
                foreach obj [tmsh::get_status /ltm pool $pn detail] {
                    puts $obj
                    foreach member [tmsh::get_field_value $obj members] {
                        puts $member
                        incr total
                        if { [tmsh::get_field_value $member status.availability-state] == "available" && \
                            [tmsh::get_field_value $member status.enabled-state] == "enabled" } {
                                incr usable
                       }
                 }
            }
            if { [expr $usable.0 / $total] < 0.7 } {
                tmsh::log "Available pool member threshold reached for $pn"
        }
      }  
    }
    description none
    events none
}
admin@(f5-device-001)(cfg-sync Standalone)(/S1-green-P:Active)(/Common)(tmos)  
JRahm
Community Manager
Community Manager

For multiple pools, you need to add additional logic to determine which pool or how many of the pools impacted would result in the need to shut down the interface. As is, if one pool is below the threshold but the next is not, you'll just end up toggling the interface.

tcr_rct
Nimbostratus
Nimbostratus

Hi JRahm,

I want to run a script just if interface 1.2 UP.

how can I do it?

for example;

exec bash -c "ssh user@192.168.1.1 'ip link set ens0 UP'"

thanks

Version history
Last update:
‎09-Mar-2015 15:40
Updated by:
Contributors