call

Description

Calls an iRule procedure
iRule procedures:
  • Are similar to procedures, functions, subroutines from other languages
  • Allow for reuse of common code
    • Reference the same code from multiple locations, but only define it in one place
    • Simplifies code maintenance
  • Allow you to augment the predefined iRule commands

Procedures are defined with the proc statement. This must be done outside of any event. Procedures can be defined within an iRule assigned to a virtual server or in a separate iRule not assigned to any virtual server.
You can call a local proc (one defined in the same iRule) without a namespace prefix.
call my_proc $args

To reference a proc defined in another iRule in the same partition, prefix the proc name with the iRule name where the proc is defined

call other_rule::my_proc $args

To reference a proc defined in another iRule in a different partition, prefix the proc name with the partition and iRule name where the proc is defined

call /other_partition/other_rule::procname args
Note: Calling a proc in another iRule and/or partition does not affect CMP

Syntax

call <proc_name> [arg(s)]

call arg(s)

Calls the proc named .
If the proc being called requires parameters, the can be supplied after the proc name.
Returns the value(s) that returns (if any).

Examples

Define one or more procs in an iRule outside of any event. This iRule does not need to be assigned to any virtual server.

rule proc_rule {

  proc printArguments args {
    foreach arg $args {
      log local0. "$arg"
    }
  }

  proc returnArguments args {
    log local0. "returning $args"
    return $args
  }
}

Call the proc(s) from the same or another iRule. If you reference the proc from another iRule prefix it with the iRule name where the proc is defined. The prefix can contain an absolute folder path.

when RULE_INIT {
    # Call a proc which returns no values
    call proc_rule::printArguments one two three

    # Save the return value of a proc
    set return_values [call proc_rule::returnArguments one two three]
}
# Proc which accepts no parameters:
proc noargs {} {
 log local0. "Expected and received no arguments"
}
# Proc which accepts a variable number of arguments:
proc any_number_args args  {
 log local0. "Received [llength $args] args: $args"
}
# Proc which accepts an explicit number of arguments
proc explicit_args {arg1 arg2} {
 log local0. "Received two args: $arg1 and $arg2"
}
# Proc which sets default values for arguments if they aren't specified in the call statement:
proc default_value_for_args {{arg1 default1} {arg2 default2}} {
    log local0. "Current values \$arg1: $arg1, \$arg2: $arg2"
}
call default_value_for_args         ; # arg1 is set to "default1", arg2 is set to "default"
call default_value_for_args "a"     ; # arg1 is set to "a",        arg2 is set to "default"
call default_value_for_args "a" "b" ; # arg1 is set to "a",        arg2 is set to "b"