design

641 Topics
"}},"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\":[],\"name\":\"TagPage\",\"props\":{},\"url\":\"https://community.f5.com/tag/design\"}}})":{"__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\":[],\"name\":\"TagPage\",\"props\":{},\"url\":\"https://community.f5.com/tag/design\"}}})":{"__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\":[],\"name\":\"TagPage\",\"props\":{},\"url\":\"https://community.f5.com/tag/design\"}}})":{"__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\":\"1743097590143\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1743097590143"}],"cachedText({\"lastModified\":\"1743097590143\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/OverflowNav\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1743097590143"}],"cachedText({\"lastModified\":\"1743097590143\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageView/MessageViewInline\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageView/MessageViewInline-1743097590143"}],"cachedText({\"lastModified\":\"1743097590143\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/Pager/PagerLoadMore\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1743097590143"}],"cachedText({\"lastModified\":\"1743097590143\",\"locale\":\"en-US\",\"namespaces\":[\"components/customComponent/CustomComponent\"]})":[{"__ref":"CachedAsset:text:en_US-components/customComponent/CustomComponent-1743097590143"}],"cachedText({\"lastModified\":\"1743097590143\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1743097590143"}],"cachedText({\"lastModified\":\"1743097590143\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1743097590143"}],"cachedText({\"lastModified\":\"1743097590143\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1743097590143"}],"cachedText({\"lastModified\":\"1743097590143\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTime\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTime-1743097590143"}],"cachedText({\"lastModified\":\"1743097590143\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeIcon\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1743097590143"}],"cachedText({\"lastModified\":\"1743097590143\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageUnreadCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageUnreadCount-1743097590143"}],"cachedText({\"lastModified\":\"1743097590143\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageViewCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageViewCount-1743097590143"}],"cachedText({\"lastModified\":\"1743097590143\",\"locale\":\"en-US\",\"namespaces\":[\"components/kudos/KudosCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/kudos/KudosCount-1743097590143"}],"cachedText({\"lastModified\":\"1743097590143\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRepliesCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRepliesCount-1743097590143"}],"cachedText({\"lastModified\":\"1743097590143\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1743097590143"}]},"CachedAsset:pages-1742464216017":{"__typename":"CachedAsset","id":"pages-1742464216017","value":[{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.MvpProgram","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/mvp-program","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.AdvocacyProgram","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/advocacy-program","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"HowDoI.GetHelp.NonCustomer","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/non-customer","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"HowDoI.GetHelp.F5Customer","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/f5-customer","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"HowDoI.GetInvolved","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"HowDoI.Learn","type":"COMMUNITY","urlPath":"/c/how-do-i/learn","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1739501996000,"localOverride":null,"page":{"id":"Test","type":"CUSTOM","urlPath":"/custom-test-2","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"MaintenancePage","type":"COMMUNITY","urlPath":"/maintenance","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"HowDoI.GetHelp.Community","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/community","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.ContributeCode","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/contribute-code","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"HowDoI.Learn.AboutIrules","type":"COMMUNITY","urlPath":"/c/how-do-i/learn/about-irules","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"HowDoI.GetHelp.F5Support","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/f5-support","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"HealthCheckPage","type":"COMMUNITY","urlPath":"/health","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"HowDoI.GetHelp","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"HowDoI.GetHelp.SecurityIncident","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/security-incident","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742464216017,"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"},"CachedAsset:theme:customTheme1-1742464215566":{"__typename":"CachedAsset","id":"theme:customTheme1-1742464215566","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-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1743097590143","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1743097590143","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/tags/TagPage-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-pages/tags/TagPage-1743097590143","value":{"tagPageTitle":"Tag:\"{tagName}\" | {communityTitle}","tagPageForNodeTitle":"Tag:\"{tagName}\" in \"{title}\" | {communityTitle}","name":"Tags Page","tag":"Tag: {tagName}"},"localOverride":false},"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"},"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}},"tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"shortTitle":"Technical Articles","tagPolicies":{"__typename":"TagPolicies","canSubscribeTagOnNode":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.labels.action.corenode.subscribe_labels.allow.accessDenied","key":"error.lithium.policies.labels.action.corenode.subscribe_labels.allow.accessDenied","args":[]}},"canManageTagDashboard":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.labels.action.corenode.admin_labels.allow.accessDenied","key":"error.lithium.policies.labels.action.corenode.admin_labels.allow.accessDenied","args":[]}}}},"CachedAsset:quilt:f5.prod:pages/tags/TagPage:board:TechnicalArticles-1743097589895":{"__typename":"CachedAsset","id":"quilt:f5.prod:pages/tags/TagPage:board:TechnicalArticles-1743097589895","value":{"id":"TagPage","container":{"id":"Common","headerProps":{"removeComponents":["community.widget.bannerWidget"],"__typename":"QuiltContainerSectionProps"},"items":[{"id":"tag-header-widget","layout":"ONE_COLUMN","bgColor":"var(--lia-bs-white)","showBorder":"BOTTOM","sectionEditLevel":"LOCKED","columnMap":{"main":[{"id":"tags.widget.TagsHeaderWidget","__typename":"QuiltComponent"}],"__typename":"OneSectionColumns"},"__typename":"OneColumnQuiltSection"},{"id":"messages-list-for-tag-widget","layout":"ONE_COLUMN","columnMap":{"main":[{"id":"messages.widget.messageListForNodeByRecentActivityWidget","props":{"viewVariant":{"type":"inline","props":{"useUnreadCount":true,"useViewCount":true,"useAuthorLogin":true,"clampBodyLines":3,"useAvatar":true,"useBoardIcon":false,"useKudosCount":true,"usePreviewMedia":true,"useTags":false,"useNode":true,"useNodeLink":true,"useTextBody":true,"truncateBodyLength":-1,"useBody":true,"useRepliesCount":true,"useSolvedBadge":true,"timeStampType":"conversation.lastPostingActivityTime","useMessageTimeLink":true,"clampSubjectLines":2}},"panelType":"divider","useTitle":false,"hideIfEmpty":false,"pagerVariant":{"type":"loadMore"},"style":"list","showTabs":true,"tabItemMap":{"default":{"mostRecent":true,"mostRecentUserContent":false,"newest":false},"additional":{"mostKudoed":true,"mostViewed":true,"mostReplies":false,"noReplies":false,"noSolutions":false,"solutions":false}}},"__typename":"QuiltComponent"}],"__typename":"OneSectionColumns"},"__typename":"OneColumnQuiltSection"}],"__typename":"QuiltContainer"},"__typename":"Quilt"},"localOverride":false},"CachedAsset:quiltWrapper:f5.prod:Common:1742464128649":{"__typename":"CachedAsset","id":"quiltWrapper:f5.prod:Common:1742464128649","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-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1743097590143","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-1742464231680":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_MetaNav-en-1742464231680","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-1742464231680":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_Footer-en-1742464231680","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-1742464231680":{"__typename":"CachedAsset","id":"component:custom.widget.Tag_Manager_Helper-en-1742464231680","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-1742464231680":{"__typename":"CachedAsset","id":"component:custom.widget.Consent_Blackbar-en-1742464231680","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-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1743097590143","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagsHeaderWidget-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagsHeaderWidget-1743097590143","value":{"tag":"{tagName}","topicsCount":"{count} {count, plural, one {Topic} other {Topics}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1743097590143","value":{"title@userScope:other":"Recent Content","title@userScope:self":"Contributions","title@board:FORUM@userScope:other":"Recent Discussions","title@board:BLOG@userScope:other":"Recent Blogs","emptyDescription":"No content to show","MessageListForNodeByRecentActivityWidgetEditor.nodeScope.label":"Scope","title@instance:1706288370055":"Content Feed","title@instance:1743095186784":"Most Recent Updates","title@instance:1704317906837":"Content Feed","title@instance:1743095018194":"Most Recent Updates","title@instance:1702668293472":"Community Feed","title@instance:1743095117047":"Most Recent Updates","title@instance:1704319314827":"Blog Feed","title@instance:1743095235555":"Most Recent Updates","title@instance:1704320290851":"My Contributions","title@instance:1703720491809":"Forum Feed","title@instance:1743095311723":"Most Recent Updates","title@instance:1703028709746":"Group Content Feed","title@instance:VTsglH":"Content Feed"},"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}}},"Conversation:conversation:279637":{"__typename":"Conversation","id":"conversation:279637","topic":{"__typename":"TkbTopicMessage","uid":279637},"lastPostingActivityTime":"2011-11-22T12:13:42.000-08:00","solved":false},"User:user:171720":{"__typename":"User","uid":171720,"login":"Lori_MacVittie","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-10.svg?time=0"},"id":"user:171720"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctMTQyM2k4M0M2NzcwMDdFOUZERDkw?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctMTQyM2k4M0M2NzcwMDdFOUZERDkw?revision=1","title":"0EM1T000001MsbO.png","associationType":"BODY","width":1106,"height":958,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctMTU2MTlpREI4NkJERjY4RjA4OUQ5Ng?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctMTU2MTlpREI4NkJERjY4RjA4OUQ5Ng?revision=1","title":"0EM1T000001MsbT.png","associationType":"BODY","width":1106,"height":958,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctMTQ5NTJpRTYwNjEwNzgzNzNFRDBFRg?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctMTQ5NTJpRTYwNjEwNzgzNzNFRDBFRg?revision=1","title":"0EM1T000001MsbY.png","associationType":"BODY","width":1369,"height":999,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctNDMwNWlFRjc1NzBGMDc0QThENzIz?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctNDMwNWlFRjc1NzBGMDc0QThENzIz?revision=1","title":"0151T000003d5LNQAY.png","associationType":"BODY","width":16,"height":16,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctMTQ0NTVpRDBGRDZERkQwNTUyODIyQQ?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctMTQ0NTVpRDBGRDZERkQwNTUyODIyQQ?revision=1","title":"0151T000003d5LQQAY.png","associationType":"BODY","width":16,"height":16,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctNTk0MGk0QzZFRTUyN0U2RjVENDlG?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctNTk0MGk0QzZFRTUyN0U2RjVENDlG?revision=1","title":"0151T000003d5LCQAY.png","associationType":"BODY","width":16,"height":16,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctMTE0NDVpRUNBOTM1N0YzRTMwMjFEQQ?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctMTE0NDVpRUNBOTM1N0YzRTMwMjFEQQ?revision=1","title":"0151T000003d5LSQAY.png","associationType":"BODY","width":16,"height":16,"altText":null},"TkbTopicMessage:message:279637":{"__typename":"TkbTopicMessage","subject":"The Full-Proxy Data Center Architecture","conversation":{"__ref":"Conversation:conversation:279637"},"id":"message:279637","revisionNum":1,"uid":279637,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:171720"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":4594},"postTime":"2011-11-21T04:04:00.000-08:00","lastPublishTime":"2011-11-21T04:04:00.000-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Why a full-proxy architecture is important to both infrastructure and data centers. \n\n In the early days of load balancing and application delivery there was a lot of confusion about proxy-based architectures and in particular the definition of a full-proxy architecture. Understanding what a full-proxy is will be increasingly important as we continue to re-architect the data center to support a more mobile, virtualized infrastructure in the quest to realize IT as a Service. \n\n THE FULL-PROXY PLATFORM \n\n The reason there is a distinction made between “proxy” and “full-proxy” stems from the handling of connections as they flow through the device. All proxies sit between two entities – in the Internet age almost always “client” and “server” – and mediate connections. While all full-proxies are proxies, the converse is not true. Not all proxies are full-proxies and it is this distinction that needs to be made when making decisions that will impact the data center architecture. \n\n   \n\n A full-proxy maintains two separate session tables – one on the client-side, one on the server-side. There is effectively an “air gap” isolation layer between the two internal to the proxy, one that enables focused profiles to be applied specifically to address issues peculiar to each “side” of the proxy. Clients often experience higher latency because of lower bandwidth connections while the servers are generally low latency because they’re connected via a high-speed LAN. The optimizations and acceleration techniques used on the client side are far different than those on the LAN side because the issues that give rise to performance and availability challenges are vastly different. \n\n A full-proxy, with separate connection handling on either side of the “air gap”, can address these challenges. A proxy, which may be a full-proxy but more often than not simply uses a buffer-and-stitch methodology to perform connection management, cannot optimally do so. A typical proxy buffers a connection, often through the TCP handshake process and potentially into the first few packets of application data, but then “stitches” a connection to a given server on the back-end using either layer 4 or layer 7 data, perhaps both. The connection is a single flow from end-to-end and must choose which characteristics of the connection to focus on – client or server – because it cannot simultaneously optimize for both. \n\n The second advantage of a full-proxy is its ability to perform more tasks on the data being exchanged over the connection as it is flowing through the component. Because specific action must be taken to “match up” the connection as its flowing through the full-proxy, the component can inspect, manipulate, and otherwise modify the data before sending it on its way on the server-side. This is what enables termination of SSL, enforcement of security policies, and performance-related services to be applied on a per-client, per-application basis. \n\n This capability translates to broader usage in data center architecture by enabling the implementation of an application delivery tier in which operational risk can be addressed through the enforcement of various policies. In effect, we’re created a full-proxy data center architecture in which the application delivery tier as a whole serves as the “full proxy” that mediates between the clients and the applications. \n\n   \n\n THE FULL-PROXY DATA CENTER ARCHITECTURE \n\n A full-proxy data center architecture installs a digital \"air gap” between the client and applications by serving as the aggregation (and conversely disaggregation) point for services. Because all communication is funneled through virtualized applications and services at the application delivery tier, it serves as a strategic point of control at which delivery policies addressing operational risk (performance, availability, security) can be enforced. \n\n A full-proxy data center architecture further has the advantage of isolating end-users from the volatility inherent in highly virtualized and dynamic environments such as cloud computing . It enables solutions such as those used to overcome limitations with virtualization technology, such as those encountered with pod-architectural constraints in VMware View deployments. Traditional access management technologies, for example, are tightly coupled to host names and IP addresses. In a highly virtualized or cloud computing environment, this constraint may spell disaster for either performance or ability to function, or both.  By implementing access management in the application delivery tier – on a full-proxy device – volatility is managed through virtualization of the resources, allowing the application delivery controller to worry about details such as IP address and VLAN segments, freeing the access management solution to concern itself with determining whether this user on this device from that location is allowed to access a given resource. \n\n Basically, we’re taking the concept of a full-proxy and expanded it outward to the architecture. Inserting an “application delivery tier” allows for an agile, flexible architecture more supportive of the rapid changes today’s IT organizations must deal with. \n\n Such a tier also provides an effective means to combat modern attacks. Because of its ability to isolate applications, services, and even infrastructure resources, an application delivery tier improves an organizations’ capability to withstand the onslaught of a concerted DDoS attack. The magnitude of difference between the connection capacity of an application delivery controller and most infrastructure (and all servers) gives the entire architecture a higher resiliency in the face of overwhelming connections. This ensures better availability and, when coupled with virtual infrastructure that can scale on-demand when necessary, can also maintain performance levels required by business concerns. \n\n A full-proxy data center architecture is an invaluable asset to IT organizations in meeting the challenges of volatility both inside and outside the data center. \n\n   \n\n \n Related blogs & articles: \n\n  The Concise Guide to Proxies   At the Intersection of Cloud and Control…  Cloud Computing and the Truth About SLAs IT Services: Creating Commodities out of Complexity What is a Strategic Point of Control Anyway? The Battle of Economy of Scale versus Control and Flexibility F5 Friday: When Firewalls Fail…   F5 Friday: Platform versus Product \n\n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"6593","kudosSumWeight":1,"repliesCount":1,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctMTQyM2k4M0M2NzcwMDdFOUZERDkw?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctMTU2MTlpREI4NkJERjY4RjA4OUQ5Ng?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctMTQ5NTJpRTYwNjEwNzgzNzNFRDBFRg?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctNDMwNWlFRjc1NzBGMDc0QThENzIz?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDU","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctMTQ0NTVpRDBGRDZERkQwNTUyODIyQQ?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDY","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctNTk0MGk0QzZFRTUyN0U2RjVENDlG?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDc","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzk2MzctMTE0NDVpRUNBOTM1N0YzRTMwMjFEQQ?revision=1\"}"}}],"totalCount":7,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:276624":{"__typename":"Conversation","id":"conversation:276624","topic":{"__typename":"TkbTopicMessage","uid":276624},"lastPostingActivityTime":"2016-08-26T12:39:37.000-07:00","solved":false},"User:user:173160":{"__typename":"User","uid":173160,"login":"ChrisMutzel_151","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-3.svg?time=0"},"id":"user:173160"},"TkbTopicMessage:message:276624":{"__typename":"TkbTopicMessage","subject":"F5 in AWS Part 1 - AWS Networking Basics","conversation":{"__ref":"Conversation:conversation:276624"},"id":"message:276624","revisionNum":1,"uid":276624,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:173160"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":4286},"postTime":"2015-07-01T13:50:00.000-07:00","lastPublishTime":"2015-07-01T13:50:00.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Updated for Current Versions and Documentation \n\n Part 1 : AWS Networking Basics Part 2: Running BIG-IP in an EC2 Virtual Private Cloud Part 3: Advanced Topologies and More on Highly-Available Services Part 4: Orchestrating BIG-IP Application Services with Open-Source Tools Part 5: Cloud-init, Single-NIC, and Auto Scale Out of BIG-IP in v12 \n\n If you work in IT, and you haven’t been living under a rock, then you have likely heard of Amazon Web Services (AWS).  There has been a substantial increase in the maturity and stability of the AWS Elastic Compute Cloud (EC2), but you are wondering – can I continue to leverage F5 services in AWS?  In this series of blog posts, we will discuss the how and why of running F5 BIG-IP in EC2.  In this specific article, we’ll start with the basics of the AWS EC2 and Virtual Private Cloud (VPC).  Later in the series, we will discuss some of the considerations associated with running BIG-IP as compute instance in this environment, we’ll outline the best deployment models for your application in EC2, and how these deployment models can be automated using open-source tools. \n\n Note: AWS uses the terms \"public\" and \"private\" to refer to what F5 Networks has typically referred to as \"external\" and \"internal\" respectively.  We will use this terms interchangeably. \n\n First, what is AWS? If you have read the story, you will know that the EC2 project began with an internal interest at Amazon to move away from messy, multi-tenant networks using VLANs for segregation.  Instead, network engineers at Amazon wanted to build an entirely IP-based architecture.  This vision morphed into the universe of application services available today. Of course, building multi-tenant, purely L3 networks at massive scale had implications for both security and redundancy (we’ll get to this later).  Today, EC2 enables users to run applications and services on top of virtualized network, storage, and compute infrastructure, where hosts are deployed in the form of Amazon Machine Images (AMIs).  These AMIs can either be private to the user or launched from the public AWS marketplace.  Hosts can be added to elastic load balancing (ELB) groups and associated with publicly accessible IPs to implement a simple horizontal model for availability. \n\n AWS became truly relevant for the enterprise with the introduction of the Virtual Private Cloud service.  VPCs enabled users to build virtual private networks at the IP layer.  These private networks can be connected to on-premise configurations by way of a VPN Gateway, or connected to the internet via an Internet Gateway.  When deploying hosts within a VPC, the user has a significant amount of control over how each host is attached to the network. For example, a host can be attached to multiple networks and given several public or private IPs on one or multiple interfaces.  Further, users can control many of the security aspects they are used to configuring in an on-premise environment (albeit in a slightly different way), including network ACLs, routing, simple firewalling, DHCP options, etc.  Lets talk about these and other important EC2 aspects and try to understand how they affect our application deployment strategy. \n\n L2 Restrictions \n\n As we mentioned above, one of the design goals of AWS was to remove layer 2 networking.  This is a worthy accomplishment but we lose access to certain useful protocols, including ARP (and gratuitious ARP), broadcast and multi-cast groups, 802.1Q tagging.  We can no longer use VLANs for some availability models, for quality of service management, or for tenant isolation. \n\n Network Interfaces \n\n For larger topologies, one of the largest impacts given the removal of 802.1Q protocol support is the number of subnets we can attach to a node in the network. Because in AWS each interface is attached as a layer 3 endpoint, we must add an interface for each subnet.  This contrasts with traditional networks, where you can add VLANs to your trunk for each subnet via tagging. Even though we're in a virtual world, the number of virtual network interfaces (or Elastic Network Interfaces (ENIs) in AWS terminology) is also limited according to the EC2 instance size. Together, the limits on number of interfaces and mapping between interface and subnet effectively limit the number of directly connected networks we can attach to a device (like BIG-IP, for example). \n\n IP Addressing \n\n AWS offers two kinds of globally routable IP address; these are “Public IP Addresses” and “Elastic IP Address”.  In the table below, we outlined some of the differences between these two types of IP addresses.  You can probably figure out for yourself why we will want to use Elastic IPs with BIG-IP.  Like interfaces, AWS limits the number of IPs in several ways, including the number of IPs that can be attached to an interface and the number of elastic IPs per AWS account. \n\n Table 1: Differences between Public and Elastic IP Addresses \n\n \n   \n \n Public IP \n \n Elastic IP \n \n Released on device termination/disassociation \n \n YES \n \n NO \n \n Assignable to secondary interfaces \n \n NO \n \n YES \n \n Can be associated after launch \n \n NO \n \n YES \n \n\n   \n\n Amazon provides more information on public and elastic IP addresses here: \n\n http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-instance-addressing.html#concepts-public-addresses \n\n Each interface on an EC2 instance is given a private IP address.   This IP address is routable locally through your subnet and assigned from the address range associated with the subnet to which your interface is attached. Multiple private secondary IP addresses can be attached to an interface, and is a useful technique for creating more complex topologies.  \n\n The number of interfaces and private IPs per interface within an Amazon VPC are listed here: \n\n http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI \n\n NAT Instances, Subnets and Routing \n\n When creating a VPC using the wizard available in the AWS VPC web portal, several default configurations are possible.  One of these configurations is “VPC with Public and Private subnets”.  In this configuration, what if the instances on our private subnet wish to access the outside world? Because we cannot attach public or elastic IP address to instances within the private subnet, we must use NAT provided by AWS.  Like BIG-IP and other network devices in EC2, the NAT instance will live as a compute node within your VPC.  This is good way to allow outbound traffic from your internal servers, but to prevent those servers from receiving inbound traffic. \n\n When you create subnets manually or through the VPC wizard, you’ll note that each subnet has an associated routing table. These route tables may be updated to control traffic flow between instances and subnets in your VPC. \n\n Regions and Availability Zones \n\n We know quite a few number of people who have been confused by the concept of availabilty zones in EC2.  To put it clearly, an availabilty zone is a physically isolated datacenter in a region.  Regions may contain mulitple availability zones.  Availabilty zones run on different networking and storage infrastructure, and depend on seperate power supplies and internet connections. Striping your application deployments across availability zones is a great way to provide redundancy and, perhaps a hot standby, but please note that these are not the same thing.  Amazon does not mirror any data between zones on behalf of the customer.  While VPCs can span availability zones, subnets may not. \n\n To close this blog post, we are fortunate enough to get a video walk through from Vladimir Bojkovic, Solution Architect at F5 Networks.  He shows how to create a VPC with internal and external subnets as a practical demonstration of the concepts we discussed above. \n\n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"8127","kudosSumWeight":2,"repliesCount":4,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:280005":{"__typename":"Conversation","id":"conversation:280005","topic":{"__typename":"TkbTopicMessage","uid":280005},"lastPostingActivityTime":"2013-06-17T14:48:15.000-07:00","solved":false},"User:user:56738":{"__typename":"User","uid":56738,"login":"ltwagnon","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/images/dS01NjczOC0xNjM3OGk3QkQ0M0UxRDAzRDEzMDg3"},"id":"user:56738"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAwMDUtODg3MGk3M0M2QkNDRjJDQkFBNTRE?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAwMDUtODg3MGk3M0M2QkNDRjJDQkFBNTRE?revision=1","title":"0151T000003d5jRQAQ.jpg","associationType":"BODY","width":611,"height":501,"altText":null},"TkbTopicMessage:message:280005":{"__typename":"TkbTopicMessage","subject":"Routing traffic by URI using iRule","conversation":{"__ref":"Conversation:conversation:280005"},"id":"message:280005","revisionNum":1,"uid":280005,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:56738"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":4251},"postTime":"2013-05-01T06:00:00.000-07:00","lastPublishTime":"2013-05-01T06:00:00.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" The DevCentral team recently developed a solution for routing traffic to a specific server based on the URI path.  A BIG-IP Local Traffic Manager (LTM) sits between the client and two servers to load balance the traffic for those servers. \n\n   \n\n The Challenge: \n\n When a user conducts a search on a website and is directed to one of the servers, the search information is cached on that server.  If another user searches for that same data but the LTM load balances to the other server, the cached data from the first server does him no good.  So to solve this caching problem, the customer wants traffic that contains a specific search parameter to be routed to the second server (as long as the server is available).  Specifically in this case, when a user loads a page and the URI starts with /path/* that traffic should be sent to Server_2. \n\n The picture below shows a representation of what the customer wants to accomplish: \n\n   \n\n \n\n   \n\n The Solution: \n\n So, the question becomes: How does the customer ensure all /path/* traffic is sent to a specific server?  Well, you guessed it...the ubiquitous and loveable iRule!  Everyone had a pretty good idea an iRule would be used to solve this problem, but what does that iRule look like?  Well, here it is!! \n\n when HTTP_REQUEST { \n\n if { [string tolower [HTTP::path]] starts_with \"/path/\" } { \n\n persist none \n\n set pm [lsearch -inline [active_members -list <pool name>] x.x.x.x*] \n\n catch { pool <pool name> member [lindex $pm 0] [lindex $pm 1] } \n\n } \n\n } \n\n   \n\n Let's talk through the specifics of this solution... \n\n For efficiency, start by checking the least likely condition.  If an HTTP_REQUEST comes in, immediately check for the \"/path/\" string. Keep in mind the \"string tolower\" command on the HTTP::path before the comparison to \"/path/\" to ensure the cases match correctly. Also, notice the use of HTTP::path instead of the full URI for the comparison...there's no need to use the full URI for this check. \n\n Next, turn off persistence just in case another profile or iRule is forcing the connection to persist to a place other than the beloved Server_2. \n\n Then, search all active members in the pool for the Server_2 IP address and port. The \"lsearch -inline\" ensures the matching value is returned instead of just the index. The \"active_members -list\" is used to ensure we get a list of IP addresses and ports, not just the number of active members. Note the asterisk behind the IP address in the search command...this is needed to ensure the port number is included in the search. Based on the searches, the resulting values are set in a variable called \"pm\". \n\n Next, use the catch command to stop any TCL errors from causing problems. Because we are getting the active members list, it's possible that the pool member we are trying to match is NOT active and therefore the pool member listed in the pool command may not be there...this is what might cause that TCL error. Then send the traffic to the correct pool member, which requires the IP and port. The astute observer and especially the one familiar with the output of \"active_members -list\" will notice that each pool member returned in the list is already pre-formatted in \"ip port\" format. However, just using the pm variable in the pool command returns a TCL error, likely because the pm variable is a single object instead of two unique objects. So, the lindex is used to pull out each element individually to avoid the TCL error. \n\n   \n\n Testing: \n\n Our team tested the iRule by adding it to a development site and then accessing several pages on that site.  We made sure the pages included \"/path/\" in the URIs!  We used tcpdump on the BIG-IP to capture the transactions (tcpdump -ni 0.0 -w/var/tmp/capture1.pcap tcp port 80 -s0) and then downloaded them locally and used Wireshark for analysis. Using these tools, we determined that all the \"/path/\" traffic routed to Server_2 and all other traffic was still balanced between Server_1 and Server_2.  So, the iRule worked correctly and it was ready for prime time! \n\n   \n\n   \n\n Special thanks to Jason Rahm and Joe Pruitt for their outstanding technical expertise and support in solving this challenge! \n\n   \n\n For more information on this iRule or any other LTM issues, you can submit questions/comments in the \"Comments\" section below, or you can contact the DevCentral team at https://devcentral.f5.com/s/community/contact-us. \n\n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"4541","kudosSumWeight":0,"repliesCount":5,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAwMDUtODg3MGk3M0M2QkNDRjJDQkFBNTRE?revision=1\"}"}}],"totalCount":1,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:280467":{"__typename":"Conversation","id":"conversation:280467","topic":{"__typename":"TkbTopicMessage","uid":280467},"lastPostingActivityTime":"2011-10-12T04:31:00.000-07:00","solved":false},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMzM3OGkyMkUyODAwNEI0MjNGODVD?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMzM3OGkyMkUyODAwNEI0MjNGODVD?revision=1","title":"0151T000003d8HyQAI.png","associationType":"BODY","width":381,"height":329,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMTIwODZpRUEyNTc1Q0VDNUEyMDRFNA?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMTIwODZpRUEyNTc1Q0VDNUEyMDRFNA?revision=1","title":"0151T000003d5CpQAI.png","associationType":"BODY","width":16,"height":16,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMTM0OTJpQjBDMkE3QjE1NkEyODFCMg?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMTM0OTJpQjBDMkE3QjE1NkEyODFCMg?revision=1","title":"0151T000003d5CqQAI.png","associationType":"BODY","width":16,"height":16,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMTQ5MDZpNDQ5OURFNkY0ODNDRDJFQg?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMTQ5MDZpNDQ5OURFNkY0ODNDRDJFQg?revision=1","title":"0151T000003d5CrQAI.png","associationType":"BODY","width":16,"height":16,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMTAxODBpRDJEMUNCREUxNERDQjFFRQ?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMTAxODBpRDJEMUNCREUxNERDQjFFRQ?revision=1","title":"0151T000003d5CsQAI.png","associationType":"BODY","width":16,"height":16,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMTYzOWk0OENBNTE2RTk5NDlGNzE4?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMTYzOWk0OENBNTE2RTk5NDlGNzE4?revision=1","title":"0151T000003d5CtQAI.png","associationType":"BODY","width":16,"height":16,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMTA2NjlpNENERkQ2NkM1Mzk0QjhFNQ?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMTA2NjlpNENERkQ2NkM1Mzk0QjhFNQ?revision=1","title":"0151T000003d5CyQAI.png","associationType":"BODY","width":16,"height":16,"altText":null},"TkbTopicMessage:message:280467":{"__typename":"TkbTopicMessage","subject":"Infrastructure Architecture: Whitelisting with JSON and API Keys","conversation":{"__ref":"Conversation:conversation:280467"},"id":"message:280467","revisionNum":1,"uid":280467,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:171720"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":3086},"postTime":"2011-10-12T04:31:00.000-07:00","lastPublishTime":"2011-10-12T04:31:00.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Application delivery infrastructure can be a valuable partner in architecting solutions …. AJAX and JSON have changed the way in which we architect applications, especially with respect to their ascendancy to rule the realm of integration, i.e. the API. Policies are generally focused on the URI, which has effectively become the exposed interface to any given application function. It’s REST-ful, it’s service-oriented, and it works well. Because we’ve taken to leveraging the URI as a basic building block, as the entry-point into an application, it affords the opportunity to optimize architectures and make more efficient the use of compute power available for processing. This is an increasingly important point, as capacity has become a focal point around which cost and efficiency is measured. By offloading functions to other systems when possible, we are able to increase the useful processing capacity of an given application instance and ensure a higher ratio of valuable processing to resources is achieved. The ability of application delivery infrastructure to intercept, inspect, and manipulate the exchange of data between client and server should not be underestimated. A full-proxy based infrastructure component can provide valuable services to the application architect that can enhance the performance and reliability of applications while abstracting functionality in a way that alleviates the need to modify applications to support new initiatives. AN EXAMPLE Consider, for example, a business requirement specifying that only certain authorized partners (in the integration sense) are allowed to retrieve certain dynamic content via an exposed application API. There are myriad ways in which such a requirement could be implemented, including requiring authentication and subsequent tokens to authorize access – likely the most common means of providing such access management in conjunction with an API. Most of these options require several steps, however, and interaction directly with the application to examine credentials and determine authorization to requested resources. This consumes valuable compute that could otherwise be used to serve requests. An alternative approach would be to provide authorized consumers with a more standards-based method of access that includes, in the request, the very means by which authorization can be determined. Taking a lesson from the credit card industry, for example, an algorithm can be used to determine the validity of a particular customer ID or authorization token. An API key, if you will, that is not stored in a database (and thus requires a lookup) but rather is algorithmic and therefore able to be verified as valid without needing a specific lookup at run-time. Assuming such a token or API key were embedded in the URI, the application delivery service can then extract the key, verify its authenticity using an algorithm, and subsequently allow or deny access based on the result. This architecture is based on the premise that the application delivery service is capable of responding with the appropriate JSON in the event that the API key is determined to be invalid. Such a service must therefore be network-side scripting capable. Assuming such a platform exists, one can easily implement this architecture and enjoy the improved capacity and resulting performance boost from the offload of authorization and access management functions to the infrastructure. 1. A request is received by the application delivery service. 2. The application delivery service extracts the API key from the URI and determines validity. 3. If the API key is not legitimate, a JSON-encoded response is returned. 4. If the API key is valid, the request is passed on to the appropriate web/application server for processing. Such an approach can also be used to enable or disable functionality within an application, including live-streams. Assume a site that serves up streaming content, but only to authorized (registered) users. When requests for that content arrive, the application delivery service can dynamically determine, using an embedded key or some portion of the URI, whether to serve up the content or not. If it deems the request invalid, it can return a JSON response that effectively “turns off” the streaming content, thereby eliminating the ability of non-registered (or non-paying) customers to access live content. Such an approach could also be useful in the event of a service failure; if content is not available, the application delivery service can easily turn off and/or respond to the request, providing feedback to the user that is valuable in reducing their frustration with AJAX-enabled sites that too often simply “stop working” without any kind of feedback or message to the end user. The application delivery service could, of course, perform other actions based on the in/validity of the request, such as directing the request be fulfilled by a service generating older or non-dynamic streaming content, using its ability to perform application level routing. The possibilities are quite extensive and implementation depends entirely on goals and requirements to be met. Such features become more appealing when they are, through their capabilities, able to intelligently make use of resources in various locations. Cloud-hosted services may be more or less desirable for use in an application, and thus leveraging application delivery services to either enable or reduce the traffic sent to such services may be financially and operationally beneficial. ARCHITECTURE is KEY The core principle to remember here is that ultimately infrastructure architecture plays (or can and should play) a vital role in designing and deploying applications today. With the increasing interest and use of cloud computing and APIs, it is rapidly becoming necessary to leverage resources and services external to the application as a means to rapidly deploy new functionality and support for new features. The abstraction offered by application delivery services provides an effective, cross-site and cross-application means of enabling what were once application-only services within the infrastructure. This abstraction and service-oriented approach reduces the burden on the application as well as its developers. The application delivery service is almost always the first service in the oft-times lengthy chain of services required to respond to a client’s request. Leveraging its capabilities to inspect and manipulate as well as route and respond to those requests allows architects to formulate new strategies and ways to provide their own services, as well as  leveraging existing and integrated resources for maximum efficiency, with minimal effort. Related blogs & articles:  HTML5 Going Like Gangbusters But Will Anyone Notice?   Web 2.0 Killed the Middleware Star  The Inevitable Eventual Consistency of Cloud Computing Let’s Face It: PaaS is Just SOA for Platforms Without the Baggage Cloud-Tiered Architectural Models are Bad Except When They Aren’t The Database Tier is Not Elastic The New Distribution of The 3-Tiered Architecture Changes Everything Sessions, Sessions Everywhere ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"7358","kudosSumWeight":0,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMzM3OGkyMkUyODAwNEI0MjNGODVD?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMTIwODZpRUEyNTc1Q0VDNUEyMDRFNA?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMTM0OTJpQjBDMkE3QjE1NkEyODFCMg?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMTQ5MDZpNDQ5OURFNkY0ODNDRDJFQg?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDU","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMTAxODBpRDJEMUNCREUxNERDQjFFRQ?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDY","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMTYzOWk0OENBNTE2RTk5NDlGNzE4?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDc","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA0NjctMTA2NjlpNENERkQ2NkM1Mzk0QjhFNQ?revision=1\"}"}}],"totalCount":7,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:288036":{"__typename":"Conversation","id":"conversation:288036","topic":{"__typename":"TkbTopicMessage","uid":288036},"lastPostingActivityTime":"2014-08-27T16:20:40.000-07:00","solved":false},"User:user:51154":{"__typename":"User","uid":51154,"login":"JRahm","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/images/dS01MTE1NC1uYzdSVFk?image-coordinates=0%2C0%2C1067%2C1067"},"id":"user:51154"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODgwMzYtMTQ0MWkzNDY4MTRDQTQ4RUIyOUJG?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODgwMzYtMTQ0MWkzNDY4MTRDQTQ4RUIyOUJG?revision=1","title":"0151T000003d498QAA.png","associationType":"BODY","width":504,"height":250,"altText":null},"TkbTopicMessage:message:288036":{"__typename":"TkbTopicMessage","subject":"Scheduling BIG-IP Configuration Backups via the GUI with an iApp","conversation":{"__ref":"Conversation:conversation:288036"},"id":"message:288036","revisionNum":1,"uid":288036,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:51154"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":3056},"postTime":"2011-08-16T14:45:00.000-07:00","lastPublishTime":"2011-08-16T14:45:00.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Beginning with BIG-IP version 11, the idea of templates has not only changed in amazing and powerful ways, it has been extended to be far more than just templates.  The replacement for templates is called iApp TM .  But to call the iApp TM just a template would be woefully inaccurate and narrow.  It does templates well, and takes the concept further by allowing you to re-enter a templated application and make changes.  Previously, deploying an application via a template was sort of like the Ron Popeil rotisserie: “Set it, and forget it!”  Once it was executed, the template process was over, it was up to you to track and potentially clean up all those objects.  Now, the application service you create based on an iApp TM template effectively “owns” all the objects it created, so any change to the deployment adds/changes/deletes objects as necessary.  The other exciting change from the template perspective is the idea of strictness.  Once an application service is configured, any object created that is owned by that service cannot be changed outside of the service itself.  This means that if you want to add a pool member, it must be done within the application service, not within the pool.  You can turn this off, but what a powerful protection of your services! \n Update for v11.2 - https://devcentral.f5.com/s/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1090565/Archiving-BIG-IP-Configurations-with-an-iApp-in-v112.aspx \n The Problem \n I received a request from one of our MVPs that he’d really like to be able to allow his users to schedule configuration backups without dropping to the command line.  Knowing that the iApp TM feature was releasing soon with version 11, I started to see how I might be able to coax a command line configuration from the GUI.  In training, I was told that “anything you can do in tmsh, you can do with an iApp TM .”  This is excellent, and the basis for why I think they are going to be incredibly popular for not only controlling and managing applications, but also for extending CLI functions to the GUI.  Anyway, so in order to schedule a configuration backup, I need: \n A backup script A cron job to call said script \n That’s really all there is to it. \n The Solution \n Thankfully, the background work is already done courtesy of a config backup codeshare entry by community user Colin Stubbs in the Advanced Design & Config Wiki.  I did have to update the following bigpipe lines from the script: \n \n bigpipe export oneline “${SCF_FILE}” to tmsh save /sys config one-line file “${SCF_FILE}” \n bigpipe export “${SCF_FILE}” to tmsh save /sys config file \"${SCF_FILE}\" \n bigpipe config save “${UCS_FILE}” passphrase “${UCS_PASSPHRASE}” to tmsh save /sys ucs \"${UCS_FILE}\" passphrase \"${UCS_PASSPHRASE}\" \n bigpipe config save “${UCS_FILE}” to tmsh save /sys ucs \"${UCS_FILE}\" \n \n Also, I created (according the script comments from the codeshare entry) a /var/local/bin directory to place the script and a /var/local/backups directory for the script to dump the backup files in.  These are optional and can be changed as necessary in your deployment, you’ll just need to update the script to reflect your file system preferences.  Now that I have everything I need to support a backup, I can move on to the iApp TM template configuration. \n iApp TM Components \n A template consists of three parts: implementation, presentation, and help.  You can create an empty template, or just start with presentation or help if you like. \n The implementation is tmsh script language, based on the Tcl language so loved by all of us iRulers.  Please reference the tmsh wiki for the available tmsh extensions to the Tcl language. The presentation is written with the Application Presentation Language, or APL, which is new and custom-built for templates.  It is defined on the APL page in the iApp TM wiki. The help is written in HTML, and is used to guide users in the use of the template. \n I’ll focus on the presentation first, and then the implementation.  I’ll forego the help section in this article. \n Presentation \n The reason I’m starting with the presentation section of the template is that the implementation section’s Tcl variables reflect the presentation methods naming conventions.  I want to accomplish a few things in the template presentation: \n Ask users for the frequency of backups (daily, weekly, monthly) If weekly, ask for the day of the week If monthly, ask for the day of the month and provide a warning about days 29-31 For all frequencies, ask for the hour and minute the backup should occur \n The APL code for this looks like this: \n \n \n \n section time_select { choice day_select display \"large\" { \"Daily\", \"Weekly\", \"Monthly\" } optional ( day_select == \"Weekly\" ) { choice dow_select display \"medium\" { \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" } } optional ( day_select == \"Monthly\" ) { message dom_warning \"The day of the month should be the 1st-28th. Selecting the 29th-31st will result in missed backups on some months.\" choice dom_select display \"medium\" tcl { for { set x 1 } { $x < 32 } { incr x } { append dom \"$x\\n\" } return $dom } } choice hr_select display \"medium\" tcl { for { set x 0 } { $x < 24 } { incr x} { append hrs \"$x\\n\" } return $hrs } choice min_select display \"medium\" tcl { for { set x 0 } { $x < 60 } { incr x } { append mins \"$x\\n\" } return $mins } } text { time_select \"Backup Schedule\" time_select.day_select \"Choose the frequency the backup should occur:\" time_select.dow_select \"Choose the day of the week the backup should occur:\" time_select.dom_warning \"WARNING: \" time_select.dom_select \"Choose the day of the month the backup should occur:\" time_select.hr_select \"Choose the hour the backup should occur:\" time_select.min_select \"Choose the minute the backup should occur:\" } \n \n \n A few things to point out.  First, the sections (which can’t be nested) provide a way to set apart functional differences in your form.  I only needed one here, but it’s very useful if I were to build on and add options for selecting a UCS or SCF format, or specifying a mail address for the backups to be mailed to.  Second, order matters.  The objects will be displayed in the template as you define them.  Third, the optional command allows me to hide questions that wouldn’t make sense given previous answers.  If you dig into some of the canned templates shipping with v11, you’ll also see another use case for the optional command.  Fourth, you can use Tcl commands to populate fields for you.  This can be generated data like I did above, or you can loop through configuration objects to present in the template as well.  Finally, the text section is where you define the language you want to appear with each of your objects.  The nomenclature here is section.variable.  To give you an idea what this looks like, here is a screenshot of a monthly backup configuration: \n \n Once my template (f5.archiving) is saved, I can configure it in the Application Services section by selecting the template.  At this point, I have a functioning presentation, but with no implementation, it’s effectively useless. \n Implementation \n Now that the presentation is complete, I can move on to an implementation.  I need to do a couple things in the implementation: \n Grab the data entered into the application service Convert the day of week information from long name to the appropriate 0-6 (or 1-7) number for cron Use that data to build a cron file (statically assigned at this point to /etc/cron.d/f5backups) \n Here is the implementation section: \n \n array set dow_map {   Sunday 0   Monday 1   Tuesday 2   Wednesday 3   Thursday 4   Friday 5   Saturday 6 } \n set hr $::time_select__hr_select set min $::time_select__min_select \n set infile [open \"/etc/cron.d/f5backups\" \"w\" \"0755\"] \n puts $infile \"SHELL=\\/bin\\/bash\" puts $infile \"PATH=\\/sbin:\\/bin:\\/usr\\/sbin:\\/usr\\/bin\" puts $infile \"#MAILTO=user@somewhere\" puts $infile \"HOME=\\/var\\/tmp\\/\" if { $::time_select__day_select == \"Daily\" } {   puts $infile \"$min $hr * * * root \\/bin\\/bash \\/var\\/local\\/bin\\/f5backup.sh 1>\\/var\\/tmp\\/f5backup.log 2>\\&1\" } elseif { $::time_select__day_select == \"Weekly\" } {     puts $infile \"$min $hr * * $dow_map($::time_select__dow_select) root \\/bin\\/bash \\/var\\/local\\/bin\\/f5backup.sh 1>\\/var\\/tmp\\/f5backup.log 2>\\&1\" } elseif { $::time_select__day_select == \"Monthly\" } {     puts $infile \"$min $hr $::time_select__dom_select * * root \\/bin\\/bash \\/var\\/local\\/bin\\/f5backup.sh 1>\\/var\\/tmp\\/f5backup.log 2>\\&1\" } \n close $infile \n \n A few notes: \n The dow_map array is to convert the selected day (ie, Saturday) to a number for cron (6). The variables in the implementation section reference the data supplied from the presentation like so:\n $::<section>__<presentation variable name> (Note the double underscore between them.  As such, DO NOT use double underscores in your presentation variables) \n tmsh special characters need to be escaped if you’re using them for strings. \n A succesful configuration of the application service results in this file configuration for /etc/cron.d/f5backups: \n \n SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin #MAILTO=user@somewhere HOME=/var/tmp/ 54 15 * * * root /bin/bash /var/local/bin/f5backup.sh 1>/var/tmp/f5backup.log 2>&1 \n \n So this backup is scheduled to run daily at 15:54.  This is confirmed with this directory listing on my BIG-IP: \n \n [root@golgotha:Active] bin # ls -las /var/local/backups total 2168    8 drwx------ 2 root root    4096 Aug 16 15:54 .    8 drwxr-xr-x 9 root root    4096 Aug  3 14:44 .. 1076 -rw-r--r-- 1 root root 1091639 Aug 15 15:54 f5backup-golgotha.test.local-20110815155401.tar.bz2 1076 -rw-r--r-- 1 root root 1092259 Aug 16 15:54 f5backup-golgotha.test.local-20110816155401.tar.bz2 \n \n Conclusion \n This is just scratching the surface of what can be done with the new iApp TM feature in v11.  I didn’t even cover the ability to use presentation and implementation libraries, but that will be covered in due time.  If you’re impatient, there are already several examples (including this one here) in the codeshare. \n   \n Related Articles \n F5 DevCentral > Community > Group Details - iApp iApp Wiki Home - DevCentral Wiki F5 Agility 2011 - James Hendergart on iApp iApp Codeshare - DevCentral Wiki iApp Lab 5 - Priority Group Activation - DevCentral Wiki iApp Template Development Tips and Techniques - DevCentral Wiki Lori MacVittie - iApp ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"11068","kudosSumWeight":0,"repliesCount":13,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODgwMzYtMTQ0MWkzNDY4MTRDQTQ4RUIyOUJG?revision=1\"}"}}],"totalCount":1,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:287880":{"__typename":"Conversation","id":"conversation:287880","topic":{"__typename":"TkbTopicMessage","uid":287880},"lastPostingActivityTime":"2014-12-18T03:22:00.000-08:00","solved":false},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtMTI4OTFpQjlERjM3MTg0RjM1NjQ2RA?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtMTI4OTFpQjlERjM3MTg0RjM1NjQ2RA?revision=1","title":"0151T000003d7gqQAA.png","associationType":"BODY","width":319,"height":205,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtMTM3NzZpODkyQUIwRjU4RDZDNEFGNQ?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtMTM3NzZpODkyQUIwRjU4RDZDNEFGNQ?revision=1","title":"0151T000003d7grQAA.png","associationType":"BODY","width":404,"height":236,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtMTAyMThpQjQ1QzY4MTJGQkVDOUI4Qw?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtMTAyMThpQjQ1QzY4MTJGQkVDOUI4Qw?revision=1","title":"0151T000003d7gsQAA.png","associationType":"BODY","width":38,"height":39,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtNjE4MWk0RjFGQkYwNEVDN0UxNjQz?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtNjE4MWk0RjFGQkYwNEVDN0UxNjQz?revision=1","title":"0151T000003d5TMQAY.png","associationType":"BODY","width":40,"height":38,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtMTEzMDdpM0Q2M0Q3QTQwQjZENjIyOQ?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtMTEzMDdpM0Q2M0Q3QTQwQjZENjIyOQ?revision=1","title":"0151T000003d5TLQAY.png","associationType":"BODY","width":37,"height":38,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtOTY2OGkyNkZFMUFDMzJBQ0QwQjA5?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtOTY2OGkyNkZFMUFDMzJBQ0QwQjA5?revision=1","title":"0151T000003d5TNQAY.png","associationType":"BODY","width":65,"height":48,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtMTY3NGk4QTAwQjYyMUFCMTE5NDcy?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtMTY3NGk4QTAwQjYyMUFCMTE5NDcy?revision=1","title":"0151T000003d5TQQAY.png","associationType":"BODY","width":39,"height":38,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtMTEyOTRpQkVFNjA5MEZDOEE4QTk1Ng?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtMTEyOTRpQkVFNjA5MEZDOEE4QTk1Ng?revision=1","title":"0151T000003d5TRQAY.png","associationType":"BODY","width":42,"height":38,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtNjY5Mmk2RDcxNTYwOUNGNEY3MTE1?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtNjY5Mmk2RDcxNTYwOUNGNEY3MTE1?revision=1","title":"0151T000003d5TSQAY.png","associationType":"BODY","width":41,"height":38,"altText":null},"TkbTopicMessage:message:287880":{"__typename":"TkbTopicMessage","subject":"Back to Basics: Health Monitors and Load Balancing","conversation":{"__ref":"Conversation:conversation:287880"},"id":"message:287880","revisionNum":1,"uid":287880,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:171720"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":2928},"postTime":"2012-11-21T05:52:00.000-08:00","lastPublishTime":"2012-11-21T05:52:00.000-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" #webperf #ado Because every connection counts \n\n One of the truisms of architecting highly available systems is that you never, ever want to load balance a request to a system that is down. Therefore, some sort of health (status) monitoring is required. For applications, that means not just pinging the network interface or opening a TCP connection, it means querying the application and verifying that the response is valid. \n\n This, obviously, requires the application to respond. And respond often. Best practices suggest determining availability every 5 seconds or so. That means every X seconds the load balancing service is going to open up a connection to the application and make a request. Just like a user would do. \n\n That adds load to the application. It consumes network, transport, application and (possibly) database resources. Resources that cannot be used to service customers. While the impact on a single application may appear trivial, it's not. Remember, as load increases performance decreases. And no matter how trivial it may appear, health monitoring is adding load to what may be an already heavily loaded application. \n\n \n\n But Lori, you may be thinking, you expound on the importance of monitoring and visibility all the time! Are you saying we shouldn't be monitoring applications?  \n\n Nope, not at all. Visibility is paramount, providing the actionable data necessary to enable highly dynamic, automated operations such as elasticity. Visibility through health-monitoring is a critical means of ensuring availability at both the local and global level. \n\n What we may need to do, however, is move from active to passive monitoring. \n\n PASSIVE MONITORING \n\n Passive monitoring, as the modifier suggests, is not an active process. The Load balancer does not open up connections nor query an application itself. Instead, it snoops on responses being returned to clients and from that infers the current status of the application. \n\n For example, if a request for content results in an HTTP error message, the load balancer can determine whether or not the application is available and capable of processing subsequent requests. If the load balancer is a BIG-IP, it can mark the service as \"down\" and invoke an active monitor to probe the application status as well as retrying the request to another available instance – insuring end-users do not see an error. \n\n Passive (inband) monitors are not binary. That is, they aren't simple \"on\" or \"off\" based on HTTP status codes. Such monitors can be configured to track the number of failures and evaluate failure rates against a configurable failure interval. When such thresholds are exceeded, the application can then be marked as \"down\". \n\n Passive monitors aren't restricted to availability status, either. They can also monitor for performance (response time). Failure to meet response time expectations results in a failure, and the application continues to be watched for subsequent failures. \n\n Passive monitors are, like most inline/inband technologies, transparent. They quietly monitor traffic and act upon that traffic without adding overhead to the process. \n\n Passive monitoring gives operations the visibility necessary to enable predictable performance and to meet or exceed user expectations with respect to uptime, without negatively impacting performance or capacity of the applications it is monitoring. \n\n   \n\n   \n\n \n         ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"3518","kudosSumWeight":1,"repliesCount":2,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtMTI4OTFpQjlERjM3MTg0RjM1NjQ2RA?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtMTM3NzZpODkyQUIwRjU4RDZDNEFGNQ?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtMTAyMThpQjQ1QzY4MTJGQkVDOUI4Qw?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtNjE4MWk0RjFGQkYwNEVDN0UxNjQz?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDU","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtMTEzMDdpM0Q2M0Q3QTQwQjZENjIyOQ?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDY","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtOTY2OGkyNkZFMUFDMzJBQ0QwQjA5?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDc","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtMTY3NGk4QTAwQjYyMUFCMTE5NDcy?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDg","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtMTEyOTRpQkVFNjA5MEZDOEE4QTk1Ng?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDk","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODc4ODAtNjY5Mmk2RDcxNTYwOUNGNEY3MTE1?revision=1\"}"}}],"totalCount":9,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:286177":{"__typename":"Conversation","id":"conversation:286177","topic":{"__typename":"TkbTopicMessage","uid":286177},"lastPostingActivityTime":"2009-07-30T04:07:59.000-07:00","solved":false},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMzE2OWlENjUwOEQ5ODA5NjNGNDMy?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMzE2OWlENjUwOEQ5ODA5NjNGNDMy?revision=1","title":"0151T000003d7kjQAA.jpg","associationType":"BODY","width":170,"height":170,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMTU5MzVpRkI5NjFBOTJCQzEyMzNBRg?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMTU5MzVpRkI5NjFBOTJCQzEyMzNBRg?revision=1","title":"0151T000003d7ujQAA.jpg","associationType":"BODY","width":447,"height":108,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMTA4MDBpREEyNzc5QTZCRTI3RTQwNw?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMTA4MDBpREEyNzc5QTZCRTI3RTQwNw?revision=1","title":"0151T000003d4HeQAI.png","associationType":"BODY","width":129,"height":129,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMTA1NzlpMEUyMzcxRDMwMjE0QjIwQQ?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMTA1NzlpMEUyMzcxRDMwMjE0QjIwQQ?revision=1","title":"0151T000003d4HfQAI.gif","associationType":"BODY","width":18,"height":18,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctNTMxNmlBOEM2RTdBQUQ3RDMxMTcx?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctNTMxNmlBOEM2RTdBQUQ3RDMxMTcx?revision=1","title":"0151T000003d4HmQAI.png","associationType":"BODY","width":16,"height":16,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMTI2NzFpNUQ1REUwNUJBMTlBQjE4RA?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMTI2NzFpNUQ1REUwNUJBMTlBQjE4RA?revision=1","title":"0151T000003d4HvQAI.gif","associationType":"BODY","width":16,"height":16,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMzQ3MWk3Rjk5MTAzNUNGM0FEODk4?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMzQ3MWk3Rjk5MTAzNUNGM0FEODk4?revision=1","title":"0151T000003d4HwQAI.png","associationType":"BODY","width":16,"height":16,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctNTQ4MmlGQzM0RDg1RjAyQTZDQ0Mw?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctNTQ4MmlGQzM0RDg1RjAyQTZDQ0Mw?revision=1","title":"0151T000003d4IgQAI.png","associationType":"BODY","width":16,"height":16,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMTMzNjBpMjA1REZBREVFOUNENUU1NA?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMTMzNjBpMjA1REZBREVFOUNENUU1NA?revision=1","title":"0151T000003d8I1QAI.jpg","associationType":"BODY","width":16,"height":16,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctNTMzNmk1MEQ1NTNEOTc0RTJDQjAx?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctNTMzNmk1MEQ1NTNEOTc0RTJDQjAx?revision=1","title":"0151T000003d8MMQAY.png","associationType":"BODY","width":16,"height":16,"altText":null},"TkbTopicMessage:message:286177":{"__typename":"TkbTopicMessage","subject":"What is server offload and why do I need it?","conversation":{"__ref":"Conversation:conversation:286177"},"id":"message:286177","revisionNum":1,"uid":286177,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:171720"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":2836},"postTime":"2009-06-17T04:07:37.000-07:00","lastPublishTime":"2009-06-17T04:07:37.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" One of the tasks of an enterprise architect is to design a framework atop which developers can implement and deploy applications consistently and easily. The consistency is important for internal business continuity and reuse; common objects, operations, and processes can be reused across applications to make development and integration with other applications and systems easier. Architects also often decide where functionality resides and design the base application infrastructure framework. Application server, identity management, messaging, and integration are all often a part of such architecture designs. Rarely does the architect concern him/herself with the network infrastructure, as that is the purview of “that group”; the “you know who I’m talking about” group. And for the most part there’s no need for architects to concern themselves with network-oriented architecture. Applications should not need to know on which VLAN they will be deployed or what their default gateway might be. But what architects might need to know – and probably should know – is whether the network infrastructure supports “server offload” of some application functions or not, and how that can benefit their enterprise architecture and the applications which will be deployed atop it.  WHAT IT IS Server offload is a generic term used by the networking industry to indicate some functionality designed to improve the performance or security of applications. We use the term “offload” because the functionality is “offloaded” from the server and moved to an application network infrastructure device instead. Server offload works because the application network infrastructure is almost always these days deployed in front of the web/application servers and is in fact acting as a broker (proxy) between the client and the server. Server offload is generally offered by load balancers and application delivery controllers. You can think of server offload like a relay race. The application network infrastructure device runs the first leg and then hands off the baton (the request) to the server. When the server is finished, the application network infrastructure device gets to run another leg, and then the race is done as the response is sent back to the client. There are basically two kinds of server offload functionality: Protocol processing offload Protocol processing offload includes functions like SSL termination and TCP optimizations. Rather than enable SSL communication on the web/application server, it can be “offloaded” to an application network infrastructure device and shared across all applications requiring secured communications. Offloading SSL to an application network infrastructure device improves application performance because the device is generally optimized to handle the complex calculations involved in encryption and decryption of secured data and web/application servers are not. TCP optimization is a little different. We say TCP session management is “offloaded” to the server but that’s really not what happens as obviously TCP connections are still opened, closed, and managed on the server as well. Offloading TCP session management means that the application network infrastructure is managing the connections between itself and the server in such a way as to reduce the total number of connections needed without impacting the capacity of the application. This is more commonly referred to as TCP multiplexing and it “offloads” the overhead of TCP connection management from the web/application server to the application network infrastructure device by effectively giving up control over those connections. By allowing an application network infrastructure device to decide how many connections to maintain and which ones to use to communicate with the server, it can manage thousands of client-side connections using merely hundreds of server-side connections. Reducing the overhead associated with opening and closing TCP sockets on the web/application server improves application performance and actually increases the user capacity of servers. TCP offload is beneficial to all TCP-based applications, but is particularly beneficial for Web 2.0 applications making use of AJAX and other near real-time technologies that maintain one or more connections to the server for its functionality. Protocol processing offload does not require any modifications to the applications. Application-oriented offload Application-oriented offload includes the ability to implement shared services on an application network infrastructure device. This is often accomplished via a network-side scripting capability, but some functionality has become so commonplace that it is now built into the core features available on application network infrastructure solutions. Application-oriented offload can include functions like cookie encryption/decryption, compression, caching, URI rewriting, HTTP redirection, DLP (Data Leak Prevention), selective data encryption, application security functionality, and data transformation. When network-side scripting is available, virtually any kind of pre or post-processing can be offloaded to the application network infrastructure and thereafter shared with all applications. Application-oriented offload works because the application network infrastructure solution is mediating between the client and the server and it has the ability to inspect and manipulate the application data. The benefits of application-oriented offload are that the services implemented can be shared across multiple applications and in many cases the functionality removes the need for the web/application server to handle a specific request. For example, HTTP redirection can be fully accomplished on the application network infrastructure device. HTTP redirection is often used as a means to handle application upgrades, commonly mistyped URIs, or as part of the application logic when certain conditions are met. Application security offload usually falls into this category because it is application – or at least application data – specific. Application security offload can include scanning URIs and data for malicious content, validating the existence of specific cookies/data required for the application, etc… This kind of offload improves server efficiency and performance but a bigger benefit is consistent, shared security across all applications for which the service is enabled. Some application-oriented offload can require modification to the application, so it is important to design such features into the application architecture before development and deployment. While it is certainly possible to add such functionality into the architecture after deployment, it is always easier to do so at the beginning. WHY YOU NEED IT Server offload is a way to increase the efficiency of servers and improve application performance and security. Server offload increases efficiency of servers by alleviating the need for the web/application server to consume resources performing tasks that can be performed more efficiently on an application network infrastructure solution. The two best examples of this are SSL encryption/decryption and compression. Both are CPU intense operations that can consume 20-40% of a web/application server’s resources. By offloading these functions to an application network infrastructure solution, servers “reclaim” those resources and can use them instead to execute application logic, serve more users, handle more requests, and do so faster. Server offload improves application performance by allowing the web/application server to concentrate on what it is designed to do: serve applications and putting the onus for performing ancillary functions on a platform that is more optimized to handle those functions. Server offload provides these benefits whether you have a traditional client-server architecture or have moved (or are moving) toward a virtualized infrastructure. Applications deployed on virtual servers still use TCP connections and SSL and run applications and therefore will benefit the same as those deployed on traditional servers.     I am wondering why not all websites enabling this great feature GZIP? 3 Really good reasons you should use TCP multiplexing SOA & Web 2.0: The Connection Management Challenge Understanding network-side scripting I am in your HTTP headers, attacking your application Infrastructure 2.0: As a matter of fact that isn't what it means ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"8771","kudosSumWeight":0,"repliesCount":1,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMzE2OWlENjUwOEQ5ODA5NjNGNDMy?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMTU5MzVpRkI5NjFBOTJCQzEyMzNBRg?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMTA4MDBpREEyNzc5QTZCRTI3RTQwNw?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMTA1NzlpMEUyMzcxRDMwMjE0QjIwQQ?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDU","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctNTMxNmlBOEM2RTdBQUQ3RDMxMTcx?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDY","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMTI2NzFpNUQ1REUwNUJBMTlBQjE4RA?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDc","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMzQ3MWk3Rjk5MTAzNUNGM0FEODk4?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDg","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctNTQ4MmlGQzM0RDg1RjAyQTZDQ0Mw?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDk","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctMTMzNjBpMjA1REZBREVFOUNENUU1NA?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDEw","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODYxNzctNTMzNmk1MEQ1NTNEOTc0RTJDQjAx?revision=1\"}"}}],"totalCount":10,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:279167":{"__typename":"Conversation","id":"conversation:279167","topic":{"__typename":"TkbTopicMessage","uid":279167},"lastPostingActivityTime":"2011-12-09T04:41:00.000-08:00","solved":false},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkxNjctNzk0MGkyQUUwOTVCNjRGQzQzNDU4?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkxNjctNzk0MGkyQUUwOTVCNjRGQzQzNDU4?revision=1","title":"0151T000003d5MBQAY.png","associationType":"BODY","width":240,"height":86,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkxNjctODU0OWk4NkVFMTlBNEJBNjRDQjQ2?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkxNjctODU0OWk4NkVFMTlBNEJBNjRDQjQ2?revision=1","title":"0151T000003d5MCQAY.png","associationType":"BODY","width":803,"height":425,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkxNjctNTk0MGk0QzZFRTUyN0U2RjVENDlG?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkxNjctNTk0MGk0QzZFRTUyN0U2RjVENDlG?revision=1","title":"0151T000003d5LCQAY.png","associationType":"BODY","width":16,"height":16,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkxNjctNzQ1NGkxODJDOUMxREQxRTZCMkUx?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkxNjctNzQ1NGkxODJDOUMxREQxRTZCMkUx?revision=1","title":"0151T000003d8TvQAI.png","associationType":"BODY","width":16,"height":16,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkxNjctNDE3MGlEOTMyRDQ3NEFEMDhCMjk5?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkxNjctNDE3MGlEOTMyRDQ3NEFEMDhCMjk5?revision=1","title":"0151T000003d8TdQAI.png","associationType":"BODY","width":16,"height":16,"altText":null},"TkbTopicMessage:message:279167":{"__typename":"TkbTopicMessage","subject":"F5 Friday: Load Balancing MySQL with F5 BIG-IP","conversation":{"__ref":"Conversation:conversation:279167"},"id":"message:279167","revisionNum":1,"uid":279167,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:171720"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":2761},"postTime":"2011-12-09T04:41:00.000-08:00","lastPublishTime":"2011-12-09T04:41:00.000-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Scaling MySQL just got a whole lot easier  load balancing MySQL – any database, really – is not a trivial task. Generally speaking one does not simply round robin your way through a cluster of MySQL databases as a means to achieve scalability. It is databases, in fact, that have driven a wide variety of scalability patterns such as sharding and partitioning to achieve the ultimate goal of high-performance and scalability simultaneously. Unfortunately, most folks don’t architect their applications with scalability in mind. A single database is all that’s necessary at first, and because of the way in which the application interacts with the database, it doesn’t make sense to code in support for multiple database instances, such as is often implemented with a MySQL master-slave cluster. That’s because the application has to actually open a connection to the database in question. If you’re only starting with one database, you really can’t code in a connection to a separate instance. Eventually that application’s usage grows and the demands  upon the database require a more scalable approach. Enter the MySQL master/slave relationship. A typical configuration is to maintain the master as the “write” database, i.e. all updates and/or inserts must use the master, while the slave instance is used as a “read only” instance. Obviously this means the application code must be changed to support this kind of functional sharding. Unless you leverage network server virtualization from a load balancing service capable of acting as a full-proxy at layer 7 (application) like BIG-IP.   This solution leverages iRules to implement database load balancing. While this specific example is designed to perform the common functional sharding pattern of read-write separation for a master-slave MySQL cluster, the flexibility of iRules is such that other architectural solutions can easily be designed using the same basic functions. Location based sharding is another popular means of scaling databases, and using the GeoLocation capabilities of BIG-IP along with iRules to inspect and route database requests, it should be a fairly trivial architectural task to implement. The ability to further extend sharding or other distribution methodologies for scaling databases without modifying the application itself is a huge bonus for both developers and operations. By decoupling the application from the database, it provides a more flexibility set of scalability domains in which technology targeted scalability strategies can  be leveraged independent of the other layers. This is an important facet of agile infrastructure architecture and should not be underestimated as a benefit of network server virtualization. MySQL Load Balancing Resources: MySQL Proxy iRule  MySQL Proxy iApp (deployment package for BIG-IP v11) The Full-Proxy Data Center Architecture  Infrastructure Scalability Pattern: Sharding Streams Infrastructure Scalability Pattern: Sharding Sessions Infrastructure Scalability Pattern: Partition by Function or Type IT as a Service: A Stateless Infrastructure Architecture Model  F5 Friday: Platform versus Product  At the Intersection of Cloud and Control… What is a Strategic Point of Control Anyway?  All F5 Friday Posts on DevCentral Why Single-Stack Infrastructure Sucks ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"3494","kudosSumWeight":0,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkxNjctNzk0MGkyQUUwOTVCNjRGQzQzNDU4?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkxNjctODU0OWk4NkVFMTlBNEJBNjRDQjQ2?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkxNjctNTk0MGk0QzZFRTUyN0U2RjVENDlG?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkxNjctNzQ1NGkxODJDOUMxREQxRTZCMkUx?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDU","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkxNjctNDE3MGlEOTMyRDQ3NEFEMDhCMjk5?revision=1\"}"}}],"totalCount":5,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:276589":{"__typename":"Conversation","id":"conversation:276589","topic":{"__typename":"TkbTopicMessage","uid":276589},"lastPostingActivityTime":"2016-12-23T08:51:22.000-08:00","solved":false},"TkbTopicMessage:message:276589":{"__typename":"TkbTopicMessage","subject":"Full examples of iControlREST for device and application service deployment","conversation":{"__ref":"Conversation:conversation:276589"},"id":"message:276589","revisionNum":1,"uid":276589,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:173160"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":2539},"postTime":"2015-11-09T07:36:00.000-08:00","lastPublishTime":"2015-11-09T07:36:00.000-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" 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 Basic System Configuration AWS-specific system configuration Network attachment \n Application service provisioning \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 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.  \n\n Basic system configuration \n\n 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. \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 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.  \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 Setup of self-IPs, VLANs, and other network specific configuration is relatively straight forward.  \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 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:\n Deploy all resources that are needed to support the iApp deployment:\n ​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. \n ​Note that we check the status of the asynchronous REST tasks which are started during the policy 'create' and 'apply' steps.  \n An LTM policy which attaches the ASM policy above using a ruleset.  \n 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).  \n \n For virtual 2 (VIP = 172.16.13.124), just deploy the web server pool, iRule, and virtual server directly (without an iApp). \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 On a pre-existing BIG-IP install (or one have created in your build process for your code)\n Import the iApp template in the Configuration Utility in the 'Common' partition 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 \n \ncurl -sku <user>:<password> -X GET https://<management ip>/mgmt/tm/sys/application/template/~Common~<name of your iApp>?expandSubcollections=true \n \n 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 \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 Before we can POST this payload back to any BIG-IP, we need to cleanup a few things:\n Remove any of the extraneous fields including 'verificationStatus', 'totalSigningStatus', 'selfLink', 'partition', 'kind', 'generation', 'fullPath'. 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 \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 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 \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 Downloading the iApp from DevCentral 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 You'll probably have to do some \"find and replace\" like the following: \n \nf5.iapp.1.3.0.cli:iapp_get_provisioned -> iapp::get_provisioned \n 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 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 Deploy an iApp service via the Configuration Utility. Do an HTTP GET to acquire the JSON representation (notice the URL formatting!).\n \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 Depending on the variables presented by the iApp template, the JSON payload for the iApp service might look something like:\n \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 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'. 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@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"59384","kudosSumWeight":0,"repliesCount":1,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:282177":{"__typename":"Conversation","id":"conversation:282177","topic":{"__typename":"TkbTopicMessage","uid":282177},"lastPostingActivityTime":"2020-10-29T11:00:29.000-07:00","solved":false},"User:user:106220":{"__typename":"User","uid":106220,"login":"Joe_Pruitt","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/images/dS0xMDYyMjAtUU1TTFdB?image-coordinates=0%2C0%2C1000%2C1000"},"id":"user:106220"},"TkbTopicMessage:message:282177":{"__typename":"TkbTopicMessage","subject":"Converting a Cisco ACE configuration file to F5 BIG-IP Format","conversation":{"__ref":"Conversation:conversation:282177"},"id":"message:282177","revisionNum":1,"uid":282177,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:106220"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":2505},"postTime":"2012-12-11T08:06:00.000-08:00","lastPublishTime":"2012-12-11T08:06:00.000-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":"   \n\n In September, Cisco announced that it was ceasing development and pulling back on sales of its Application Control Engine (ACE) load balancing modules.  Customers of Cisco’s ACE product line will now have to look for a replacement product to solve their load balancing and application delivery needs. \n\n One of the first questions that will come up when a customer starts looking into replacement products surrounds the issue of upgradability.  Will the customer be able to import their current configuration into the new technology or will they have to start with the new product from scratch.  For smaller businesses, starting over can be a refreshing way to clean up some of the things you’ve been meaning to but weren’t able to for one reason or another.  But, for a large majority of the users out there, starting over from nothing with a new product is a daunting task. \n\n To help with those users considering a move to the F5 universe, DevCentral has included several scripts to assist with the configuration migration process.  In our Codeshare section we created some scripts useful in converting ACE configurations into their respective F5 counterparts. \nhttps://devcentral.f5.com/s/articles/cisco-ace-to-f5-big-ip https://devcentral.f5.com/s/articles/Cisco-ACE-to-F5-Conversion-Python-3 https://devcentral.f5.com/s/articles/cisco-ace-to-f5-big-ip-via-tmsh We also have scripts covering Cisco’s CSS (https://devcentral.f5.com/s/articles/cisco-css-to-f5-big-ip ) and CSM products (https://devcentral.f5.com/s/articles/cisco-csm-to-f5-big-ip ) as well.\n\n In this article, I’m going to focus on the ace2f5-tmsh” in the ace2f5.zip script library. \n\n The script takes as input an ACE configuration and creates a TMSH script to create the corresponding F5 BIG-IP objects. \n\n   \n\n ace2f5-tmsh.pl \n\n \n$ perl ace2f5-tmsh.pl ace_config > tmsh_script \n\n We could leave it at that, but I’ll use this article to discuss the components of the ACE configuration and how they map to F5 objects. \n\n   \n\n ip \n\n The ip object in the ACE configuration is defined like this: \n\n \nip route 0.0.0.0 0.0.0.0 10.211.143.1 \n\n equates to a tmsh “net route” command. \n\n \nnet route 0.0.0.0-0 { network 0.0.0.0/0 gw 10.211.143.1 } \n\n   \n\n rserver \n\n An “rserver” is basically a node containing a server address including an optional “inservice” attribute indicating whether it’s active or not. \n\n ACE Configuration \n\n \nrserver host R190-JOEINC0060\n ip address 10.213.240.85\nrserver host R191-JOEINC0061\n ip address 10.213.240.86\n inservice\nrserver host R192-JOEINC0062\n ip address 10.213.240.88\n inservice\nrserver host R193-JOEINC0063\n ip address 10.213.240.89\n inservice \n\n It will be used to find the IP address for a given rserver hostname. \n\n   \n\n serverfarm \n\n A serverfarm is a LTM pool except that it doesn’t have a port assigned to it yet. \n\n ACE Configuration \n\n \nserverfarm host MySite-JoeInc\n predictor hash url\n rserver R190-JOEINC0060\n inservice\n rserver R191-JOEINC0061\n inservice\n rserver R192-JOEINC0062\n inservice\n rserver R193-JOEINC0063\n inservice \n\n F5 Configuration \n\n \nltm pool Insiteqa-JoeInc {\n     load-balancing-mode predictive-node\n     members { 10.213.240.86:any { address 10.213.240.86 }}\n     members { 10.213.240.88:any { address 10.213.240.88 }}\n     members { 10.213.240.89:any { address 10.213.240.89 }}\n} \n\n   \n\n probe \n\n a “probe” is a LTM monitor except that it does not have a port. \n\n ACE Configuration \n\n \nprobe tcp MySite-JoeInc\n interval 5\n faildetect 2\n passdetect interval 10\n passdetect count 2 \n\n will map to the TMSH “ltm monitor” command. \n\n F5 Configuration \n\n \nltm monitor Insiteqa-JoeInc {\n    defaults from tcp\n    interval 5\n    timeout 10\n    retry 2\n} \n\n   \n\n sticky \n\n The “sticky” object is a way to create a persistence profile.  First you tie the serverfarm to the persist profile, then you tie the profile to the Virtual Server. \n\n ACE Configuration \n\n \nsticky ip-netmask 255.255.255.255 address source MySite-JoeInc-sticky\n timeout 60\n replicate sticky\n serverfarm MySite-JoeInc \n\n   \n\n class-map \n\n A “class-map” assigns a listener, or Virtual IP address and port number which is used for the clientside and serverside of the connection. \n\n ACE Configuration \n\n \nclass-map match-any vip-MySite-JoeInc-12345\n 2 match virtual-address 10.213.238.140 tcp eq 12345\nclass-map match-any vip-MySite-JoeInc-1433\n 2 match virtual-address 10.213.238.140 tcp eq 1433\nclass-map match-any vip-MySite-JoeInc-31314\n 2 match virtual-address 10.213.238.140 tcp eq 31314\nclass-map match-any vip-MySite-JoeInc-8080\n 2 match virtual-address 10.213.238.140 tcp eq 8080\nclass-map match-any vip-MySite-JoeInc-http\n 2 match virtual-address 10.213.238.140 tcp eq www\nclass-map match-any vip-MySite-JoeInc-https\n 2 match virtual-address 10.213.238.140 tcp eq https \n\n   \n\n policy-map \n\n a policy-map of type loadbalance simply ties the persistence profile to the Virtual .  the “multi-match” attribute constructs the virtual server by tying a bunch of objects together. \n\n ACE Configuration \n\n \npolicy-map type loadbalance first-match vip-pol-MySite-JoeInc\n class class-default\n sticky-serverfarm MySite-JoeInc-sticky\n\npolicy-map multi-match lb-MySite-JoeInc\n class vip-MySite-JoeInc-http\n loadbalance vip inservice\n loadbalance policy vip-pol-MySite-JoeInc\n loadbalance vip icmp-reply\n class vip-MySite-JoeInc-https\n loadbalance vip inservice\n loadbalance vip icmp-reply\n class vip-MySite-JoeInc-12345\n loadbalance vip inservice\n loadbalance policy vip-pol-MySite-JoeInc\n loadbalance vip icmp-reply\n class vip-MySite-JoeInc-31314\n loadbalance vip inservice\n loadbalance policy vip-pol-MySite-JoeInc\n loadbalance vip icmp-reply\n class vip-MySite-JoeInc-1433\n loadbalance vip inservice\n loadbalance policy vip-pol-MySite-JoeInc\n loadbalance vip icmp-reply\n class reals\n nat dynamic 1 vlan 240\n class vip-MySite-JoeInc-8080\n loadbalance vip inservice\n loadbalance policy vip-pol-MySite-JoeInc\n loadbalance vip icmp-reply \n\n F5 Configuration \n\n \nltm virtual vip-Insiteqa-JoeInc-12345 {\n destination 10.213.238.140:12345\n pool Insiteqa-JoeInc\n persist my_source_addr\n profiles {\n tcp {}\n }\n}\n\nltm virtual vip-Insiteqa-JoeInc-1433 {\n destination 10.213.238.140:1433\n pool Insiteqa-JoeInc\n persist my_source_addr\n profiles {\n tcp {}\n }\n}\n\nltm virtual vip-Insiteqa-JoeInc-31314 {\n destination 10.213.238.140:31314\n pool Insiteqa-JoeInc\n persist my_source_addr\n profiles {\n tcp {}\n }\n}\n\nltm virtual vip-Insiteqa-JoeInc-8080 {\n destination 10.213.238.140:8080\n pool Insiteqa-JoeInc\n persist my_source_addr\n profiles {\n tcp {}\n }\n}\n\nltm virtual vip-Insiteqa-JoeInc-http {\n destination 10.213.238.140:http\n pool Insiteqa-JoeInc\n persist my_source_addr\n profiles {\n tcp {}\n http {}\n }\n}\n\nltm virtual vip-Insiteqa-JoeInc-https {\n destination 10.213.238.140:https\n profiles {\n tcp {}\n} \n\n   \n\n Conclusion \n\n If you are considering migrating from Cicso’s ACE to F5, I’d consider you take a look at the Cisco conversion scripts to assist with the conversion. \n\n   \n\n   \n\n   \n\n   ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"7469","kudosSumWeight":0,"repliesCount":6,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"CachedAsset:text:en_US-components/community/Navbar-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1743097590143","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-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1743097590143","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1743097590143","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1743097590143","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1743097590143","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-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1743097590143","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagSubscriptionAction-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagSubscriptionAction-1743097590143","value":{"success.follow.title":"Following Tag","success.unfollow.title":"Unfollowed Tag","success.follow.message.followAcrossCommunity":"You will be notified when this tag is used anywhere across the community","success.unfollowtag.message":"You will no longer be notified when this tag is used anywhere in this place","success.unfollowtagAcrossCommunity.message":"You will no longer be notified when this tag is used anywhere across the community","unexpected.error.title":"Error - Action Failed","unexpected.error.message":"An unidentified problem occurred during the action you took. Please try again later.","buttonTitle":"{isSubscribed, select, true {Unfollow} false {Follow} other{}}","unfollow":"Unfollow"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListTabs-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListTabs-1743097590143","value":{"mostKudoed":"{value, select, IDEA {Most Votes} other {Most Likes}}","mostReplies":"Most Replies","mostViewed":"Most Viewed","newest":"{value, select, IDEA {Newest Ideas} OCCASION {Newest Events} other {Newest Topics}}","newestOccasions":"Newest Events","mostRecent":"Most Recent","noReplies":"No Replies Yet","noSolutions":"No Solutions Yet","solutions":"Solutions","mostRecentUserContent":"Most Recent","trending":"Trending","draft":"Drafts","spam":"Spam","abuse":"Abuse","moderation":"Moderation","tags":"Tags","PAST":"Past","UPCOMING":"Upcoming","sortBymostRecent":"Sort By Most Recent","sortBymostRecentUserContent":"Sort By Most Recent","sortBymostKudoed":"Sort By Most Likes","sortBymostReplies":"Sort By Most Replies","sortBymostViewed":"Sort By Most Viewed","sortBynewest":"Sort By Newest Topics","sortBynewestOccasions":"Sort By Newest Events","otherTabs":" Messages list in the {tab} for {conversationStyle}","guides":"Guides","archives":"Archives"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1743097590143","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1743097590143","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/OverflowNav-1743097590143","value":{"toggleText":"More"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewInline-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewInline-1743097590143","value":{"bylineAuthor":"{bylineAuthor}","bylineBoard":"{bylineBoard}","anonymous":"Anonymous","place":"Place {bylineBoard}","gotoParent":"Go to parent {name}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Pager/PagerLoadMore-1743097590143","value":{"loadMore":"Show More"},"localOverride":false},"CachedAsset:text:en_US-components/customComponent/CustomComponent-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/customComponent/CustomComponent-1743097590143","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-components/users/UserLink-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1743097590143","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1743097590143","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1743097590143","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/MessageTime-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1743097590143","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-shared/client/components/nodes/NodeIcon-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeIcon-1743097590143","value":{"contentType":"Content Type {style, select, FORUM {Forum} BLOG {Blog} TKB {Knowledge Base} IDEA {Ideas} OCCASION {Events} other {}} icon"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageUnreadCount-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageUnreadCount-1743097590143","value":{"unread":"{count} unread","comments":"{count, plural, one { unread comment} other{ unread comments}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageViewCount-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageViewCount-1743097590143","value":{"textTitle":"{count, plural,one {View} other{Views}}","views":"{count, plural, one{View} other{Views}}"},"localOverride":false},"CachedAsset:text:en_US-components/kudos/KudosCount-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/kudos/KudosCount-1743097590143","value":{"textTitle":"{count, plural,one {{messageType, select, IDEA{Vote} other{Like}}} other{{messageType, select, IDEA{Votes} other{Likes}}}}","likes":"{count, plural, one{like} other{likes}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageRepliesCount-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRepliesCount-1743097590143","value":{"textTitle":"{count, plural,one {{conversationStyle, select, IDEA{Comment} OCCASION{Comment} other{Reply}}} other{{conversationStyle, select, IDEA{Comments} OCCASION{Comments} other{Replies}}}}","comments":"{count, plural, one{Comment} other{Comments}}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1743097590143":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1743097590143","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false}}}},"page":"/tags/TagPage/TagPage","query":{"messages.widget.messagelistfornodebyrecentactivitywidget-tab-main-messages-list-for-tag-widget-0":"mostViewed","nodeId":"board:TechnicalArticles","tagName":"design"},"buildId":"q_bLpq2mflH0BeZigxpj6","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"f5","openTelemetryServiceVersion":"25.2.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","apolloDevToolsEnabled":false,"inboxMuteWipFeatureEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/customComponent/CustomComponent/CustomComponent.tsx","./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/tags/TagsHeaderWidget/TagsHeaderWidget.tsx","./components/messages/MessageListForNodeByRecentActivityWidget/MessageListForNodeByRecentActivityWidget.tsx","./components/tags/TagSubscriptionAction/TagSubscriptionAction.tsx","./components/customComponent/CustomComponentContent/TemplateContent.tsx","../shared/client/components/common/List/ListGroup/ListGroup.tsx","./components/messages/MessageView/MessageView.tsx","./components/messages/MessageView/MessageViewInline/MessageViewInline.tsx","../shared/client/components/common/Pager/PagerLoadMore/PagerLoadMore.tsx","./components/customComponent/CustomComponentContent/HtmlContent.tsx","./components/customComponent/CustomComponentContent/CustomComponentScripts.tsx"],"appGip":true,"scriptLoader":[]}