Full examples of iControlREST for device and application service deployment

In a previous article, I highlighted a proof-of-concept where we fully automated the deployment of BIG-IP in AWS using the web interfaces of BIG-IP inconjunction with Ansible.  The goal of this article is to focus in more detail on the use of iControlREST within that project, in order to show how it can be extremely useful for automating various aspects of your ITOM workflows.

There are four main workflows we execute in order to configure BIG-IP in AWS and to deploy services.  This breakown is provided below.  

For now, we avoid the discussion about which configuration elements are part of the infrastructure deployment or the application deployment.  This is an important discussion, but one that can only take place after we understand how to provision the elements that will be a part of either workflow. 

For each of these workflows, we have provided the log output which shows REST calls and responses.  To gain from these examples, it is important to understand the following:

  • These iControlREST calls were scraped from an execution of the aws-deployments code where we captured log output. In that project, we have written a custom Ansible module called 'bigip_config' (see /library/bigip_config.py in the project directory of Github).  This module is used to provision config objects within TMOS using iControlREST.
  • In order to make it easier to use this 'bigip_config' Ansible module, we aimed to make it idempotent.  This means that we need only identify the resources we wish to create or update, and identify the state of the resource after our module is run.  We don't need to worry about whether the object exists when calling our module, or the procedural set of calls that should be made it order to get it there.  An example might be like: "create iApp service 'my_app' with parameters X, Y, and Z".  We don't care whether 'my_app' already exists.  In order to implement such behavior, the module internally does an HTTP GET against the resource or collection it is modifying. Subsequently, if the resource already exists, a PATCH call is made, otherwise a POST call is made. 
  • In many cases in the code, we repeat a call until it returns successfully or returns the state we are expecting.  You can see this in the examples, where the same call seems to be made repeatedly. 

Basic system configuration

  • The examples below show how we are configuring basic device settings with REST.
  • First, because BIG-IP was just started, we wait until the first iCR call, "GET mgmt/tm/sys/db", succeeds before we continue.
  • The final step the workflow involves provisioning modules on BIG-IP. Note the 30 second wait between provisioning of AVR and ASM reflected in the timestamps.
2015-11-12 09:46:03 : Disabling Setup Utility in GUI
GET mgmt/tm/sys/db ""
2015-11-12 09:46:10 : Disabling Setup Utility in GUI
GET mgmt/tm/sys/db ""
2015-11-12 09:46:17 : Disabling Setup Utility in GUI
GET mgmt/tm/sys/db ""
Method GET mgmt/tm/sys/db returned: {"kind":"tm:sys:db:dbcollectionstate","selfLink":"https://localhost/mgmt/tm/sys/db?ver=11.6.0","items":[....<a whole bunch of database variables>...]}

2015-11-12 09:46:19 : Disabling Setup Utility in GUI
PATCH mgmt/tm/sys/db/setup.run?ver=11.6.0 {"value": "false"}
Method PATCH mgmt/tm/sys/db/setup.run?ver=11.6.0 returned: {"kind":"tm:sys:db:dbstate","name":"setup.run","fullPath":"setup.run","generation":62,"selfLink":"https://localhost/mgmt/tm/sys/db/setup.run?ver=11.6.0","defaultValue":"true","scfConfig":"false","value":"false","valueRange":"false true"}

2015-11-12 09:46:22 : Configuring NTP servers
PATCH mgmt/tm/sys/ntp {"timezone": "America/Los_Angeles", "servers": ["0.pool.ntp.org", "1.pool.ntp.org"]}
Method PATCH mgmt/tm/sys/ntp returned: {"kind":"tm:sys:ntp:ntpstate","selfLink":"https://localhost/mgmt/tm/sys/ntp?ver=11.6.0","servers":["0.pool.ntp.org","1.pool.ntp.org"],"timezone":"America/Los_Angeles","restrictReference":{"link":"https://localhost/mgmt/tm/sys/ntp/restrict?ver=11.6.0","isSubcollection":true}}

2015-11-12 09:46:25 : Configuring syslog logging destinations
PATCH mgmt/tm/sys/syslog {"include": "destination loghost { udp( 10.0.3.32 port (514));};"}
Method PATCH mgmt/tm/sys/syslog returned: {"kind":"tm:sys:syslog:syslogstate","selfLink":"https://localhost/mgmt/tm/sys/syslog?ver=11.6.0","authPrivFrom":"notice","authPrivTo":"emerg","consoleLog":"enabled","cronFrom":"warning","cronTo":"emerg","daemonFrom":"notice","daemonTo":"emerg","include":"destination loghost { udp( 10.0.3.32 port (514));};","isoDate":"disabled","kernFrom":"debug","kernTo":"emerg","local6From":"notice","local6To":"emerg","mailFrom":"notice","mailTo":"emerg","messagesFrom":"notice","messagesTo":"warning","userLogFrom":"notice","userLogTo":"emerg"}

2015-11-12 09:46:28 : Configuring HTTP mgmt access
PATCH mgmt/tm/sys/httpd {"allow": ["ALL"]}
Method PATCH mgmt/tm/sys/httpd returned: {"kind":"tm:sys:httpd:httpdstate","selfLink":"https://localhost/mgmt/tm/sys/httpd?ver=11.6.0","allow":["ALL"],"authName":"BIG-IP","authPamDashboardTimeout":"off","authPamIdleTimeout":1200,"authPamValidateIp":"on","fastcgiTimeout":300,"hostnameLookup":"off","logLevel":"warn","maxClients":10,"redirectHttpToHttps":"disabled","requestBodyMaxTimeout":0,"requestBodyMinRate":500,"requestBodyTimeout":60,"requestHeaderMaxTimeout":40,"requestHeaderMinRate":500,"requestHeaderTimeout":20,"sslCertfile":"/etc/httpd/conf/ssl.crt/server.crt","sslCertkeyfile":"/etc/httpd/conf/ssl.key/server.key","sslCiphersuite":"DEFAULT:!aNULL:!eNULL:!LOW:!RC4:!MD5:!EXP","sslOcspDefaultResponder":"http://127.0.0.1","sslOcspEnable":"off","sslOcspOverrideResponder":"off","sslOcspResponderTimeout":300,"sslOcspResponseMaxAge":-1,"sslOcspResponseTimeSkew":300,"sslProtocol":"all -SSLv2 -SSLv3","sslVerifyClient":"no","sslVerifyDepth":10}

2015-11-12 09:46:31 : Configuring SSH mgmt access
PATCH mgmt/tm/sys/sshd {"allow": ["ALL"]}
Method PATCH mgmt/tm/sys/sshd returned: {"kind":"tm:sys:sshd:sshdstate","selfLink":"https://localhost/mgmt/tm/sys/sshd?ver=11.6.0","allow":["ALL"],"banner":"disabled","inactivityTimeout":0,"logLevel":"info","login":"enabled"}

2015-11-12 09:46:33 : Configuring SNMP access
PATCH mgmt/tm/sys/snmp {"allowedAddresses": ["172.16.0.0/16"]}
Method PATCH mgmt/tm/sys/snmp returned: {"kind":"tm:sys:snmp:snmpstate","selfLink":"https://localhost/mgmt/tm/sys/snmp?ver=11.6.0","agentAddresses":["tcp6:161","udp6:161"],"agentTrap":"enabled","allowedAddresses":["172.16.0.0/16"],"authTrap":"disabled","bigipTraps":"enabled","l2forwardVlan":"none","loadMax1":12,"loadMax15":12,"loadMax5":12,"sysContact":"Customer Name <admin@customer.com>","sysLocation":"Network Closet 1","sysServices":78,"trapCommunity":"public","trapSource":"none","communitiesReference":{"link":"https://localhost/mgmt/tm/sys/snmp/communities?ver=11.6.0","isSubcollection":true},"diskMonitors":[{"name":"root","partition":"Common","minspace":2000,"minspaceType":"size","path":"/"},{"name":"var","partition":"Common","minspace":10000,"minspaceType":"size","path":"/var"}],"processMonitors":[{"name":"bigd","partition":"Common","maxProcesses":"1","minProcesses":1,"process":"bigd"},{"name":"chmand","partition":"Common","maxProcesses":"1","minProcesses":1,"process":"chmand"},{"name":"httpd","partition":"Common","maxProcesses":"infinity","minProcesses":1,"process":"httpd"},{"name":"mcpd","partition":"Common","maxProcesses":"1","minProcesses":1,"process":"mcpd"},{"name":"sod","partition":"Common","maxProcesses":"1","minProcesses":1,"process":"sod"},{"name":"tmm","partition":"Common","maxProcesses":"infinity","minProcesses":1,"process":"tmm"}],"trapsReference":{"link":"https://localhost/mgmt/tm/sys/snmp/traps?ver=11.6.0","isSubcollection":true},"usersReference":{"link":"https://localhost/mgmt/tm/sys/snmp/users?ver=11.6.0","isSubcollection":true}}

2015-11-12 09:46:36 : Configuring FastL4 profiles ... fastL4-route-friendly
GET mgmt/tm/ltm/profile/fastl4 ""
Method GET mgmt/tm/ltm/profile/fastl4 returned: {"kind":"tm:ltm:profile:fastl4:fastl4collectionstate","selfLink":"https://localhost/mgmt/tm/ltm/profile/fastl4?ver=11.6.0","items":[{"kind":"tm:ltm:profile:fastl4:fastl4state","name":"fastL4","partition":"Common","fullPath":"/Common/fastL4","generation":1,"selfLink":"https://localhost/mgmt/tm/ltm/profile/fastl4/~Common~fastL4?ver=11.6.0","clientTimeout":30,"explicitFlowMigration":"disabled","hardwareSynCookie":"enabled","idleTimeout":"300","ipTosToClient":"pass-through","ipTosToServer":"pass-through","keepAliveInterval":"disabled","lateBinding":"disabled","linkQosToClient":"pass-through","linkQosToServer":"pass-through","looseClose":"disabled","looseInitialization":"disabled","mssOverride":0,"priorityToClient":"pass-through","priorityToServer":"pass-through","pvaAcceleration":"full","pvaDynamicClientPackets":1,"pvaDynamicServerPackets":0,"pvaFlowAging":"enabled","pvaFlowEvict":"enabled","pvaOffloadDynamic":"enabled","pvaOffloadState":"embryonic","reassembleFragments":"disabled","receiveWindowSize":0,"resetOnTimeout":"enabled","rttFromClient":"disabled","rttFromServer":"disabled","serverSack":"disabled","serverTimestamp":"disabled","softwareSynCookie":"disabled","synCookieWhitelist":"disabled","tcpCloseTimeout":"5","tcpGenerateIsn":"disabled","tcpHandshakeTimeout":"5","tcpStripSack":"disabled","tcpTimestampMode":"preserve","tcpWscaleMode":"preserve","timeoutRecovery":"disconnect"}]}

2015-11-12 09:46:37 : Configuring FastL4 profiles ... fastL4-route-friendly
POST mgmt/tm/ltm/profile/fastl4 {"looseClose": "enabled", "resetOnTimeout": "disabled", "name": "fastL4-route-friendly", "looseInitialization": "enabled"}
Method POST mgmt/tm/ltm/profile/fastl4 returned: {"kind":"tm:ltm:profile:fastl4:fastl4state","name":"fastL4-route-friendly","fullPath":"fastL4-route-friendly","generation":68,"selfLink":"https://localhost/mgmt/tm/ltm/profile/fastl4/fastL4-route-friendly?ver=11.6.0","clientTimeout":30,"defaultsFrom":"/Common/fastL4","explicitFlowMigration":"disabled","hardwareSynCookie":"enabled","idleTimeout":"300","ipTosToClient":"pass-through","ipTosToServer":"pass-through","keepAliveInterval":"disabled","lateBinding":"disabled","linkQosToClient":"pass-through","linkQosToServer":"pass-through","looseClose":"enabled","looseInitialization":"enabled","mssOverride":0,"priorityToClient":"pass-through","priorityToServer":"pass-through","pvaAcceleration":"full","pvaDynamicClientPackets":1,"pvaDynamicServerPackets":0,"pvaFlowAging":"enabled","pvaFlowEvict":"enabled","pvaOffloadDynamic":"enabled","pvaOffloadState":"embryonic","reassembleFragments":"disabled","receiveWindowSize":0,"resetOnTimeout":"disabled","rttFromClient":"disabled","rttFromServer":"disabled","serverSack":"disabled","serverTimestamp":"disabled","softwareSynCookie":"disabled","synCookieWhitelist":"disabled","tcpCloseTimeout":"5","tcpGenerateIsn":"disabled","tcpHandshakeTimeout":"5","tcpStripSack":"disabled","tcpTimestampMode":"preserve","tcpWscaleMode":"preserve","timeoutRecovery":"disconnect"}

...

2015-11-12 09:46:44 :
PATCH mgmt/tm/sys/provision/asm {"level": "nominal"}
Method PATCH mgmt/tm/sys/provision/asm returned: {"kind":"tm:sys:provision:provisionstate","name":"asm","fullPath":"asm","generation":71,"selfLink":"https://localhost/mgmt/tm/sys/provision/asm?ver=11.6.0","cpuRatio":0,"diskRatio":0,"level":"nominal","memoryRatio":0}

2015-11-12 09:47:18 :
PATCH mgmt/tm/sys/provision/avr {"level": "nominal"}
Method PATCH mgmt/tm/sys/provision/avr returned: {"kind":"tm:sys:provision:provisionstate","name":"avr","fullPath":"avr","generation":114,"selfLink":"https://localhost/mgmt/tm/sys/provision/avr?ver=11.6.0","cpuRatio":0,"diskRatio":0,"level":"nominal","memoryRatio":0}

AWS-specific System Configuration

  • This next workflow is very small and simple.  We are adding some variables to global-settings which are only necessary because BIG-IP is running in AWS. 
  • We've obfuscated the AWS Access Key and Secret Key in the output. 
2015-11-12 09:48:12 : Adding/updating AWS access and secret keys
PATCH mgmt/tm/sys/global-settings {"awsAccessKey": "...<my access key>...", "awsSecretKey": "...<my secret key>..."}
Method PATCH mgmt/tm/sys/global-settings returned: {"kind":"tm:sys:global-settings:global-settingsstate","selfLink":"https://localhost/mgmt/tm/sys/global-settings?ver=11.6.0","awsAccessKey":"...<my access key>...","awsApiMaxConcurrency":1,"awsSecretKey":"...<my secret key>...","consoleInactivityTimeout":0,"customAddr":"none","failsafeAction":"go-offline-restart-tm","fileLocalPathPrefix":"{/shared/} {/tmp/}","guiSecurityBanner":"enabled","guiSecurityBannerText":"Welcome to the BIG-IP Configuration Utility.\n\nLog in with your username and password using the fields on the left.","guiSetup":"disabled","hostAddrMode":"management","hostname":"ip-172-16-11-77.ec2.internal","lcdDisplay":"enabled","mgmtDhcp":"enabled","netReboot":"disabled","passwordPrompt":"Password","quietBoot":"enabled","usernamePrompt":"Username"}

Network Attachment

  • Setup of self-IPs, VLANs, and other network specific configuration is relatively straight forward. 
2015-11-12 09:48:15 : Disabling dhcp
PATCH mgmt/tm/sys/db/dhclient.mgmt {"value": "disable"}
Method PATCH mgmt/tm/sys/db/dhclient.mgmt returned: {"kind":"tm:sys:db:dbstate","name":"dhclient.mgmt","fullPath":"dhclient.mgmt","generation":154,"selfLink":"https://localhost/mgmt/tm/sys/db/dhclient.mgmt?ver=11.6.0","defaultValue":"disable","scfConfig":"true","value":"disable","valueRange":"disable enable"}

2015-11-12 09:48:18 : Adding/updating internal vlan
GET mgmt/tm/net/vlan ""
Method GET mgmt/tm/net/vlan returned: {"kind":"tm:net:vlan:vlancollectionstate","selfLink":"https://localhost/mgmt/tm/net/vlan?ver=11.6.0"}

2015-11-12 09:48:19 : Adding/updating internal vlan
POST mgmt/tm/net/vlan {"interfaces": "1.2", "name": "private"}
Method POST mgmt/tm/net/vlan returned: {"kind":"tm:net:vlan:vlanstate","name":"private","fullPath":"private","generation":167,"selfLink":"https://localhost/mgmt/tm/net/vlan/private?ver=11.6.0","autoLasthop":"default","cmpHash":"default","dagRoundRobin":"disabled","dagTunnel":"outer","failsafe":"disabled","failsafeAction":"failover-restart-tm","failsafeTimeout":90,"ifIndex":80,"learning":"enable-forward","mtu":1500,"sflow":{"pollInterval":0,"pollIntervalGlobal":"yes","samplingRate":0,"samplingRateGlobal":"yes"},"sourceChecking":"disabled","tag":4094,"interfacesReference":{"link":"https://localhost/mgmt/tm/net/vlan/~Common~private/interfaces?ver=11.6.0","isSubcollection":true}}

2015-11-12 09:48:21 : Adding/updating external vlan
GET mgmt/tm/net/vlan ""
Method GET mgmt/tm/net/vlan returned: {"kind":"tm:net:vlan:vlancollectionstate","selfLink":"https://localhost/mgmt/tm/net/vlan?ver=11.6.0","items":[{"kind":"tm:net:vlan:vlanstate","name":"private","partition":"Common","fullPath":"/Common/private","generation":167,"selfLink":"https://localhost/mgmt/tm/net/vlan/~Common~private?ver=11.6.0","autoLasthop":"default","cmpHash":"default","dagRoundRobin":"disabled","dagTunnel":"outer","failsafe":"disabled","failsafeAction":"failover-restart-tm","failsafeTimeout":90,"ifIndex":80,"learning":"enable-forward","mtu":1500,"sflow":{"pollInterval":0,"pollIntervalGlobal":"yes","samplingRate":0,"samplingRateGlobal":"yes"},"sourceChecking":"disabled","tag":4094,"interfacesReference":{"link":"https://localhost/mgmt/tm/net/vlan/~Common~private/interfaces?ver=11.6.0","isSubcollection":true}}]}

...

2015-11-12 09:48:24 : Adding/updating internal selfip
GET mgmt/tm/net/self ""
Method GET mgmt/tm/net/self returned: {"kind":"tm:net:self:selfcollectionstate","selfLink":"https://localhost/mgmt/tm/net/self?ver=11.6.0"}

2015-11-12 09:48:24 : Adding/updating internal selfip
POST mgmt/tm/net/self {"allowService": "default", "vlan": "private", "trafficGroup": "traffic-group-local-only", "name": "private", "address": "172.16.12.44/24"}
Method POST mgmt/tm/net/self returned: {"kind":"tm:net:self:selfstate","name":"private","fullPath":"private","generation":177,"selfLink":"https://localhost/mgmt/tm/net/self/private?ver=11.6.0","address":"172.16.12.44/24","floating":"disabled","inheritedTrafficGroup":"false","trafficGroup":"/Common/traffic-group-local-only","unit":0,"vlan":"/Common/private","allowService":["default"]}

2015-11-12 09:48:26 : Adding/updating external selfip
GET mgmt/tm/net/self ""
Method GET mgmt/tm/net/self returned: {"kind":"tm:net:self:selfcollectionstate","selfLink":"https://localhost/mgmt/tm/net/self?ver=11.6.0","items":[{"kind":"tm:net:self:selfstate","name":"private","partition":"Common","fullPath":"/Common/private","generation":177,"selfLink":"https://localhost/mgmt/tm/net/self/~Common~private?ver=11.6.0","address":"172.16.12.44/24","floating":"disabled","inheritedTrafficGroup":"false","trafficGroup":"/Common/traffic-group-local-only","unit":0,"vlan":"/Common/private","allowService":["default"]}]}

2015-11-12 09:48:27 : Adding/updating external selfip
POST mgmt/tm/net/self {"allowService": ["tcp:4353"], "vlan": "public", "trafficGroup": "traffic-group-local-only", "name": "public", "address": "172.16.13.83/24"}
Method POST mgmt/tm/net/self returned: {"kind":"tm:net:self:selfstate","name":"public","fullPath":"public","generation":178,"selfLink":"https://localhost/mgmt/tm/net/self/public?ver=11.6.0","address":"172.16.13.83/24","floating":"disabled","inheritedTrafficGroup":"false","trafficGroup":"/Common/traffic-group-local-only","unit":0,"vlan":"/Common/public","allowService":["tcp:4353"]}

2015-11-12 09:48:29 : Setting default route using default_gateway or gateway_pool
GET /mgmt/tm/net/route ""
Method GET /mgmt/tm/net/route returned: {"kind":"tm:net:route:routecollectionstate","selfLink":"https://localhost/mgmt/tm/net/route?ver=11.6.0"}

2015-11-12 09:48:29 : Setting default route using default_gateway or gateway_pool
POST /mgmt/tm/net/route {"gw": "172.16.13.1", "name": "default_route", "network": "default"}
Method POST /mgmt/tm/net/route returned: {"kind":"tm:net:route:routestate","name":"default_route","fullPath":"default_route","generation":0,"selfLink":"https://localhost/mgmt/tm/net/route/default_route?ver=11.6.0"}

Application Service Provisioning

This workflow is where things really get interesting.  Let's break it down.

  • We are deploying two sets of virtual servers (the pool members are the same, but the VIP is different). 
  • For virtual 1 (VIP = 172.16.13.128), we use an iApp to deploy a HTTPS virtual with an ASM policy. To do so, we:
    • Deploy all resources that are needed to support the iApp deployment:
      • ​A high-speed logging pool
      • An LTM logging profile (which will send logs to Splunk on port 514)
      • An ASM logging profile (which will send logs to Splunk on port 515)
      • An analytics profile, in case we want to inspect traffic with AVR on-box
      • Base64 encoded images to an iRule data-group
      • iRules to support a sorry page and the analytics profile
      • An ASM policy (we've encoded the XML policy file into base64). Deploying the ASM policies requires first making a new policy via a POST command, then importing the policy over the defaults for the one we have just created. 
        • ​Note that we check the status of the asynchronous REST tasks which are started during the policy 'create' and 'apply' steps. 
      • An LTM policy which attaches the ASM policy above using a ruleset. 
    • Deploy the iApp template (look here to understand how we built the JSON payload for the iApp template). 
    • Finally, deploy the iApp service, an instantiation of the template that references all the above content (look here to understand how we built the JSON payload for the iApp service). 
  • For virtual 2 (VIP = 172.16.13.124), just deploy the web server pool, iRule, and virtual server directly (without an iApp).

2015-11-12 09:49:13 : Deploying/updating Webserver Pool
GET mgmt/tm/ltm/pool ""
Method GET mgmt/tm/ltm/pool returned: {"kind":"tm:ltm:pool:poolcollectionstate","selfLink":"https://localhost/mgmt/tm/ltm/pool?ver=11.6.0"}

2015-11-12 09:49:14 : Deploying/updating Webserver Pool
POST mgmt/tm/ltm/pool {"name": "Vip1_pool", "members": [{"description": "Name=/boring_lovelace,ContainerHostname=a0085832ad28,Image=mutzel/all-in-one-hackazon:postinstall", "name": "172.16.14.87:80", "address": "172.16.14.87"}], "monitor": "http"}
Method POST mgmt/tm/ltm/pool returned: {"kind":"tm:ltm:pool:poolstate","name":"Vip1_pool","fullPath":"Vip1_pool","generation":236,"selfLink":"https://localhost/mgmt/tm/ltm/pool/Vip1_pool?ver=11.6.0","allowNat":"yes","allowSnat":"yes","ignorePersistedWeight":"disabled","ipTosToClient":"pass-through","ipTosToServer":"pass-through","linkQosToClient":"pass-through","linkQosToServer":"pass-through","loadBalancingMode":"round-robin","minActiveMembers":0,"minUpMembers":0,"minUpMembersAction":"failover","minUpMembersChecking":"disabled","monitor":"/Common/http ","queueDepthLimit":0,"queueOnConnectionLimit":"disabled","queueTimeLimit":0,"reselectTries":0,"serviceDownAction":"none","slowRampTime":10,"membersReference":{"link":"https://localhost/mgmt/tm/ltm/pool/~Common~Vip1_pool/members?ver=11.6.0","isSubcollection":true}}

2015-11-12 09:49:18 : Deploying/updating High Speed Logging pool to send to Analytics Server
GET mgmt/tm/ltm/pool ""
Method GET mgmt/tm/ltm/pool returned: {"kind":"tm:ltm:pool:poolcollectionstate","selfLink":"https://localhost/mgmt/tm/ltm/pool?ver=11.6.0","items":[{"kind":"tm:ltm:pool:poolstate","name":"Vip1_pool","partition":"Common","fullPath":"/Common/Vip1_pool","generation":236,"selfLink":"https://localhost/mgmt/tm/ltm/pool/~Common~Vip1_pool?ver=11.6.0","allowNat":"yes","allowSnat":"yes","ignorePersistedWeight":"disabled","ipTosToClient":"pass-through","ipTosToServer":"pass-through","linkQosToClient":"pass-through","linkQosToServer":"pass-through","loadBalancingMode":"round-robin","minActiveMembers":0,"minUpMembers":0,"minUpMembersAction":"failover","minUpMembersChecking":"disabled","monitor":"/Common/http ","queueDepthLimit":0,"queueOnConnectionLimit":"disabled","queueTimeLimit":0,"reselectTries":0,"serviceDownAction":"none","slowRampTime":10,"membersReference":{"link":"https://localhost/mgmt/tm/ltm/pool/~Common~Vip1_pool/members?ver=11.6.0","isSubcollection":true}}]}

2015-11-12 09:49:19 : Deploying/updating High Speed Logging pool to send to Analytics Server
POST mgmt/tm/ltm/pool {"name": "syslog_pool", "members": [{"name": "172.16.14.180:514", "address": "172.16.14.180"}], "monitor": "tcp"}
Method POST mgmt/tm/ltm/pool returned: {"kind":"tm:ltm:pool:poolstate","name":"syslog_pool","fullPath":"syslog_pool","generation":239,"selfLink":"https://localhost/mgmt/tm/ltm/pool/syslog_pool?ver=11.6.0","allowNat":"yes","allowSnat":"yes","ignorePersistedWeight":"disabled","ipTosToClient":"pass-through","ipTosToServer":"pass-through","linkQosToClient":"pass-through","linkQosToServer":"pass-through","loadBalancingMode":"round-robin","minActiveMembers":0,"minUpMembers":0,"minUpMembersAction":"failover","minUpMembersChecking":"disabled","monitor":"/Common/tcp ","queueDepthLimit":0,"queueOnConnectionLimit":"disabled","queueTimeLimit":0,"reselectTries":0,"serviceDownAction":"none","slowRampTime":10,"membersReference":{"link":"https://localhost/mgmt/tm/ltm/pool/~Common~syslog_pool/members?ver=11.6.0","isSubcollection":true}}

...

2015-11-12 09:49:21 : Deploying/updating ASM Logging Profile to send to Remote Analytics Server
POST mgmt/tm/security/log/profile {"application": [{"guaranteeLogging": "enabled", "guaranteeResponseLogging": "disabled", "logicOperation": "or", "protocol": "tcp", "name": "asm_log_to_splunk", "format": {"fieldDelimiter": ",", "type": "predefined"}, "reportAnomalies": "disabled", "facility": "local0", "partition": "Common", "filter": [{"values": ["all"], "name": "protocol"}, {"values": ["all"], "name": "request-type"}, {"name": "search-all"}], "maximumHeaderSize": "any", "localStorage": "enabled", "maximumQuerySize": "any", "maximumEntryLength": "2k", "servers": [{"name": "172.16.14.180:515"}], "remoteStorage": "splunk", "maximumRequestSize": "any", "responseLogging": "none"}], "name": "asm_log_to_splunk"}
Method POST mgmt/tm/security/log/profile returned: {"kind":"tm:security:log:profile:profilestate","name":"asm_log_to_splunk","fullPath":"asm_log_to_splunk","generation":240,"selfLink":"https://localhost/mgmt/tm/security/log/profile/asm_log_to_splunk?ver=11.6.0","applicationReference":{"link":"https://localhost/mgmt/tm/security/log/profile/~Common~asm_log_to_splunk/application?ver=11.6.0","isSubcollection":true}}

2015-11-12 09:49:23 : Deploying/updating Analytics Profile
GET mgmt/tm/ltm/profile/analytics ""
Method GET mgmt/tm/ltm/profile/analytics returned: {"kind":"tm:ltm:profile:analytics:analyticscollectionstate","selfLink":"https://localhost/mgmt/tm/ltm/profile/analytics?ver=11.6.0","items":[{"kind":"tm:ltm:profile:analytics:analyticsstate","name":"analytics","partition":"Common","fullPath":"/Common/analytics","generation":1,"selfLink":"https://localhost/mgmt/tm/ltm/profile/analytics/~Common~analytics?ver=11.6.0","capturedTrafficExternalLogging":"disabled","capturedTrafficInternalLogging":"disabled","collectGeo":"disabled","collectIp":"disabled","collectMaxTpsAndThroughput":"disabled","collectMethods":"enabled","collectPageLoadTime":"disabled","collectResponseCodes":"enabled","collectSubnets":"disabled","collectUrl":"disabled","collectUserAgent":"disabled","collectUserSessions":"disabled","collectedStatsExternalLogging":"disabled","collectedStatsInternalLogging":"enabled","notificationByEmail":"disabled","notificationBySnmp":"disabled","notificationBySyslog":"disabled","publishIruleStatistics":"disabled","sampling":"enabled","sessionCookieSecurity":"ssl-only","sessionTimeoutMinutes":"5","alertsReference":{"link":"https://localhost/mgmt/tm/ltm/profile/analytics/~Common~analytics/alerts?ver=11.6.0","isSubcollection":true},"trafficCaptureReference":{"link":"https://localhost/mgmt/tm/ltm/profile/analytics/~Common~analytics/traffic-capture?ver=11.6.0","isSubcollection":true}}]}

...

2015-11-12 09:49:26 : Uploading Datagroup ... background for sorry page
GET mgmt/tm/ltm/data-group/internal ""
Method GET mgmt/tm/ltm/data-group/internal returned: {"kind":"tm:ltm:data-group:internal:internalcollectionstate","selfLink":"https://localhost/mgmt/tm/ltm/data-group/internal?ver=11.6.0","items":[{"kind":"tm:ltm:data-group:internal:internalstate","name":"aol","partition":"Common","fullPath":"/Common/aol","generation":1,"selfLink":"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~aol?ver=11.6.0","type":"ip","records":[{"name":"64.12.96.0/19"},{"name":"195.93.16.0/20"},{"name":"195.93.48.0/22"},{"name":"195.93.64.0/19"},{"name":"195.93.96.0/19"},{"name":"198.81.0.0/22"},{"name":"198.81.8.0/23"},{"name":"198.81.16.0/20"},{"name":"202.67.65.128/25"},{"name":"205.188.112.0/20"},{"name":"205.188.146.144/30"},{"name":"205.188.192.0/20"},{"name":"205.188.208.0/23"},{"name":"207.200.112.0/21"}]},{"kind":"tm:ltm:data-group:internal:internalstate","name":"images","partition":"Common","fullPath":"/Common/images","generation":1,"selfLink":"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~images?ver=11.6.0","type":"string","records":[{"name":".bmp"},{"name":".gif"},{"name":".jpg"}]},{"kind":"tm:ltm:data-group:internal:internalstate","name":"private_net","partition":"Common","fullPath":"/Common/private_net","generation":1,"selfLink":"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~private_net?ver=11.6.0","type":"ip","records":[{"name":"10.0.0.0/8"},{"name":"172.16.0.0/12"},{"name":"192.168.0.0/16"}]}]}

2015-11-12 09:49:26 : Uploading Datagroup ... background for sorry page
POST mgmt/tm/ltm/data-group/internal {"records": [{"name": "...<base64 image>..."}], "type": "string", "name": "background_images"}
Method POST mgmt/tm/ltm/data-group/internal returned: {"kind":"tm:ltm:data-group:internal:internalstate","name":"background_images","fullPath":"background_images","generation":244,"selfLink":"https://localhost/mgmt/tm/ltm/data-group/internal/background_images?ver=11.6.0","type":"string","records":[{"name":"....large base64 image...."}]}

2015-11-12 09:49:29 : Uploading Datagroup ... image for sorry page
GET mgmt/tm/ltm/data-group/internal ""
Method GET mgmt/tm/ltm/data-group/internal returned: {"kind":"tm:ltm:data-group:internal:internalcollectionstate","selfLink":"https://localhost/mgmt/tm/ltm/data-group/internal?ver=11.6.0","items":[{"kind":"tm:ltm:data-group:internal:internalstate","name":"aol","partition":"Common","fullPath":"/Common/aol","generation":1,"selfLink":"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~aol?ver=11.6.0","type":"ip","records":[{"name":"64.12.96.0/19"},{"name":"195.93.16.0/20"},{"name":"195.93.48.0/22"},{"name":"195.93.64.0/19"},{"name":"195.93.96.0/19"},{"name":"198.81.0.0/22"},{"name":"198.81.8.0/23"},{"name":"198.81.16.0/20"},{"name":"202.67.65.128/25"},{"name":"205.188.112.0/20"},{"name":"205.188.146.144/30"},{"name":"205.188.192.0/20"},{"name":"205.188.208.0/23"},{"name":"207.200.112.0/21"}]},{"kind":"tm:ltm:data-group:internal:internalstate","name":"background_images","partition":"Common","fullPath":"/Common/background_images","generation":244,"selfLink":"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~background_images?ver=11.6.0","type":"string","records":[{"name":"...<base64 image>..."}]},{"kind":"tm:ltm:data-group:internal:internalstate","name":"images","partition":"Common","fullPath":"/Common/images","generation":1,"selfLink":"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~images?ver=11.6.0","type":"string","records":[{"name":".bmp"},{"name":".gif"},{"name":".jpg"}]},{"kind":"tm:ltm:data-group:internal:internalstate","name":"private_net","partition":"Common","fullPath":"/Common/private_net","generation":1,"selfLink":"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~private_net?ver=11.6.0","type":"ip","records":[{"name":"10.0.0.0/8"},{"name":"172.16.0.0/12"},{"name":"192.168.0.0/16"}]}]}

2015-11-12 09:49:30 : Uploading Datagroup ... image for sorry page
POST mgmt/tm/ltm/data-group/internal {"records": [{"name": "...<base64 image>..."}], "type": "string", "name": "sorry_images"}
Method POST mgmt/tm/ltm/data-group/internal returned: {"kind":"tm:ltm:data-group:internal:internalstate","name":"sorry_images","fullPath":"sorry_images","generation":245,"selfLink":"https://localhost/mgmt/tm/ltm/data-group/internal/sorry_images?ver=11.6.0","type":"string","records":[{"name":"....base 64 image...."}]}

2015-11-12 09:49:32 : Uploading iRules ... sorry_page_rule
GET mgmt/tm/ltm/rule ""
Method GET mgmt/tm/ltm/rule returned: {"kind":"tm:ltm:rule:rulecollectionstate","selfLink":"https://localhost/mgmt/tm/ltm/rule?ver=11.6.0","items":[<a whole bunch of irules>]}

2015-11-12 09:49:35 : Uploading iRules ... demo_analytics_rule
GET mgmt/tm/ltm/rule ""
Method GET mgmt/tm/ltm/rule returned: {"kind":"tm:ltm:rule:rulecollectionstate","selfLink":"https://localhost/mgmt/tm/ltm/rule?ver=11.6.0","items":[<a whole bunnch of irules>]}

2015-11-12 09:49:38 : Create the ASM policy
GET mgmt/tm/asm/policies ""
Method GET mgmt/tm/asm/policies returned: {"selfLink":"https://localhost/mgmt/tm/asm/policies","kind":"tm:asm:policies:policycollectionstate","totalItems":0,"items":[]}

2015-11-12 09:49:39 : Create the ASM policy
POST mgmt/tm/asm/policies {"caseInsensitive": true, "name": "linux_high-Vip1", "applicationLanguage": "utf-8"}
...

2015-11-12 09:49:53 : Import our policy over the one existing above
POST mgmt/tm/asm/tasks/import-policy {"policyReference": {"link": "https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg"}, "isBase64": true, "file": "...<base64 policy file>...","lastUpdateMicros":1.447350597e+15,"selfLink":"https://localhost/mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law","kind":"tm:asm:tasks:import-policy:import-policy-taskstate","policyReference":{"link":"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg"},"startTime":"2015-11-12T17:49:57Z","id":"hP37L9EM650WeWKkgX7law"}

2015-11-12 09:50:00 : Determine whether the asm policy import task is complete
GET mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law ""
Method GET mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law returned: {"isBase64":true,"status":"STARTED","file":"...<base64 policy file>...","lastUpdateMicros":1.447350597e+15,"selfLink":"https://localhost/mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law","kind":"tm:asm:tasks:import-policy:import-policy-taskstate","policyReference":{"link":"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg"},"startTime":"2015-11-12T17:49:57Z","id":"hP37L9EM650WeWKkgX7law"}

2015-11-12 09:50:05 : Determine whether the asm policy import task is complete
GET mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law ""
Method GET mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law returned: {"isBase64":true,"status":"COMPLETED","file":"...<base64 policy file>...","lastUpdateMicros":1.447350605e+15,"selfLink":"https://localhost/mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law","kind":"tm:asm:tasks:import-policy:import-policy-taskstate","policyReference":{"link":"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg"},"endTime":"2015-11-12T17:50:05Z","startTime":"2015-11-12T17:49:57Z","id":"hP37L9EM650WeWKkgX7law","result":{"policyReference":{"link":"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg"},"message":"Security policy version information will be ignored, since the file has been modified since it was exported.\nSignature Set linux-high (previously used in this security policy) was added to this system.\nThe operation was completed successfully. The security policy name is '/Common/linux_high-Vip1'."}}

2015-11-12 09:50:08 : Apply the ASM policy
POST mgmt/tm/asm/tasks/apply-policy {"policyReference": {"link": "https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg"}}
Method POST mgmt/tm/asm/tasks/apply-policy returned: {"selfLink":"https://localhost/mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg","kind":"tm:asm:tasks:apply-policy:apply-policy-taskstate","policyReference":{"link":"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg"},"status":"NEW","lastUpdateMicros":1.447350608e+15,"startTime":"2015-11-12T17:50:08Z","id":"38B8slfPm1_lBBRG1STNeg"}

2015-11-12 09:50:10 : Determine whether the asm policy apply task is complete
GET mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg ""
Method GET mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg returned: {"selfLink":"https://localhost/mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg","kind":"tm:asm:tasks:apply-policy:apply-policy-taskstate","policyReference":{"link":"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg"},"status":"STARTED","lastUpdateMicros":1.447350608e+15,"startTime":"2015-11-12T17:50:08Z","id":"38B8slfPm1_lBBRG1STNeg"}

2015-11-12 09:50:14 : Determine whether the asm policy apply task is complete
GET mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg ""
Method GET mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg returned: {"selfLink":"https://localhost/mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg","kind":"tm:asm:tasks:apply-policy:apply-policy-taskstate","policyReference":{"link":"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg"},"status":"STARTED","lastUpdateMicros":1.447350608e+15,"startTime":"2015-11-12T17:50:08Z","id":"38B8slfPm1_lBBRG1STNeg"}

2015-11-12 09:50:20 : Create an LTM policy for use with by iApp which associates the ASM policy
GET mgmt/tm/ltm/policy ""
Method GET mgmt/tm/ltm/policy returned: {"kind":"tm:ltm:policy:policycollectionstate","selfLink":"https://localhost/mgmt/tm/ltm/policy?ver=11.6.0","items":[{"kind":"tm:ltm:policy:policystate","name":"_sys_CEC_SSL_client_policy","partition":"Common","fullPath":"/Common/_sys_CEC_SSL_client_policy","generation":1,"selfLink":"https://localhost/mgmt/tm/ltm/policy/~Common~_sys_CEC_SSL_client_policy?ver=11.6.0","controls":["classification"],"hints":["no-write","no-delete","no-exclusion"],"requires":["ssl-persistence"],"strategy":"/Common/first-match","rulesReference":{"link":"https://localhost/mgmt/tm/ltm/policy/~Common~_sys_CEC_SSL_client_policy/rules?ver=11.6.0","isSubcollection":true}},{"kind":"tm:ltm:policy:policystate","name":"_sys_CEC_SSL_server_policy","partition":"Common","fullPath":"/Common/_sys_CEC_SSL_server_policy","generation":1,"selfLink":"https://localhost/mgmt/tm/ltm/policy/~Common~_sys_CEC_SSL_server_policy?ver=11.6.0","controls":["classification"],"hints":["no-write","no-delete","no-exclusion"],"requires":["ssl-persistence"],"strategy":"/Common/first-match","rulesReference":{"link":"https://localhost/mgmt/tm/ltm/policy/~Common~_sys_CEC_SSL_server_policy/rules?ver=11.6.0","isSubcollection":true}},{"kind":"tm:ltm:policy:policystate","name":"_sys_CEC_video_policy","partition":"Common","fullPath":"/Common/_sys_CEC_video_policy","generation":1,"selfLink":"https://localhost/mgmt/tm/ltm/policy/~Common~_sys_CEC_video_policy?ver=11.6.0","controls":["classification"],"hints":["no-write","no-delete","no-exclusion"],"requires":["http"],"strategy":"/Common/first-match","rulesReference":{"link":"https://localhost/mgmt/tm/ltm/policy/~Common~_sys_CEC_video_policy/rules?ver=11.6.0","isSubcollection":true}}]}

2015-11-12 09:50:23 : Create an LTM policy for use with by iApp which associates the ASM policy
POST mgmt/tm/ltm/policy {"name": "ltm_policy_w_asm_linux_high-Vip1", "rules": [{"ordinal": 1, "conditions": [], "name": "rule-1", "actions": [{"status": 0, "enable": true, "name": "0", "request": true, "vlanId": 0, "code": 0, "policy": "/Common/linux_high-Vip1", "port": 0, "asm": true}]}], "partition": "Common", "controls": ["asm"], "strategy": "/Common/first-match", "requires": ["http"]}
Method POST mgmt/tm/ltm/policy returned: {"kind":"tm:ltm:policy:policystate","name":"ltm_policy_w_asm_linux_high-Vip1","partition":"Common","fullPath":"/Common/ltm_policy_w_asm_linux_high-Vip1","generation":318,"selfLink":"https://localhost/mgmt/tm/ltm/policy/~Common~ltm_policy_w_asm_linux_high-Vip1?ver=11.6.0","controls":["asm"],"requires":["http"],"strategy":"/Common/first-match","rulesReference":{"link":"https://localhost/mgmt/tm/ltm/policy/~Common~ltm_policy_w_asm_linux_high-Vip1/rules?ver=11.6.0","isSubcollection":true}}

2015-11-12 09:50:25 : Deploy the iApp template, since we are not using a default iApp on box
GET mgmt/tm/sys/application/template ""
Method GET mgmt/tm/sys/application/template returned: {"kind":"tm:sys:application:template:templatecollectionstate","selfLink":"https://localhost/mgmt/tm/sys/application/template?ver=11.6.0","items":[...<list of iApp templates on the box>...]}

2015-11-12 09:50:30 : Deploy the iApp service from the f5 http backport template
GET mgmt/tm/sys/application/service ""
Method GET mgmt/tm/sys/application/service returned: {"kind":"tm:sys:application:service:servicecollectionstate","selfLink":"https://localhost/mgmt/tm/sys/application/service?ver=11.6.0"}

2015-11-12 09:51:37 : Deploying/updating webserver pool
GET mgmt/tm/ltm/pool ""
Method GET mgmt/tm/ltm/pool returned: {"kind":"tm:ltm:pool:poolcollectionstate","selfLink":"https://localhost/mgmt/tm/ltm/pool?ver=11.6.0","items":[{"kind":"tm:ltm:pool:poolstate","name":"Vip1_pool","partition":"Common","fullPath":"/Common/Vip1_pool","generation":236,"selfLink":"https://localhost/mgmt/tm/ltm/pool/~Common~Vip1_pool?ver=11.6.0","allowNat":"yes","allowSnat":"yes","ignorePersistedWeight":"disabled","ipTosToClient":"pass-through","ipTosToServer":"pass-through","linkQosToClient":"pass-through","linkQosToServer":"pass-through","loadBalancingMode":"round-robin","minActiveMembers":0,"minUpMembers":0,"minUpMembersAction":"failover","minUpMembersChecking":"disabled","monitor":"/Common/http ","queueDepthLimit":0,"queueOnConnectionLimit":"disabled","queueTimeLimit":0,"reselectTries":0,"serviceDownAction":"none","slowRampTime":10,"membersReference":{"link":"https://localhost/mgmt/tm/ltm/pool/~Common~Vip1_pool/members?ver=11.6.0","isSubcollection":true}},{"kind":"tm:ltm:pool:poolstate","name":"syslog_pool","partition":"Common","fullPath":"/Common/syslog_pool","generation":239,"selfLink":"https://localhost/mgmt/tm/ltm/pool/~Common~syslog_pool?ver=11.6.0","allowNat":"yes","allowSnat":"yes","ignorePersistedWeight":"disabled","ipTosToClient":"pass-through","ipTosToServer":"pass-through","linkQosToClient":"pass-through","linkQosToServer":"pass-through","loadBalancingMode":"round-robin","minActiveMembers":0,"minUpMembers":0,"minUpMembersAction":"failover","minUpMembersChecking":"disabled","monitor":"/Common/tcp ","queueDepthLimit":0,"queueOnConnectionLimit":"disabled","queueTimeLimit":0,"reselectTries":0,"serviceDownAction":"none","slowRampTime":10,"membersReference":{"link":"https://localhost/mgmt/tm/ltm/pool/~Common~syslog_pool/members?ver=11.6.0","isSubcollection":true}}]}

2015-11-12 09:51:37 : Deploying/updating webserver pool
POST mgmt/tm/ltm/pool {"name": "Vip2_pool", "members": [{"description": "Name=/boring_lovelace,ContainerHostname=a0085832ad28,Image=mutzel/all-in-one-hackazon:postinstall", "name": "172.16.14.87:80", "address": "172.16.14.87"}], "monitor": "http"}
Method POST mgmt/tm/ltm/pool returned: {"kind":"tm:ltm:pool:poolstate","name":"Vip2_pool","fullPath":"Vip2_pool","generation":352,"selfLink":"https://localhost/mgmt/tm/ltm/pool/Vip2_pool?ver=11.6.0","allowNat":"yes","allowSnat":"yes","ignorePersistedWeight":"disabled","ipTosToClient":"pass-through","ipTosToServer":"pass-through","linkQosToClient":"pass-through","linkQosToServer":"pass-through","loadBalancingMode":"round-robin","minActiveMembers":0,"minUpMembers":0,"minUpMembersAction":"failover","minUpMembersChecking":"disabled","monitor":"/Common/http ","queueDepthLimit":0,"queueOnConnectionLimit":"disabled","queueTimeLimit":0,"reselectTries":0,"serviceDownAction":"none","slowRampTime":10,"membersReference":{"link":"https://localhost/mgmt/tm/ltm/pool/~Common~Vip2_pool/members?ver=11.6.0","isSubcollection":true}}

2015-11-12 09:51:39 : Uploading iRules ... irule_random_snat
GET mgmt/tm/ltm/rule ""
Method GET mgmt/tm/ltm/rule returned: {"kind":"tm:ltm:rule:rulecollectionstate","selfLink":"https://localhost/mgmt/tm/ltm/rule?ver=11.6.0","items":[...<list of irules on the box>...]}

...

2015-11-12 09:51:43 : Setup the HTTP virtual server
POST mgmt/tm/ltm/virtual {"name": "Vip2_http", "rules": ["/Common/irule_random_snat"], "translateAddress": "enabled", "destination": "/Common/172.16.13.145:80", "mask": "255.255.255.255", "sourceAddressTranslation": {"type": "automap"}, "profiles": [{"name": "http"}, {"name": "tcp-wan-optimized", "context": "clientside"}, {"name": "tcp-lan-optimized", "context": "serverside"}], "translatePort": "enabled", "ipProtocol": "tcp", "pool": "/Common/Vip2_pool"}
Method POST mgmt/tm/ltm/virtual returned: {"kind":"tm:ltm:virtual:virtualstate","name":"Vip2_http","fullPath":"Vip2_http","generation":355,"selfLink":"https://localhost/mgmt/tm/ltm/virtual/Vip2_http?ver=11.6.0","addressStatus":"yes","autoLasthop":"default","cmpEnabled":"yes","connectionLimit":0,"destination":"/Common/172.16.13.145:80","enabled":true,"gtmScore":0,"ipProtocol":"tcp","mask":"255.255.255.255","mirror":"disabled","mobileAppTunnel":"disabled","nat64":"disabled","pool":"/Common/Vip2_pool","rateLimit":"disabled","rateLimitDstMask":0,"rateLimitMode":"object","rateLimitSrcMask":0,"source":"0.0.0.0/0","sourceAddressTranslation":{"type":"automap"},"sourcePort":"preserve","synCookieStatus":"not-activated","translateAddress":"enabled","translatePort":"enabled","vlansDisabled":true,"vsIndex":4,"rules":["/Common/irule_random_snat"],"policiesReference":{"link":"https://localhost/mgmt/tm/ltm/virtual/~Common~Vip2_http/policies?ver=11.6.0","isSubcollection":true},"profilesReference":{"link":"https://localhost/mgmt/tm/ltm/virtual/~Common~Vip2_http/profiles?ver=11.6.0","isSubcollection":true}}

2015-11-12 09:51:45 : Setup the HTTPS virtual server
POST mgmt/tm/ltm/virtual {"name": "Vip2_https", "rules": ["/Common/irule_random_snat"], "translateAddress": "enabled", "destination": "/Common/172.16.13.145:443", "mask": "255.255.255.255", "sourceAddressTranslation": {"type": "automap"}, "profiles": [{"name": "tcp-ssl-wan-optimized", "context": "clientside"}, {"name": "tcp-ssl-lan-optimized", "context": "serverside"}], "translatePort": "enabled", "ipProtocol": "tcp", "pool": "/Common/Vip2_pool"}
Method POST mgmt/tm/ltm/virtual returned: {"kind":"tm:ltm:virtual:virtualstate","name":"Vip2_https","fullPath":"Vip2_https","generation":356,"selfLink":"https://localhost/mgmt/tm/ltm/virtual/Vip2_https?ver=11.6.0","addressStatus":"yes","autoLasthop":"default","cmpEnabled":"yes","connectionLimit":0,"destination":"/Common/172.16.13.145:443","enabled":true,"gtmScore":0,"ipProtocol":"tcp","mask":"255.255.255.255","mirror":"disabled","mobileAppTunnel":"disabled","nat64":"disabled","pool":"/Common/Vip2_pool","rateLimit":"disabled","rateLimitDstMask":0,"rateLimitMode":"object","rateLimitSrcMask":0,"source":"0.0.0.0/0","sourceAddressTranslation":{"type":"automap"},"sourcePort":"preserve","synCookieStatus":"not-activated","translateAddress":"enabled","translatePort":"enabled","vlansDisabled":true,"vsIndex":5,"rules":["/Common/irule_random_snat"],"policiesReference":{"link":"https://localhost/mgmt/tm/ltm/virtual/~Common~Vip2_https/policies?ver=11.6.0","isSubcollection":true},"profilesReference":{"link":"https://localhost/mgmt/tm/ltm/virtual/~Common~Vip2_https/profiles?ver=11.6.0","isSubcollection":true}}

 

Deploying an iApp template using iControlREST

Because we recognize that it may be not obvious how we are deploying iApp templates using iControlREST, we break it down into more detail here.

First, note that there is no 'import' action we can invoke via REST to import the iApp template which mirrors the action in the Configuration Utility (GUI). This means that we need to create the JSON payload containing the iApp and POST it. 

Given an iApp template, like those found on DevCentral, here are the steps to create the JSON body.

 

  1. On a pre-existing BIG-IP install (or one have created in your build process for your code)
    1. Import the iApp template in the Configuration Utility in the 'Common' partition
    2. Do an HTTP GET to retrieve the iApp template payload. Make sure that you use the expandSubcollections=True as a query parameter, as we want to include the stuff in the 'actionsReference' sub-collection.
      1. curl -sku <user>:<password> -X GET  https://<management ip>/mgmt/tm/sys/application/template/~Common~<name of your iApp>?expandSubcollections=true
    3. You should get something back that looks like the following (which is the payload for the f5.http backport iApp).  I have truncated the 'implementation', 'presentation' and 'htmlHelp' actions:
      1. {
            "actionsReference": {
                "isSubcollection": true,
                "items": [
                    {
                        "fullPath": "definition",
                        "generation": 4672,
                        "htmlHelp": "....",
                        "implementation": "...",
                        "kind": "tm:sys:application:template:actions:actionsstate",
                        "name": "definition",
                        "presentation": "...",
                        "roleAcl": [
                            "admin",
                            "manager",
                            "resource-admin"
                        ],
                        "selfLink": "https://localhost/mgmt/tm/sys/application/template/~Common~f5.http.backport.1.1.2/actions/definition?ver=11.6.0"
                    }
                ],
                "link": "https://localhost/mgmt/tm/sys/application/template/~Common~f5.http.backport.1.1.2/actions?ver=11.6.0"
            },
            "fullPath": "/Common/f5.http.backport.1.1.2",
            "generation": 4672,
            "ignoreVerification": "false",
            "kind": "tm:sys:application:template:templatestate",
            "name": "f5.http.backport.1.1.2",
            "partition": "Common",
            "requiresBigipVersionMin": "11.6.0",
            "selfLink": "https://localhost/mgmt/tm/sys/application/template/~Common~f5.http.backport.1.1.2?expandSubcollections=true&ver=11.6.0",
            "totalSigningStatus": "not-all-signed",
            "verificationStatus": "none"
        }
      2. Before we can POST this payload back to any BIG-IP, we need to cleanup a few things:
        1. Remove any of the extraneous fields including 'verificationStatus', 'totalSigningStatus', 'selfLink', 'partition', 'kind', 'generation', 'fullPath'.
        2. Make a new top-level key in the payload called 'actions'.  The value for this key should everything in the 'items' array under the top-level key 'actionsReference'.  Finally, delete the 'actionsReference' key/value pair from the JSON body. The final JSON payload should look like:
          1. {
              "actions": [
                {
                  "htmlHelp": "....",
                  "implementation": "...",
                  "name": "definition",
                  "presentation": "...",
                  "roleAcl": [
                    "admin",
                    "manager",
                    "resource-admin"
                  ]
                }
              ],
              "ignoreVerification": "false",
              "name": "f5.http.backport.1.1.2",
              "requiresBigipVersionMin": "11.6.0",
              "totalSigningStatus": "not-all-signed"
            }
      3. Finally, we can use this to deploy an iApp template on BIG-IP.  In the example below, the iApp_template.json file is formatted like the above. I have also attached it to this page for inspection. 
        1. curl -sku rest_admin:<obfuscated> -H "Content-type: application/json" -X POST -d@./iApp_template.json https://52.23.149.16//mgmt/tm/sys/application/template

Before you go POSTing iApps to any old version of TMOS, be aware that there are still some remaining issues you might have to solve.  Some of the official iApps found on DevCentral are prepended with a TCL library that defines functions used within the iApp.  The iApp solutions team made this design decision so that newer iApps will work against older versions of TMOS.  For example, see the 'F5 HTTP', which starts with the library definition on line 0: "cli script f5.iapp.1.3.0.cli {....".  When you export the iApp template to JSON using REST as we have documented above, this library will not be included in the payload. Because newer versions of BIG-IP (11.6) might already include a version of this 'iApp' library, you can work around this issue by updating the function references to use the existing library on-box.  Here are the high-level steps:

  1. Downloading the iApp from DevCentral
  2. Change the function references to leverage the library that is installed on your BIG-IP.  See an example of this by comparing the F5 HTTP template on the codeshare with the one attached to this page. 
    1. You'll probably have to do some "find and replace" like the following:
    2. f5.iapp.1.3.0.cli:iapp_get_provisioned -> iapp::get_provisioned
    3. There may be some references to functions that do not exist yet.  These will have to be dealt with on a case-by-case basis. 
  3. Uploading the iApp to BIG-IP and exporting we documented above.  

Deploying an iApp service using iControlREST

Fortunately, using iControlREST to manage instances of iApps (also known as iApp services) is much easier than managing templates.  The high-level steps are similar: 

  1. Deploy an iApp service via the Configuration Utility.
  2. Do an HTTP GET to acquire the JSON representation (notice the URL formatting!).
    1. curl -sku <user>:<password> -X GET https://<management ip>/mgmt/tm/sys/application/service/~Common~<your iapp name>.app~<your iapp name> 
  3. Depending on the variables presented by the iApp template, the JSON payload for the iApp service might look something like:
    1.  {
          "deviceGroup": "none",
          "fullPath": "/Common/Vip1_iApp.app/Vip1_iApp",
          "generation": 4674,
          "inheritedDevicegroup": "true",
          "inheritedTrafficGroup": "true",
          "kind": "tm:sys:application:service:servicestate",
          "lists": [
              {
                  "encrypted": "no",
                  "name": "irules__irules",
                  "value": [
                      "/Common/irule_demo_analytics",
                      "/Common/irule_sorry_page"
                  ]
              }
          ],
          "name": "Vip1_iApp",
          "partition": "Common",
          "selfLink": "https://localhost/mgmt/tm/sys/application/service/~Common~Vip1_iApp.app~Vip1_iApp?ver=11.6.0",
          "strictUpdates": "enabled",
          "subPath": "Vip1_iApp.app",
          "tables": [
              {
                  "name": "basic__snatpool_members"
              },
              {
                  "name": "net__snatpool_members"
              },
              {
                  "name": "optimizations__hosts"
              },
              {
                  "columnNames": [
                      "name"
                  ],
                  "name": "pool__hosts",
                  "rows": [
                      {
                          "row": [
                              "demo.example.com"
                          ]
                      }
                  ]
              },
              {
                  "name": "pool__members"
              },
              {
                  "name": "server_pools__servers"
              }
          ],
          "template": "/Common/f5.http.backport.1.1.2",
          "templateModified": "yes",
          "trafficGroup": "/Common/traffic-group-1",
          "variables": [
              {
                  "encrypted": "no",
                  "name": "asm__security_logging",
                  "value": "asm_log_to_splunk"
              },
              {
                  "encrypted": "no",
                  "name": "asm__use_asm",
                  "value": "/Common/ltm_policy_w_asm_linux_high-Vip1"
              },
              {
                  "encrypted": "no",
                  "name": "client__http_compression",
                  "value": "/#do_not_use#"
              },
              {
                  "encrypted": "no",
                  "name": "client__standard_caching_without_wa",
                  "value": "/#do_not_use#"
              },
              {
                  "encrypted": "no",
                  "name": "client__tcp_wan_opt",
                  "value": "/Common/tcp-ssl-wan-optimized"
              },
              {
                  "encrypted": "no",
                  "name": "net__client_mode",
                  "value": "wan"
              },
              {
                  "encrypted": "no",
                  "name": "net__route_to_bigip",
                  "value": "no"
              },
              {
                  "encrypted": "no",
                  "name": "net__same_subnet",
                  "value": "no"
              },
              {
                  "encrypted": "no",
                  "name": "net__server_mode",
                  "value": "lan"
              },
              {
                  "encrypted": "no",
                  "name": "net__snat_type",
                  "value": "automap"
              },
              {
                  "encrypted": "no",
                  "name": "net__vlan_mode",
                  "value": "all"
              },
              {
                  "encrypted": "no",
                  "name": "pool__addr",
                  "value": "172.16.13.128"
              },
              {
                  "encrypted": "no",
                  "name": "pool__http",
                  "value": "/#create_new#"
              },
              {
                  "encrypted": "no",
                  "name": "pool__mask",
                  "value": "none"
              },
              {
                  "encrypted": "no",
                  "name": "pool__persist",
                  "value": "/#cookie#"
              },
              {
                  "encrypted": "no",
                  "name": "pool__pool_to_use",
                  "value": "/Common/Vip1_pool"
              },
              {
                  "encrypted": "no",
                  "name": "pool__port_secure",
                  "value": "443"
              },
              {
                  "encrypted": "no",
                  "name": "pool__redirect_port",
                  "value": "80"
              },
              {
                  "encrypted": "no",
                  "name": "pool__redirect_to_https",
                  "value": "yes"
              },
              {
                  "encrypted": "no",
                  "name": "pool__xff",
                  "value": "yes"
              },
              {
                  "encrypted": "no",
                  "name": "server__oneconnect",
                  "value": "/#do_not_use#"
              },
              {
                  "encrypted": "no",
                  "name": "server__tcp_lan_opt",
                  "value": "/Common/tcp-wan-optimized"
              },
              {
                  "encrypted": "no",
                  "name": "server__tcp_req_queueing",
                  "value": "no"
              },
              {
                  "encrypted": "no",
                  "name": "ssl__cert",
                  "value": "/Common/default.crt"
              },
              {
                  "encrypted": "no",
                  "name": "ssl__client_ssl_profile",
                  "value": "/#create_new#"
              },
              {
                  "encrypted": "no",
                  "name": "ssl__key",
                  "value": "/Common/default.key"
              },
              {
                  "encrypted": "no",
                  "name": "ssl__mode",
                  "value": "client_ssl"
              },
              {
                  "encrypted": "no",
                  "name": "ssl__use_chain_cert",
                  "value": "/#do_not_use#"
              },
              {
                  "encrypted": "no",
                  "name": "ssl_encryption_questions__advanced",
                  "value": "yes"
              },
              {
                  "encrypted": "no",
                  "name": "ssl_encryption_questions__help",
                  "value": "hide"
              },
              {
                  "encrypted": "no",
                  "name": "stats__analytics",
                  "value": "/Common/Vip1-demo_analytics"
              },
              {
                  "encrypted": "no",
                  "name": "stats__request_logging",
                  "value": "/#do_not_use#"
              }
          ]
      }
  4. As ealier, remove some of the fields that don't make sense to re-post. This includes 'deviceGroup', 'fullPath', 'generation', 'kind', 'partition', 'selfLink', and 'subPath'.
  5. You can now use this JSON body with updates to the variable values as needed.  

Example python code for deploying iApp Templates

In addition to the above procedures, we'd like you point you to some python examples which show how to push iApp templates using REST. Hitesh Patel, another monster F5er, has put together the following code:

https://github.com/0xHiteshPatel/appsvcs_integration_iapp/tree/80cc40dcf85e352a25c7ec44d9e4dcc253e51e69/scripts

In his words: "that's 152 lines of awesome right there".

His examples run against 11.5.x, 11.6.x and 12.0. 

Debugging

When trying to create or update an instance of an iApp via REST, you will get error messages in the HTTP response if your POST is unsuccessful.  In addition to the HTTP payload in the response, the following debug steps can be helpful:

1) Set the scriptd log level to debug:

modify sys scriptd log-level debug

2) Look at the TMSH output from the iApp printed to /var/log/scriptd.out.  Typically the last line will show the error that has occured. 

In closing

The above examples should bring you one step closer to automating the delivery of advanced network services for your applications.  We're looking forward to doing future posts on how to automate your deployment.  Finally, if you haven't checked out the Application Services Integration iApp, also by Hitesh, you should probably do so now: https://github.com/0xHiteshPatel/appsvcs_integration_iapp.

Cheers!

Published Nov 09, 2015
Version 1.0

1 Comment

  • Hi Chris,

    Nice work.

    From your example Deploying an iApp service using iControlRest would we also use a post (like for the template example) for the deployment part? If so, would it look something like the below CURL statement?

    curl -sku rest_admin: -H "Content-type:application/json" -X POST -d@./iApp_.json https:///mgmt/tm/sys/application/service/~Common~.app~

    Regards,

    Barney

"}},"componentScriptGroups({\"componentId\":\"custom.widget.Beta_MetaNav\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.Beta_Footer\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[\"board:TechnicalArticles\",\"message:276589\"],\"name\":\"TkbMessagePage\",\"props\":{},\"url\":\"https://community.f5.com/kb/technicalarticles/full-examples-of-icontrolrest-for-device-and-application-service-deployment/276589\"}}})":{"__typename":"ComponentRenderResult","html":"
 
 
 
 
 

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

In a previous article, I highlighted a proof-of-concept where we fully automated the deployment of BIG-IP in AWS using the web interfaces of BIG-IP inconjunction with Ansible.  The goal of this article is to focus in more detail on the use of iControlREST within that project, in order to show how it can be extremely useful for automating various aspects of your ITOM workflows.

\n\n

There are four main workflows we execute in order to configure BIG-IP in AWS and to deploy services.  This breakown is provided below.  

\n\n\n\n

For now, we avoid the discussion about which configuration elements are part of the infrastructure deployment or the application deployment.  This is an important discussion, but one that can only take place after we understand how to provision the elements that will be a part of either workflow. 

\n\n

For each of these workflows, we have provided the log output which shows REST calls and responses.  To gain from these examples, it is important to understand the following:

\n\n\n\n

Basic system configuration

\n\n\n\n
\n2015-11-12 09:46:03 : Disabling Setup Utility in GUI\nGET mgmt/tm/sys/db \"\"\n2015-11-12 09:46:10 : Disabling Setup Utility in GUI\nGET mgmt/tm/sys/db \"\"\n2015-11-12 09:46:17 : Disabling Setup Utility in GUI\nGET mgmt/tm/sys/db \"\"\nMethod GET mgmt/tm/sys/db returned: {\"kind\":\"tm:sys:db:dbcollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/sys/db?ver=11.6.0\",\"items\":[....<a whole bunch of database variables>...]}\n\n2015-11-12 09:46:19 : Disabling Setup Utility in GUI\nPATCH mgmt/tm/sys/db/setup.run?ver=11.6.0 {\"value\": \"false\"}\nMethod PATCH mgmt/tm/sys/db/setup.run?ver=11.6.0 returned: {\"kind\":\"tm:sys:db:dbstate\",\"name\":\"setup.run\",\"fullPath\":\"setup.run\",\"generation\":62,\"selfLink\":\"https://localhost/mgmt/tm/sys/db/setup.run?ver=11.6.0\",\"defaultValue\":\"true\",\"scfConfig\":\"false\",\"value\":\"false\",\"valueRange\":\"false true\"}\n\n2015-11-12 09:46:22 : Configuring NTP servers\nPATCH mgmt/tm/sys/ntp {\"timezone\": \"America/Los_Angeles\", \"servers\": [\"0.pool.ntp.org\", \"1.pool.ntp.org\"]}\nMethod PATCH mgmt/tm/sys/ntp returned: {\"kind\":\"tm:sys:ntp:ntpstate\",\"selfLink\":\"https://localhost/mgmt/tm/sys/ntp?ver=11.6.0\",\"servers\":[\"0.pool.ntp.org\",\"1.pool.ntp.org\"],\"timezone\":\"America/Los_Angeles\",\"restrictReference\":{\"link\":\"https://localhost/mgmt/tm/sys/ntp/restrict?ver=11.6.0\",\"isSubcollection\":true}}\n\n2015-11-12 09:46:25 : Configuring syslog logging destinations\nPATCH mgmt/tm/sys/syslog {\"include\": \"destination loghost { udp( 10.0.3.32 port (514));};\"}\nMethod PATCH mgmt/tm/sys/syslog returned: {\"kind\":\"tm:sys:syslog:syslogstate\",\"selfLink\":\"https://localhost/mgmt/tm/sys/syslog?ver=11.6.0\",\"authPrivFrom\":\"notice\",\"authPrivTo\":\"emerg\",\"consoleLog\":\"enabled\",\"cronFrom\":\"warning\",\"cronTo\":\"emerg\",\"daemonFrom\":\"notice\",\"daemonTo\":\"emerg\",\"include\":\"destination loghost { udp( 10.0.3.32 port (514));};\",\"isoDate\":\"disabled\",\"kernFrom\":\"debug\",\"kernTo\":\"emerg\",\"local6From\":\"notice\",\"local6To\":\"emerg\",\"mailFrom\":\"notice\",\"mailTo\":\"emerg\",\"messagesFrom\":\"notice\",\"messagesTo\":\"warning\",\"userLogFrom\":\"notice\",\"userLogTo\":\"emerg\"}\n\n2015-11-12 09:46:28 : Configuring HTTP mgmt access\nPATCH mgmt/tm/sys/httpd {\"allow\": [\"ALL\"]}\nMethod PATCH mgmt/tm/sys/httpd returned: {\"kind\":\"tm:sys:httpd:httpdstate\",\"selfLink\":\"https://localhost/mgmt/tm/sys/httpd?ver=11.6.0\",\"allow\":[\"ALL\"],\"authName\":\"BIG-IP\",\"authPamDashboardTimeout\":\"off\",\"authPamIdleTimeout\":1200,\"authPamValidateIp\":\"on\",\"fastcgiTimeout\":300,\"hostnameLookup\":\"off\",\"logLevel\":\"warn\",\"maxClients\":10,\"redirectHttpToHttps\":\"disabled\",\"requestBodyMaxTimeout\":0,\"requestBodyMinRate\":500,\"requestBodyTimeout\":60,\"requestHeaderMaxTimeout\":40,\"requestHeaderMinRate\":500,\"requestHeaderTimeout\":20,\"sslCertfile\":\"/etc/httpd/conf/ssl.crt/server.crt\",\"sslCertkeyfile\":\"/etc/httpd/conf/ssl.key/server.key\",\"sslCiphersuite\":\"DEFAULT:!aNULL:!eNULL:!LOW:!RC4:!MD5:!EXP\",\"sslOcspDefaultResponder\":\"http://127.0.0.1\",\"sslOcspEnable\":\"off\",\"sslOcspOverrideResponder\":\"off\",\"sslOcspResponderTimeout\":300,\"sslOcspResponseMaxAge\":-1,\"sslOcspResponseTimeSkew\":300,\"sslProtocol\":\"all -SSLv2 -SSLv3\",\"sslVerifyClient\":\"no\",\"sslVerifyDepth\":10}\n\n2015-11-12 09:46:31 : Configuring SSH mgmt access\nPATCH mgmt/tm/sys/sshd {\"allow\": [\"ALL\"]}\nMethod PATCH mgmt/tm/sys/sshd returned: {\"kind\":\"tm:sys:sshd:sshdstate\",\"selfLink\":\"https://localhost/mgmt/tm/sys/sshd?ver=11.6.0\",\"allow\":[\"ALL\"],\"banner\":\"disabled\",\"inactivityTimeout\":0,\"logLevel\":\"info\",\"login\":\"enabled\"}\n\n2015-11-12 09:46:33 : Configuring SNMP access\nPATCH mgmt/tm/sys/snmp {\"allowedAddresses\": [\"172.16.0.0/16\"]}\nMethod PATCH mgmt/tm/sys/snmp returned: {\"kind\":\"tm:sys:snmp:snmpstate\",\"selfLink\":\"https://localhost/mgmt/tm/sys/snmp?ver=11.6.0\",\"agentAddresses\":[\"tcp6:161\",\"udp6:161\"],\"agentTrap\":\"enabled\",\"allowedAddresses\":[\"172.16.0.0/16\"],\"authTrap\":\"disabled\",\"bigipTraps\":\"enabled\",\"l2forwardVlan\":\"none\",\"loadMax1\":12,\"loadMax15\":12,\"loadMax5\":12,\"sysContact\":\"Customer Name <admin@customer.com>\",\"sysLocation\":\"Network Closet 1\",\"sysServices\":78,\"trapCommunity\":\"public\",\"trapSource\":\"none\",\"communitiesReference\":{\"link\":\"https://localhost/mgmt/tm/sys/snmp/communities?ver=11.6.0\",\"isSubcollection\":true},\"diskMonitors\":[{\"name\":\"root\",\"partition\":\"Common\",\"minspace\":2000,\"minspaceType\":\"size\",\"path\":\"/\"},{\"name\":\"var\",\"partition\":\"Common\",\"minspace\":10000,\"minspaceType\":\"size\",\"path\":\"/var\"}],\"processMonitors\":[{\"name\":\"bigd\",\"partition\":\"Common\",\"maxProcesses\":\"1\",\"minProcesses\":1,\"process\":\"bigd\"},{\"name\":\"chmand\",\"partition\":\"Common\",\"maxProcesses\":\"1\",\"minProcesses\":1,\"process\":\"chmand\"},{\"name\":\"httpd\",\"partition\":\"Common\",\"maxProcesses\":\"infinity\",\"minProcesses\":1,\"process\":\"httpd\"},{\"name\":\"mcpd\",\"partition\":\"Common\",\"maxProcesses\":\"1\",\"minProcesses\":1,\"process\":\"mcpd\"},{\"name\":\"sod\",\"partition\":\"Common\",\"maxProcesses\":\"1\",\"minProcesses\":1,\"process\":\"sod\"},{\"name\":\"tmm\",\"partition\":\"Common\",\"maxProcesses\":\"infinity\",\"minProcesses\":1,\"process\":\"tmm\"}],\"trapsReference\":{\"link\":\"https://localhost/mgmt/tm/sys/snmp/traps?ver=11.6.0\",\"isSubcollection\":true},\"usersReference\":{\"link\":\"https://localhost/mgmt/tm/sys/snmp/users?ver=11.6.0\",\"isSubcollection\":true}}\n\n2015-11-12 09:46:36 : Configuring FastL4 profiles ... fastL4-route-friendly\nGET mgmt/tm/ltm/profile/fastl4 \"\"\nMethod GET mgmt/tm/ltm/profile/fastl4 returned: {\"kind\":\"tm:ltm:profile:fastl4:fastl4collectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/profile/fastl4?ver=11.6.0\",\"items\":[{\"kind\":\"tm:ltm:profile:fastl4:fastl4state\",\"name\":\"fastL4\",\"partition\":\"Common\",\"fullPath\":\"/Common/fastL4\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/profile/fastl4/~Common~fastL4?ver=11.6.0\",\"clientTimeout\":30,\"explicitFlowMigration\":\"disabled\",\"hardwareSynCookie\":\"enabled\",\"idleTimeout\":\"300\",\"ipTosToClient\":\"pass-through\",\"ipTosToServer\":\"pass-through\",\"keepAliveInterval\":\"disabled\",\"lateBinding\":\"disabled\",\"linkQosToClient\":\"pass-through\",\"linkQosToServer\":\"pass-through\",\"looseClose\":\"disabled\",\"looseInitialization\":\"disabled\",\"mssOverride\":0,\"priorityToClient\":\"pass-through\",\"priorityToServer\":\"pass-through\",\"pvaAcceleration\":\"full\",\"pvaDynamicClientPackets\":1,\"pvaDynamicServerPackets\":0,\"pvaFlowAging\":\"enabled\",\"pvaFlowEvict\":\"enabled\",\"pvaOffloadDynamic\":\"enabled\",\"pvaOffloadState\":\"embryonic\",\"reassembleFragments\":\"disabled\",\"receiveWindowSize\":0,\"resetOnTimeout\":\"enabled\",\"rttFromClient\":\"disabled\",\"rttFromServer\":\"disabled\",\"serverSack\":\"disabled\",\"serverTimestamp\":\"disabled\",\"softwareSynCookie\":\"disabled\",\"synCookieWhitelist\":\"disabled\",\"tcpCloseTimeout\":\"5\",\"tcpGenerateIsn\":\"disabled\",\"tcpHandshakeTimeout\":\"5\",\"tcpStripSack\":\"disabled\",\"tcpTimestampMode\":\"preserve\",\"tcpWscaleMode\":\"preserve\",\"timeoutRecovery\":\"disconnect\"}]}\n\n2015-11-12 09:46:37 : Configuring FastL4 profiles ... fastL4-route-friendly\nPOST mgmt/tm/ltm/profile/fastl4 {\"looseClose\": \"enabled\", \"resetOnTimeout\": \"disabled\", \"name\": \"fastL4-route-friendly\", \"looseInitialization\": \"enabled\"}\nMethod POST mgmt/tm/ltm/profile/fastl4 returned: {\"kind\":\"tm:ltm:profile:fastl4:fastl4state\",\"name\":\"fastL4-route-friendly\",\"fullPath\":\"fastL4-route-friendly\",\"generation\":68,\"selfLink\":\"https://localhost/mgmt/tm/ltm/profile/fastl4/fastL4-route-friendly?ver=11.6.0\",\"clientTimeout\":30,\"defaultsFrom\":\"/Common/fastL4\",\"explicitFlowMigration\":\"disabled\",\"hardwareSynCookie\":\"enabled\",\"idleTimeout\":\"300\",\"ipTosToClient\":\"pass-through\",\"ipTosToServer\":\"pass-through\",\"keepAliveInterval\":\"disabled\",\"lateBinding\":\"disabled\",\"linkQosToClient\":\"pass-through\",\"linkQosToServer\":\"pass-through\",\"looseClose\":\"enabled\",\"looseInitialization\":\"enabled\",\"mssOverride\":0,\"priorityToClient\":\"pass-through\",\"priorityToServer\":\"pass-through\",\"pvaAcceleration\":\"full\",\"pvaDynamicClientPackets\":1,\"pvaDynamicServerPackets\":0,\"pvaFlowAging\":\"enabled\",\"pvaFlowEvict\":\"enabled\",\"pvaOffloadDynamic\":\"enabled\",\"pvaOffloadState\":\"embryonic\",\"reassembleFragments\":\"disabled\",\"receiveWindowSize\":0,\"resetOnTimeout\":\"disabled\",\"rttFromClient\":\"disabled\",\"rttFromServer\":\"disabled\",\"serverSack\":\"disabled\",\"serverTimestamp\":\"disabled\",\"softwareSynCookie\":\"disabled\",\"synCookieWhitelist\":\"disabled\",\"tcpCloseTimeout\":\"5\",\"tcpGenerateIsn\":\"disabled\",\"tcpHandshakeTimeout\":\"5\",\"tcpStripSack\":\"disabled\",\"tcpTimestampMode\":\"preserve\",\"tcpWscaleMode\":\"preserve\",\"timeoutRecovery\":\"disconnect\"}\n\n...\n\n2015-11-12 09:46:44 :\nPATCH mgmt/tm/sys/provision/asm {\"level\": \"nominal\"}\nMethod PATCH mgmt/tm/sys/provision/asm returned: {\"kind\":\"tm:sys:provision:provisionstate\",\"name\":\"asm\",\"fullPath\":\"asm\",\"generation\":71,\"selfLink\":\"https://localhost/mgmt/tm/sys/provision/asm?ver=11.6.0\",\"cpuRatio\":0,\"diskRatio\":0,\"level\":\"nominal\",\"memoryRatio\":0}\n\n2015-11-12 09:47:18 :\nPATCH mgmt/tm/sys/provision/avr {\"level\": \"nominal\"}\nMethod PATCH mgmt/tm/sys/provision/avr returned: {\"kind\":\"tm:sys:provision:provisionstate\",\"name\":\"avr\",\"fullPath\":\"avr\",\"generation\":114,\"selfLink\":\"https://localhost/mgmt/tm/sys/provision/avr?ver=11.6.0\",\"cpuRatio\":0,\"diskRatio\":0,\"level\":\"nominal\",\"memoryRatio\":0}
\n\n

AWS-specific System Configuration

\n\n\n\n
\n2015-11-12 09:48:12 : Adding/updating AWS access and secret keys\nPATCH mgmt/tm/sys/global-settings {\"awsAccessKey\": \"...<my access key>...\", \"awsSecretKey\": \"...<my secret key>...\"}\nMethod PATCH mgmt/tm/sys/global-settings returned: {\"kind\":\"tm:sys:global-settings:global-settingsstate\",\"selfLink\":\"https://localhost/mgmt/tm/sys/global-settings?ver=11.6.0\",\"awsAccessKey\":\"...<my access key>...\",\"awsApiMaxConcurrency\":1,\"awsSecretKey\":\"...<my secret key>...\",\"consoleInactivityTimeout\":0,\"customAddr\":\"none\",\"failsafeAction\":\"go-offline-restart-tm\",\"fileLocalPathPrefix\":\"{/shared/} {/tmp/}\",\"guiSecurityBanner\":\"enabled\",\"guiSecurityBannerText\":\"Welcome to the BIG-IP Configuration Utility.\\n\\nLog in with your username and password using the fields on the left.\",\"guiSetup\":\"disabled\",\"hostAddrMode\":\"management\",\"hostname\":\"ip-172-16-11-77.ec2.internal\",\"lcdDisplay\":\"enabled\",\"mgmtDhcp\":\"enabled\",\"netReboot\":\"disabled\",\"passwordPrompt\":\"Password\",\"quietBoot\":\"enabled\",\"usernamePrompt\":\"Username\"}\n
\n\n

Network Attachment

\n\n\n\n
\n2015-11-12 09:48:15 : Disabling dhcp\nPATCH mgmt/tm/sys/db/dhclient.mgmt {\"value\": \"disable\"}\nMethod PATCH mgmt/tm/sys/db/dhclient.mgmt returned: {\"kind\":\"tm:sys:db:dbstate\",\"name\":\"dhclient.mgmt\",\"fullPath\":\"dhclient.mgmt\",\"generation\":154,\"selfLink\":\"https://localhost/mgmt/tm/sys/db/dhclient.mgmt?ver=11.6.0\",\"defaultValue\":\"disable\",\"scfConfig\":\"true\",\"value\":\"disable\",\"valueRange\":\"disable enable\"}\n\n2015-11-12 09:48:18 : Adding/updating internal vlan\nGET mgmt/tm/net/vlan \"\"\nMethod GET mgmt/tm/net/vlan returned: {\"kind\":\"tm:net:vlan:vlancollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/net/vlan?ver=11.6.0\"}\n\n2015-11-12 09:48:19 : Adding/updating internal vlan\nPOST mgmt/tm/net/vlan {\"interfaces\": \"1.2\", \"name\": \"private\"}\nMethod POST mgmt/tm/net/vlan returned: {\"kind\":\"tm:net:vlan:vlanstate\",\"name\":\"private\",\"fullPath\":\"private\",\"generation\":167,\"selfLink\":\"https://localhost/mgmt/tm/net/vlan/private?ver=11.6.0\",\"autoLasthop\":\"default\",\"cmpHash\":\"default\",\"dagRoundRobin\":\"disabled\",\"dagTunnel\":\"outer\",\"failsafe\":\"disabled\",\"failsafeAction\":\"failover-restart-tm\",\"failsafeTimeout\":90,\"ifIndex\":80,\"learning\":\"enable-forward\",\"mtu\":1500,\"sflow\":{\"pollInterval\":0,\"pollIntervalGlobal\":\"yes\",\"samplingRate\":0,\"samplingRateGlobal\":\"yes\"},\"sourceChecking\":\"disabled\",\"tag\":4094,\"interfacesReference\":{\"link\":\"https://localhost/mgmt/tm/net/vlan/~Common~private/interfaces?ver=11.6.0\",\"isSubcollection\":true}}\n\n2015-11-12 09:48:21 : Adding/updating external vlan\nGET mgmt/tm/net/vlan \"\"\nMethod GET mgmt/tm/net/vlan returned: {\"kind\":\"tm:net:vlan:vlancollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/net/vlan?ver=11.6.0\",\"items\":[{\"kind\":\"tm:net:vlan:vlanstate\",\"name\":\"private\",\"partition\":\"Common\",\"fullPath\":\"/Common/private\",\"generation\":167,\"selfLink\":\"https://localhost/mgmt/tm/net/vlan/~Common~private?ver=11.6.0\",\"autoLasthop\":\"default\",\"cmpHash\":\"default\",\"dagRoundRobin\":\"disabled\",\"dagTunnel\":\"outer\",\"failsafe\":\"disabled\",\"failsafeAction\":\"failover-restart-tm\",\"failsafeTimeout\":90,\"ifIndex\":80,\"learning\":\"enable-forward\",\"mtu\":1500,\"sflow\":{\"pollInterval\":0,\"pollIntervalGlobal\":\"yes\",\"samplingRate\":0,\"samplingRateGlobal\":\"yes\"},\"sourceChecking\":\"disabled\",\"tag\":4094,\"interfacesReference\":{\"link\":\"https://localhost/mgmt/tm/net/vlan/~Common~private/interfaces?ver=11.6.0\",\"isSubcollection\":true}}]}\n\n...\n\n2015-11-12 09:48:24 : Adding/updating internal selfip\nGET mgmt/tm/net/self \"\"\nMethod GET mgmt/tm/net/self returned: {\"kind\":\"tm:net:self:selfcollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/net/self?ver=11.6.0\"}\n\n2015-11-12 09:48:24 : Adding/updating internal selfip\nPOST mgmt/tm/net/self {\"allowService\": \"default\", \"vlan\": \"private\", \"trafficGroup\": \"traffic-group-local-only\", \"name\": \"private\", \"address\": \"172.16.12.44/24\"}\nMethod POST mgmt/tm/net/self returned: {\"kind\":\"tm:net:self:selfstate\",\"name\":\"private\",\"fullPath\":\"private\",\"generation\":177,\"selfLink\":\"https://localhost/mgmt/tm/net/self/private?ver=11.6.0\",\"address\":\"172.16.12.44/24\",\"floating\":\"disabled\",\"inheritedTrafficGroup\":\"false\",\"trafficGroup\":\"/Common/traffic-group-local-only\",\"unit\":0,\"vlan\":\"/Common/private\",\"allowService\":[\"default\"]}\n\n2015-11-12 09:48:26 : Adding/updating external selfip\nGET mgmt/tm/net/self \"\"\nMethod GET mgmt/tm/net/self returned: {\"kind\":\"tm:net:self:selfcollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/net/self?ver=11.6.0\",\"items\":[{\"kind\":\"tm:net:self:selfstate\",\"name\":\"private\",\"partition\":\"Common\",\"fullPath\":\"/Common/private\",\"generation\":177,\"selfLink\":\"https://localhost/mgmt/tm/net/self/~Common~private?ver=11.6.0\",\"address\":\"172.16.12.44/24\",\"floating\":\"disabled\",\"inheritedTrafficGroup\":\"false\",\"trafficGroup\":\"/Common/traffic-group-local-only\",\"unit\":0,\"vlan\":\"/Common/private\",\"allowService\":[\"default\"]}]}\n\n2015-11-12 09:48:27 : Adding/updating external selfip\nPOST mgmt/tm/net/self {\"allowService\": [\"tcp:4353\"], \"vlan\": \"public\", \"trafficGroup\": \"traffic-group-local-only\", \"name\": \"public\", \"address\": \"172.16.13.83/24\"}\nMethod POST mgmt/tm/net/self returned: {\"kind\":\"tm:net:self:selfstate\",\"name\":\"public\",\"fullPath\":\"public\",\"generation\":178,\"selfLink\":\"https://localhost/mgmt/tm/net/self/public?ver=11.6.0\",\"address\":\"172.16.13.83/24\",\"floating\":\"disabled\",\"inheritedTrafficGroup\":\"false\",\"trafficGroup\":\"/Common/traffic-group-local-only\",\"unit\":0,\"vlan\":\"/Common/public\",\"allowService\":[\"tcp:4353\"]}\n\n2015-11-12 09:48:29 : Setting default route using default_gateway or gateway_pool\nGET /mgmt/tm/net/route \"\"\nMethod GET /mgmt/tm/net/route returned: {\"kind\":\"tm:net:route:routecollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/net/route?ver=11.6.0\"}\n\n2015-11-12 09:48:29 : Setting default route using default_gateway or gateway_pool\nPOST /mgmt/tm/net/route {\"gw\": \"172.16.13.1\", \"name\": \"default_route\", \"network\": \"default\"}\nMethod POST /mgmt/tm/net/route returned: {\"kind\":\"tm:net:route:routestate\",\"name\":\"default_route\",\"fullPath\":\"default_route\",\"generation\":0,\"selfLink\":\"https://localhost/mgmt/tm/net/route/default_route?ver=11.6.0\"}
\n\n

Application Service Provisioning

\n\n

This workflow is where things really get interesting.  Let's break it down.

\n\n\n\n
\n2015-11-12 09:49:13 : Deploying/updating Webserver Pool\nGET mgmt/tm/ltm/pool \"\"\nMethod GET mgmt/tm/ltm/pool returned: {\"kind\":\"tm:ltm:pool:poolcollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/pool?ver=11.6.0\"}\n\n2015-11-12 09:49:14 : Deploying/updating Webserver Pool\nPOST mgmt/tm/ltm/pool {\"name\": \"Vip1_pool\", \"members\": [{\"description\": \"Name=/boring_lovelace,ContainerHostname=a0085832ad28,Image=mutzel/all-in-one-hackazon:postinstall\", \"name\": \"172.16.14.87:80\", \"address\": \"172.16.14.87\"}], \"monitor\": \"http\"}\nMethod POST mgmt/tm/ltm/pool returned: {\"kind\":\"tm:ltm:pool:poolstate\",\"name\":\"Vip1_pool\",\"fullPath\":\"Vip1_pool\",\"generation\":236,\"selfLink\":\"https://localhost/mgmt/tm/ltm/pool/Vip1_pool?ver=11.6.0\",\"allowNat\":\"yes\",\"allowSnat\":\"yes\",\"ignorePersistedWeight\":\"disabled\",\"ipTosToClient\":\"pass-through\",\"ipTosToServer\":\"pass-through\",\"linkQosToClient\":\"pass-through\",\"linkQosToServer\":\"pass-through\",\"loadBalancingMode\":\"round-robin\",\"minActiveMembers\":0,\"minUpMembers\":0,\"minUpMembersAction\":\"failover\",\"minUpMembersChecking\":\"disabled\",\"monitor\":\"/Common/http \",\"queueDepthLimit\":0,\"queueOnConnectionLimit\":\"disabled\",\"queueTimeLimit\":0,\"reselectTries\":0,\"serviceDownAction\":\"none\",\"slowRampTime\":10,\"membersReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/pool/~Common~Vip1_pool/members?ver=11.6.0\",\"isSubcollection\":true}}\n\n2015-11-12 09:49:18 : Deploying/updating High Speed Logging pool to send to Analytics Server\nGET mgmt/tm/ltm/pool \"\"\nMethod GET mgmt/tm/ltm/pool returned: {\"kind\":\"tm:ltm:pool:poolcollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/pool?ver=11.6.0\",\"items\":[{\"kind\":\"tm:ltm:pool:poolstate\",\"name\":\"Vip1_pool\",\"partition\":\"Common\",\"fullPath\":\"/Common/Vip1_pool\",\"generation\":236,\"selfLink\":\"https://localhost/mgmt/tm/ltm/pool/~Common~Vip1_pool?ver=11.6.0\",\"allowNat\":\"yes\",\"allowSnat\":\"yes\",\"ignorePersistedWeight\":\"disabled\",\"ipTosToClient\":\"pass-through\",\"ipTosToServer\":\"pass-through\",\"linkQosToClient\":\"pass-through\",\"linkQosToServer\":\"pass-through\",\"loadBalancingMode\":\"round-robin\",\"minActiveMembers\":0,\"minUpMembers\":0,\"minUpMembersAction\":\"failover\",\"minUpMembersChecking\":\"disabled\",\"monitor\":\"/Common/http \",\"queueDepthLimit\":0,\"queueOnConnectionLimit\":\"disabled\",\"queueTimeLimit\":0,\"reselectTries\":0,\"serviceDownAction\":\"none\",\"slowRampTime\":10,\"membersReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/pool/~Common~Vip1_pool/members?ver=11.6.0\",\"isSubcollection\":true}}]}\n\n2015-11-12 09:49:19 : Deploying/updating High Speed Logging pool to send to Analytics Server\nPOST mgmt/tm/ltm/pool {\"name\": \"syslog_pool\", \"members\": [{\"name\": \"172.16.14.180:514\", \"address\": \"172.16.14.180\"}], \"monitor\": \"tcp\"}\nMethod POST mgmt/tm/ltm/pool returned: {\"kind\":\"tm:ltm:pool:poolstate\",\"name\":\"syslog_pool\",\"fullPath\":\"syslog_pool\",\"generation\":239,\"selfLink\":\"https://localhost/mgmt/tm/ltm/pool/syslog_pool?ver=11.6.0\",\"allowNat\":\"yes\",\"allowSnat\":\"yes\",\"ignorePersistedWeight\":\"disabled\",\"ipTosToClient\":\"pass-through\",\"ipTosToServer\":\"pass-through\",\"linkQosToClient\":\"pass-through\",\"linkQosToServer\":\"pass-through\",\"loadBalancingMode\":\"round-robin\",\"minActiveMembers\":0,\"minUpMembers\":0,\"minUpMembersAction\":\"failover\",\"minUpMembersChecking\":\"disabled\",\"monitor\":\"/Common/tcp \",\"queueDepthLimit\":0,\"queueOnConnectionLimit\":\"disabled\",\"queueTimeLimit\":0,\"reselectTries\":0,\"serviceDownAction\":\"none\",\"slowRampTime\":10,\"membersReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/pool/~Common~syslog_pool/members?ver=11.6.0\",\"isSubcollection\":true}}\n\n...\n\n2015-11-12 09:49:21 : Deploying/updating ASM Logging Profile to send to Remote Analytics Server\nPOST mgmt/tm/security/log/profile {\"application\": [{\"guaranteeLogging\": \"enabled\", \"guaranteeResponseLogging\": \"disabled\", \"logicOperation\": \"or\", \"protocol\": \"tcp\", \"name\": \"asm_log_to_splunk\", \"format\": {\"fieldDelimiter\": \",\", \"type\": \"predefined\"}, \"reportAnomalies\": \"disabled\", \"facility\": \"local0\", \"partition\": \"Common\", \"filter\": [{\"values\": [\"all\"], \"name\": \"protocol\"}, {\"values\": [\"all\"], \"name\": \"request-type\"}, {\"name\": \"search-all\"}], \"maximumHeaderSize\": \"any\", \"localStorage\": \"enabled\", \"maximumQuerySize\": \"any\", \"maximumEntryLength\": \"2k\", \"servers\": [{\"name\": \"172.16.14.180:515\"}], \"remoteStorage\": \"splunk\", \"maximumRequestSize\": \"any\", \"responseLogging\": \"none\"}], \"name\": \"asm_log_to_splunk\"}\nMethod POST mgmt/tm/security/log/profile returned: {\"kind\":\"tm:security:log:profile:profilestate\",\"name\":\"asm_log_to_splunk\",\"fullPath\":\"asm_log_to_splunk\",\"generation\":240,\"selfLink\":\"https://localhost/mgmt/tm/security/log/profile/asm_log_to_splunk?ver=11.6.0\",\"applicationReference\":{\"link\":\"https://localhost/mgmt/tm/security/log/profile/~Common~asm_log_to_splunk/application?ver=11.6.0\",\"isSubcollection\":true}}\n\n2015-11-12 09:49:23 : Deploying/updating Analytics Profile\nGET mgmt/tm/ltm/profile/analytics \"\"\nMethod GET mgmt/tm/ltm/profile/analytics returned: {\"kind\":\"tm:ltm:profile:analytics:analyticscollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/profile/analytics?ver=11.6.0\",\"items\":[{\"kind\":\"tm:ltm:profile:analytics:analyticsstate\",\"name\":\"analytics\",\"partition\":\"Common\",\"fullPath\":\"/Common/analytics\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/profile/analytics/~Common~analytics?ver=11.6.0\",\"capturedTrafficExternalLogging\":\"disabled\",\"capturedTrafficInternalLogging\":\"disabled\",\"collectGeo\":\"disabled\",\"collectIp\":\"disabled\",\"collectMaxTpsAndThroughput\":\"disabled\",\"collectMethods\":\"enabled\",\"collectPageLoadTime\":\"disabled\",\"collectResponseCodes\":\"enabled\",\"collectSubnets\":\"disabled\",\"collectUrl\":\"disabled\",\"collectUserAgent\":\"disabled\",\"collectUserSessions\":\"disabled\",\"collectedStatsExternalLogging\":\"disabled\",\"collectedStatsInternalLogging\":\"enabled\",\"notificationByEmail\":\"disabled\",\"notificationBySnmp\":\"disabled\",\"notificationBySyslog\":\"disabled\",\"publishIruleStatistics\":\"disabled\",\"sampling\":\"enabled\",\"sessionCookieSecurity\":\"ssl-only\",\"sessionTimeoutMinutes\":\"5\",\"alertsReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/profile/analytics/~Common~analytics/alerts?ver=11.6.0\",\"isSubcollection\":true},\"trafficCaptureReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/profile/analytics/~Common~analytics/traffic-capture?ver=11.6.0\",\"isSubcollection\":true}}]}\n\n...\n\n2015-11-12 09:49:26 : Uploading Datagroup ... background for sorry page\nGET mgmt/tm/ltm/data-group/internal \"\"\nMethod GET mgmt/tm/ltm/data-group/internal returned: {\"kind\":\"tm:ltm:data-group:internal:internalcollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal?ver=11.6.0\",\"items\":[{\"kind\":\"tm:ltm:data-group:internal:internalstate\",\"name\":\"aol\",\"partition\":\"Common\",\"fullPath\":\"/Common/aol\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~aol?ver=11.6.0\",\"type\":\"ip\",\"records\":[{\"name\":\"64.12.96.0/19\"},{\"name\":\"195.93.16.0/20\"},{\"name\":\"195.93.48.0/22\"},{\"name\":\"195.93.64.0/19\"},{\"name\":\"195.93.96.0/19\"},{\"name\":\"198.81.0.0/22\"},{\"name\":\"198.81.8.0/23\"},{\"name\":\"198.81.16.0/20\"},{\"name\":\"202.67.65.128/25\"},{\"name\":\"205.188.112.0/20\"},{\"name\":\"205.188.146.144/30\"},{\"name\":\"205.188.192.0/20\"},{\"name\":\"205.188.208.0/23\"},{\"name\":\"207.200.112.0/21\"}]},{\"kind\":\"tm:ltm:data-group:internal:internalstate\",\"name\":\"images\",\"partition\":\"Common\",\"fullPath\":\"/Common/images\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~images?ver=11.6.0\",\"type\":\"string\",\"records\":[{\"name\":\".bmp\"},{\"name\":\".gif\"},{\"name\":\".jpg\"}]},{\"kind\":\"tm:ltm:data-group:internal:internalstate\",\"name\":\"private_net\",\"partition\":\"Common\",\"fullPath\":\"/Common/private_net\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~private_net?ver=11.6.0\",\"type\":\"ip\",\"records\":[{\"name\":\"10.0.0.0/8\"},{\"name\":\"172.16.0.0/12\"},{\"name\":\"192.168.0.0/16\"}]}]}\n\n2015-11-12 09:49:26 : Uploading Datagroup ... background for sorry page\nPOST mgmt/tm/ltm/data-group/internal {\"records\": [{\"name\": \"...<base64 image>...\"}], \"type\": \"string\", \"name\": \"background_images\"}\nMethod POST mgmt/tm/ltm/data-group/internal returned: {\"kind\":\"tm:ltm:data-group:internal:internalstate\",\"name\":\"background_images\",\"fullPath\":\"background_images\",\"generation\":244,\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal/background_images?ver=11.6.0\",\"type\":\"string\",\"records\":[{\"name\":\"....large base64 image....\"}]}\n\n2015-11-12 09:49:29 : Uploading Datagroup ... image for sorry page\nGET mgmt/tm/ltm/data-group/internal \"\"\nMethod GET mgmt/tm/ltm/data-group/internal returned: {\"kind\":\"tm:ltm:data-group:internal:internalcollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal?ver=11.6.0\",\"items\":[{\"kind\":\"tm:ltm:data-group:internal:internalstate\",\"name\":\"aol\",\"partition\":\"Common\",\"fullPath\":\"/Common/aol\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~aol?ver=11.6.0\",\"type\":\"ip\",\"records\":[{\"name\":\"64.12.96.0/19\"},{\"name\":\"195.93.16.0/20\"},{\"name\":\"195.93.48.0/22\"},{\"name\":\"195.93.64.0/19\"},{\"name\":\"195.93.96.0/19\"},{\"name\":\"198.81.0.0/22\"},{\"name\":\"198.81.8.0/23\"},{\"name\":\"198.81.16.0/20\"},{\"name\":\"202.67.65.128/25\"},{\"name\":\"205.188.112.0/20\"},{\"name\":\"205.188.146.144/30\"},{\"name\":\"205.188.192.0/20\"},{\"name\":\"205.188.208.0/23\"},{\"name\":\"207.200.112.0/21\"}]},{\"kind\":\"tm:ltm:data-group:internal:internalstate\",\"name\":\"background_images\",\"partition\":\"Common\",\"fullPath\":\"/Common/background_images\",\"generation\":244,\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~background_images?ver=11.6.0\",\"type\":\"string\",\"records\":[{\"name\":\"...<base64 image>...\"}]},{\"kind\":\"tm:ltm:data-group:internal:internalstate\",\"name\":\"images\",\"partition\":\"Common\",\"fullPath\":\"/Common/images\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~images?ver=11.6.0\",\"type\":\"string\",\"records\":[{\"name\":\".bmp\"},{\"name\":\".gif\"},{\"name\":\".jpg\"}]},{\"kind\":\"tm:ltm:data-group:internal:internalstate\",\"name\":\"private_net\",\"partition\":\"Common\",\"fullPath\":\"/Common/private_net\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~private_net?ver=11.6.0\",\"type\":\"ip\",\"records\":[{\"name\":\"10.0.0.0/8\"},{\"name\":\"172.16.0.0/12\"},{\"name\":\"192.168.0.0/16\"}]}]}\n\n2015-11-12 09:49:30 : Uploading Datagroup ... image for sorry page\nPOST mgmt/tm/ltm/data-group/internal {\"records\": [{\"name\": \"...<base64 image>...\"}], \"type\": \"string\", \"name\": \"sorry_images\"}\nMethod POST mgmt/tm/ltm/data-group/internal returned: {\"kind\":\"tm:ltm:data-group:internal:internalstate\",\"name\":\"sorry_images\",\"fullPath\":\"sorry_images\",\"generation\":245,\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal/sorry_images?ver=11.6.0\",\"type\":\"string\",\"records\":[{\"name\":\"....base 64 image....\"}]}\n\n2015-11-12 09:49:32 : Uploading iRules ... sorry_page_rule\nGET mgmt/tm/ltm/rule \"\"\nMethod GET mgmt/tm/ltm/rule returned: {\"kind\":\"tm:ltm:rule:rulecollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/rule?ver=11.6.0\",\"items\":[<a whole bunch of irules>]}\n\n2015-11-12 09:49:35 : Uploading iRules ... demo_analytics_rule\nGET mgmt/tm/ltm/rule \"\"\nMethod GET mgmt/tm/ltm/rule returned: {\"kind\":\"tm:ltm:rule:rulecollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/rule?ver=11.6.0\",\"items\":[<a whole bunnch of irules>]}\n\n2015-11-12 09:49:38 : Create the ASM policy\nGET mgmt/tm/asm/policies \"\"\nMethod GET mgmt/tm/asm/policies returned: {\"selfLink\":\"https://localhost/mgmt/tm/asm/policies\",\"kind\":\"tm:asm:policies:policycollectionstate\",\"totalItems\":0,\"items\":[]}\n\n2015-11-12 09:49:39 : Create the ASM policy\nPOST mgmt/tm/asm/policies {\"caseInsensitive\": true, \"name\": \"linux_high-Vip1\", \"applicationLanguage\": \"utf-8\"}\n...\n\n2015-11-12 09:49:53 : Import our policy over the one existing above\nPOST mgmt/tm/asm/tasks/import-policy {\"policyReference\": {\"link\": \"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg\"}, \"isBase64\": true, \"file\": \"...<base64 policy file>...\",\"lastUpdateMicros\":1.447350597e+15,\"selfLink\":\"https://localhost/mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law\",\"kind\":\"tm:asm:tasks:import-policy:import-policy-taskstate\",\"policyReference\":{\"link\":\"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg\"},\"startTime\":\"2015-11-12T17:49:57Z\",\"id\":\"hP37L9EM650WeWKkgX7law\"}\n\n2015-11-12 09:50:00 : Determine whether the asm policy import task is complete\nGET mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law \"\"\nMethod GET mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law returned: {\"isBase64\":true,\"status\":\"STARTED\",\"file\":\"...<base64 policy file>...\",\"lastUpdateMicros\":1.447350597e+15,\"selfLink\":\"https://localhost/mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law\",\"kind\":\"tm:asm:tasks:import-policy:import-policy-taskstate\",\"policyReference\":{\"link\":\"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg\"},\"startTime\":\"2015-11-12T17:49:57Z\",\"id\":\"hP37L9EM650WeWKkgX7law\"}\n\n2015-11-12 09:50:05 : Determine whether the asm policy import task is complete\nGET mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law \"\"\nMethod GET mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law returned: {\"isBase64\":true,\"status\":\"COMPLETED\",\"file\":\"...<base64 policy file>...\",\"lastUpdateMicros\":1.447350605e+15,\"selfLink\":\"https://localhost/mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law\",\"kind\":\"tm:asm:tasks:import-policy:import-policy-taskstate\",\"policyReference\":{\"link\":\"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg\"},\"endTime\":\"2015-11-12T17:50:05Z\",\"startTime\":\"2015-11-12T17:49:57Z\",\"id\":\"hP37L9EM650WeWKkgX7law\",\"result\":{\"policyReference\":{\"link\":\"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg\"},\"message\":\"Security policy version information will be ignored, since the file has been modified since it was exported.\\nSignature Set linux-high (previously used in this security policy) was added to this system.\\nThe operation was completed successfully. The security policy name is '/Common/linux_high-Vip1'.\"}}\n\n2015-11-12 09:50:08 : Apply the ASM policy\nPOST mgmt/tm/asm/tasks/apply-policy {\"policyReference\": {\"link\": \"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg\"}}\nMethod POST mgmt/tm/asm/tasks/apply-policy returned: {\"selfLink\":\"https://localhost/mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg\",\"kind\":\"tm:asm:tasks:apply-policy:apply-policy-taskstate\",\"policyReference\":{\"link\":\"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg\"},\"status\":\"NEW\",\"lastUpdateMicros\":1.447350608e+15,\"startTime\":\"2015-11-12T17:50:08Z\",\"id\":\"38B8slfPm1_lBBRG1STNeg\"}\n\n2015-11-12 09:50:10 : Determine whether the asm policy apply task is complete\nGET mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg \"\"\nMethod GET mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg returned: {\"selfLink\":\"https://localhost/mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg\",\"kind\":\"tm:asm:tasks:apply-policy:apply-policy-taskstate\",\"policyReference\":{\"link\":\"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg\"},\"status\":\"STARTED\",\"lastUpdateMicros\":1.447350608e+15,\"startTime\":\"2015-11-12T17:50:08Z\",\"id\":\"38B8slfPm1_lBBRG1STNeg\"}\n\n2015-11-12 09:50:14 : Determine whether the asm policy apply task is complete\nGET mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg \"\"\nMethod GET mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg returned: {\"selfLink\":\"https://localhost/mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg\",\"kind\":\"tm:asm:tasks:apply-policy:apply-policy-taskstate\",\"policyReference\":{\"link\":\"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg\"},\"status\":\"STARTED\",\"lastUpdateMicros\":1.447350608e+15,\"startTime\":\"2015-11-12T17:50:08Z\",\"id\":\"38B8slfPm1_lBBRG1STNeg\"}\n\n2015-11-12 09:50:20 : Create an LTM policy for use with by iApp which associates the ASM policy\nGET mgmt/tm/ltm/policy \"\"\nMethod GET mgmt/tm/ltm/policy returned: {\"kind\":\"tm:ltm:policy:policycollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/policy?ver=11.6.0\",\"items\":[{\"kind\":\"tm:ltm:policy:policystate\",\"name\":\"_sys_CEC_SSL_client_policy\",\"partition\":\"Common\",\"fullPath\":\"/Common/_sys_CEC_SSL_client_policy\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/policy/~Common~_sys_CEC_SSL_client_policy?ver=11.6.0\",\"controls\":[\"classification\"],\"hints\":[\"no-write\",\"no-delete\",\"no-exclusion\"],\"requires\":[\"ssl-persistence\"],\"strategy\":\"/Common/first-match\",\"rulesReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/policy/~Common~_sys_CEC_SSL_client_policy/rules?ver=11.6.0\",\"isSubcollection\":true}},{\"kind\":\"tm:ltm:policy:policystate\",\"name\":\"_sys_CEC_SSL_server_policy\",\"partition\":\"Common\",\"fullPath\":\"/Common/_sys_CEC_SSL_server_policy\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/policy/~Common~_sys_CEC_SSL_server_policy?ver=11.6.0\",\"controls\":[\"classification\"],\"hints\":[\"no-write\",\"no-delete\",\"no-exclusion\"],\"requires\":[\"ssl-persistence\"],\"strategy\":\"/Common/first-match\",\"rulesReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/policy/~Common~_sys_CEC_SSL_server_policy/rules?ver=11.6.0\",\"isSubcollection\":true}},{\"kind\":\"tm:ltm:policy:policystate\",\"name\":\"_sys_CEC_video_policy\",\"partition\":\"Common\",\"fullPath\":\"/Common/_sys_CEC_video_policy\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/policy/~Common~_sys_CEC_video_policy?ver=11.6.0\",\"controls\":[\"classification\"],\"hints\":[\"no-write\",\"no-delete\",\"no-exclusion\"],\"requires\":[\"http\"],\"strategy\":\"/Common/first-match\",\"rulesReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/policy/~Common~_sys_CEC_video_policy/rules?ver=11.6.0\",\"isSubcollection\":true}}]}\n\n2015-11-12 09:50:23 : Create an LTM policy for use with by iApp which associates the ASM policy\nPOST mgmt/tm/ltm/policy {\"name\": \"ltm_policy_w_asm_linux_high-Vip1\", \"rules\": [{\"ordinal\": 1, \"conditions\": [], \"name\": \"rule-1\", \"actions\": [{\"status\": 0, \"enable\": true, \"name\": \"0\", \"request\": true, \"vlanId\": 0, \"code\": 0, \"policy\": \"/Common/linux_high-Vip1\", \"port\": 0, \"asm\": true}]}], \"partition\": \"Common\", \"controls\": [\"asm\"], \"strategy\": \"/Common/first-match\", \"requires\": [\"http\"]}\nMethod POST mgmt/tm/ltm/policy returned: {\"kind\":\"tm:ltm:policy:policystate\",\"name\":\"ltm_policy_w_asm_linux_high-Vip1\",\"partition\":\"Common\",\"fullPath\":\"/Common/ltm_policy_w_asm_linux_high-Vip1\",\"generation\":318,\"selfLink\":\"https://localhost/mgmt/tm/ltm/policy/~Common~ltm_policy_w_asm_linux_high-Vip1?ver=11.6.0\",\"controls\":[\"asm\"],\"requires\":[\"http\"],\"strategy\":\"/Common/first-match\",\"rulesReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/policy/~Common~ltm_policy_w_asm_linux_high-Vip1/rules?ver=11.6.0\",\"isSubcollection\":true}}\n\n2015-11-12 09:50:25 : Deploy the iApp template, since we are not using a default iApp on box\nGET mgmt/tm/sys/application/template \"\"\nMethod GET mgmt/tm/sys/application/template returned: {\"kind\":\"tm:sys:application:template:templatecollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/sys/application/template?ver=11.6.0\",\"items\":[...<list of iApp templates on the box>...]}\n\n2015-11-12 09:50:30 : Deploy the iApp service from the f5 http backport template\nGET mgmt/tm/sys/application/service \"\"\nMethod GET mgmt/tm/sys/application/service returned: {\"kind\":\"tm:sys:application:service:servicecollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/sys/application/service?ver=11.6.0\"}\n\n2015-11-12 09:51:37 : Deploying/updating webserver pool\nGET mgmt/tm/ltm/pool \"\"\nMethod GET mgmt/tm/ltm/pool returned: {\"kind\":\"tm:ltm:pool:poolcollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/pool?ver=11.6.0\",\"items\":[{\"kind\":\"tm:ltm:pool:poolstate\",\"name\":\"Vip1_pool\",\"partition\":\"Common\",\"fullPath\":\"/Common/Vip1_pool\",\"generation\":236,\"selfLink\":\"https://localhost/mgmt/tm/ltm/pool/~Common~Vip1_pool?ver=11.6.0\",\"allowNat\":\"yes\",\"allowSnat\":\"yes\",\"ignorePersistedWeight\":\"disabled\",\"ipTosToClient\":\"pass-through\",\"ipTosToServer\":\"pass-through\",\"linkQosToClient\":\"pass-through\",\"linkQosToServer\":\"pass-through\",\"loadBalancingMode\":\"round-robin\",\"minActiveMembers\":0,\"minUpMembers\":0,\"minUpMembersAction\":\"failover\",\"minUpMembersChecking\":\"disabled\",\"monitor\":\"/Common/http \",\"queueDepthLimit\":0,\"queueOnConnectionLimit\":\"disabled\",\"queueTimeLimit\":0,\"reselectTries\":0,\"serviceDownAction\":\"none\",\"slowRampTime\":10,\"membersReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/pool/~Common~Vip1_pool/members?ver=11.6.0\",\"isSubcollection\":true}},{\"kind\":\"tm:ltm:pool:poolstate\",\"name\":\"syslog_pool\",\"partition\":\"Common\",\"fullPath\":\"/Common/syslog_pool\",\"generation\":239,\"selfLink\":\"https://localhost/mgmt/tm/ltm/pool/~Common~syslog_pool?ver=11.6.0\",\"allowNat\":\"yes\",\"allowSnat\":\"yes\",\"ignorePersistedWeight\":\"disabled\",\"ipTosToClient\":\"pass-through\",\"ipTosToServer\":\"pass-through\",\"linkQosToClient\":\"pass-through\",\"linkQosToServer\":\"pass-through\",\"loadBalancingMode\":\"round-robin\",\"minActiveMembers\":0,\"minUpMembers\":0,\"minUpMembersAction\":\"failover\",\"minUpMembersChecking\":\"disabled\",\"monitor\":\"/Common/tcp \",\"queueDepthLimit\":0,\"queueOnConnectionLimit\":\"disabled\",\"queueTimeLimit\":0,\"reselectTries\":0,\"serviceDownAction\":\"none\",\"slowRampTime\":10,\"membersReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/pool/~Common~syslog_pool/members?ver=11.6.0\",\"isSubcollection\":true}}]}\n\n2015-11-12 09:51:37 : Deploying/updating webserver pool\nPOST mgmt/tm/ltm/pool {\"name\": \"Vip2_pool\", \"members\": [{\"description\": \"Name=/boring_lovelace,ContainerHostname=a0085832ad28,Image=mutzel/all-in-one-hackazon:postinstall\", \"name\": \"172.16.14.87:80\", \"address\": \"172.16.14.87\"}], \"monitor\": \"http\"}\nMethod POST mgmt/tm/ltm/pool returned: {\"kind\":\"tm:ltm:pool:poolstate\",\"name\":\"Vip2_pool\",\"fullPath\":\"Vip2_pool\",\"generation\":352,\"selfLink\":\"https://localhost/mgmt/tm/ltm/pool/Vip2_pool?ver=11.6.0\",\"allowNat\":\"yes\",\"allowSnat\":\"yes\",\"ignorePersistedWeight\":\"disabled\",\"ipTosToClient\":\"pass-through\",\"ipTosToServer\":\"pass-through\",\"linkQosToClient\":\"pass-through\",\"linkQosToServer\":\"pass-through\",\"loadBalancingMode\":\"round-robin\",\"minActiveMembers\":0,\"minUpMembers\":0,\"minUpMembersAction\":\"failover\",\"minUpMembersChecking\":\"disabled\",\"monitor\":\"/Common/http \",\"queueDepthLimit\":0,\"queueOnConnectionLimit\":\"disabled\",\"queueTimeLimit\":0,\"reselectTries\":0,\"serviceDownAction\":\"none\",\"slowRampTime\":10,\"membersReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/pool/~Common~Vip2_pool/members?ver=11.6.0\",\"isSubcollection\":true}}\n\n2015-11-12 09:51:39 : Uploading iRules ... irule_random_snat\nGET mgmt/tm/ltm/rule \"\"\nMethod GET mgmt/tm/ltm/rule returned: {\"kind\":\"tm:ltm:rule:rulecollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/rule?ver=11.6.0\",\"items\":[...<list of irules on the box>...]}\n\n...\n\n2015-11-12 09:51:43 : Setup the HTTP virtual server\nPOST mgmt/tm/ltm/virtual {\"name\": \"Vip2_http\", \"rules\": [\"/Common/irule_random_snat\"], \"translateAddress\": \"enabled\", \"destination\": \"/Common/172.16.13.145:80\", \"mask\": \"255.255.255.255\", \"sourceAddressTranslation\": {\"type\": \"automap\"}, \"profiles\": [{\"name\": \"http\"}, {\"name\": \"tcp-wan-optimized\", \"context\": \"clientside\"}, {\"name\": \"tcp-lan-optimized\", \"context\": \"serverside\"}], \"translatePort\": \"enabled\", \"ipProtocol\": \"tcp\", \"pool\": \"/Common/Vip2_pool\"}\nMethod POST mgmt/tm/ltm/virtual returned: {\"kind\":\"tm:ltm:virtual:virtualstate\",\"name\":\"Vip2_http\",\"fullPath\":\"Vip2_http\",\"generation\":355,\"selfLink\":\"https://localhost/mgmt/tm/ltm/virtual/Vip2_http?ver=11.6.0\",\"addressStatus\":\"yes\",\"autoLasthop\":\"default\",\"cmpEnabled\":\"yes\",\"connectionLimit\":0,\"destination\":\"/Common/172.16.13.145:80\",\"enabled\":true,\"gtmScore\":0,\"ipProtocol\":\"tcp\",\"mask\":\"255.255.255.255\",\"mirror\":\"disabled\",\"mobileAppTunnel\":\"disabled\",\"nat64\":\"disabled\",\"pool\":\"/Common/Vip2_pool\",\"rateLimit\":\"disabled\",\"rateLimitDstMask\":0,\"rateLimitMode\":\"object\",\"rateLimitSrcMask\":0,\"source\":\"0.0.0.0/0\",\"sourceAddressTranslation\":{\"type\":\"automap\"},\"sourcePort\":\"preserve\",\"synCookieStatus\":\"not-activated\",\"translateAddress\":\"enabled\",\"translatePort\":\"enabled\",\"vlansDisabled\":true,\"vsIndex\":4,\"rules\":[\"/Common/irule_random_snat\"],\"policiesReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/virtual/~Common~Vip2_http/policies?ver=11.6.0\",\"isSubcollection\":true},\"profilesReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/virtual/~Common~Vip2_http/profiles?ver=11.6.0\",\"isSubcollection\":true}}\n\n2015-11-12 09:51:45 : Setup the HTTPS virtual server\nPOST mgmt/tm/ltm/virtual {\"name\": \"Vip2_https\", \"rules\": [\"/Common/irule_random_snat\"], \"translateAddress\": \"enabled\", \"destination\": \"/Common/172.16.13.145:443\", \"mask\": \"255.255.255.255\", \"sourceAddressTranslation\": {\"type\": \"automap\"}, \"profiles\": [{\"name\": \"tcp-ssl-wan-optimized\", \"context\": \"clientside\"}, {\"name\": \"tcp-ssl-lan-optimized\", \"context\": \"serverside\"}], \"translatePort\": \"enabled\", \"ipProtocol\": \"tcp\", \"pool\": \"/Common/Vip2_pool\"}\nMethod POST mgmt/tm/ltm/virtual returned: {\"kind\":\"tm:ltm:virtual:virtualstate\",\"name\":\"Vip2_https\",\"fullPath\":\"Vip2_https\",\"generation\":356,\"selfLink\":\"https://localhost/mgmt/tm/ltm/virtual/Vip2_https?ver=11.6.0\",\"addressStatus\":\"yes\",\"autoLasthop\":\"default\",\"cmpEnabled\":\"yes\",\"connectionLimit\":0,\"destination\":\"/Common/172.16.13.145:443\",\"enabled\":true,\"gtmScore\":0,\"ipProtocol\":\"tcp\",\"mask\":\"255.255.255.255\",\"mirror\":\"disabled\",\"mobileAppTunnel\":\"disabled\",\"nat64\":\"disabled\",\"pool\":\"/Common/Vip2_pool\",\"rateLimit\":\"disabled\",\"rateLimitDstMask\":0,\"rateLimitMode\":\"object\",\"rateLimitSrcMask\":0,\"source\":\"0.0.0.0/0\",\"sourceAddressTranslation\":{\"type\":\"automap\"},\"sourcePort\":\"preserve\",\"synCookieStatus\":\"not-activated\",\"translateAddress\":\"enabled\",\"translatePort\":\"enabled\",\"vlansDisabled\":true,\"vsIndex\":5,\"rules\":[\"/Common/irule_random_snat\"],\"policiesReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/virtual/~Common~Vip2_https/policies?ver=11.6.0\",\"isSubcollection\":true},\"profilesReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/virtual/~Common~Vip2_https/profiles?ver=11.6.0\",\"isSubcollection\":true}}\n
\n\n

 

\n\n

Deploying an iApp template using iControlREST

\n\n

Because we recognize that it may be not obvious how we are deploying iApp templates using iControlREST, we break it down into more detail here.

\n\n

First, note that there is no 'import' action we can invoke via REST to import the iApp template which mirrors the action in the Configuration Utility (GUI). This means that we need to create the JSON payload containing the iApp and POST it. 

\n\n

Given an iApp template, like those found on DevCentral, here are the steps to create the JSON body.

\n\n

 

\n\n
  1. On a pre-existing BIG-IP install (or one have created in your build process for your code)\n
    1. Import the iApp template in the Configuration Utility in the 'Common' partition
    2. Do an HTTP GET to retrieve the iApp template payload. Make sure that you use the expandSubcollections=True as a query parameter, as we want to include the stuff in the 'actionsReference' sub-collection.\n
      1. \n
        \ncurl -sku <user>:<password> -X GET  https://<management ip>/mgmt/tm/sys/application/template/~Common~<name of your iApp>?expandSubcollections=true
        \n
      \n
    3. You should get something back that looks like the following (which is the payload for the f5.http backport iApp).  I have truncated the 'implementation', 'presentation' and 'htmlHelp' actions:\n
      1. \n
        \n{\n    \"actionsReference\": {\n        \"isSubcollection\": true,\n        \"items\": [\n            {\n                \"fullPath\": \"definition\",\n                \"generation\": 4672,\n                \"htmlHelp\": \"....\",\n                \"implementation\": \"...\",\n                \"kind\": \"tm:sys:application:template:actions:actionsstate\",\n                \"name\": \"definition\",\n                \"presentation\": \"...\",\n                \"roleAcl\": [\n                    \"admin\",\n                    \"manager\",\n                    \"resource-admin\"\n                ],\n                \"selfLink\": \"https://localhost/mgmt/tm/sys/application/template/~Common~f5.http.backport.1.1.2/actions/definition?ver=11.6.0\"\n            }\n        ],\n        \"link\": \"https://localhost/mgmt/tm/sys/application/template/~Common~f5.http.backport.1.1.2/actions?ver=11.6.0\"\n    },\n    \"fullPath\": \"/Common/f5.http.backport.1.1.2\",\n    \"generation\": 4672,\n    \"ignoreVerification\": \"false\",\n    \"kind\": \"tm:sys:application:template:templatestate\",\n    \"name\": \"f5.http.backport.1.1.2\",\n    \"partition\": \"Common\",\n    \"requiresBigipVersionMin\": \"11.6.0\",\n    \"selfLink\": \"https://localhost/mgmt/tm/sys/application/template/~Common~f5.http.backport.1.1.2?expandSubcollections=true&ver=11.6.0\",\n    \"totalSigningStatus\": \"not-all-signed\",\n    \"verificationStatus\": \"none\"\n}
        \n
      2. Before we can POST this payload back to any BIG-IP, we need to cleanup a few things:\n
        1. Remove any of the extraneous fields including 'verificationStatus', 'totalSigningStatus', 'selfLink', 'partition', 'kind', 'generation', 'fullPath'.
        2. Make a new top-level key in the payload called 'actions'.  The value for this key should everything in the 'items' array under the top-level key 'actionsReference'.  Finally, delete the 'actionsReference' key/value pair from the JSON body. The final JSON payload should look like:\n
          1. \n
            \n{\n  \"actions\": [\n    {\n      \"htmlHelp\": \"....\",\n      \"implementation\": \"...\",\n      \"name\": \"definition\",\n      \"presentation\": \"...\",\n      \"roleAcl\": [\n        \"admin\",\n        \"manager\",\n        \"resource-admin\"\n      ]\n    }\n  ],\n  \"ignoreVerification\": \"false\",\n  \"name\": \"f5.http.backport.1.1.2\",\n  \"requiresBigipVersionMin\": \"11.6.0\",\n  \"totalSigningStatus\": \"not-all-signed\"\n}
            \n
          \n
        \n
      3. Finally, we can use this to deploy an iApp template on BIG-IP.  In the example below, the iApp_template.json file is formatted like the above. I have also attached it to this page for inspection. \n
        1. \n
          \ncurl -sku rest_admin:<obfuscated> -H \"Content-type: application/json\" -X POST -d@./iApp_template.json https://52.23.149.16//mgmt/tm/sys/application/template
          \n
        \n
      \n
    \n
\n\n

Before you go POSTing iApps to any old version of TMOS, be aware that there are still some remaining issues you might have to solve.  Some of the official iApps found on DevCentral are prepended with a TCL library that defines functions used within the iApp.  The iApp solutions team made this design decision so that newer iApps will work against older versions of TMOS.  For example, see the 'F5 HTTP', which starts with the library definition on line 0: \"cli script f5.iapp.1.3.0.cli {....\".  When you export the iApp template to JSON using REST as we have documented above, this library will not be included in the payload. Because newer versions of BIG-IP (11.6) might already include a version of this 'iApp' library, you can work around this issue by updating the function references to use the existing library on-box.  Here are the high-level steps:

\n\n
  1. Downloading the iApp from DevCentral
  2. Change the function references to leverage the library that is installed on your BIG-IP.  See an example of this by comparing the F5 HTTP template on the codeshare with the one attached to this page. \n
    1. You'll probably have to do some \"find and replace\" like the following:
    2. \n
      \nf5.iapp.1.3.0.cli:iapp_get_provisioned -> iapp::get_provisioned
      \n
    3. There may be some references to functions that do not exist yet.  These will have to be dealt with on a case-by-case basis. 
    \n
  3. Uploading the iApp to BIG-IP and exporting we documented above.  
\n\n

Deploying an iApp service using iControlREST

\n\n

Fortunately, using iControlREST to manage instances of iApps (also known as iApp services) is much easier than managing templates.  The high-level steps are similar: 

\n\n
  1. Deploy an iApp service via the Configuration Utility.
  2. Do an HTTP GET to acquire the JSON representation (notice the URL formatting!).\n
    1. \n
      \ncurl -sku <user>:<password> -X GET https://<management ip>/mgmt/tm/sys/application/service/~Common~<your iapp name>.app~<your iapp name> 
      \n
    \n
  3. Depending on the variables presented by the iApp template, the JSON payload for the iApp service might look something like:\n
    1. \n
      \n {\n    \"deviceGroup\": \"none\",\n    \"fullPath\": \"/Common/Vip1_iApp.app/Vip1_iApp\",\n    \"generation\": 4674,\n    \"inheritedDevicegroup\": \"true\",\n    \"inheritedTrafficGroup\": \"true\",\n    \"kind\": \"tm:sys:application:service:servicestate\",\n    \"lists\": [\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"irules__irules\",\n            \"value\": [\n                \"/Common/irule_demo_analytics\",\n                \"/Common/irule_sorry_page\"\n            ]\n        }\n    ],\n    \"name\": \"Vip1_iApp\",\n    \"partition\": \"Common\",\n    \"selfLink\": \"https://localhost/mgmt/tm/sys/application/service/~Common~Vip1_iApp.app~Vip1_iApp?ver=11.6.0\",\n    \"strictUpdates\": \"enabled\",\n    \"subPath\": \"Vip1_iApp.app\",\n    \"tables\": [\n        {\n            \"name\": \"basic__snatpool_members\"\n        },\n        {\n            \"name\": \"net__snatpool_members\"\n        },\n        {\n            \"name\": \"optimizations__hosts\"\n        },\n        {\n            \"columnNames\": [\n                \"name\"\n            ],\n            \"name\": \"pool__hosts\",\n            \"rows\": [\n                {\n                    \"row\": [\n                        \"demo.example.com\"\n                    ]\n                }\n            ]\n        },\n        {\n            \"name\": \"pool__members\"\n        },\n        {\n            \"name\": \"server_pools__servers\"\n        }\n    ],\n    \"template\": \"/Common/f5.http.backport.1.1.2\",\n    \"templateModified\": \"yes\",\n    \"trafficGroup\": \"/Common/traffic-group-1\",\n    \"variables\": [\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"asm__security_logging\",\n            \"value\": \"asm_log_to_splunk\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"asm__use_asm\",\n            \"value\": \"/Common/ltm_policy_w_asm_linux_high-Vip1\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"client__http_compression\",\n            \"value\": \"/#do_not_use#\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"client__standard_caching_without_wa\",\n            \"value\": \"/#do_not_use#\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"client__tcp_wan_opt\",\n            \"value\": \"/Common/tcp-ssl-wan-optimized\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"net__client_mode\",\n            \"value\": \"wan\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"net__route_to_bigip\",\n            \"value\": \"no\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"net__same_subnet\",\n            \"value\": \"no\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"net__server_mode\",\n            \"value\": \"lan\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"net__snat_type\",\n            \"value\": \"automap\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"net__vlan_mode\",\n            \"value\": \"all\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"pool__addr\",\n            \"value\": \"172.16.13.128\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"pool__http\",\n            \"value\": \"/#create_new#\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"pool__mask\",\n            \"value\": \"none\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"pool__persist\",\n            \"value\": \"/#cookie#\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"pool__pool_to_use\",\n            \"value\": \"/Common/Vip1_pool\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"pool__port_secure\",\n            \"value\": \"443\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"pool__redirect_port\",\n            \"value\": \"80\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"pool__redirect_to_https\",\n            \"value\": \"yes\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"pool__xff\",\n            \"value\": \"yes\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"server__oneconnect\",\n            \"value\": \"/#do_not_use#\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"server__tcp_lan_opt\",\n            \"value\": \"/Common/tcp-wan-optimized\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"server__tcp_req_queueing\",\n            \"value\": \"no\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"ssl__cert\",\n            \"value\": \"/Common/default.crt\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"ssl__client_ssl_profile\",\n            \"value\": \"/#create_new#\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"ssl__key\",\n            \"value\": \"/Common/default.key\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"ssl__mode\",\n            \"value\": \"client_ssl\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"ssl__use_chain_cert\",\n            \"value\": \"/#do_not_use#\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"ssl_encryption_questions__advanced\",\n            \"value\": \"yes\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"ssl_encryption_questions__help\",\n            \"value\": \"hide\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"stats__analytics\",\n            \"value\": \"/Common/Vip1-demo_analytics\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"stats__request_logging\",\n            \"value\": \"/#do_not_use#\"\n        }\n    ]\n}
      \n
    \n
  4. As ealier, remove some of the fields that don't make sense to re-post. This includes 'deviceGroup', 'fullPath', 'generation', 'kind', 'partition', 'selfLink', and 'subPath'.
  5. You can now use this JSON body with updates to the variable values as needed.  
\n\n

Example python code for deploying iApp Templates

\n\n

In addition to the above procedures, we'd like you point you to some python examples which show how to push iApp templates using REST. Hitesh Patel, another monster F5er, has put together the following code:

\n\n

https://github.com/0xHiteshPatel/appsvcs_integration_iapp/tree/80cc40dcf85e352a25c7ec44d9e4dcc253e51e69/scripts

\n\n

In his words: \"that's 152 lines of awesome right there\".

\n\n

His examples run against 11.5.x, 11.6.x and 12.0. 

\n\n

Debugging

\n\n

When trying to create or update an instance of an iApp via REST, you will get error messages in the HTTP response if your POST is unsuccessful.  In addition to the HTTP payload in the response, the following debug steps can be helpful:

\n\n

1) Set the scriptd log level to debug:

\n\n
\nmodify sys scriptd log-level debug
\n\n

2) Look at the TMSH output from the iApp printed to /var/log/scriptd.out.  Typically the last line will show the error that has occured. 

\n\n

In closing

\n\n

The above examples should bring you one step closer to automating the delivery of advanced network services for your applications.  We're looking forward to doing future posts on how to automate your deployment.  Finally, if you haven't checked out the Application Services Integration iApp, also by Hitesh, you should probably do so now: https://github.com/0xHiteshPatel/appsvcs_integration_iapp.

\n\n

Cheers!

","body@stringLength":"63314","rawBody":"

In a previous article, I highlighted a proof-of-concept where we fully automated the deployment of BIG-IP in AWS using the web interfaces of BIG-IP inconjunction with Ansible.  The goal of this article is to focus in more detail on the use of iControlREST within that project, in order to show how it can be extremely useful for automating various aspects of your ITOM workflows.

\n\n

There are four main workflows we execute in order to configure BIG-IP in AWS and to deploy services.  This breakown is provided below.  

\n\n\n\n

For now, we avoid the discussion about which configuration elements are part of the infrastructure deployment or the application deployment.  This is an important discussion, but one that can only take place after we understand how to provision the elements that will be a part of either workflow. 

\n\n

For each of these workflows, we have provided the log output which shows REST calls and responses.  To gain from these examples, it is important to understand the following:

\n\n\n\n

Basic system configuration

\n\n\n\n
\n2015-11-12 09:46:03 : Disabling Setup Utility in GUI\nGET mgmt/tm/sys/db \"\"\n2015-11-12 09:46:10 : Disabling Setup Utility in GUI\nGET mgmt/tm/sys/db \"\"\n2015-11-12 09:46:17 : Disabling Setup Utility in GUI\nGET mgmt/tm/sys/db \"\"\nMethod GET mgmt/tm/sys/db returned: {\"kind\":\"tm:sys:db:dbcollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/sys/db?ver=11.6.0\",\"items\":[....<a whole bunch of database variables>...]}\n\n2015-11-12 09:46:19 : Disabling Setup Utility in GUI\nPATCH mgmt/tm/sys/db/setup.run?ver=11.6.0 {\"value\": \"false\"}\nMethod PATCH mgmt/tm/sys/db/setup.run?ver=11.6.0 returned: {\"kind\":\"tm:sys:db:dbstate\",\"name\":\"setup.run\",\"fullPath\":\"setup.run\",\"generation\":62,\"selfLink\":\"https://localhost/mgmt/tm/sys/db/setup.run?ver=11.6.0\",\"defaultValue\":\"true\",\"scfConfig\":\"false\",\"value\":\"false\",\"valueRange\":\"false true\"}\n\n2015-11-12 09:46:22 : Configuring NTP servers\nPATCH mgmt/tm/sys/ntp {\"timezone\": \"America/Los_Angeles\", \"servers\": [\"0.pool.ntp.org\", \"1.pool.ntp.org\"]}\nMethod PATCH mgmt/tm/sys/ntp returned: {\"kind\":\"tm:sys:ntp:ntpstate\",\"selfLink\":\"https://localhost/mgmt/tm/sys/ntp?ver=11.6.0\",\"servers\":[\"0.pool.ntp.org\",\"1.pool.ntp.org\"],\"timezone\":\"America/Los_Angeles\",\"restrictReference\":{\"link\":\"https://localhost/mgmt/tm/sys/ntp/restrict?ver=11.6.0\",\"isSubcollection\":true}}\n\n2015-11-12 09:46:25 : Configuring syslog logging destinations\nPATCH mgmt/tm/sys/syslog {\"include\": \"destination loghost { udp( 10.0.3.32 port (514));};\"}\nMethod PATCH mgmt/tm/sys/syslog returned: {\"kind\":\"tm:sys:syslog:syslogstate\",\"selfLink\":\"https://localhost/mgmt/tm/sys/syslog?ver=11.6.0\",\"authPrivFrom\":\"notice\",\"authPrivTo\":\"emerg\",\"consoleLog\":\"enabled\",\"cronFrom\":\"warning\",\"cronTo\":\"emerg\",\"daemonFrom\":\"notice\",\"daemonTo\":\"emerg\",\"include\":\"destination loghost { udp( 10.0.3.32 port (514));};\",\"isoDate\":\"disabled\",\"kernFrom\":\"debug\",\"kernTo\":\"emerg\",\"local6From\":\"notice\",\"local6To\":\"emerg\",\"mailFrom\":\"notice\",\"mailTo\":\"emerg\",\"messagesFrom\":\"notice\",\"messagesTo\":\"warning\",\"userLogFrom\":\"notice\",\"userLogTo\":\"emerg\"}\n\n2015-11-12 09:46:28 : Configuring HTTP mgmt access\nPATCH mgmt/tm/sys/httpd {\"allow\": [\"ALL\"]}\nMethod PATCH mgmt/tm/sys/httpd returned: {\"kind\":\"tm:sys:httpd:httpdstate\",\"selfLink\":\"https://localhost/mgmt/tm/sys/httpd?ver=11.6.0\",\"allow\":[\"ALL\"],\"authName\":\"BIG-IP\",\"authPamDashboardTimeout\":\"off\",\"authPamIdleTimeout\":1200,\"authPamValidateIp\":\"on\",\"fastcgiTimeout\":300,\"hostnameLookup\":\"off\",\"logLevel\":\"warn\",\"maxClients\":10,\"redirectHttpToHttps\":\"disabled\",\"requestBodyMaxTimeout\":0,\"requestBodyMinRate\":500,\"requestBodyTimeout\":60,\"requestHeaderMaxTimeout\":40,\"requestHeaderMinRate\":500,\"requestHeaderTimeout\":20,\"sslCertfile\":\"/etc/httpd/conf/ssl.crt/server.crt\",\"sslCertkeyfile\":\"/etc/httpd/conf/ssl.key/server.key\",\"sslCiphersuite\":\"DEFAULT:!aNULL:!eNULL:!LOW:!RC4:!MD5:!EXP\",\"sslOcspDefaultResponder\":\"http://127.0.0.1\",\"sslOcspEnable\":\"off\",\"sslOcspOverrideResponder\":\"off\",\"sslOcspResponderTimeout\":300,\"sslOcspResponseMaxAge\":-1,\"sslOcspResponseTimeSkew\":300,\"sslProtocol\":\"all -SSLv2 -SSLv3\",\"sslVerifyClient\":\"no\",\"sslVerifyDepth\":10}\n\n2015-11-12 09:46:31 : Configuring SSH mgmt access\nPATCH mgmt/tm/sys/sshd {\"allow\": [\"ALL\"]}\nMethod PATCH mgmt/tm/sys/sshd returned: {\"kind\":\"tm:sys:sshd:sshdstate\",\"selfLink\":\"https://localhost/mgmt/tm/sys/sshd?ver=11.6.0\",\"allow\":[\"ALL\"],\"banner\":\"disabled\",\"inactivityTimeout\":0,\"logLevel\":\"info\",\"login\":\"enabled\"}\n\n2015-11-12 09:46:33 : Configuring SNMP access\nPATCH mgmt/tm/sys/snmp {\"allowedAddresses\": [\"172.16.0.0/16\"]}\nMethod PATCH mgmt/tm/sys/snmp returned: {\"kind\":\"tm:sys:snmp:snmpstate\",\"selfLink\":\"https://localhost/mgmt/tm/sys/snmp?ver=11.6.0\",\"agentAddresses\":[\"tcp6:161\",\"udp6:161\"],\"agentTrap\":\"enabled\",\"allowedAddresses\":[\"172.16.0.0/16\"],\"authTrap\":\"disabled\",\"bigipTraps\":\"enabled\",\"l2forwardVlan\":\"none\",\"loadMax1\":12,\"loadMax15\":12,\"loadMax5\":12,\"sysContact\":\"Customer Name <admin@customer.com>\",\"sysLocation\":\"Network Closet 1\",\"sysServices\":78,\"trapCommunity\":\"public\",\"trapSource\":\"none\",\"communitiesReference\":{\"link\":\"https://localhost/mgmt/tm/sys/snmp/communities?ver=11.6.0\",\"isSubcollection\":true},\"diskMonitors\":[{\"name\":\"root\",\"partition\":\"Common\",\"minspace\":2000,\"minspaceType\":\"size\",\"path\":\"/\"},{\"name\":\"var\",\"partition\":\"Common\",\"minspace\":10000,\"minspaceType\":\"size\",\"path\":\"/var\"}],\"processMonitors\":[{\"name\":\"bigd\",\"partition\":\"Common\",\"maxProcesses\":\"1\",\"minProcesses\":1,\"process\":\"bigd\"},{\"name\":\"chmand\",\"partition\":\"Common\",\"maxProcesses\":\"1\",\"minProcesses\":1,\"process\":\"chmand\"},{\"name\":\"httpd\",\"partition\":\"Common\",\"maxProcesses\":\"infinity\",\"minProcesses\":1,\"process\":\"httpd\"},{\"name\":\"mcpd\",\"partition\":\"Common\",\"maxProcesses\":\"1\",\"minProcesses\":1,\"process\":\"mcpd\"},{\"name\":\"sod\",\"partition\":\"Common\",\"maxProcesses\":\"1\",\"minProcesses\":1,\"process\":\"sod\"},{\"name\":\"tmm\",\"partition\":\"Common\",\"maxProcesses\":\"infinity\",\"minProcesses\":1,\"process\":\"tmm\"}],\"trapsReference\":{\"link\":\"https://localhost/mgmt/tm/sys/snmp/traps?ver=11.6.0\",\"isSubcollection\":true},\"usersReference\":{\"link\":\"https://localhost/mgmt/tm/sys/snmp/users?ver=11.6.0\",\"isSubcollection\":true}}\n\n2015-11-12 09:46:36 : Configuring FastL4 profiles ... fastL4-route-friendly\nGET mgmt/tm/ltm/profile/fastl4 \"\"\nMethod GET mgmt/tm/ltm/profile/fastl4 returned: {\"kind\":\"tm:ltm:profile:fastl4:fastl4collectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/profile/fastl4?ver=11.6.0\",\"items\":[{\"kind\":\"tm:ltm:profile:fastl4:fastl4state\",\"name\":\"fastL4\",\"partition\":\"Common\",\"fullPath\":\"/Common/fastL4\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/profile/fastl4/~Common~fastL4?ver=11.6.0\",\"clientTimeout\":30,\"explicitFlowMigration\":\"disabled\",\"hardwareSynCookie\":\"enabled\",\"idleTimeout\":\"300\",\"ipTosToClient\":\"pass-through\",\"ipTosToServer\":\"pass-through\",\"keepAliveInterval\":\"disabled\",\"lateBinding\":\"disabled\",\"linkQosToClient\":\"pass-through\",\"linkQosToServer\":\"pass-through\",\"looseClose\":\"disabled\",\"looseInitialization\":\"disabled\",\"mssOverride\":0,\"priorityToClient\":\"pass-through\",\"priorityToServer\":\"pass-through\",\"pvaAcceleration\":\"full\",\"pvaDynamicClientPackets\":1,\"pvaDynamicServerPackets\":0,\"pvaFlowAging\":\"enabled\",\"pvaFlowEvict\":\"enabled\",\"pvaOffloadDynamic\":\"enabled\",\"pvaOffloadState\":\"embryonic\",\"reassembleFragments\":\"disabled\",\"receiveWindowSize\":0,\"resetOnTimeout\":\"enabled\",\"rttFromClient\":\"disabled\",\"rttFromServer\":\"disabled\",\"serverSack\":\"disabled\",\"serverTimestamp\":\"disabled\",\"softwareSynCookie\":\"disabled\",\"synCookieWhitelist\":\"disabled\",\"tcpCloseTimeout\":\"5\",\"tcpGenerateIsn\":\"disabled\",\"tcpHandshakeTimeout\":\"5\",\"tcpStripSack\":\"disabled\",\"tcpTimestampMode\":\"preserve\",\"tcpWscaleMode\":\"preserve\",\"timeoutRecovery\":\"disconnect\"}]}\n\n2015-11-12 09:46:37 : Configuring FastL4 profiles ... fastL4-route-friendly\nPOST mgmt/tm/ltm/profile/fastl4 {\"looseClose\": \"enabled\", \"resetOnTimeout\": \"disabled\", \"name\": \"fastL4-route-friendly\", \"looseInitialization\": \"enabled\"}\nMethod POST mgmt/tm/ltm/profile/fastl4 returned: {\"kind\":\"tm:ltm:profile:fastl4:fastl4state\",\"name\":\"fastL4-route-friendly\",\"fullPath\":\"fastL4-route-friendly\",\"generation\":68,\"selfLink\":\"https://localhost/mgmt/tm/ltm/profile/fastl4/fastL4-route-friendly?ver=11.6.0\",\"clientTimeout\":30,\"defaultsFrom\":\"/Common/fastL4\",\"explicitFlowMigration\":\"disabled\",\"hardwareSynCookie\":\"enabled\",\"idleTimeout\":\"300\",\"ipTosToClient\":\"pass-through\",\"ipTosToServer\":\"pass-through\",\"keepAliveInterval\":\"disabled\",\"lateBinding\":\"disabled\",\"linkQosToClient\":\"pass-through\",\"linkQosToServer\":\"pass-through\",\"looseClose\":\"enabled\",\"looseInitialization\":\"enabled\",\"mssOverride\":0,\"priorityToClient\":\"pass-through\",\"priorityToServer\":\"pass-through\",\"pvaAcceleration\":\"full\",\"pvaDynamicClientPackets\":1,\"pvaDynamicServerPackets\":0,\"pvaFlowAging\":\"enabled\",\"pvaFlowEvict\":\"enabled\",\"pvaOffloadDynamic\":\"enabled\",\"pvaOffloadState\":\"embryonic\",\"reassembleFragments\":\"disabled\",\"receiveWindowSize\":0,\"resetOnTimeout\":\"disabled\",\"rttFromClient\":\"disabled\",\"rttFromServer\":\"disabled\",\"serverSack\":\"disabled\",\"serverTimestamp\":\"disabled\",\"softwareSynCookie\":\"disabled\",\"synCookieWhitelist\":\"disabled\",\"tcpCloseTimeout\":\"5\",\"tcpGenerateIsn\":\"disabled\",\"tcpHandshakeTimeout\":\"5\",\"tcpStripSack\":\"disabled\",\"tcpTimestampMode\":\"preserve\",\"tcpWscaleMode\":\"preserve\",\"timeoutRecovery\":\"disconnect\"}\n\n...\n\n2015-11-12 09:46:44 :\nPATCH mgmt/tm/sys/provision/asm {\"level\": \"nominal\"}\nMethod PATCH mgmt/tm/sys/provision/asm returned: {\"kind\":\"tm:sys:provision:provisionstate\",\"name\":\"asm\",\"fullPath\":\"asm\",\"generation\":71,\"selfLink\":\"https://localhost/mgmt/tm/sys/provision/asm?ver=11.6.0\",\"cpuRatio\":0,\"diskRatio\":0,\"level\":\"nominal\",\"memoryRatio\":0}\n\n2015-11-12 09:47:18 :\nPATCH mgmt/tm/sys/provision/avr {\"level\": \"nominal\"}\nMethod PATCH mgmt/tm/sys/provision/avr returned: {\"kind\":\"tm:sys:provision:provisionstate\",\"name\":\"avr\",\"fullPath\":\"avr\",\"generation\":114,\"selfLink\":\"https://localhost/mgmt/tm/sys/provision/avr?ver=11.6.0\",\"cpuRatio\":0,\"diskRatio\":0,\"level\":\"nominal\",\"memoryRatio\":0}
\n\n

AWS-specific System Configuration

\n\n\n\n
\n2015-11-12 09:48:12 : Adding/updating AWS access and secret keys\nPATCH mgmt/tm/sys/global-settings {\"awsAccessKey\": \"...<my access key>...\", \"awsSecretKey\": \"...<my secret key>...\"}\nMethod PATCH mgmt/tm/sys/global-settings returned: {\"kind\":\"tm:sys:global-settings:global-settingsstate\",\"selfLink\":\"https://localhost/mgmt/tm/sys/global-settings?ver=11.6.0\",\"awsAccessKey\":\"...<my access key>...\",\"awsApiMaxConcurrency\":1,\"awsSecretKey\":\"...<my secret key>...\",\"consoleInactivityTimeout\":0,\"customAddr\":\"none\",\"failsafeAction\":\"go-offline-restart-tm\",\"fileLocalPathPrefix\":\"{/shared/} {/tmp/}\",\"guiSecurityBanner\":\"enabled\",\"guiSecurityBannerText\":\"Welcome to the BIG-IP Configuration Utility.\\n\\nLog in with your username and password using the fields on the left.\",\"guiSetup\":\"disabled\",\"hostAddrMode\":\"management\",\"hostname\":\"ip-172-16-11-77.ec2.internal\",\"lcdDisplay\":\"enabled\",\"mgmtDhcp\":\"enabled\",\"netReboot\":\"disabled\",\"passwordPrompt\":\"Password\",\"quietBoot\":\"enabled\",\"usernamePrompt\":\"Username\"}\n
\n\n

Network Attachment

\n\n\n\n
\n2015-11-12 09:48:15 : Disabling dhcp\nPATCH mgmt/tm/sys/db/dhclient.mgmt {\"value\": \"disable\"}\nMethod PATCH mgmt/tm/sys/db/dhclient.mgmt returned: {\"kind\":\"tm:sys:db:dbstate\",\"name\":\"dhclient.mgmt\",\"fullPath\":\"dhclient.mgmt\",\"generation\":154,\"selfLink\":\"https://localhost/mgmt/tm/sys/db/dhclient.mgmt?ver=11.6.0\",\"defaultValue\":\"disable\",\"scfConfig\":\"true\",\"value\":\"disable\",\"valueRange\":\"disable enable\"}\n\n2015-11-12 09:48:18 : Adding/updating internal vlan\nGET mgmt/tm/net/vlan \"\"\nMethod GET mgmt/tm/net/vlan returned: {\"kind\":\"tm:net:vlan:vlancollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/net/vlan?ver=11.6.0\"}\n\n2015-11-12 09:48:19 : Adding/updating internal vlan\nPOST mgmt/tm/net/vlan {\"interfaces\": \"1.2\", \"name\": \"private\"}\nMethod POST mgmt/tm/net/vlan returned: {\"kind\":\"tm:net:vlan:vlanstate\",\"name\":\"private\",\"fullPath\":\"private\",\"generation\":167,\"selfLink\":\"https://localhost/mgmt/tm/net/vlan/private?ver=11.6.0\",\"autoLasthop\":\"default\",\"cmpHash\":\"default\",\"dagRoundRobin\":\"disabled\",\"dagTunnel\":\"outer\",\"failsafe\":\"disabled\",\"failsafeAction\":\"failover-restart-tm\",\"failsafeTimeout\":90,\"ifIndex\":80,\"learning\":\"enable-forward\",\"mtu\":1500,\"sflow\":{\"pollInterval\":0,\"pollIntervalGlobal\":\"yes\",\"samplingRate\":0,\"samplingRateGlobal\":\"yes\"},\"sourceChecking\":\"disabled\",\"tag\":4094,\"interfacesReference\":{\"link\":\"https://localhost/mgmt/tm/net/vlan/~Common~private/interfaces?ver=11.6.0\",\"isSubcollection\":true}}\n\n2015-11-12 09:48:21 : Adding/updating external vlan\nGET mgmt/tm/net/vlan \"\"\nMethod GET mgmt/tm/net/vlan returned: {\"kind\":\"tm:net:vlan:vlancollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/net/vlan?ver=11.6.0\",\"items\":[{\"kind\":\"tm:net:vlan:vlanstate\",\"name\":\"private\",\"partition\":\"Common\",\"fullPath\":\"/Common/private\",\"generation\":167,\"selfLink\":\"https://localhost/mgmt/tm/net/vlan/~Common~private?ver=11.6.0\",\"autoLasthop\":\"default\",\"cmpHash\":\"default\",\"dagRoundRobin\":\"disabled\",\"dagTunnel\":\"outer\",\"failsafe\":\"disabled\",\"failsafeAction\":\"failover-restart-tm\",\"failsafeTimeout\":90,\"ifIndex\":80,\"learning\":\"enable-forward\",\"mtu\":1500,\"sflow\":{\"pollInterval\":0,\"pollIntervalGlobal\":\"yes\",\"samplingRate\":0,\"samplingRateGlobal\":\"yes\"},\"sourceChecking\":\"disabled\",\"tag\":4094,\"interfacesReference\":{\"link\":\"https://localhost/mgmt/tm/net/vlan/~Common~private/interfaces?ver=11.6.0\",\"isSubcollection\":true}}]}\n\n...\n\n2015-11-12 09:48:24 : Adding/updating internal selfip\nGET mgmt/tm/net/self \"\"\nMethod GET mgmt/tm/net/self returned: {\"kind\":\"tm:net:self:selfcollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/net/self?ver=11.6.0\"}\n\n2015-11-12 09:48:24 : Adding/updating internal selfip\nPOST mgmt/tm/net/self {\"allowService\": \"default\", \"vlan\": \"private\", \"trafficGroup\": \"traffic-group-local-only\", \"name\": \"private\", \"address\": \"172.16.12.44/24\"}\nMethod POST mgmt/tm/net/self returned: {\"kind\":\"tm:net:self:selfstate\",\"name\":\"private\",\"fullPath\":\"private\",\"generation\":177,\"selfLink\":\"https://localhost/mgmt/tm/net/self/private?ver=11.6.0\",\"address\":\"172.16.12.44/24\",\"floating\":\"disabled\",\"inheritedTrafficGroup\":\"false\",\"trafficGroup\":\"/Common/traffic-group-local-only\",\"unit\":0,\"vlan\":\"/Common/private\",\"allowService\":[\"default\"]}\n\n2015-11-12 09:48:26 : Adding/updating external selfip\nGET mgmt/tm/net/self \"\"\nMethod GET mgmt/tm/net/self returned: {\"kind\":\"tm:net:self:selfcollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/net/self?ver=11.6.0\",\"items\":[{\"kind\":\"tm:net:self:selfstate\",\"name\":\"private\",\"partition\":\"Common\",\"fullPath\":\"/Common/private\",\"generation\":177,\"selfLink\":\"https://localhost/mgmt/tm/net/self/~Common~private?ver=11.6.0\",\"address\":\"172.16.12.44/24\",\"floating\":\"disabled\",\"inheritedTrafficGroup\":\"false\",\"trafficGroup\":\"/Common/traffic-group-local-only\",\"unit\":0,\"vlan\":\"/Common/private\",\"allowService\":[\"default\"]}]}\n\n2015-11-12 09:48:27 : Adding/updating external selfip\nPOST mgmt/tm/net/self {\"allowService\": [\"tcp:4353\"], \"vlan\": \"public\", \"trafficGroup\": \"traffic-group-local-only\", \"name\": \"public\", \"address\": \"172.16.13.83/24\"}\nMethod POST mgmt/tm/net/self returned: {\"kind\":\"tm:net:self:selfstate\",\"name\":\"public\",\"fullPath\":\"public\",\"generation\":178,\"selfLink\":\"https://localhost/mgmt/tm/net/self/public?ver=11.6.0\",\"address\":\"172.16.13.83/24\",\"floating\":\"disabled\",\"inheritedTrafficGroup\":\"false\",\"trafficGroup\":\"/Common/traffic-group-local-only\",\"unit\":0,\"vlan\":\"/Common/public\",\"allowService\":[\"tcp:4353\"]}\n\n2015-11-12 09:48:29 : Setting default route using default_gateway or gateway_pool\nGET /mgmt/tm/net/route \"\"\nMethod GET /mgmt/tm/net/route returned: {\"kind\":\"tm:net:route:routecollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/net/route?ver=11.6.0\"}\n\n2015-11-12 09:48:29 : Setting default route using default_gateway or gateway_pool\nPOST /mgmt/tm/net/route {\"gw\": \"172.16.13.1\", \"name\": \"default_route\", \"network\": \"default\"}\nMethod POST /mgmt/tm/net/route returned: {\"kind\":\"tm:net:route:routestate\",\"name\":\"default_route\",\"fullPath\":\"default_route\",\"generation\":0,\"selfLink\":\"https://localhost/mgmt/tm/net/route/default_route?ver=11.6.0\"}
\n\n

Application Service Provisioning

\n\n

This workflow is where things really get interesting.  Let's break it down.

\n\n\n\n
\n2015-11-12 09:49:13 : Deploying/updating Webserver Pool\nGET mgmt/tm/ltm/pool \"\"\nMethod GET mgmt/tm/ltm/pool returned: {\"kind\":\"tm:ltm:pool:poolcollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/pool?ver=11.6.0\"}\n\n2015-11-12 09:49:14 : Deploying/updating Webserver Pool\nPOST mgmt/tm/ltm/pool {\"name\": \"Vip1_pool\", \"members\": [{\"description\": \"Name=/boring_lovelace,ContainerHostname=a0085832ad28,Image=mutzel/all-in-one-hackazon:postinstall\", \"name\": \"172.16.14.87:80\", \"address\": \"172.16.14.87\"}], \"monitor\": \"http\"}\nMethod POST mgmt/tm/ltm/pool returned: {\"kind\":\"tm:ltm:pool:poolstate\",\"name\":\"Vip1_pool\",\"fullPath\":\"Vip1_pool\",\"generation\":236,\"selfLink\":\"https://localhost/mgmt/tm/ltm/pool/Vip1_pool?ver=11.6.0\",\"allowNat\":\"yes\",\"allowSnat\":\"yes\",\"ignorePersistedWeight\":\"disabled\",\"ipTosToClient\":\"pass-through\",\"ipTosToServer\":\"pass-through\",\"linkQosToClient\":\"pass-through\",\"linkQosToServer\":\"pass-through\",\"loadBalancingMode\":\"round-robin\",\"minActiveMembers\":0,\"minUpMembers\":0,\"minUpMembersAction\":\"failover\",\"minUpMembersChecking\":\"disabled\",\"monitor\":\"/Common/http \",\"queueDepthLimit\":0,\"queueOnConnectionLimit\":\"disabled\",\"queueTimeLimit\":0,\"reselectTries\":0,\"serviceDownAction\":\"none\",\"slowRampTime\":10,\"membersReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/pool/~Common~Vip1_pool/members?ver=11.6.0\",\"isSubcollection\":true}}\n\n2015-11-12 09:49:18 : Deploying/updating High Speed Logging pool to send to Analytics Server\nGET mgmt/tm/ltm/pool \"\"\nMethod GET mgmt/tm/ltm/pool returned: {\"kind\":\"tm:ltm:pool:poolcollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/pool?ver=11.6.0\",\"items\":[{\"kind\":\"tm:ltm:pool:poolstate\",\"name\":\"Vip1_pool\",\"partition\":\"Common\",\"fullPath\":\"/Common/Vip1_pool\",\"generation\":236,\"selfLink\":\"https://localhost/mgmt/tm/ltm/pool/~Common~Vip1_pool?ver=11.6.0\",\"allowNat\":\"yes\",\"allowSnat\":\"yes\",\"ignorePersistedWeight\":\"disabled\",\"ipTosToClient\":\"pass-through\",\"ipTosToServer\":\"pass-through\",\"linkQosToClient\":\"pass-through\",\"linkQosToServer\":\"pass-through\",\"loadBalancingMode\":\"round-robin\",\"minActiveMembers\":0,\"minUpMembers\":0,\"minUpMembersAction\":\"failover\",\"minUpMembersChecking\":\"disabled\",\"monitor\":\"/Common/http \",\"queueDepthLimit\":0,\"queueOnConnectionLimit\":\"disabled\",\"queueTimeLimit\":0,\"reselectTries\":0,\"serviceDownAction\":\"none\",\"slowRampTime\":10,\"membersReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/pool/~Common~Vip1_pool/members?ver=11.6.0\",\"isSubcollection\":true}}]}\n\n2015-11-12 09:49:19 : Deploying/updating High Speed Logging pool to send to Analytics Server\nPOST mgmt/tm/ltm/pool {\"name\": \"syslog_pool\", \"members\": [{\"name\": \"172.16.14.180:514\", \"address\": \"172.16.14.180\"}], \"monitor\": \"tcp\"}\nMethod POST mgmt/tm/ltm/pool returned: {\"kind\":\"tm:ltm:pool:poolstate\",\"name\":\"syslog_pool\",\"fullPath\":\"syslog_pool\",\"generation\":239,\"selfLink\":\"https://localhost/mgmt/tm/ltm/pool/syslog_pool?ver=11.6.0\",\"allowNat\":\"yes\",\"allowSnat\":\"yes\",\"ignorePersistedWeight\":\"disabled\",\"ipTosToClient\":\"pass-through\",\"ipTosToServer\":\"pass-through\",\"linkQosToClient\":\"pass-through\",\"linkQosToServer\":\"pass-through\",\"loadBalancingMode\":\"round-robin\",\"minActiveMembers\":0,\"minUpMembers\":0,\"minUpMembersAction\":\"failover\",\"minUpMembersChecking\":\"disabled\",\"monitor\":\"/Common/tcp \",\"queueDepthLimit\":0,\"queueOnConnectionLimit\":\"disabled\",\"queueTimeLimit\":0,\"reselectTries\":0,\"serviceDownAction\":\"none\",\"slowRampTime\":10,\"membersReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/pool/~Common~syslog_pool/members?ver=11.6.0\",\"isSubcollection\":true}}\n\n...\n\n2015-11-12 09:49:21 : Deploying/updating ASM Logging Profile to send to Remote Analytics Server\nPOST mgmt/tm/security/log/profile {\"application\": [{\"guaranteeLogging\": \"enabled\", \"guaranteeResponseLogging\": \"disabled\", \"logicOperation\": \"or\", \"protocol\": \"tcp\", \"name\": \"asm_log_to_splunk\", \"format\": {\"fieldDelimiter\": \",\", \"type\": \"predefined\"}, \"reportAnomalies\": \"disabled\", \"facility\": \"local0\", \"partition\": \"Common\", \"filter\": [{\"values\": [\"all\"], \"name\": \"protocol\"}, {\"values\": [\"all\"], \"name\": \"request-type\"}, {\"name\": \"search-all\"}], \"maximumHeaderSize\": \"any\", \"localStorage\": \"enabled\", \"maximumQuerySize\": \"any\", \"maximumEntryLength\": \"2k\", \"servers\": [{\"name\": \"172.16.14.180:515\"}], \"remoteStorage\": \"splunk\", \"maximumRequestSize\": \"any\", \"responseLogging\": \"none\"}], \"name\": \"asm_log_to_splunk\"}\nMethod POST mgmt/tm/security/log/profile returned: {\"kind\":\"tm:security:log:profile:profilestate\",\"name\":\"asm_log_to_splunk\",\"fullPath\":\"asm_log_to_splunk\",\"generation\":240,\"selfLink\":\"https://localhost/mgmt/tm/security/log/profile/asm_log_to_splunk?ver=11.6.0\",\"applicationReference\":{\"link\":\"https://localhost/mgmt/tm/security/log/profile/~Common~asm_log_to_splunk/application?ver=11.6.0\",\"isSubcollection\":true}}\n\n2015-11-12 09:49:23 : Deploying/updating Analytics Profile\nGET mgmt/tm/ltm/profile/analytics \"\"\nMethod GET mgmt/tm/ltm/profile/analytics returned: {\"kind\":\"tm:ltm:profile:analytics:analyticscollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/profile/analytics?ver=11.6.0\",\"items\":[{\"kind\":\"tm:ltm:profile:analytics:analyticsstate\",\"name\":\"analytics\",\"partition\":\"Common\",\"fullPath\":\"/Common/analytics\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/profile/analytics/~Common~analytics?ver=11.6.0\",\"capturedTrafficExternalLogging\":\"disabled\",\"capturedTrafficInternalLogging\":\"disabled\",\"collectGeo\":\"disabled\",\"collectIp\":\"disabled\",\"collectMaxTpsAndThroughput\":\"disabled\",\"collectMethods\":\"enabled\",\"collectPageLoadTime\":\"disabled\",\"collectResponseCodes\":\"enabled\",\"collectSubnets\":\"disabled\",\"collectUrl\":\"disabled\",\"collectUserAgent\":\"disabled\",\"collectUserSessions\":\"disabled\",\"collectedStatsExternalLogging\":\"disabled\",\"collectedStatsInternalLogging\":\"enabled\",\"notificationByEmail\":\"disabled\",\"notificationBySnmp\":\"disabled\",\"notificationBySyslog\":\"disabled\",\"publishIruleStatistics\":\"disabled\",\"sampling\":\"enabled\",\"sessionCookieSecurity\":\"ssl-only\",\"sessionTimeoutMinutes\":\"5\",\"alertsReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/profile/analytics/~Common~analytics/alerts?ver=11.6.0\",\"isSubcollection\":true},\"trafficCaptureReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/profile/analytics/~Common~analytics/traffic-capture?ver=11.6.0\",\"isSubcollection\":true}}]}\n\n...\n\n2015-11-12 09:49:26 : Uploading Datagroup ... background for sorry page\nGET mgmt/tm/ltm/data-group/internal \"\"\nMethod GET mgmt/tm/ltm/data-group/internal returned: {\"kind\":\"tm:ltm:data-group:internal:internalcollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal?ver=11.6.0\",\"items\":[{\"kind\":\"tm:ltm:data-group:internal:internalstate\",\"name\":\"aol\",\"partition\":\"Common\",\"fullPath\":\"/Common/aol\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~aol?ver=11.6.0\",\"type\":\"ip\",\"records\":[{\"name\":\"64.12.96.0/19\"},{\"name\":\"195.93.16.0/20\"},{\"name\":\"195.93.48.0/22\"},{\"name\":\"195.93.64.0/19\"},{\"name\":\"195.93.96.0/19\"},{\"name\":\"198.81.0.0/22\"},{\"name\":\"198.81.8.0/23\"},{\"name\":\"198.81.16.0/20\"},{\"name\":\"202.67.65.128/25\"},{\"name\":\"205.188.112.0/20\"},{\"name\":\"205.188.146.144/30\"},{\"name\":\"205.188.192.0/20\"},{\"name\":\"205.188.208.0/23\"},{\"name\":\"207.200.112.0/21\"}]},{\"kind\":\"tm:ltm:data-group:internal:internalstate\",\"name\":\"images\",\"partition\":\"Common\",\"fullPath\":\"/Common/images\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~images?ver=11.6.0\",\"type\":\"string\",\"records\":[{\"name\":\".bmp\"},{\"name\":\".gif\"},{\"name\":\".jpg\"}]},{\"kind\":\"tm:ltm:data-group:internal:internalstate\",\"name\":\"private_net\",\"partition\":\"Common\",\"fullPath\":\"/Common/private_net\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~private_net?ver=11.6.0\",\"type\":\"ip\",\"records\":[{\"name\":\"10.0.0.0/8\"},{\"name\":\"172.16.0.0/12\"},{\"name\":\"192.168.0.0/16\"}]}]}\n\n2015-11-12 09:49:26 : Uploading Datagroup ... background for sorry page\nPOST mgmt/tm/ltm/data-group/internal {\"records\": [{\"name\": \"...<base64 image>...\"}], \"type\": \"string\", \"name\": \"background_images\"}\nMethod POST mgmt/tm/ltm/data-group/internal returned: {\"kind\":\"tm:ltm:data-group:internal:internalstate\",\"name\":\"background_images\",\"fullPath\":\"background_images\",\"generation\":244,\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal/background_images?ver=11.6.0\",\"type\":\"string\",\"records\":[{\"name\":\"....large base64 image....\"}]}\n\n2015-11-12 09:49:29 : Uploading Datagroup ... image for sorry page\nGET mgmt/tm/ltm/data-group/internal \"\"\nMethod GET mgmt/tm/ltm/data-group/internal returned: {\"kind\":\"tm:ltm:data-group:internal:internalcollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal?ver=11.6.0\",\"items\":[{\"kind\":\"tm:ltm:data-group:internal:internalstate\",\"name\":\"aol\",\"partition\":\"Common\",\"fullPath\":\"/Common/aol\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~aol?ver=11.6.0\",\"type\":\"ip\",\"records\":[{\"name\":\"64.12.96.0/19\"},{\"name\":\"195.93.16.0/20\"},{\"name\":\"195.93.48.0/22\"},{\"name\":\"195.93.64.0/19\"},{\"name\":\"195.93.96.0/19\"},{\"name\":\"198.81.0.0/22\"},{\"name\":\"198.81.8.0/23\"},{\"name\":\"198.81.16.0/20\"},{\"name\":\"202.67.65.128/25\"},{\"name\":\"205.188.112.0/20\"},{\"name\":\"205.188.146.144/30\"},{\"name\":\"205.188.192.0/20\"},{\"name\":\"205.188.208.0/23\"},{\"name\":\"207.200.112.0/21\"}]},{\"kind\":\"tm:ltm:data-group:internal:internalstate\",\"name\":\"background_images\",\"partition\":\"Common\",\"fullPath\":\"/Common/background_images\",\"generation\":244,\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~background_images?ver=11.6.0\",\"type\":\"string\",\"records\":[{\"name\":\"...<base64 image>...\"}]},{\"kind\":\"tm:ltm:data-group:internal:internalstate\",\"name\":\"images\",\"partition\":\"Common\",\"fullPath\":\"/Common/images\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~images?ver=11.6.0\",\"type\":\"string\",\"records\":[{\"name\":\".bmp\"},{\"name\":\".gif\"},{\"name\":\".jpg\"}]},{\"kind\":\"tm:ltm:data-group:internal:internalstate\",\"name\":\"private_net\",\"partition\":\"Common\",\"fullPath\":\"/Common/private_net\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal/~Common~private_net?ver=11.6.0\",\"type\":\"ip\",\"records\":[{\"name\":\"10.0.0.0/8\"},{\"name\":\"172.16.0.0/12\"},{\"name\":\"192.168.0.0/16\"}]}]}\n\n2015-11-12 09:49:30 : Uploading Datagroup ... image for sorry page\nPOST mgmt/tm/ltm/data-group/internal {\"records\": [{\"name\": \"...<base64 image>...\"}], \"type\": \"string\", \"name\": \"sorry_images\"}\nMethod POST mgmt/tm/ltm/data-group/internal returned: {\"kind\":\"tm:ltm:data-group:internal:internalstate\",\"name\":\"sorry_images\",\"fullPath\":\"sorry_images\",\"generation\":245,\"selfLink\":\"https://localhost/mgmt/tm/ltm/data-group/internal/sorry_images?ver=11.6.0\",\"type\":\"string\",\"records\":[{\"name\":\"....base 64 image....\"}]}\n\n2015-11-12 09:49:32 : Uploading iRules ... sorry_page_rule\nGET mgmt/tm/ltm/rule \"\"\nMethod GET mgmt/tm/ltm/rule returned: {\"kind\":\"tm:ltm:rule:rulecollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/rule?ver=11.6.0\",\"items\":[<a whole bunch of irules>]}\n\n2015-11-12 09:49:35 : Uploading iRules ... demo_analytics_rule\nGET mgmt/tm/ltm/rule \"\"\nMethod GET mgmt/tm/ltm/rule returned: {\"kind\":\"tm:ltm:rule:rulecollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/rule?ver=11.6.0\",\"items\":[<a whole bunnch of irules>]}\n\n2015-11-12 09:49:38 : Create the ASM policy\nGET mgmt/tm/asm/policies \"\"\nMethod GET mgmt/tm/asm/policies returned: {\"selfLink\":\"https://localhost/mgmt/tm/asm/policies\",\"kind\":\"tm:asm:policies:policycollectionstate\",\"totalItems\":0,\"items\":[]}\n\n2015-11-12 09:49:39 : Create the ASM policy\nPOST mgmt/tm/asm/policies {\"caseInsensitive\": true, \"name\": \"linux_high-Vip1\", \"applicationLanguage\": \"utf-8\"}\n...\n\n2015-11-12 09:49:53 : Import our policy over the one existing above\nPOST mgmt/tm/asm/tasks/import-policy {\"policyReference\": {\"link\": \"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg\"}, \"isBase64\": true, \"file\": \"...<base64 policy file>...\",\"lastUpdateMicros\":1.447350597e+15,\"selfLink\":\"https://localhost/mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law\",\"kind\":\"tm:asm:tasks:import-policy:import-policy-taskstate\",\"policyReference\":{\"link\":\"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg\"},\"startTime\":\"2015-11-12T17:49:57Z\",\"id\":\"hP37L9EM650WeWKkgX7law\"}\n\n2015-11-12 09:50:00 : Determine whether the asm policy import task is complete\nGET mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law \"\"\nMethod GET mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law returned: {\"isBase64\":true,\"status\":\"STARTED\",\"file\":\"...<base64 policy file>...\",\"lastUpdateMicros\":1.447350597e+15,\"selfLink\":\"https://localhost/mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law\",\"kind\":\"tm:asm:tasks:import-policy:import-policy-taskstate\",\"policyReference\":{\"link\":\"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg\"},\"startTime\":\"2015-11-12T17:49:57Z\",\"id\":\"hP37L9EM650WeWKkgX7law\"}\n\n2015-11-12 09:50:05 : Determine whether the asm policy import task is complete\nGET mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law \"\"\nMethod GET mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law returned: {\"isBase64\":true,\"status\":\"COMPLETED\",\"file\":\"...<base64 policy file>...\",\"lastUpdateMicros\":1.447350605e+15,\"selfLink\":\"https://localhost/mgmt/tm/asm/tasks/import-policy/hP37L9EM650WeWKkgX7law\",\"kind\":\"tm:asm:tasks:import-policy:import-policy-taskstate\",\"policyReference\":{\"link\":\"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg\"},\"endTime\":\"2015-11-12T17:50:05Z\",\"startTime\":\"2015-11-12T17:49:57Z\",\"id\":\"hP37L9EM650WeWKkgX7law\",\"result\":{\"policyReference\":{\"link\":\"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg\"},\"message\":\"Security policy version information will be ignored, since the file has been modified since it was exported.\\nSignature Set linux-high (previously used in this security policy) was added to this system.\\nThe operation was completed successfully. The security policy name is '/Common/linux_high-Vip1'.\"}}\n\n2015-11-12 09:50:08 : Apply the ASM policy\nPOST mgmt/tm/asm/tasks/apply-policy {\"policyReference\": {\"link\": \"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg\"}}\nMethod POST mgmt/tm/asm/tasks/apply-policy returned: {\"selfLink\":\"https://localhost/mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg\",\"kind\":\"tm:asm:tasks:apply-policy:apply-policy-taskstate\",\"policyReference\":{\"link\":\"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg\"},\"status\":\"NEW\",\"lastUpdateMicros\":1.447350608e+15,\"startTime\":\"2015-11-12T17:50:08Z\",\"id\":\"38B8slfPm1_lBBRG1STNeg\"}\n\n2015-11-12 09:50:10 : Determine whether the asm policy apply task is complete\nGET mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg \"\"\nMethod GET mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg returned: {\"selfLink\":\"https://localhost/mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg\",\"kind\":\"tm:asm:tasks:apply-policy:apply-policy-taskstate\",\"policyReference\":{\"link\":\"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg\"},\"status\":\"STARTED\",\"lastUpdateMicros\":1.447350608e+15,\"startTime\":\"2015-11-12T17:50:08Z\",\"id\":\"38B8slfPm1_lBBRG1STNeg\"}\n\n2015-11-12 09:50:14 : Determine whether the asm policy apply task is complete\nGET mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg \"\"\nMethod GET mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg returned: {\"selfLink\":\"https://localhost/mgmt/tm/asm/tasks/apply-policy/38B8slfPm1_lBBRG1STNeg\",\"kind\":\"tm:asm:tasks:apply-policy:apply-policy-taskstate\",\"policyReference\":{\"link\":\"https://localhost/mgmt/tm/asm/policies/qnU5A8PUMuPurLRLUt8VHg\"},\"status\":\"STARTED\",\"lastUpdateMicros\":1.447350608e+15,\"startTime\":\"2015-11-12T17:50:08Z\",\"id\":\"38B8slfPm1_lBBRG1STNeg\"}\n\n2015-11-12 09:50:20 : Create an LTM policy for use with by iApp which associates the ASM policy\nGET mgmt/tm/ltm/policy \"\"\nMethod GET mgmt/tm/ltm/policy returned: {\"kind\":\"tm:ltm:policy:policycollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/policy?ver=11.6.0\",\"items\":[{\"kind\":\"tm:ltm:policy:policystate\",\"name\":\"_sys_CEC_SSL_client_policy\",\"partition\":\"Common\",\"fullPath\":\"/Common/_sys_CEC_SSL_client_policy\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/policy/~Common~_sys_CEC_SSL_client_policy?ver=11.6.0\",\"controls\":[\"classification\"],\"hints\":[\"no-write\",\"no-delete\",\"no-exclusion\"],\"requires\":[\"ssl-persistence\"],\"strategy\":\"/Common/first-match\",\"rulesReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/policy/~Common~_sys_CEC_SSL_client_policy/rules?ver=11.6.0\",\"isSubcollection\":true}},{\"kind\":\"tm:ltm:policy:policystate\",\"name\":\"_sys_CEC_SSL_server_policy\",\"partition\":\"Common\",\"fullPath\":\"/Common/_sys_CEC_SSL_server_policy\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/policy/~Common~_sys_CEC_SSL_server_policy?ver=11.6.0\",\"controls\":[\"classification\"],\"hints\":[\"no-write\",\"no-delete\",\"no-exclusion\"],\"requires\":[\"ssl-persistence\"],\"strategy\":\"/Common/first-match\",\"rulesReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/policy/~Common~_sys_CEC_SSL_server_policy/rules?ver=11.6.0\",\"isSubcollection\":true}},{\"kind\":\"tm:ltm:policy:policystate\",\"name\":\"_sys_CEC_video_policy\",\"partition\":\"Common\",\"fullPath\":\"/Common/_sys_CEC_video_policy\",\"generation\":1,\"selfLink\":\"https://localhost/mgmt/tm/ltm/policy/~Common~_sys_CEC_video_policy?ver=11.6.0\",\"controls\":[\"classification\"],\"hints\":[\"no-write\",\"no-delete\",\"no-exclusion\"],\"requires\":[\"http\"],\"strategy\":\"/Common/first-match\",\"rulesReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/policy/~Common~_sys_CEC_video_policy/rules?ver=11.6.0\",\"isSubcollection\":true}}]}\n\n2015-11-12 09:50:23 : Create an LTM policy for use with by iApp which associates the ASM policy\nPOST mgmt/tm/ltm/policy {\"name\": \"ltm_policy_w_asm_linux_high-Vip1\", \"rules\": [{\"ordinal\": 1, \"conditions\": [], \"name\": \"rule-1\", \"actions\": [{\"status\": 0, \"enable\": true, \"name\": \"0\", \"request\": true, \"vlanId\": 0, \"code\": 0, \"policy\": \"/Common/linux_high-Vip1\", \"port\": 0, \"asm\": true}]}], \"partition\": \"Common\", \"controls\": [\"asm\"], \"strategy\": \"/Common/first-match\", \"requires\": [\"http\"]}\nMethod POST mgmt/tm/ltm/policy returned: {\"kind\":\"tm:ltm:policy:policystate\",\"name\":\"ltm_policy_w_asm_linux_high-Vip1\",\"partition\":\"Common\",\"fullPath\":\"/Common/ltm_policy_w_asm_linux_high-Vip1\",\"generation\":318,\"selfLink\":\"https://localhost/mgmt/tm/ltm/policy/~Common~ltm_policy_w_asm_linux_high-Vip1?ver=11.6.0\",\"controls\":[\"asm\"],\"requires\":[\"http\"],\"strategy\":\"/Common/first-match\",\"rulesReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/policy/~Common~ltm_policy_w_asm_linux_high-Vip1/rules?ver=11.6.0\",\"isSubcollection\":true}}\n\n2015-11-12 09:50:25 : Deploy the iApp template, since we are not using a default iApp on box\nGET mgmt/tm/sys/application/template \"\"\nMethod GET mgmt/tm/sys/application/template returned: {\"kind\":\"tm:sys:application:template:templatecollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/sys/application/template?ver=11.6.0\",\"items\":[...<list of iApp templates on the box>...]}\n\n2015-11-12 09:50:30 : Deploy the iApp service from the f5 http backport template\nGET mgmt/tm/sys/application/service \"\"\nMethod GET mgmt/tm/sys/application/service returned: {\"kind\":\"tm:sys:application:service:servicecollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/sys/application/service?ver=11.6.0\"}\n\n2015-11-12 09:51:37 : Deploying/updating webserver pool\nGET mgmt/tm/ltm/pool \"\"\nMethod GET mgmt/tm/ltm/pool returned: {\"kind\":\"tm:ltm:pool:poolcollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/pool?ver=11.6.0\",\"items\":[{\"kind\":\"tm:ltm:pool:poolstate\",\"name\":\"Vip1_pool\",\"partition\":\"Common\",\"fullPath\":\"/Common/Vip1_pool\",\"generation\":236,\"selfLink\":\"https://localhost/mgmt/tm/ltm/pool/~Common~Vip1_pool?ver=11.6.0\",\"allowNat\":\"yes\",\"allowSnat\":\"yes\",\"ignorePersistedWeight\":\"disabled\",\"ipTosToClient\":\"pass-through\",\"ipTosToServer\":\"pass-through\",\"linkQosToClient\":\"pass-through\",\"linkQosToServer\":\"pass-through\",\"loadBalancingMode\":\"round-robin\",\"minActiveMembers\":0,\"minUpMembers\":0,\"minUpMembersAction\":\"failover\",\"minUpMembersChecking\":\"disabled\",\"monitor\":\"/Common/http \",\"queueDepthLimit\":0,\"queueOnConnectionLimit\":\"disabled\",\"queueTimeLimit\":0,\"reselectTries\":0,\"serviceDownAction\":\"none\",\"slowRampTime\":10,\"membersReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/pool/~Common~Vip1_pool/members?ver=11.6.0\",\"isSubcollection\":true}},{\"kind\":\"tm:ltm:pool:poolstate\",\"name\":\"syslog_pool\",\"partition\":\"Common\",\"fullPath\":\"/Common/syslog_pool\",\"generation\":239,\"selfLink\":\"https://localhost/mgmt/tm/ltm/pool/~Common~syslog_pool?ver=11.6.0\",\"allowNat\":\"yes\",\"allowSnat\":\"yes\",\"ignorePersistedWeight\":\"disabled\",\"ipTosToClient\":\"pass-through\",\"ipTosToServer\":\"pass-through\",\"linkQosToClient\":\"pass-through\",\"linkQosToServer\":\"pass-through\",\"loadBalancingMode\":\"round-robin\",\"minActiveMembers\":0,\"minUpMembers\":0,\"minUpMembersAction\":\"failover\",\"minUpMembersChecking\":\"disabled\",\"monitor\":\"/Common/tcp \",\"queueDepthLimit\":0,\"queueOnConnectionLimit\":\"disabled\",\"queueTimeLimit\":0,\"reselectTries\":0,\"serviceDownAction\":\"none\",\"slowRampTime\":10,\"membersReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/pool/~Common~syslog_pool/members?ver=11.6.0\",\"isSubcollection\":true}}]}\n\n2015-11-12 09:51:37 : Deploying/updating webserver pool\nPOST mgmt/tm/ltm/pool {\"name\": \"Vip2_pool\", \"members\": [{\"description\": \"Name=/boring_lovelace,ContainerHostname=a0085832ad28,Image=mutzel/all-in-one-hackazon:postinstall\", \"name\": \"172.16.14.87:80\", \"address\": \"172.16.14.87\"}], \"monitor\": \"http\"}\nMethod POST mgmt/tm/ltm/pool returned: {\"kind\":\"tm:ltm:pool:poolstate\",\"name\":\"Vip2_pool\",\"fullPath\":\"Vip2_pool\",\"generation\":352,\"selfLink\":\"https://localhost/mgmt/tm/ltm/pool/Vip2_pool?ver=11.6.0\",\"allowNat\":\"yes\",\"allowSnat\":\"yes\",\"ignorePersistedWeight\":\"disabled\",\"ipTosToClient\":\"pass-through\",\"ipTosToServer\":\"pass-through\",\"linkQosToClient\":\"pass-through\",\"linkQosToServer\":\"pass-through\",\"loadBalancingMode\":\"round-robin\",\"minActiveMembers\":0,\"minUpMembers\":0,\"minUpMembersAction\":\"failover\",\"minUpMembersChecking\":\"disabled\",\"monitor\":\"/Common/http \",\"queueDepthLimit\":0,\"queueOnConnectionLimit\":\"disabled\",\"queueTimeLimit\":0,\"reselectTries\":0,\"serviceDownAction\":\"none\",\"slowRampTime\":10,\"membersReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/pool/~Common~Vip2_pool/members?ver=11.6.0\",\"isSubcollection\":true}}\n\n2015-11-12 09:51:39 : Uploading iRules ... irule_random_snat\nGET mgmt/tm/ltm/rule \"\"\nMethod GET mgmt/tm/ltm/rule returned: {\"kind\":\"tm:ltm:rule:rulecollectionstate\",\"selfLink\":\"https://localhost/mgmt/tm/ltm/rule?ver=11.6.0\",\"items\":[...<list of irules on the box>...]}\n\n...\n\n2015-11-12 09:51:43 : Setup the HTTP virtual server\nPOST mgmt/tm/ltm/virtual {\"name\": \"Vip2_http\", \"rules\": [\"/Common/irule_random_snat\"], \"translateAddress\": \"enabled\", \"destination\": \"/Common/172.16.13.145:80\", \"mask\": \"255.255.255.255\", \"sourceAddressTranslation\": {\"type\": \"automap\"}, \"profiles\": [{\"name\": \"http\"}, {\"name\": \"tcp-wan-optimized\", \"context\": \"clientside\"}, {\"name\": \"tcp-lan-optimized\", \"context\": \"serverside\"}], \"translatePort\": \"enabled\", \"ipProtocol\": \"tcp\", \"pool\": \"/Common/Vip2_pool\"}\nMethod POST mgmt/tm/ltm/virtual returned: {\"kind\":\"tm:ltm:virtual:virtualstate\",\"name\":\"Vip2_http\",\"fullPath\":\"Vip2_http\",\"generation\":355,\"selfLink\":\"https://localhost/mgmt/tm/ltm/virtual/Vip2_http?ver=11.6.0\",\"addressStatus\":\"yes\",\"autoLasthop\":\"default\",\"cmpEnabled\":\"yes\",\"connectionLimit\":0,\"destination\":\"/Common/172.16.13.145:80\",\"enabled\":true,\"gtmScore\":0,\"ipProtocol\":\"tcp\",\"mask\":\"255.255.255.255\",\"mirror\":\"disabled\",\"mobileAppTunnel\":\"disabled\",\"nat64\":\"disabled\",\"pool\":\"/Common/Vip2_pool\",\"rateLimit\":\"disabled\",\"rateLimitDstMask\":0,\"rateLimitMode\":\"object\",\"rateLimitSrcMask\":0,\"source\":\"0.0.0.0/0\",\"sourceAddressTranslation\":{\"type\":\"automap\"},\"sourcePort\":\"preserve\",\"synCookieStatus\":\"not-activated\",\"translateAddress\":\"enabled\",\"translatePort\":\"enabled\",\"vlansDisabled\":true,\"vsIndex\":4,\"rules\":[\"/Common/irule_random_snat\"],\"policiesReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/virtual/~Common~Vip2_http/policies?ver=11.6.0\",\"isSubcollection\":true},\"profilesReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/virtual/~Common~Vip2_http/profiles?ver=11.6.0\",\"isSubcollection\":true}}\n\n2015-11-12 09:51:45 : Setup the HTTPS virtual server\nPOST mgmt/tm/ltm/virtual {\"name\": \"Vip2_https\", \"rules\": [\"/Common/irule_random_snat\"], \"translateAddress\": \"enabled\", \"destination\": \"/Common/172.16.13.145:443\", \"mask\": \"255.255.255.255\", \"sourceAddressTranslation\": {\"type\": \"automap\"}, \"profiles\": [{\"name\": \"tcp-ssl-wan-optimized\", \"context\": \"clientside\"}, {\"name\": \"tcp-ssl-lan-optimized\", \"context\": \"serverside\"}], \"translatePort\": \"enabled\", \"ipProtocol\": \"tcp\", \"pool\": \"/Common/Vip2_pool\"}\nMethod POST mgmt/tm/ltm/virtual returned: {\"kind\":\"tm:ltm:virtual:virtualstate\",\"name\":\"Vip2_https\",\"fullPath\":\"Vip2_https\",\"generation\":356,\"selfLink\":\"https://localhost/mgmt/tm/ltm/virtual/Vip2_https?ver=11.6.0\",\"addressStatus\":\"yes\",\"autoLasthop\":\"default\",\"cmpEnabled\":\"yes\",\"connectionLimit\":0,\"destination\":\"/Common/172.16.13.145:443\",\"enabled\":true,\"gtmScore\":0,\"ipProtocol\":\"tcp\",\"mask\":\"255.255.255.255\",\"mirror\":\"disabled\",\"mobileAppTunnel\":\"disabled\",\"nat64\":\"disabled\",\"pool\":\"/Common/Vip2_pool\",\"rateLimit\":\"disabled\",\"rateLimitDstMask\":0,\"rateLimitMode\":\"object\",\"rateLimitSrcMask\":0,\"source\":\"0.0.0.0/0\",\"sourceAddressTranslation\":{\"type\":\"automap\"},\"sourcePort\":\"preserve\",\"synCookieStatus\":\"not-activated\",\"translateAddress\":\"enabled\",\"translatePort\":\"enabled\",\"vlansDisabled\":true,\"vsIndex\":5,\"rules\":[\"/Common/irule_random_snat\"],\"policiesReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/virtual/~Common~Vip2_https/policies?ver=11.6.0\",\"isSubcollection\":true},\"profilesReference\":{\"link\":\"https://localhost/mgmt/tm/ltm/virtual/~Common~Vip2_https/profiles?ver=11.6.0\",\"isSubcollection\":true}}\n
\n\n

 

\n\n

Deploying an iApp template using iControlREST

\n\n

Because we recognize that it may be not obvious how we are deploying iApp templates using iControlREST, we break it down into more detail here.

\n\n

First, note that there is no 'import' action we can invoke via REST to import the iApp template which mirrors the action in the Configuration Utility (GUI). This means that we need to create the JSON payload containing the iApp and POST it. 

\n\n

Given an iApp template, like those found on DevCentral, here are the steps to create the JSON body.

\n\n

 

\n\n
  1. On a pre-existing BIG-IP install (or one have created in your build process for your code)\n
    1. Import the iApp template in the Configuration Utility in the 'Common' partition
    2. Do an HTTP GET to retrieve the iApp template payload. Make sure that you use the expandSubcollections=True as a query parameter, as we want to include the stuff in the 'actionsReference' sub-collection.\n
      1. \n
        \ncurl -sku <user>:<password> -X GET  https://<management ip>/mgmt/tm/sys/application/template/~Common~<name of your iApp>?expandSubcollections=true
        \n
      \n
    3. You should get something back that looks like the following (which is the payload for the f5.http backport iApp).  I have truncated the 'implementation', 'presentation' and 'htmlHelp' actions:\n
      1. \n
        \n{\n    \"actionsReference\": {\n        \"isSubcollection\": true,\n        \"items\": [\n            {\n                \"fullPath\": \"definition\",\n                \"generation\": 4672,\n                \"htmlHelp\": \"....\",\n                \"implementation\": \"...\",\n                \"kind\": \"tm:sys:application:template:actions:actionsstate\",\n                \"name\": \"definition\",\n                \"presentation\": \"...\",\n                \"roleAcl\": [\n                    \"admin\",\n                    \"manager\",\n                    \"resource-admin\"\n                ],\n                \"selfLink\": \"https://localhost/mgmt/tm/sys/application/template/~Common~f5.http.backport.1.1.2/actions/definition?ver=11.6.0\"\n            }\n        ],\n        \"link\": \"https://localhost/mgmt/tm/sys/application/template/~Common~f5.http.backport.1.1.2/actions?ver=11.6.0\"\n    },\n    \"fullPath\": \"/Common/f5.http.backport.1.1.2\",\n    \"generation\": 4672,\n    \"ignoreVerification\": \"false\",\n    \"kind\": \"tm:sys:application:template:templatestate\",\n    \"name\": \"f5.http.backport.1.1.2\",\n    \"partition\": \"Common\",\n    \"requiresBigipVersionMin\": \"11.6.0\",\n    \"selfLink\": \"https://localhost/mgmt/tm/sys/application/template/~Common~f5.http.backport.1.1.2?expandSubcollections=true&ver=11.6.0\",\n    \"totalSigningStatus\": \"not-all-signed\",\n    \"verificationStatus\": \"none\"\n}
        \n
      2. Before we can POST this payload back to any BIG-IP, we need to cleanup a few things:\n
        1. Remove any of the extraneous fields including 'verificationStatus', 'totalSigningStatus', 'selfLink', 'partition', 'kind', 'generation', 'fullPath'.
        2. Make a new top-level key in the payload called 'actions'.  The value for this key should everything in the 'items' array under the top-level key 'actionsReference'.  Finally, delete the 'actionsReference' key/value pair from the JSON body. The final JSON payload should look like:\n
          1. \n
            \n{\n  \"actions\": [\n    {\n      \"htmlHelp\": \"....\",\n      \"implementation\": \"...\",\n      \"name\": \"definition\",\n      \"presentation\": \"...\",\n      \"roleAcl\": [\n        \"admin\",\n        \"manager\",\n        \"resource-admin\"\n      ]\n    }\n  ],\n  \"ignoreVerification\": \"false\",\n  \"name\": \"f5.http.backport.1.1.2\",\n  \"requiresBigipVersionMin\": \"11.6.0\",\n  \"totalSigningStatus\": \"not-all-signed\"\n}
            \n
          \n
        \n
      3. Finally, we can use this to deploy an iApp template on BIG-IP.  In the example below, the iApp_template.json file is formatted like the above. I have also attached it to this page for inspection. \n
        1. \n
          \ncurl -sku rest_admin:<obfuscated> -H \"Content-type: application/json\" -X POST -d@./iApp_template.json https://52.23.149.16//mgmt/tm/sys/application/template
          \n
        \n
      \n
    \n
\n\n

Before you go POSTing iApps to any old version of TMOS, be aware that there are still some remaining issues you might have to solve.  Some of the official iApps found on DevCentral are prepended with a TCL library that defines functions used within the iApp.  The iApp solutions team made this design decision so that newer iApps will work against older versions of TMOS.  For example, see the 'F5 HTTP', which starts with the library definition on line 0: \"cli script f5.iapp.1.3.0.cli {....\".  When you export the iApp template to JSON using REST as we have documented above, this library will not be included in the payload. Because newer versions of BIG-IP (11.6) might already include a version of this 'iApp' library, you can work around this issue by updating the function references to use the existing library on-box.  Here are the high-level steps:

\n\n
  1. Downloading the iApp from DevCentral
  2. Change the function references to leverage the library that is installed on your BIG-IP.  See an example of this by comparing the F5 HTTP template on the codeshare with the one attached to this page. \n
    1. You'll probably have to do some \"find and replace\" like the following:
    2. \n
      \nf5.iapp.1.3.0.cli:iapp_get_provisioned -> iapp::get_provisioned
      \n
    3. There may be some references to functions that do not exist yet.  These will have to be dealt with on a case-by-case basis. 
    \n
  3. Uploading the iApp to BIG-IP and exporting we documented above.  
\n\n

Deploying an iApp service using iControlREST

\n\n

Fortunately, using iControlREST to manage instances of iApps (also known as iApp services) is much easier than managing templates.  The high-level steps are similar: 

\n\n
  1. Deploy an iApp service via the Configuration Utility.
  2. Do an HTTP GET to acquire the JSON representation (notice the URL formatting!).\n
    1. \n
      \ncurl -sku <user>:<password> -X GET https://<management ip>/mgmt/tm/sys/application/service/~Common~<your iapp name>.app~<your iapp name> 
      \n
    \n
  3. Depending on the variables presented by the iApp template, the JSON payload for the iApp service might look something like:\n
    1. \n
      \n {\n    \"deviceGroup\": \"none\",\n    \"fullPath\": \"/Common/Vip1_iApp.app/Vip1_iApp\",\n    \"generation\": 4674,\n    \"inheritedDevicegroup\": \"true\",\n    \"inheritedTrafficGroup\": \"true\",\n    \"kind\": \"tm:sys:application:service:servicestate\",\n    \"lists\": [\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"irules__irules\",\n            \"value\": [\n                \"/Common/irule_demo_analytics\",\n                \"/Common/irule_sorry_page\"\n            ]\n        }\n    ],\n    \"name\": \"Vip1_iApp\",\n    \"partition\": \"Common\",\n    \"selfLink\": \"https://localhost/mgmt/tm/sys/application/service/~Common~Vip1_iApp.app~Vip1_iApp?ver=11.6.0\",\n    \"strictUpdates\": \"enabled\",\n    \"subPath\": \"Vip1_iApp.app\",\n    \"tables\": [\n        {\n            \"name\": \"basic__snatpool_members\"\n        },\n        {\n            \"name\": \"net__snatpool_members\"\n        },\n        {\n            \"name\": \"optimizations__hosts\"\n        },\n        {\n            \"columnNames\": [\n                \"name\"\n            ],\n            \"name\": \"pool__hosts\",\n            \"rows\": [\n                {\n                    \"row\": [\n                        \"demo.example.com\"\n                    ]\n                }\n            ]\n        },\n        {\n            \"name\": \"pool__members\"\n        },\n        {\n            \"name\": \"server_pools__servers\"\n        }\n    ],\n    \"template\": \"/Common/f5.http.backport.1.1.2\",\n    \"templateModified\": \"yes\",\n    \"trafficGroup\": \"/Common/traffic-group-1\",\n    \"variables\": [\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"asm__security_logging\",\n            \"value\": \"asm_log_to_splunk\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"asm__use_asm\",\n            \"value\": \"/Common/ltm_policy_w_asm_linux_high-Vip1\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"client__http_compression\",\n            \"value\": \"/#do_not_use#\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"client__standard_caching_without_wa\",\n            \"value\": \"/#do_not_use#\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"client__tcp_wan_opt\",\n            \"value\": \"/Common/tcp-ssl-wan-optimized\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"net__client_mode\",\n            \"value\": \"wan\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"net__route_to_bigip\",\n            \"value\": \"no\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"net__same_subnet\",\n            \"value\": \"no\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"net__server_mode\",\n            \"value\": \"lan\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"net__snat_type\",\n            \"value\": \"automap\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"net__vlan_mode\",\n            \"value\": \"all\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"pool__addr\",\n            \"value\": \"172.16.13.128\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"pool__http\",\n            \"value\": \"/#create_new#\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"pool__mask\",\n            \"value\": \"none\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"pool__persist\",\n            \"value\": \"/#cookie#\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"pool__pool_to_use\",\n            \"value\": \"/Common/Vip1_pool\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"pool__port_secure\",\n            \"value\": \"443\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"pool__redirect_port\",\n            \"value\": \"80\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"pool__redirect_to_https\",\n            \"value\": \"yes\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"pool__xff\",\n            \"value\": \"yes\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"server__oneconnect\",\n            \"value\": \"/#do_not_use#\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"server__tcp_lan_opt\",\n            \"value\": \"/Common/tcp-wan-optimized\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"server__tcp_req_queueing\",\n            \"value\": \"no\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"ssl__cert\",\n            \"value\": \"/Common/default.crt\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"ssl__client_ssl_profile\",\n            \"value\": \"/#create_new#\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"ssl__key\",\n            \"value\": \"/Common/default.key\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"ssl__mode\",\n            \"value\": \"client_ssl\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"ssl__use_chain_cert\",\n            \"value\": \"/#do_not_use#\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"ssl_encryption_questions__advanced\",\n            \"value\": \"yes\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"ssl_encryption_questions__help\",\n            \"value\": \"hide\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"stats__analytics\",\n            \"value\": \"/Common/Vip1-demo_analytics\"\n        },\n        {\n            \"encrypted\": \"no\",\n            \"name\": \"stats__request_logging\",\n            \"value\": \"/#do_not_use#\"\n        }\n    ]\n}
      \n
    \n
  4. As ealier, remove some of the fields that don't make sense to re-post. This includes 'deviceGroup', 'fullPath', 'generation', 'kind', 'partition', 'selfLink', and 'subPath'.
  5. You can now use this JSON body with updates to the variable values as needed.  
\n\n

Example python code for deploying iApp Templates

\n\n

In addition to the above procedures, we'd like you point you to some python examples which show how to push iApp templates using REST. Hitesh Patel, another monster F5er, has put together the following code:

\n\n

https://github.com/0xHiteshPatel/appsvcs_integration_iapp/tree/80cc40dcf85e352a25c7ec44d9e4dcc253e51e69/scripts

\n\n

In his words: \"that's 152 lines of awesome right there\".

\n\n

His examples run against 11.5.x, 11.6.x and 12.0. 

\n\n

Debugging

\n\n

When trying to create or update an instance of an iApp via REST, you will get error messages in the HTTP response if your POST is unsuccessful.  In addition to the HTTP payload in the response, the following debug steps can be helpful:

\n\n

1) Set the scriptd log level to debug:

\n\n
\nmodify sys scriptd log-level debug
\n\n

2) Look at the TMSH output from the iApp printed to /var/log/scriptd.out.  Typically the last line will show the error that has occured. 

\n\n

In closing

\n\n

The above examples should bring you one step closer to automating the delivery of advanced network services for your applications.  We're looking forward to doing future posts on how to automate your deployment.  Finally, if you haven't checked out the Application Services Integration iApp, also by Hitesh, you should probably do so now: https://github.com/0xHiteshPatel/appsvcs_integration_iapp.

\n\n

Cheers!

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

Hi Chris,

\n

Nice work.

\n

From your example Deploying an iApp service using iControlRest would we also use a post (like for the template example) for the deployment part? If so, would it look something like the below CURL statement?

\n

curl -sku rest_admin: -H \"Content-type:application/json\" -X POST -d@./iApp_.json https:///mgmt/tm/sys/application/service/~Common~.app~

\n

Regards,

\n

Barney

","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"203","kudosSumWeight":0,"repliesCount":0,"postTime":"2016-12-23T08:51:22.000-08:00","lastPublishTime":"2023-06-05T15:39:51.831-07:00","metrics":{"__typename":"MessageMetrics","views":1359},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"entityType":"TKB_REPLY","eventPath":"category:Articles/community:zihoc95639board:TechnicalArticles/message:276589/message:276590","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"CachedAsset:text:en_US-components/messages/MessageSubject-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1740415735000","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1740415735000","value":{"showMessageBody":"Show More","mentionsErrorTitle":"{mentionsType, select, board {Board} user {User} message {Message} other {}} No Longer Available","mentionsErrorMessage":"The {mentionsType} you are trying to view has been removed from the community.","videoProcessing":"Video is being processed. Please try again in a few minutes.","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageCustomFields-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageCustomFields-1740415735000","value":{"CustomField.default.label":"Value of {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageRevision-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRevision-1740415735000","value":{"lastUpdatedDatePublished":"{publishCount, plural, one{Published} other{Updated}} {date}","lastUpdatedDateDraft":"Created {date}","version":"Version {major}.{minor}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyButton-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyButton-1740415735000","value":{"repliesCount":"{count}","title":"Reply","title@board:BLOG@message:root":"Comment","title@board:TKB@message:root":"Comment","title@board:IDEA@message:root":"Comment","title@board:OCCASION@message:root":"Comment"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageAuthorBio-1740415735000","value":{"sendMessage":"Send Message","actionMessage":"Follow this blog board to get notified when there's new activity","coAuthor":"CO-PUBLISHER","contributor":"CONTRIBUTOR","userProfile":"View Profile","iconlink":"Go to {name} {type}"},"localOverride":false},"CachedAsset:text:en_US-components/guides/GuideBottomNavigation-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/guides/GuideBottomNavigation-1740415735000","value":{"nav.label":"Previous/Next Page","nav.previous":"Previous","nav.next":"Next"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1740415735000","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserRank-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserRank-1740415735000","value":{"rankName":"{rankName}","userRank":"Author rank {rankName}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTime-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1740415735000","value":{"postTime":"Published: {time}","lastPublishTime":"Last Update: {time}","conversation.lastPostingActivityTime":"Last posting activity time: {time}","conversation.lastPostTime":"Last post time: {time}","moderationData.rejectTime":"Rejected time: {time}"},"localOverride":false},"CachedAsset:text:en_US-components/customComponent/CustomComponent-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/customComponent/CustomComponent-1740415735000","value":{"errorMessage":"Error rendering component id: {customComponentId}","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1740415735000","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/ranks/UserRankLabel-1740415735000","value":{"altTitle":"Icon for {rankName} rank"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserRegistrationDate-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserRegistrationDate-1740415735000","value":{"noPrefix":"{date}","withPrefix":"Joined {date}"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagView/TagViewChip-1740415735000","value":{"tagLabelName":"Tag name {tagName}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1740415735000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Pager/PagerLoadMore-1740415735000","value":{"loadMore":"Show More"},"localOverride":false}}}},"page":"/kbs/TkbMessagePage/TkbMessagePage","query":{"boardId":"technicalarticles","messageSubject":"full-examples-of-icontrolrest-for-device-and-application-service-deployment","messageId":"276589"},"buildId":"G6LFdF6Y8sb5g8rZyM3sC","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"f5","openTelemetryServiceVersion":"25.2.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","apolloDevToolsEnabled":false,"inboxMuteWipFeatureEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/customComponent/CustomComponent/CustomComponent.tsx","./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/tkbs/TkbArticleWidget/TkbArticleWidget.tsx","./components/messages/MessageView/MessageViewStandard/MessageViewStandard.tsx","./components/messages/ThreadedReplyList/ThreadedReplyList.tsx","./components/customComponent/CustomComponentContent/TemplateContent.tsx","../shared/client/components/common/List/UnstyledList/UnstyledList.tsx","./components/messages/MessageView/MessageView.tsx","./components/customComponent/CustomComponentContent/HtmlContent.tsx","./components/customComponent/CustomComponentContent/CustomComponentScripts.tsx","../shared/client/components/common/List/UnwrappedList/UnwrappedList.tsx","./components/tags/TagView/TagView.tsx","./components/tags/TagView/TagViewChip/TagViewChip.tsx","../shared/client/components/common/Pager/PagerLoadMore/PagerLoadMore.tsx"],"appGip":true,"scriptLoader":[]}