iControl 101 - #21 - Rate Classes

The BIG-IP local traffic management system includes a feature called rate shaping which allows you to enforce a throughput policy on incoming traffic.  Throughput policies are useful for prioritizing and restricting bandwidth on selected traffic patterns. 

Rate shaping can be useful for an e-commerce site that has preferred clients and would like to offer higher throughput for preferred customers, and lower throughput for other site traffic.

This article will discuss how to create and manage rate classes as well as how to assign them to virtual servers.

The rate shaping feature works by first queuing selected packets under a rate class, and then dequeuing the packets at the indicated rate and in the indicated order specified by the rate class.  A rate class is a rate-shaping policy that defines throughput limitatations and a packet scheduling method to be applied to all traffic handled by that rate class.

Usage

The following code samples will build a PowerShell command line application allowing control over Rate Classes.  This program takes as input the bigip, username, and password as well as a subcommand and optional parameters.  Usage is displayed with the Write-Usage function

param (
  $g_bigip = $null,
  $g_uid = $null,
  $g_pwd = $null,
  $g_cmd = $null,
  $g_name = $null,
  $g_arg1 = $null,
  $g_arg2 = $null,
  $g_arg3 = $null,
  $g_arg4 = $null
);

Set-PSDebug -strict;

#-------------------------------------------------------------------------
# function Write-Usage
#-------------------------------------------------------------------------
function Write-Usage()
{
  Write-Host @"
Usage: Rateclass.ps1 host uid pwd [options]
  options
  -------
  list
     - Get a list of rate classess
  create name rate [UNIT_BPS|UNIT_KBPS|UNIT_MBPS]
     - Create a Rate class with the given max throughput rates.
  delete name
     - Delete the specified rate class.
  setbaserate name rate [UNIT_BPS|UNIT_KBPS|UNIT_MBPS]
     - Set the maximum throughput to allot to traffic for this rate class.
  setburstsize name size
     - Set the maximum number of bytes that traffic is allowed to burst beyond the base rate.
  setceilingrate name rate [UNIT_BPS|UNIT_KBPS|UNIT_MBPS]
     - Set how far beyond the base rate the traffic is allowed to flow when bursting.
  setdirection name [DIRECTION_ANY|DIRECTION_CLIENT|DIRECTION_SERVER]
     - Set the direction that the rate class is applied.
  setparent name parent
     - Set the parent rate class that this class is allowed to borrow from.
  setqueuetype name [QUEUE_NONE|QUEUE_STOCHASTIC_FAIR|QUEUE_PRIORITY_FIFO]
     - Set the type of queue used by the specified rate class.
  setvsrateclass name virtual
     - Set the rate class for the specified virtual server.
  removerateclass name virtual
     - Remove the rate class from the specified virtual server.
"@;
  exit;
}

Initialization

As is with all of my iControl PowerShell scripts, validation is made as to whether the iControlSnapin is loaded into the current powershell context.  The Initialize-F5.iControl cmdlet is then called to setup the connection to the BIG-IP for subsequent calls.

The main application logic checks for the passed in command and then passes control to one of the location functions defined below

function Do-Initialize()
{
  if ( (Get-PSSnapin | Where-Object { $_.Name -eq "iControlSnapIn"}) -eq $null )
  {
    Add-PSSnapIn iControlSnapIn
  }
  $success = Initialize-F5.iControl -HostName $g_bigip -Username $g_uid -Password $g_pwd;
  
  return $success;
}

if ( ($g_bigip -eq $null) -or ($g_uid -eq $null) -or ($g_pwd -eq $null) )
{
  Write-Usage;
}

if ( Do-Initialize )
{
  switch ($g_cmd)
  {
    "" {
      Get-RateClassList;
    }
  "list" {
      Get-RateClassList $g_name;
    }
    "create" {
      Create-RateClass $g_name $g_arg1 $g_arg2;
    }
    "delete" {
      Delete-RateClass $g_name;
    }
    "setbaserate" {
      Set-RateClassBaseRate $g_name $g_arg1 $g_arg2;
    }
    "setburstsize" {
      Set-RateclassBurstSize $g_name $g_arg1;
    }
    "setceilingrate" {
      Set-RateClassCeilingRate $g_name $g_arg1 $g_arg2;
    }
    "setdirection" {
      Set-RateClassDirection $g_name $g_arg1;
    }
    "setparent" {
      Set-RateClassParent $g_name $g_arg1;
    }
    "setqueuetype" {
      Set-RateClassQueueType $g_name $g_arg1;
    }
    "setvsrateclass" {
      Set-VirtualServerRateClass $g_name $g_arg1;
    }
    "removevsrateclass" {
      Remove-VirtualServerRateClass $g_name $g_arg1;
    }
    default {
      Write-Usage;
    }
    
  }
}
else
{
  Write-Error "ERROR: iControl subsystem not initialized"
}

Retrieving Rate Class Information

The following function will either query the information about all the rate classes, or if a rate class name is passed in as an argument, it will get the information for just that one.  All of the configurable attributes will be displayed.  I will discuss each attribute in the following sections below.  Finally after the rate class attributes are displayed, I will do a reverse lookup on the Virtual Servers to see if any of them are using the specific rate class.  If a Virtual Server is configured with the given rate class, it will be displayed to the user as well.  In my example below, you will see that I have no rate classes defined so it will return an empty list.

function Get-RateClassList()
{
  param([string]$rc = $null );
  if ( $rc )
  {
    $rc_list = ,$rc;
  }
  else
  {
    $rc_list = (Get-F5.iControl).LocalLBRateClass.get_list();
  }
  $vs_list = (Get-F5.iControl).LocalLBVirtualServer.get_list();
  $vsrc_list = (Get-F5.iControl).LocalLBVirtualServer.get_rate_class($vs_list);
  
  Write-Host "Rate Classes:";
  if ( $rc_list )
  {
    $base_rates = (Get-F5.iControl).LocalLBRateClass.get_base_rate( $rc_list );
    $burst_sizes = (Get-F5.iControl).LocalLBRateClass.get_burst_size( $rc_list );
    $ceiling_rates = (Get-F5.iControl).LocalLBRateClass.get_ceiling_rate( $rc_list );
    $directions = (Get-F5.iControl).LocalLBRateClass.get_direction( $rc_list );
    $parents = (Get-F5.iControl).LocalLBRateClass.get_parent( $rc_list );
    $queue_types = (Get-F5.iControl).LocalLBRateClass.get_queue_type( $rc_list );
    for($i=0; $i -lt $rc_list.Length; $i++)
    {
      Write-Host @"
--------------------
Rate Class $($rc_list[$i])
  Base Rate    : $($base_rates[$i].rate) $($base_rates[$i].unit)
  Burst Size   : $($burst_sizes[$i])
  Ceiling Rate : $($ceiling_rates[$i].rate) $($ceiling_rates[$i].unit)
  Direction    : $($directions[$i])
  Parent       : $($parents[$i])
  Queue Type   : $($queue_types[$i])
"@

  Write-Host "  Virtuals     :";
      for($j=0; $j -lt $vsrc_list.Length; $j++)
      {
        if ( $vsrc_list[$j] -eq $rc_list[$i] )
{
  Write-Host "                 $($vs_list[$j])"
}
      }
    }
  }
}
PS C:\> .\PsRateClass.ps1 bigip user pass
Rate Classes:

Creating a Rate Class

The only attribute needed to create a rate class is the base rate unit.  This is defined as a rate value along with a unit of UNIT_BPS, UNIT_KBPS, or UNIT_MBPS for bits per second, kilobits per second, or megabits per second respectively.  The following function takes these values as arguments and then call the iControl.LocalLBRateClass.create method with the rate class name along with the rate unit structure.  In my example below, a rate class named "myrc" is created with a base rate of 100 megabits per second.  You'll see the default values for the other attributes below.  Since this is a new rate class, it is not assigned to any virtual servers, so that list will be empty.

function Create-RateClass()
{
  param([string]$name = $null, [int]$rate = 0, [string]$unit = "UNIT_BPS");
  if ( $name -and $rate )
  {
    $rateunit = New-Object -TypeName iControl.LocalLBRateClassRateUnit;
    $rateunit.rate = $rate;
    $rateunit.unit = $unit;
    (Get-F5.iControl).LocalLBRateClass.create( (,$name), (,$rateunit) );
    Write-Host "Rate Class $name created...";
    Get-RateClassList $name;
  }
}
PS C:\> .\PsRateClass.ps1 bigip user pass create myrc 100 UNIT_MBPS
Rate Classes:
-------------------
Rate Class myrc
  Base Rate    : 100 UNIT_MBPS
  Burst Size   : 0
  Ceiling Rate : 100 UNIT_MBPS
  Direction    : DIRECTION_ANY
  Parent       : 
  Queue Type   : QUEUE_STOCHASTIC_FAIR
  Virtuals     : 

Deleting a Rate Class

Well, if you want to create a rate class, it make sense that you may want to delete one.  This can be done with the local Delete-RateClass function.  It just takes the name of a rate class and calls the iControl.LocalLBRateClass.delete_rate_class() method.  The Get-RateClass function is then called to list out the remaining rate classes.

function Delete-RateClass()
{
  param([string]$name = $null);
  if ( $name )
  {
    (Get-F5.iControl).LocalLBRateClass.delete_rate_class( (,$name) );
    Write-Host "Rate Class $name deleted...";
    Get-RateClassList;
  }
}
PS C:\> .\PsRateClass.ps1 bigip user pass delete myrc
------------------
Rate Classes:

Assigning the Rate Class Base Rate

The base rate specifies the throughput rate allowed for traffic that the rate class handles.  Packets are generally not allowed to exceed the specified rate.  You can use the iControl.LocalLBRateClass.set_base_rate() method to assign a new base rate to a rate class.  You'll notice that this method is very similar to the create() method illustrated above.  In the below example, I'll change the previously defined base rate of 100 mbps to 100 kbps.  Notice that the base rate is changed but the ceiling rate remains the original value.  To update the ceiling rate, you will need to modify that separately as described below.

function Set-RateClassBaseRate()
{
  param([string]$name = $null, [int]$rate = 0, [string]$unit = "UNIT_BPS");
  if ( $name -and $rate )
  {
    $rateunit = New-Object -TypeName iControl.LocalLBRateClassRateUnit;
    $rateunit.rate = $rate;
    $rateunit.unit = $unit;
    (Get-F5.iControl).LocalLBRateClass.set_base_rate( (,$name), (,$rateunit) );
    Get-RateClassList $name;
  }
}
PS C:\> .\PsRateClass.ps1 bigip user pass setbaserate 100 UNIT_KBPS
Rate Classes:
--------------------
Rate Class myrc
  Base Rate    : 100 UNIT_KBPS
  Burst Size   : 0
  Ceiling Rate : 100 UNIT_MBPS
  Direction    : DIRECTION_ANY
  Parent       :
  Queue Type   : QUEUE_STOCHASTIC_FAIR
  Virtuals     :

 Assigning a Burst Size

The burst size is the maximum number of bytes that traffic is allowed to burst beyond the base rate, before needing to borrow bandwidth.  When this value is set to 0, no bursting is allowed.  You use the burst size setting when you want to allow the rate of traffic flow that  a rate class controls to exceed the base rate.  Exceeding the base rate is known as bursting.  When you configure a rate class to allow bursting, the BIG-IP system saves any unused bandwidth and uses that bandwidth later to enable the rate of traffic to flow to temporarily exceed the base rate.  Specifying a burst size is useful for smoothing out traffic patterns that tend to fluctuate or exceed the base rate such as HTTP traffic.

The following function allows you to set the burst rate (in bytes) by calling the iControl.LocalLBRateClass.set_burst_size() method.  I will set the burst rate to 1000 bytes for the previously defined rate class.

function Set-RateClassBurstSize()
{
  param([string]$name = $null, [int]$size = 0);
  if ( $name -and $size )
  {
    (Get-F5.iControl).LocalLBRateClass.set_burst_size( (,$name), (,$size) );
    Get-RateClassList $name;
  }
}
PS C:\> .\PsRateClass.ps1 bigip user pass setburstsize myrc 1000
Rate Classes:
--------------------
Rate Class myrc
  Base Rate    : 100 UNIT_KBPS
  Burst Size   : 1000
  Ceiling Rate : 100 UNIT_MBPS
  Direction    : DIRECTION_ANY
  Parent       :
  Queue Type   : QUEUE_STOCHASTIC_FAIR
  Virtuals     :

Setting the Ceiling Rate

The ceiling rate setting specifies the absolute limit at which traffic is allowed to flow when bursting or borrowing.  Just like for the base rate, you can specify the ceiling rate in bits per second, kilobits per second, or megabits per second.  The ceiling rate must be equal to or greater than the base rate.  If the ceiling rate equals the base rate, traffic throughput can never exceed the base rate.

The Set-RateClassCelingRate function takes as input the rate class name along with a ceiling rate and unit and then calls the iControl.LocalLBRateClass.set_ceiling_rate() method with those parameters.  The Get-RateClass function is then called to show that the changes took effect.

function Set-RateClassCeilingRate()
{
  param([string]$name = $null, [int]$rate = 0, [string]$unit = "UNIT_BPS");
  if ( $name -and $rate )
  {
    $rateunit = New-Object -TypeName iControl.LocalLBRateClassRateUnit;
    $rateunit.rate = $rate;
    $rateunit.unit = $unit;
    (Get-F5.iControl).LocalLBRateClass.set_ceiling_rate( (,$name), (,$rateunit) );
    Get-RateClassList $name;
  }
}
PS C:\> .\PsRateClass.ps1 bigip user pass setceilingrate myrc 1000 UNIT_MBPS
Rate Classes:
--------------------
Rate Class myrc
  Base Rate    : 100 UNIT_KBPS
  Burst Size   : 1000
  Ceiling Rate : 1000 UNIT_MBPS
  Direction    : DIRECTION_ANY
  Parent       :
  Queue Type   : QUEUE_STOCHASTIC_FAIR
  Virtuals     :

Setting the Rate Class Direction

Using the direction setting, you can apply a rate class to traffic going to a client, to a server, or to both client and server.   Specifying direction is useful in cases where the nature of traffic is directionally based.  For example, if you offer an FTP service to external clients, you might be more interested in limiting throughput for those clients uploading files to your site than you are for clients downloading files from your site.  In this case, you would want a rate class based on traffic going to your server.

In the following example, I'll change the direction on this rate class from the default value of DIRECTION_ANY to DIRECTION_SERVER to allow this rate class to only work on traffic going to the destination server.

function Set-RateClassDirection()
{
  param([string]$name = $null, [string]$direction = "DIRECTION_ANY");
  if ( $name )
  {
    (Get-F5.iControl).LocalLBRateClass.set_direction( (,$name), (,$direction) );
    Get-RateClassList $name;
  }
}
PS C:\> .\PsRateClass.ps1 bigip user pass setdirection myrc DIRECTION_SERVER
Rate Classes:
--------------------
Rate Class myrc
  Base Rate    : 100 UNIT_KBPS
  Burst Size   : 1000
  Ceiling Rate : 1000 UNIT_MBPS
  Direction    : DIRECTION_SERVER
  Parent       :
  Queue Type   : QUEUE_STOCHASTIC_FAIR
  Virtuals     :

 Assigning a Rate Class Parent Class

When you create a rate class, you can use the Parent Class setting to specify that the rate class has a parent class.  This allows the rate class to borrow unused bandwidth from that parent class.  A child class can borrow unused bandwidth from its parent, but a parent class cannot borrow from a child class.  Borrowing is also not possible between two child classes of the same parent class or between two unrelated rate classes.  A parent class can itself have a parent class, provided that you do not create a circular dependency (ie. when a rate class is direct, or indirect, child of itself).

The following example will set the parent class of the "myrc" rate class to the rate class "baserc".

function Set-RateClassParent()
{
  param([string]$name = $null, [string]$parent = "");
  if ( $name )
  {
    (Get-F5.iControl).LocalLBRateClass.set_parent( (,$name), (,$parent) );
    Get-RateClassList $name;
  }
}
PS C:\> .\PsRateClass.ps1 bigip user pass setparent myrc baserc
Rate Classes:
--------------------
Rate Class myrc
  Base Rate    : 100 UNIT_KBPS
  Burst Size   : 1000
  Ceiling Rate : 1000 UNIT_MBPS
  Direction    : DIRECTION_SERVER
  Parent       : baserc
  Queue Type   : QUEUE_STOCHASTIC_FAIR
  Virtuals     :

Setting the Queue Type

The Queue Type (or Queue Discipline) setting determines the method and order in which the BIG-IP system dequeues packets.  The type can be QUEUE_STOCHASTIC_FAIR or QUEUE_PRIORITY_FIFO. 

Stochastic Fair Queuing is a queueing method that queues traffic under a set of many lists, choosing the specific list based on a periodically changing hash of the connection information.  This results in traffic from the same connection always being queued in the same list.  It then dequeues traffic from the set of lists in a round-robin fashion.  The overall effect is that fairness of dequeueing is achieved because one high-speed connection cannot monopolize the queue at the expense of slower connections.

Priority FIFO is a queueing method that queues all trafffic under a set of five lists based on the Type of Service (ToS) field of the traffic.  Four of the lists correspond to the four possible ToS values (Minimum delay, Maximum througput, Maximum reliability, and Minimum cost).  the fifth list represents traffic with no ToS value.  The PFIFO method then processes these five lists in a way that attempts to preserve the meaning of the ToS field as much as possible.

In the following example, I'll set the queue type of the myrc rate class from the default QUEUE_STOCHASTIC_FAIR to QUEUE_PRIORITY_FIFO with the local Set-RateClassQueueType function.  This calls the iControl.LocalLBRateClass.set_queue_type() method.

function Set-RateClassQueueType()
{
  param([string]$name = $null, [string]$type = "QUEUE_STOCHASTIC_FAIR");
  if ( $name )
  {
    (Get-F5.iControl).LocalLBRateClass.set_queue_type( (,$name), (,$type) );
    Get-RateClassList $name;
  }
}
PS C:\> .\PsRateClass.ps1 bigip user pass setqueuetype myrc QUEUE_PRIORITY_FIFO
Rate Classes:
--------------------
Rate Class myrc
  Base Rate    : 100 UNIT_KBPS
  Burst Size   : 1000
  Ceiling Rate : 1000 UNIT_MBPS
  Direction    : DIRECTION_SERVER
  Parent       : baserc
  Queue Type   : QUEUE_PRIORITY_FIFO
  Virtuals     :

 Assigning a Rate Class to a Virtual Server

Having a rate class is good and all, but it doesn't really do anything until you allow traffic to pass through it.  This can be done by assigning it as an attriute to a Virtual Server.  The iControl.LocalLBVirtualServer.set_rate_class() takes a list of virtual server name and the corresponding rate class names to assign to those virtual servers.  The following example will assign the "myrc" rate class to the Virtual Server "xpbert-http".  After the call is made, you will see in the listing that the reverse lookup through the virtual servers showed this rate class was applied to virtual server xpbert-http.

function Set-VirtualServerRateClass()
{
  param([string]$name = $null, [string]$vs = $null);
  if ( $name )
  {
    (Get-F5.iControl).LocalLBVirtualServer.set_rate_class( (,$vs), (,$name) );
    Get-RateClassList $name;
  }
}
PS C:\> .\PsRateClass.ps1 bigip user pass setvsrateclass myrc xpbert-http
Rate Classes:
--------------------
Rate Class myrc
  Base Rate    : 100 UNIT_KBPS
  Burst Size   : 1000
  Ceiling Rate : 1000 UNIT_MBPS
  Direction    : DIRECTION_SERVER
  Parent       : baserc
  Queue Type   : QUEUE_PRIORITY_FIFO
  Virtuals     :
                 xpbert-http

 Removing a Rate Class from a Virtual Server

There is no corresponding remove_rate_class method in the LocalLBVirtualServer interface.  Instead, if you want to remove the rate class, you just pass in an empty string for the rate class name to the set_rate_class() method.  The following example will remove the rate class "myrc" from virtual server "xpbert-http";

function Remove-VirtualServerRateClass()
{
  param([string]$name = $null, [string]$vs = $null);
  if ( $name )
  {
    (Get-F5.iControl).LocalLBVirtualServer.set_rate_class( (,$vs), (,"") );
    Get-RateClassList $name;
  }
}
PS C:\> .\PsRateClass.ps1 bigip user pass removevsrateclass myrc xpbert-http
Rate Classes:
--------------------
Rate Class myrc
  Base Rate    : 100 UNIT_KBPS
  Burst Size   : 1000
  Ceiling Rate : 1000 UNIT_MBPS
  Direction    : DIRECTION_SERVER
  Parent       : baserc
  Queue Type   : QUEUE_PRIORITY_FIFO
  Virtuals     :

Conclusion

You know have all the tools you need to create, modify, and apply a rate class to start controlling the traffic flow to and from your servers.

The code for this article can be found under the PsRateClass entry in the iControl CodeShare.

Published Jan 22, 2009
Version 1.0
"}},"componentScriptGroups({\"componentId\":\"custom.widget.Beta_MetaNav\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.Beta_Footer\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[\"board:TechnicalArticles\",\"message:283650\"],\"name\":\"TkbMessagePage\",\"props\":{},\"url\":\"https://community.f5.com/kb/technicalarticles/icontrol-101---21---rate-classes/283650\"}}})":{"__typename":"ComponentRenderResult","html":"
 
 
 
 
 

\"F5 ©2024 F5, Inc. All rights reserved.
Trademarks Policies Privacy California Privacy Do Not Sell My Personal Information
"}},"componentScriptGroups({\"componentId\":\"custom.widget.Beta_Footer\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.Tag_Manager_Helper\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[\"board:TechnicalArticles\",\"message:283650\"],\"name\":\"TkbMessagePage\",\"props\":{},\"url\":\"https://community.f5.com/kb/technicalarticles/icontrol-101---21---rate-classes/283650\"}}})":{"__typename":"ComponentRenderResult","html":" "}},"componentScriptGroups({\"componentId\":\"custom.widget.Tag_Manager_Helper\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.Consent_Blackbar\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[\"board:TechnicalArticles\",\"message:283650\"],\"name\":\"TkbMessagePage\",\"props\":{},\"url\":\"https://community.f5.com/kb/technicalarticles/icontrol-101---21---rate-classes/283650\"}}})":{"__typename":"ComponentRenderResult","html":"
"}},"componentScriptGroups({\"componentId\":\"custom.widget.Consent_Blackbar\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/QueryHandler\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1740415735000"}],"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1740415735000"}],"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageView/MessageViewStandard\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageView/MessageViewStandard-1740415735000"}],"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/ThreadedReplyList\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/ThreadedReplyList-1740415735000"}],"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageReplyCallToAction\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageReplyCallToAction-1740415735000"}],"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1740415735000"}],"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1740415735000"}],"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageCustomFields\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageCustomFields-1740415735000"}],"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRevision\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRevision-1740415735000"}],"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageReplyButton\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageReplyButton-1740415735000"}],"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageAuthorBio\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1740415735000"}],"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"components/guides/GuideBottomNavigation\"]})":[{"__ref":"CachedAsset:text:en_US-components/guides/GuideBottomNavigation-1740415735000"}],"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1740415735000"}],"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserRank\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserRank-1740415735000"}],"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTime\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTime-1740415735000"}],"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"components/customComponent/CustomComponent\"]})":[{"__ref":"CachedAsset:text:en_US-components/customComponent/CustomComponent-1740415735000"}],"message({\"id\":\"message:283651\"})":{"__ref":"TkbReplyMessage:message:283651"},"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1740415735000"}],"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserRegistrationDate\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserRegistrationDate-1740415735000"}],"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/ranks/UserRankLabel\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1740415735000"}],"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"components/tags/TagView/TagViewChip\"]})":[{"__ref":"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1740415735000"}],"cachedText({\"lastModified\":\"1740415735000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/Pager/PagerLoadMore\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1740415735000"}]},"CachedAsset:pages-1742465118552":{"__typename":"CachedAsset","id":"pages-1742465118552","value":[{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.MvpProgram","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/mvp-program","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.AdvocacyProgram","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/advocacy-program","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"HowDoI.GetHelp.NonCustomer","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/non-customer","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"HowDoI.GetHelp.F5Customer","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/f5-customer","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"HowDoI.GetInvolved","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"HowDoI.Learn","type":"COMMUNITY","urlPath":"/c/how-do-i/learn","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1739501996000,"localOverride":null,"page":{"id":"Test","type":"CUSTOM","urlPath":"/custom-test-2","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"MaintenancePage","type":"COMMUNITY","urlPath":"/maintenance","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"HowDoI.GetHelp.Community","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/community","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.ContributeCode","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/contribute-code","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"HowDoI.Learn.AboutIrules","type":"COMMUNITY","urlPath":"/c/how-do-i/learn/about-irules","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"HowDoI.GetHelp.F5Support","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/f5-support","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"HealthCheckPage","type":"COMMUNITY","urlPath":"/health","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"HowDoI.GetHelp","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"HowDoI.GetHelp.SecurityIncident","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/security-incident","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742465118552,"localOverride":null,"page":{"id":"HowDoI","type":"COMMUNITY","urlPath":"/c/how-do-i","__typename":"PageDescriptor"},"__typename":"PageResource"}],"localOverride":false},"CachedAsset:text:en_US-components/context/AppContext/AppContextProvider-0":{"__typename":"CachedAsset","id":"text:en_US-components/context/AppContext/AppContextProvider-0","value":{"noCommunity":"Cannot find community","noUser":"Cannot find current user","noNode":"Cannot find node with id {nodeId}","noMessage":"Cannot find message with id {messageId}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-0":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-0","value":{"title":"Loading..."},"localOverride":false},"User:user:-1":{"__typename":"User","id":"user:-1","uid":-1,"login":"Former Member","email":"","avatar":null,"rank":null,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":"ANONYMOUS","registrationTime":null,"confirmEmailStatus":false,"registrationAccessLevel":"VIEW","ssoRegistrationFields":[]},"ssoId":null,"profileSettings":{"__typename":"ProfileSettings","dateDisplayStyle":{"__typename":"InheritableStringSettingWithPossibleValues","key":"layout.friendly_dates_enabled","value":"false","localValue":"true","possibleValues":["true","false"]},"dateDisplayFormat":{"__typename":"InheritableStringSetting","key":"layout.format_pattern_date","value":"dd-MMM-yyyy","localValue":"MM-dd-yyyy"},"language":{"__typename":"InheritableStringSettingWithPossibleValues","key":"profile.language","value":"en-US","localValue":null,"possibleValues":["en-US"]}},"deleted":false},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bi0zNC0xM2k0MzE3N0Q2NjFBRDg5NDAy\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bi0zNC0xM2k0MzE3N0Q2NjFBRDg5NDAy","mimeType":"image/png"},"Category:category:Articles":{"__typename":"Category","id":"category:Articles","entityType":"CATEGORY","displayId":"Articles","nodeType":"category","depth":1,"title":"Articles","shortTitle":"Articles","parent":{"__ref":"Category:category:top"},"categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:top":{"__typename":"Category","id":"category:top","displayId":"top","nodeType":"category","depth":0,"title":"Top","entityType":"CATEGORY","shortTitle":"Top"},"Tkb:board:TechnicalArticles":{"__typename":"Tkb","id":"board:TechnicalArticles","entityType":"TKB","displayId":"TechnicalArticles","nodeType":"board","depth":2,"conversationStyle":"TKB","title":"Technical Articles","description":"F5 SMEs share good practice.","avatar":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bi0zNC0xM2k0MzE3N0Q2NjFBRDg5NDAy\"}"},"profileSettings":{"__typename":"ProfileSettings","language":null},"parent":{"__ref":"Category:category:Articles"},"ancestors":{"__typename":"CoreNodeConnection","edges":[{"__typename":"CoreNodeEdge","node":{"__ref":"Community:community:zihoc95639"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:Articles"}}]},"userContext":{"__typename":"NodeUserContext","canAddAttachments":false,"canUpdateNode":false,"canPostMessages":false,"isSubscribed":false},"boardPolicies":{"__typename":"BoardPolicies","canPublishArticleOnCreate":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","args":[]}},"canReadNode":{"__typename":"PolicyResult","failureReason":null}},"shortTitle":"Technical Articles","isManualSortOrderAvailable":false,"tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"repliesProperties":{"__typename":"RepliesProperties","sortOrder":"PUBLISH_TIME","repliesFormat":"threaded"},"eventPath":"category:Articles/community:zihoc95639board:TechnicalArticles/","tagProperties":{"__typename":"TagNodeProperties","tagsEnabled":{"__typename":"PolicyResult","failureReason":null}},"requireTags":true,"tagType":"FREEFORM_AND_PRESET"},"User:user:106220":{"__typename":"User","id":"user:106220","uid":106220,"login":"Joe_Pruitt","deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/images/dS0xMDYyMjAtUU1TTFdB?image-coordinates=0%2C0%2C1000%2C1000"},"rank":null,"email":"","messagesCount":3319,"biography":null,"topicsCount":216,"kudosReceivedCount":14,"kudosGivenCount":0,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2004-09-22T01:00:00.000-07:00","confirmEmailStatus":null},"followersCount":null,"solutionsCount":0},"TkbTopicMessage:message:283650":{"__typename":"TkbTopicMessage","uid":283650,"subject":"iControl 101 - #21 - Rate Classes","id":"message:283650","revisionNum":1,"repliesCount":1,"author":{"__ref":"User:user:106220"},"depth":0,"hasGivenKudo":false,"helpful":null,"board":{"__ref":"Tkb:board:TechnicalArticles"},"conversation":{"__ref":"Conversation:conversation:283650"},"messagePolicies":{"__typename":"MessagePolicies","canPublishArticleOnEdit":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_edit_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_edit_workflow_action.accessDenied","args":[]}},"canModerateSpamMessage":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","key":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","args":[]}}},"contentWorkflow":{"__typename":"ContentWorkflow","state":"PUBLISH","scheduledPublishTime":null,"scheduledTimezone":null,"userContext":{"__typename":"MessageWorkflowContext","canSubmitForReview":null,"canEdit":false,"canRecall":null,"canSubmitForPublication":null,"canReturnToAuthor":null,"canPublish":null,"canReturnToReview":null,"canSchedule":false},"shortScheduledTimezone":null},"readOnly":false,"editFrozen":false,"moderationData":{"__ref":"ModerationData:moderation_data:283650"},"teaser":"","body":"

The BIG-IP local traffic management system includes a feature called rate shaping which allows you to enforce a throughput policy on incoming traffic.  Throughput policies are useful for prioritizing and restricting bandwidth on selected traffic patterns. 

\n

Rate shaping can be useful for an e-commerce site that has preferred clients and would like to offer higher throughput for preferred customers, and lower throughput for other site traffic.

\n

This article will discuss how to create and manage rate classes as well as how to assign them to virtual servers.

\n

The rate shaping feature works by first queuing selected packets under a rate class, and then dequeuing the packets at the indicated rate and in the indicated order specified by the rate class.  A rate class is a rate-shaping policy that defines throughput limitatations and a packet scheduling method to be applied to all traffic handled by that rate class.

\n

Usage

\n

The following code samples will build a PowerShell command line application allowing control over Rate Classes.  This program takes as input the bigip, username, and password as well as a subcommand and optional parameters.  Usage is displayed with the Write-Usage function

\n
\nparam (\n  $g_bigip = $null,\n  $g_uid = $null,\n  $g_pwd = $null,\n  $g_cmd = $null,\n  $g_name = $null,\n  $g_arg1 = $null,\n  $g_arg2 = $null,\n  $g_arg3 = $null,\n  $g_arg4 = $null\n);\n\nSet-PSDebug -strict;\n\n#-------------------------------------------------------------------------\n# function Write-Usage\n#-------------------------------------------------------------------------\nfunction Write-Usage()\n{\n  Write-Host @\"\nUsage: Rateclass.ps1 host uid pwd [options]\n  options\n  -------\n  list\n     - Get a list of rate classess\n  create name rate [UNIT_BPS|UNIT_KBPS|UNIT_MBPS]\n     - Create a Rate class with the given max throughput rates.\n  delete name\n     - Delete the specified rate class.\n  setbaserate name rate [UNIT_BPS|UNIT_KBPS|UNIT_MBPS]\n     - Set the maximum throughput to allot to traffic for this rate class.\n  setburstsize name size\n     - Set the maximum number of bytes that traffic is allowed to burst beyond the base rate.\n  setceilingrate name rate [UNIT_BPS|UNIT_KBPS|UNIT_MBPS]\n     - Set how far beyond the base rate the traffic is allowed to flow when bursting.\n  setdirection name [DIRECTION_ANY|DIRECTION_CLIENT|DIRECTION_SERVER]\n     - Set the direction that the rate class is applied.\n  setparent name parent\n     - Set the parent rate class that this class is allowed to borrow from.\n  setqueuetype name [QUEUE_NONE|QUEUE_STOCHASTIC_FAIR|QUEUE_PRIORITY_FIFO]\n     - Set the type of queue used by the specified rate class.\n  setvsrateclass name virtual\n     - Set the rate class for the specified virtual server.\n  removerateclass name virtual\n     - Remove the rate class from the specified virtual server.\n\"@;\n  exit;\n}
\n

Initialization

\n

As is with all of my iControl PowerShell scripts, validation is made as to whether the iControlSnapin is loaded into the current powershell context.  The Initialize-F5.iControl cmdlet is then called to setup the connection to the BIG-IP for subsequent calls.

\n

The main application logic checks for the passed in command and then passes control to one of the location functions defined below

\n
\nfunction Do-Initialize()\n{\n  if ( (Get-PSSnapin | Where-Object { $_.Name -eq \"iControlSnapIn\"}) -eq $null )\n  {\n    Add-PSSnapIn iControlSnapIn\n  }\n  $success = Initialize-F5.iControl -HostName $g_bigip -Username $g_uid -Password $g_pwd;\n  \n  return $success;\n}\n\nif ( ($g_bigip -eq $null) -or ($g_uid -eq $null) -or ($g_pwd -eq $null) )\n{\n  Write-Usage;\n}\n\nif ( Do-Initialize )\n{\n  switch ($g_cmd)\n  {\n    \"\" {\n      Get-RateClassList;\n    }\n  \"list\" {\n      Get-RateClassList $g_name;\n    }\n    \"create\" {\n      Create-RateClass $g_name $g_arg1 $g_arg2;\n    }\n    \"delete\" {\n      Delete-RateClass $g_name;\n    }\n    \"setbaserate\" {\n      Set-RateClassBaseRate $g_name $g_arg1 $g_arg2;\n    }\n    \"setburstsize\" {\n      Set-RateclassBurstSize $g_name $g_arg1;\n    }\n    \"setceilingrate\" {\n      Set-RateClassCeilingRate $g_name $g_arg1 $g_arg2;\n    }\n    \"setdirection\" {\n      Set-RateClassDirection $g_name $g_arg1;\n    }\n    \"setparent\" {\n      Set-RateClassParent $g_name $g_arg1;\n    }\n    \"setqueuetype\" {\n      Set-RateClassQueueType $g_name $g_arg1;\n    }\n    \"setvsrateclass\" {\n      Set-VirtualServerRateClass $g_name $g_arg1;\n    }\n    \"removevsrateclass\" {\n      Remove-VirtualServerRateClass $g_name $g_arg1;\n    }\n    default {\n      Write-Usage;\n    }\n    \n  }\n}\nelse\n{\n  Write-Error \"ERROR: iControl subsystem not initialized\"\n}
\n

Retrieving Rate Class Information

\n

The following function will either query the information about all the rate classes, or if a rate class name is passed in as an argument, it will get the information for just that one.  All of the configurable attributes will be displayed.  I will discuss each attribute in the following sections below.  Finally after the rate class attributes are displayed, I will do a reverse lookup on the Virtual Servers to see if any of them are using the specific rate class.  If a Virtual Server is configured with the given rate class, it will be displayed to the user as well.  In my example below, you will see that I have no rate classes defined so it will return an empty list.

\n
\nfunction Get-RateClassList()\n{\n  param([string]$rc = $null );\n  if ( $rc )\n  {\n    $rc_list = ,$rc;\n  }\n  else\n  {\n    $rc_list = (Get-F5.iControl).LocalLBRateClass.get_list();\n  }\n  $vs_list = (Get-F5.iControl).LocalLBVirtualServer.get_list();\n  $vsrc_list = (Get-F5.iControl).LocalLBVirtualServer.get_rate_class($vs_list);\n  \n  Write-Host \"Rate Classes:\";\n  if ( $rc_list )\n  {\n    $base_rates = (Get-F5.iControl).LocalLBRateClass.get_base_rate( $rc_list );\n    $burst_sizes = (Get-F5.iControl).LocalLBRateClass.get_burst_size( $rc_list );\n    $ceiling_rates = (Get-F5.iControl).LocalLBRateClass.get_ceiling_rate( $rc_list );\n    $directions = (Get-F5.iControl).LocalLBRateClass.get_direction( $rc_list );\n    $parents = (Get-F5.iControl).LocalLBRateClass.get_parent( $rc_list );\n    $queue_types = (Get-F5.iControl).LocalLBRateClass.get_queue_type( $rc_list );\n    for($i=0; $i -lt $rc_list.Length; $i++)\n    {\n      Write-Host @\"\n--------------------\nRate Class $($rc_list[$i])\n  Base Rate    : $($base_rates[$i].rate) $($base_rates[$i].unit)\n  Burst Size   : $($burst_sizes[$i])\n  Ceiling Rate : $($ceiling_rates[$i].rate) $($ceiling_rates[$i].unit)\n  Direction    : $($directions[$i])\n  Parent       : $($parents[$i])\n  Queue Type   : $($queue_types[$i])\n\"@\n\n  Write-Host \"  Virtuals     :\";\n      for($j=0; $j -lt $vsrc_list.Length; $j++)\n      {\n        if ( $vsrc_list[$j] -eq $rc_list[$i] )\n{\n  Write-Host \"                 $($vs_list[$j])\"\n}\n      }\n    }\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass\nRate Classes:
\n

Creating a Rate Class

\n

The only attribute needed to create a rate class is the base rate unit.  This is defined as a rate value along with a unit of UNIT_BPS, UNIT_KBPS, or UNIT_MBPS for bits per second, kilobits per second, or megabits per second respectively.  The following function takes these values as arguments and then call the iControl.LocalLBRateClass.create method with the rate class name along with the rate unit structure.  In my example below, a rate class named \"myrc\" is created with a base rate of 100 megabits per second.  You'll see the default values for the other attributes below.  Since this is a new rate class, it is not assigned to any virtual servers, so that list will be empty.

\n
\nfunction Create-RateClass()\n{\n  param([string]$name = $null, [int]$rate = 0, [string]$unit = \"UNIT_BPS\");\n  if ( $name -and $rate )\n  {\n    $rateunit = New-Object -TypeName iControl.LocalLBRateClassRateUnit;\n    $rateunit.rate = $rate;\n    $rateunit.unit = $unit;\n    (Get-F5.iControl).LocalLBRateClass.create( (,$name), (,$rateunit) );\n    Write-Host \"Rate Class $name created...\";\n    Get-RateClassList $name;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass create myrc 100 UNIT_MBPS\nRate Classes:\n-------------------\nRate Class myrc\n  Base Rate    : 100 UNIT_MBPS\n  Burst Size   : 0\n  Ceiling Rate : 100 UNIT_MBPS\n  Direction    : DIRECTION_ANY\n  Parent       : \n  Queue Type   : QUEUE_STOCHASTIC_FAIR\n  Virtuals     : 
\n

Deleting a Rate Class

\n

Well, if you want to create a rate class, it make sense that you may want to delete one.  This can be done with the local Delete-RateClass function.  It just takes the name of a rate class and calls the iControl.LocalLBRateClass.delete_rate_class() method.  The Get-RateClass function is then called to list out the remaining rate classes.

\n
\nfunction Delete-RateClass()\n{\n  param([string]$name = $null);\n  if ( $name )\n  {\n    (Get-F5.iControl).LocalLBRateClass.delete_rate_class( (,$name) );\n    Write-Host \"Rate Class $name deleted...\";\n    Get-RateClassList;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass delete myrc\n------------------\nRate Classes:
\n

Assigning the Rate Class Base Rate

\n

The base rate specifies the throughput rate allowed for traffic that the rate class handles.  Packets are generally not allowed to exceed the specified rate.  You can use the iControl.LocalLBRateClass.set_base_rate() method to assign a new base rate to a rate class.  You'll notice that this method is very similar to the create() method illustrated above.  In the below example, I'll change the previously defined base rate of 100 mbps to 100 kbps.  Notice that the base rate is changed but the ceiling rate remains the original value.  To update the ceiling rate, you will need to modify that separately as described below.

\n
\nfunction Set-RateClassBaseRate()\n{\n  param([string]$name = $null, [int]$rate = 0, [string]$unit = \"UNIT_BPS\");\n  if ( $name -and $rate )\n  {\n    $rateunit = New-Object -TypeName iControl.LocalLBRateClassRateUnit;\n    $rateunit.rate = $rate;\n    $rateunit.unit = $unit;\n    (Get-F5.iControl).LocalLBRateClass.set_base_rate( (,$name), (,$rateunit) );\n    Get-RateClassList $name;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass setbaserate 100 UNIT_KBPS\nRate Classes:\n--------------------\nRate Class myrc\n  Base Rate    : 100 UNIT_KBPS\n  Burst Size   : 0\n  Ceiling Rate : 100 UNIT_MBPS\n  Direction    : DIRECTION_ANY\n  Parent       :\n  Queue Type   : QUEUE_STOCHASTIC_FAIR\n  Virtuals     :
\n

 Assigning a Burst Size

\n

The burst size is the maximum number of bytes that traffic is allowed to burst beyond the base rate, before needing to borrow bandwidth.  When this value is set to 0, no bursting is allowed.  You use the burst size setting when you want to allow the rate of traffic flow that  a rate class controls to exceed the base rate.  Exceeding the base rate is known as bursting.  When you configure a rate class to allow bursting, the BIG-IP system saves any unused bandwidth and uses that bandwidth later to enable the rate of traffic to flow to temporarily exceed the base rate.  Specifying a burst size is useful for smoothing out traffic patterns that tend to fluctuate or exceed the base rate such as HTTP traffic.

\n

The following function allows you to set the burst rate (in bytes) by calling the iControl.LocalLBRateClass.set_burst_size() method.  I will set the burst rate to 1000 bytes for the previously defined rate class.

\n
\nfunction Set-RateClassBurstSize()\n{\n  param([string]$name = $null, [int]$size = 0);\n  if ( $name -and $size )\n  {\n    (Get-F5.iControl).LocalLBRateClass.set_burst_size( (,$name), (,$size) );\n    Get-RateClassList $name;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass setburstsize myrc 1000\nRate Classes:\n--------------------\nRate Class myrc\n  Base Rate    : 100 UNIT_KBPS\n  Burst Size   : 1000\n  Ceiling Rate : 100 UNIT_MBPS\n  Direction    : DIRECTION_ANY\n  Parent       :\n  Queue Type   : QUEUE_STOCHASTIC_FAIR\n  Virtuals     :
\n

Setting the Ceiling Rate

\n

The ceiling rate setting specifies the absolute limit at which traffic is allowed to flow when bursting or borrowing.  Just like for the base rate, you can specify the ceiling rate in bits per second, kilobits per second, or megabits per second.  The ceiling rate must be equal to or greater than the base rate.  If the ceiling rate equals the base rate, traffic throughput can never exceed the base rate.

\n

The Set-RateClassCelingRate function takes as input the rate class name along with a ceiling rate and unit and then calls the iControl.LocalLBRateClass.set_ceiling_rate() method with those parameters.  The Get-RateClass function is then called to show that the changes took effect.

\n
\nfunction Set-RateClassCeilingRate()\n{\n  param([string]$name = $null, [int]$rate = 0, [string]$unit = \"UNIT_BPS\");\n  if ( $name -and $rate )\n  {\n    $rateunit = New-Object -TypeName iControl.LocalLBRateClassRateUnit;\n    $rateunit.rate = $rate;\n    $rateunit.unit = $unit;\n    (Get-F5.iControl).LocalLBRateClass.set_ceiling_rate( (,$name), (,$rateunit) );\n    Get-RateClassList $name;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass setceilingrate myrc 1000 UNIT_MBPS\nRate Classes:\n--------------------\nRate Class myrc\n  Base Rate    : 100 UNIT_KBPS\n  Burst Size   : 1000\n  Ceiling Rate : 1000 UNIT_MBPS\n  Direction    : DIRECTION_ANY\n  Parent       :\n  Queue Type   : QUEUE_STOCHASTIC_FAIR\n  Virtuals     :
\n

Setting the Rate Class Direction

\n

Using the direction setting, you can apply a rate class to traffic going to a client, to a server, or to both client and server.   Specifying direction is useful in cases where the nature of traffic is directionally based.  For example, if you offer an FTP service to external clients, you might be more interested in limiting throughput for those clients uploading files to your site than you are for clients downloading files from your site.  In this case, you would want a rate class based on traffic going to your server.

\n

In the following example, I'll change the direction on this rate class from the default value of DIRECTION_ANY to DIRECTION_SERVER to allow this rate class to only work on traffic going to the destination server.

\n
\nfunction Set-RateClassDirection()\n{\n  param([string]$name = $null, [string]$direction = \"DIRECTION_ANY\");\n  if ( $name )\n  {\n    (Get-F5.iControl).LocalLBRateClass.set_direction( (,$name), (,$direction) );\n    Get-RateClassList $name;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass setdirection myrc DIRECTION_SERVER\nRate Classes:\n--------------------\nRate Class myrc\n  Base Rate    : 100 UNIT_KBPS\n  Burst Size   : 1000\n  Ceiling Rate : 1000 UNIT_MBPS\n  Direction    : DIRECTION_SERVER\n  Parent       :\n  Queue Type   : QUEUE_STOCHASTIC_FAIR\n  Virtuals     :
\n

 Assigning a Rate Class Parent Class

\n

When you create a rate class, you can use the Parent Class setting to specify that the rate class has a parent class.  This allows the rate class to borrow unused bandwidth from that parent class.  A child class can borrow unused bandwidth from its parent, but a parent class cannot borrow from a child class.  Borrowing is also not possible between two child classes of the same parent class or between two unrelated rate classes.  A parent class can itself have a parent class, provided that you do not create a circular dependency (ie. when a rate class is direct, or indirect, child of itself).

\n

The following example will set the parent class of the \"myrc\" rate class to the rate class \"baserc\".

\n
\nfunction Set-RateClassParent()\n{\n  param([string]$name = $null, [string]$parent = \"\");\n  if ( $name )\n  {\n    (Get-F5.iControl).LocalLBRateClass.set_parent( (,$name), (,$parent) );\n    Get-RateClassList $name;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass setparent myrc baserc\nRate Classes:\n--------------------\nRate Class myrc\n  Base Rate    : 100 UNIT_KBPS\n  Burst Size   : 1000\n  Ceiling Rate : 1000 UNIT_MBPS\n  Direction    : DIRECTION_SERVER\n  Parent       : baserc\n  Queue Type   : QUEUE_STOCHASTIC_FAIR\n  Virtuals     :
\n

Setting the Queue Type

\n

The Queue Type (or Queue Discipline) setting determines the method and order in which the BIG-IP system dequeues packets.  The type can be QUEUE_STOCHASTIC_FAIR or QUEUE_PRIORITY_FIFO. 

\n

Stochastic Fair Queuing is a queueing method that queues traffic under a set of many lists, choosing the specific list based on a periodically changing hash of the connection information.  This results in traffic from the same connection always being queued in the same list.  It then dequeues traffic from the set of lists in a round-robin fashion.  The overall effect is that fairness of dequeueing is achieved because one high-speed connection cannot monopolize the queue at the expense of slower connections.

\n

Priority FIFO is a queueing method that queues all trafffic under a set of five lists based on the Type of Service (ToS) field of the traffic.  Four of the lists correspond to the four possible ToS values (Minimum delay, Maximum througput, Maximum reliability, and Minimum cost).  the fifth list represents traffic with no ToS value.  The PFIFO method then processes these five lists in a way that attempts to preserve the meaning of the ToS field as much as possible.

\n

In the following example, I'll set the queue type of the myrc rate class from the default QUEUE_STOCHASTIC_FAIR to QUEUE_PRIORITY_FIFO with the local Set-RateClassQueueType function.  This calls the iControl.LocalLBRateClass.set_queue_type() method.

\n
\nfunction Set-RateClassQueueType()\n{\n  param([string]$name = $null, [string]$type = \"QUEUE_STOCHASTIC_FAIR\");\n  if ( $name )\n  {\n    (Get-F5.iControl).LocalLBRateClass.set_queue_type( (,$name), (,$type) );\n    Get-RateClassList $name;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass setqueuetype myrc QUEUE_PRIORITY_FIFO\nRate Classes:\n--------------------\nRate Class myrc\n  Base Rate    : 100 UNIT_KBPS\n  Burst Size   : 1000\n  Ceiling Rate : 1000 UNIT_MBPS\n  Direction    : DIRECTION_SERVER\n  Parent       : baserc\n  Queue Type   : QUEUE_PRIORITY_FIFO\n  Virtuals     :
\n

 Assigning a Rate Class to a Virtual Server

\n

Having a rate class is good and all, but it doesn't really do anything until you allow traffic to pass through it.  This can be done by assigning it as an attriute to a Virtual Server.  The iControl.LocalLBVirtualServer.set_rate_class() takes a list of virtual server name and the corresponding rate class names to assign to those virtual servers.  The following example will assign the \"myrc\" rate class to the Virtual Server \"xpbert-http\".  After the call is made, you will see in the listing that the reverse lookup through the virtual servers showed this rate class was applied to virtual server xpbert-http.

\n
\nfunction Set-VirtualServerRateClass()\n{\n  param([string]$name = $null, [string]$vs = $null);\n  if ( $name )\n  {\n    (Get-F5.iControl).LocalLBVirtualServer.set_rate_class( (,$vs), (,$name) );\n    Get-RateClassList $name;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass setvsrateclass myrc xpbert-http\nRate Classes:\n--------------------\nRate Class myrc\n  Base Rate    : 100 UNIT_KBPS\n  Burst Size   : 1000\n  Ceiling Rate : 1000 UNIT_MBPS\n  Direction    : DIRECTION_SERVER\n  Parent       : baserc\n  Queue Type   : QUEUE_PRIORITY_FIFO\n  Virtuals     :\n                 xpbert-http
\n

 Removing a Rate Class from a Virtual Server

\n

There is no corresponding remove_rate_class method in the LocalLBVirtualServer interface.  Instead, if you want to remove the rate class, you just pass in an empty string for the rate class name to the set_rate_class() method.  The following example will remove the rate class \"myrc\" from virtual server \"xpbert-http\";

\n
\nfunction Remove-VirtualServerRateClass()\n{\n  param([string]$name = $null, [string]$vs = $null);\n  if ( $name )\n  {\n    (Get-F5.iControl).LocalLBVirtualServer.set_rate_class( (,$vs), (,\"\") );\n    Get-RateClassList $name;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass removevsrateclass myrc xpbert-http\nRate Classes:\n--------------------\nRate Class myrc\n  Base Rate    : 100 UNIT_KBPS\n  Burst Size   : 1000\n  Ceiling Rate : 1000 UNIT_MBPS\n  Direction    : DIRECTION_SERVER\n  Parent       : baserc\n  Queue Type   : QUEUE_PRIORITY_FIFO\n  Virtuals     :
\n

Conclusion

\n

You know have all the tools you need to create, modify, and apply a rate class to start controlling the traffic flow to and from your servers.

\n

The code for this article can be found under the PsRateClass entry in the iControl CodeShare.

\n
\n
Get the Flash Player to see this player.
\n\n
20090122-iControl101_22_RateClass.mp3
\n
","body@stringLength":"22318","rawBody":"

The BIG-IP local traffic management system includes a feature called rate shaping which allows you to enforce a throughput policy on incoming traffic.  Throughput policies are useful for prioritizing and restricting bandwidth on selected traffic patterns. 

\n

Rate shaping can be useful for an e-commerce site that has preferred clients and would like to offer higher throughput for preferred customers, and lower throughput for other site traffic.

\n

This article will discuss how to create and manage rate classes as well as how to assign them to virtual servers.

\n

The rate shaping feature works by first queuing selected packets under a rate class, and then dequeuing the packets at the indicated rate and in the indicated order specified by the rate class.  A rate class is a rate-shaping policy that defines throughput limitatations and a packet scheduling method to be applied to all traffic handled by that rate class.

\n

Usage

\n

The following code samples will build a PowerShell command line application allowing control over Rate Classes.  This program takes as input the bigip, username, and password as well as a subcommand and optional parameters.  Usage is displayed with the Write-Usage function

\n
\nparam (\n  $g_bigip = $null,\n  $g_uid = $null,\n  $g_pwd = $null,\n  $g_cmd = $null,\n  $g_name = $null,\n  $g_arg1 = $null,\n  $g_arg2 = $null,\n  $g_arg3 = $null,\n  $g_arg4 = $null\n);\n\nSet-PSDebug -strict;\n\n#-------------------------------------------------------------------------\n# function Write-Usage\n#-------------------------------------------------------------------------\nfunction Write-Usage()\n{\n  Write-Host @\"\nUsage: Rateclass.ps1 host uid pwd [options]\n  options\n  -------\n  list\n     - Get a list of rate classess\n  create name rate [UNIT_BPS|UNIT_KBPS|UNIT_MBPS]\n     - Create a Rate class with the given max throughput rates.\n  delete name\n     - Delete the specified rate class.\n  setbaserate name rate [UNIT_BPS|UNIT_KBPS|UNIT_MBPS]\n     - Set the maximum throughput to allot to traffic for this rate class.\n  setburstsize name size\n     - Set the maximum number of bytes that traffic is allowed to burst beyond the base rate.\n  setceilingrate name rate [UNIT_BPS|UNIT_KBPS|UNIT_MBPS]\n     - Set how far beyond the base rate the traffic is allowed to flow when bursting.\n  setdirection name [DIRECTION_ANY|DIRECTION_CLIENT|DIRECTION_SERVER]\n     - Set the direction that the rate class is applied.\n  setparent name parent\n     - Set the parent rate class that this class is allowed to borrow from.\n  setqueuetype name [QUEUE_NONE|QUEUE_STOCHASTIC_FAIR|QUEUE_PRIORITY_FIFO]\n     - Set the type of queue used by the specified rate class.\n  setvsrateclass name virtual\n     - Set the rate class for the specified virtual server.\n  removerateclass name virtual\n     - Remove the rate class from the specified virtual server.\n\"@;\n  exit;\n}
\n

Initialization

\n

As is with all of my iControl PowerShell scripts, validation is made as to whether the iControlSnapin is loaded into the current powershell context.  The Initialize-F5.iControl cmdlet is then called to setup the connection to the BIG-IP for subsequent calls.

\n

The main application logic checks for the passed in command and then passes control to one of the location functions defined below

\n
\nfunction Do-Initialize()\n{\n  if ( (Get-PSSnapin | Where-Object { $_.Name -eq \"iControlSnapIn\"}) -eq $null )\n  {\n    Add-PSSnapIn iControlSnapIn\n  }\n  $success = Initialize-F5.iControl -HostName $g_bigip -Username $g_uid -Password $g_pwd;\n  \n  return $success;\n}\n\nif ( ($g_bigip -eq $null) -or ($g_uid -eq $null) -or ($g_pwd -eq $null) )\n{\n  Write-Usage;\n}\n\nif ( Do-Initialize )\n{\n  switch ($g_cmd)\n  {\n    \"\" {\n      Get-RateClassList;\n    }\n  \"list\" {\n      Get-RateClassList $g_name;\n    }\n    \"create\" {\n      Create-RateClass $g_name $g_arg1 $g_arg2;\n    }\n    \"delete\" {\n      Delete-RateClass $g_name;\n    }\n    \"setbaserate\" {\n      Set-RateClassBaseRate $g_name $g_arg1 $g_arg2;\n    }\n    \"setburstsize\" {\n      Set-RateclassBurstSize $g_name $g_arg1;\n    }\n    \"setceilingrate\" {\n      Set-RateClassCeilingRate $g_name $g_arg1 $g_arg2;\n    }\n    \"setdirection\" {\n      Set-RateClassDirection $g_name $g_arg1;\n    }\n    \"setparent\" {\n      Set-RateClassParent $g_name $g_arg1;\n    }\n    \"setqueuetype\" {\n      Set-RateClassQueueType $g_name $g_arg1;\n    }\n    \"setvsrateclass\" {\n      Set-VirtualServerRateClass $g_name $g_arg1;\n    }\n    \"removevsrateclass\" {\n      Remove-VirtualServerRateClass $g_name $g_arg1;\n    }\n    default {\n      Write-Usage;\n    }\n    \n  }\n}\nelse\n{\n  Write-Error \"ERROR: iControl subsystem not initialized\"\n}
\n

Retrieving Rate Class Information

\n

The following function will either query the information about all the rate classes, or if a rate class name is passed in as an argument, it will get the information for just that one.  All of the configurable attributes will be displayed.  I will discuss each attribute in the following sections below.  Finally after the rate class attributes are displayed, I will do a reverse lookup on the Virtual Servers to see if any of them are using the specific rate class.  If a Virtual Server is configured with the given rate class, it will be displayed to the user as well.  In my example below, you will see that I have no rate classes defined so it will return an empty list.

\n
\nfunction Get-RateClassList()\n{\n  param([string]$rc = $null );\n  if ( $rc )\n  {\n    $rc_list = ,$rc;\n  }\n  else\n  {\n    $rc_list = (Get-F5.iControl).LocalLBRateClass.get_list();\n  }\n  $vs_list = (Get-F5.iControl).LocalLBVirtualServer.get_list();\n  $vsrc_list = (Get-F5.iControl).LocalLBVirtualServer.get_rate_class($vs_list);\n  \n  Write-Host \"Rate Classes:\";\n  if ( $rc_list )\n  {\n    $base_rates = (Get-F5.iControl).LocalLBRateClass.get_base_rate( $rc_list );\n    $burst_sizes = (Get-F5.iControl).LocalLBRateClass.get_burst_size( $rc_list );\n    $ceiling_rates = (Get-F5.iControl).LocalLBRateClass.get_ceiling_rate( $rc_list );\n    $directions = (Get-F5.iControl).LocalLBRateClass.get_direction( $rc_list );\n    $parents = (Get-F5.iControl).LocalLBRateClass.get_parent( $rc_list );\n    $queue_types = (Get-F5.iControl).LocalLBRateClass.get_queue_type( $rc_list );\n    for($i=0; $i -lt $rc_list.Length; $i++)\n    {\n      Write-Host @\"\n--------------------\nRate Class $($rc_list[$i])\n  Base Rate    : $($base_rates[$i].rate) $($base_rates[$i].unit)\n  Burst Size   : $($burst_sizes[$i])\n  Ceiling Rate : $($ceiling_rates[$i].rate) $($ceiling_rates[$i].unit)\n  Direction    : $($directions[$i])\n  Parent       : $($parents[$i])\n  Queue Type   : $($queue_types[$i])\n\"@\n\n  Write-Host \"  Virtuals     :\";\n      for($j=0; $j -lt $vsrc_list.Length; $j++)\n      {\n        if ( $vsrc_list[$j] -eq $rc_list[$i] )\n{\n  Write-Host \"                 $($vs_list[$j])\"\n}\n      }\n    }\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass\nRate Classes:
\n

Creating a Rate Class

\n

The only attribute needed to create a rate class is the base rate unit.  This is defined as a rate value along with a unit of UNIT_BPS, UNIT_KBPS, or UNIT_MBPS for bits per second, kilobits per second, or megabits per second respectively.  The following function takes these values as arguments and then call the iControl.LocalLBRateClass.create method with the rate class name along with the rate unit structure.  In my example below, a rate class named \"myrc\" is created with a base rate of 100 megabits per second.  You'll see the default values for the other attributes below.  Since this is a new rate class, it is not assigned to any virtual servers, so that list will be empty.

\n
\nfunction Create-RateClass()\n{\n  param([string]$name = $null, [int]$rate = 0, [string]$unit = \"UNIT_BPS\");\n  if ( $name -and $rate )\n  {\n    $rateunit = New-Object -TypeName iControl.LocalLBRateClassRateUnit;\n    $rateunit.rate = $rate;\n    $rateunit.unit = $unit;\n    (Get-F5.iControl).LocalLBRateClass.create( (,$name), (,$rateunit) );\n    Write-Host \"Rate Class $name created...\";\n    Get-RateClassList $name;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass create myrc 100 UNIT_MBPS\nRate Classes:\n-------------------\nRate Class myrc\n  Base Rate    : 100 UNIT_MBPS\n  Burst Size   : 0\n  Ceiling Rate : 100 UNIT_MBPS\n  Direction    : DIRECTION_ANY\n  Parent       : \n  Queue Type   : QUEUE_STOCHASTIC_FAIR\n  Virtuals     : 
\n

Deleting a Rate Class

\n

Well, if you want to create a rate class, it make sense that you may want to delete one.  This can be done with the local Delete-RateClass function.  It just takes the name of a rate class and calls the iControl.LocalLBRateClass.delete_rate_class() method.  The Get-RateClass function is then called to list out the remaining rate classes.

\n
\nfunction Delete-RateClass()\n{\n  param([string]$name = $null);\n  if ( $name )\n  {\n    (Get-F5.iControl).LocalLBRateClass.delete_rate_class( (,$name) );\n    Write-Host \"Rate Class $name deleted...\";\n    Get-RateClassList;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass delete myrc\n------------------\nRate Classes:
\n

Assigning the Rate Class Base Rate

\n

The base rate specifies the throughput rate allowed for traffic that the rate class handles.  Packets are generally not allowed to exceed the specified rate.  You can use the iControl.LocalLBRateClass.set_base_rate() method to assign a new base rate to a rate class.  You'll notice that this method is very similar to the create() method illustrated above.  In the below example, I'll change the previously defined base rate of 100 mbps to 100 kbps.  Notice that the base rate is changed but the ceiling rate remains the original value.  To update the ceiling rate, you will need to modify that separately as described below.

\n
\nfunction Set-RateClassBaseRate()\n{\n  param([string]$name = $null, [int]$rate = 0, [string]$unit = \"UNIT_BPS\");\n  if ( $name -and $rate )\n  {\n    $rateunit = New-Object -TypeName iControl.LocalLBRateClassRateUnit;\n    $rateunit.rate = $rate;\n    $rateunit.unit = $unit;\n    (Get-F5.iControl).LocalLBRateClass.set_base_rate( (,$name), (,$rateunit) );\n    Get-RateClassList $name;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass setbaserate 100 UNIT_KBPS\nRate Classes:\n--------------------\nRate Class myrc\n  Base Rate    : 100 UNIT_KBPS\n  Burst Size   : 0\n  Ceiling Rate : 100 UNIT_MBPS\n  Direction    : DIRECTION_ANY\n  Parent       :\n  Queue Type   : QUEUE_STOCHASTIC_FAIR\n  Virtuals     :
\n

 Assigning a Burst Size

\n

The burst size is the maximum number of bytes that traffic is allowed to burst beyond the base rate, before needing to borrow bandwidth.  When this value is set to 0, no bursting is allowed.  You use the burst size setting when you want to allow the rate of traffic flow that  a rate class controls to exceed the base rate.  Exceeding the base rate is known as bursting.  When you configure a rate class to allow bursting, the BIG-IP system saves any unused bandwidth and uses that bandwidth later to enable the rate of traffic to flow to temporarily exceed the base rate.  Specifying a burst size is useful for smoothing out traffic patterns that tend to fluctuate or exceed the base rate such as HTTP traffic.

\n

The following function allows you to set the burst rate (in bytes) by calling the iControl.LocalLBRateClass.set_burst_size() method.  I will set the burst rate to 1000 bytes for the previously defined rate class.

\n
\nfunction Set-RateClassBurstSize()\n{\n  param([string]$name = $null, [int]$size = 0);\n  if ( $name -and $size )\n  {\n    (Get-F5.iControl).LocalLBRateClass.set_burst_size( (,$name), (,$size) );\n    Get-RateClassList $name;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass setburstsize myrc 1000\nRate Classes:\n--------------------\nRate Class myrc\n  Base Rate    : 100 UNIT_KBPS\n  Burst Size   : 1000\n  Ceiling Rate : 100 UNIT_MBPS\n  Direction    : DIRECTION_ANY\n  Parent       :\n  Queue Type   : QUEUE_STOCHASTIC_FAIR\n  Virtuals     :
\n

Setting the Ceiling Rate

\n

The ceiling rate setting specifies the absolute limit at which traffic is allowed to flow when bursting or borrowing.  Just like for the base rate, you can specify the ceiling rate in bits per second, kilobits per second, or megabits per second.  The ceiling rate must be equal to or greater than the base rate.  If the ceiling rate equals the base rate, traffic throughput can never exceed the base rate.

\n

The Set-RateClassCelingRate function takes as input the rate class name along with a ceiling rate and unit and then calls the iControl.LocalLBRateClass.set_ceiling_rate() method with those parameters.  The Get-RateClass function is then called to show that the changes took effect.

\n
\nfunction Set-RateClassCeilingRate()\n{\n  param([string]$name = $null, [int]$rate = 0, [string]$unit = \"UNIT_BPS\");\n  if ( $name -and $rate )\n  {\n    $rateunit = New-Object -TypeName iControl.LocalLBRateClassRateUnit;\n    $rateunit.rate = $rate;\n    $rateunit.unit = $unit;\n    (Get-F5.iControl).LocalLBRateClass.set_ceiling_rate( (,$name), (,$rateunit) );\n    Get-RateClassList $name;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass setceilingrate myrc 1000 UNIT_MBPS\nRate Classes:\n--------------------\nRate Class myrc\n  Base Rate    : 100 UNIT_KBPS\n  Burst Size   : 1000\n  Ceiling Rate : 1000 UNIT_MBPS\n  Direction    : DIRECTION_ANY\n  Parent       :\n  Queue Type   : QUEUE_STOCHASTIC_FAIR\n  Virtuals     :
\n

Setting the Rate Class Direction

\n

Using the direction setting, you can apply a rate class to traffic going to a client, to a server, or to both client and server.   Specifying direction is useful in cases where the nature of traffic is directionally based.  For example, if you offer an FTP service to external clients, you might be more interested in limiting throughput for those clients uploading files to your site than you are for clients downloading files from your site.  In this case, you would want a rate class based on traffic going to your server.

\n

In the following example, I'll change the direction on this rate class from the default value of DIRECTION_ANY to DIRECTION_SERVER to allow this rate class to only work on traffic going to the destination server.

\n
\nfunction Set-RateClassDirection()\n{\n  param([string]$name = $null, [string]$direction = \"DIRECTION_ANY\");\n  if ( $name )\n  {\n    (Get-F5.iControl).LocalLBRateClass.set_direction( (,$name), (,$direction) );\n    Get-RateClassList $name;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass setdirection myrc DIRECTION_SERVER\nRate Classes:\n--------------------\nRate Class myrc\n  Base Rate    : 100 UNIT_KBPS\n  Burst Size   : 1000\n  Ceiling Rate : 1000 UNIT_MBPS\n  Direction    : DIRECTION_SERVER\n  Parent       :\n  Queue Type   : QUEUE_STOCHASTIC_FAIR\n  Virtuals     :
\n

 Assigning a Rate Class Parent Class

\n

When you create a rate class, you can use the Parent Class setting to specify that the rate class has a parent class.  This allows the rate class to borrow unused bandwidth from that parent class.  A child class can borrow unused bandwidth from its parent, but a parent class cannot borrow from a child class.  Borrowing is also not possible between two child classes of the same parent class or between two unrelated rate classes.  A parent class can itself have a parent class, provided that you do not create a circular dependency (ie. when a rate class is direct, or indirect, child of itself).

\n

The following example will set the parent class of the \"myrc\" rate class to the rate class \"baserc\".

\n
\nfunction Set-RateClassParent()\n{\n  param([string]$name = $null, [string]$parent = \"\");\n  if ( $name )\n  {\n    (Get-F5.iControl).LocalLBRateClass.set_parent( (,$name), (,$parent) );\n    Get-RateClassList $name;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass setparent myrc baserc\nRate Classes:\n--------------------\nRate Class myrc\n  Base Rate    : 100 UNIT_KBPS\n  Burst Size   : 1000\n  Ceiling Rate : 1000 UNIT_MBPS\n  Direction    : DIRECTION_SERVER\n  Parent       : baserc\n  Queue Type   : QUEUE_STOCHASTIC_FAIR\n  Virtuals     :
\n

Setting the Queue Type

\n

The Queue Type (or Queue Discipline) setting determines the method and order in which the BIG-IP system dequeues packets.  The type can be QUEUE_STOCHASTIC_FAIR or QUEUE_PRIORITY_FIFO. 

\n

Stochastic Fair Queuing is a queueing method that queues traffic under a set of many lists, choosing the specific list based on a periodically changing hash of the connection information.  This results in traffic from the same connection always being queued in the same list.  It then dequeues traffic from the set of lists in a round-robin fashion.  The overall effect is that fairness of dequeueing is achieved because one high-speed connection cannot monopolize the queue at the expense of slower connections.

\n

Priority FIFO is a queueing method that queues all trafffic under a set of five lists based on the Type of Service (ToS) field of the traffic.  Four of the lists correspond to the four possible ToS values (Minimum delay, Maximum througput, Maximum reliability, and Minimum cost).  the fifth list represents traffic with no ToS value.  The PFIFO method then processes these five lists in a way that attempts to preserve the meaning of the ToS field as much as possible.

\n

In the following example, I'll set the queue type of the myrc rate class from the default QUEUE_STOCHASTIC_FAIR to QUEUE_PRIORITY_FIFO with the local Set-RateClassQueueType function.  This calls the iControl.LocalLBRateClass.set_queue_type() method.

\n
\nfunction Set-RateClassQueueType()\n{\n  param([string]$name = $null, [string]$type = \"QUEUE_STOCHASTIC_FAIR\");\n  if ( $name )\n  {\n    (Get-F5.iControl).LocalLBRateClass.set_queue_type( (,$name), (,$type) );\n    Get-RateClassList $name;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass setqueuetype myrc QUEUE_PRIORITY_FIFO\nRate Classes:\n--------------------\nRate Class myrc\n  Base Rate    : 100 UNIT_KBPS\n  Burst Size   : 1000\n  Ceiling Rate : 1000 UNIT_MBPS\n  Direction    : DIRECTION_SERVER\n  Parent       : baserc\n  Queue Type   : QUEUE_PRIORITY_FIFO\n  Virtuals     :
\n

 Assigning a Rate Class to a Virtual Server

\n

Having a rate class is good and all, but it doesn't really do anything until you allow traffic to pass through it.  This can be done by assigning it as an attriute to a Virtual Server.  The iControl.LocalLBVirtualServer.set_rate_class() takes a list of virtual server name and the corresponding rate class names to assign to those virtual servers.  The following example will assign the \"myrc\" rate class to the Virtual Server \"xpbert-http\".  After the call is made, you will see in the listing that the reverse lookup through the virtual servers showed this rate class was applied to virtual server xpbert-http.

\n
\nfunction Set-VirtualServerRateClass()\n{\n  param([string]$name = $null, [string]$vs = $null);\n  if ( $name )\n  {\n    (Get-F5.iControl).LocalLBVirtualServer.set_rate_class( (,$vs), (,$name) );\n    Get-RateClassList $name;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass setvsrateclass myrc xpbert-http\nRate Classes:\n--------------------\nRate Class myrc\n  Base Rate    : 100 UNIT_KBPS\n  Burst Size   : 1000\n  Ceiling Rate : 1000 UNIT_MBPS\n  Direction    : DIRECTION_SERVER\n  Parent       : baserc\n  Queue Type   : QUEUE_PRIORITY_FIFO\n  Virtuals     :\n                 xpbert-http
\n

 Removing a Rate Class from a Virtual Server

\n

There is no corresponding remove_rate_class method in the LocalLBVirtualServer interface.  Instead, if you want to remove the rate class, you just pass in an empty string for the rate class name to the set_rate_class() method.  The following example will remove the rate class \"myrc\" from virtual server \"xpbert-http\";

\n
\nfunction Remove-VirtualServerRateClass()\n{\n  param([string]$name = $null, [string]$vs = $null);\n  if ( $name )\n  {\n    (Get-F5.iControl).LocalLBVirtualServer.set_rate_class( (,$vs), (,\"\") );\n    Get-RateClassList $name;\n  }\n}
\n
\nPS C:\\> .\\PsRateClass.ps1 bigip user pass removevsrateclass myrc xpbert-http\nRate Classes:\n--------------------\nRate Class myrc\n  Base Rate    : 100 UNIT_KBPS\n  Burst Size   : 1000\n  Ceiling Rate : 1000 UNIT_MBPS\n  Direction    : DIRECTION_SERVER\n  Parent       : baserc\n  Queue Type   : QUEUE_PRIORITY_FIFO\n  Virtuals     :
\n

Conclusion

\n

You know have all the tools you need to create, modify, and apply a rate class to start controlling the traffic flow to and from your servers.

\n

The code for this article can be found under the PsRateClass entry in the iControl CodeShare.

\n
\n
Get the Flash Player to see this player.
\n\n
20090122-iControl101_22_RateClass.mp3
\n
","kudosSumWeight":0,"postTime":"2009-01-22T07:32:00.000-08:00","images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"attachments":{"__typename":"AttachmentConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"tags":{"__typename":"TagConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":true,"endCursor":"MjUuMnwyLjF8b3wxMHxfTlZffDEw","hasPreviousPage":false,"startCursor":null},"edges":[{"__typename":"TagEdge","cursor":"MjUuMnwyLjF8b3wxMHxfTlZffDE","node":{"__typename":"Tag","id":"tag:101","text":"101","time":"2022-01-24T02:30:16.258-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuMnwyLjF8b3wxMHxfTlZffDI","node":{"__typename":"Tag","id":"tag:application delivery","text":"application delivery","time":"2021-06-30T01:48:44.000-07:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuMnwyLjF8b3wxMHxfTlZffDM","node":{"__typename":"Tag","id":"tag:automation","text":"automation","time":"2022-01-24T02:29:57.146-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuMnwyLjF8b3wxMHxfTlZffDQ","node":{"__typename":"Tag","id":"tag:basic","text":"basic","time":"2022-01-24T02:29:45.455-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuMnwyLjF8b3wxMHxfTlZffDU","node":{"__typename":"Tag","id":"tag:dev","text":"dev","time":"2022-01-24T02:29:45.108-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuMnwyLjF8b3wxMHxfTlZffDY","node":{"__typename":"Tag","id":"tag:devops","text":"devops","time":"2011-10-19T17:50:55.000-07:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuMnwyLjF8b3wxMHxfTlZffDc","node":{"__typename":"Tag","id":"tag:events","text":"events","time":"2023-02-15T15:57:15.291-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuMnwyLjF8b3wxMHxfTlZffDg","node":{"__typename":"Tag","id":"tag:getting started","text":"getting started","time":"2022-01-24T02:29:45.456-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuMnwyLjF8b3wxMHxfTlZffDk","node":{"__typename":"Tag","id":"tag:iControl","text":"iControl","time":"2022-01-24T02:29:45.068-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuMnwyLjF8b3wxMHxfTlZffDEw","node":{"__typename":"Tag","id":"tag:iRules","text":"iRules","time":"2022-01-24T02:29:45.106-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}}]},"timeToRead":11,"rawTeaser":"","introduction":"","currentRevision":{"__ref":"Revision:revision:283650_1"},"latestVersion":{"__typename":"FriendlyVersion","major":"1","minor":"0"},"metrics":{"__typename":"MessageMetrics","views":652},"visibilityScope":"PUBLIC","canonicalUrl":null,"seoTitle":null,"seoDescription":null,"placeholder":false,"originalMessageForPlaceholder":null,"contributors":{"__typename":"UserConnection","edges":[]},"nonCoAuthorContributors":{"__typename":"UserConnection","edges":[]},"coAuthors":{"__typename":"UserConnection","edges":[{"__typename":"UserEdge","node":{"__ref":"User:user:106220"}}]},"tkbMessagePolicies":{"__typename":"TkbMessagePolicies","canDoAuthoringActionsOnTkb":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.tkb.policy_can_do_authoring_action.accessDenied","key":"error.lithium.policies.tkb.policy_can_do_authoring_action.accessDenied","args":[]}}},"archivalData":null,"replies":{"__typename":"MessageConnection","edges":[{"__typename":"MessageEdge","cursor":"MjUuMnwyLjF8aXwxMHwzOToxfGludCwyODM2NTEsMjgzNjUx","node":{"__ref":"TkbReplyMessage:message:283651"}}],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[],"revisions({\"constraints\":{\"isPublished\":{\"eq\":true}},\"first\":1})":{"__typename":"RevisionConnection","totalCount":1}},"Conversation:conversation:283650":{"__typename":"Conversation","id":"conversation:283650","solved":false,"topic":{"__ref":"TkbTopicMessage:message:283650"},"lastPostingActivityTime":"2014-09-01T03:04:16.000-07:00","lastPostTime":"2014-09-01T03:04:16.000-07:00","unreadReplyCount":1,"isSubscribed":false},"ModerationData:moderation_data:283650":{"__typename":"ModerationData","id":"moderation_data:283650","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"Revision:revision:283650_1":{"__typename":"Revision","id":"revision:283650_1","lastEditTime":"2009-01-22T07:32:00.000-08:00"},"CachedAsset:theme:customTheme1-1742465118109":{"__typename":"CachedAsset","id":"theme:customTheme1-1742465118109","value":{"id":"customTheme1","animation":{"fast":"150ms","normal":"250ms","slow":"500ms","slowest":"750ms","function":"cubic-bezier(0.07, 0.91, 0.51, 1)","__typename":"AnimationThemeSettings"},"avatar":{"borderRadius":"50%","collections":["custom"],"__typename":"AvatarThemeSettings"},"basics":{"browserIcon":{"imageAssetName":"JimmyPackets-512-1702592938213.png","imageLastModified":"1702592945815","__typename":"ThemeAsset"},"customerLogo":{"imageAssetName":"f5_logo_fix-1704824537976.svg","imageLastModified":"1704824540697","__typename":"ThemeAsset"},"maximumWidthOfPageContent":"1600px","oneColumnNarrowWidth":"800px","gridGutterWidthMd":"30px","gridGutterWidthXs":"10px","pageWidthStyle":"WIDTH_OF_PAGE_CONTENT","__typename":"BasicsThemeSettings"},"buttons":{"borderRadiusSm":"5px","borderRadius":"5px","borderRadiusLg":"5px","paddingY":"5px","paddingYLg":"7px","paddingYHero":"var(--lia-bs-btn-padding-y-lg)","paddingX":"12px","paddingXLg":"14px","paddingXHero":"42px","fontStyle":"NORMAL","fontWeight":"400","textTransform":"NONE","disabledOpacity":0.5,"primaryTextColor":"var(--lia-bs-white)","primaryTextHoverColor":"var(--lia-bs-white)","primaryTextActiveColor":"var(--lia-bs-white)","primaryBgColor":"var(--lia-bs-primary)","primaryBgHoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.85))","primaryBgActiveColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.7))","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","primaryBorderActive":"1px solid transparent","primaryBorderFocus":"1px solid var(--lia-bs-white)","primaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","secondaryTextColor":"var(--lia-bs-gray-900)","secondaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","secondaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","secondaryBgColor":"var(--lia-bs-gray-400)","secondaryBgHoverColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.96))","secondaryBgActiveColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.92))","secondaryBorder":"1px solid transparent","secondaryBorderHover":"1px solid transparent","secondaryBorderActive":"1px solid transparent","secondaryBorderFocus":"1px solid transparent","secondaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","tertiaryTextColor":"var(--lia-bs-gray-900)","tertiaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","tertiaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","tertiaryBgColor":"transparent","tertiaryBgHoverColor":"transparent","tertiaryBgActiveColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.04)","tertiaryBorder":"1px solid transparent","tertiaryBorderHover":"1px solid hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","tertiaryBorderActive":"1px solid transparent","tertiaryBorderFocus":"1px solid transparent","tertiaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","destructiveTextColor":"var(--lia-bs-danger)","destructiveTextHoverColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.95))","destructiveTextActiveColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.9))","destructiveBgColor":"var(--lia-bs-gray-300)","destructiveBgHoverColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.96))","destructiveBgActiveColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.92))","destructiveBorder":"1px solid transparent","destructiveBorderHover":"1px solid transparent","destructiveBorderActive":"1px solid transparent","destructiveBorderFocus":"1px solid transparent","destructiveBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","__typename":"ButtonsThemeSettings"},"border":{"color":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","mainContent":"NONE","sideContent":"NONE","radiusSm":"3px","radius":"5px","radiusLg":"9px","radius50":"100vw","__typename":"BorderThemeSettings"},"boxShadow":{"xs":"0 0 0 1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08), 0 3px 0 -1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08)","sm":"0 2px 4px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.06)","md":"0 5px 15px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","lg":"0 10px 30px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","__typename":"BoxShadowThemeSettings"},"cards":{"bgColor":"var(--lia-panel-bg-color)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":"var(--lia-box-shadow-xs)","__typename":"CardsThemeSettings"},"chip":{"maxWidth":"300px","height":"30px","__typename":"ChipThemeSettings"},"coreTypes":{"defaultMessageLinkColor":"var(--lia-bs-primary)","defaultMessageLinkDecoration":"none","defaultMessageLinkFontStyle":"NORMAL","defaultMessageLinkFontWeight":"400","defaultMessageFontStyle":"NORMAL","defaultMessageFontWeight":"400","forumColor":"#0C5C8D","forumFontFamily":"var(--lia-bs-font-family-base)","forumFontWeight":"var(--lia-default-message-font-weight)","forumLineHeight":"var(--lia-bs-line-height-base)","forumFontStyle":"var(--lia-default-message-font-style)","forumMessageLinkColor":"var(--lia-default-message-link-color)","forumMessageLinkDecoration":"var(--lia-default-message-link-decoration)","forumMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","forumMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","forumSolvedColor":"#62C026","blogColor":"#730015","blogFontFamily":"var(--lia-bs-font-family-base)","blogFontWeight":"var(--lia-default-message-font-weight)","blogLineHeight":"1.75","blogFontStyle":"var(--lia-default-message-font-style)","blogMessageLinkColor":"var(--lia-default-message-link-color)","blogMessageLinkDecoration":"var(--lia-default-message-link-decoration)","blogMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","blogMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","tkbColor":"#C20025","tkbFontFamily":"var(--lia-bs-font-family-base)","tkbFontWeight":"var(--lia-default-message-font-weight)","tkbLineHeight":"1.75","tkbFontStyle":"var(--lia-default-message-font-style)","tkbMessageLinkColor":"var(--lia-default-message-link-color)","tkbMessageLinkDecoration":"var(--lia-default-message-link-decoration)","tkbMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","tkbMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaColor":"#4099E2","qandaFontFamily":"var(--lia-bs-font-family-base)","qandaFontWeight":"var(--lia-default-message-font-weight)","qandaLineHeight":"var(--lia-bs-line-height-base)","qandaFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkColor":"var(--lia-default-message-link-color)","qandaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","qandaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaSolvedColor":"#3FA023","ideaColor":"#F3704B","ideaFontFamily":"var(--lia-bs-font-family-base)","ideaFontWeight":"var(--lia-default-message-font-weight)","ideaLineHeight":"var(--lia-bs-line-height-base)","ideaFontStyle":"var(--lia-default-message-font-style)","ideaMessageLinkColor":"var(--lia-default-message-link-color)","ideaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","ideaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","ideaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","contestColor":"#FCC845","contestFontFamily":"var(--lia-bs-font-family-base)","contestFontWeight":"var(--lia-default-message-font-weight)","contestLineHeight":"var(--lia-bs-line-height-base)","contestFontStyle":"var(--lia-default-message-link-font-style)","contestMessageLinkColor":"var(--lia-default-message-link-color)","contestMessageLinkDecoration":"var(--lia-default-message-link-decoration)","contestMessageLinkFontStyle":"ITALIC","contestMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","occasionColor":"#EE4B5B","occasionFontFamily":"var(--lia-bs-font-family-base)","occasionFontWeight":"var(--lia-default-message-font-weight)","occasionLineHeight":"var(--lia-bs-line-height-base)","occasionFontStyle":"var(--lia-default-message-font-style)","occasionMessageLinkColor":"var(--lia-default-message-link-color)","occasionMessageLinkDecoration":"var(--lia-default-message-link-decoration)","occasionMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","occasionMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","grouphubColor":"#491B62","categoryColor":"#949494","communityColor":"#FFFFFF","productColor":"#949494","__typename":"CoreTypesThemeSettings"},"colors":{"black":"#000000","white":"#FFFFFF","gray100":"#F7F7F7","gray200":"#F7F7F7","gray300":"#E8E8E8","gray400":"#D9D9D9","gray500":"#CCCCCC","gray600":"#949494","gray700":"#707070","gray800":"#545454","gray900":"#333333","dark":"#545454","light":"#F7F7F7","primary":"#0C5C8D","secondary":"#333333","bodyText":"#222222","bodyBg":"#F5F5F5","info":"#1D9CD3","success":"#62C026","warning":"#FFD651","danger":"#C20025","alertSystem":"#FF6600","textMuted":"#707070","highlight":"#FFFCAD","outline":"var(--lia-bs-primary)","custom":["#C20025","#081B85","#009639","#B3C6D7","#7CC0EB","#F29A36"],"__typename":"ColorsThemeSettings"},"divider":{"size":"3px","marginLeft":"4px","marginRight":"4px","borderRadius":"50%","bgColor":"var(--lia-bs-gray-600)","bgColorActive":"var(--lia-bs-gray-600)","__typename":"DividerThemeSettings"},"dropdown":{"fontSize":"var(--lia-bs-font-size-sm)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius-sm)","dividerBg":"var(--lia-bs-gray-300)","itemPaddingY":"5px","itemPaddingX":"20px","headerColor":"var(--lia-bs-gray-700)","__typename":"DropdownThemeSettings"},"email":{"link":{"color":"#0069D4","hoverColor":"#0061c2","decoration":"none","hoverDecoration":"underline","__typename":"EmailLinkSettings"},"border":{"color":"#e4e4e4","__typename":"EmailBorderSettings"},"buttons":{"borderRadiusLg":"5px","paddingXLg":"16px","paddingYLg":"7px","fontWeight":"700","primaryTextColor":"#ffffff","primaryTextHoverColor":"#ffffff","primaryBgColor":"#0069D4","primaryBgHoverColor":"#005cb8","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","__typename":"EmailButtonsSettings"},"panel":{"borderRadius":"5px","borderColor":"#e4e4e4","__typename":"EmailPanelSettings"},"__typename":"EmailThemeSettings"},"emoji":{"skinToneDefault":"#ffcd43","skinToneLight":"#fae3c5","skinToneMediumLight":"#e2cfa5","skinToneMedium":"#daa478","skinToneMediumDark":"#a78058","skinToneDark":"#5e4d43","__typename":"EmojiThemeSettings"},"heading":{"color":"var(--lia-bs-body-color)","fontFamily":"Inter","fontStyle":"NORMAL","fontWeight":"600","h1FontSize":"30px","h2FontSize":"25px","h3FontSize":"20px","h4FontSize":"18px","h5FontSize":"16px","h6FontSize":"16px","lineHeight":"1.2","subHeaderFontSize":"11px","subHeaderFontWeight":"500","h1LetterSpacing":"normal","h2LetterSpacing":"normal","h3LetterSpacing":"normal","h4LetterSpacing":"normal","h5LetterSpacing":"normal","h6LetterSpacing":"normal","subHeaderLetterSpacing":"2px","h1FontWeight":"var(--lia-bs-headings-font-weight)","h2FontWeight":"var(--lia-bs-headings-font-weight)","h3FontWeight":"var(--lia-bs-headings-font-weight)","h4FontWeight":"var(--lia-bs-headings-font-weight)","h5FontWeight":"var(--lia-bs-headings-font-weight)","h6FontWeight":"var(--lia-bs-headings-font-weight)","__typename":"HeadingThemeSettings"},"icons":{"size10":"10px","size12":"12px","size14":"14px","size16":"16px","size20":"20px","size24":"24px","size30":"30px","size40":"40px","size50":"50px","size60":"60px","size80":"80px","size120":"120px","size160":"160px","__typename":"IconsThemeSettings"},"imagePreview":{"bgColor":"var(--lia-bs-gray-900)","titleColor":"var(--lia-bs-white)","controlColor":"var(--lia-bs-white)","controlBgColor":"var(--lia-bs-gray-800)","__typename":"ImagePreviewThemeSettings"},"input":{"borderColor":"var(--lia-bs-gray-600)","disabledColor":"var(--lia-bs-gray-600)","focusBorderColor":"var(--lia-bs-primary)","labelMarginBottom":"10px","btnFontSize":"var(--lia-bs-font-size-sm)","focusBoxShadow":"0 0 0 3px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","checkLabelMarginBottom":"2px","checkboxBorderRadius":"3px","borderRadiusSm":"var(--lia-bs-border-radius-sm)","borderRadius":"var(--lia-bs-border-radius)","borderRadiusLg":"var(--lia-bs-border-radius-lg)","formTextMarginTop":"4px","textAreaBorderRadius":"var(--lia-bs-border-radius)","activeFillColor":"var(--lia-bs-primary)","__typename":"InputThemeSettings"},"loading":{"dotDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.2)","dotLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.5)","barDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.06)","barLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.4)","__typename":"LoadingThemeSettings"},"link":{"color":"var(--lia-bs-primary)","hoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) - 10%))","decoration":"none","hoverDecoration":"underline","__typename":"LinkThemeSettings"},"listGroup":{"itemPaddingY":"15px","itemPaddingX":"15px","borderColor":"var(--lia-bs-gray-300)","__typename":"ListGroupThemeSettings"},"modal":{"contentTextColor":"var(--lia-bs-body-color)","contentBg":"var(--lia-bs-white)","backgroundBg":"var(--lia-bs-black)","smSize":"440px","mdSize":"760px","lgSize":"1080px","backdropOpacity":0.3,"contentBoxShadowXs":"var(--lia-bs-box-shadow-sm)","contentBoxShadow":"var(--lia-bs-box-shadow)","headerFontWeight":"700","__typename":"ModalThemeSettings"},"navbar":{"position":"FIXED","background":{"attachment":null,"clip":null,"color":"var(--lia-bs-white)","imageAssetName":null,"imageLastModified":"0","origin":null,"position":"CENTER_CENTER","repeat":"NO_REPEAT","size":"COVER","__typename":"BackgroundProps"},"backgroundOpacity":0.8,"paddingTop":"15px","paddingBottom":"15px","borderBottom":"1px solid var(--lia-bs-border-color)","boxShadow":"var(--lia-bs-box-shadow-sm)","brandMarginRight":"30px","brandMarginRightSm":"10px","brandLogoHeight":"30px","linkGap":"10px","linkJustifyContent":"flex-start","linkPaddingY":"5px","linkPaddingX":"10px","linkDropdownPaddingY":"9px","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkColor":"var(--lia-bs-body-color)","linkHoverColor":"var(--lia-bs-primary)","linkFontSize":"var(--lia-bs-font-size-sm)","linkFontStyle":"NORMAL","linkFontWeight":"400","linkTextTransform":"NONE","linkLetterSpacing":"normal","linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkBgColor":"transparent","linkBgHoverColor":"transparent","linkBorder":"none","linkBorderHover":"none","linkBoxShadow":"none","linkBoxShadowHover":"none","linkTextBorderBottom":"none","linkTextBorderBottomHover":"none","dropdownPaddingTop":"10px","dropdownPaddingBottom":"15px","dropdownPaddingX":"10px","dropdownMenuOffset":"2px","dropdownDividerMarginTop":"10px","dropdownDividerMarginBottom":"10px","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","controllerIconColor":"var(--lia-bs-body-color)","controllerIconHoverColor":"var(--lia-bs-body-color)","controllerTextColor":"var(--lia-nav-controller-icon-color)","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","controllerHighlightColor":"hsla(30, 100%, 50%)","controllerHighlightTextColor":"var(--lia-yiq-light)","controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerColor":"var(--lia-nav-controller-icon-color)","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","hamburgerBgColor":"transparent","hamburgerBgHoverColor":"transparent","hamburgerBorder":"none","hamburgerBorderHover":"none","collapseMenuMarginLeft":"20px","collapseMenuDividerBg":"var(--lia-nav-link-color)","collapseMenuDividerOpacity":0.16,"__typename":"NavbarThemeSettings"},"pager":{"textColor":"var(--lia-bs-link-color)","textFontWeight":"var(--lia-font-weight-md)","textFontSize":"var(--lia-bs-font-size-sm)","__typename":"PagerThemeSettings"},"panel":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-bs-border-radius)","borderColor":"var(--lia-bs-border-color)","boxShadow":"none","__typename":"PanelThemeSettings"},"popover":{"arrowHeight":"8px","arrowWidth":"16px","maxWidth":"300px","minWidth":"100px","headerBg":"var(--lia-bs-white)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius)","boxShadow":"0 0.5rem 1rem hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.15)","__typename":"PopoverThemeSettings"},"prism":{"color":"#000000","bgColor":"#f5f2f0","fontFamily":"var(--font-family-monospace)","fontSize":"var(--lia-bs-font-size-base)","fontWeightBold":"var(--lia-bs-font-weight-bold)","fontStyleItalic":"italic","tabSize":2,"highlightColor":"#b3d4fc","commentColor":"#62707e","punctuationColor":"#6f6f6f","namespaceOpacity":"0.7","propColor":"#990055","selectorColor":"#517a00","operatorColor":"#906736","operatorBgColor":"hsla(0, 0%, 100%, 0.5)","keywordColor":"#0076a9","functionColor":"#d3284b","variableColor":"#c14700","__typename":"PrismThemeSettings"},"rte":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":" var(--lia-panel-box-shadow)","customColor1":"#bfedd2","customColor2":"#fbeeb8","customColor3":"#f8cac6","customColor4":"#eccafa","customColor5":"#c2e0f4","customColor6":"#2dc26b","customColor7":"#f1c40f","customColor8":"#e03e2d","customColor9":"#b96ad9","customColor10":"#3598db","customColor11":"#169179","customColor12":"#e67e23","customColor13":"#ba372a","customColor14":"#843fa1","customColor15":"#236fa1","customColor16":"#ecf0f1","customColor17":"#ced4d9","customColor18":"#95a5a6","customColor19":"#7e8c8d","customColor20":"#34495e","customColor21":"#000000","customColor22":"#ffffff","defaultMessageHeaderMarginTop":"14px","defaultMessageHeaderMarginBottom":"10px","defaultMessageItemMarginTop":"0","defaultMessageItemMarginBottom":"10px","diffAddedColor":"hsla(170, 53%, 51%, 0.4)","diffChangedColor":"hsla(43, 97%, 63%, 0.4)","diffNoneColor":"hsla(0, 0%, 80%, 0.4)","diffRemovedColor":"hsla(9, 74%, 47%, 0.4)","specialMessageHeaderMarginTop":"14px","specialMessageHeaderMarginBottom":"10px","specialMessageItemMarginTop":"0","specialMessageItemMarginBottom":"10px","__typename":"RteThemeSettings"},"tags":{"bgColor":"var(--lia-bs-gray-200)","bgHoverColor":"var(--lia-bs-gray-400)","borderRadius":"var(--lia-bs-border-radius-sm)","color":"var(--lia-bs-body-color)","hoverColor":"var(--lia-bs-body-color)","fontWeight":"var(--lia-font-weight-md)","fontSize":"var(--lia-font-size-xxs)","textTransform":"UPPERCASE","letterSpacing":"0.5px","__typename":"TagsThemeSettings"},"toasts":{"borderRadius":"var(--lia-bs-border-radius)","paddingX":"12px","__typename":"ToastsThemeSettings"},"typography":{"fontFamilyBase":"Atkinson Hyperlegible","fontStyleBase":"NORMAL","fontWeightBase":"400","fontWeightLight":"300","fontWeightNormal":"400","fontWeightMd":"500","fontWeightBold":"700","letterSpacingSm":"normal","letterSpacingXs":"normal","lineHeightBase":"1.3","fontSizeBase":"15px","fontSizeXxs":"11px","fontSizeXs":"12px","fontSizeSm":"13px","fontSizeLg":"20px","fontSizeXl":"24px","smallFontSize":"14px","customFonts":[],"__typename":"TypographyThemeSettings"},"unstyledListItem":{"marginBottomSm":"5px","marginBottomMd":"10px","marginBottomLg":"15px","marginBottomXl":"20px","marginBottomXxl":"25px","__typename":"UnstyledListItemThemeSettings"},"yiq":{"light":"#ffffff","dark":"#000000","__typename":"YiqThemeSettings"},"colorLightness":{"primaryDark":0.36,"primaryLight":0.74,"primaryLighter":0.89,"primaryLightest":0.95,"infoDark":0.39,"infoLight":0.72,"infoLighter":0.85,"infoLightest":0.93,"successDark":0.24,"successLight":0.62,"successLighter":0.8,"successLightest":0.91,"warningDark":0.39,"warningLight":0.68,"warningLighter":0.84,"warningLightest":0.93,"dangerDark":0.41,"dangerLight":0.72,"dangerLighter":0.89,"dangerLightest":0.95,"__typename":"ColorLightnessThemeSettings"},"localOverride":false,"__typename":"Theme"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1740415735000","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:quilt:f5.prod:pages/kbs/TkbMessagePage:board:TechnicalArticles-1742465116457":{"__typename":"CachedAsset","id":"quilt:f5.prod:pages/kbs/TkbMessagePage:board:TechnicalArticles-1742465116457","value":{"id":"TkbMessagePage","container":{"id":"Common","headerProps":{"backgroundImageProps":null,"backgroundColor":null,"addComponents":null,"removeComponents":["community.widget.bannerWidget"],"componentOrder":null,"__typename":"QuiltContainerSectionProps"},"headerComponentProps":{"community.widget.breadcrumbWidget":{"disableLastCrumbForDesktop":false}},"footerProps":null,"footerComponentProps":null,"items":[{"id":"message-list","layout":"MAIN_SIDE","bgColor":"transparent","showTitle":true,"showDescription":true,"textPosition":"CENTER","textColor":"var(--lia-bs-body-color)","sectionEditLevel":null,"bgImage":null,"disableSpacing":null,"edgeToEdgeDisplay":null,"fullHeight":null,"showBorder":null,"__typename":"MainSideQuiltSection","columnMap":{"main":[{"id":"tkbs.widget.tkbArticleWidget","className":"lia-tkb-container","props":{"contributorListType":"panel","showHelpfulness":false,"showTimestamp":true,"showGuideNavigationSection":true,"showVersion":true,"lazyLoad":false,"editLevel":"CONFIGURE"},"__typename":"QuiltComponent"}],"side":[{"id":"featuredWidgets.widget.featuredContentWidget","className":null,"props":{"instanceId":"featuredWidgets.widget.featuredContentWidget-1702666556326","layoutProps":{"layout":"card","layoutOptions":{"useRepliesCount":false,"useAuthorRank":false,"useTimeToRead":true,"useKudosCount":false,"useViewCount":true,"usePreviewMedia":true,"useBody":false,"useCenteredCardContent":false,"useTags":true,"useTimestamp":false,"useBoardLink":true,"useAuthorLink":false,"useSolvedBadge":true}},"titleSrOnly":false,"showPager":true,"pageSize":3,"lazyLoad":true},"__typename":"QuiltComponent"},{"id":"messages.widget.relatedContentWidget","className":null,"props":{"hideIfEmpty":true,"enablePagination":true,"useTitle":true,"listVariant":{"type":"listGroup"},"pageSize":3,"style":"list","pagerVariant":{"type":"loadMore"},"viewVariant":{"type":"inline","props":{"useRepliesCount":true,"useMedia":true,"useAuthorRank":false,"useNode":true,"useTimeToRead":true,"useSpoilerFreeBody":true,"useKudosCount":true,"useNodeLink":true,"useViewCount":true,"usePreviewMedia":false,"useBody":false,"timeStampType":"postTime","useTags":true,"clampSubjectLines":2,"useBoardIcon":false,"useMessageTimeLink":true,"clampBodyLines":3,"useTextBody":true,"useSolvedBadge":true,"useAvatar":true,"useAuthorLogin":true,"useUnreadCount":true}},"lazyLoad":true,"panelType":"divider"},"__typename":"QuiltComponent"}],"__typename":"MainSideSectionColumns"}}],"__typename":"QuiltContainer"},"__typename":"Quilt","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1740415735000","value":{"email.verification.title":"Email Verification Required","email.verification.message.update.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. To change your email, visit My Settings.","email.verification.message.resend.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. Resend email."},"localOverride":false},"CachedAsset:text:en_US-pages/kbs/TkbMessagePage-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-pages/kbs/TkbMessagePage-1740415735000","value":{"title":"{contextMessageSubject} | {communityTitle}","errorMissing":"This article cannot be found","name":"TKB Message Page","section.message-list.title":"","archivedMessageTitle":"This Content Has Been Archived","section.erPqcf.title":"","section.erPqcf.description":"","section.message-list.description":""},"localOverride":false},"CachedAsset:quiltWrapper:f5.prod:Common:1742465011397":{"__typename":"CachedAsset","id":"quiltWrapper:f5.prod:Common:1742465011397","value":{"id":"Common","header":{"backgroundImageProps":{"assetName":"header.jpg","backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"LEFT_CENTER","lastModified":"1702932449000","__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"custom.widget.Beta_MetaNav","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"community.widget.navbarWidget","props":{"showUserName":false,"showRegisterLink":true,"style":{"boxShadow":"var(--lia-bs-box-shadow-sm)","linkFontWeight":"700","controllerHighlightColor":"hsla(30, 100%, 50%)","dropdownDividerMarginBottom":"10px","hamburgerBorderHover":"none","linkFontSize":"15px","linkBoxShadowHover":"none","backgroundOpacity":0.4,"controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerBgColor":"transparent","linkTextBorderBottom":"none","hamburgerColor":"var(--lia-nav-controller-icon-color)","brandLogoHeight":"48px","linkLetterSpacing":"normal","linkBgHoverColor":"transparent","collapseMenuDividerOpacity":0.16,"paddingBottom":"10px","dropdownPaddingBottom":"15px","dropdownMenuOffset":"2px","hamburgerBgHoverColor":"transparent","borderBottom":"0","hamburgerBorder":"none","dropdownPaddingX":"10px","brandMarginRightSm":"10px","linkBoxShadow":"none","linkJustifyContent":"center","linkColor":"var(--lia-bs-primary)","collapseMenuDividerBg":"var(--lia-nav-link-color)","dropdownPaddingTop":"10px","controllerHighlightTextColor":"var(--lia-yiq-dark)","background":{"imageAssetName":"","color":"var(--lia-bs-white)","size":"COVER","repeat":"NO_REPEAT","position":"CENTER_CENTER","imageLastModified":""},"linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkHoverColor":"var(--lia-bs-primary)","position":"FIXED","linkBorder":"none","linkTextBorderBottomHover":"2px solid #0C5C8D","brandMarginRight":"30px","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","linkBorderHover":"none","collapseMenuMarginLeft":"20px","linkFontStyle":"NORMAL","linkPaddingX":"10px","paddingTop":"10px","linkPaddingY":"5px","linkTextTransform":"NONE","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkBgColor":"transparent","linkDropdownPaddingY":"9px","controllerIconColor":"#0C5C8D","dropdownDividerMarginTop":"10px","linkGap":"10px","controllerIconHoverColor":"#0C5C8D"},"links":{"sideLinks":[],"mainLinks":[{"children":[{"linkType":"INTERNAL","id":"migrated-link-1","params":{"boardId":"TechnicalForum","categoryId":"Forums"},"routeName":"ForumBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-2","params":{"boardId":"WaterCooler","categoryId":"Forums"},"routeName":"ForumBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-0","params":{"categoryId":"Forums"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-4","params":{"boardId":"codeshare","categoryId":"CrowdSRC"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-5","params":{"boardId":"communityarticles","categoryId":"CrowdSRC"},"routeName":"TkbBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-3","params":{"categoryId":"CrowdSRC"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-7","params":{"boardId":"TechnicalArticles","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"article-series","params":{"boardId":"article-series","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"security-insights","params":{"boardId":"security-insights","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-8","params":{"boardId":"DevCentralNews","categoryId":"Articles"},"routeName":"TkbBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-6","params":{"categoryId":"Articles"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-10","params":{"categoryId":"CommunityGroups"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"migrated-link-11","params":{"categoryId":"F5-Groups"},"routeName":"CategoryPage"}],"linkType":"INTERNAL","id":"migrated-link-9","params":{"categoryId":"GroupsCategory"},"routeName":"CategoryPage"},{"children":[],"linkType":"INTERNAL","id":"migrated-link-12","params":{"boardId":"Events","categoryId":"top"},"routeName":"EventBoardPage"},{"children":[],"linkType":"INTERNAL","id":"migrated-link-13","params":{"boardId":"Suggestions","categoryId":"top"},"routeName":"IdeaBoardPage"},{"children":[],"linkType":"EXTERNAL","id":"Common-external-link","url":"https://community.f5.com/c/how-do-i","target":"SELF"}]},"className":"QuiltComponent_lia-component-edit-mode__lQ9Z6","showSearchIcon":false},"__typename":"QuiltComponent"},{"id":"community.widget.bannerWidget","props":{"backgroundColor":"transparent","visualEffects":{"showBottomBorder":false},"backgroundImageProps":{"backgroundSize":"COVER","backgroundPosition":"CENTER_CENTER","backgroundRepeat":"NO_REPEAT"},"fontColor":"#222222"},"__typename":"QuiltComponent"},{"id":"community.widget.breadcrumbWidget","props":{"backgroundColor":"var(--lia-bs-primary)","linkHighlightColor":"#FFFFFF","visualEffects":{"showBottomBorder":false},"backgroundOpacity":60,"linkTextColor":"#FFFFFF"},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"footer":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"var(--lia-bs-body-color)","items":[{"id":"custom.widget.Beta_Footer","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Tag_Manager_Helper","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Consent_Blackbar","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"__typename":"QuiltWrapper","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-components/common/ActionFeedback-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1740415735000","value":{"joinedGroupHub.title":"Welcome","joinedGroupHub.message":"You are now a member of this group and are subscribed to updates.","groupHubInviteNotFound.title":"Invitation Not Found","groupHubInviteNotFound.message":"Sorry, we could not find your invitation to the group. The owner may have canceled the invite.","groupHubNotFound.title":"Group Not Found","groupHubNotFound.message":"The grouphub you tried to join does not exist. It may have been deleted.","existingGroupHubMember.title":"Already Joined","existingGroupHubMember.message":"You are already a member of this group.","accountLocked.title":"Account Locked","accountLocked.message":"Your account has been locked due to multiple failed attempts. Try again in {lockoutTime} minutes.","editedGroupHub.title":"Changes Saved","editedGroupHub.message":"Your group has been updated.","leftGroupHub.title":"Goodbye","leftGroupHub.message":"You are no longer a member of this group and will not receive future updates.","deletedGroupHub.title":"Deleted","deletedGroupHub.message":"The group has been deleted.","groupHubCreated.title":"Group Created","groupHubCreated.message":"{groupHubName} is ready to use","accountClosed.title":"Account Closed","accountClosed.message":"The account has been closed and you will now be redirected to the homepage","resetTokenExpired.title":"Reset Password Link has Expired","resetTokenExpired.message":"Try resetting your password again","invalidUrl.title":"Invalid URL","invalidUrl.message":"The URL you're using is not recognized. Verify your URL and try again.","accountClosedForUser.title":"Account Closed","accountClosedForUser.message":"{userName}'s account is closed","inviteTokenInvalid.title":"Invitation Invalid","inviteTokenInvalid.message":"Your invitation to the community has been canceled or expired.","inviteTokenError.title":"Invitation Verification Failed","inviteTokenError.message":"The url you are utilizing is not recognized. Verify your URL and try again","pageNotFound.title":"Access Denied","pageNotFound.message":"You do not have access to this area of the community or it doesn't exist","eventAttending.title":"Responded as Attending","eventAttending.message":"You'll be notified when there's new activity and reminded as the event approaches","eventInterested.title":"Responded as Interested","eventInterested.message":"You'll be notified when there's new activity and reminded as the event approaches","eventNotFound.title":"Event Not Found","eventNotFound.message":"The event you tried to respond to does not exist.","redirectToRelatedPage.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.message":"The content you are trying to access is archived","redirectToRelatedPage.message":"The content you are trying to access is archived","relatedUrl.archivalLink.flyoutMessage":"The content you are trying to access is archived View Archived Content"},"localOverride":false},"CachedAsset:component:custom.widget.Beta_MetaNav-en-1742465134463":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_MetaNav-en-1742465134463","value":{"component":{"id":"custom.widget.Beta_MetaNav","template":{"id":"Beta_MetaNav","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_MetaNav","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Beta_Footer-en-1742465134463":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_Footer-en-1742465134463","value":{"component":{"id":"custom.widget.Beta_Footer","template":{"id":"Beta_Footer","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_Footer","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Tag_Manager_Helper-en-1742465134463":{"__typename":"CachedAsset","id":"component:custom.widget.Tag_Manager_Helper-en-1742465134463","value":{"component":{"id":"custom.widget.Tag_Manager_Helper","template":{"id":"Tag_Manager_Helper","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Tag_Manager_Helper","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Consent_Blackbar-en-1742465134463":{"__typename":"CachedAsset","id":"component:custom.widget.Consent_Blackbar-en-1742465134463","value":{"component":{"id":"custom.widget.Consent_Blackbar","template":{"id":"Consent_Blackbar","markupLanguage":"HTML","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Consent_Blackbar","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"TEXTHTML","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1740415735000","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBanner-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBanner-1740415735000","value":{"messageMarkedAsSpam":"This post has been marked as spam","messageMarkedAsSpam@board:TKB":"This article has been marked as spam","messageMarkedAsSpam@board:BLOG":"This post has been marked as spam","messageMarkedAsSpam@board:FORUM":"This discussion has been marked as spam","messageMarkedAsSpam@board:OCCASION":"This event has been marked as spam","messageMarkedAsSpam@board:IDEA":"This idea has been marked as spam","manageSpam":"Manage Spam","messageMarkedAsAbuse":"This post has been marked as abuse","messageMarkedAsAbuse@board:TKB":"This article has been marked as abuse","messageMarkedAsAbuse@board:BLOG":"This post has been marked as abuse","messageMarkedAsAbuse@board:FORUM":"This discussion has been marked as abuse","messageMarkedAsAbuse@board:OCCASION":"This event has been marked as abuse","messageMarkedAsAbuse@board:IDEA":"This idea has been marked as abuse","preModCommentAuthorText":"This comment will be published as soon as it is approved","preModCommentModeratorText":"This comment is awaiting moderation","messageMarkedAsOther":"This post has been rejected due to other reasons","messageMarkedAsOther@board:TKB":"This article has been rejected due to other reasons","messageMarkedAsOther@board:BLOG":"This post has been rejected due to other reasons","messageMarkedAsOther@board:FORUM":"This discussion has been rejected due to other reasons","messageMarkedAsOther@board:OCCASION":"This event has been rejected due to other reasons","messageMarkedAsOther@board:IDEA":"This idea has been rejected due to other reasons","messageArchived":"This post was archived on {date}","relatedUrl":"View Related Content","relatedContentText":"Showing related content","archivedContentLink":"View Archived Content"},"localOverride":false},"CachedAsset:text:en_US-components/tkbs/TkbArticleWidget-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/tkbs/TkbArticleWidget-1740415735000","value":{},"localOverride":false},"Category:category:Forums":{"__typename":"Category","id":"category:Forums","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Forum:board:TechnicalForum":{"__typename":"Forum","id":"board:TechnicalForum","forumPolicies":{"__typename":"ForumPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Forum:board:WaterCooler":{"__typename":"Forum","id":"board:WaterCooler","forumPolicies":{"__typename":"ForumPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:DevCentralNews":{"__typename":"Tkb","id":"board:DevCentralNews","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:GroupsCategory":{"__typename":"Category","id":"category:GroupsCategory","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:F5-Groups":{"__typename":"Category","id":"category:F5-Groups","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:CommunityGroups":{"__typename":"Category","id":"category:CommunityGroups","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Occasion:board:Events":{"__typename":"Occasion","id":"board:Events","boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"occasionPolicies":{"__typename":"OccasionPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Idea:board:Suggestions":{"__typename":"Idea","id":"board:Suggestions","boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"ideaPolicies":{"__typename":"IdeaPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:CrowdSRC":{"__typename":"Category","id":"category:CrowdSRC","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:codeshare":{"__typename":"Tkb","id":"board:codeshare","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:communityarticles":{"__typename":"Tkb","id":"board:communityarticles","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:security-insights":{"__typename":"Tkb","id":"board:security-insights","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:article-series":{"__typename":"Tkb","id":"board:article-series","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"TkbTopicMessage:message:283240":{"__typename":"TkbTopicMessage","id":"message:283240","uid":283240,"subject":"Lightboard Lessons: What is HTTP?","board":{"__ref":"Tkb:board:TechnicalArticles"}},"Guide:guide:9":{"__typename":"Guide","id":"guide:9","lastArticle":{"__ref":"TkbTopicMessage:message:283240"}},"TkbTopicMessage:message:285178":{"__typename":"TkbTopicMessage","id":"message:285178","uid":285178,"subject":"Parsing complex BIG-IP json structures made easy with Ansible filters like json_query","board":{"__ref":"Tkb:board:TechnicalArticles"}},"Guide:guide:11":{"__typename":"Guide","id":"guide:11","firstArticle":{"__ref":"TkbTopicMessage:message:285178"}},"Guide:guide:10":{"__typename":"Guide","id":"guide:10","title":"iControl","node":{"__ref":"Tkb:board:article-series"},"previousGuide":{"__ref":"Guide:guide:9"},"nextGuide":{"__ref":"Guide:guide:11"}},"Chapter:chapter:100":{"__typename":"Chapter","id":"chapter:100","guide":{"__ref":"Guide:guide:10"}},"TkbTopicMessage:message:283696":{"__typename":"TkbTopicMessage","id":"message:283696","uid":283696,"subject":"iControl 101 - #20 - Port Lockdown","board":{"__ref":"Tkb:board:TechnicalArticles"}},"TkbTopicMessage:message:283646":{"__typename":"TkbTopicMessage","id":"message:283646","uid":283646,"subject":"iControl 101 - #22 - GTM Data Centers","board":{"__ref":"Tkb:board:TechnicalArticles"}},"CachedAsset:text:en_US-components/community/Navbar-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1740415735000","value":{"community":"Community Home","inbox":"Inbox","manageContent":"Manage Content","tos":"Terms of Service","forgotPassword":"Forgot Password","themeEditor":"Theme Editor","edit":"Edit Navigation Bar","skipContent":"Skip to content","migrated-link-9":"Groups","migrated-link-7":"Technical Articles","migrated-link-8":"DevCentral News","migrated-link-1":"Technical Forum","migrated-link-10":"Community Groups","migrated-link-2":"Water Cooler","migrated-link-11":"F5 Groups","Common-external-link":"How Do I...?","migrated-link-0":"Forums","article-series":"Article Series","migrated-link-5":"Community Articles","migrated-link-6":"Articles","security-insights":"Security Insights","migrated-link-3":"CrowdSRC","migrated-link-4":"CodeShare","migrated-link-12":"Events","migrated-link-13":"Suggestions"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarHamburgerDropdown-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1740415735000","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1740415735000","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1740415735000","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1740415735000","value":{"title.login":"Sign In","title.registration":"Register","title.forgotPassword":"Forgot Password","title.multiAuthLogin":"Sign In"},"localOverride":false},"CachedAsset:text:en_US-components/nodes/NodeLink-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1740415735000","value":{"place":"Place {name}"},"localOverride":false},"QueryVariables:TopicReplyList:message:283650:1":{"__typename":"QueryVariables","id":"TopicReplyList:message:283650:1","value":{"id":"message:283650","first":10,"sorts":{"postTime":{"direction":"ASC"}},"repliesFirst":3,"repliesFirstDepthThree":1,"repliesSorts":{"postTime":{"direction":"ASC"}},"useAvatar":true,"useAuthorLogin":true,"useAuthorRank":true,"useBody":true,"useKudosCount":true,"useTimeToRead":false,"useMedia":false,"useReadOnlyIcon":false,"useRepliesCount":true,"useSearchSnippet":false,"useAcceptedSolutionButton":false,"useSolvedBadge":false,"useAttachments":false,"attachmentsFirst":5,"useTags":true,"useNodeAncestors":false,"useUserHoverCard":false,"useNodeHoverCard":false,"useModerationStatus":true,"usePreviewSubjectModal":false,"useMessageStatus":true}},"ROOT_MUTATION":{"__typename":"Mutation"},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1740415735000","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1740415735000","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewStandard-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewStandard-1740415735000","value":{"anonymous":"Anonymous","author":"{messageAuthorLogin}","authorBy":"{messageAuthorLogin}","board":"{messageBoardTitle}","replyToUser":" to {parentAuthor}","showMoreReplies":"Show More","replyText":"Reply","repliesText":"Replies","markedAsSolved":"Marked as Solved","movedMessagePlaceholder.BLOG":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.TKB":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.FORUM":"{count, plural, =0 {This reply has been} other {These replies have been} }","movedMessagePlaceholder.IDEA":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.OCCASION":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholderUrlText":"moved.","messageStatus":"Status: ","statusChanged":"Status changed: {previousStatus} to {currentStatus}","statusAdded":"Status added: {status}","statusRemoved":"Status removed: {status}","labelExpand":"expand replies","labelCollapse":"collapse replies","unhelpfulReason.reason1":"Content is outdated","unhelpfulReason.reason2":"Article is missing information","unhelpfulReason.reason3":"Content is for a different Product","unhelpfulReason.reason4":"Doesn't match what I was searching for"},"localOverride":false},"CachedAsset:text:en_US-components/messages/ThreadedReplyList-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/ThreadedReplyList-1740415735000","value":{"title":"{count, plural, one{# Reply} other{# Replies}}","title@board:BLOG":"{count, plural, one{# Comment} other{# Comments}}","title@board:TKB":"{count, plural, one{# Comment} other{# Comments}}","title@board:IDEA":"{count, plural, one{# Comment} other{# Comments}}","title@board:OCCASION":"{count, plural, one{# Comment} other{# Comments}}","noRepliesTitle":"No Replies","noRepliesTitle@board:BLOG":"No Comments","noRepliesTitle@board:TKB":"No Comments","noRepliesTitle@board:IDEA":"No Comments","noRepliesTitle@board:OCCASION":"No Comments","noRepliesDescription":"Be the first to reply","noRepliesDescription@board:BLOG":"Be the first to comment","noRepliesDescription@board:TKB":"Be the first to comment","noRepliesDescription@board:IDEA":"Be the first to comment","noRepliesDescription@board:OCCASION":"Be the first to comment","messageReadOnlyAlert:BLOG":"Comments have been turned off for this post","messageReadOnlyAlert:TKB":"Comments have been turned off for this article","messageReadOnlyAlert:IDEA":"Comments have been turned off for this idea","messageReadOnlyAlert:FORUM":"Replies have been turned off for this discussion","messageReadOnlyAlert:OCCASION":"Comments have been turned off for this event"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyCallToAction-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyCallToAction-1740415735000","value":{"leaveReply":"Leave a reply...","leaveReply@board:BLOG@message:root":"Leave a comment...","leaveReply@board:TKB@message:root":"Leave a comment...","leaveReply@board:IDEA@message:root":"Leave a comment...","leaveReply@board:OCCASION@message:root":"Leave a comment...","repliesTurnedOff.FORUM":"Replies are turned off for this topic","repliesTurnedOff.BLOG":"Comments are turned off for this topic","repliesTurnedOff.TKB":"Comments are turned off for this topic","repliesTurnedOff.IDEA":"Comments are turned off for this topic","repliesTurnedOff.OCCASION":"Comments are turned off for this topic","infoText":"Stop poking me!"},"localOverride":false},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/cmstNDEtSzFzVEth\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/cmstNDEtSzFzVEth","height":0,"width":0,"mimeType":"image/svg+xml"},"Rank:rank:41":{"__typename":"Rank","id":"rank:41","position":18,"name":"Nimbostratus","color":"CCCCCC","icon":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/cmstNDEtSzFzVEth\"}"},"rankStyle":"FILLED"},"User:user:212900":{"__typename":"User","id":"user:212900","uid":212900,"login":"whswhswhs124_98","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2010-07-15T01:00:00.000-07:00"},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-6.svg?time=0"},"rank":{"__ref":"Rank:rank:41"},"entityType":"USER","eventPath":"community:zihoc95639/user:212900"},"ModerationData:moderation_data:283651":{"__typename":"ModerationData","id":"moderation_data:283651","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"TkbReplyMessage:message:283651":{"__typename":"TkbReplyMessage","author":{"__ref":"User:user:212900"},"id":"message:283651","revisionNum":1,"uid":283651,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Tkb:board:TechnicalArticles"},"parent":{"__ref":"TkbTopicMessage:message:283650"},"conversation":{"__ref":"Conversation:conversation:283650"},"subject":"Re: iControl 101 - #21 - Rate Classes","moderationData":{"__ref":"ModerationData:moderation_data:283651"},"body":"'","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"1","kudosSumWeight":0,"repliesCount":0,"postTime":"2014-09-01T03:04:16.000-07:00","lastPublishTime":"2014-09-01T03:04:16.000-07:00","metrics":{"__typename":"MessageMetrics","views":464},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"entityType":"TKB_REPLY","eventPath":"category:Articles/community:zihoc95639board:TechnicalArticles/message:283650/message:283651","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"CachedAsset:text:en_US-components/messages/MessageSubject-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1740415735000","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1740415735000","value":{"showMessageBody":"Show More","mentionsErrorTitle":"{mentionsType, select, board {Board} user {User} message {Message} other {}} No Longer Available","mentionsErrorMessage":"The {mentionsType} you are trying to view has been removed from the community.","videoProcessing":"Video is being processed. Please try again in a few minutes.","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageCustomFields-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageCustomFields-1740415735000","value":{"CustomField.default.label":"Value of {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageRevision-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRevision-1740415735000","value":{"lastUpdatedDatePublished":"{publishCount, plural, one{Published} other{Updated}} {date}","lastUpdatedDateDraft":"Created {date}","version":"Version {major}.{minor}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyButton-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyButton-1740415735000","value":{"repliesCount":"{count}","title":"Reply","title@board:BLOG@message:root":"Comment","title@board:TKB@message:root":"Comment","title@board:IDEA@message:root":"Comment","title@board:OCCASION@message:root":"Comment"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageAuthorBio-1740415735000","value":{"sendMessage":"Send Message","actionMessage":"Follow this blog board to get notified when there's new activity","coAuthor":"CO-PUBLISHER","contributor":"CONTRIBUTOR","userProfile":"View Profile","iconlink":"Go to {name} {type}"},"localOverride":false},"CachedAsset:text:en_US-components/guides/GuideBottomNavigation-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/guides/GuideBottomNavigation-1740415735000","value":{"nav.label":"Previous/Next Page","nav.previous":"Previous","nav.next":"Next"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1740415735000","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserRank-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserRank-1740415735000","value":{"rankName":"{rankName}","userRank":"Author rank {rankName}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTime-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1740415735000","value":{"postTime":"Published: {time}","lastPublishTime":"Last Update: {time}","conversation.lastPostingActivityTime":"Last posting activity time: {time}","conversation.lastPostTime":"Last post time: {time}","moderationData.rejectTime":"Rejected time: {time}"},"localOverride":false},"CachedAsset:text:en_US-components/customComponent/CustomComponent-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/customComponent/CustomComponent-1740415735000","value":{"errorMessage":"Error rendering component id: {customComponentId}","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1740415735000","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserRegistrationDate-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserRegistrationDate-1740415735000","value":{"noPrefix":"{date}","withPrefix":"Joined {date}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/ranks/UserRankLabel-1740415735000","value":{"altTitle":"Icon for {rankName} rank"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagView/TagViewChip-1740415735000","value":{"tagLabelName":"Tag name {tagName}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Pager/PagerLoadMore-1740415735000","value":{"loadMore":"Show More"},"localOverride":false}}}},"page":"/kbs/TkbMessagePage/TkbMessagePage","query":{"boardId":"technicalarticles","messageSubject":"icontrol-101---21---rate-classes","messageId":"283650"},"buildId":"q_bLpq2mflH0BeZigxpj6","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"f5","openTelemetryServiceVersion":"25.2.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","apolloDevToolsEnabled":false,"inboxMuteWipFeatureEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/customComponent/CustomComponent/CustomComponent.tsx","./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/tkbs/TkbArticleWidget/TkbArticleWidget.tsx","./components/messages/MessageView/MessageViewStandard/MessageViewStandard.tsx","./components/messages/ThreadedReplyList/ThreadedReplyList.tsx","./components/customComponent/CustomComponentContent/TemplateContent.tsx","../shared/client/components/common/List/UnstyledList/UnstyledList.tsx","./components/messages/MessageView/MessageView.tsx","./components/customComponent/CustomComponentContent/HtmlContent.tsx","./components/customComponent/CustomComponentContent/CustomComponentScripts.tsx","../shared/client/components/common/List/UnwrappedList/UnwrappedList.tsx","./components/tags/TagView/TagView.tsx","./components/tags/TagView/TagViewChip/TagViewChip.tsx","../shared/client/components/common/Pager/PagerLoadMore/PagerLoadMore.tsx"],"appGip":true,"scriptLoader":[]}