In the previous articles in the Getting Started with iControl series, we covered the history of iControl, taxonomy, and introduced the languages most common to our community. In this article, we'll start looking at some code samples. With each task we cover, we'll show an example for a few languages for both the soap and rest interface. The sheer amount of space in this article required to show full samples of each language for both soap and rest would be overwhelming in line, so for the sample code, we have pulled out the appropriate sections of the code for you to study. Understand that based on the libraries used, if at all, some of the work may be abstracted. Full scripts for each language and portal preference are linked at the bottom of this article. If you click each of the iControl REST and iControl SOAP tabs, you'll see a language listing for the sample code provided. Joe Pruitt is the super hero providing everything not python here, so give him a shout out next time you see him in these parts.
\n\nNote: This article published by Jason Rahm but co-authored with Joe Pruitt.
\n\nWith all the disclaimers out of the way, let's get down to business! The first thing you have to do to talk to the BIG-IP is know where to connect. Some prerequisites:
\n\nThere are dozens of articles and codeshare samples on DevCentral on creating/modifying objects both in rest and soap, so we're not going to cover all the details ad nauseam here. But we do want to introduce the basic concepts of retrieving, creating, and modifying a couple simple objects in this article. The first one we'll tackle is one of the most important building blocks of the BIG-IP configuration: the pool.
\n\nThe pool has many attributes that can be set, but not all are required. In this exercise however, we're going to simply demonstrate the creation of a pool and a pool listing. The pool object can be created via rest with a simple name, and with soap with the name, the lb method, and the members attribute (it can be empty, but the attribute needs to be present.)
\n\n\npublic void displayAllPools() throws Exception\n{\nString [] pool_list = m_interfaces.getLocalLBPool().get_list();\nSystem.out.println(\"Pools\\n\");\nSystem.out.println(\"-----------\\n\");\nfor(int i=0; i<pool_list.length; i++)\n{\nSystem.out.println(pool_list[i]);\n}\n}\n\npublic void createPool(String poolname, String partition) throws Exception\n{\nString [] pool_list = new String[] {\"/\" + partition + \"/\" + poolname};\niControl.LocalLBLBMethod [] lb_methods = new iControl.LocalLBLBMethod[] { iControl.LocalLBLBMethod.LB_METHOD_ROUND_ROBIN };\niControl.CommonIPPortDefinition[][] membersAofA = new iControl.CommonIPPortDefinition[1][];\nmembersAofA[0] = new iControl.CommonIPPortDefinition[1];\nmembersAofA[0][0] = new iControl.CommonIPPortDefinition();\nmembersAofA[0][0].setAddress(\"10.10.10.10\");\nmembersAofA[0][0].setPort(80);\n\nm_interfaces.getLocalLBPool().create(\npool_list,\nlb_methods,\nmembersAofA\n);\n\nSystem.out.println(\"Pool \" + poolname + \" created in partition \" + partition);\n}\n
\n#----------------------------------------------------------------------------\n# getPoolList\n#----------------------------------------------------------------------------\nsub getPoolList()\n{\n$soapResponse = $Pool->get_list();\n&checkResponse($soapResponse);\nmy @pool_list = @{$soapResponse->result};\nprint \"POOL LIST\\n\";\nprint \"---------\\n\";\nforeach $pool (@pool_list) {\nprint \" ${pool}\\n\";\n}\n}\n#----------------------------------------------------------------------------\n# createPool()\n#----------------------------------------------------------------------------\nsub createPool()\n{\nmy ($partition, $pool) = @_;\n\nprint \"CREATING POOL $pool\\n\";\n\nmy @pool_names = [$pool];\nmy @lb_methods = [\"LB_METHOD_ROUND_ROBIN\"]; \n $member = \n {\n address => \"10.10.10.10\",\n port => 80\n };\n \n # memberA is the 1st dimension of the array, we need one for each pool\n push @memberA, $member;\n # memberAofA is the 2nd dimension. push pool members for each pool here.\n push @memberAofA, [@memberA];\n\n$soapResponse = $Pool->create(\nSOAP::Data->name( pool_names => [\"/$partition/$pool\"]),\nSOAP::Data->name( lb_methods => [\"LB_METHOD_ROUND_ROBIN\"]),\n SOAP::Data->name(members => [@memberAofA])\n);\n&checkResponse($soapResponse);\n\nprint \"POOL ${pool} created in partition ${partition}...\\n\";\n}\n
\n#----------------------------------------------------------------------------\nfunction Get-PoolList()\n#----------------------------------------------------------------------------\n{\n $pool_list = $(Get-F5.iControl).LocalLBPool.get_list();\nWrite-Host \"POOL LIST\";\nWrite-Host \"---------\";\n foreach($pool in $pool_list)\n {\nWrite-Host \" $pool\";\n}\n}\n#----------------------------------------------------------------------------\nfunction Create-Pool()\n#\n# Description:\n# This function creates a new pool if the given pool name doesn't\n# already exist.\n#\n# Parameters:\n# Name - The Name of the pool you wish to create.\n# MemberList - A string list of pool member addresses.\n# MemberPort - The port the pool members will be configured with.\n#----------------------------------------------------------------------------\n{\n param(\n [string]$Name,\n [string[]]$MemberList,\n [int]$MemberPort\n );\n \n $IPPortDefList = New-Object -TypeName iControl.CommonIPPortDefinition[] $MemberList.Length;\n for($i=0; $i-lt$MemberList.Length; $i++)\n {\n $IPPortDefList[$i] = New-Object -TypeName iControl.CommonIPPortDefinition;\n $IPPortDefList[$i].address = $MemberList[$i];\n $IPPortDefList[$i].port = $MemberPort;\n }\n \n Write-Host \"Creating Pool $Name\";\n $(Get-F5.iControl).LocalLBPool.create(\n (,$Name),\n (,\"LB_METHOD_ROUND_ROBIN\"),\n (,$IPPortDefList)\n );\n Write-Host \"Pool '$Name' Successfully Created\";\n}\n
\ndef get_pool_list(bigip):\n try:\n poollist = bigip.LocalLB.Pool.get_list()\n print \"POOL LIST\"\n print \" ---------\"\n for pool in poollist:\n print \" %s\" % pool\n\n except Exception, e:\n print e\n\n\ndef create_pool(bigip, pool):\n try:\n bigip.LocalLB.Pool.create_v2([pool], ['LB_METHOD_ROUND_ROBIN'], [[]])\n except Exception, e:\n print e\n
\n//--------------------------------------------------------\nfunction handleVERB(verb, resource, body, callback) {\n//--------------------------------------------------------\ngetAuthToken( function(token) {\nhttpRequest(verb, resource, body, null, null, token, function(json) {\ncallback(json);\n});\n});\n}\n\n//--------------------------------------------------------\nfunction handleGetPoolList(callback) {\n//--------------------------------------------------------\nvar uri = \"/mgmt/tm/ltm/pool\";\nhandleVERB(\"GET\", uri, null, function(json) {\ncallback(json);\n});\n}\n//--------------------------------------------------------\nfunction handleCreatePool(pool, partition, callback) {\n//--------------------------------------------------------\nvar uri = \"/mgmt/tm/ltm/pool\";\nvar body = '{\"name\":\"' + pool + '\", \"partition\":\"' + partition + '\"}';\n\nconsole.log(\"BODY: \" + body);\nhandleVERB(\"POST\", uri, body, function(json) {\ncallback(json);\n});\n}\n
\n#---------------------------------------------------\nsub getPoolList() {\n#---------------------------------------------------\n$resp_json = &handleGET(\"/mgmt/tm/ltm/pool\");\n$resp = decode_json($resp_json);\n@items = @{$resp->{\"items\"}};\n\nprint \"POOL NAMES\\n\";\nprint \"----------\\n\";\nforeach $item (@items) {\n$fullPath = $item->{\"fullPath\"};\nprint \" $fullPath\\n\";\nprint Dumper($item);\n}\n}\n#---------------------------------------------------\nsub handleGET() {\n#---------------------------------------------------\nmy ($resource) = @_;\n\n$url = &buildURL($resource);\n\n$resp = &getHttpRequest($url);\n\nreturn $resp;\n}\n#---------------------------------------------------\nsub createPool() {\n#---------------------------------------------------\nmy ($pool, $partition) = @_;\n\nmy $poolObj;\n$poolObj->{\"name\"} = $pool;\n$poolObj->{\"partition\"} = $partition;\n\nmy $json = encode_json($poolObj);\n\nprint \"JSON: $json\\n\";\nexit();\n\n$resp = &handlePOST(\"/mgmt/tm/ltm/pool\", $json);\n\nprint Dumper($resp);\n}\n#---------------------------------------------------\nsub handlePOST() {\n#---------------------------------------------------\nmy ($resource, $body) = @_;\n\nif ( $body eq \"\" ) { &usage(); }\n\n$url = &buildURL($resource);\n\n$resp = &postHttpRequest($url, $body);\n\nreturn $resp;\n}\n
\n#----------------------------------------------------------------------------\nfunction Get-PoolList()\n#----------------------------------------------------------------------------\n{\n$uri = \"/mgmt/tm/ltm/pool\";\n$link = \"https://$Bigip$uri\";\n$headers = @{};\n$headers.Add(\"ServerHost\", $Bigip);\n\n$secpasswd = ConvertTo-SecureString $Pass -AsPlainText -Force\n$mycreds = New-Object System.Management.Automation.PSCredential ($User, $secpasswd)\n\n$obj = Invoke-RestMethod -Method GET -Headers $headers -Uri $link -Credential $mycreds\n$items = $obj.items;\nWrite-Host \"POOL NAMES\";\nWrite-Host \"----------\";\nfor($i=0; $i -lt $items.length; $i++) {\n$name = $items[$i].fullPath;\nWrite-Host \" $name\";\n}\n}\n#----------------------------------------------------------------------------\nfunction Create-Pool()\n#\n# Description:\n# This function creates a new pool if the given pool name doesn't\n# already exist.\n#\n# Parameters:\n# Name - The Name of the pool you wish to create.\n# Partition - The name of the partition to place the pool in.\n#----------------------------------------------------------------------------\n{\n param(\n [string]$Name,\n[string]$Partition\n );\n\n$uri = \"/mgmt/tm/ltm/pool\";\n$link = \"https://$Bigip$uri\";\n$headers = @{};\n$headers.Add(\"ServerHost\", $Bigip);\n$headers.Add(\"Content-Type\", \"application/json\");\n$obj = @{\nname=$Name\npartition=$Partition\n};\n$body = $obj | ConvertTo-Json\n\n$secpasswd = ConvertTo-SecureString $Pass -AsPlainText -Force\n$mycreds = New-Object System.Management.Automation.PSCredential ($User, $secpasswd)\n\n$obj = Invoke-RestMethod -Method POST -Uri $link -Headers $headers -Credential $mycreds -Body $body;\n\nWrite-Host \"Pool ${Name} created in partition ${Partition}\"\n}\n
\ndef get_pool_list(bigip, url):\n try:\n pools = bigip.get(\"%s/ltm/pool\" % url).json()\n print \"POOL LIST\"\n print \" ---------\"\n for pool in pools['items']:\n print \" /%s/%s\" % (pool['partition'], pool['name'])\n except Exception, e:\n print e\n\n\ndef create_pool(bigip, url, pool, part=None):\n try:\n payload = {}\n payload['name'] = pool\n if part is not None:\n payload['partition'] = part\n\n pool_config = bigip.post(\"%s/ltm/pool\" % url, json.dumps(payload)).json()\n print pool_config\n except Exception, e:\n print e\n
Data-groups are interesting objects with which to work, primarily because you can have internal data-groups, which are wholly contained within bigip.conf, and external data-groups, which has it's definition in bigip.conf but the records are kept in an external file. Also interesting is that this particular object has different attributes via soap than it does in rest. In soap, all the records can be individually managed, so you can add, find, and delete on a record by record basis. Not so with rest. In rest we have the concepts of collections and a subcollections. A collection is like a list of pools. A sub-collection would be the members of a pool. Ideally, a data-group itself would be part of a collection, and it's records would be a subcollection, but that is not the case today. This has major implications if you want to update a data-group. Say you have a data-group with 10,000 records. You want add a record, so you issue an HTTP PUT method with your payload of one record. Instead of the desired outcome of a modified data-group with 10,001 records, you now have a much smaller data-group of exactly one record. Not good! So make sure if you are using the rest interface with data-groups, you store all the existing records, make all your adds/changes/deletes, then PUT the entire record collection. But where the soap interface has the upper hand with being able to update individual records, rest punches back with the ability to list out all data-group at once, whereas with soap, you have to query each type of data-group among string, integer, and address. So there are some pros and cons to both approaches to weigh as you dig in.
\n\n\npublic void createDataGroup(String datagroup) throws Exception\n{\n// Create String Class\niControl.LocalLBClassStringClass [] StringClassA = new iControl.LocalLBClassStringClass[1];\nStringClassA[0] = new iControl.LocalLBClassStringClass();\nStringClassA[0].setName(datagroup);\nStringClassA[0].setMembers(new String [] { \"a\", \"b\", \"c\" });\n\nm_interfaces.getLocalLBClass().create_string_class(StringClassA);\n\n// Set Values\nString [][] valuesAofA = new String[1][];\nvaluesAofA[0] = new String[] { \"data 1\", \"data 2\", \"data 3\" };\n\nm_interfaces.getLocalLBClass().set_string_class_member_data_value(\nStringClassA,\nvaluesAofA\n);\n\ngetDataGroup(datagroup);\n}\npublic void removeFromDataGroup(String datagroup) throws Exception\n{\nString [] names = new String[] {\"c\"};\n\niControl.LocalLBClassStringClass [] StringClassA = new iControl.LocalLBClassStringClass[1];\nStringClassA[0] = new iControl.LocalLBClassStringClass();\nStringClassA[0].setName(datagroup);\nStringClassA[0].setMembers(new String [] { \"c\" });\n\nm_interfaces.getLocalLBClass().delete_string_class_member(StringClassA);\n\ngetDataGroup(datagroup);\n}\n\n//--------------------------------------------------------------------------\n//\n//--------------------------------------------------------------------------\npublic void addToDataGroup(String datagroup) throws Exception\n{\n// Create String Class\niControl.LocalLBClassStringClass [] StringClassA = new iControl.LocalLBClassStringClass[1];\nStringClassA[0] = new iControl.LocalLBClassStringClass();\nStringClassA[0].setName(datagroup);\nStringClassA[0].setMembers(new String [] { \"d\", \"e\" });\n\nm_interfaces.getLocalLBClass().add_string_class_member(StringClassA);\n\n// Set Values\nString [][] valuesAofA = new String[1][];\nvaluesAofA[0] = new String[] { \"data 4\", \"data 5\" };\n\nm_interfaces.getLocalLBClass().set_string_class_member_data_value(\nStringClassA,\nvaluesAofA\n);\n\ngetDataGroup(datagroup);\n}\n
\n#----------------------------------------------------------------------------\nsub createDataGroup()\n#----------------------------------------------------------------------------\n{\nmy ($datagroup) = @_;\n\n my @names = (\"a\", \"b\", \"c\");\n\n my $StringClass =\n {\n name => $datagroup,\n members => [@names]\n };\n\n# Create Data group with names\n$soapResponse = $Class->create_string_class(\nSOAP::Data->name(classes => [$StringClass])\n);\n&checkResponse($soapResponse);\n\n# Set values\n # Build Values 2-D Array for values parameter\n my @valuesA = (\"data 1\", \"data 2\", \"data 3\");\n my @valuesAofA;\n push @valuesAofA, [@valuesA];\n $soapResponse = $Class->set_string_class_member_data_value\n (\n SOAP::Data->name(class_members => [$StringClass]),\n SOAP::Data->name(values => [@valuesAofA])\n );\n &checkResponse($soapResponse);\n\n&getDataGroup($datagroup);\n}\n\n#----------------------------------------------------------------------------\nsub removeFromDataGroup()\n#----------------------------------------------------------------------------\n{\nmy ($datagroup) = @_;\n\n my @names = (\"c\");\n\n my $StringClass =\n {\n name => $datagroup,\n members => [@names]\n };\n\n# Create Data group with names\n$soapResponse = $Class->delete_string_class_member(\nSOAP::Data->name(class_members => [$StringClass])\n);\n&checkResponse($soapResponse);\n\n&getDataGroup($datagroup);\n}\n\n#----------------------------------------------------------------------------\nsub addToDataGroup()\n#----------------------------------------------------------------------------\n{\nmy ($datagroup) = @_;\n\n my @names = (\"d\", \"e\");\n\n my $StringClass =\n {\n name => $datagroup,\n members => [@names]\n };\n\n# Create Data group with names\n$soapResponse = $Class->add_string_class_member(\nSOAP::Data->name(class_members => [$StringClass])\n);\n&checkResponse($soapResponse);\n\n# Set values\n # Build Values 2-D Array for values parameter\n my @valuesA = (\"data 4\", \"data 5\");\n my @valuesAofA;\n push @valuesAofA, [@valuesA];\n $soapResponse = $Class->set_string_class_member_data_value\n (\n SOAP::Data->name(class_members => [$StringClass]),\n SOAP::Data->name(values => [@valuesAofA])\n );\n &checkResponse($soapResponse);\n\n&getDataGroup($datagroup);\n}\n
\n#-------------------------------------------------------------------------\nfunction Create-DataGroup()\n#-------------------------------------------------------------------------\n{\nparam(\n[string]$Name\n);\n\n$StringClassA = New-Object -TypeName iControl.LocalLBClassStringClass[] 1;\n$StringClassA[0] = New-Object -TypeName iControl.LocalLBClassStringClass;\n$StringClassA[0].name = $Name;\n$StringClassA[0].members = (\"a\", \"b\", \"c\");\n\n$(Get-F5.iControl).LocalLBClass.create_string_class(\n$StringClassA\n);\n\n$DataValueA = (\"data 1\", \"data 2\", \"data 3\");\n$DataValuesAofA = \n$(Get-F5.iControl).LocalLBClass.set_string_class_member_data_value(\n$StringClassA,\n(, $DataValueA)\n)\n\nGet-DataGroup -Name $Name;\n}\n\n#-------------------------------------------------------------------------\nfunction RemoveFrom-DataGroup()\n#-------------------------------------------------------------------------\n{\nparam(\n[string]$Name\n);\n\n$StringClassA = New-Object -TypeName iControl.LocalLBClassStringClass[] 1;\n$StringClassA[0] = New-Object -TypeName iControl.LocalLBClassStringClass;\n$StringClassA[0].name = $Name;\n$StringClassA[0].members = (\"c\");\n\n$(Get-F5.iControl).LocalLBClass.delete_string_class_member(\n$StringClassA\n);\n\nGet-DataGroup -Name $Name;\n}\n\n#-------------------------------------------------------------------------\nfunction AddTo-DataGroup()\n#-------------------------------------------------------------------------\n{\nparam(\n[string]$Name\n);\n\n$StringClassA = New-Object -TypeName iControl.LocalLBClassStringClass[] 1;\n$StringClassA[0] = New-Object -TypeName iControl.LocalLBClassStringClass;\n$StringClassA[0].name = $Name;\n$StringClassA[0].members = (\"d\", \"e\");\n\n$(Get-F5.iControl).LocalLBClass.add_string_class_member(\n$StringClassA\n);\n\n$DataValueA = (\"data 4\", \"data 5\");\n$DataValuesAofA = \n$(Get-F5.iControl).LocalLBClass.set_string_class_member_data_value(\n$StringClassA,\n(, $DataValueA)\n)\n\nGet-DataGroup -Name $Name;\n}\n
\ndef get_dg_list(bigip):\n try:\n dg_str_list = bigip.LocalLB.Class.get_string_class_list()\n dg_str_names = bigip.LocalLB.Class.get_string_class(dg_str_list)\n\n\n for dg in dg_str_names:\n print dg\n print ' Data Group: %s' % dg['name']\n for x in dg['members']:\n print ' %s' % x\n\n except Exception, e:\n print e\n\n\ndef extend_dg(bigip, dgname, keys, values):\n try:\n bigip.LocalLB.Class.add_string_class_member([{'name': dgname, 'members': keys}])\n bigip.LocalLB.Class.set_string_class_member_data_value([{'name': dgname, 'members': keys}], [[values]])\n except Exception, e:\n print e\n\n\ndef contract_dg(bigip, dgname, keys):\n try:\n bigip.LocalLB.Class.delete_string_class_member([{'name': dgname, 'members': keys}])\n except Exception, e:\n print e\n\n\ndef create_dg(bigip, dgname, keys, values):\n try:\n bigip.LocalLB.Class.create_string_class([{'name': dgname, 'members': keys}])\n bigip.LocalLB.Class.set_string_class_member_data_value([{'name': dgname, 'members': keys}], [[values]])\n except Exception, e:\n print e\n
\n//--------------------------------------------------------\nfunction createDataGroup(datagroup) {\n//--------------------------------------------------------\n\ndatagroup = datagroup.replace(/\\//g, \"~\");\nvar uri = \"/mgmt/tm/ltm/data-group/internal\";\n\nvar dgObj = {};\ndgObj.name = datagroup;\ndgObj.type = \"string\";\ndgObj.records = [\n{name: \"a\", data: \"data 1\"},\n{name: \"b\", data: \"data 2\"},\n{name: \"c\", data: \"data 3\"},\n];\n\nvar body = JSON.stringify(dgObj);\n\nhandleVERB(\"POST\", uri, body, function(json) {\nconsole.log(json);\n});\n}\n\n//--------------------------------------------------------\nfunction removeFromDataGroup(datagroup) {\n//--------------------------------------------------------\ndg_uri = datagroup.replace(/\\//g, \"~\");\nvar uri = \"/mgmt/tm/ltm/data-group/internal/\" + dg_uri;\n\nvar dgObj = {};\ndgObj.name = datagroup;\ndgObj.records = [\n{name: \"a\", data: \"data 1\"},\n{name: \"b\", data: \"data 2\"}\n];\n\nvar body = JSON.stringify(dgObj);\n\nhandleVERB(\"PATCH\", uri, body, function(json) {\nconsole.log(json);\n});\n}\n\n//--------------------------------------------------------\nfunction addToDataGroup(datagroup) {\n//--------------------------------------------------------\ndg_uri = datagroup.replace(/\\//g, \"~\");\nvar uri = \"/mgmt/tm/ltm/data-group/internal/\" + dg_uri;\n\nvar dgObj = {};\ndgObj.name = datagroup;\ndgObj.records = [\n{name: \"a\", data: \"data 1\"},\n{name: \"b\", data: \"data 2\"},\n{name: \"d\", data: \"data 4\"},\n{name: \"e\", data: \"data 5\"}\n];\n\nvar body = JSON.stringify(dgObj);\n\nhandleVERB(\"PATCH\", uri, body, function(json) {\nconsole.log(json);\n});\n}\n
\n#----------------------------------------------------------------------------\nsub createDataGroup()\n#----------------------------------------------------------------------------\n{\nmy ($datagroup) = @_;\n\n my @names = (\"a\", \"b\", \"c\");\n\n my $StringClass =\n {\n name => $datagroup,\n members => [@names]\n };\n\n# Create Data group with names\n$soapResponse = $Class->create_string_class(\nSOAP::Data->name(classes => [$StringClass])\n);\n&checkResponse($soapResponse);\n\n# Set values\n # Build Values 2-D Array for values parameter\n my @valuesA = (\"data 1\", \"data 2\", \"data 3\");\n my @valuesAofA;\n push @valuesAofA, [@valuesA];\n $soapResponse = $Class->set_string_class_member_data_value\n (\n SOAP::Data->name(class_members => [$StringClass]),\n SOAP::Data->name(values => [@valuesAofA])\n );\n &checkResponse($soapResponse);\n\n&getDataGroup($datagroup);\n}\n\n#----------------------------------------------------------------------------\nsub removeFromDataGroup()\n#----------------------------------------------------------------------------\n{\nmy ($datagroup) = @_;\n\n my @names = (\"c\");\n\n my $StringClass =\n {\n name => $datagroup,\n members => [@names]\n };\n\n# Create Data group with names\n$soapResponse = $Class->delete_string_class_member(\nSOAP::Data->name(class_members => [$StringClass])\n);\n&checkResponse($soapResponse);\n\n&getDataGroup($datagroup);\n}\n\n#----------------------------------------------------------------------------\nsub addToDataGroup()\n#----------------------------------------------------------------------------\n{\nmy ($datagroup) = @_;\n\n my @names = (\"d\", \"e\");\n\n my $StringClass =\n {\n name => $datagroup,\n members => [@names]\n };\n\n# Create Data group with names\n$soapResponse = $Class->add_string_class_member(\nSOAP::Data->name(class_members => [$StringClass])\n);\n&checkResponse($soapResponse);\n\n# Set values\n # Build Values 2-D Array for values parameter\n my @valuesA = (\"data 4\", \"data 5\");\n my @valuesAofA;\n push @valuesAofA, [@valuesA];\n $soapResponse = $Class->set_string_class_member_data_value\n (\n SOAP::Data->name(class_members => [$StringClass]),\n SOAP::Data->name(values => [@valuesAofA])\n );\n &checkResponse($soapResponse);\n\n&getDataGroup($datagroup);\n}\n
\n#----------------------------------------------------------------------------\nfunction Create-DataGroup()\n#\n# Description:\n# This function creates a new internal data group\n#\n# Parameters:\n# Name - The Name of the data group\n#----------------------------------------------------------------------------\n{\n param(\n [string]$Name\n );\n\n$uri = \"/mgmt/tm/ltm/data-group/internal\";\n$link = \"https://$Bigip$uri\";\n$headers = @{};\n$headers.Add(\"ServerHost\", $Bigip);\n$headers.Add(\"Content-Type\", \"application/json\");\n$obj = @{\nname=$Name\ntype=\"string\"\nrecords= (\n@{ name=\"a\"\ndata=\"data 1\"\n},\n@{ name=\"b\"\ndata=\"data 2\"\n},\n@{ name=\"c\"\ndata=\"data 3\"\n}\n)\n};\n$body = $obj | ConvertTo-Json\n\n$secpasswd = ConvertTo-SecureString $Pass -AsPlainText -Force\n$mycreds = New-Object System.Management.Automation.PSCredential ($User, $secpasswd)\n\n$obj = Invoke-RestMethod -Method POST -Uri $link -Headers $headers -Credential $mycreds -Body $body;\n\nWrite-Host \"Pool ${Name} created in partition ${Partition}\"\n}\n\n#----------------------------------------------------------------------------\nfunction RemoveFrom-DataGroup()\n#\n# Description:\n# This function removes an entry from a data group\n#\n# Parameters:\n# Name - The Name of the data group\n#----------------------------------------------------------------------------\n{\n param(\n [string]$Name\n );\n\n$uri = \"/mgmt/tm/ltm/data-group/internal/${Name}\";\n$link = \"https://$Bigip$uri\";\n$headers = @{};\n$headers.Add(\"ServerHost\", $Bigip);\n$headers.Add(\"Content-Type\", \"application/json\");\n$obj = @{\nname=$Name\nrecords= (\n@{ name=\"a\"\ndata=\"data 1\"\n},\n@{ name=\"b\"\ndata=\"data 2\"\n}\n)\n};\n$body = $obj | ConvertTo-Json\n\n$secpasswd = ConvertTo-SecureString $Pass -AsPlainText -Force\n$mycreds = New-Object System.Management.Automation.PSCredential ($User, $secpasswd)\n\n$obj = Invoke-RestMethod -Method PATCH -Uri $link -Headers $headers -Credential $mycreds -Body $body;\n\n$obj | Format-List\n}\n\n#----------------------------------------------------------------------------\nfunction AddTo-DataGroup()\n#\n# Description:\n# This function adds records to an existing data group\n#\n# Parameters:\n# Name - The Name of the data group\n#----------------------------------------------------------------------------\n{\n param(\n [string]$Name\n );\n\n$uri = \"/mgmt/tm/ltm/data-group/internal/${Name}\";\n$link = \"https://$Bigip$uri\";\n$headers = @{};\n$headers.Add(\"ServerHost\", $Bigip);\n$headers.Add(\"Content-Type\", \"application/json\");\n$obj = @{\nname=$Name\nrecords= (\n@{ name=\"a\"\ndata=\"data 1\"\n},\n@{ name=\"b\"\ndata=\"data 2\"\n},\n@{ name=\"d\"\ndata=\"data 4\"\n},\n@{ name=\"e\"\ndata=\"data 5\"\n}\n)\n};\n$body = $obj | ConvertTo-Json\n\n$secpasswd = ConvertTo-SecureString $Pass -AsPlainText -Force\n$mycreds = New-Object System.Management.Automation.PSCredential ($User, $secpasswd)\n\n$obj = Invoke-RestMethod -Method PATCH -Uri $link -Headers $headers -Credential $mycreds -Body $body;\n\n$obj | Format-List\n}\n
\ndef get_dg_list(rq, url):\n try:\n dg_list = rq.get('%s/ltm/data-group/internal' % url).json()\n for dg in dg_list['items']:\n print dg\n print ' Data Group: %s' % dg['name']\n print ' --------------'\n if 'records' in dg:\n for record in dg['records']:\n if 'data' in record:\n print ' %s: %s' % (record['name'], record['data'])\n else:\n print ' %s' % record['name']\n\n except Exception, e:\n print e\n\n\ndef extend_dg(rq, url, dgname, additional_records):\n dg = rq.get('%s/ltm/data-group/internal/%s' % (url, dgname)).json()\n\n current_records = dg['records']\n new_records = []\n for record in current_records:\n if 'data' in record:\n nr = [{'name': record['name'], 'data': record['data']}]\n else:\n nr = [{'name': record['name']}]\n new_records.extend(nr)\n for record in additional_records:\n if 'data' in record:\n nr = [{'name': record['name'], 'data': record['data']}]\n else:\n nr = [{'name': record['name']}]\n new_records.extend(nr)\n\n payload = {}\n payload['records'] = new_records\n rq.put('%s/ltm/data-group/internal/%s' % (url, dgname), json.dumps(payload))\n\n\ndef contract_dg(rq, url, dgname, removal_records):\n dg = rq.get('%s/ltm/data-group/internal/%s' % (url, dgname)).json()\n current_records = dg['records']\n\n new_records = []\n for record in removal_records:\n if 'data' in record:\n nr = [{'name': record['name'], 'data': record['data']}]\n else:\n nr = [{'name': record['name']}]\n new_records.extend(nr)\n\n new_records = [x for x in current_records if x not in new_records]\n\n payload = {}\n payload['records'] = new_records\n rq.put('%s/ltm/data-group/internal/%s' % (url, dgname), json.dumps(payload))\n\n\ndef create_dg(rq, url, dgname, records):\n new_records = []\n for record in records:\n if 'data' in record:\n nr = [{'name': record['name'], 'data': record['data']}]\n else:\n nr = [{'name': record['name']}]\n new_records.extend(nr)\n\n payload = {}\n payload['type'] = 'string'\n payload['name'] = dgname\n payload['records'] = new_records\n try:\n rq.post('%s/ltm/data-group/internal' % url, json.dumps(payload))\n except Exception, e:\n print e\n
All the scripts for this article are available in the codeshare under \"Getting Started with iControl Code Samples.\"
","body@stringLength":"35277","rawBody":"In the previous articles in the Getting Started with iControl series, we covered the history of iControl, taxonomy, and introduced the languages most common to our community. In this article, we'll start looking at some code samples. With each task we cover, we'll show an example for a few languages for both the soap and rest interface. The sheer amount of space in this article required to show full samples of each language for both soap and rest would be overwhelming in line, so for the sample code, we have pulled out the appropriate sections of the code for you to study. Understand that based on the libraries used, if at all, some of the work may be abstracted. Full scripts for each language and portal preference are linked at the bottom of this article. If you click each of the iControl REST and iControl SOAP tabs, you'll see a language listing for the sample code provided. Joe Pruitt is the super hero providing everything not python here, so give him a shout out next time you see him in these parts.
\n\nNote: This article published by Jason Rahm but co-authored with Joe Pruitt.
\n\nWith all the disclaimers out of the way, let's get down to business! The first thing you have to do to talk to the BIG-IP is know where to connect. Some prerequisites:
\n\nThere are dozens of articles and codeshare samples on DevCentral on creating/modifying objects both in rest and soap, so we're not going to cover all the details ad nauseam here. But we do want to introduce the basic concepts of retrieving, creating, and modifying a couple simple objects in this article. The first one we'll tackle is one of the most important building blocks of the BIG-IP configuration: the pool.
\n\nThe pool has many attributes that can be set, but not all are required. In this exercise however, we're going to simply demonstrate the creation of a pool and a pool listing. The pool object can be created via rest with a simple name, and with soap with the name, the lb method, and the members attribute (it can be empty, but the attribute needs to be present.)
\n\n\npublic void displayAllPools() throws Exception\n{\nString [] pool_list = m_interfaces.getLocalLBPool().get_list();\nSystem.out.println(\"Pools\\n\");\nSystem.out.println(\"-----------\\n\");\nfor(int i=0; i<pool_list.length; i++)\n{\nSystem.out.println(pool_list[i]);\n}\n}\n\npublic void createPool(String poolname, String partition) throws Exception\n{\nString [] pool_list = new String[] {\"/\" + partition + \"/\" + poolname};\niControl.LocalLBLBMethod [] lb_methods = new iControl.LocalLBLBMethod[] { iControl.LocalLBLBMethod.LB_METHOD_ROUND_ROBIN };\niControl.CommonIPPortDefinition[][] membersAofA = new iControl.CommonIPPortDefinition[1][];\nmembersAofA[0] = new iControl.CommonIPPortDefinition[1];\nmembersAofA[0][0] = new iControl.CommonIPPortDefinition();\nmembersAofA[0][0].setAddress(\"10.10.10.10\");\nmembersAofA[0][0].setPort(80);\n\nm_interfaces.getLocalLBPool().create(\npool_list,\nlb_methods,\nmembersAofA\n);\n\nSystem.out.println(\"Pool \" + poolname + \" created in partition \" + partition);\n}\n
\n#----------------------------------------------------------------------------\n# getPoolList\n#----------------------------------------------------------------------------\nsub getPoolList()\n{\n$soapResponse = $Pool->get_list();\n&checkResponse($soapResponse);\nmy @pool_list = @{$soapResponse->result};\nprint \"POOL LIST\\n\";\nprint \"---------\\n\";\nforeach $pool (@pool_list) {\nprint \" ${pool}\\n\";\n}\n}\n#----------------------------------------------------------------------------\n# createPool()\n#----------------------------------------------------------------------------\nsub createPool()\n{\nmy ($partition, $pool) = @_;\n\nprint \"CREATING POOL $pool\\n\";\n\nmy @pool_names = [$pool];\nmy @lb_methods = [\"LB_METHOD_ROUND_ROBIN\"]; \n $member = \n {\n address => \"10.10.10.10\",\n port => 80\n };\n \n # memberA is the 1st dimension of the array, we need one for each pool\n push @memberA, $member;\n # memberAofA is the 2nd dimension. push pool members for each pool here.\n push @memberAofA, [@memberA];\n\n$soapResponse = $Pool->create(\nSOAP::Data->name( pool_names => [\"/$partition/$pool\"]),\nSOAP::Data->name( lb_methods => [\"LB_METHOD_ROUND_ROBIN\"]),\n SOAP::Data->name(members => [@memberAofA])\n);\n&checkResponse($soapResponse);\n\nprint \"POOL ${pool} created in partition ${partition}...\\n\";\n}\n
\n#----------------------------------------------------------------------------\nfunction Get-PoolList()\n#----------------------------------------------------------------------------\n{\n $pool_list = $(Get-F5.iControl).LocalLBPool.get_list();\nWrite-Host \"POOL LIST\";\nWrite-Host \"---------\";\n foreach($pool in $pool_list)\n {\nWrite-Host \" $pool\";\n}\n}\n#----------------------------------------------------------------------------\nfunction Create-Pool()\n#\n# Description:\n# This function creates a new pool if the given pool name doesn't\n# already exist.\n#\n# Parameters:\n# Name - The Name of the pool you wish to create.\n# MemberList - A string list of pool member addresses.\n# MemberPort - The port the pool members will be configured with.\n#----------------------------------------------------------------------------\n{\n param(\n [string]$Name,\n [string[]]$MemberList,\n [int]$MemberPort\n );\n \n $IPPortDefList = New-Object -TypeName iControl.CommonIPPortDefinition[] $MemberList.Length;\n for($i=0; $i-lt$MemberList.Length; $i++)\n {\n $IPPortDefList[$i] = New-Object -TypeName iControl.CommonIPPortDefinition;\n $IPPortDefList[$i].address = $MemberList[$i];\n $IPPortDefList[$i].port = $MemberPort;\n }\n \n Write-Host \"Creating Pool $Name\";\n $(Get-F5.iControl).LocalLBPool.create(\n (,$Name),\n (,\"LB_METHOD_ROUND_ROBIN\"),\n (,$IPPortDefList)\n );\n Write-Host \"Pool '$Name' Successfully Created\";\n}\n
\ndef get_pool_list(bigip):\n try:\n poollist = bigip.LocalLB.Pool.get_list()\n print \"POOL LIST\"\n print \" ---------\"\n for pool in poollist:\n print \" %s\" % pool\n\n except Exception, e:\n print e\n\n\ndef create_pool(bigip, pool):\n try:\n bigip.LocalLB.Pool.create_v2([pool], ['LB_METHOD_ROUND_ROBIN'], [[]])\n except Exception, e:\n print e\n
\n//--------------------------------------------------------\nfunction handleVERB(verb, resource, body, callback) {\n//--------------------------------------------------------\ngetAuthToken( function(token) {\nhttpRequest(verb, resource, body, null, null, token, function(json) {\ncallback(json);\n});\n});\n}\n\n//--------------------------------------------------------\nfunction handleGetPoolList(callback) {\n//--------------------------------------------------------\nvar uri = \"/mgmt/tm/ltm/pool\";\nhandleVERB(\"GET\", uri, null, function(json) {\ncallback(json);\n});\n}\n//--------------------------------------------------------\nfunction handleCreatePool(pool, partition, callback) {\n//--------------------------------------------------------\nvar uri = \"/mgmt/tm/ltm/pool\";\nvar body = '{\"name\":\"' + pool + '\", \"partition\":\"' + partition + '\"}';\n\nconsole.log(\"BODY: \" + body);\nhandleVERB(\"POST\", uri, body, function(json) {\ncallback(json);\n});\n}\n
\n#---------------------------------------------------\nsub getPoolList() {\n#---------------------------------------------------\n$resp_json = &handleGET(\"/mgmt/tm/ltm/pool\");\n$resp = decode_json($resp_json);\n@items = @{$resp->{\"items\"}};\n\nprint \"POOL NAMES\\n\";\nprint \"----------\\n\";\nforeach $item (@items) {\n$fullPath = $item->{\"fullPath\"};\nprint \" $fullPath\\n\";\nprint Dumper($item);\n}\n}\n#---------------------------------------------------\nsub handleGET() {\n#---------------------------------------------------\nmy ($resource) = @_;\n\n$url = &buildURL($resource);\n\n$resp = &getHttpRequest($url);\n\nreturn $resp;\n}\n#---------------------------------------------------\nsub createPool() {\n#---------------------------------------------------\nmy ($pool, $partition) = @_;\n\nmy $poolObj;\n$poolObj->{\"name\"} = $pool;\n$poolObj->{\"partition\"} = $partition;\n\nmy $json = encode_json($poolObj);\n\nprint \"JSON: $json\\n\";\nexit();\n\n$resp = &handlePOST(\"/mgmt/tm/ltm/pool\", $json);\n\nprint Dumper($resp);\n}\n#---------------------------------------------------\nsub handlePOST() {\n#---------------------------------------------------\nmy ($resource, $body) = @_;\n\nif ( $body eq \"\" ) { &usage(); }\n\n$url = &buildURL($resource);\n\n$resp = &postHttpRequest($url, $body);\n\nreturn $resp;\n}\n
\n#----------------------------------------------------------------------------\nfunction Get-PoolList()\n#----------------------------------------------------------------------------\n{\n$uri = \"/mgmt/tm/ltm/pool\";\n$link = \"https://$Bigip$uri\";\n$headers = @{};\n$headers.Add(\"ServerHost\", $Bigip);\n\n$secpasswd = ConvertTo-SecureString $Pass -AsPlainText -Force\n$mycreds = New-Object System.Management.Automation.PSCredential ($User, $secpasswd)\n\n$obj = Invoke-RestMethod -Method GET -Headers $headers -Uri $link -Credential $mycreds\n$items = $obj.items;\nWrite-Host \"POOL NAMES\";\nWrite-Host \"----------\";\nfor($i=0; $i -lt $items.length; $i++) {\n$name = $items[$i].fullPath;\nWrite-Host \" $name\";\n}\n}\n#----------------------------------------------------------------------------\nfunction Create-Pool()\n#\n# Description:\n# This function creates a new pool if the given pool name doesn't\n# already exist.\n#\n# Parameters:\n# Name - The Name of the pool you wish to create.\n# Partition - The name of the partition to place the pool in.\n#----------------------------------------------------------------------------\n{\n param(\n [string]$Name,\n[string]$Partition\n );\n\n$uri = \"/mgmt/tm/ltm/pool\";\n$link = \"https://$Bigip$uri\";\n$headers = @{};\n$headers.Add(\"ServerHost\", $Bigip);\n$headers.Add(\"Content-Type\", \"application/json\");\n$obj = @{\nname=$Name\npartition=$Partition\n};\n$body = $obj | ConvertTo-Json\n\n$secpasswd = ConvertTo-SecureString $Pass -AsPlainText -Force\n$mycreds = New-Object System.Management.Automation.PSCredential ($User, $secpasswd)\n\n$obj = Invoke-RestMethod -Method POST -Uri $link -Headers $headers -Credential $mycreds -Body $body;\n\nWrite-Host \"Pool ${Name} created in partition ${Partition}\"\n}\n
\ndef get_pool_list(bigip, url):\n try:\n pools = bigip.get(\"%s/ltm/pool\" % url).json()\n print \"POOL LIST\"\n print \" ---------\"\n for pool in pools['items']:\n print \" /%s/%s\" % (pool['partition'], pool['name'])\n except Exception, e:\n print e\n\n\ndef create_pool(bigip, url, pool, part=None):\n try:\n payload = {}\n payload['name'] = pool\n if part is not None:\n payload['partition'] = part\n\n pool_config = bigip.post(\"%s/ltm/pool\" % url, json.dumps(payload)).json()\n print pool_config\n except Exception, e:\n print e\n
Data-groups are interesting objects with which to work, primarily because you can have internal data-groups, which are wholly contained within bigip.conf, and external data-groups, which has it's definition in bigip.conf but the records are kept in an external file. Also interesting is that this particular object has different attributes via soap than it does in rest. In soap, all the records can be individually managed, so you can add, find, and delete on a record by record basis. Not so with rest. In rest we have the concepts of collections and a subcollections. A collection is like a list of pools. A sub-collection would be the members of a pool. Ideally, a data-group itself would be part of a collection, and it's records would be a subcollection, but that is not the case today. This has major implications if you want to update a data-group. Say you have a data-group with 10,000 records. You want add a record, so you issue an HTTP PUT method with your payload of one record. Instead of the desired outcome of a modified data-group with 10,001 records, you now have a much smaller data-group of exactly one record. Not good! So make sure if you are using the rest interface with data-groups, you store all the existing records, make all your adds/changes/deletes, then PUT the entire record collection. But where the soap interface has the upper hand with being able to update individual records, rest punches back with the ability to list out all data-group at once, whereas with soap, you have to query each type of data-group among string, integer, and address. So there are some pros and cons to both approaches to weigh as you dig in.
\n\n\npublic void createDataGroup(String datagroup) throws Exception\n{\n// Create String Class\niControl.LocalLBClassStringClass [] StringClassA = new iControl.LocalLBClassStringClass[1];\nStringClassA[0] = new iControl.LocalLBClassStringClass();\nStringClassA[0].setName(datagroup);\nStringClassA[0].setMembers(new String [] { \"a\", \"b\", \"c\" });\n\nm_interfaces.getLocalLBClass().create_string_class(StringClassA);\n\n// Set Values\nString [][] valuesAofA = new String[1][];\nvaluesAofA[0] = new String[] { \"data 1\", \"data 2\", \"data 3\" };\n\nm_interfaces.getLocalLBClass().set_string_class_member_data_value(\nStringClassA,\nvaluesAofA\n);\n\ngetDataGroup(datagroup);\n}\npublic void removeFromDataGroup(String datagroup) throws Exception\n{\nString [] names = new String[] {\"c\"};\n\niControl.LocalLBClassStringClass [] StringClassA = new iControl.LocalLBClassStringClass[1];\nStringClassA[0] = new iControl.LocalLBClassStringClass();\nStringClassA[0].setName(datagroup);\nStringClassA[0].setMembers(new String [] { \"c\" });\n\nm_interfaces.getLocalLBClass().delete_string_class_member(StringClassA);\n\ngetDataGroup(datagroup);\n}\n\n//--------------------------------------------------------------------------\n//\n//--------------------------------------------------------------------------\npublic void addToDataGroup(String datagroup) throws Exception\n{\n// Create String Class\niControl.LocalLBClassStringClass [] StringClassA = new iControl.LocalLBClassStringClass[1];\nStringClassA[0] = new iControl.LocalLBClassStringClass();\nStringClassA[0].setName(datagroup);\nStringClassA[0].setMembers(new String [] { \"d\", \"e\" });\n\nm_interfaces.getLocalLBClass().add_string_class_member(StringClassA);\n\n// Set Values\nString [][] valuesAofA = new String[1][];\nvaluesAofA[0] = new String[] { \"data 4\", \"data 5\" };\n\nm_interfaces.getLocalLBClass().set_string_class_member_data_value(\nStringClassA,\nvaluesAofA\n);\n\ngetDataGroup(datagroup);\n}\n
\n#----------------------------------------------------------------------------\nsub createDataGroup()\n#----------------------------------------------------------------------------\n{\nmy ($datagroup) = @_;\n\n my @names = (\"a\", \"b\", \"c\");\n\n my $StringClass =\n {\n name => $datagroup,\n members => [@names]\n };\n\n# Create Data group with names\n$soapResponse = $Class->create_string_class(\nSOAP::Data->name(classes => [$StringClass])\n);\n&checkResponse($soapResponse);\n\n# Set values\n # Build Values 2-D Array for values parameter\n my @valuesA = (\"data 1\", \"data 2\", \"data 3\");\n my @valuesAofA;\n push @valuesAofA, [@valuesA];\n $soapResponse = $Class->set_string_class_member_data_value\n (\n SOAP::Data->name(class_members => [$StringClass]),\n SOAP::Data->name(values => [@valuesAofA])\n );\n &checkResponse($soapResponse);\n\n&getDataGroup($datagroup);\n}\n\n#----------------------------------------------------------------------------\nsub removeFromDataGroup()\n#----------------------------------------------------------------------------\n{\nmy ($datagroup) = @_;\n\n my @names = (\"c\");\n\n my $StringClass =\n {\n name => $datagroup,\n members => [@names]\n };\n\n# Create Data group with names\n$soapResponse = $Class->delete_string_class_member(\nSOAP::Data->name(class_members => [$StringClass])\n);\n&checkResponse($soapResponse);\n\n&getDataGroup($datagroup);\n}\n\n#----------------------------------------------------------------------------\nsub addToDataGroup()\n#----------------------------------------------------------------------------\n{\nmy ($datagroup) = @_;\n\n my @names = (\"d\", \"e\");\n\n my $StringClass =\n {\n name => $datagroup,\n members => [@names]\n };\n\n# Create Data group with names\n$soapResponse = $Class->add_string_class_member(\nSOAP::Data->name(class_members => [$StringClass])\n);\n&checkResponse($soapResponse);\n\n# Set values\n # Build Values 2-D Array for values parameter\n my @valuesA = (\"data 4\", \"data 5\");\n my @valuesAofA;\n push @valuesAofA, [@valuesA];\n $soapResponse = $Class->set_string_class_member_data_value\n (\n SOAP::Data->name(class_members => [$StringClass]),\n SOAP::Data->name(values => [@valuesAofA])\n );\n &checkResponse($soapResponse);\n\n&getDataGroup($datagroup);\n}\n
\n#-------------------------------------------------------------------------\nfunction Create-DataGroup()\n#-------------------------------------------------------------------------\n{\nparam(\n[string]$Name\n);\n\n$StringClassA = New-Object -TypeName iControl.LocalLBClassStringClass[] 1;\n$StringClassA[0] = New-Object -TypeName iControl.LocalLBClassStringClass;\n$StringClassA[0].name = $Name;\n$StringClassA[0].members = (\"a\", \"b\", \"c\");\n\n$(Get-F5.iControl).LocalLBClass.create_string_class(\n$StringClassA\n);\n\n$DataValueA = (\"data 1\", \"data 2\", \"data 3\");\n$DataValuesAofA = \n$(Get-F5.iControl).LocalLBClass.set_string_class_member_data_value(\n$StringClassA,\n(, $DataValueA)\n)\n\nGet-DataGroup -Name $Name;\n}\n\n#-------------------------------------------------------------------------\nfunction RemoveFrom-DataGroup()\n#-------------------------------------------------------------------------\n{\nparam(\n[string]$Name\n);\n\n$StringClassA = New-Object -TypeName iControl.LocalLBClassStringClass[] 1;\n$StringClassA[0] = New-Object -TypeName iControl.LocalLBClassStringClass;\n$StringClassA[0].name = $Name;\n$StringClassA[0].members = (\"c\");\n\n$(Get-F5.iControl).LocalLBClass.delete_string_class_member(\n$StringClassA\n);\n\nGet-DataGroup -Name $Name;\n}\n\n#-------------------------------------------------------------------------\nfunction AddTo-DataGroup()\n#-------------------------------------------------------------------------\n{\nparam(\n[string]$Name\n);\n\n$StringClassA = New-Object -TypeName iControl.LocalLBClassStringClass[] 1;\n$StringClassA[0] = New-Object -TypeName iControl.LocalLBClassStringClass;\n$StringClassA[0].name = $Name;\n$StringClassA[0].members = (\"d\", \"e\");\n\n$(Get-F5.iControl).LocalLBClass.add_string_class_member(\n$StringClassA\n);\n\n$DataValueA = (\"data 4\", \"data 5\");\n$DataValuesAofA = \n$(Get-F5.iControl).LocalLBClass.set_string_class_member_data_value(\n$StringClassA,\n(, $DataValueA)\n)\n\nGet-DataGroup -Name $Name;\n}\n
\ndef get_dg_list(bigip):\n try:\n dg_str_list = bigip.LocalLB.Class.get_string_class_list()\n dg_str_names = bigip.LocalLB.Class.get_string_class(dg_str_list)\n\n\n for dg in dg_str_names:\n print dg\n print ' Data Group: %s' % dg['name']\n for x in dg['members']:\n print ' %s' % x\n\n except Exception, e:\n print e\n\n\ndef extend_dg(bigip, dgname, keys, values):\n try:\n bigip.LocalLB.Class.add_string_class_member([{'name': dgname, 'members': keys}])\n bigip.LocalLB.Class.set_string_class_member_data_value([{'name': dgname, 'members': keys}], [[values]])\n except Exception, e:\n print e\n\n\ndef contract_dg(bigip, dgname, keys):\n try:\n bigip.LocalLB.Class.delete_string_class_member([{'name': dgname, 'members': keys}])\n except Exception, e:\n print e\n\n\ndef create_dg(bigip, dgname, keys, values):\n try:\n bigip.LocalLB.Class.create_string_class([{'name': dgname, 'members': keys}])\n bigip.LocalLB.Class.set_string_class_member_data_value([{'name': dgname, 'members': keys}], [[values]])\n except Exception, e:\n print e\n
\n//--------------------------------------------------------\nfunction createDataGroup(datagroup) {\n//--------------------------------------------------------\n\ndatagroup = datagroup.replace(/\\//g, \"~\");\nvar uri = \"/mgmt/tm/ltm/data-group/internal\";\n\nvar dgObj = {};\ndgObj.name = datagroup;\ndgObj.type = \"string\";\ndgObj.records = [\n{name: \"a\", data: \"data 1\"},\n{name: \"b\", data: \"data 2\"},\n{name: \"c\", data: \"data 3\"},\n];\n\nvar body = JSON.stringify(dgObj);\n\nhandleVERB(\"POST\", uri, body, function(json) {\nconsole.log(json);\n});\n}\n\n//--------------------------------------------------------\nfunction removeFromDataGroup(datagroup) {\n//--------------------------------------------------------\ndg_uri = datagroup.replace(/\\//g, \"~\");\nvar uri = \"/mgmt/tm/ltm/data-group/internal/\" + dg_uri;\n\nvar dgObj = {};\ndgObj.name = datagroup;\ndgObj.records = [\n{name: \"a\", data: \"data 1\"},\n{name: \"b\", data: \"data 2\"}\n];\n\nvar body = JSON.stringify(dgObj);\n\nhandleVERB(\"PATCH\", uri, body, function(json) {\nconsole.log(json);\n});\n}\n\n//--------------------------------------------------------\nfunction addToDataGroup(datagroup) {\n//--------------------------------------------------------\ndg_uri = datagroup.replace(/\\//g, \"~\");\nvar uri = \"/mgmt/tm/ltm/data-group/internal/\" + dg_uri;\n\nvar dgObj = {};\ndgObj.name = datagroup;\ndgObj.records = [\n{name: \"a\", data: \"data 1\"},\n{name: \"b\", data: \"data 2\"},\n{name: \"d\", data: \"data 4\"},\n{name: \"e\", data: \"data 5\"}\n];\n\nvar body = JSON.stringify(dgObj);\n\nhandleVERB(\"PATCH\", uri, body, function(json) {\nconsole.log(json);\n});\n}\n
\n#----------------------------------------------------------------------------\nsub createDataGroup()\n#----------------------------------------------------------------------------\n{\nmy ($datagroup) = @_;\n\n my @names = (\"a\", \"b\", \"c\");\n\n my $StringClass =\n {\n name => $datagroup,\n members => [@names]\n };\n\n# Create Data group with names\n$soapResponse = $Class->create_string_class(\nSOAP::Data->name(classes => [$StringClass])\n);\n&checkResponse($soapResponse);\n\n# Set values\n # Build Values 2-D Array for values parameter\n my @valuesA = (\"data 1\", \"data 2\", \"data 3\");\n my @valuesAofA;\n push @valuesAofA, [@valuesA];\n $soapResponse = $Class->set_string_class_member_data_value\n (\n SOAP::Data->name(class_members => [$StringClass]),\n SOAP::Data->name(values => [@valuesAofA])\n );\n &checkResponse($soapResponse);\n\n&getDataGroup($datagroup);\n}\n\n#----------------------------------------------------------------------------\nsub removeFromDataGroup()\n#----------------------------------------------------------------------------\n{\nmy ($datagroup) = @_;\n\n my @names = (\"c\");\n\n my $StringClass =\n {\n name => $datagroup,\n members => [@names]\n };\n\n# Create Data group with names\n$soapResponse = $Class->delete_string_class_member(\nSOAP::Data->name(class_members => [$StringClass])\n);\n&checkResponse($soapResponse);\n\n&getDataGroup($datagroup);\n}\n\n#----------------------------------------------------------------------------\nsub addToDataGroup()\n#----------------------------------------------------------------------------\n{\nmy ($datagroup) = @_;\n\n my @names = (\"d\", \"e\");\n\n my $StringClass =\n {\n name => $datagroup,\n members => [@names]\n };\n\n# Create Data group with names\n$soapResponse = $Class->add_string_class_member(\nSOAP::Data->name(class_members => [$StringClass])\n);\n&checkResponse($soapResponse);\n\n# Set values\n # Build Values 2-D Array for values parameter\n my @valuesA = (\"data 4\", \"data 5\");\n my @valuesAofA;\n push @valuesAofA, [@valuesA];\n $soapResponse = $Class->set_string_class_member_data_value\n (\n SOAP::Data->name(class_members => [$StringClass]),\n SOAP::Data->name(values => [@valuesAofA])\n );\n &checkResponse($soapResponse);\n\n&getDataGroup($datagroup);\n}\n
\n#----------------------------------------------------------------------------\nfunction Create-DataGroup()\n#\n# Description:\n# This function creates a new internal data group\n#\n# Parameters:\n# Name - The Name of the data group\n#----------------------------------------------------------------------------\n{\n param(\n [string]$Name\n );\n\n$uri = \"/mgmt/tm/ltm/data-group/internal\";\n$link = \"https://$Bigip$uri\";\n$headers = @{};\n$headers.Add(\"ServerHost\", $Bigip);\n$headers.Add(\"Content-Type\", \"application/json\");\n$obj = @{\nname=$Name\ntype=\"string\"\nrecords= (\n@{ name=\"a\"\ndata=\"data 1\"\n},\n@{ name=\"b\"\ndata=\"data 2\"\n},\n@{ name=\"c\"\ndata=\"data 3\"\n}\n)\n};\n$body = $obj | ConvertTo-Json\n\n$secpasswd = ConvertTo-SecureString $Pass -AsPlainText -Force\n$mycreds = New-Object System.Management.Automation.PSCredential ($User, $secpasswd)\n\n$obj = Invoke-RestMethod -Method POST -Uri $link -Headers $headers -Credential $mycreds -Body $body;\n\nWrite-Host \"Pool ${Name} created in partition ${Partition}\"\n}\n\n#----------------------------------------------------------------------------\nfunction RemoveFrom-DataGroup()\n#\n# Description:\n# This function removes an entry from a data group\n#\n# Parameters:\n# Name - The Name of the data group\n#----------------------------------------------------------------------------\n{\n param(\n [string]$Name\n );\n\n$uri = \"/mgmt/tm/ltm/data-group/internal/${Name}\";\n$link = \"https://$Bigip$uri\";\n$headers = @{};\n$headers.Add(\"ServerHost\", $Bigip);\n$headers.Add(\"Content-Type\", \"application/json\");\n$obj = @{\nname=$Name\nrecords= (\n@{ name=\"a\"\ndata=\"data 1\"\n},\n@{ name=\"b\"\ndata=\"data 2\"\n}\n)\n};\n$body = $obj | ConvertTo-Json\n\n$secpasswd = ConvertTo-SecureString $Pass -AsPlainText -Force\n$mycreds = New-Object System.Management.Automation.PSCredential ($User, $secpasswd)\n\n$obj = Invoke-RestMethod -Method PATCH -Uri $link -Headers $headers -Credential $mycreds -Body $body;\n\n$obj | Format-List\n}\n\n#----------------------------------------------------------------------------\nfunction AddTo-DataGroup()\n#\n# Description:\n# This function adds records to an existing data group\n#\n# Parameters:\n# Name - The Name of the data group\n#----------------------------------------------------------------------------\n{\n param(\n [string]$Name\n );\n\n$uri = \"/mgmt/tm/ltm/data-group/internal/${Name}\";\n$link = \"https://$Bigip$uri\";\n$headers = @{};\n$headers.Add(\"ServerHost\", $Bigip);\n$headers.Add(\"Content-Type\", \"application/json\");\n$obj = @{\nname=$Name\nrecords= (\n@{ name=\"a\"\ndata=\"data 1\"\n},\n@{ name=\"b\"\ndata=\"data 2\"\n},\n@{ name=\"d\"\ndata=\"data 4\"\n},\n@{ name=\"e\"\ndata=\"data 5\"\n}\n)\n};\n$body = $obj | ConvertTo-Json\n\n$secpasswd = ConvertTo-SecureString $Pass -AsPlainText -Force\n$mycreds = New-Object System.Management.Automation.PSCredential ($User, $secpasswd)\n\n$obj = Invoke-RestMethod -Method PATCH -Uri $link -Headers $headers -Credential $mycreds -Body $body;\n\n$obj | Format-List\n}\n
\ndef get_dg_list(rq, url):\n try:\n dg_list = rq.get('%s/ltm/data-group/internal' % url).json()\n for dg in dg_list['items']:\n print dg\n print ' Data Group: %s' % dg['name']\n print ' --------------'\n if 'records' in dg:\n for record in dg['records']:\n if 'data' in record:\n print ' %s: %s' % (record['name'], record['data'])\n else:\n print ' %s' % record['name']\n\n except Exception, e:\n print e\n\n\ndef extend_dg(rq, url, dgname, additional_records):\n dg = rq.get('%s/ltm/data-group/internal/%s' % (url, dgname)).json()\n\n current_records = dg['records']\n new_records = []\n for record in current_records:\n if 'data' in record:\n nr = [{'name': record['name'], 'data': record['data']}]\n else:\n nr = [{'name': record['name']}]\n new_records.extend(nr)\n for record in additional_records:\n if 'data' in record:\n nr = [{'name': record['name'], 'data': record['data']}]\n else:\n nr = [{'name': record['name']}]\n new_records.extend(nr)\n\n payload = {}\n payload['records'] = new_records\n rq.put('%s/ltm/data-group/internal/%s' % (url, dgname), json.dumps(payload))\n\n\ndef contract_dg(rq, url, dgname, removal_records):\n dg = rq.get('%s/ltm/data-group/internal/%s' % (url, dgname)).json()\n current_records = dg['records']\n\n new_records = []\n for record in removal_records:\n if 'data' in record:\n nr = [{'name': record['name'], 'data': record['data']}]\n else:\n nr = [{'name': record['name']}]\n new_records.extend(nr)\n\n new_records = [x for x in current_records if x not in new_records]\n\n payload = {}\n payload['records'] = new_records\n rq.put('%s/ltm/data-group/internal/%s' % (url, dgname), json.dumps(payload))\n\n\ndef create_dg(rq, url, dgname, records):\n new_records = []\n for record in records:\n if 'data' in record:\n nr = [{'name': record['name'], 'data': record['data']}]\n else:\n nr = [{'name': record['name']}]\n new_records.extend(nr)\n\n payload = {}\n payload['type'] = 'string'\n payload['name'] = dgname\n payload['records'] = new_records\n try:\n rq.post('%s/ltm/data-group/internal' % url, json.dumps(payload))\n except Exception, e:\n print e\n
All the scripts for this article are available in the codeshare under \"Getting Started with iControl Code Samples.\"
","kudosSumWeight":0,"postTime":"2016-06-15T10:54:44.000-07: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":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[{"__typename":"TagEdge","cursor":"MjUuM3wyLjF8b3wxMHxfTlZffDE","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":"MjUuM3wyLjF8b3wxMHxfTlZffDI","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":"MjUuM3wyLjF8b3wxMHxfTlZffDM","node":{"__typename":"Tag","id":"tag:iControlREST","text":"iControlREST","time":"2022-01-24T02:29:46.488-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuM3wyLjF8b3wxMHxfTlZffDQ","node":{"__typename":"Tag","id":"tag:series-icontrol-getting-started","text":"series-icontrol-getting-started","time":"2022-02-08T15:18:10.188-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}}]},"timeToRead":14,"rawTeaser":"","introduction":"","currentRevision":{"__ref":"Revision:revision:290235_1"},"latestVersion":{"__typename":"FriendlyVersion","major":"1","minor":"0"},"metrics":{"__typename":"MessageMetrics","views":3824},"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:51154"}}]},"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":[],"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:290235":{"__typename":"Conversation","id":"conversation:290235","solved":false,"topic":{"__ref":"TkbTopicMessage:message:290235"},"lastPostingActivityTime":"2016-06-15T10:54:44.000-07:00","lastPostTime":"2016-06-15T10:54:44.000-07:00","unreadReplyCount":0,"isSubscribed":false},"ModerationData:moderation_data:290235":{"__typename":"ModerationData","id":"moderation_data:290235","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"Revision:revision:290235_1":{"__typename":"Revision","id":"revision:290235_1","lastEditTime":"2016-06-15T10:54:44.000-07:00"},"CachedAsset:theme:customTheme1-1745262151711":{"__typename":"CachedAsset","id":"theme:customTheme1-1745262151711","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","defaultMessageFontFamily":"var(--lia-bs-font-family-base)","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-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1745262169027","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:quilt:f5.prod:pages/kbs/TkbMessagePage:board:TechnicalArticles-1745262166036":{"__typename":"CachedAsset","id":"quilt:f5.prod:pages/kbs/TkbMessagePage:board:TechnicalArticles-1745262166036","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-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1745262169027","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-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-pages/kbs/TkbMessagePage-1745262169027","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:1745262147237":{"__typename":"CachedAsset","id":"quiltWrapper:f5.prod:Common:1745262147237","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-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1745262169027","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-us-1745262174766":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_MetaNav-en-us-1745262174766","value":{"component":{"id":"custom.widget.Beta_MetaNav","template":{"id":"Beta_MetaNav","markupLanguage":"HANDLEBARS","style":null,"texts":{},"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-us-1745262174766":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_Footer-en-us-1745262174766","value":{"component":{"id":"custom.widget.Beta_Footer","template":{"id":"Beta_Footer","markupLanguage":"HANDLEBARS","style":null,"texts":{},"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-us-1745262174766":{"__typename":"CachedAsset","id":"component:custom.widget.Tag_Manager_Helper-en-us-1745262174766","value":{"component":{"id":"custom.widget.Tag_Manager_Helper","template":{"id":"Tag_Manager_Helper","markupLanguage":"HANDLEBARS","style":null,"texts":{},"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-us-1745262174766":{"__typename":"CachedAsset","id":"component:custom.widget.Consent_Blackbar-en-us-1745262174766","value":{"component":{"id":"custom.widget.Consent_Blackbar","template":{"id":"Consent_Blackbar","markupLanguage":"HTML","style":null,"texts":{},"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-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1745262169027","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBanner-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBanner-1745262169027","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-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/tkbs/TkbArticleWidget-1745262169027","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:99":{"__typename":"Chapter","id":"chapter:99","guide":{"__ref":"Guide:guide:10"}},"TkbTopicMessage:message:290306":{"__typename":"TkbTopicMessage","id":"message:290306","uid":290306,"subject":"Getting Started with iControl: Interface Taxonomy & Language Libraries","board":{"__ref":"Tkb:board:TechnicalArticles"}},"TkbTopicMessage:message:289161":{"__typename":"TkbTopicMessage","id":"message:289161","uid":289161,"subject":"Getting Started with iControl: Working with Statistics","board":{"__ref":"Tkb:board:TechnicalArticles"}},"QueryVariables:TopicReplyList:message:290235:1":{"__typename":"QueryVariables","id":"TopicReplyList:message:290235:1","value":{"id":"message:290235","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-components/community/Navbar-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1745262169027","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-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1745262169027","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1745262169027","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1745262169027","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1745262169027","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-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1745262169027","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewStandard-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewStandard-1745262169027","value":{"anonymous":"Anonymous","author":"{messageAuthorLogin}","authorBy":"{messageAuthorLogin}","board":"{messageBoardTitle}","replyToUser":" to {parentAuthor}","showMoreReplies":"Show More","replyText":"Reply","repliesText":"Replies","markedAsSolved":"Marked as Solution","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-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/messages/ThreadedReplyList-1745262169027","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-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyCallToAction-1745262169027","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},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1745262169027","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1745262169027","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1745262169027","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1745262169027","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-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageCustomFields-1745262169027","value":{"CustomField.default.label":"Value of {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageRevision-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRevision-1745262169027","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-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyButton-1745262169027","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-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageAuthorBio-1745262169027","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-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/guides/GuideBottomNavigation-1745262169027","value":{"nav.label":"Previous/Next Page","nav.previous":"Previous","nav.next":"Next"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagView/TagViewChip-1745262169027","value":{"tagLabelName":"Tag name {tagName}"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1745262169027","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserRank-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserRank-1745262169027","value":{"rankName":"{rankName}","userRank":"Author rank {rankName}"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserRegistrationDate-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserRegistrationDate-1745262169027","value":{"noPrefix":"{date}","withPrefix":"Joined {date}"},"localOverride":false},"CachedAsset:text:en_US-components/customComponent/CustomComponent-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-components/customComponent/CustomComponent-1745262169027","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-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1745262169027","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1745262169027":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/ranks/UserRankLabel-1745262169027","value":{"altTitle":"Icon for {rankName} rank"},"localOverride":false}}}},"page":"/kbs/TkbMessagePage/TkbMessagePage","query":{"guideId":"guide:10","boardId":"technicalarticles","messageSubject":"getting-started-with-icontrol-working-with-configuration-objects","messageId":"290235"},"buildId":"FP3zsFp6DJl70wDujOvtu","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"f5","openTelemetryServiceVersion":"25.3.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/UnwrappedList/UnwrappedList.tsx","./components/tags/TagView/TagView.tsx","./components/tags/TagView/TagViewChip/TagViewChip.tsx","./components/customComponent/CustomComponentContent/HtmlContent.tsx","./components/customComponent/CustomComponentContent/CustomComponentScripts.tsx"],"appGip":true,"scriptLoader":[]}/discussions/technicalforum/cost-of-api-usage/222881?guideId=guide%3A10