iControlREST

1095 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/iControlREST\"}}})":{"__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/iControlREST\"}}})":{"__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/iControlREST\"}}})":{"__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\":\"1745262168714\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1745262168714"}],"cachedText({\"lastModified\":\"1745262168714\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageListTabs\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageListTabs-1745262168714"}],"cachedText({\"lastModified\":\"1745262168714\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageView/MessageViewInline\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageView/MessageViewInline-1745262168714"}],"cachedText({\"lastModified\":\"1745262168714\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/Pager/PagerLoadMore\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1745262168714"}],"cachedText({\"lastModified\":\"1745262168714\",\"locale\":\"en-US\",\"namespaces\":[\"components/customComponent/CustomComponent\"]})":[{"__ref":"CachedAsset:text:en_US-components/customComponent/CustomComponent-1745262168714"}],"cachedText({\"lastModified\":\"1745262168714\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/OverflowNav\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1745262168714"}],"cachedText({\"lastModified\":\"1745262168714\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1745262168714"}],"cachedText({\"lastModified\":\"1745262168714\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1745262168714"}],"cachedText({\"lastModified\":\"1745262168714\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1745262168714"}],"cachedText({\"lastModified\":\"1745262168714\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSolvedBadge\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSolvedBadge-1745262168714"}],"cachedText({\"lastModified\":\"1745262168714\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTime\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTime-1745262168714"}],"cachedText({\"lastModified\":\"1745262168714\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeIcon\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1745262168714"}],"cachedText({\"lastModified\":\"1745262168714\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageUnreadCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageUnreadCount-1745262168714"}],"cachedText({\"lastModified\":\"1745262168714\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageViewCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageViewCount-1745262168714"}],"cachedText({\"lastModified\":\"1745262168714\",\"locale\":\"en-US\",\"namespaces\":[\"components/kudos/KudosCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/kudos/KudosCount-1745262168714"}],"cachedText({\"lastModified\":\"1745262168714\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRepliesCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRepliesCount-1745262168714"}],"cachedText({\"lastModified\":\"1745262168714\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1745262168714"}]},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"User:user:-1":{"__typename":"User","id":"user:-1","uid":-1,"login":"Anonymous","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","es-ES"]},"repliesSortOrder":{"__typename":"InheritableStringSettingWithPossibleValues","key":"config.user_replies_sort_order","value":"DEFAULT","localValue":"DEFAULT","possibleValues":["DEFAULT","LIKES","PUBLISH_TIME","REVERSE_PUBLISH_TIME"]}},"deleted":false},"CachedAsset:pages-1745262162019":{"__typename":"CachedAsset","id":"pages-1745262162019","value":[{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1739501733000,"localOverride":null,"page":{"id":"Test","type":"CUSTOM","urlPath":"/custom-test-2","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"MaintenancePage","type":"COMMUNITY","urlPath":"/maintenance","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"HealthCheckPage","type":"COMMUNITY","urlPath":"/health","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745262162019,"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}","userBanned":"We're sorry, but you have been banned from using this site.","userBannedReason":"You have been banned for the following reason: {reason}"},"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},"CachedAsset:theme:customTheme1-1745262151618":{"__typename":"CachedAsset","id":"theme:customTheme1-1745262151618","value":{"id":"customTheme1","animation":{"fast":"150ms","normal":"250ms","slow":"500ms","slowest":"750ms","function":"cubic-bezier(0.07, 0.91, 0.51, 1)","__typename":"AnimationThemeSettings"},"avatar":{"borderRadius":"50%","collections":["custom"],"__typename":"AvatarThemeSettings"},"basics":{"browserIcon":{"imageAssetName":"JimmyPackets-512-1702592938213.png","imageLastModified":"1702592945815","__typename":"ThemeAsset"},"customerLogo":{"imageAssetName":"f5_logo_fix-1704824537976.svg","imageLastModified":"1704824540697","__typename":"ThemeAsset"},"maximumWidthOfPageContent":"1600px","oneColumnNarrowWidth":"800px","gridGutterWidthMd":"30px","gridGutterWidthXs":"10px","pageWidthStyle":"WIDTH_OF_PAGE_CONTENT","__typename":"BasicsThemeSettings"},"buttons":{"borderRadiusSm":"5px","borderRadius":"5px","borderRadiusLg":"5px","paddingY":"5px","paddingYLg":"7px","paddingYHero":"var(--lia-bs-btn-padding-y-lg)","paddingX":"12px","paddingXLg":"14px","paddingXHero":"42px","fontStyle":"NORMAL","fontWeight":"400","textTransform":"NONE","disabledOpacity":0.5,"primaryTextColor":"var(--lia-bs-white)","primaryTextHoverColor":"var(--lia-bs-white)","primaryTextActiveColor":"var(--lia-bs-white)","primaryBgColor":"var(--lia-bs-primary)","primaryBgHoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.85))","primaryBgActiveColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.7))","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","primaryBorderActive":"1px solid transparent","primaryBorderFocus":"1px solid var(--lia-bs-white)","primaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","secondaryTextColor":"var(--lia-bs-gray-900)","secondaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","secondaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","secondaryBgColor":"var(--lia-bs-gray-400)","secondaryBgHoverColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.96))","secondaryBgActiveColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.92))","secondaryBorder":"1px solid transparent","secondaryBorderHover":"1px solid transparent","secondaryBorderActive":"1px solid transparent","secondaryBorderFocus":"1px solid transparent","secondaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","tertiaryTextColor":"var(--lia-bs-gray-900)","tertiaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","tertiaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","tertiaryBgColor":"transparent","tertiaryBgHoverColor":"transparent","tertiaryBgActiveColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.04)","tertiaryBorder":"1px solid transparent","tertiaryBorderHover":"1px solid hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","tertiaryBorderActive":"1px solid transparent","tertiaryBorderFocus":"1px solid transparent","tertiaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","destructiveTextColor":"var(--lia-bs-danger)","destructiveTextHoverColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.95))","destructiveTextActiveColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.9))","destructiveBgColor":"var(--lia-bs-gray-300)","destructiveBgHoverColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.96))","destructiveBgActiveColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.92))","destructiveBorder":"1px solid transparent","destructiveBorderHover":"1px solid transparent","destructiveBorderActive":"1px solid transparent","destructiveBorderFocus":"1px solid transparent","destructiveBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","__typename":"ButtonsThemeSettings"},"border":{"color":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","mainContent":"NONE","sideContent":"NONE","radiusSm":"3px","radius":"5px","radiusLg":"9px","radius50":"100vw","__typename":"BorderThemeSettings"},"boxShadow":{"xs":"0 0 0 1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08), 0 3px 0 -1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08)","sm":"0 2px 4px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.06)","md":"0 5px 15px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","lg":"0 10px 30px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","__typename":"BoxShadowThemeSettings"},"cards":{"bgColor":"var(--lia-panel-bg-color)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":"var(--lia-box-shadow-xs)","__typename":"CardsThemeSettings"},"chip":{"maxWidth":"300px","height":"30px","__typename":"ChipThemeSettings"},"coreTypes":{"defaultMessageLinkColor":"var(--lia-bs-primary)","defaultMessageLinkDecoration":"none","defaultMessageLinkFontStyle":"NORMAL","defaultMessageLinkFontWeight":"400","defaultMessageFontStyle":"NORMAL","defaultMessageFontWeight":"400","defaultMessageFontFamily":"var(--lia-bs-font-family-base)","forumColor":"#0C5C8D","forumFontFamily":"var(--lia-bs-font-family-base)","forumFontWeight":"var(--lia-default-message-font-weight)","forumLineHeight":"var(--lia-bs-line-height-base)","forumFontStyle":"var(--lia-default-message-font-style)","forumMessageLinkColor":"var(--lia-default-message-link-color)","forumMessageLinkDecoration":"var(--lia-default-message-link-decoration)","forumMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","forumMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","forumSolvedColor":"#62C026","blogColor":"#730015","blogFontFamily":"var(--lia-bs-font-family-base)","blogFontWeight":"var(--lia-default-message-font-weight)","blogLineHeight":"1.75","blogFontStyle":"var(--lia-default-message-font-style)","blogMessageLinkColor":"var(--lia-default-message-link-color)","blogMessageLinkDecoration":"var(--lia-default-message-link-decoration)","blogMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","blogMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","tkbColor":"#C20025","tkbFontFamily":"var(--lia-bs-font-family-base)","tkbFontWeight":"var(--lia-default-message-font-weight)","tkbLineHeight":"1.75","tkbFontStyle":"var(--lia-default-message-font-style)","tkbMessageLinkColor":"var(--lia-default-message-link-color)","tkbMessageLinkDecoration":"var(--lia-default-message-link-decoration)","tkbMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","tkbMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaColor":"#4099E2","qandaFontFamily":"var(--lia-bs-font-family-base)","qandaFontWeight":"var(--lia-default-message-font-weight)","qandaLineHeight":"var(--lia-bs-line-height-base)","qandaFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkColor":"var(--lia-default-message-link-color)","qandaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","qandaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaSolvedColor":"#3FA023","ideaColor":"#F3704B","ideaFontFamily":"var(--lia-bs-font-family-base)","ideaFontWeight":"var(--lia-default-message-font-weight)","ideaLineHeight":"var(--lia-bs-line-height-base)","ideaFontStyle":"var(--lia-default-message-font-style)","ideaMessageLinkColor":"var(--lia-default-message-link-color)","ideaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","ideaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","ideaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","contestColor":"#FCC845","contestFontFamily":"var(--lia-bs-font-family-base)","contestFontWeight":"var(--lia-default-message-font-weight)","contestLineHeight":"var(--lia-bs-line-height-base)","contestFontStyle":"var(--lia-default-message-link-font-style)","contestMessageLinkColor":"var(--lia-default-message-link-color)","contestMessageLinkDecoration":"var(--lia-default-message-link-decoration)","contestMessageLinkFontStyle":"ITALIC","contestMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","occasionColor":"#EE4B5B","occasionFontFamily":"var(--lia-bs-font-family-base)","occasionFontWeight":"var(--lia-default-message-font-weight)","occasionLineHeight":"var(--lia-bs-line-height-base)","occasionFontStyle":"var(--lia-default-message-font-style)","occasionMessageLinkColor":"var(--lia-default-message-link-color)","occasionMessageLinkDecoration":"var(--lia-default-message-link-decoration)","occasionMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","occasionMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","grouphubColor":"#491B62","categoryColor":"#949494","communityColor":"#FFFFFF","productColor":"#949494","__typename":"CoreTypesThemeSettings"},"colors":{"black":"#000000","white":"#FFFFFF","gray100":"#F7F7F7","gray200":"#F7F7F7","gray300":"#E8E8E8","gray400":"#D9D9D9","gray500":"#CCCCCC","gray600":"#949494","gray700":"#707070","gray800":"#545454","gray900":"#333333","dark":"#545454","light":"#F7F7F7","primary":"#0C5C8D","secondary":"#333333","bodyText":"#222222","bodyBg":"#F5F5F5","info":"#1D9CD3","success":"#62C026","warning":"#FFD651","danger":"#C20025","alertSystem":"#FF6600","textMuted":"#707070","highlight":"#FFFCAD","outline":"var(--lia-bs-primary)","custom":["#C20025","#081B85","#009639","#B3C6D7","#7CC0EB","#F29A36"],"__typename":"ColorsThemeSettings"},"divider":{"size":"3px","marginLeft":"4px","marginRight":"4px","borderRadius":"50%","bgColor":"var(--lia-bs-gray-600)","bgColorActive":"var(--lia-bs-gray-600)","__typename":"DividerThemeSettings"},"dropdown":{"fontSize":"var(--lia-bs-font-size-sm)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius-sm)","dividerBg":"var(--lia-bs-gray-300)","itemPaddingY":"5px","itemPaddingX":"20px","headerColor":"var(--lia-bs-gray-700)","__typename":"DropdownThemeSettings"},"email":{"link":{"color":"#0069D4","hoverColor":"#0061c2","decoration":"none","hoverDecoration":"underline","__typename":"EmailLinkSettings"},"border":{"color":"#e4e4e4","__typename":"EmailBorderSettings"},"buttons":{"borderRadiusLg":"5px","paddingXLg":"16px","paddingYLg":"7px","fontWeight":"700","primaryTextColor":"#ffffff","primaryTextHoverColor":"#ffffff","primaryBgColor":"#0069D4","primaryBgHoverColor":"#005cb8","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","__typename":"EmailButtonsSettings"},"panel":{"borderRadius":"5px","borderColor":"#e4e4e4","__typename":"EmailPanelSettings"},"__typename":"EmailThemeSettings"},"emoji":{"skinToneDefault":"#ffcd43","skinToneLight":"#fae3c5","skinToneMediumLight":"#e2cfa5","skinToneMedium":"#daa478","skinToneMediumDark":"#a78058","skinToneDark":"#5e4d43","__typename":"EmojiThemeSettings"},"heading":{"color":"var(--lia-bs-body-color)","fontFamily":"Inter","fontStyle":"NORMAL","fontWeight":"600","h1FontSize":"30px","h2FontSize":"25px","h3FontSize":"20px","h4FontSize":"18px","h5FontSize":"16px","h6FontSize":"16px","lineHeight":"1.2","subHeaderFontSize":"11px","subHeaderFontWeight":"500","h1LetterSpacing":"normal","h2LetterSpacing":"normal","h3LetterSpacing":"normal","h4LetterSpacing":"normal","h5LetterSpacing":"normal","h6LetterSpacing":"normal","subHeaderLetterSpacing":"2px","h1FontWeight":"var(--lia-bs-headings-font-weight)","h2FontWeight":"var(--lia-bs-headings-font-weight)","h3FontWeight":"var(--lia-bs-headings-font-weight)","h4FontWeight":"var(--lia-bs-headings-font-weight)","h5FontWeight":"var(--lia-bs-headings-font-weight)","h6FontWeight":"var(--lia-bs-headings-font-weight)","__typename":"HeadingThemeSettings"},"icons":{"size10":"10px","size12":"12px","size14":"14px","size16":"16px","size20":"20px","size24":"24px","size30":"30px","size40":"40px","size50":"50px","size60":"60px","size80":"80px","size120":"120px","size160":"160px","__typename":"IconsThemeSettings"},"imagePreview":{"bgColor":"var(--lia-bs-gray-900)","titleColor":"var(--lia-bs-white)","controlColor":"var(--lia-bs-white)","controlBgColor":"var(--lia-bs-gray-800)","__typename":"ImagePreviewThemeSettings"},"input":{"borderColor":"var(--lia-bs-gray-600)","disabledColor":"var(--lia-bs-gray-600)","focusBorderColor":"var(--lia-bs-primary)","labelMarginBottom":"10px","btnFontSize":"var(--lia-bs-font-size-sm)","focusBoxShadow":"0 0 0 3px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","checkLabelMarginBottom":"2px","checkboxBorderRadius":"3px","borderRadiusSm":"var(--lia-bs-border-radius-sm)","borderRadius":"var(--lia-bs-border-radius)","borderRadiusLg":"var(--lia-bs-border-radius-lg)","formTextMarginTop":"4px","textAreaBorderRadius":"var(--lia-bs-border-radius)","activeFillColor":"var(--lia-bs-primary)","__typename":"InputThemeSettings"},"loading":{"dotDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.2)","dotLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.5)","barDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.06)","barLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.4)","__typename":"LoadingThemeSettings"},"link":{"color":"var(--lia-bs-primary)","hoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) - 10%))","decoration":"none","hoverDecoration":"underline","__typename":"LinkThemeSettings"},"listGroup":{"itemPaddingY":"15px","itemPaddingX":"15px","borderColor":"var(--lia-bs-gray-300)","__typename":"ListGroupThemeSettings"},"modal":{"contentTextColor":"var(--lia-bs-body-color)","contentBg":"var(--lia-bs-white)","backgroundBg":"var(--lia-bs-black)","smSize":"440px","mdSize":"760px","lgSize":"1080px","backdropOpacity":0.3,"contentBoxShadowXs":"var(--lia-bs-box-shadow-sm)","contentBoxShadow":"var(--lia-bs-box-shadow)","headerFontWeight":"700","__typename":"ModalThemeSettings"},"navbar":{"position":"FIXED","background":{"attachment":null,"clip":null,"color":"var(--lia-bs-white)","imageAssetName":null,"imageLastModified":"0","origin":null,"position":"CENTER_CENTER","repeat":"NO_REPEAT","size":"COVER","__typename":"BackgroundProps"},"backgroundOpacity":0.8,"paddingTop":"15px","paddingBottom":"15px","borderBottom":"1px solid var(--lia-bs-border-color)","boxShadow":"var(--lia-bs-box-shadow-sm)","brandMarginRight":"30px","brandMarginRightSm":"10px","brandLogoHeight":"30px","linkGap":"10px","linkJustifyContent":"flex-start","linkPaddingY":"5px","linkPaddingX":"10px","linkDropdownPaddingY":"9px","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkColor":"var(--lia-bs-body-color)","linkHoverColor":"var(--lia-bs-primary)","linkFontSize":"var(--lia-bs-font-size-sm)","linkFontStyle":"NORMAL","linkFontWeight":"400","linkTextTransform":"NONE","linkLetterSpacing":"normal","linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkBgColor":"transparent","linkBgHoverColor":"transparent","linkBorder":"none","linkBorderHover":"none","linkBoxShadow":"none","linkBoxShadowHover":"none","linkTextBorderBottom":"none","linkTextBorderBottomHover":"none","dropdownPaddingTop":"10px","dropdownPaddingBottom":"15px","dropdownPaddingX":"10px","dropdownMenuOffset":"2px","dropdownDividerMarginTop":"10px","dropdownDividerMarginBottom":"10px","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","controllerIconColor":"var(--lia-bs-body-color)","controllerIconHoverColor":"var(--lia-bs-body-color)","controllerTextColor":"var(--lia-nav-controller-icon-color)","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","controllerHighlightColor":"hsla(30, 100%, 50%)","controllerHighlightTextColor":"var(--lia-yiq-light)","controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerColor":"var(--lia-nav-controller-icon-color)","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","hamburgerBgColor":"transparent","hamburgerBgHoverColor":"transparent","hamburgerBorder":"none","hamburgerBorderHover":"none","collapseMenuMarginLeft":"20px","collapseMenuDividerBg":"var(--lia-nav-link-color)","collapseMenuDividerOpacity":0.16,"__typename":"NavbarThemeSettings"},"pager":{"textColor":"var(--lia-bs-link-color)","textFontWeight":"var(--lia-font-weight-md)","textFontSize":"var(--lia-bs-font-size-sm)","__typename":"PagerThemeSettings"},"panel":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-bs-border-radius)","borderColor":"var(--lia-bs-border-color)","boxShadow":"none","__typename":"PanelThemeSettings"},"popover":{"arrowHeight":"8px","arrowWidth":"16px","maxWidth":"300px","minWidth":"100px","headerBg":"var(--lia-bs-white)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius)","boxShadow":"0 0.5rem 1rem hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.15)","__typename":"PopoverThemeSettings"},"prism":{"color":"#000000","bgColor":"#f5f2f0","fontFamily":"var(--font-family-monospace)","fontSize":"var(--lia-bs-font-size-base)","fontWeightBold":"var(--lia-bs-font-weight-bold)","fontStyleItalic":"italic","tabSize":2,"highlightColor":"#b3d4fc","commentColor":"#62707e","punctuationColor":"#6f6f6f","namespaceOpacity":"0.7","propColor":"#990055","selectorColor":"#517a00","operatorColor":"#906736","operatorBgColor":"hsla(0, 0%, 100%, 0.5)","keywordColor":"#0076a9","functionColor":"#d3284b","variableColor":"#c14700","__typename":"PrismThemeSettings"},"rte":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":" var(--lia-panel-box-shadow)","customColor1":"#bfedd2","customColor2":"#fbeeb8","customColor3":"#f8cac6","customColor4":"#eccafa","customColor5":"#c2e0f4","customColor6":"#2dc26b","customColor7":"#f1c40f","customColor8":"#e03e2d","customColor9":"#b96ad9","customColor10":"#3598db","customColor11":"#169179","customColor12":"#e67e23","customColor13":"#ba372a","customColor14":"#843fa1","customColor15":"#236fa1","customColor16":"#ecf0f1","customColor17":"#ced4d9","customColor18":"#95a5a6","customColor19":"#7e8c8d","customColor20":"#34495e","customColor21":"#000000","customColor22":"#ffffff","defaultMessageHeaderMarginTop":"14px","defaultMessageHeaderMarginBottom":"10px","defaultMessageItemMarginTop":"0","defaultMessageItemMarginBottom":"10px","diffAddedColor":"hsla(170, 53%, 51%, 0.4)","diffChangedColor":"hsla(43, 97%, 63%, 0.4)","diffNoneColor":"hsla(0, 0%, 80%, 0.4)","diffRemovedColor":"hsla(9, 74%, 47%, 0.4)","specialMessageHeaderMarginTop":"14px","specialMessageHeaderMarginBottom":"10px","specialMessageItemMarginTop":"0","specialMessageItemMarginBottom":"10px","__typename":"RteThemeSettings"},"tags":{"bgColor":"var(--lia-bs-gray-200)","bgHoverColor":"var(--lia-bs-gray-400)","borderRadius":"var(--lia-bs-border-radius-sm)","color":"var(--lia-bs-body-color)","hoverColor":"var(--lia-bs-body-color)","fontWeight":"var(--lia-font-weight-md)","fontSize":"var(--lia-font-size-xxs)","textTransform":"UPPERCASE","letterSpacing":"0.5px","__typename":"TagsThemeSettings"},"toasts":{"borderRadius":"var(--lia-bs-border-radius)","paddingX":"12px","__typename":"ToastsThemeSettings"},"typography":{"fontFamilyBase":"Atkinson Hyperlegible","fontStyleBase":"NORMAL","fontWeightBase":"400","fontWeightLight":"300","fontWeightNormal":"400","fontWeightMd":"500","fontWeightBold":"700","letterSpacingSm":"normal","letterSpacingXs":"normal","lineHeightBase":"1.3","fontSizeBase":"15px","fontSizeXxs":"11px","fontSizeXs":"12px","fontSizeSm":"13px","fontSizeLg":"20px","fontSizeXl":"24px","smallFontSize":"14px","customFonts":[],"__typename":"TypographyThemeSettings"},"unstyledListItem":{"marginBottomSm":"5px","marginBottomMd":"10px","marginBottomLg":"15px","marginBottomXl":"20px","marginBottomXxl":"25px","__typename":"UnstyledListItemThemeSettings"},"yiq":{"light":"#ffffff","dark":"#000000","__typename":"YiqThemeSettings"},"colorLightness":{"primaryDark":0.36,"primaryLight":0.74,"primaryLighter":0.89,"primaryLightest":0.95,"infoDark":0.39,"infoLight":0.72,"infoLighter":0.85,"infoLightest":0.93,"successDark":0.24,"successLight":0.62,"successLighter":0.8,"successLightest":0.91,"warningDark":0.39,"warningLight":0.68,"warningLighter":0.84,"warningLightest":0.93,"dangerDark":0.41,"dangerLight":0.72,"dangerLighter":0.89,"dangerLightest":0.95,"__typename":"ColorLightnessThemeSettings"},"localOverride":false,"__typename":"Theme"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1745262168714","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1745262168714","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-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-pages/tags/TagPage-1745262168714","value":{"tagPageTitle":"Tag:\"{tagName}\" | {communityTitle}","tagPageForNodeTitle":"Tag:\"{tagName}\" in \"{title}\" | {communityTitle}","name":"Tags Page","tag":"Tag: {tagName}"},"localOverride":false},"CachedAsset:quilt:f5.prod:pages/tags/TagPage:community:zihoc95639-1745262165047":{"__typename":"CachedAsset","id":"quilt:f5.prod:pages/tags/TagPage:community:zihoc95639-1745262165047","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:1745262147292":{"__typename":"CachedAsset","id":"quiltWrapper:f5.prod:Common:1745262147292","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-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1745262168714","value":{"joinedGroupHub.title":"Welcome","joinedGroupHub.message":"You are now a member of this group and are subscribed to updates.","groupHubInviteNotFound.title":"Invitation Not Found","groupHubInviteNotFound.message":"Sorry, we could not find your invitation to the group. The owner may have canceled the invite.","groupHubNotFound.title":"Group Not Found","groupHubNotFound.message":"The grouphub you tried to join does not exist. It may have been deleted.","existingGroupHubMember.title":"Already Joined","existingGroupHubMember.message":"You are already a member of this group.","accountLocked.title":"Account Locked","accountLocked.message":"Your account has been locked due to multiple failed attempts. Try again in {lockoutTime} minutes.","editedGroupHub.title":"Changes Saved","editedGroupHub.message":"Your group has been updated.","leftGroupHub.title":"Goodbye","leftGroupHub.message":"You are no longer a member of this group and will not receive future updates.","deletedGroupHub.title":"Deleted","deletedGroupHub.message":"The group has been deleted.","groupHubCreated.title":"Group Created","groupHubCreated.message":"{groupHubName} is ready to use","accountClosed.title":"Account Closed","accountClosed.message":"The account has been closed and you will now be redirected to the homepage","resetTokenExpired.title":"Reset Password Link has Expired","resetTokenExpired.message":"Try resetting your password again","invalidUrl.title":"Invalid URL","invalidUrl.message":"The URL you're using is not recognized. Verify your URL and try again.","accountClosedForUser.title":"Account Closed","accountClosedForUser.message":"{userName}'s account is closed","inviteTokenInvalid.title":"Invitation Invalid","inviteTokenInvalid.message":"Your invitation to the community has been canceled or expired.","inviteTokenError.title":"Invitation Verification Failed","inviteTokenError.message":"The url you are utilizing is not recognized. Verify your URL and try again","pageNotFound.title":"Access Denied","pageNotFound.message":"You do not have access to this area of the community or it doesn't exist","eventAttending.title":"Responded as Attending","eventAttending.message":"You'll be notified when there's new activity and reminded as the event approaches","eventInterested.title":"Responded as Interested","eventInterested.message":"You'll be notified when there's new activity and reminded as the event approaches","eventNotFound.title":"Event Not Found","eventNotFound.message":"The event you tried to respond to does not exist.","redirectToRelatedPage.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.message":"The content you are trying to access is archived","redirectToRelatedPage.message":"The content you are trying to access is archived","relatedUrl.archivalLink.flyoutMessage":"The content you are trying to access is archived View Archived Content"},"localOverride":false},"CachedAsset:component:custom.widget.Beta_MetaNav-en-us-1745262174237":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_MetaNav-en-us-1745262174237","value":{"component":{"id":"custom.widget.Beta_MetaNav","template":{"id":"Beta_MetaNav","markupLanguage":"HANDLEBARS","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_MetaNav","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Beta_Footer-en-us-1745262174237":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_Footer-en-us-1745262174237","value":{"component":{"id":"custom.widget.Beta_Footer","template":{"id":"Beta_Footer","markupLanguage":"HANDLEBARS","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_Footer","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Tag_Manager_Helper-en-us-1745262174237":{"__typename":"CachedAsset","id":"component:custom.widget.Tag_Manager_Helper-en-us-1745262174237","value":{"component":{"id":"custom.widget.Tag_Manager_Helper","template":{"id":"Tag_Manager_Helper","markupLanguage":"HANDLEBARS","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Tag_Manager_Helper","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Consent_Blackbar-en-us-1745262174237":{"__typename":"CachedAsset","id":"component:custom.widget.Consent_Blackbar-en-us-1745262174237","value":{"component":{"id":"custom.widget.Consent_Blackbar","template":{"id":"Consent_Blackbar","markupLanguage":"HTML","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Consent_Blackbar","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"TEXTHTML","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1745262168714","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagsHeaderWidget-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagsHeaderWidget-1745262168714","value":{"tag":"{tagName}","topicsCount":"{count} {count, plural, one {Topic} other {Topics}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1745262168714","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}},"displayId":"Forums"},"Forum:board:TechnicalForum":{"__typename":"Forum","id":"board:TechnicalForum","forumPolicies":{"__typename":"ForumPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"displayId":"TechnicalForum","nodeType":"board","conversationStyle":"FORUM","title":"Technical Forum","shortTitle":"Technical Forum","parent":{"__ref":"Category:category:Forums"}},"Forum:board:WaterCooler":{"__typename":"Forum","id":"board:WaterCooler","forumPolicies":{"__typename":"ForumPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Articles":{"__typename":"Category","id":"category:Articles","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"displayId":"Articles"},"Tkb:board:TechnicalArticles":{"__typename":"Tkb","id":"board:TechnicalArticles","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"displayId":"TechnicalArticles","nodeType":"board","conversationStyle":"TKB","title":"Technical Articles","shortTitle":"Technical Articles","parent":{"__ref":"Category:category:Articles"}},"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}},"displayId":"CrowdSRC"},"Tkb:board:codeshare":{"__typename":"Tkb","id":"board:codeshare","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"displayId":"codeshare","nodeType":"board","conversationStyle":"TKB","title":"CodeShare","shortTitle":"CodeShare","parent":{"__ref":"Category:category:CrowdSRC"}},"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:172068":{"__typename":"Conversation","id":"conversation:172068","topic":{"__typename":"ForumTopicMessage","uid":172068},"lastPostingActivityTime":"2024-12-27T05:24:38.147-08:00","solved":true},"User:user:390606":{"__typename":"User","uid":390606,"login":"fire12_313356","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-11.svg?time=0"},"id":"user:390606"},"ForumTopicMessage:message:172068":{"__typename":"ForumTopicMessage","subject":"creating route domain and enabling advanced routing module with iControle in the BIG-IP LTM","conversation":{"__ref":"Conversation:conversation:172068"},"id":"message:172068","revisionNum":1,"uid":172068,"depth":0,"board":{"__ref":"Forum:board:TechnicalForum"},"author":{"__ref":"User:user:390606"},"metrics":{"__typename":"MessageMetrics","views":357},"postTime":"2017-03-30T06:19:09.000-07:00","lastPublishTime":"2017-03-30T06:19:09.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Hello everybody,   \n I wanna know if it's possible to create, modify and delete a route domain also if we can create and activate a dynamic routing protocol like BGP or OSPF in an F5 LTM all this with the iControl REst API,\nif Yes can you share some links that can help me.   \n i've seen the wiki but in the reference i can't found something in relation with Route domain.   \n Thank u a lot .   \n Best regards.   ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"444","kudosSumWeight":0,"repliesCount":2,"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:290993":{"__typename":"Conversation","id":"conversation:290993","topic":{"__typename":"TkbTopicMessage","uid":290993},"lastPostingActivityTime":"2024-11-21T03:23:59.412-08:00","solved":false},"User:user:195323":{"__typename":"User","uid":195323,"login":"Mark_Lloyd","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-7.svg?time=0"},"id":"user:195323"},"TkbTopicMessage:message:290993":{"__typename":"TkbTopicMessage","subject":"Python module to post and retrieve IControl Rest JSON objects for AVR statistics","conversation":{"__ref":"Conversation:conversation:290993"},"id":"message:290993","revisionNum":2,"uid":290993,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:195323"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":402},"postTime":"2016-06-26T14:05:08.000-07:00","lastPublishTime":"2023-06-05T22:51:27.504-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: This module simplifies making Python dictionary objects that are converted to IControl rest AVR JSON objects. It also handles making AVR requests and retrieving results as well allowing multiple AVR requests to be queued, posted and retrieved. It also has some basis type checking for the elements of a AVR request. This module requires Bigip 12.1 on the target that statistics are retrieved. How to use this snippet: The main class is rest_avr.avr_req. It is a dictionary class that maps directly to an IControl Rest AVR JSON request as translated by json.dumps. Each dictionary element is an object derived from a customer class for each part of the request. The element classes have add() and clear() functions. if the element class only allows one entry the add() function will replace the existing entry, otherwise it will append the entry to the request element. The rest_avr.avr_req class also has functions to populate the HTTP host and authentication values for the target system. \n rest_avr.avr_req.post_and_response returns the Python representation of the JSON result of the query. \n rest_avr.avr_req.add_to_queue() adds the currently constructed request to a queue of requests to post. \n rest_avr.avr_req.post_and_response_queue() returns a python list of results of queued queries. \n The following code sample constructs, posts and returns results for an AVR statistics request for specific DNS records and a specificrecord type, then queues multiple quests and posts and returns results. \n #!/usr/bin/python\nimport json\nimport sys\nimport time\nimport rest_avr\n\n#print rest_avr.ShowAVRJsonApi\n\n#Populate the url\n\navr_dns_req=rest_avr.avr_req()\navr_dns_req.auth('admin','admin')\navr_dns_req.url_base('10.10.2.113','dns')\n\n#Populate the json object\n\navr_dns_req['analyticsModule'].add('dns')\navr_dns_req['reportFeatures'].add('time-aggregated')\navr_dns_req['entityFilters'].add('domain-name', 'OPERATOR_TYPE_EQUAL', ['test2.test1.com','test1.test1.com'])\navr_dns_req['entityFilters'].add('query-type', 'OPERATOR_TYPE_EQUAL', ['a'])\navr_dns_req['viewMetrics'].add('packets')\navr_dns_req['viewDimensions'].add('domain-name')\navr_dns_req['metricFilters'].add('packets', 'OPERATOR_TYPE_GREATER_THAN', 0)\navr_dns_req['sortByMetrics'].add('packets', 'ascending')\navr_dns_req['pagination'].add(20, 0)\navr_dns_req['timeRange'].add(1461778251000000, None)\n\n#Post and retrieve results.\n\nresult_py=avr_dns_req.post_and_response()\n\nif result_py != None:\n print ('\\n' + result_py['results']['timeAggregated'][0]['dimensions'][0]['value'] + \" \" + result_py['results']['timeAggregated'][0]['metricValues'][0]['value'] + '\\n')\n\nelse:\n print result_py.error_layer\n print result_py.error_code\n print result_py.error_text\n\n# Now add multiple requests to a queue\navr_dns_req.add_to_queue()\n\navr_dns_req['entityFilters'].clear()\navr_dns_req['entityFilters'].add('query-type', 'OPERATOR_TYPE_EQUAL', ['aaaa'])\navr_dns_req.add_to_queue()\n\n#post and retrieve queued results\nresult_py_q=avr_dns_req.post_and_response_queue()\n\nfor result_py in result_py_q:\n\n if result_py != None:\n print ('\\n' + result_py['results']['timeAggregated'][0]['dimensions'][0]['value'] + \" \" + result_py['results']['timeAggregated'][0]['metricValues'][0]['value'] + '\\n')\n else:\n print result_py.error_layer\n print result_py.error_code\n print result_py.error_text\n Code : \"\"\"\nrest_avr provides a python interface to Bigip AVR statistics using the REST API. The main Python rest_avr.avr_req\nobject is a Python dictionary that maps to a JSON object that can be processed with the json.dumps() function\n\nAn IControl Rest AVR JSON request and response can be initiated with avr_req.post_and_response\n\nThe simple description of the API can is available at avr_req.ShowJsonApi()\n\nEach of these modules has a method to add single or multiple elements as appropriate to the specific module.\nOnce these elements are are populated a RestAPI request can be made with results returned as a python\nrepresentation.\n\n\navr_req.auth(user, passw)\navr_req.url_base(host, module)\n\navr_req['analyticsModule'].add(module)\navr_req['analyticsModule'].clear()\n\navr_req['reportFeatures'].add(metric_name, predicate, value)\navr_req['reportFeatures'].clear()\n\navr_req['entityFilters'].add(dimension_name, predicate, values)\navr_req['entityFilters'].clear()\n\navr_req['viewMetrics'].add(metric_name)\navr_req['viewMetrics'].clear()\n\navr_req['viewDimensions'].add(metric_name, order)\navr_req['viewDimensions'].clear()\n\navr_req['metricFilters'].add(metric_name, predicate, valu)\navr_req['metricFilters'].clear()\n\navr_req['sortByMetrics'].add(metric_name, orde)\navr_req['sortByMetrics'].clear()\n\navr_req['pagination'].add(num_results, skip_result)\navr_req['pagination'].clear()\n\navr_req['timeRange'].add(t_from, t_to)\navr_req['timeRange'].clear()\n\n\nAfter a request in constructed a REST API call is initiated with initiated with:\n\navr_req.post_and_response()\n\nThe response is a python dictionary data structure of the results as processed by json.loads\n\n\"\"\"\n\n\n\nfrom copy import deepcopy\nimport requests\nimport json\nimport sys\nimport time\nimport warnings\n\n__author__ = 'Mark Lloyd'\n__version__ = '1.0'\n\n# 05/24/2016\nimport json\nimport requests\nimport time\n\n\nclass BadDictElement(Exception):\n def __init__(self, key, value, expl):\n Exception.__init__(self, '{0} {1} {2} '.format(key, value, expl))\n\n\nclass BadTime(Exception):\n def __init__(self, variable, value):\n Exception.__init__(self, '{0} {1} should be 16 char decimal in microseconds '.format('a', 'b'))\n\n\nclass RequestFailure(Exception):\n def __init__(self, key, value):\n Exception.__init__(self, '{0} {1} '.format(key, value))\n\n\nclass analyticsModule(str):\n \"\"\"\n This class is tied to the structure of the parent class.\n parent() get's the parent object so we can make the string pseudo-mutable.\n accessed from within an avr request\n\n ['analyticsModule'].add(module)\n Adds a single string to analyticsModule element . If one exists it is replaced.\n\n ['analyticsModule'].clear()\n Send a null value to the analyticsModule element.\n\n See rest_avr.ShowAVRJsonApi for more details\n\n\n \"\"\"\n\n def parent(self, parent):\n self.parent = parent\n\n def add(self, module):\n \"\"\"\n avr_req.['analyticsModule'].add(module)\n Adds a single string to analyticsModule element . If one already exists it is replaced.\n This should be the same as the module string in avr_req.url_base.\n \"\"\"\n self.parent['analyticsModule'] = analyticsModule(module)\n self.parent['analyticsModule'].parent = self.parent\n\n def clear(self):\n \"\"\"\n avr_req.['analyticsModule'].add(module)\n replaces the analyticsModule mddule with a null string\n \"\"\"\n self.parent['analyticsModule'] = analyticsModule('')\n self.parent['analyticsModule'].parent = self.parent\n\n\nclass metricFilters(list):\n \"\"\"\n avr_req.['metricFilters'].add(metric_name, predicate, value)\n\n metric name is a string, value is an integer\n\n Valid predicates strings are ['OPERATOR_TYPE_EQUAL', 'OPERATOR_TYPE_NOT_EQUAL', 'OPERATOR_TYPE_GREATER_THAN',\n OPERATOR_TYPE_LOWER_THAN','OPERATOR_TYPE_GREATER_THAN_OR_EQUAL', 'OPERATOR_TYPE_LOWER_THAN_OR_EQUAL'])\n\n avr_req['metricFilters'].clear()\n Clears metricFilters elements\n\n See rest_avr.ShowAVRJsonApi for more details.\n\n \"\"\"\n\n def __init__(self):\n self.append([])\n self.valid_metric_predicate = (\n ['OPERATOR_TYPE_EQUAL', 'OPERATOR_TYPE_NOT_EQUAL', 'OPERATOR_TYPE_GREATER_THAN', 'OPERATOR_TYPE_LOWER_THAN',\n 'OPERATOR_TYPE_GREATER_THAN_OR_EQUAL', 'OPERATOR_TYPE_LOWER_THAN_OR_EQUAL'])\n\n def add(self, metric_name, predicate, value):\n \"\"\"\n avr_req.['metricFilters'].add(metric_name, predicate, value)\n\n metric name is a string, value is an integer\n\n Valid predicates strings are ['OPERATOR_TYPE_EQUAL', 'OPERATOR_TYPE_NOT_EQUAL', 'OPERATOR_TYPE_GREATER_THAN',\n OPERATOR_TYPE_LOWER_THAN','OPERATOR_TYPE_GREATER_THAN_OR_EQUAL', 'OPERATOR_TYPE_LOWER_THAN_OR_EQUAL']\n \"\"\"\n\n if type(value) is not int:\n raise BadDictElement(metric_name, value, 'value should be integer')\n\n if predicate in self.valid_metric_predicate:\n # first check if it is already there\n for metric in self[0]:\n if metric['metricName'] == metric_name:\n metric['predicate'] = predicate\n metric['value'] = value\n return 0\n # if it is not there then just add it.\n self[0].append({'metricName': metric_name, 'predicate': predicate, 'value': value})\n else:\n raise BadDictElement(metric_name, predicate, 'invalid predicate')\n\n def clear(self):\n \"\"\"\n avr_req['metricFilters'].clear()\n Clears metricFilters elements\n \"\"\"\n del self[0][:]\n\n\nclass entityFilters(list):\n \"\"\"\n avr_req.['entityFilters'].add(dimension_name, predicate, values):\n All values are strings\n valid predicate is 'OPERATOR_TYPE_EQUAL'\n\n ['entityFilters'].clear()\n Clears the entityFilters element\n\n See rest_avr.ShowJsonApi for more details\n \"\"\"\n\n def __init__(self):\n self.append([])\n\n def add(self, dimension_name, predicate, values):\n \"\"\"\n avr_req.['entityFilters'].add(dimension_name, predicate, values):\n All values are strings\n valid predicate is 'OPERATOR_TYPE_EQUAL'\n \"\"\"\n if predicate is 'OPERATOR_TYPE_EQUAL':\n # then loop throuth to see if the dimenson name already exists, if so replace\n for entity in self[0]:\n if entity['dimensionName'] == dimension_name:\n entity['predicate'] = predicate\n entity['values'] = values\n return 0\n # if it is not there then just add it.\n self[0].append({'dimensionName': dimension_name, 'predicate': predicate, 'values': values})\n\n else:\n raise BadDictElement(dimension_name, predicate, 'predicate must be OPERATOR_TYPE_EQUAL')\n\n def clear(self):\n \"\"\"\n ['entityFilters'].clear()\n Clears the entityFilters element\n \"\"\"\n del self[0][:]\n\n\nclass reportFeatures(list):\n \"\"\"\n avr_req.['reportFeatures'].add( feature)\n adds report feature string. Multiple features are permitted.\n\n ['reportFeatures'].clear()\n Clears the analyticsModule element.\n\n See rest_avr.ShowAVRJsonApi for more details.\n \"\"\"\n\n def add(self, feature):\n \"\"\"\n avr_req.['reportFeatures'].add( feature)\n adds report feature string. Multiple features are permitted\n .\"\"\"\n if feature not in self:\n self.append(feature)\n\n def clear(self):\n \"\"\"\n ['reportFeatures'].clear()\n Clears the entityFilters element\n \"\"\"\n del self[:]\n\n\nclass sortByMetrics(list):\n \"\"\"\n avr_req.['sortByMetrics'].add(metric_name, order)\n\n valid order names are 'ascending' and 'descending'\n sortByMetrics is optional in an AVR request.\n\n avr_req['sortByMetrics'].clear()\n Clears the sortByMetrics element.\n\n See rest_avr.ShowAVRJsonApi for more details.\n \"\"\"\n\n def __init__(self):\n self.metric_list = []\n\n def add(self, metric_name, order):\n if metric_name not in self.metric_list:\n self.append({'metricName': metric_name, 'order': order})\n self.metric_list.append(metric_name)\n\n def clear(self):\n \"\"\"\n ['sortByMetrics'].clear()\n Clears the sortByMetrics element\n \"\"\"\n del self[:]\n del self.metric_list[:]\n\n\nclass viewDimensions(list):\n \"\"\"\n avr_req.['viewDimensions'].add(dimension_name):\n adds view dimension, only one dimension is allowed\n add will replace element if it already exists\n\n avr_req['viewDimensions'].clear()\n Clears the viewDimensions element.\n\n See rest_avr.ShowAVRJsonApi for more details.\n \"\"\"\n\n def __init__(self):\n self.append([])\n self[0] = {}\n\n def add(self, dimension_name):\n \"\"\"\n avr_req.['viewDimensions'].add(dimension_name):\n adds view dimension string, only one dimension is allowed\n add will replace element if it already exists\n \"\"\"\n self[0]['dimensionName'] = dimension_name\n\n def clear(self, dimension_name):\n \"\"\"\n ['viewDimensions'].clear()\n Clears the viewDimensions element\n \"\"\"\n del self[0][:]\n\n\nclass viewMetrics(list):\n \"\"\"\n avr_req.['viewMetrics'].add(metric_name):\n appends metric_name string to list. The specification\n allows multiple view metric elements\n\n avr_req['viewMetrics'].clear()\n Clears the viewMetrics elements\n\n See rest_avr.ShowAVRJsonApi for more details.\n \"\"\"\n\n def __init__(self):\n self.metric_list = []\n\n def add(self, metric_name):\n \"\"\"\n avr_req.['viewMetrics'].add(metric_name):\n appends metric_name string to list. The specification\n allows multiple viewMetric elements\n \"\"\"\n\n if metric_name not in self.metric_list:\n self.append({'metricName': metric_name})\n self.metric_list.append(metric_name)\n\n def clear(self):\n \"\"\"\n ['viewMetrics'].clear()\n Clears the viewMetrics elements\n \"\"\"\n del self[:]\n del self.metric_list[:]\n\n\nclass timeRange(dict):\n \"\"\"\n avr_req.['timeRange'].add( t_from, t_to)\n both values are 16 digit numeric value in microseconds\n of unix/linux time. t_to is optional and can be replace by None\n\n timeRange is an optional.\n\n avr_req['timeRange'].clear()\n Clears the timeRange elements\n\n See rest_avr.ShowAVRJsonApi for more details.\n \"\"\"\n\n def add(self, t_from, t_to):\n \"\"\"\n avr_req.['timeRange'].add( t_from, t_to)\n both values are 16 digit numeric value in microseconds\n of unix/linux time. t_to is optional and can be replace by None\n\n timeRange is optional.\n \"\"\"\n if type(t_from) is long and len(str(t_from)) == 16:\n self['from'] = t_from\n else:\n raise BadTime(t_from + \" is 16 digit numeric value in microseconds\")\n\n if t_to != '' and t_to != 0 and t_to != None:\n if type(t_to) is long and len(str(t_from)) == 16:\n self['to'] = t_to\n else:\n raise BadTime(t_to + \" is 16 digit numeric value in microseconds\")\n else:\n if 'to' in self.keys():\n del self['to']\n\n def clear(self):\n \"\"\"\n ['timeRange'].clear()\n Clears the timeRange element\n \"\"\"\n del self[:]\n\n\nclass pagination(dict):\n \"\"\"\n avr_req.['pagination'].add(num_results, skip_results)\n both are integer values.\n\n avr_req['pagination'].clear()\n Clears the pagination elements\n\n See rest_avr.ShowAVRJsonApi for more details.\n \"\"\"\n\n def add(self, num_results, skip_results):\n \"\"\"\n avr_req.['pagination'].add(num_results, skip_results)\n both arguments are integers.\n \"\"\"\n if type(num_results) is int:\n self['numberOfResults'] = num_results\n else:\n raise BadDictElement('number of Results ', num_results, 'must be integer')\n if type(skip_results) is int:\n self['skipResults'] = skip_results\n else:\n raise BadDictElement('skipResults ', skip_results, 'must be integer')\n\n def clear(self):\n \"\"\"\n ['pagination'].clear()\n Clears the pagination element\n \"\"\"\n del self[:]\n\n\nclass avr_resp(dict):\n \"\"\"\n python response error is applicable.\n \"\"\"\n\n def __init__(self):\n self.error_layer = None\n self.error_code = None\n self.error_text = None\n\nclass avr_req(dict):\n \"\"\"\n The main class for rest_avr.\n\n avr_req contains a dictionary that maps to the elements of a Icontrol REST AVR request along with capability of\n posting that request and receiving a response.\n\n The dictionary values are object instances of python classes that correspond to the the JSON values of the\n object's name/value pair.\n\n Each value has two public methods:\n\n avr_req.['objectName']add(): adds an element to the appropriate object with type checking.\n If an element allows more then one instance the add function will append the element\n If an element allows only one instance the add function will replace the element\n\n avr_req.['objectName'].clear()r: clears all elements in the object.\n\n printing rest_avr.ShowAVRJsonApi provides documentation for the AVR JASON elements. Further documentation is\n available on devcentral.f5.com\n\n To post an AVR Rest request there are two functions to populate the HTTP/HTTPS request.\n\n avr_req.auth(user, passw):\n provides the username and password\n avr_req.url_base(host, module)\n provides the host and the bigip module AVR queries to construct the URL to make the request.\n\n Then to post the request and return results in a python representation of the JSON response.\n\n avr_req.post_and_response()\n\n \"\"\"\n\n def __init__(self):\n self['analyticsModule'] = analyticsModule()\n self['analyticsModule'].parent = self\n self['pagination'] = pagination()\n self['metricFilters'] = metricFilters()\n self['entityFilters'] = entityFilters()\n self['reportFeatures'] = reportFeatures()\n self['sortByMetrics'] = sortByMetrics()\n self['viewDimensions'] = viewDimensions()\n self['viewMetrics'] = viewMetrics()\n self['timeRange'] = timeRange()\n\n self.avr_session = requests.session()\n self.avr_session.verify = False\n self.avr_session.headers.update({'Content-Type': 'application/json'})\n\n # for multiple queued request handling.\n self.req_queue = []\n self.generate_id = None\n self.done = None\n self.result = None\n self.num_requests = 0\n self.res_queue = []\n\n def post_and_response(self):\n \"\"\"\n returns a python representation of the json response to the request.\n failure returns array ['ERROR','component',error]\n \"\"\"\n\n warnings.filterwarnings(\"ignore\")\n self.generate_request = self.avr_session.post(self.req_url_base + \"/generate-report/\",\n data=json.dumps(self))\n self.generate_request_py = json.loads(self.generate_request.text)\n self.result_guid = self.generate_request_py['id']\n self.results_status_url = self.req_url_base + \"/generate-report/\" + self.result_guid + \"/?$select=status,reportResultsLink\"\n self.results_url = self.req_url_base + \"/report-results/\" + self.result_guid\n self.sleeptime = .5\n for i in range(5):\n time.sleep(self.sleeptime)\n self.sleeptime *= 2 # double backoff period each time.\n\n self.status_results_json = self.avr_session.get(self.results_status_url)\n self.status_results = json.loads(self.status_results_json.text)\n\n if self.status_results['status'] == 'FAILED':\n self.result = avr_resp()\n self.result_error_layer = 'REST'\n self.result_error_code = self.status_results['status']\n self.result.error_text = self.status_results\n\n if self.status_results['status'] == 'FINISHED':\n self.raw_results_url = self.status_results['reportResultsLink']\n self.results_url = self.raw_results_url.replace('localhost', self.host_name)\n self.results = self.avr_session.get(self.results_url)\n\n if self.results.status_code == 200:\n self.result = avr_resp()\n self.result.update(json.loads(self.results.text))\n return self.result\n else:\n self.result = avr_resp()\n self.result.error_layer = 'HTTP'\n self.result.error_code = self.results.status_code\n self.result.error_text = self.results\n return self.result\n\n else:\n\n continue\n\n self.result = avr_resp()\n self.result.error_layer = 'REST_AVR'\n self.result.error_code = '408'\n self.result.error_text = 'TIMEOUT'\n\n\n def auth(self, user, passw):\n \"\"\"\n avr_req.auth(user, passw):\n username and password\n \"\"\"\n self.avr_session.auth = (user, passw)\n\n def url_base(self, host, module):\n \"\"\"\n avr_req.url_base(host, module)\n host and bigip module AVR queries to construct the URL to make the request.\n \"\"\"\n self.host_name = host\n self.req_url_base = 'https://%s/mgmt/tm/analytics/%s' % (host, module)\n self.module_py = {'analyticsModule': module}\n\n def add_to_queue(self):\n \"adds request as currently constructed to queue\"\n self.req_queue.append(deepcopy(self))\n\n def clear_queue(self):\n \"\"\"\"\n clears request queue\n \"\"\"\n del self.req_queue[:]\n\n def post_and_response_queue(self):\n \"\"\"\n posts and sends response to from queue of requests.\n \"\"\"\n warnings.filterwarnings(\"ignore\")\n for req in self.req_queue:\n req.generate_request = req.avr_session.post(req.req_url_base + \"/generate-report/\",\n data=json.dumps(req))\n req.generate_request_py = json.loads(req.generate_request.text)\n req.generate_id = (req.generate_request_py['id'])\n req.results_status_url = self.req_url_base + \"/generate-report/\" + req.generate_id + \"/?$select=status,reportResultsLink\"\n\n self.sleeptime = .5\n self.num_requests = len(self.req_queue)\n\n for i in range(5):\n\n for req in self.req_queue:\n\n if req.done is None:\n\n time.sleep(self.sleeptime)\n self.sleeptime *= 2 # double backoff period each time.\n req.status_results_json = req.avr_session.get(req.results_status_url)\n req.status_results = json.loads(req.status_results_json.text)\n\n if req.status_results['status'] == 'FAILED':\n req.result = avr_resp()\n req.result_error['layer'] = 'REST'\n req.result_error['error'] = req.status_results['status']\n req.result_error['text'] = req.status_results\n if req.status_results['status'] == 'FINISHED':\n req.raw_results_url = req.status_results['reportResultsLink']\n req.results_url = req.raw_results_url.replace('localhost', self.host_name)\n req.results = self.avr_session.get(req.results_url)\n if req.results.status_code == 200:\n req.result = avr_resp()\n req.result.update(json.loads(req.results.text))\n req.done = True\n self.res_queue.append(req.result)\n self.num_requests -= 1\n\n else:\n\n req.result = avr_resp()\n req.result_error.layer = 'HTTP'\n req.result_error.code = req.results.status_code\n req.result_error.text = req.results\n self.res_queue.append(req.result)\n if i == 5:\n if req.result == False:\n req.result = avr_resp()\n req.result.error_layer = 'REST_AVR'\n req.result.error_error = '408'\n req.result.error_text = 'TIMEOUT'\n\n\n if self.num_requests == 0:\n break\n\n\n\n return self.res_queue\n\n\nShowAVRJsonApi = \"\"\"\nreportFeatures\n--------------\nSpecifies the kind of information that appears in a\nresponse from AVR. You may specify one or more of the\nfollowing values:\n\nexisting-entities\ntime-aggregated\ntime-series\nentities-count\n\nviewDimensions\n--------------\nSpecifies the dimensions for which to calculate a report,\nsuch as:\n\n{\"dimensionName\": \"domain-name\"}\n\nYou may only specify a single dimension. You may omit\nthis field in a report generation request.\n\nviewMetrics\n-----------\nSpecifies the list of metrics by which to sort results, such\nas:\n\n{ \"metricName\": \"average-tps\" },\n{ \"metricName\": \"transactions\" }\n\nIf you specify either time-aggregated or\ntime-series features, you must specify one metric in\na report generation request.\n\nsortByMetrics\n--------------\nSpecifies the list of metrics to sort by, such as:\n[{ metricName: \"average-tps\", order:\"descending\" } ]\n\nValid values are ascending and descending. Sorting\nonly applies to the time-aggregated feature. You do\nnot need to specify this field in a report generation request.\n\ntimeRange\n---------\nSpecifies the time range, in microseconds, for which to\ncalculate a report, such as:\n\n{\"from\": 1410420888000000, \"to\": 1410424488000000 }\n\nYou do not need to specify this field in a report generation\nrequest.\n\nentityFilters\n=============\nSpecifies the entities and values for which to calculate a\nreport. You can specify a single entity with a second level\nof dimension filters that describe an aspect of the entity.\nIf you specify multiple entity types, the results include\nonly the entities that match all of the criteria. You do not\nneed to specify this field in a report generation request.\nThe following snippet contains two entities with\ncorresponding values:\n\n[[{\n\"dimensionName\" : \"virtual\",\n\"predicate\": \"OPERATOR_TYPE_EQUAL\",\n\"values : [\"phpAuction_VS_1\"] },\n{\n\"dimensionName : \"response-code\",\n\"predicate\": \"OPERATOR_TYPE_EQUAL\",\n\"values\" : [\"200\"] }\n]]\n\nmetricFilters\n-------------\nSpecifies the metric filters for which to calculate a report,\nsuch as:\n\n[{ \"metricName\": \"transactions\",\n\"predicate\" :\nmetricFilters\n\"OPERATOR_TYPE_GREATER_THAN\" \"value\":\n100 }]\n\nYou do not need to specify this field in a report generation\nrequest. For the existing-entities feature, AVR\nsupports the OPERATOR_TYPE_LIKE predicate. AVR also\nsupports the following predicates:\n\nOPERATOR_TYPE_EQUAL\nOPERATOR_TYPE_NOT_EQUAL\nOPERATOR_TYPE_GREATER_THAN\nOPERATOR_TYPE_LOWER_THAN\nOPERATOR_TYPE_GREATER_THAN_OR_EQUAL\nOPERATOR_TYPE_LOWER_THAN_OR_EQUAL\n\npagination\n----------\nSpecifies the number of results to return, and the number\nof results to skip, such as:\n\n{ numberOfResults : 10, skipResults : 10}\n\nTo see the second set of ten results, use the example\nshown here. AVR does not implement the OData query\nparameters top or skip. In order to see a specific set of\nresults, you must set the number of results to return and\nthen determine how many results to skip. You do not need\nto specify this field in a report generation request.\n\"\"\" Tested this on version: 12.0","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"27262","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:287546":{"__typename":"Conversation","id":"conversation:287546","topic":{"__typename":"TkbTopicMessage","uid":287546},"lastPostingActivityTime":"2024-10-31T11:44:00.782-07:00","solved":false},"User:user:411763":{"__typename":"User","uid":411763,"login":"Satoshi_Toyosa1","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-5.svg?time=0"},"id":"user:411763"},"TkbTopicMessage:message:287546":{"__typename":"TkbTopicMessage","subject":"iControl REST Cookbook - Virtual Server (ltm virtual)","conversation":{"__ref":"Conversation:conversation:287546"},"id":"message:287546","revisionNum":3,"uid":287546,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:411763"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":17762},"postTime":"2017-01-03T17:28:00.000-08:00","lastPublishTime":"2024-10-30T11:52:28.386-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" This cookbook lists selected ready-to-use iControl REST curl commands for virtual-server related resources. Each recipe consists of the curl command, it's tmsh equivalent, and sample output. \n In this cookbook, the following curl options are used.  \n Option Meaning\n______________________________________________________________________________________\n -s Suppress progress meter. Handy when you want to pipe the output.\n______________________________________________________________________________________\n -k Allows \"insecure\" SSL connections.\n______________________________________________________________________________________\n -u Specify user ID and password. For the start, you should use the \"admin\"\n account that you normally use to access the Configuration Utility.\n When you specify the password at the same time,\n concatenate with \":\". e.g., admin:admin.\n______________________________________________________________________________________\n -X <method> Specify the HTTP method. When omitted, the default is GET. In the REST\n framework, POST means create (tmsh create), PATCH means overwriting the\n existing resource with the data sent (tmsh modify), and PATCH is for \n merging (ditto).\n______________________________________________________________________________________\n -H <Header> Specify the request header. When you send (POST, PATCH, PUT) data, you\n need to tell the server that the data is in JSON format.\n i.e., -H \"Content-Type: application/json.\n______________________________________________________________________________________\n -d 'data' The JSON data to send. Note that you need to quote the entire json\n blob, and each \"name\":\"value\" pairs must be quoted. When you have \n nested quotes, make sure you escape (\\) them.\n \n Get information of the virtual <vs> \n tmsh list ltm <vs> \n curl -sku admin:admin https://<host>/mgmt/tm/ltm/virtual/<vs>\n \n Sample Output \n {\n kind: 'tm:ltm:virtual:virtualstate',\n name: 'vs',\n fullPath: 'vs',\n generation: 1109,\n selfLink: 'https://localhost/mgmt/tm/ltm/virtual/vs?ver=12.1.0',\n addressStatus: 'yes',\n autoLasthop: 'default',\n cmpEnabled: 'yes',\n connectionLimit: 0,\n description: 'TestData',\n destination: '/Common/192.168.184.226:80',\n enabled: true,\n gtmScore: 0,\n ipProtocol: 'tcp',\n mask: '255.255.255.255',\n mirror: 'disabled',\n mobileAppTunnel: 'disabled',\n nat64: 'disabled',\n pool: '/Common/vs-pool',\n poolReference: { link: 'https://localhost/mgmt/tm/ltm/pool/~Common~vs-pool?ver=12.1.0' },\n rateLimit: 'disabled',\n rateLimitDstMask: 0,\n rateLimitMode: 'object',\n rateLimitSrcMask: 0,\n serviceDownImmediateAction: 'none',\n source: '0.0.0.0/0',\n sourceAddressTranslation: { type: 'automap' },\n sourcePort: 'preserve',\n synCookieStatus: 'not-activated',\n translateAddress: 'enabled',\n translatePort: 'enabled',\n vlansDisabled: true,\n vsIndex: 4,\n rules: [ '/Common/irule' ],\n rulesReference: [ { link: 'https://localhost/mgmt/tm/ltm/rule/~Common~iRuleTest?ver=12.1.0' } ],\n policiesReference: {\n link: 'https://localhost/mgmt/tm/ltm/virtual/~Common~vs/policies?ver=12.1.0',\n isSubcollection: true\n },\n profilesReference: {\n link: 'https://localhost/mgmt/tm/ltm/virtual/~Common~vs/profiles?ver=12.1.0',\n isSubcollection: true\n }\n}\n \n Get only specfic field of the virtual <vs> \n The naming convension for the parameters is slightly different from the ones on tmsh, so look for the familiar names in the GET response above. The example below queris the Default Pool (pool). \n tmsh list ltm <vs> pool \n curl -sku admin:admin https://<host>/mgmt/tm/ltm/virtual/<vs>?options=pool\n \n Sample Output \n {\n kind: 'tm:ltm:virtual:virtualstate',\n name: 'vs',\n fullPath: 'vs',\n generation: 1,\n selfLink: 'https://localhost/mgmt/tm/ltm/virtual/vs?options=pool&ver=12.1.1',\n pool: '/Common/vs-pool',\n poolReference: {\n link: 'https://localhost/mgmt/tm/ltm/pool/~Common~vs-pool?ver=12.1.1'\n }\n}\n \n Get all the information of the virtual <vs> \n Unlike the tmsh equivalent, iControl REST GET does not return the configuration information of the attached policies and profiles. To see them, use \n expandSubcollections tmsh list ltm <vs> \n curl -sku admin:admin https://<host>/mgmt/tm/ltm/virtual/<vs>?expandSubcollections=true\n \n Sample Output \n {\n \"addressStatus\": \"yes\",\n \"autoLasthop\": \"default\",\n \"cmpEnabled\": \"yes\",\n \"connectionLimit\": 0,\n \"destination\": \"/Common/192.168.184.240:80\",\n \"enabled\": true,\n \"fullPath\": \"vs\",\n \"generation\": 291,\n \"gtmScore\": 0,\n \"ipProtocol\": \"tcp\",\n \"kind\": \"tm:ltm:virtual:virtualstate\",\n \"mask\": \"255.255.255.255\",\n \"mirror\": \"disabled\",\n \"mobileAppTunnel\": \"disabled\",\n \"name\": \"vs\",\n \"nat64\": \"disabled\",\n \"policiesReference\": {\n \"isSubcollection\": true,\n \"link\": \"https://localhost/mgmt/tm/ltm/virtual/~Common~vs/policies?ver=13.1.0\"\n },\n \"pool\": \"/Common/CentOS-all80\",\n \"poolReference\": {\n \"link\": \"https://localhost/mgmt/tm/ltm/pool/~Common~CentOS-all80?ver=13.1.0\"\n },\n \"profilesReference\": {\n \"isSubcollection\": true,\n \"items\": [\n {\n \"context\": \"all\",\n \"fullPath\": \"/Common/http\",\n \"generation\": 291,\n \"kind\": \"tm:ltm:virtual:profiles:profilesstate\",\n \"name\": \"http\",\n \"nameReference\": {\n \"link\": \"https://localhost/mgmt/tm/ltm/profile/http/~Common~http?ver=13.1.0\"\n },\n \"partition\": \"Common\",\n \"selfLink\": \"https://localhost/mgmt/tm/ltm/virtual/~Common~vs/profiles/~Common~http?ver=13.1.0\"\n },\n {\n \"context\": \"all\",\n \"fullPath\": \"/Common/tcp\",\n \"generation\": 287,\n \"kind\": \"tm:ltm:virtual:profiles:profilesstate\",\n \"name\": \"tcp\",\n \"nameReference\": {\n \"link\": \"https://localhost/mgmt/tm/ltm/profile/tcp/~Common~tcp?ver=13.1.0\"\n },\n \"partition\": \"Common\",\n \"selfLink\": \"https://localhost/mgmt/tm/ltm/virtual/~Common~vs/profiles/~Common~tcp?ver=13.1.0\"\n }\n ],\n \"link\": \"https://localhost/mgmt/tm/ltm/virtual/~Common~vs/profiles?ver=13.1.0\"\n },\n \"rateLimit\": \"disabled\",\n \"rateLimitDstMask\": 0,\n \"rateLimitMode\": \"object\",\n \"rateLimitSrcMask\": 0,\n \"selfLink\": \"https://localhost/mgmt/tm/ltm/virtual/vs?expandSubcollections=true&ver=13.1.0\",\n \"serviceDownImmediateAction\": \"none\",\n \"source\": \"0.0.0.0/0\",\n \"sourceAddressTranslation\": {\n \"type\": \"automap\"\n },\n \"sourcePort\": \"preserve\",\n \"synCookieStatus\": \"not-activated\",\n \"translateAddress\": \"enabled\",\n \"translatePort\": \"enabled\",\n \"vlansDisabled\": true,\n \"vsIndex\": 2\n}\n \n Get stats of the virtual <vs> \n tmsh show ltm <vs> \n curl -sku admin:admin https://<host>/mgmt/tm/ltm/virtual/<vs>/stats\n \n Sample Output \n {\n kind: 'tm:ltm:virtual:virtualstats',\n generation: 1109,\n selfLink: 'https://localhost/mgmt/tm/ltm/virtual/vs/stats?ver=12.1.0',\n entries:\n { 'https://localhost/mgmt/tm/ltm/virtual/vs/~Common~vs/stats':\n { nestedStats:\n { kind: 'tm:ltm:virtual:virtualstats',\n selfLink: 'https://localhost/mgmt/tm/ltm/virtual/vs/~Common~vs/stats?ver=12.1.0',\n entries:\n { 'clientside.bitsIn': { value: 12880 },\n 'clientside.bitsOut': { value: 34592 },\n 'clientside.curConns': { value: 0 },\n 'clientside.evictedConns': { value: 0 },\n 'clientside.maxConns': { value: 2 },\n 'clientside.pktsIn': { value: 26 },\n 'clientside.pktsOut': { value: 26 },\n 'clientside.slowKilled': { value: 0 },\n 'clientside.totConns': { value: 6 },\n cmpEnableMode: { description: 'all-cpus' },\n cmpEnabled: { description: 'enabled' },\n csMaxConnDur: { value: 37 },\n csMeanConnDur: { value: 29 },\n csMinConnDur: { value: 17 },\n destination: { description: '192.168.184.226:80' },\n 'ephemeral.bitsIn': { value: 0 },\n 'ephemeral.bitsOut': { value: 0 },\n 'ephemeral.curConns': { value: 0 },\n 'ephemeral.evictedConns': { value: 0 },\n 'ephemeral.maxConns': { value: 0 },\n 'ephemeral.pktsIn': { value: 0 },\n 'ephemeral.pktsOut': { value: 0 },\n 'ephemeral.slowKilled': { value: 0 },\n 'ephemeral.totConns': { value: 0 },\n fiveMinAvgUsageRatio: { value: 0 },\n fiveSecAvgUsageRatio: { value: 0 },\n tmName: { description: '/Common/vs' },\n oneMinAvgUsageRatio: { value: 0 },\n 'status.availabilityState': { description: 'available' },\n 'status.enabledState': { description: 'enabled' },\n 'status.statusReason': { description: 'The virtual server is available' },\n syncookieStatus: { description: 'not-activated' },\n 'syncookie.accepts': { value: 0 },\n 'syncookie.hwAccepts': { value: 0 },\n 'syncookie.hwSyncookies': { value: 0 },\n 'syncookie.hwsyncookieInstance': { value: 0 },\n 'syncookie.rejects': { value: 0 },\n 'syncookie.swsyncookieInstance': { value: 0 },\n 'syncookie.syncacheCurr': { value: 0 },\n 'syncookie.syncacheOver': { value: 0 },\n 'syncookie.syncookies': { value: 0 },\n totRequests: { value: 4 }\n }\n }\n }\n }\n}\n \n Change one of the configuration options of the virtual <vs> \n The command below changes the Description field of the virtual (\"description\" in tmsh and iControl REST). \n tmsh modify ltm virtual <vs> description \"Hello World!\" \n curl -sku admin:admin https://<host>/mgmt/tm/ltm/virtual/<vs> \\\n  -X PATCH -H \"Content-Type: application/json\" \\\n -d '{\"description\": \"Hello World!\"}' \n \n Sample Output \n {\n kind: 'tm:ltm:virtual:virtualstate',\n name: 'vs',\n ... \n description: 'Hello World!', <==== Changed.\n ...\n}\n \n Disable the virtual <vs> \n The command syntax is same as above: To change the state of a virtual from \"enabled\" to \"disabled\", send \"disabled\":true. For enabling the virtual, use \"enabled\":true. Note that the Boolean type true/false does not require quotations. \n tmsh modify ltm virtual <vs> disabled \n curl -sku admin:admin https://<host>/mgmt/tm/ltm/virtual/<vs> \\\n  -X PATCH -H \"Content-Type: application/json\" \\\n -d '{\"disabled\": true}' \\\n \n Sample Output \n {\n kind: 'tm:ltm:virtual:virtualstate',\n name: 'vs',\n fullPath: 'vs',\n ...\n disabled: true, <== Changed\n ...\n}\n \n Add another iRule to <vs> \n When the virtual has iRules already attached, you need to send the existing ones too along with the additional one. For example, to add /Common/testRule1 to the virtual with /Common/testRule1, specify both in an array (square brackets). Note that the /Common/testRule2 iRule object should be already created. \n tmsh modify ltm virtual <vs> rules {testRule1 testRule2} \n curl -sku admin:admin https://<host>/mgmt/tm/ltm/virtual/<vs> \\\n  -X PATCH -H \"Content-Type: application/json\" \\\n -d '{\"rules\": [\"/Common/testRule1\", \"/Common/testRule2\"] }' \n \n Sample Output \n {\n kind: 'tm:ltm:virtual:virtualstate',\n name: 'vs',\n fullPath: 'vs',\n ...\n rules: [ '/Common/test1', '/Common/test2' ], <== Changed\n rulesReference:\n [ { link: 'https://localhost/mgmt/tm/ltm/rule/~Common~test1?ver=12.1.1' },\n { link: 'https://localhost/mgmt/tm/ltm/rule/~Common~test2?ver=12.1.1' } ],\n ...\n}\n \n Create a new virtual <vs> \n You can create a skeleton virtual by specifying only Destination Address and Mask. The remaining parameters such as profiles are set to default. You can later modify the parameters by PATCH-ing. \n tmsh create ltm virtual <vs> destination <ip:port> mask <ip> \n curl -sku admin:admin -X POST -H \"Content-Type: application/json\" \\\n -d '{\"name\": \"vs\", \"destination\":\"192.168.184.230:80\", \"mask\":\"255.255.255.255\"}' \\\n https://<host>/mgmt/tm/ltm/virtual\n \n Sample Output \n {\n kind: 'tm:ltm:virtual:virtualstate',\n name: 'vs',\n partition: 'Common',\n fullPath: '/Common/vs',\n ...\n destination: '/Common/192.168.184.230:80', <== Created\n ...\n mask: '255.255.255.255', <== Created\n ...\n}\n \n Create a new virtual <vs> with a lot of parameters \n You can specify all the essential parameters upon creation. This example creates a new virtual with pool, default persistence profile, profiles, iRule, and source address translation. The call fails if any of the parameters conflicts. For example, you cannot specify \"Cookie Persistence\" without specifying appropriate profiles. If you do not specify any profile, it falls back to the default \n fastL4 \n , which is not compatible with Cookie Persistence. \n tmsh create ltm virtual <vs> destination <ip:port> mask <ip> pool <pool> persist replace-all-with { cookie } profiles add { tcp http clientssl } rules { <rule> } source-address-translation { type automap } \n curl -sku admin:admin https://<host>/mgmt/tm/ltm/virtual -H \"Content-Type: application/json\" -X POST\n -d '{\"name\": \"vs\", \\\n  \"destination\": \"10.10.10.10:10\", \\\n  \"mask\": \"255.255.255.255\", \\\n  \"pool\": \"CentOS-all80\", \\\n  \"persist\": [ {\"name\": \"cookie\"} ], \\\n  \"profilesReference\": {\"items\": [ {\"context\": \"all\", \"name\": \"http\"}, {\"context\": \"all\", \"name\": \"tcp\"}, {\"context\": \"clientside\", \"name\": \"clientssl\"}] }, \\\n  \"rules\": [ \"ShowVersion\" ], \\\n  \"sourceAddressTranslation\": {\"type\": \"automap\"} }'\n \n Sample Output \n {\n \"addressStatus\": \"yes\",\n \"autoLasthop\": \"default\",\n \"cmpEnabled\": \"yes\",\n \"connectionLimit\": 0,\n \"destination\": \"/Common/10.10.10.10:10\",\n \"enabled\": true,\n \"fullPath\": \"/Common/test\",\n \"generation\": 592,\n \"gtmScore\": 0,\n \"ipProtocol\": \"tcp\",\n \"kind\": \"tm:ltm:virtual:virtualstate\",\n \"mask\": \"255.255.255.255\",\n \"mirror\": \"disabled\",\n \"mobileAppTunnel\": \"disabled\",\n \"name\": \"vs\",\n \"nat64\": \"disabled\",\n \"partition\": \"Common\",\n \"persist\": [\n {\n \"name\": \"cookie\",\n \"nameReference\": {\n \"link\": \"https://localhost/mgmt/tm/ltm/persistence/cookie/~Common~cookie?ver=13.1.0\"\n },\n \"partition\": \"Common\",\n \"tmDefault\": \"yes\"\n }\n ],\n \"policiesReference\": {\n \"isSubcollection\": true,\n \"link\": \"https://localhost/mgmt/tm/ltm/virtual/~Common~test/policies?ver=13.1.0\"\n },\n \"pool\": \"/Common/CentOS-all80\",\n \"poolReference\": {\n \"link\": \"https://localhost/mgmt/tm/ltm/pool/~Common~CentOS-all80?ver=13.1.0\"\n },\n \"profilesReference\": {\n \"isSubcollection\": true,\n \"link\": \"https://localhost/mgmt/tm/ltm/virtual/~Common~test/profiles?ver=13.1.0\"\n },\n \"rateLimit\": \"disabled\",\n \"rateLimitDstMask\": 0,\n \"rateLimitMode\": \"object\",\n \"rateLimitSrcMask\": 0,\n \"rules\": [\n \"/Common/ShowVersion\"\n ],\n \"rulesReference\": [\n {\n \"link\": \"https://localhost/mgmt/tm/ltm/rule/~Common~ShowVersion?ver=13.1.0\"\n }\n ],\n \"selfLink\": \"https://localhost/mgmt/tm/ltm/virtual/~Common~test?ver=13.1.0\",\n \"serviceDownImmediateAction\": \"none\",\n \"source\": \"0.0.0.0/0\",\n \"sourceAddressTranslation\": {\n \"type\": \"automap\"\n },\n \"sourcePort\": \"preserve\",\n \"synCookieStatus\": \"not-activated\",\n \"translateAddress\": \"enabled\",\n \"translatePort\": \"enabled\",\n \"vlansDisabled\": true,\n \"vsIndex\": 52\n}\n \n Delete a virtual <vs> \n tmsh delete ltm virtual <vs> \n curl -sku admin:admin https://192.168.226.55/mgmt/tm/ltm/virtual/<vs> -X DELETE\n \n Sample Output \n No output (just 200 OK and no response body)\n \n References \n \n curl.1 the man page \n curl Releases and Downloads ... including the port for Windows \n Jason Rahm's \"Demystifying iControl REST\" series (DevCentral) -- This is Part I of 7 at the time of this article. \n iControl REST API reference (DevCentral)  \n iControl® REST API User Guide (DevCentral) -- Link is for 12.1. Search for the older versions. \n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"16767","kudosSumWeight":3,"repliesCount":13,"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:290328":{"__typename":"Conversation","id":"conversation:290328","topic":{"__typename":"TkbTopicMessage","uid":290328},"lastPostingActivityTime":"2024-08-29T03:26:38.635-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"},"TkbTopicMessage:message:290328":{"__typename":"TkbTopicMessage","subject":"Demystifying iControl REST Part 7 - Understanding Transactions","conversation":{"__ref":"Conversation:conversation:290328"},"id":"message:290328","revisionNum":2,"uid":290328,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:51154"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":3183},"postTime":"2016-08-12T14:30:00.000-07:00","lastPublishTime":"2023-06-05T22:49:39.204-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" iControl REST. It’s iControl SOAP’s baby, brother, introduced back in TMOS version 11.4 as an early access feature but released fully in version 11.5. Several articles on basic usage have been written about the rest interface so the intent here isn’t basic use, but rather to demystify some of the finer details of using the API. \n\n A few months ago, a question in Q&A from community member spirrello asking how to update a tcp profile on a virtual. He was using bigsuds, the python wrapper for the soap interface. For the rest interface on this particular object, this is easy; just use the put method and supply the payload mapping the updated profile. But for soap, this requires a transaction. There are some changes to BIG-IP via the rest interface, however, like updating an ssl cert or key, that likewise will require a transaction to accomplish. In this article, I’ll show you how to use transactions with the rest interface. \n\n The Fine Print \n\n From the iControl REST user guide, the life cycle of a transaction progresses through three phases: \n\n Creation - This phase occurs when the transaction is created using a POST command. Modification - This phase occurs when commands are added to the transaction, or changes are made to the sequence of commands in the transaction. Commit - This phase occurs when iControl REST runs the transaction. \n\n To create a transaction, post to /tm/transaction \n\n \n POST https://192.168.25.42/mgmt/tm/transaction\n\n {}\n\n Response:\n\n {\n \"transId\":1389812351,\n \"state\":\"STARTED\",\n \"timeoutSeconds\":30,\n \"kind\":\"tm:transactionstate\",\n \"selfLink\":\"https://localhost/mgmt/tm/transaction/1389812351?ver=11.5.0\"\n } \n\n Note the transId, the state, and the timeoutSeconds. You'll need the transId to add or re-sequence commands within the transaction, and the transaction will expire after 30 seconds if no commands are added. You can list all transactions, or the details of a specific transaction with a get request. \n\n \n GET https://192.168.25.42/mgmt/tm/transaction\n GET https://192.168.25.42/mgmt/tm/transaction/transId \n\n To add a command to the transaction, you use the normal method uris, but include the X-F5-REST-Coordination-Id header. This example creates a pool with a single member. \n\n \n POST https://192.168.25.42/mgmt/tm/ltm/pool\n X-F5-REST-Coordination-Id:1389812351\n {\n \"name\":\"tcb-xact-pool\",\n \"members\": [ {\"name\":\"192.168.25.32:80\",\"description\":\"First pool for transactions\"} ]\n } \n\n Not a great example because there is no need for a transaction here, but we'll roll with it! There are several other option methods for interrogating the transaction itself, see the user guide for details. Now we can commit the transaction. To do that, you reference the transaction id in the URI, remove the X-F5-REST-Coordination-Id header and use the patch method with payload key/value state: VALIDATING . \n\n \n PATCH https://localhost/mgmt/tm/transaction/1389812351\n { \"state\":\"VALIDATING\" } \n\n That's all there is to it! Now that you've seen the nitty gritty details, let's take a look at some code samples. \n\n Roll Your Own \n\n In this example, I am needing to update and ssl key and certificate. If you try to update the cert or the key, it will complain that they do not match, so you need to update both at the same time. Assuming you are writing all your code from scratch, this is all it takes in python. Note on line 21 I post with an empty payload, and then on line 23, I add the header with the transaction id. I make my modifications and then in line 31, I remove the header, and finally on line 32, I patch to the transaction id with the appropriate payload. \n\n \n import json\n import requests\n\n btx = requests.session()\n btx.auth = (f5_user, f5_password)\n btx.verify = False\n btx.headers.update({'Content-Type':'application/json'})\n urlb = 'https://{0}/mgmt/tm'.format(f5_host)\n\n domain = 'mydomain.local_sslobj'\n chain = 'mychain_sslobj\n\n try:\n key = btx.get('{0}/sys/file/ssl-key/~Common~{1}'.format(urlb, domain))\n cert = btx.get('{0}/sys/file/ssl-cert/~Common~{1}'.format(urlb, domain))\n chain = btx.get('{0}/sys/file/ssl-cert/~Common~{1}'.format(urlb, 'chain'))\n\n if (key.status_code == 200) and (cert.status_code == 200) and (chain.status_code == 200):\n\n # use a transaction\n txid = btx.post('{0}/transaction'.format(urlb), json.dumps({})).json()['transId']\n # set the X-F5-REST-Coordination-Id header with the transaction id\n btx.headers.update({'X-F5-REST-Coordination-Id': txid})\n\n # make modifications\n modkey = btx.put('{0}/sys/file/ssl-key/~Common~{1}'.format(urlb, domain), json.dumps(keyparams))\n modcert = btx.put('{0}/sys/file/ssl-cert/~Common~{1}'.format(urlb, domain), json.dumps(certparams))\n modchain = btx.put('{0}/sys/file/ssl-cert/~Common~{1}'.format(urlb, 'le-chain'), json.dumps(chainparams))\n\n # remove header and patch to commit the transaction\n del btx.headers['X-F5-REST-Coordination-Id']\n cresult = btx.patch('{0}/transaction/{1}'.format(urlb, txid), json.dumps({'state':'VALIDATING'})).json() \n\n A Little Help from a Friend \n\n The f5-common-python library was released a few months ago to relieve you of a lot of the busy work with building requests. This is great, especially for transactions. To simplify the above code just to the transaction steps, consider: \n\n \n # use a transaction\n txid = btx.post('{0}/transaction'.format(urlb), json.dumps({})).json()['transId']\n # set the X-F5-REST-Coordination-Id header with the transaction id\n btx.headers.update({'X-F5-REST-Coordination-Id': txid})\n\n# do stuff here\n\n # remove header and patch to commit the transaction\n del btx.headers['X-F5-REST-Coordination-Id']\n cresult = btx.patch('{0}/transaction/{1}'.format(urlb, txid), json.dumps({'state':'VALIDATING'})).json() \n\n With the library, it's simplified to: \n\n \n tx = b.tm.transactions.transaction\n with TransactionContextManager(tx) as api:\n # do stuff here\n api.do_stuff \n\n Yep, it's that simple. So if you haven't checked out the f5-common-python library, I highly suggest you do! I'll be writing about how to get started using it next week, and perhaps a follow up on how to contribute to it as well, so stay tuned! ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"6407","kudosSumWeight":2,"repliesCount":9,"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:284347":{"__typename":"Conversation","id":"conversation:284347","topic":{"__typename":"TkbTopicMessage","uid":284347},"lastPostingActivityTime":"2024-07-16T15:08:24.235-07:00","solved":false},"User:user:49289":{"__typename":"User","uid":49289,"login":"JCohen","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-1.svg?time=0"},"id":"user:49289"},"TkbTopicMessage:message:284347":{"__typename":"TkbTopicMessage","subject":"Connection list via iControlREST API","conversation":{"__ref":"Conversation:conversation:284347"},"id":"message:284347","revisionNum":3,"uid":284347,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:49289"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":998},"postTime":"2015-12-29T12:07:41.000-08:00","lastPublishTime":"2024-07-16T15:08:24.235-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: \n This python script will retrieve a filtered list of active connections via the iControl REST API. It supports both the default connection list as well as the detailed list you get by specifying 'all-properties'. \n It has options to generate output on STDOUT as displayed by TMSH (raw), as a JSON formatted dictionary, or written to an Excel spreadsheet. \n Currently tested in python 2.7 and python 3.5 against BIGIP 11.6.0. \n How to use this snippet: \n $ ./conn-list.py -h\nusage: conn-list.py [-h] [-a] [-x FILE | -j | -r] -f P=V host\n\npositional arguments:\n host Host name to connect. Specified as\n [<username>@]<hostname>\n\noptional arguments:\n -h, --help show this help message and exit\n -a, --all-properties Get detailed connection information\n -f P=V, --filter P=V You must have at least one filter argument, but may\n have multiple.\n\nOutput Type:\n -x FILE, --xlout FILE\n Excel workbook to be created.\n -j, --json JSON formatted output to STDOUT\n -r, --raw RAW ouptut from API request (default)\n\nP=V: P = Connection Property (below), V = Value to match.\n Multiple -f options are joined as logical AND.\n\n age Specifies the age, in seconds, of a connection\n cs-client-addr Specifies the clientside remote address of the active connections\n cs-client-port Specifies the clientside remote port of the active connections\n cs-server-addr Specifies the clientside local address of the active connections\n cs-server-port Specifies the clientside local port of the active connections\n protocol Specifies the protocol used for specified connections (for example: tcp, udp)\n ss-client-addr Specifies the serverside local address of the active connections\n ss-client-port Specifies the serverside local port of the active connections\n ss-server-addr Specifies the serverside remote address of the active connections\n ss-server-port Specifies the serverside remote port of the active connections\n type Specifies the connnection type used for specified connections (for example: any, mirror, self)\n\n$ ./conn-list.py -r -f cs-server-port=80 admin@192.0.2.45\nPassword:\nSys::Connections\n192.0.2.31:55345 192.0.2.20:80 192.0.2.31:55345 198.51.100.66:80 tcp 6 (tmm: 1) none\nTotal records returned: 1\n\n$ ./conn-list.py -j -f cs-server-port=80 admin@192.0.62.45\nPassword:\n[{\"acceleration\": \"none\", \"cs-server\": \"192.0.2.20:80\", \"protocol\": \"tcp\", \"cs-client\": \"192.0.2.31:55613\", \"idle\": 1, \"ss-server\": \"198.51.100.66:80\", \"tmm\": 1, \"ss-client\": \"192.0.2.31:55613\"}]\n \n Code : \n #!/usr/bin/env python\n\"\"\"\nThis script will use F5's iControl REST API to collect current connection data. It enforces the use a at least\none filter criteria.\n\nThis has only been tested on 11.6.0 so far. Should be extendable to 11.5.x and 12.x by adding to or\nduplicating Record Definitions and RE sections.\n\"\"\"\n\n\nimport json\nimport sys\nimport getpass\nimport argparse\nimport re\ntry:\n # Py3\n from urllib.parse import urlparse, parse_qs\nexcept ImportError:\n # Py2\n from urlparse import urlparse, parse_qs\n\nimport requests\nfrom openpyxl import Workbook\n\n\nRE_LAST = re.compile('(\\w+)$')\nRE_LAST_TWO = re.compile('([\\w/:\\.]+)\\s+([\\w/:\\.]+)$')\nDETAILED_DEF = {\n '11.6.0':\n {'rec-sep': '---', # actually second line in record.\n 'fields':\n {'Slot': {'re': RE_LAST, 'id': ['slot']},\n 'TMM': {'re': RE_LAST, 'id': ['tmm']},\n 'Acceleration': {'re': RE_LAST, 'id': ['acceleration']},\n 'Protocol': {'re': RE_LAST, 'id': ['protocol']},\n 'Idle Time ': {'re': RE_LAST, 'id': ['idle']},\n 'Idle Timeout': {'re': RE_LAST, 'id': ['idle_timeout']},\n 'Lasthop': {'re': RE_LAST_TWO, 'id': ['lasthop-vlan', 'lasthop-mac']},\n 'Client Addr': {'re': RE_LAST_TWO, 'id': ['cs-client', 'ss-client']},\n 'Server Addr': {'re': RE_LAST_TWO, 'id': ['cs-server', 'ss-server']},\n 'Bits In': {'re': RE_LAST_TWO, 'id': ['cs-bits-in', 'ss-bits-in']},\n 'Bits Out': {'re': RE_LAST_TWO, 'id': ['cs-bits-out', 'ss-bits-out']},\n 'Packets In': {'re': RE_LAST_TWO, 'id': ['cs-packets-in', 'ss-packets-in']},\n 'Packets Out': {'re': RE_LAST_TWO, 'id': ['cs-packets-out', 'ss-packets-out']},\n }\n }\n}\nSHRT_RE_AP = \\\n re.compile(\n '([\\w:\\.]+)\\s+([\\w:\\.]+)\\s+([\\w:\\.]+)\\s+([\\w:\\.]+)\\s+(\\w+)\\s+(\\d+)\\s+\\(tmm: (\\d+)\\)\\s+(\\w+)')\nSHRT_RE_CH = \\\n re.compile(\n '([\\w:\\.]+)\\s+([\\w:\\.]+)\\s+([\\w:\\.]+)\\s+([\\w:\\.]+)\\s+(\\w+)\\s+(\\d+)\\s+\\(slot/tmm: (\\d+)/(\\d+)\\)\\s+(\\w+)')\nSHORT_DEF = {\n '11.6.0':\n {'chs-indc': 'slot',\n 'fields':\n {'appliance': {'re': SHRT_RE_AP, 'id': ['cs-client', 'cs-server', 'ss-client',\n 'ss-server', 'protocol', 'idle', 'tmm',\n 'acceleration']},\n 'chassis': {'re': SHRT_RE_CH, 'id': ['cs-client', 'cs-server', 'ss-client',\n 'ss-server', 'protocol', 'idle', 'slot', 'tmm',\n 'acceleration']},\n }\n }\n}\n\nrequests.packages.urllib3.disable_warnings()\ntry:\n dict.iteritems\nexcept AttributeError:\n # Py3\n def itervalues(d):\n return iter(d.values())\n\n def iteritems(d):\n return iter(d.items())\nelse:\n # Py2\n def itervalues(d):\n return d.itervalues()\n\n def iteritems(d):\n return d.iteritems()\n\n\ndef main():\n parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter)\n parser.add_argument('-a', '--all-properties', dest='detail', action='store_true',\n help='Get detailed connection information')\n outype = parser.add_argument_group(\"Output Type\")\n outputs = outype.add_mutually_exclusive_group()\n outputs.add_argument('-x', '--xlout', action='store', metavar=\"FILE\",\n help='Excel workbook to be created.')\n outputs.add_argument('-j', '--json', action='store_true',\n help='JSON formatted output to STDOUT')\n outputs.add_argument('-r', '--raw', action='store_true',\n help='RAW ouptut from API request (default)')\n parser.add_argument('-f', '--filter', required=True, action='append', metavar='P=V',\n help='You must have at least one filter argument, but may have multiple.')\n parser.add_argument('host',\n help='Host name to connect. Specified as [@]')\n parser.epilog = \"\"\"\nP=V: P = Connection Property (below), V = Value to match.\n Multiple -f options are joined as logical AND.\n\n age Specifies the age, in seconds, of a connection\n cs-client-addr Specifies the clientside remote address of the active connections\n cs-client-port Specifies the clientside remote port of the active connections\n cs-server-addr Specifies the clientside local address of the active connections\n cs-server-port Specifies the clientside local port of the active connections\n protocol Specifies the protocol used for specified connections (for example: tcp, udp)\n ss-client-addr Specifies the serverside local address of the active connections\n ss-client-port Specifies the serverside local port of the active connections\n ss-server-addr Specifies the serverside remote address of the active connections\n ss-server-port Specifies the serverside remote port of the active connections\n type Specifies the connnection type used for specified connections (for example: any, mirror, self)\n\"\"\"\n args = parser.parse_args()\n\n (username, unused, host) = args.host.rpartition('@')\n if not username:\n username = raw_input('Username: ')\n password = getpass.getpass('Password: ')\n filter_prop = '+'.join(args.filter)\n filter_prop = filter_prop.replace('=', '+')\n (ctext, ver) = get_conn_list(host, username, password, filter_prop, args.detail)\n if not ctext:\n print('No connection list was returned from {}.'.format(host))\n quit()\n if not args.xlout and not args.json:\n raw_output(ctext)\n else:\n if args.detail:\n conns, patterns = process_detailed_conns(ctext, ver)\n else:\n conns, patterns = process_short_conns(ctext, ver)\n if args.xlout:\n excel_output(conns, args.xlout, patterns)\n elif args.json:\n json_output(conns)\n\n\n# noinspection PyBroadException\ndef get_conn_list(host, uname, pw, options, detail):\n conntext = []\n version = ''\n b = requests.session()\n b.auth = (uname, pw)\n b.verify = False\n b.headers.update({'Content-Type': 'application/json'})\n b_url = 'https://{}/mgmt/tm'.format(host)\n if detail:\n options += \"+all-properties\"\n try:\n resp = b.get(b_url + '/sys/connection/?options=' + options, timeout=6.05)\n if resp.status_code == requests.codes.ok:\n j = json.loads(resp.text)\n version = parse_qs(urlparse(j['selfLink']).query)['ver'][0]\n conntext = j['apiRawValues']['apiAnonymous'].splitlines()\n else:\n sys.stderr.write(\n 'Error: {} status returned from: {}\\n {}\\n'.format(resp.status_code, host, resp.reason))\n except:\n sys.stderr.write('Error: Could not get data from {}: {}\\n'.format(host, sys.exc_info()[0]))\n return conntext, version\n\n\ndef process_detailed_conns(conntext, ver):\n connlist = []\n patterns = {}\n detailed_record_length = 0\n more_than_one_record = False\n for ndx, val in enumerate(conntext):\n if val.startswith(DETAILED_DEF[ver]['rec-sep']):\n if detailed_record_length == 0:\n detailed_record_length = ndx\n else:\n detailed_record_length = ndx - detailed_record_length\n more_than_one_record = True\n break\n else:\n for p in DETAILED_DEF[ver]['fields']:\n if val.lstrip().startswith(p):\n patterns[ndx - 1] = DETAILED_DEF[ver]['fields'][p]\n break\n if not more_than_one_record: # only one record returned\n detailed_record_length = ndx - 1\n\n ndx = 0\n while ndx < len(conntext) - 1:\n if ndx % detailed_record_length == 1:\n obj = {}\n for offset, data_def in iteritems(patterns):\n match = data_def['re'].search(conntext[ndx + offset])\n for ndx2, col_heading in enumerate(data_def['id']):\n grouping = match.group(ndx2 + 1)\n obj[col_heading] = int(grouping) if grouping.isnumeric() else grouping\n connlist.append(obj)\n ndx += detailed_record_length\n else:\n ndx += 1\n return connlist, patterns\n\n\ndef process_short_conns(ctext, ver):\n connlist = []\n patterns = {}\n if len(ctext) > 2:\n if SHORT_DEF[ver]['chs-indc'] in ctext[1]:\n patterns = SHORT_DEF[ver]['fields']['chassis']\n else:\n patterns = SHORT_DEF[ver]['fields']['appliance']\n\n for row in ctext:\n obj = {}\n match = patterns['re'].search(row)\n if match:\n for ndx, col_heading in enumerate(patterns['id']):\n grouping = match.group(ndx + 1)\n if grouping:\n obj[col_heading] = int(grouping) if grouping.isnumeric() else grouping\n connlist.append(obj)\n return connlist, {1: patterns}\n\n\ndef excel_output(conns, fname, patterns):\n wb = Workbook()\n ws = wb.active\n header = []\n for h in patterns.values():\n header += h['id']\n ws.append(header)\n for r in conns:\n row = []\n for h in header:\n row.append(r[h])\n ws.append(row)\n if not fname.endswith('.xlsx'):\n fname += '.xlsx'\n wb.save(fname)\n\n\ndef json_output(conns):\n print(json.dumps(conns))\n\n\ndef raw_output(data):\n for l in data:\n print(l)\n\n\nif __name__ == '__main__':\n main() \n Tested this on version: \n 11.6 ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"12313","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:283528":{"__typename":"Conversation","id":"conversation:283528","topic":{"__typename":"TkbTopicMessage","uid":283528},"lastPostingActivityTime":"2024-07-11T00:24:14.735-07:00","solved":false},"User:user:190002":{"__typename":"User","uid":190002,"login":"G-Rob","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/images/dS0xOTAwMDItMjE1NDVpQzdCNEVGMTE0QUVGRkI3OA"},"id":"user:190002"},"TkbTopicMessage:message:283528":{"__typename":"TkbTopicMessage","subject":"Generate private key w/ CSR via iControl REST","conversation":{"__ref":"Conversation:conversation:283528"},"id":"message:283528","revisionNum":1,"uid":283528,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:190002"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":2077},"postTime":"2019-08-13T06:10:41.000-07:00","lastPublishTime":"2019-08-13T06:10:41.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: Generate a private key w/ CSR How to use this snippet: To create a private key with a CSR via iControl REST:   POST URL: https://10.1.1.165/mgmt/tm/sys/crypto/key Use the data below as your payload. For the name field, it must end in .key or you will get a false 404! Code : { \n\"name\":\"www.testing.com.key\", \n\"commonName\":\"www.testing.com\", \n\"keySize\":\"4096\", \n\"keyType\":\"rsa-private\", \n\"options\":[{\"gen-csr\":\"www.testing.com\"}], \n\"organization\":\"Let It Snow Corp.\", \n\"ou\":\"Ice Engineering\", \n\"city\":\"Calhoun\", \n\"state\":\"AZ\", \n\"admin-email-address\":\"jerry@letit.snow\", \n\"email-address\":\"beth@letit.snow\", \n\"subject-alternative-name\":\"DNS:www.testing.com\", \n\"challenge-password\":\"myP4ssword\" \n} Tested this on version: 13.0","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"791","kudosSumWeight":3,"repliesCount":11,"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:282980":{"__typename":"Conversation","id":"conversation:282980","topic":{"__typename":"TkbTopicMessage","uid":282980},"lastPostingActivityTime":"2024-07-01T03:22:52.096-07:00","solved":false},"User:user:95365":{"__typename":"User","uid":95365,"login":"Joel_Newton","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-1.svg?time=0"},"id":"user:95365"},"TkbTopicMessage:message:282980":{"__typename":"TkbTopicMessage","subject":"PowerShell module for the F5 LTM REST API","conversation":{"__ref":"Conversation:conversation:282980"},"id":"message:282980","revisionNum":2,"uid":282980,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:95365"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":20051},"postTime":"2015-12-04T06:53:10.000-08:00","lastPublishTime":"2023-06-05T22:21:20.139-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: To report an issue with the F5-LTM or F5-BIGIP modules, please use the Issues sections of the GitHub repos (here and here) instead of commenting here. Thanks! \n This PowerShell module uses the iControlREST API to manipulate and query pools, pool members, virtual servers, and iRules. It aims to support version 11.5.1 and higher, and to conform to the schedule for technical support of versions, though this may eventually prove to become difficult. \n The module currently includes some functionality that, strictly speaking, is outside the scope of the LTM module. Hence, there is an active effort to wrap this LTM module into a larger BIG-IP module, and relocate that functionality elsewhere within that parent module, as well as expand the scope of functionality to include BIG-IP DNS (formerly GTM) and possibly other areas. Both the LTM module and the parent BIG-IP module are projects on github. Please use these projects to report any issues you discover. Thanks! \n The module contains the following functions. \n Add-iRuleToVirtualServer Add-iRuleToVirtualServer Add-PoolMember Add-PoolMonitor Disable-PoolMember Disable-VirtualServer Enable-PoolMember Enable-VirtualServer Get-CurrentConnectionCount (deprecated; use Get-PoolMemberStats | Select-Object -ExpandProperty 'serverside.curConns') Get-F5Session (will be deprecated in future versions. use New-F5Session) Get-F5Status Get-HealthMonitor Get-HealthMonitorType Get-iRule Get-iRuleCollection (deprecated; use Get-iRule) Get-Node Get-BIGIPPartition Get-Pool Get-PoolList (deprecated; use Get-Pool) Get-PoolMember Get-PoolMemberCollection (deprecated; use Get-PoolMember) Get-PoolMemberCollectionStatus Get-PoolMemberDescription (deprecated; use Get-PoolMember) Get-PoolMemberIP (deprecated; use Get-PoolMember) Get-PoolMembers (deprecated; use Get-PoolMember) Get-PoolMemberStats Get-PoolMemberStatus (deprecated; use Get-PoolMember) Get-PoolMonitor Get-PoolsForMember Get-StatusShape Get-VirtualServer Get-VirtualServeriRuleCollection (deprecated; use Get-VirtualServer | Where rules | Select -ExpandProperty rules) Get-VirtualServerList (deprecated; use Get-VirtualServer) Invoke-RestMethodOverride New-F5Session New-HealthMonitor New-Node New-Pool New-VirtualServer Remove-HealthMonitor Remove-iRule Remove-iRuleFromVirtualServer Remove-Pool Remove-PoolMember Remove-PoolMonitor Remove-ProfileRamCache Remove-Node Remove-VirtualServer Set-iRule Set-PoolLoadBalancingMode (deprecated; use Set-Pool) Set-PoolMemberDescription Set-Pool Set-VirtualServer Sync-DeviceToGroup Test-F5Session Test-Functionality Test-HealthMonitor Test-Node Test-Pool Test-VirtualServer How to use this snippet: To use the module, click 'Download Zip', extract the files, and place them in a folder named F5-LTM beneath your PowerShell modules folder. By default, this is %USERPROFILE%\\Documents\\WindowsPowerShell\\Modules. The WindowsPowerShell and Modules folders may need to be created. \n You will most likely need to unblock the files after extracting them. Use the Unblock-File PS cmdlet to accomplish this. \n The Validation.cs class file (based on code posted by Brian Scholer) allows for using the REST API with LTM devices with self-signed SSL certificates. \n Nearly all of the functions require an F5 session object as a parameter, which contains the base URL for the F5 LTM and a credential object for a user with privileges to manipulate the F5 LTM via the REST API. Use the New-F5session function to create this object. This function expects the following parameters: \n The name or IP address of the F5 LTM device A credential object for a user with rights to use the REST API An optional TokenLifespan value for extending the life of the authentication token past the default 20 minutes \n You can create a credential object using Get-Credential and entering the username and password at the prompts, or programmatically like this: \n $secpasswd = ConvertTo-SecureString \"PlainTextPassword\" -AsPlainText -Force\n$mycreds = New-Object System.Management.Automation.PSCredential \"username\", $secpasswd\n \n\n Thanks to Kotesh Bandhamravuri and his blog entry for this snippet. \n There is a function called Test-Functionality that takes an F5Session object, a new pool name, a new virtual server, an IP address for the virtual server, and a computer name as a pool member, and validates nearly all the functions in the module. \n I've also contributed this code sample for how to gather some basic info about your LTM with this PS module. \n The module has been tested on: \n 11.5.1 Build 8.0.175 Hotfix 8 and later 11.6.0 Build 5.0.429 Hotfix 4 and later 12.0 / 12.1 13.0 Code : https://github.com/joel74/POSH-LTM-Rest Tested this on version: 11.5","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"4803","kudosSumWeight":3,"repliesCount":150,"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:284982":{"__typename":"Conversation","id":"conversation:284982","topic":{"__typename":"TkbTopicMessage","uid":284982},"lastPostingActivityTime":"2024-05-17T01:09:58.725-07:00","solved":false},"User:user:322278":{"__typename":"User","uid":322278,"login":"PeteWhite","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-5.svg?time=0"},"id":"user:322278"},"TkbTopicMessage:message:284982":{"__typename":"TkbTopicMessage","subject":"iCR Python Module for iControl REST","conversation":{"__ref":"Conversation:conversation:284982"},"id":"message:284982","revisionNum":2,"uid":284982,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:322278"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":1260},"postTime":"2016-12-22T13:22:14.000-08:00","lastPublishTime":"2023-06-05T22:44:36.601-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: This is a python module to simplify using iControl REST. \n Install using pip: \n pip install iCR\n or retrieve from https://pypi.python.org/pypi?:action=display&name=iCR&version=2.1\n\n As simple as: \n #!/usr/bin/env python\nfrom iCR import iCR\nbigip = iCR(\"172.24.9.132\",\"admin\",\"admin\")\nvirtuals = bigip.get(\"ltm/virtual\")\nfor vs in virtuals['items']:\n print vs['name']\n \n\n This prints out a list of Virtual Servers. \n Supported methods: \n init(hostname,username,password,[timeout,port,icontrol_version,folder,token,debug]) get(url,[select,top,skip,filter]) -> returns data or False getlarge(url,size,[select]) -> Used to retrieve large datasets in chunks. Returns data or False create(url,data) -> returns data or False modify(url,data,[patch=True]) -> returns data or False delete(url) -> returns True or False upload(file) -> file is a local file eg /var/tmp/test.txt, returns True or False download(file) -> files are located in /shared/images, returns True or False create_cert(files) -> files is an array containing paths to cert and key. Returns name of cert or False get_asm_id(name) -> name is the name of a policy. Returns an array of IDs or False create_hash(name) -> name is the name of the partition and policy. eg /Common/test_policy. This reduces the need to retrieve an array of hashes from the BIG-IP. Returns a string. get_token() -> this retrieves a BIG-IP token based on the username and password and sets it as the token in use. Returns the token ID or False delete_token() -> This deletes the object token from the BIG-IP and from the object create_transaction() -> creates a transaction and returns the transaction number ID as a string, or False. Subsequent requests will be added to the  transaction until commit_transaction is called. Transaction ID is stored in object.transaction commit_transaction() -> Commits the transaction stored in object.transaction. Returns True or False command(args,[cmd]) -> Runs a command using the arguments string args. Returns the returned output or True on success or False on failure.   Note: Be sure to double-escape single quotes eg \\\\' and single escape double quotes eg \\\"   cmd options are ping/save/load/restart/reboot \n Module Variables: \n icr_session - the link to the requests session raw - the raw returned JSON code - the returned HTTP Status Code eg 200 error - in the case of error, the exception error string headers - the response headers icontrol_version - set this to specify a specific version of iControl debug - boolean True or False to set debugging on or off port - set the port ( 443 by default ) folder - set this to create in a specific partition token - use this to set a specific token. If this is set, it will be used instead of basic auth select - use this with get to select the returned data top - use this with get to return a set number of records skip - use this to skip to a specific record number transaction - stores the Transaction ID How to use this snippet: Examples \n Setup a REST connection to a device \n #!/usr/bin/env python\nfrom iCR import iCR\nbigip = iCR(\"172.24.9.132\",\"admin\",\"admin\",timeout=10)\n \n\n Create a Virtual Server \n vs_config = {'name':'test_vs'} \ncreatevs = bigip.create(\"ltm/virtual\",vs_config,timeout=5) \n \n\n Retrieve the VS we just created \n virt = bigip.get(\"ltm/virtual/test_vs\",select=\"name\")\nprint \"Virtual Server created: \" + virt['name']\n \n\n Set the timeout \n bigip.timeout = 20\n \n\n Now delete the VS we just created \n delvs = bigip.delete(\"ltm/virtual/test_vs\")\n \n\n Retrieve ASM policy to ID mapping \n policies = bigip.get(\"asm/policies\",select=\"name,id\")\n \n\n Print a table of ASM policies with learning mode \n print\nprint \"Policy Name Learning Mode\"\nprint \"------------------------------------------\"\nfor item in policies['items']:\n enabled = bigip.get(\"asm/policies/\" + item['id'] + \"/policy-builder\",select=\"learningMode\")\n print '{:32}'.format(item['name']) + enabled['learningMode']\n \n\n File upload \n fp = \"/home/pwhite/input.csv\"\nif bigip.upload(fp):\n print \"File \" + fp + \" uploaded\"\n \n\n File download \n file=\"BIGIP-12.1.2.0.0.249.iso\"\ndownload = bigip.download(file)\nif not download:\n print \"File \" + file + \" download error\"\n \n\n SSL Certificate creation \n In different folder \n bigip.folder = \"TestFolder\"\nfiles = (\"TestCert.crt\",\"TestCert.key\")\ncert = bigip.create_cert(files)\nif cert:\n print \"Certificate \" + cert + \" created\" \n \n\n Turn on debugging \n bigip.debug = True \n Retrieve ASM policy IDs \n asm = bigip.get_asm_id(\"dummy_policy\")\nprint len(asm) + \" IDs returned\"\nprint \"ID: \" + str(asm[0])\n \n\n Convert an ASM policy name to hash \n hash = bigip.create_hash(\"/Common/test-policy\")\nenabled = bigip.get(\"asm/policies/\" + hash + \"/policy-builder\",select=\"learningMode\")\nprint '{:32}'.format(item['name']) + enabled['learningMode']\n \n\n Retrieve and use a token \n bigip.get_token()\n \n\n Delete the token \n bigip.delete_token()\n \n\n Developed on Python 2.7 but works with v3. Works on TMOS 11.6 onwards though some features may not be implemented, such as tokens.\nIf you use this and have found bugs, would like to discuss it or suggest features then please PM me on DevCentral. Tested this on version: 13.0","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"5541","kudosSumWeight":0,"repliesCount":19,"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:231110":{"__typename":"Conversation","id":"conversation:231110","topic":{"__typename":"ForumTopicMessage","uid":231110},"lastPostingActivityTime":"2024-04-21T12:54:28.729-07:00","solved":false},"User:user:191947":{"__typename":"User","uid":191947,"login":"Gary_Galehouse","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-12.svg?time=0"},"id":"user:191947"},"ForumTopicMessage:message:231110":{"__typename":"ForumTopicMessage","subject":"Overwriting or adding LTM SSL Traffic cert and key using iControlREST","conversation":{"__ref":"Conversation:conversation:231110"},"id":"message:231110","revisionNum":2,"uid":231110,"depth":0,"board":{"__ref":"Forum:board:TechnicalForum"},"author":{"__ref":"User:user:191947"},"metrics":{"__typename":"MessageMetrics","views":730},"postTime":"2020-06-03T13:22:24.000-07:00","lastPublishTime":"2023-06-05T23:05:21.987-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Hi, I am trying to overwrite an existing cert and key within the LTM SSL Traffic cert and key using iControlREST. Here is the basic process, and result of each step. Upload key and cert PEM files to the uploads directory. I have tried this step both inside and outside of a transaction with the same result. This works fine. Create a transaction using the transaction REST endpoint. This works fine. Add a command to install the key over the desired SSL Traffic key referencing the local path from step 1 with the transaction id in the header. The command is set to install and from-local-file. Successfully added to the transaction commands. Add a command to install the key over the desired SSL Traffic cert referencing the local path from step 1 with the transaction id in the header.  The command is set to install and from-local-file.  Successfully added to the transaction commands. Get the transaction commands just to observe the contents. The commands are present, and the paths are correct per steps 3 & 4 above. Attempt to commit the transaction, and receive the failure with a message like the one below. message=transaction failed:01070712:3: file (/var/system/tmp/tmsh/GexeqO/IIS-F5v13.key) expected to exist.\n As you can see, F5 is looking in a different directory than specified in steps 3 & 4. I've closely examined all requests and responses using Fiddler, and there's no way to determine the randomly generated sub directory name ('GexeqO' in this particular case). It is different each transaction. Also note, this happens even when not overwriting existing entries. But I am using a transaction so that I don't get the 'key and certificate do not match' message. Any insights would be tremendously helpful. Best, Gary ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"1791","kudosSumWeight":2,"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}}},"Conversation:conversation:151708":{"__typename":"Conversation","id":"conversation:151708","topic":{"__typename":"ForumTopicMessage","uid":151708},"lastPostingActivityTime":"2024-03-15T14:31:54.738-07:00","solved":false},"User:user:232903":{"__typename":"User","uid":232903,"login":"rodolfosalgado_","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-6.svg?time=0"},"id":"user:232903"},"ForumTopicMessage:message:151708":{"__typename":"ForumTopicMessage","subject":"How BIG-IP Token/Authentication works ?","conversation":{"__ref":"Conversation:conversation:151708"},"id":"message:151708","revisionNum":2,"uid":151708,"depth":0,"board":{"__ref":"Forum:board:TechnicalForum"},"author":{"__ref":"User:user:232903"},"metrics":{"__typename":"MessageMetrics","views":2659},"postTime":"2016-07-22T07:30:47.000-07:00","lastPublishTime":"2023-06-04T00:19:55.210-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" I'm unable to find anywhere here/documentation/articles anyone that could explain a little bit better the authentication token when you get the response from the Rest. \n I'm sending the POST to the Rest, and the Rest is returning the Authentication. \n Here is an example: \n token : AD2GKZPXKVTE4WKJEQUZTIPOM3\nname : AD2GKZPXKVTE4WKJEQUZTIPOM3\nuserName : admin\nauthProviderName : tmos\nuser : ...\ngroupReferences : ...\ntimeout : 1200\nstartTime : 2016-07-22T09:24:11.808-0500\naddress : 10.10.10.10\npartition : [All]\ngeneration : 1\nlastUpdateMicros : 1469197451807722\nexpirationMicros : 1469198651808000\nkind : shared:authz:tokens:authtokenitemstate\nselfLink : https://localhost/mgmt/shared/authz/tokens/AD2GKZPXKVTE4WKJEQUZTIPOM3\n \n\n Does anyone knows what is \"lastUpdateMicros\", \"ExpirationMicros\" and what is Timeout actually means ? I'm having several issues in my scripts when I call the Rest and the call just fail. If I try to get a new token the call works. I wonder if could be due the token is expired after is used once. Will the token expire only after 1200 seconds or that is not true ? ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"1201","kudosSumWeight":1,"repliesCount":15,"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-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1745262168714","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-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1745262168714","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1745262168714","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1745262168714","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1745262168714","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-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1745262168714","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagSubscriptionAction-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagSubscriptionAction-1745262168714","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-shared/client/components/common/QueryHandler-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1745262168714","value":{"title":"Query Handler"},"localOverride":false},"Category:category:top":{"__typename":"Category","id":"category:top","nodeType":"category"},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1745262168714","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListTabs-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListTabs-1745262168714","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-components/messages/MessageView/MessageViewInline-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewInline-1745262168714","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-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Pager/PagerLoadMore-1745262168714","value":{"loadMore":"Show More"},"localOverride":false},"CachedAsset:text:en_US-components/customComponent/CustomComponent-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/customComponent/CustomComponent-1745262168714","value":{"errorMessage":"Error rendering component id: {customComponentId}","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/OverflowNav-1745262168714","value":{"toggleText":"More"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1745262168714","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1745262168714","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1745262168714","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/MessageSolvedBadge-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSolvedBadge-1745262168714","value":{"solved":"Solved"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTime-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1745262168714","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-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeIcon-1745262168714","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-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageUnreadCount-1745262168714","value":{"unread":"{count} unread","comments":"{count, plural, one { unread comment} other{ unread comments}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageViewCount-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageViewCount-1745262168714","value":{"textTitle":"{count, plural,one {View} other{Views}}","views":"{count, plural, one{View} other{Views}}"},"localOverride":false},"CachedAsset:text:en_US-components/kudos/KudosCount-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/kudos/KudosCount-1745262168714","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-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRepliesCount-1745262168714","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-1745262168714":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1745262168714","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false}}}},"page":"/tags/TagPage/TagPage","query":{"tagName":"iControlREST"},"buildId":"FP3zsFp6DJl70wDujOvtu","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"f5","openTelemetryServiceVersion":"25.3.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","apolloDevToolsEnabled":false,"inboxMuteWipFeatureEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/customComponent/CustomComponent/CustomComponent.tsx","./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/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":[]}