on 18-Mar-2015 16:27
Problem this snippet solves:
This BIG-IP v4.x iRule provides persistence on the JSessionID value found in either the URI or a cookie for WebLogic servers. This solution was tested on WebLogic v7.x and BIG-IP v4.5.13. Be forewarned that other versions of WebLogic may use a different cookie format than the one expected by this iRule.
How to use this snippet:
Build the class mapping first. The jsessionid string contains a consistent hash of the server IP address which will not change unless the server is re-addressed. (This ID value is not guaranteed to persist through WL upgrades.) Determine the hash value for each server by observing the jsessionid strings generated by the server and extracting the entire field between the the 2nd and 3rd "!" character:
For instance, server 1 generates a jsessionid parameter that looks like this: jsessionid=l0ngr4ndom$3qu3nc3ofch4r4ct3rs!-123456789!-987654321!8082!8081
Extract the server hash (-987654321) and use it to create the class mapping to the appropriate server definition: "-98765432110.0.0.101:8081"
Next create the appropriate pools, applying the indicated select statements.
Then build the iRule and apply to the WebLogic virtual server definition.
First we use UIE expressions to extract server-referencing string, then use extracted values to identify target node:
URI parse (assumes jsessionid will always be the first parameter in URI): getfield(getfield(http_uri, ';', 2), '!', 3)
cookie parse: getfield(http_cookie("jsessionid"), '!', 3)
Map extracted value to target node: mapclass2node( ), WLnodes) mapclass2node( ), WLnodes)
Resulting node selection expressions -- cookie-enabled traffic & non-cookie-enabled traffic: mapclass2node(getfield(getfield(http_uri, ';', 2), '!', 3), WLnodes) mapclass2node(getfield(http_cookie("jsessionid"), '!', 3), WLnodes)
(The select statement assumes jsessionid will always be the first parameter in URI. If that is not the case, additional string manipulation may be necessary to extract the jsessionid parameter first.)
Code :
# Class class WLnodes { "-839916664192.168.0.1:7501" "-839916660192.168.0.2:7501" "-839916656192.168.0.3:7501" "-839916652192.168.0.4:7501" } # Pools with select statements pool WL-persistCookie { lb_method observed select mapclass2node(getfield(http_cookie("jsessionid"), '!', 3), WLnodes) member 192.168.0.1:7501 member 192.168.0.2:7501 } pool WL-persistURI { lb_method observed select mapclass2node(getfield(getfield(http_uri, ';', 2), '!', 3), WLnodes) member 192.168.0.3:7501 member 192.168.0.4:7501 } # iRule Source rule WL-persist { if (http_uri contains "jsessionid=") { use pool WL-persistURI } else { use pool WL-persistCookie } }