Forum Discussion

playfair039_320's avatar
playfair039_320
Icon for Nimbostratus rankNimbostratus
Jul 19, 2017

Boolean operation for iRule

I have an iRule which makes a call to a REST API to raise an alert when there are no active members within the pool, ie pool monitor reports negative for all members. The problem is: I have a meta header in the "maintenance" page which refreshes every 30s to bring the service back up for the user and for this reason, the system sends multiple alerts. Can i have the code wrapped around a boolean operator that switches to false when the pool is 'empty', send ONE alert and then switches back to true when the service comes back up. Thanks in advance.

 

4 Replies

  • The code block looks something like this Patrick. I just need something that wraps around it so that when one alert is raised when the pool is empty. Thanks in advance

     

    if {[active_members [LB::server pool]] < 1 } {
        set conn [connect -timeout 100 -idle 30 -status conn_status x.x.x.x:x]
        set postdata "POST /whatever/whatever/ HTTP/1.1\r\n"
        append postdata "Content-Type: application/json;charset=UTF-8\r\n"
        append postdata "Accept: */*\r\n"
        append postdata "Host: x.x.x.x:x\r\n"
        append postdata "accept-encoding: gzip, deflate\r\n"
        append postdata "content-length: $jsonlen\r\n\r\n"
        set send_info [send -timeout 100 -status send_status $conn $postdata]
        set recv_2kbytes [recv -timeout 300 20 $conn]
        set length_recv [string length $recv_2kbytes]
        close $conn   
  • I might look into global variables:

    https://devcentral.f5.com/articles/irules-101-03-variables

    I've never had the need to use them myself so you might want to load test it, but maybe it could look something like this:

    when RULE_INIT {
    
        set ::alertSent 0
    
    }
    
    when HTTP_REQUEST {
        if {[active_members [LB::server pool]] < 1 } {
    
            if { $::alertSent == 0 } {
                set conn [connect -timeout 100 -idle 30 -status conn_status x.x.x.x:x]
                set postdata "POST /whatever/whatever/ HTTP/1.1\r\n"
                append postdata "Content-Type: application/json;charset=UTF-8\r\n"
                append postdata "Accept: */*\r\n"
                append postdata "Host: x.x.x.x:x\r\n"
                append postdata "accept-encoding: gzip, deflate\r\n"
                append postdata "content-length: $jsonlen\r\n\r\n"
                set send_info [send -timeout 100 -status send_status $conn $postdata]
                set recv_2kbytes [recv -timeout 300 20 $conn]
                set length_recv [string length $recv_2kbytes]
                close $conn
    
                set ::alertSent 1
            }
        } else {
            set ::alertSent 1
        }
    }
    
  • Here's a revised rule using tables. Please note that you might want to change the key from "alertSent" to something more unique as the tables are global (in order to ensure maximum performance).

    when HTTP_REQUEST {
    
        if {[active_members [LB::server pool]] < 1 } {
    
            if { [table lookup "alertSent"] == "" } {
    
                set conn [connect -timeout 100 -idle 30 -status conn_status x.x.x.x:x]
                set postdata "POST /whatever/whatever/ HTTP/1.1\r\n"
                append postdata "Content-Type: application/json;charset=UTF-8\r\n"
                append postdata "Accept: */*\r\n"
                append postdata "Host: x.x.x.x:x\r\n"
                append postdata "accept-encoding: gzip, deflate\r\n"
                append postdata "content-length: $jsonlen\r\n\r\n"
                set send_info [send -timeout 100 -status send_status $conn $postdata]
                set recv_2kbytes [recv -timeout 300 20 $conn]
                set length_recv [string length $recv_2kbytes]
                close $conn
    
                table set "alertSent" "1" indef indef
    
            }
        } else {
            table set "alertSent" "" indef indef
        }
    
    }
    

    Now, may I please have my answer back? 🙂