dashboard-shell-shell 3.0.2-test.20250913 → 3.0.5-test.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (628) hide show
  1. package/assets/data/aws-regions.json +3 -0
  2. package/assets/icons/demo.css:Zone.Identifier +0 -0
  3. package/assets/icons/demo_index.html:Zone.Identifier +0 -0
  4. package/assets/icons/iconfont.css:Zone.Identifier +0 -0
  5. package/assets/icons/iconfont.js:Zone.Identifier +0 -0
  6. package/assets/icons/iconfont.json:Zone.Identifier +0 -0
  7. package/assets/icons/iconfont.ttf:Zone.Identifier +0 -0
  8. package/assets/icons/iconfont.woff2:Zone.Identifier +0 -0
  9. package/assets/icons/iconfont.woff:Zone.Identifier +0 -0
  10. package/assets/images/icons/document.svg +3 -0
  11. package/assets/images/key.svg +17 -0
  12. package/assets/images/providers/sks.svg +1 -0
  13. package/assets/images/vendor/cognito.svg +1 -0
  14. package/assets/styles/app.scss +3 -0
  15. package/assets/styles/base/_basic.scss +10 -0
  16. package/assets/styles/base/_spacing.scss +29 -0
  17. package/assets/styles/base/_variables.scss +16 -10
  18. package/assets/styles/global/_labeled-input.scss +1 -1
  19. package/assets/styles/global/_layout.scss +1 -1
  20. package/assets/styles/themes/_dark.scss +30 -0
  21. package/assets/styles/themes/_light.scss +80 -2
  22. package/assets/translations/en-us.yaml +822 -105
  23. package/assets/translations/zh-hans.yaml +13 -3
  24. package/chart/__tests__/S3.test.ts +2 -1
  25. package/chart/monitoring/index.vue +1 -1
  26. package/cloud-credential/gcp.vue +9 -1
  27. package/components/ActionMenuShell.vue +3 -7
  28. package/components/AppModal.vue +9 -28
  29. package/components/AsyncButton.vue +2 -0
  30. package/components/BrandImage.vue +0 -21
  31. package/components/Certificates.vue +5 -0
  32. package/components/CodeMirror.vue +3 -3
  33. package/components/CommunityLinks.vue +3 -58
  34. package/components/ConfigMapSettings/Settings.vue +377 -0
  35. package/components/ConfigMapSettings/index.vue +354 -0
  36. package/components/CruResource.vue +103 -16
  37. package/components/DetailText.vue +61 -11
  38. package/components/Drawer/Chrome.vue +115 -0
  39. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +61 -0
  40. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +48 -0
  41. package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +54 -0
  42. package/components/Drawer/ResourceDetailDrawer/__tests__/YamlTab.test.ts +80 -0
  43. package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +106 -0
  44. package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
  45. package/components/Drawer/ResourceDetailDrawer/composables.ts +53 -0
  46. package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
  47. package/components/Drawer/ResourceDetailDrawer/index.vue +123 -0
  48. package/components/ExplorerProjectsNamespaces.vue +46 -29
  49. package/components/FilterPanel.vue +156 -0
  50. package/components/FixedBanner.vue +19 -5
  51. package/components/{fleet/ForceDirectedTreeChart/index.vue → ForceDirectedTreeChart.vue} +47 -41
  52. package/components/GrowlManager.vue +16 -15
  53. package/components/IconOrSvg.vue +19 -35
  54. package/components/KeyValueView.vue +1 -1
  55. package/components/LandingPagePreference.vue +2 -0
  56. package/components/Loading.vue +1 -1
  57. package/components/LocaleSelector.vue +10 -2
  58. package/components/PaginatedResourceTable.vue +53 -1
  59. package/components/ProgressBarMulti.vue +1 -0
  60. package/components/PromptModal.vue +38 -7
  61. package/components/PromptRemove.vue +5 -1
  62. package/components/PromptRestore.vue +22 -44
  63. package/components/RelatedResources.vue +4 -12
  64. package/components/Resource/Detail/Additional.vue +46 -0
  65. package/components/Resource/Detail/Card/PodsCard/Bubble.vue +13 -0
  66. package/components/Resource/Detail/Card/PodsCard/composable.ts +30 -0
  67. package/components/Resource/Detail/Card/PodsCard/index.vue +118 -0
  68. package/components/Resource/Detail/Card/ResourceUsageCard/composable.ts +51 -0
  69. package/components/Resource/Detail/Card/ResourceUsageCard/index.vue +79 -0
  70. package/components/Resource/Detail/Card/Scaler.vue +89 -0
  71. package/components/Resource/Detail/Card/StateCard/composables.ts +112 -0
  72. package/components/Resource/Detail/Card/StateCard/index.vue +39 -0
  73. package/components/Resource/Detail/Card/VerticalGap.vue +11 -0
  74. package/components/Resource/Detail/Card/__tests__/Card.test.ts +36 -0
  75. package/components/Resource/Detail/Card/__tests__/PodsCard.test.ts +84 -0
  76. package/components/Resource/Detail/Card/__tests__/ResourceUsageCard.test.ts +72 -0
  77. package/components/Resource/Detail/Card/__tests__/Scaler.test.ts +87 -0
  78. package/components/Resource/Detail/Card/__tests__/StateCard.test.ts +53 -0
  79. package/components/Resource/Detail/Card/__tests__/VerticalGap.test.ts +14 -0
  80. package/components/Resource/Detail/Card/__tests__/index.test.ts +36 -0
  81. package/components/Resource/Detail/Card/index.vue +56 -0
  82. package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +19 -0
  83. package/components/Resource/Detail/Metadata/Annotations/composable.ts +12 -0
  84. package/components/Resource/Detail/Metadata/Annotations/index.vue +31 -0
  85. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
  86. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/index.test.ts +103 -0
  87. package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +72 -0
  88. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +317 -0
  89. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +140 -0
  90. package/components/Resource/Detail/Metadata/KeyValue.vue +140 -0
  91. package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +18 -0
  92. package/components/Resource/Detail/Metadata/Labels/composable.ts +12 -0
  93. package/components/Resource/Detail/Metadata/Labels/index.vue +31 -0
  94. package/components/Resource/Detail/Metadata/Rectangle.vue +34 -0
  95. package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +107 -0
  96. package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +24 -0
  97. package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
  98. package/components/Resource/Detail/Metadata/__tests__/index.test.ts +91 -0
  99. package/components/Resource/Detail/Metadata/composables.ts +81 -0
  100. package/components/Resource/Detail/Metadata/index.vue +88 -0
  101. package/components/Resource/Detail/Page.vue +37 -0
  102. package/components/Resource/Detail/PercentageBar.vue +40 -0
  103. package/components/Resource/Detail/ResourceRow.vue +138 -0
  104. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/composables.test.ts +29 -0
  105. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/index.test.ts +48 -0
  106. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/composables.ts +31 -0
  107. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/index.vue +50 -0
  108. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/__tests__/composables.test.ts +66 -0
  109. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/composables.ts +21 -0
  110. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/index.vue +31 -0
  111. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue +45 -0
  112. package/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue +31 -0
  113. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue +31 -0
  114. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue +22 -0
  115. package/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue +31 -0
  116. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue +32 -0
  117. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Basic.test.ts +40 -0
  118. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/BasicAuth.test.ts +33 -0
  119. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Certificate.test.ts +33 -0
  120. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Registry.test.ts +27 -0
  121. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/ServiceAccountToken.test.ts +33 -0
  122. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Ssh.test.ts +33 -0
  123. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/auth-types.test.ts +186 -0
  124. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/composables.test.ts +102 -0
  125. package/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types.ts +109 -0
  126. package/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables.ts +52 -0
  127. package/components/Resource/Detail/ResourceTabs/SecretDataTab/index.vue +71 -0
  128. package/components/Resource/Detail/SpacedRow.vue +14 -0
  129. package/components/Resource/Detail/StatusBar.vue +59 -0
  130. package/components/Resource/Detail/StatusRow.vue +61 -0
  131. package/components/Resource/Detail/TitleBar/Title.vue +14 -0
  132. package/components/Resource/Detail/TitleBar/Top.vue +14 -0
  133. package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +17 -0
  134. package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +17 -0
  135. package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
  136. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +142 -0
  137. package/components/Resource/Detail/TitleBar/composables.ts +46 -0
  138. package/components/Resource/Detail/TitleBar/index.vue +204 -0
  139. package/components/Resource/Detail/Top/index.vue +34 -0
  140. package/components/Resource/Detail/__tests__/Page.test.ts +32 -0
  141. package/components/Resource/Detail/composables.ts +45 -0
  142. package/components/ResourceDetail/Masthead/__tests__/index.test.ts +70 -0
  143. package/components/ResourceDetail/{__tests__/Masthead.test.ts → Masthead/__tests__/legacy.test.ts} +3 -3
  144. package/components/ResourceDetail/Masthead/index.vue +65 -0
  145. package/components/ResourceDetail/Masthead/latest.vue +44 -0
  146. package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +0 -1
  147. package/components/ResourceDetail/__tests__/index.test.ts +135 -0
  148. package/components/ResourceDetail/index.vue +75 -575
  149. package/components/ResourceDetail/legacy.vue +564 -0
  150. package/components/ResourceList/Masthead.vue +69 -20
  151. package/components/ResourceList/index.vue +3 -2
  152. package/components/ResourceTable.vue +59 -85
  153. package/components/ResourceYaml.vue +15 -2
  154. package/components/RichTranslation.vue +106 -0
  155. package/components/SlideInPanelManager.vue +116 -14
  156. package/components/SortableTable/index.vue +10 -2
  157. package/components/SortableTable/paging.js +15 -16
  158. package/components/SortableTable/selection.js +22 -10
  159. package/components/StateDot/index.vue +28 -0
  160. package/components/StatusBadge.vue +6 -4
  161. package/components/SubtleLink.vue +25 -0
  162. package/components/Tabbed/index.vue +38 -22
  163. package/components/Wizard.vue +16 -3
  164. package/components/YamlEditor.vue +1 -2
  165. package/components/__tests__/AsyncButton.test.ts +39 -0
  166. package/components/__tests__/ConfigMapSettings.test.ts +376 -0
  167. package/components/__tests__/CruResource.test.ts +63 -0
  168. package/components/__tests__/FilterPanel.test.ts +81 -0
  169. package/components/__tests__/GrowlManager.test.ts +0 -25
  170. package/components/__tests__/PromptModal.test.ts +146 -0
  171. package/components/__tests__/PromptRestore.test.ts +1 -65
  172. package/components/__tests__/RichTranslation.test.ts +115 -0
  173. package/components/auth/AuthBanner.vue +15 -14
  174. package/components/auth/Principal.vue +0 -1
  175. package/components/auth/RoleDetailEdit.vue +44 -4
  176. package/components/auth/login/ldap.vue +2 -2
  177. package/components/auth/login/oidc.vue +6 -1
  178. package/components/fleet/FleetApplications.vue +174 -0
  179. package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
  180. package/components/fleet/FleetClusterTargets/index.vue +455 -0
  181. package/components/fleet/FleetClusters.vue +25 -6
  182. package/components/fleet/FleetGitRepoPaths.vue +476 -0
  183. package/components/fleet/FleetHelmOps.vue +123 -0
  184. package/components/fleet/FleetIntro.vue +58 -28
  185. package/components/fleet/FleetNoWorkspaces.vue +5 -1
  186. package/components/fleet/FleetOCIStorageSecret.vue +171 -0
  187. package/components/fleet/FleetRepos.vue +37 -80
  188. package/components/fleet/FleetResources.vue +69 -27
  189. package/components/fleet/FleetSummary.vue +26 -51
  190. package/components/fleet/FleetValuesFrom.vue +295 -0
  191. package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
  192. package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
  193. package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +213 -0
  194. package/components/fleet/__tests__/FleetSummary.test.ts +39 -39
  195. package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
  196. package/components/fleet/dashboard/Empty.vue +73 -0
  197. package/components/fleet/dashboard/ResourceCard.vue +184 -0
  198. package/components/fleet/dashboard/ResourceCardSummary.vue +195 -0
  199. package/components/fleet/dashboard/ResourceDetails.vue +194 -0
  200. package/components/fleet/dashboard/ResourcePanel.vue +384 -0
  201. package/components/form/ArrayList.vue +144 -116
  202. package/components/form/BannerSettings.vue +117 -50
  203. package/components/form/ChangePassword.vue +3 -1
  204. package/components/form/ColorInput.vue +35 -6
  205. package/components/form/FileImageSelector.vue +1 -1
  206. package/components/form/Footer.vue +10 -4
  207. package/components/form/KeyValue.vue +92 -51
  208. package/components/form/LabeledSelect.vue +72 -54
  209. package/components/form/Labels.vue +91 -21
  210. package/components/form/MatchExpressions.vue +56 -9
  211. package/components/form/NameNsDescription.vue +12 -8
  212. package/components/form/Networking.vue +24 -19
  213. package/components/form/NotificationSettings.vue +15 -1
  214. package/components/form/ResourceLabeledSelect.vue +22 -8
  215. package/components/form/ResourceSelector.vue +27 -23
  216. package/components/form/ResourceTabs/index.vue +7 -1
  217. package/components/form/SSHKnownHosts/index.vue +14 -11
  218. package/components/form/SecretSelector.vue +18 -2
  219. package/components/form/Select.vue +57 -26
  220. package/components/form/SelectOrCreateAuthSecret.vue +6 -3
  221. package/components/form/SimpleSecretSelector.vue +17 -4
  222. package/components/form/Taints.vue +21 -2
  223. package/components/form/UnitInput.vue +21 -0
  224. package/components/form/ValueFromResource.vue +31 -19
  225. package/components/form/__tests__/ArrayList.test.ts +32 -0
  226. package/components/form/__tests__/ColorInput.test.ts +35 -0
  227. package/components/form/__tests__/KeyValue.test.ts +36 -0
  228. package/components/form/__tests__/LabeledSelect.test.ts +79 -2
  229. package/components/form/__tests__/Labels.test.ts +360 -0
  230. package/components/form/__tests__/MatchExpressions.test.ts +16 -13
  231. package/components/form/__tests__/Networking.test.ts +116 -0
  232. package/components/form/__tests__/SSHKnownHosts.test.ts +11 -2
  233. package/components/form/__tests__/Select.test.ts +37 -1
  234. package/components/form/__tests__/UnitInput.test.ts +23 -1
  235. package/components/form/labeled-select-utils/labeled-select-pagination.ts +3 -38
  236. package/components/formatter/ClusterLink.vue +5 -8
  237. package/components/formatter/Description.vue +30 -0
  238. package/components/formatter/FleetApplicationClustersReady.vue +77 -0
  239. package/components/formatter/FleetApplicationSource.vue +79 -0
  240. package/components/formatter/FleetSummaryGraph.vue +7 -0
  241. package/components/formatter/PodImages.vue +1 -1
  242. package/components/formatter/WorkloadHealthScale.vue +1 -1
  243. package/components/formatter/__tests__/ClusterLink.test.ts +2 -32
  244. package/components/formatter/__tests__/LiveDate.test.ts +10 -2
  245. package/components/google/AccountAccess.vue +209 -0
  246. package/components/google/types/gcp.d.ts +136 -0
  247. package/components/google/types/index.d.ts +101 -0
  248. package/components/google/util/__mocks__/gcp.ts +465 -0
  249. package/components/google/util/formatter.ts +82 -0
  250. package/components/google/util/gcp.ts +134 -0
  251. package/components/google/util/index.d.ts +11 -0
  252. package/components/nav/Favorite.vue +1 -1
  253. package/components/nav/Group.vue +5 -0
  254. package/components/nav/Header.vue +24 -38
  255. package/components/nav/NamespaceFilter.vue +141 -84
  256. package/components/nav/NotificationCenter/Notification.vue +484 -0
  257. package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
  258. package/components/nav/NotificationCenter/index.vue +148 -0
  259. package/components/nav/TopLevelMenu.helper.ts +55 -34
  260. package/components/nav/TopLevelMenu.vue +11 -0
  261. package/components/nav/Type.vue +4 -1
  262. package/components/nav/WindowManager/ContainerLogs.vue +87 -61
  263. package/components/nav/WindowManager/ContainerLogsActions.vue +76 -0
  264. package/components/nav/WindowManager/index.vue +3 -2
  265. package/components/templates/default.vue +0 -3
  266. package/components/templates/plain.vue +0 -3
  267. package/composables/drawer.ts +26 -0
  268. package/composables/focusTrap.ts +3 -3
  269. package/composables/resources.test.ts +63 -0
  270. package/composables/resources.ts +38 -0
  271. package/composables/useI18n.ts +12 -11
  272. package/composables/useIsNewDetailPageEnabled.ts +17 -0
  273. package/config/labels-annotations.js +22 -11
  274. package/config/pagination-table-headers.js +8 -1
  275. package/config/private-label.js +0 -1
  276. package/config/product/auth.js +20 -3
  277. package/config/product/{cis.js → compliance.js} +23 -26
  278. package/config/product/explorer.js +49 -17
  279. package/config/product/fleet.js +77 -17
  280. package/config/product/manager.js +1 -29
  281. package/config/product/settings.js +23 -11
  282. package/config/query-params.js +16 -1
  283. package/config/roles.ts +2 -1
  284. package/config/router/navigation-guards/authentication.js +51 -2
  285. package/config/router/navigation-guards/index.js +5 -67
  286. package/config/router/routes.js +65 -31
  287. package/config/secret.ts +15 -0
  288. package/config/settings.ts +33 -16
  289. package/config/store.js +2 -0
  290. package/config/system-namespaces.js +1 -1
  291. package/config/table-headers.js +91 -30
  292. package/config/types.js +18 -7
  293. package/config/version.js +1 -1
  294. package/core/plugin-helpers.ts +3 -2
  295. package/core/plugin.ts +32 -7
  296. package/core/types.ts +25 -7
  297. package/detail/catalog.cattle.io.app.vue +5 -1
  298. package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
  299. package/detail/fleet.cattle.io.bundle.vue +70 -6
  300. package/detail/fleet.cattle.io.cluster.vue +28 -15
  301. package/detail/fleet.cattle.io.gitrepo.vue +11 -2
  302. package/detail/fleet.cattle.io.helmop.vue +157 -0
  303. package/detail/management.cattle.io.fleetworkspace.vue +18 -27
  304. package/detail/management.cattle.io.oidcclient.vue +369 -0
  305. package/detail/namespace.vue +0 -3
  306. package/detail/node.vue +20 -16
  307. package/detail/pod.vue +2 -2
  308. package/detail/provisioning.cattle.io.cluster.vue +16 -50
  309. package/detail/service.vue +10 -2
  310. package/detail/workload/index.vue +48 -39
  311. package/dialog/AddCustomBadgeDialog.vue +0 -1
  312. package/{pages/c/_cluster/uiplugins/AddExtensionRepos.vue → dialog/AddExtensionReposDialog.vue} +72 -42
  313. package/dialog/AddonConfigConfirmationDialog.vue +1 -1
  314. package/dialog/AssignToDialog.vue +176 -0
  315. package/dialog/ChangePasswordDialog.vue +106 -0
  316. package/{pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue → dialog/DeveloperLoadExtensionDialog.vue} +74 -71
  317. package/dialog/DisableAuthProviderDialog.vue +101 -0
  318. package/dialog/DrainNode.vue +1 -1
  319. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue → dialog/ExtensionCatalogInstallDialog.vue} +100 -88
  320. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue → dialog/ExtensionCatalogUninstallDialog.vue} +87 -66
  321. package/dialog/FeatureFlagListDialog.vue +288 -0
  322. package/dialog/ForceMachineRemoveDialog.vue +1 -1
  323. package/dialog/GenericPrompt.vue +1 -1
  324. package/dialog/HelmOpForceUpdateDialog.vue +132 -0
  325. package/{components/Import.vue → dialog/ImportDialog.vue} +8 -13
  326. package/{pages/c/_cluster/uiplugins/InstallDialog.vue → dialog/InstallExtensionDialog.vue} +124 -106
  327. package/{components/form/SSHKnownHosts → dialog}/KnownHostsEditDialog.vue +52 -62
  328. package/dialog/MoveNamespaceDialog.vue +157 -0
  329. package/dialog/OidcClientSecretDialog.vue +117 -0
  330. package/dialog/RedeployWorkloadDialog.vue +164 -0
  331. package/dialog/RotateEncryptionKeyDialog.vue +10 -30
  332. package/dialog/ScalePoolDownDialog.vue +1 -1
  333. package/{components/nav/Jump.vue → dialog/SearchDialog.vue} +34 -14
  334. package/{pages/c/_cluster/uiplugins/UninstallDialog.vue → dialog/UninstallExtensionDialog.vue} +67 -58
  335. package/dialog/WechatDialog.vue +57 -0
  336. package/{components/form/SSHKnownHosts → dialog}/__tests__/KnownHostsEditDialog.test.ts +15 -34
  337. package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
  338. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +60 -68
  339. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
  340. package/edit/__tests__/service.test.ts +2 -1
  341. package/edit/auth/ldap/__tests__/config.test.ts +14 -0
  342. package/edit/auth/ldap/config.vue +24 -0
  343. package/edit/auth/oidc.vue +159 -93
  344. package/edit/autoscaling.horizontalpodautoscaler/index.vue +4 -1
  345. package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
  346. package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
  347. package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
  348. package/edit/configmap.vue +8 -2
  349. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  350. package/edit/fleet.cattle.io.gitrepo.vue +70 -256
  351. package/edit/fleet.cattle.io.helmop.vue +786 -0
  352. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  353. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  354. package/edit/logging-flow/index.vue +1 -0
  355. package/edit/logging.banzaicloud.io.output/index.vue +2 -1
  356. package/edit/logging.banzaicloud.io.output/providers/awsElasticsearch.vue +5 -6
  357. package/edit/management.cattle.io.fleetworkspace.vue +44 -10
  358. package/edit/management.cattle.io.oidcclient.vue +162 -0
  359. package/edit/management.cattle.io.project.vue +4 -1
  360. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
  361. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
  362. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  363. package/edit/monitoring.coreos.com.receiver/auth.vue +3 -3
  364. package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
  365. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  366. package/edit/monitoring.coreos.com.route.vue +1 -0
  367. package/edit/namespace.vue +2 -4
  368. package/edit/networking.istio.io.destinationrule/index.vue +4 -1
  369. package/edit/networking.k8s.io.ingress/Certificate.vue +11 -3
  370. package/edit/networking.k8s.io.ingress/__tests__/Certificate.test.ts +37 -0
  371. package/edit/networking.k8s.io.ingress/index.vue +4 -1
  372. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +3 -14
  373. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +57 -62
  374. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +10 -16
  375. package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.test.ts +72 -41
  376. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/mock.json +17 -1
  377. package/edit/networking.k8s.io.networkpolicy/index.vue +23 -31
  378. package/edit/node.vue +1 -0
  379. package/edit/persistentvolume/index.vue +4 -1
  380. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +26 -12
  381. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +69 -2
  382. package/edit/provisioning.cattle.io.cluster/__tests__/utils/rke2-test-data.ts +58 -0
  383. package/edit/provisioning.cattle.io.cluster/index.vue +21 -73
  384. package/edit/provisioning.cattle.io.cluster/rke2.vue +535 -428
  385. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +48 -39
  386. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +5 -3
  387. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
  388. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +2 -2
  389. package/edit/resources.cattle.io.restore.vue +1 -1
  390. package/edit/secret/basic.vue +1 -0
  391. package/edit/secret/index.vue +127 -15
  392. package/edit/service.vue +17 -29
  393. package/edit/serviceaccount.vue +4 -1
  394. package/edit/storage.k8s.io.storageclass/index.vue +4 -1
  395. package/edit/workload/index.vue +11 -15
  396. package/edit/workload/mixins/workload.js +0 -2
  397. package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
  398. package/list/fleet.cattle.io.gitrepo.vue +1 -1
  399. package/list/fleet.cattle.io.helmop.vue +108 -0
  400. package/list/harvesterhci.io.management.cluster.vue +0 -17
  401. package/list/management.cattle.io.feature.vue +4 -288
  402. package/list/management.cattle.io.oidcclient.vue +108 -0
  403. package/list/management.cattle.io.user.vue +13 -20
  404. package/list/namespace.vue +6 -2
  405. package/list/node.vue +2 -0
  406. package/list/projectsecret.vue +345 -0
  407. package/list/secret.vue +109 -0
  408. package/list/workload.vue +6 -2
  409. package/machine-config/__tests__/vmwarevsphere.test.ts +5 -7
  410. package/machine-config/amazonec2.vue +3 -24
  411. package/machine-config/components/GCEImage.vue +374 -0
  412. package/machine-config/google.vue +617 -0
  413. package/machine-config/vmwarevsphere.vue +7 -17
  414. package/mixins/__tests__/brand.spec.ts +170 -0
  415. package/mixins/auth-config.js +8 -1
  416. package/mixins/brand.js +16 -17
  417. package/mixins/create-edit-view/impl.js +10 -1
  418. package/mixins/create-edit-view/index.js +5 -0
  419. package/mixins/preset.js +100 -0
  420. package/mixins/resource-fetch-api-pagination.js +73 -44
  421. package/mixins/resource-fetch.js +18 -8
  422. package/mixins/resource-table-watch.js +45 -0
  423. package/mixins/vue-select-overrides.js +1 -4
  424. package/models/__tests__/chart.test.ts +296 -0
  425. package/models/__tests__/fleet.cattle.io.gitrepo.test.ts +1 -1
  426. package/models/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
  427. package/models/__tests__/node.test.ts +7 -63
  428. package/models/__tests__/workload.test.ts +1 -0
  429. package/models/chart.js +157 -2
  430. package/models/cluster/node.js +2 -1
  431. package/models/cluster.js +32 -2
  432. package/models/cluster.x-k8s.io.machinedeployment.js +11 -2
  433. package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
  434. package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
  435. package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
  436. package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
  437. package/models/fleet-application.js +297 -0
  438. package/models/fleet.cattle.io.bundle.js +9 -8
  439. package/models/fleet.cattle.io.cluster.js +21 -4
  440. package/models/fleet.cattle.io.gitrepo.js +46 -382
  441. package/models/fleet.cattle.io.helmop.js +202 -0
  442. package/models/management.cattle.io.authconfig.js +1 -0
  443. package/models/management.cattle.io.cluster.js +0 -20
  444. package/models/management.cattle.io.feature.js +7 -1
  445. package/models/management.cattle.io.fleetworkspace.js +14 -1
  446. package/models/management.cattle.io.node.js +7 -22
  447. package/models/management.cattle.io.nodepool.js +12 -0
  448. package/models/management.cattle.io.oidcclient.js +18 -0
  449. package/models/management.cattle.io.registration.js +3 -0
  450. package/models/management.cattle.io.setting.js +0 -1
  451. package/models/namespace.js +12 -1
  452. package/models/provisioning.cattle.io.cluster.js +60 -97
  453. package/models/secret.js +157 -2
  454. package/models/service.js +28 -9
  455. package/models/storage.k8s.io.storageclass.js +2 -2
  456. package/models/workload.js +91 -51
  457. package/package.json +6 -5
  458. package/pages/about.vue +17 -61
  459. package/pages/account/index.vue +9 -1
  460. package/pages/auth/login.vue +2 -3
  461. package/pages/auth/verify.vue +13 -1
  462. package/pages/c/_cluster/apps/charts/AddRepoLink.vue +36 -0
  463. package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +80 -0
  464. package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +57 -0
  465. package/pages/c/_cluster/apps/charts/StatusLabel.vue +33 -0
  466. package/pages/c/_cluster/apps/charts/index.vue +501 -468
  467. package/pages/c/_cluster/apps/charts/install.vue +0 -1
  468. package/pages/c/_cluster/auth/roles/index.vue +19 -48
  469. package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
  470. package/pages/c/_cluster/explorer/EventsTable.vue +1 -1
  471. package/pages/c/_cluster/explorer/index.vue +14 -3
  472. package/pages/c/_cluster/explorer/projectsecret.vue +34 -0
  473. package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
  474. package/pages/c/_cluster/fleet/__tests__/index.test.ts +720 -0
  475. package/pages/c/_cluster/fleet/application/_resource/_id.vue +14 -0
  476. package/pages/c/_cluster/fleet/application/_resource/create.vue +14 -0
  477. package/pages/c/_cluster/fleet/application/create.vue +341 -0
  478. package/pages/c/_cluster/fleet/application/index.vue +139 -0
  479. package/pages/c/_cluster/fleet/graph/config.js +277 -0
  480. package/pages/c/_cluster/fleet/index.vue +866 -328
  481. package/pages/c/_cluster/fleet/settings/index.vue +229 -0
  482. package/pages/c/_cluster/longhorn/index.vue +5 -2
  483. package/pages/c/_cluster/settings/banners.vue +56 -2
  484. package/pages/c/_cluster/settings/brand.vue +2 -1
  485. package/pages/c/_cluster/settings/performance.vue +7 -26
  486. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
  487. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
  488. package/pages/c/_cluster/uiplugins/__tests__/AddExtensionRepos.test.ts +4 -7
  489. package/pages/c/_cluster/uiplugins/index.vue +98 -55
  490. package/pages/explorer/resource/detail/configmap.vue +42 -0
  491. package/pages/explorer/resource/detail/projectsecret.vue +9 -0
  492. package/pages/explorer/resource/detail/secret.vue +63 -0
  493. package/pages/home.vue +8 -104
  494. package/pages/prefs.vue +0 -1
  495. package/pages/support/index.vue +4 -6
  496. package/plugins/clean-html.js +2 -0
  497. package/plugins/dashboard-store/__tests__/actions.test.ts +4 -1
  498. package/plugins/dashboard-store/__tests__/normalize.test.ts +223 -0
  499. package/plugins/dashboard-store/__tests__/resource-class.test.ts +191 -0
  500. package/plugins/dashboard-store/__tests__/utils/normalize-usecases.ts +1526 -0
  501. package/plugins/dashboard-store/actions.js +212 -55
  502. package/plugins/dashboard-store/getters.js +112 -24
  503. package/plugins/dashboard-store/mutations.js +61 -12
  504. package/plugins/dashboard-store/normalize.js +29 -19
  505. package/plugins/dashboard-store/resource-class.js +132 -49
  506. package/plugins/steve/__tests__/getters.test.ts +19 -12
  507. package/plugins/steve/__tests__/steve-class.test.ts +1 -0
  508. package/plugins/steve/__tests__/subscribe.spec.ts +324 -1
  509. package/plugins/steve/actions.js +37 -24
  510. package/plugins/steve/getters.js +47 -12
  511. package/plugins/steve/resourceWatcher.js +10 -3
  512. package/plugins/steve/steve-class.js +5 -0
  513. package/plugins/steve/steve-pagination-utils.ts +225 -43
  514. package/plugins/steve/subscribe.js +418 -53
  515. package/plugins/steve/worker/web-worker.advanced.js +5 -1
  516. package/rancher-components/Banner/Banner.test.ts +51 -3
  517. package/rancher-components/Banner/Banner.vue +37 -6
  518. package/rancher-components/Form/Checkbox/Checkbox.test.ts +59 -1
  519. package/rancher-components/Form/Checkbox/Checkbox.vue +27 -9
  520. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +51 -0
  521. package/rancher-components/Form/LabeledInput/LabeledInput.vue +21 -3
  522. package/rancher-components/Form/Radio/RadioButton.test.ts +36 -1
  523. package/rancher-components/Form/Radio/RadioButton.vue +21 -5
  524. package/rancher-components/Form/Radio/RadioGroup.test.ts +60 -0
  525. package/rancher-components/Form/Radio/RadioGroup.vue +81 -38
  526. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +4 -0
  527. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +22 -1
  528. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -0
  529. package/rancher-components/RcButton/RcButton.vue +1 -1
  530. package/rancher-components/RcDropdown/RcDropdown.test.ts +98 -0
  531. package/rancher-components/RcDropdown/RcDropdown.vue +6 -0
  532. package/rancher-components/RcDropdown/RcDropdownItem.vue +8 -55
  533. package/rancher-components/RcDropdown/RcDropdownItemCheckbox.vue +69 -0
  534. package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +93 -0
  535. package/rancher-components/RcDropdown/RcDropdownMenu.vue +7 -8
  536. package/rancher-components/RcDropdown/index.ts +2 -0
  537. package/rancher-components/RcDropdown/useDropdownContext.ts +21 -0
  538. package/rancher-components/RcDropdown/useDropdownItem.ts +92 -0
  539. package/rancher-components/RcItemCard/RcItemCard.test.ts +189 -0
  540. package/rancher-components/RcItemCard/RcItemCard.vue +430 -0
  541. package/rancher-components/RcItemCard/RcItemCardAction.vue +24 -0
  542. package/rancher-components/RcItemCard/index.ts +2 -0
  543. package/rancher-components/StringList/StringList.vue +1 -1
  544. package/scripts/extension/publish +1 -1
  545. package/static/loading-indicator.html +1 -1
  546. package/store/action-menu.js +26 -56
  547. package/store/auth.js +3 -0
  548. package/store/catalog.js +85 -25
  549. package/store/features.js +0 -1
  550. package/store/growl.js +97 -8
  551. package/store/i18n.js +1 -1
  552. package/store/index.js +44 -14
  553. package/store/notifications.ts +426 -0
  554. package/store/prefs.js +2 -8
  555. package/store/slideInPanel.ts +6 -0
  556. package/store/type-map.js +34 -17
  557. package/store/type-map.utils.ts +49 -6
  558. package/store/uiplugins.ts +15 -1
  559. package/types/fleet.d.ts +60 -1
  560. package/types/kube/kube-api.ts +34 -0
  561. package/types/notifications/index.ts +74 -0
  562. package/types/resources/fleet.d.ts +43 -0
  563. package/types/resources/pod-security-admission.ts +36 -0
  564. package/types/resources/settings.d.ts +107 -0
  565. package/types/resources/userPreferences.d.ts +13 -0
  566. package/types/shell/index.d.ts +971 -745
  567. package/types/store/dashboard-store.types.ts +57 -4
  568. package/types/store/pagination.types.ts +41 -9
  569. package/types/store/subscribe.types.ts +50 -0
  570. package/utils/__mocks__/tabbable.js +13 -0
  571. package/utils/__tests__/back-off.test.ts +354 -0
  572. package/utils/__tests__/create-yaml.test.ts +235 -0
  573. package/utils/__tests__/fleet.test.ts +148 -0
  574. package/utils/__tests__/kontainer.test.ts +19 -0
  575. package/utils/__tests__/object.test.ts +54 -1
  576. package/utils/__tests__/string.test.ts +273 -1
  577. package/utils/__tests__/time.test.ts +31 -0
  578. package/utils/auth.js +41 -6
  579. package/utils/back-off.ts +176 -0
  580. package/utils/cluster.js +24 -20
  581. package/utils/create-yaml.js +103 -9
  582. package/utils/crypto/encryption.ts +103 -0
  583. package/utils/cspAdaptor.ts +51 -0
  584. package/utils/error.js +0 -5
  585. package/utils/fleet-types.ts +0 -0
  586. package/utils/fleet.ts +204 -74
  587. package/utils/grafana.js +1 -0
  588. package/utils/kontainer.ts +3 -5
  589. package/utils/object.js +36 -12
  590. package/utils/pagination-utils.ts +50 -3
  591. package/utils/pagination-wrapper.ts +132 -50
  592. package/utils/perf-setting.utils.ts +28 -0
  593. package/utils/release-notes.ts +48 -0
  594. package/utils/selector-typed.ts +210 -0
  595. package/utils/selector.js +29 -6
  596. package/utils/settings.ts +4 -1
  597. package/utils/string.js +24 -0
  598. package/utils/style.ts +39 -0
  599. package/utils/{time.js → time.ts} +25 -6
  600. package/utils/uiplugins.ts +41 -8
  601. package/utils/v-sphere.ts +5 -1
  602. package/utils/validators/formRules/__tests__/index.test.ts +76 -6
  603. package/utils/validators/formRules/index.ts +99 -4
  604. package/utils/window.js +11 -7
  605. package/.DS_Store +0 -0
  606. package/components/AssignTo.vue +0 -199
  607. package/components/DisableAuthProviderModal.vue +0 -115
  608. package/components/MoveModal.vue +0 -167
  609. package/components/PromptChangePassword.vue +0 -123
  610. package/components/ResourceList/Masthead-btn.vue +0 -225
  611. package/components/__tests__/ApplicationCard.test.ts +0 -27
  612. package/components/cards/ApplicationCard.vue +0 -145
  613. package/components/fleet/FleetBundleResources.vue +0 -86
  614. package/components/fleet/ForceDirectedTreeChart/chartIcons.js +0 -17
  615. package/components/formatter/RKETemplateName.vue +0 -37
  616. package/config/product/legacy.js +0 -62
  617. package/config/secret.js +0 -14
  618. package/dialog/SaveAsRKETemplateDialog.vue +0 -139
  619. package/models/etcdbackup.js +0 -45
  620. package/pages/auth copy/login.vue +0 -595
  621. package/pages/auth copy/logout.vue +0 -47
  622. package/pages/auth copy/setup.vue +0 -523
  623. package/pages/auth copy/verify.vue +0 -203
  624. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +0 -249
  625. package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
  626. package/pages/c/_cluster/legacy/project/_page.vue +0 -57
  627. package/pages/c/_cluster/legacy/project/index.vue +0 -32
  628. package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
@@ -1,4 +1,7 @@
1
- import { actions } from '../subscribe';
1
+ import { actions, getters, mutations } from '../subscribe';
2
+ import { REVISION_TOO_OLD } from '../../../utils/socket';
3
+ import { STEVE_WATCH_EVENT } from '../../../types/store/subscribe.types';
4
+ import backOff from '../../../utils/back-off';
2
5
 
3
6
  describe('steve: subscribe', () => {
4
7
  describe('actions', () => {
@@ -106,4 +109,324 @@ describe('steve: subscribe', () => {
106
109
  });
107
110
  });
108
111
  });
112
+
113
+ describe('getters', () => {
114
+ describe('nextResourceVersion', () => {
115
+ const myType = 'myType';
116
+ const myId = `myId`;
117
+
118
+ type Revision = string | number | null | undefined
119
+
120
+ const createState = (revision?: Revision, cachedList?: any[] ) => {
121
+ const typeState: any = {};
122
+
123
+ if (revision !== undefined) {
124
+ typeState.revision = revision;
125
+ }
126
+ if (cachedList !== undefined) {
127
+ typeState.list = cachedList;
128
+ } else {
129
+ typeState.list = [];
130
+ }
131
+
132
+ return { types: { [myType.toLocaleLowerCase()]: typeState } };
133
+ };
134
+
135
+ const createGetters = (revision?: Revision) => {
136
+ return {
137
+ byId: (type: any, id: any) => {
138
+ expect(type).toBe(myType.toLowerCase());
139
+ expect(id).toBe(myId);
140
+
141
+ return { metadata: { resourceVersion: revision } };
142
+ }
143
+ };
144
+ };
145
+
146
+ it.each([
147
+ ['Is String, Return String', createGetters('abc'), myId, 'abc'],
148
+ // This catches old parseInt errors
149
+ ['Is String, Return String (integer prefix)', createGetters('123-abc'), myId, '123-abc'],
150
+ // This catches old parseInt errors
151
+ ['Is String, Return String (integer postfix)', createGetters('abc-123'), myId, 'abc-123'],
152
+ ['Is 0, Return Null', createGetters(0), myId, null],
153
+ ['Is Number, Return Number', createGetters(123), myId, 123],
154
+ ['Is Missing (null), Return Null', createGetters(null), myId, null],
155
+ ['Is Missing (undefined), Return Null', createGetters(undefined), myId, null],
156
+ ])('test revision from a single resource - %s', (_, storeGetters, id, expected) => {
157
+ expect(getters.nextResourceVersion(createState(), storeGetters)(myType, id)).toBe(expected);
158
+ });
159
+
160
+ const createResource = (revision: Revision) => ({ metadata: { resourceVersion: revision } });
161
+
162
+ it.each([
163
+ ['Is String, Return String', createState('abc'), 'abc'],
164
+ ['Is String, Return String (integer prefix)', createState('123-abc'), '123-abc'],
165
+ ['Is String, Return String (integer postfix)', createState('abc-123'), 'abc-123'],
166
+ ['Is 0, Return Null (nothing in cache)', createState(0), null],
167
+ ['Is 0, Return Number (numbers in cache)', createState(0, [createResource(1), createResource(2), createResource(3)]), 3],
168
+ ['Is 0, Return Number (numbers and strings in cache)', createState(0, [createResource(1), createResource('abc-2'), createResource('3-abc')]), 1],
169
+ ['Is 0, Return Null (only strings in cache)', createState(0, [createResource('abc'), createResource('abc-2'), createResource('3-abc')]), null],
170
+ ['Is missing (undefined), Return Null ', createState(undefined), null],
171
+ ['Is missing (null), Return Null', createState(null), null],
172
+ ])('test revision from a collection - %s', (_, state, expected) => {
173
+ expect(getters.nextResourceVersion(state, {})(myType)).toBe(expected);
174
+ });
175
+ });
176
+ });
177
+
178
+ describe('backoff', () => {
179
+ const waitForBackOff = async(advanceTimersByTime = 20000) => {
180
+ jest.advanceTimersByTime(advanceTimersByTime);
181
+ // jest.advanceTimersByTime(advanceTimersByTime);
182
+ await Promise.resolve();
183
+ await Promise.resolve();
184
+ await Promise.resolve();
185
+ };
186
+
187
+ describe('stale cache in replicate that handles watch', () => {
188
+ /**
189
+ 1. ui makes http request.
190
+ - it's handled by up-to-date replica A
191
+ - response contains an up-to-date revision X
192
+ 2. ui makes watch request referencing up-to-date revision X from A
193
+ - it's received by replica B with a stale cache which does not contain revision X.
194
+ - replicate B rejects watch with unknown revision message (i.e. 'too old')
195
+ 3. ui receives unknown revision and makes a new request
196
+ - this should backoff until eventually succeeding
197
+ */
198
+
199
+ const startWatch = ({
200
+ ctx,
201
+ obj, msg,
202
+ revision
203
+ }) => {
204
+ const {
205
+ state, dispatch, getters, rootGetters, commit
206
+ } = ctx;
207
+
208
+ // call watch
209
+ actions.watch({
210
+ state, dispatch, getters, rootGetters
211
+ }, {
212
+ ...obj,
213
+ revision,
214
+ mode: STEVE_WATCH_EVENT.CHANGES,
215
+ force: true,
216
+ });
217
+
218
+ expect(dispatch).toHaveBeenNthCalledWith(1, 'unwatchIncompatible', {
219
+ id: undefined, mode: STEVE_WATCH_EVENT.CHANGES, namespace: undefined, selector: undefined, type: obj.type
220
+ });
221
+
222
+ expect(dispatch).toHaveBeenNthCalledWith(2, 'send', {
223
+ debounceMs: 4000,
224
+ mode: 'resource.changes',
225
+ resourceType: obj.type,
226
+ resourceVersion: revision.toString(),
227
+ });
228
+
229
+ // Receive start from BE
230
+ actions['ws.resource.start']({
231
+ state, dispatch, getters, commit
232
+ }, { ...msg });
233
+
234
+ expect(dispatch).toHaveBeenCalledTimes(2);
235
+ dispatch.mockClear();
236
+ };
237
+
238
+ const errorWatch = ({
239
+ ctx,
240
+ obj, msg,
241
+ }) => {
242
+ const {
243
+ state, dispatch, getters, commit
244
+ } = ctx;
245
+
246
+ // Receive error from BE
247
+ actions['ws.resource.error']({
248
+ dispatch, getters, commit
249
+ }, {
250
+ ...msg,
251
+ data: { error: 'too old' }
252
+ });
253
+ expect(state.inError).toStrictEqual(
254
+ {
255
+ 'type=abc,namespace=,id=,selector=': {
256
+ obj: {
257
+ type: msg.resourceType,
258
+ mode: msg.mode,
259
+ },
260
+ reason: REVISION_TOO_OLD
261
+ }
262
+ }
263
+ );
264
+
265
+ // Receive stop from BE
266
+ actions['ws.resource.stop']({
267
+ state, dispatch, getters, commit
268
+ }, { ...msg });
269
+ // stop tries to watch again, however we're in error so will be ignored
270
+ expect(dispatch).toHaveBeenNthCalledWith(1, 'watch', {
271
+ id: undefined, mode: STEVE_WATCH_EVENT.CHANGES, namespace: undefined, selector: undefined, type: obj.type
272
+ });
273
+
274
+ dispatch.mockClear();
275
+ };
276
+
277
+ const cycleFail = async({
278
+ ctx,
279
+ obj, msg,
280
+ revision,
281
+ tooManyTries = false,
282
+ }) => {
283
+ const { dispatch } = ctx;
284
+
285
+ startWatch({
286
+ ctx, obj, msg, revision
287
+ });
288
+ errorWatch({
289
+ ctx, obj, msg
290
+ });
291
+
292
+ await waitForBackOff(50000);
293
+ await waitForBackOff(50000);
294
+
295
+ if (tooManyTries) {
296
+ expect(dispatch).toHaveBeenCalledTimes(0);
297
+ } else {
298
+ expect(dispatch).toHaveBeenCalledTimes(1);
299
+ expect(dispatch).toHaveBeenCalledWith('resyncWatch', {
300
+ ...msg,
301
+ data: { error: 'too old' }
302
+ });
303
+ }
304
+
305
+ await waitForBackOff();
306
+
307
+ if (tooManyTries) {
308
+ expect(dispatch).toHaveBeenCalledTimes(0);
309
+ } else {
310
+ expect(dispatch).toHaveBeenCalledTimes(1);
311
+ }
312
+
313
+ dispatch.mockClear();
314
+ };
315
+
316
+ const cycleSucceed = async({
317
+ ctx,
318
+ obj, msg,
319
+ revision
320
+ }) => {
321
+ const { dispatch } = ctx;
322
+
323
+ dispatch.mockImplementation(async(type: string) => {
324
+ if (type === 'resyncWatch') {
325
+ return Promise.resolve();
326
+ }
327
+ });
328
+
329
+ startWatch({
330
+ ctx, obj, msg, revision
331
+ });
332
+
333
+ await waitForBackOff();
334
+
335
+ expect(dispatch).toHaveBeenCalledTimes(0);
336
+
337
+ await waitForBackOff();
338
+
339
+ expect(dispatch).toHaveBeenCalledTimes(0);
340
+
341
+ dispatch.mockClear();
342
+ };
343
+
344
+ const dispatch = jest.fn();
345
+ const rootGetters = {
346
+ 'type-map/isSpoofed': () => false,
347
+ 'management/byId': () => ({ value: true })
348
+ };
349
+ const obj = { type: 'abc' };
350
+ const msg = {
351
+ resourceType: obj.type,
352
+ mode: STEVE_WATCH_EVENT.CHANGES,
353
+ };
354
+
355
+ const initStore = () => {
356
+ const state = { started: [], inError: {} };
357
+ const _getters = {
358
+ normalizeType: (type: string) => type,
359
+ schemaFor: () => ({}),
360
+ storeName: 'test',
361
+ inError: (...args) => getters.inError(state)(...args),
362
+ watchStarted: (...args) => getters.watchStarted(state)(...args),
363
+ backOffId: (...args) => getters.backOffId()(...args),
364
+ canBackoff: () => true,
365
+ };
366
+ const commit = (type, ...args) => mutations[type](state, ...args);
367
+
368
+ return {
369
+ state, dispatch, getters: _getters, rootGetters, commit
370
+ };
371
+ };
372
+
373
+ beforeAll(() => {
374
+ jest.useFakeTimers();
375
+ });
376
+
377
+ afterEach(() => {
378
+ backOff.resetAll();
379
+ dispatch.mockClear();
380
+ });
381
+
382
+ // eslint-disable-next-line jest/expect-expect
383
+ it('succeeds', async() => {
384
+ jest.useFakeTimers();
385
+
386
+ const ctx = initStore();
387
+
388
+ await cycleSucceed({
389
+ ctx, msg, obj, revision: 1
390
+ });
391
+ });
392
+
393
+ // eslint-disable-next-line jest/expect-expect
394
+ it('succeeds after a few failures', async() => {
395
+ jest.useFakeTimers();
396
+
397
+ const ctx = initStore();
398
+
399
+ await cycleFail({
400
+ ctx, msg, obj, revision: 1
401
+ });
402
+ await cycleFail({
403
+ ctx, msg, obj, revision: 1
404
+ });
405
+ await cycleFail({
406
+ ctx, msg, obj, revision: 1
407
+ });
408
+ await cycleFail({
409
+ ctx, msg, obj, revision: 1
410
+ });
411
+ await cycleSucceed({
412
+ ctx, msg, obj, revision: 1
413
+ });
414
+ });
415
+
416
+ // eslint-disable-next-line jest/expect-expect
417
+ it('never succeeds', async() => {
418
+ const ctx = initStore();
419
+
420
+ for (let i = 0; i < 10; i++) {
421
+ await cycleFail({
422
+ ctx, msg, obj, revision: 1
423
+ });
424
+ }
425
+
426
+ await cycleFail({
427
+ ctx, msg, obj, revision: 1, tooManyTries: true
428
+ });
429
+ });
430
+ });
431
+ });
109
432
  });
@@ -9,6 +9,7 @@ import { classify } from '@shell/plugins/dashboard-store/classify';
9
9
  import { NAMESPACE } from '@shell/config/types';
10
10
  import { handleKubeApiHeaderWarnings } from '@shell/plugins/steve/header-warnings';
11
11
  import { steveCleanForDownload } from '@shell/plugins/steve/resource-utils';
12
+ import paginationUtils from '@shell/utils/pagination-utils';
12
13
 
13
14
  export default {
14
15
 
@@ -17,7 +18,9 @@ export default {
17
18
  return await loadSchemas(ctx, watch);
18
19
  },
19
20
 
20
- async request({ state, dispatch, rootGetters }, pOpt ) {
21
+ async request({
22
+ state, dispatch, rootGetters, getters
23
+ }, pOpt ) {
21
24
  const opt = pOpt.opt || pOpt;
22
25
  const spoofedRes = await handleSpoofedRequest(rootGetters, 'cluster', opt);
23
26
 
@@ -55,6 +58,9 @@ export default {
55
58
  waiting = state.deferredRequests[key];
56
59
 
57
60
  if ( waiting ) {
61
+ // A matching request has already been made and is currently waiting to complete
62
+ // Avoid making another request, just wait for the original one to complete
63
+ // and return the result of the first call (see `waiting` being processed far below)
58
64
  const later = deferred();
59
65
 
60
66
  waiting.push(later);
@@ -82,6 +88,7 @@ export default {
82
88
  }
83
89
 
84
90
  let paginatedResult;
91
+ const isSteveCacheUrl = getters.isSteveCacheUrl(opt.url);
85
92
 
86
93
  while (true) {
87
94
  try {
@@ -92,24 +99,42 @@ export default {
92
99
  }
93
100
 
94
101
  if (!paginatedResult) {
95
- // First result, so store it
96
- paginatedResult = out;
102
+ const pageByNumber = isSteveCacheUrl && opt.url.includes(`pagesize=${ paginationUtils.defaultPageSize }`) ? {
103
+ total: out.count,
104
+ page: 1,
105
+ url: opt.url,
106
+ } : null;
107
+ const pageByLimit = !pageByNumber ? { } : null;
108
+
109
+ paginatedResult = {
110
+ // initialise some settings
111
+ pageByLimit,
112
+ pageByNumber,
113
+ // First result, so store it
114
+ out
115
+ };
97
116
  } else {
98
117
  // Subsequent request, so add to it
99
- paginatedResult.data = paginatedResult.data.concat(out.data);
118
+ paginatedResult.out.data = paginatedResult.out.data.concat(out.data);
100
119
  }
101
120
 
102
- if (out?.pagination?.next) {
103
- // More results to come, update options
104
- opt.url = out.pagination.next;
121
+ const { total, page, url } = paginatedResult.pageByNumber || {};
122
+
123
+ if (paginatedResult.pageByLimit && out?.pagination?.next) {
124
+ opt.url = out?.pagination?.next;
125
+ } else if (paginatedResult.pageByNumber && (total > paginationUtils.defaultPageSize * page)) {
126
+ paginatedResult.pageByNumber.page += 1;
127
+
128
+ opt.url = addParam(url, 'page', `${ paginatedResult.pageByNumber.page }`);
105
129
  } else {
106
130
  // No more results, so clear out the pagination section (which will be stale from the first request)
107
- delete paginatedResult.pagination?.first;
108
- delete paginatedResult.pagination?.last;
109
- delete paginatedResult.pagination?.next;
110
- delete paginatedResult.pagination?.partial;
131
+ delete paginatedResult.out.pagination?.first;
132
+ delete paginatedResult.out.pagination?.last;
133
+ delete paginatedResult.out.pagination?.next;
134
+ delete paginatedResult.out.pagination?.partial;
135
+ delete paginatedResult.out.continue;
111
136
 
112
- return paginatedResult;
137
+ return paginatedResult.out;
113
138
  }
114
139
  } catch (err) {
115
140
  return onError(err);
@@ -196,18 +221,10 @@ export default {
196
221
  }
197
222
  },
198
223
 
199
- promptMove({ commit, state }, resources) {
200
- commit('action-menu/togglePromptMove', resources, { root: true });
201
- },
202
-
203
224
  promptRestore({ commit, state }, resources ) {
204
225
  commit('action-menu/togglePromptRestore', resources, { root: true });
205
226
  },
206
227
 
207
- assignTo({ commit, state }, resources = []) {
208
- commit('action-menu/toggleAssignTo', resources, { root: true });
209
- },
210
-
211
228
  async resourceAction({ getters, dispatch }, {
212
229
  resource, actionName, body, opt,
213
230
  }) {
@@ -234,10 +251,6 @@ export default {
234
251
  }
235
252
  },
236
253
 
237
- promptUpdate({ commit, state }, resources = []) {
238
- commit('action-menu/togglePromptUpdate', resources, { root: true });
239
- },
240
-
241
254
  async collectionAction({ getters, dispatch }, {
242
255
  type, actionName, body, opt
243
256
  }) {
@@ -15,9 +15,10 @@ import { splitObjectPath } from '@shell/utils/string';
15
15
  import { parseType } from '@shell/models/schema';
16
16
  import {
17
17
  STEVE_AGE_COL,
18
- STEVE_ID_COL, STEVE_LIST_GROUPS, STEVE_NAMESPACE_COL, STEVE_STATE_COL
18
+ STEVE_ID_COL, STEVE_LIST_GROUPS, STEVE_NAME_COL, STEVE_NAMESPACE_COL, STEVE_STATE_COL
19
19
  } from '@shell/config/pagination-table-headers';
20
20
  import { createHeaders } from '@shell/store/type-map.utils';
21
+ import paginationUtils from '@shell/utils/pagination-utils';
21
22
 
22
23
  export const STEVE_MODEL_TYPES = {
23
24
  NORMAN: 'norman',
@@ -36,16 +37,34 @@ const GC_IGNORE_TYPES = {
36
37
  const steveRegEx = new RegExp('(/v1)|(\/k8s\/clusters\/[a-z0-9-]+\/v1)');
37
38
 
38
39
  export default {
39
- urlOptions: () => (url, opt, schema) => {
40
+ /**
41
+ * Is the url path a rancher steve one?
42
+ *
43
+ * Can be used to change behaviour given steve api
44
+ */
45
+ isSteveUrl: () => (urlPath) => steveRegEx.test(urlPath),
46
+ /**
47
+ * Is the url path a rancher steve one AND the steve cache is enabled?
48
+ *
49
+ * Can be used to change behaviour given steve cache api functionality
50
+ */
51
+ isSteveCacheUrl: (state, getters, rootState, rootGetters) => (urlPath) => getters.isSteveUrl(urlPath) && paginationUtils.isSteveCacheEnabled({ rootGetters }),
52
+
53
+ /**
54
+ * opt: ActionFindPageArgs
55
+ */
56
+ urlOptions: (state, getters) => (url, opt, schema) => {
40
57
  opt = opt || {};
41
- const parsedUrl = parse(url);
42
- const isSteve = steveRegEx.test(parsedUrl.path);
58
+ const parsedUrl = parse(url || '');
43
59
 
44
- const stevePagination = stevePaginationUtils.createParamsForPagination(schema, opt);
60
+ const isSteveUrl = getters.isSteveUrl(parsedUrl.path);
61
+ const stevePagination = stevePaginationUtils.createParamsForPagination({ schema, opt });
45
62
 
46
63
  if (stevePagination) {
47
64
  url += `${ (url.includes('?') ? '&' : '?') + stevePagination }`;
48
65
  } else {
66
+ const isSteveCacheUrl = getters.isSteveCacheUrl(parsedUrl.path);
67
+
49
68
  // labelSelector
50
69
  if ( opt.labelSelector ) {
51
70
  url += `${ url.includes('?') ? '&' : '?' }labelSelector=${ opt.labelSelector }`;
@@ -54,6 +73,7 @@ export default {
54
73
 
55
74
  // Filter
56
75
  if ( opt.filter ) {
76
+ // When ui-sql-cache is always on we should look to replace the usages of this with findPage (basically using the new filter definitions)
57
77
  url += `${ (url.includes('?') ? '&' : '?') }`;
58
78
  const keys = Object.keys(opt.filter);
59
79
 
@@ -64,13 +84,12 @@ export default {
64
84
  vals = [vals];
65
85
  }
66
86
 
67
- // Steve's filter options now support more complex filtering not yet implemented here #9341
68
- if (isSteve) {
87
+ if (isSteveUrl) {
69
88
  url += `${ (url.includes('filter=') ? '&' : 'filter=') }`;
70
89
  }
71
90
 
72
91
  const filterStrings = vals.map((val) => {
73
- return `${ encodeURI(key) }=${ encodeURI(val) }`;
92
+ return `${ encodeURI(key) }${ isSteveCacheUrl ? '~' : '=' }${ encodeURI(val) }`;
74
93
  });
75
94
  const urlEnding = url.charAt(url.length - 1);
76
95
  const nextStringConnector = ['&', '?', '='].includes(urlEnding) ? '' : '&';
@@ -97,13 +116,22 @@ export default {
97
116
  }
98
117
  // End: Limit
99
118
 
119
+ // Page Size
120
+ if (isSteveCacheUrl && opt.isCollection) {
121
+ // This is a steve url and the new cache is being used.
122
+ // Pre-cache there was always a max page size (given kube proxy). With cache there's not.
123
+ // So ensure we don't go backwards (and fetch crazy high resource counts) by adding a default
124
+ url += `${ url.includes('?') ? '&' : '?' }pagesize=${ paginationUtils.defaultPageSize }`;
125
+ }
126
+ // End: Page Size
127
+
100
128
  // Sort
101
129
  // Steve's sort options supports multi-column sorting and column specific sort orders, not implemented yet #9341
102
130
  const sortBy = opt.sortBy;
103
131
  const orderBy = opt.sortOrder;
104
132
 
105
133
  if ( sortBy ) {
106
- if (isSteve) {
134
+ if (isSteveUrl) {
107
135
  url += `${ url.includes('?') ? '&' : '?' }sort=${ (orderBy === 'desc' ? '-' : '') + encodeURI(sortBy) }`;
108
136
  } else {
109
137
  url += `${ url.includes('?') ? '&' : '?' }sort=${ encodeURI(sortBy) }`;
@@ -118,7 +146,7 @@ export default {
118
146
  // Exclude
119
147
  // excludeFields should be an array of strings representing the paths of the fields to exclude
120
148
  // only works on Steve but is ignored without error by Norman
121
- if (isSteve) {
149
+ if (isSteveUrl) {
122
150
  if (!Array.isArray(opt?.excludeFields)) {
123
151
  const excludeFields = ['metadata.managedFields'];
124
152
 
@@ -126,9 +154,15 @@ export default {
126
154
  opt.excludeFields = Array.isArray(opt?.omitExcludeFields) ? excludeFields.filter((f) => !f.includes(opt.omitExcludeFields)) : excludeFields;
127
155
  }
128
156
 
129
- const excludeParamsString = opt.excludeFields.map((field) => `exclude=${ field }`).join('&');
157
+ if (opt.excludeFields.length) {
158
+ const excludeParamsString = opt.excludeFields.map((field) => `exclude=${ field }`).join('&');
130
159
 
131
- url += `${ url.includes('?') ? '&' : '?' }${ excludeParamsString }`;
160
+ url += `${ url.includes('?') ? '&' : '?' }${ excludeParamsString }`;
161
+ }
162
+
163
+ if (opt.revision) {
164
+ url += `${ url.includes('?') ? '&' : '?' }${ `revision=${ opt.revision }` }`;
165
+ }
132
166
  }
133
167
  // End: Exclude
134
168
 
@@ -312,6 +346,7 @@ export default {
312
346
  typeOptions: typeMapGetters['optionsFor'](schema, true),
313
347
  schema,
314
348
  columns: {
349
+ name: STEVE_NAME_COL,
315
350
  state: STEVE_STATE_COL,
316
351
  namespace: STEVE_NAMESPACE_COL,
317
352
  age: STEVE_AGE_COL,
@@ -36,12 +36,19 @@ export const WATCH_STATUSES = {
36
36
  REMOVE_REQUESTED: 'removed_requested'
37
37
  };
38
38
 
39
+ /**
40
+ * Create a unique key for a specific resource watch's params
41
+ */
39
42
  export const keyForSubscribe = ({
40
43
  resourceType, type, namespace, id, selector
41
44
  } = {}) => {
42
- return [(resourceType || type), namespace, id, selector] // each watch param in an array
43
- .filter((param) => !!param) // filter out all the empty ones // the filter makes these keys neater
44
- .join('/'); // join into a string so we can use it as an object key
45
+ const keyMap = {
46
+ type: resourceType || type, namespace, id, selector
47
+ };
48
+
49
+ return Object.entries(keyMap)
50
+ .map(([prop, value]) => `${ prop }=${ value || '' }`)
51
+ .join(',');
45
52
  };
46
53
 
47
54
  export const watchKeyFromMessage = (msg) => {
@@ -11,6 +11,7 @@ const STEVE_ADD = [
11
11
  'metadata.clusterName',
12
12
  'metadata.deletionGracePeriodSeconds',
13
13
  'metadata.generateName',
14
+ 'metadata.ownerReferences',
14
15
  ];
15
16
  const STEVE_NEVER_SAVE = NEVER_ADD.filter((na) => !STEVE_ADD.includes(na));
16
17
 
@@ -58,4 +59,8 @@ export default class SteveModel extends HybridModel {
58
59
 
59
60
  return val;
60
61
  }
62
+
63
+ paginationEnabled() {
64
+ return this.$getters['paginationEnabled'](this.type);
65
+ }
61
66
  }