GTM Monitor Weight Change
Problem this snippet solves:
This iCall script can be used to change the virtual server score (VS Score) of an LTM virtual server that is being monitored by a Global Traffic Manager. Normally, when a virtual server has a default pool assigned, the GTM administrator would select the VS Capacity load balancing method to choose a virtual server based on the number of available pool members in the default pool. When there is no default pool (the pool assignment is being made by an iRule, for example), LTM does not associate the pool capacity information with the virtual server, and GTM cannot access it. This script will express the ratio of available pool members to total pool members as a percentage, and set the VS Score on the specified virtual server to that percentage, or set it to 1 if there are no pool members available. The GTM admin can then select VS Score as the GTM load balancing method.
How to use this snippet:
Implementation Details
This iCall script requires v11.4 or higher.
Code :
###periodic handler to run the script every 10 seconds ###tmsh command to disable script for maintenance, etc: modify sys icall handler periodic gtm_score_changer status inactive sys icall handler periodic gtm_score_changer_periodic { interval 10 script gtm_score_changer } ###script to change virtual server VS Score based on number of available pool members in an arbitrary pool (that is, not the default pool of the VS) ###this script will express the ratio of available pool members to total pool members as a percentage, and set the VS Score to that percentage or 1 if there are no pool members available sys icall script gtm_score_changer { app-service none definition { ###name of virtual server for which we will change VS Score ###replace icall_virtual with the name of your virtual server set vs icall_virtual ###get current VS Score for comparison set vs_list [tmsh::get_config ltm virtual $vs] if { [llength $vs_list] != 0 } { set vs_config [lindex $vs_list 0] } else { puts "virtual server not found" return 0 } set current_vs_score [tmsh::get_field_value $vs_config "gtm-score"] ###get number of pool members that are both enabled and healthy set enabled_count 0 ###replace icall_pool with the name of your pool set pool_list [[tmsh::get_config ltm pool icall_pool members] if { [llength $pool_list] != 0 } { set pool_members [lindex $pool_list 0] set total_count 0 } else { puts "pool not found" return 0 } ###iterate through pool members to get their state and health status foreach member [tmsh::get_field_value $pool_members "members"] { incr total_count set name [tmsh::get_name $member] set abled [tmsh::get_field_value $member "session"] set state [tmsh::get_field_value $member "state"] if { $abled eq "monitor-enabled" && $state eq "up" } { incr enabled_count } } ###convert integers to floating point numbers to calculate percentage set enabled_count [expr double($enabled_count)] set total_count [expr double($total_count)] if { $enabled_count != 0 } { ##divide number of available members by number of total members, convert to a percentage, then convert back to an integer for use in tmsh command set new_vs_score [expr (int(($enabled_count/$total_count)*100))] if { $current_vs_score != $new_vs_score } { ###modify VS Score on virtual server if score has changed tmsh::modify ltm virtual $vs gtm-score $new_vs_score puts "VS Score changed to: $new_vs_score." } else { puts "VS Score unchanged." } } else { ###since a gtm-score value is required, set VS Score to 1 if no pool members are available tmsh::modify ltm virtual $vs gtm-score 1 puts "No pool members available; VS Score is 1." } } description none events none }