@rancher/shell 3.0.12-rc.2 → 3.0.12-rc.4

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 (473) hide show
  1. package/apis/impl/apis.ts +6 -0
  2. package/apis/index.ts +26 -0
  3. package/apis/intf/resources-api/cluster-api.ts +18 -0
  4. package/apis/intf/resources-api/mgmt-api.ts +15 -0
  5. package/apis/intf/resources-api/resource-base.ts +107 -0
  6. package/apis/intf/resources-api/resource-constants.ts +147 -0
  7. package/apis/intf/resources-api/resources-api.ts +143 -0
  8. package/apis/intf/resources.ts +49 -0
  9. package/apis/intf/{modal.ts → shell-api/modal.ts} +21 -26
  10. package/apis/intf/shell-api/proxy.ts +216 -0
  11. package/apis/intf/{slide-in.ts → shell-api/slide-in.ts} +4 -3
  12. package/apis/intf/{system.ts → shell-api/system.ts} +4 -1
  13. package/apis/intf/shell.ts +12 -6
  14. package/apis/resources/__tests__/resources-api-class.test.ts +550 -0
  15. package/apis/resources/index.ts +22 -0
  16. package/apis/resources/resources-api-class.ts +187 -0
  17. package/apis/shell/__tests__/proxy.test.ts +369 -0
  18. package/apis/shell/index.ts +8 -1
  19. package/apis/shell/modal.ts +4 -1
  20. package/apis/shell/notifications.ts +9 -6
  21. package/apis/shell/proxy.ts +256 -0
  22. package/apis/shell/slide-in.ts +4 -1
  23. package/apis/vue-shim.d.ts +2 -1
  24. package/assets/data/aws-regions.json +4 -0
  25. package/assets/fonts/lato/LatoLatin-Black.woff +0 -0
  26. package/assets/fonts/lato/LatoLatin-Black.woff2 +0 -0
  27. package/assets/fonts/lato/LatoLatin-BlackItalic.woff +0 -0
  28. package/assets/fonts/lato/LatoLatin-BlackItalic.woff2 +0 -0
  29. package/assets/fonts/lato/LatoLatin-Bold.woff +0 -0
  30. package/assets/fonts/lato/LatoLatin-Bold.woff2 +0 -0
  31. package/assets/fonts/lato/LatoLatin-BoldItalic.woff +0 -0
  32. package/assets/fonts/lato/LatoLatin-BoldItalic.woff2 +0 -0
  33. package/assets/fonts/lato/LatoLatin-Heavy.woff +0 -0
  34. package/assets/fonts/lato/LatoLatin-Heavy.woff2 +0 -0
  35. package/assets/fonts/lato/LatoLatin-HeavyItalic.woff +0 -0
  36. package/assets/fonts/lato/LatoLatin-HeavyItalic.woff2 +0 -0
  37. package/assets/fonts/lato/LatoLatin-Italic.woff +0 -0
  38. package/assets/fonts/lato/LatoLatin-Italic.woff2 +0 -0
  39. package/assets/fonts/lato/LatoLatin-Light.woff +0 -0
  40. package/assets/fonts/lato/LatoLatin-Light.woff2 +0 -0
  41. package/assets/fonts/lato/LatoLatin-LightItalic.woff +0 -0
  42. package/assets/fonts/lato/LatoLatin-LightItalic.woff2 +0 -0
  43. package/assets/fonts/lato/LatoLatin-Medium.woff +0 -0
  44. package/assets/fonts/lato/LatoLatin-Medium.woff2 +0 -0
  45. package/assets/fonts/lato/LatoLatin-MediumItalic.woff +0 -0
  46. package/assets/fonts/lato/LatoLatin-MediumItalic.woff2 +0 -0
  47. package/assets/fonts/lato/LatoLatin-Regular.woff +0 -0
  48. package/assets/fonts/lato/LatoLatin-Regular.woff2 +0 -0
  49. package/assets/fonts/lato/LatoLatin-Semibold.woff +0 -0
  50. package/assets/fonts/lato/LatoLatin-Semibold.woff2 +0 -0
  51. package/assets/fonts/lato/LatoLatin-SemiboldItalic.woff +0 -0
  52. package/assets/fonts/lato/LatoLatin-SemiboldItalic.woff2 +0 -0
  53. package/assets/styles/base/_variables.scss +2 -0
  54. package/assets/styles/fonts/_fontstack.scss +132 -8
  55. package/assets/styles/global/_layout.scss +4 -0
  56. package/assets/translations/en-us.yaml +165 -45
  57. package/assets/translations/zh-hans.yaml +1 -7
  58. package/chart/monitoring/ClusterSelector.vue +0 -21
  59. package/chart/monitoring/index.vue +10 -1
  60. package/chart/monitoring/prometheus/index.vue +6 -3
  61. package/components/ActionDropdownShell.vue +2 -1
  62. package/components/CruResource.vue +161 -14
  63. package/components/CruResourceFooter.vue +9 -5
  64. package/components/ExplorerMembers.vue +8 -4
  65. package/components/ExplorerProjectsNamespaces.vue +11 -7
  66. package/components/GrowlManager.vue +4 -0
  67. package/components/InstallHelmCharts.vue +2 -2
  68. package/components/LandingPagePreference.vue +14 -5
  69. package/components/MgmtNodeList.vue +184 -0
  70. package/components/Resource/Detail/Card/StateCard/__tests__/composables.test.ts +90 -1
  71. package/components/Resource/Detail/Card/StateCard/composables.ts +57 -87
  72. package/components/Resource/Detail/Card/StatusCard/__tests__/StatusCard.test.ts +61 -0
  73. package/components/Resource/Detail/Card/StatusCard/index.vue +61 -15
  74. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +17 -1
  75. package/components/Resource/Detail/Metadata/KeyValue.vue +5 -2
  76. package/components/Resource/Detail/Metadata/KeyValueRow.vue +2 -6
  77. package/components/Resource/Detail/Metadata/index.vue +6 -0
  78. package/components/Resource/Detail/ResourcePopover/index.vue +12 -1
  79. package/components/Resource/Detail/SpacedRow.vue +3 -1
  80. package/components/Resource/Detail/TitleBar/index.vue +10 -11
  81. package/components/ResourceDetail/index.vue +1 -1
  82. package/components/ResourceList/Masthead.vue +19 -9
  83. package/components/ResourceList/index.vue +82 -1
  84. package/components/RichTranslation.vue +5 -2
  85. package/components/SelectIconGrid.vue +0 -10
  86. package/components/Setting.vue +1 -0
  87. package/components/SingleClusterInfo.vue +1 -0
  88. package/components/SortableTable/__tests__/sorting.test.ts +126 -0
  89. package/components/SortableTable/index.vue +6 -9
  90. package/components/SortableTable/selection.js +23 -5
  91. package/components/SortableTable/sorting.js +6 -3
  92. package/components/SubtleLink.vue +31 -6
  93. package/components/Tabbed/Tab.vue +29 -3
  94. package/components/Tabbed/index.vue +25 -3
  95. package/components/TableOfContents/TableOfContents.vue +109 -0
  96. package/components/TableOfContents/composables.ts +258 -0
  97. package/components/Window/ContainerShell.vue +21 -11
  98. package/components/Window/__tests__/ContainerShell.test.ts +107 -37
  99. package/components/Wizard.vue +23 -17
  100. package/components/fleet/AppCoChartGrid.vue +401 -0
  101. package/components/fleet/AppCoEmptyState.vue +127 -0
  102. package/components/fleet/AppCoPageHeader.vue +119 -0
  103. package/components/fleet/AppCoVersionSelect.vue +70 -0
  104. package/components/fleet/FleetBundles.vue +100 -12
  105. package/components/fleet/FleetClusterTargets/ClusterSelectionFields.vue +217 -0
  106. package/components/fleet/FleetClusterTargets/TargetsList.vue +123 -35
  107. package/components/fleet/FleetClusterTargets/index.vue +226 -161
  108. package/components/fleet/FleetIntro.vue +7 -3
  109. package/components/fleet/FleetNoWorkspaces.vue +7 -3
  110. package/components/fleet/FleetSecretSelector.vue +5 -3
  111. package/components/fleet/FleetValuesFrom.vue +8 -2
  112. package/components/fleet/GitRepoTargetTab.vue +0 -2
  113. package/components/fleet/HelmOpAdvancedTab.vue +19 -53
  114. package/components/fleet/HelmOpAppCoConfigTab.vue +593 -0
  115. package/components/fleet/HelmOpAppCoResourcesSection.vue +162 -0
  116. package/components/fleet/HelmOpResourcesSection.vue +82 -0
  117. package/components/fleet/HelmOpTargetOptionsSection.vue +89 -0
  118. package/components/fleet/HelmOpTargetTab.vue +64 -60
  119. package/components/fleet/HelmOpValuesTab.vue +129 -105
  120. package/components/fleet/__tests__/AppCoEmptyState.test.ts +71 -0
  121. package/components/fleet/__tests__/AppCoVersionSelect.test.ts +36 -0
  122. package/components/fleet/__tests__/ClusterSelectionFields.test.ts +62 -0
  123. package/components/fleet/__tests__/FleetClusterTargets.test.ts +402 -115
  124. package/components/fleet/__tests__/FleetClusters.test.ts +12 -12
  125. package/components/fleet/__tests__/FleetSecretSelector.test.ts +16 -0
  126. package/components/fleet/__tests__/FleetValuesFrom.test.ts +44 -0
  127. package/components/fleet/__tests__/HelmOpAppCoConfigTab.test.ts +59 -0
  128. package/components/fleet/__tests__/HelmOpAppCoResourcesSection.test.ts +62 -0
  129. package/components/fleet/__tests__/HelmOpResourcesSection.test.ts +43 -0
  130. package/components/fleet/__tests__/HelmOpTargetOptionsSection.test.ts +34 -0
  131. package/components/fleet/__tests__/HelmOpValuesTab.test.ts +39 -0
  132. package/components/fleet/__tests__/__snapshots__/AppCoEmptyState.test.ts.snap +97 -0
  133. package/components/fleet/__tests__/__snapshots__/AppCoVersionSelect.test.ts.snap +30 -0
  134. package/components/fleet/__tests__/__snapshots__/ClusterSelectionFields.test.ts.snap +209 -0
  135. package/components/fleet/__tests__/__snapshots__/HelmOpTargetOptionsSection.test.ts.snap +140 -0
  136. package/components/fleet/dashboard/Empty.vue +8 -4
  137. package/components/fleet/dashboard/ResourceCard.vue +28 -0
  138. package/components/fleet/dashboard/ResourceDetails.vue +28 -0
  139. package/components/fleet/dashboard/__tests__/ResourceCard.test.ts +87 -0
  140. package/components/form/ArrayList.vue +61 -4
  141. package/components/form/KeyValue.vue +23 -2
  142. package/components/form/LabeledSelect.vue +59 -4
  143. package/components/form/Labels.vue +22 -3
  144. package/components/form/NameNsDescription.vue +24 -5
  145. package/components/form/ResourceTabs/index.vue +1 -0
  146. package/components/form/Security.vue +6 -2
  147. package/components/form/WorkloadPorts.vue +2 -7
  148. package/components/form/__tests__/NameNsDescription.test.ts +75 -0
  149. package/components/form/__tests__/Security.test.ts +76 -0
  150. package/components/formatter/Autoscaler.vue +4 -4
  151. package/components/formatter/ClusterKubeVersion.vue +27 -0
  152. package/components/formatter/ClusterLink.vue +1 -7
  153. package/components/formatter/ClusterProvider.vue +6 -10
  154. package/components/formatter/FleetSummaryGraph.vue +0 -3
  155. package/components/formatter/InternalExternalIP.vue +10 -4
  156. package/components/formatter/MachineSummaryGraph.vue +1 -1
  157. package/components/formatter/PodsUsage.vue +2 -2
  158. package/components/formatter/ServiceTargets.vue +26 -7
  159. package/components/formatter/__tests__/Autoscaler.test.ts +19 -22
  160. package/components/formatter/__tests__/FleetSummaryGraph.test.ts +216 -0
  161. package/components/formatter/__tests__/InternalExternalIP.test.ts +132 -0
  162. package/components/formatter/__tests__/PodsUsage.test.ts +6 -10
  163. package/components/formatter/__tests__/ServiceTargets.test.ts +412 -0
  164. package/components/nav/Header.vue +4 -0
  165. package/components/nav/NamespaceFilter.vue +2 -2
  166. package/components/nav/TopLevelMenu.helper.ts +15 -3
  167. package/components/nav/TopLevelMenu.vue +22 -6
  168. package/components/nav/__tests__/Header.test.ts +15 -0
  169. package/components/nav/__tests__/TopLevelMenu.test.ts +263 -21
  170. package/components/templates/default.vue +9 -4
  171. package/components/templates/home.vue +23 -0
  172. package/components/templates/plain.vue +23 -0
  173. package/components/templates/standalone.vue +17 -0
  174. package/composables/useFormValidation.ts +93 -0
  175. package/composables/useHelmOpResources.test.ts +56 -0
  176. package/composables/useHelmOpResources.ts +32 -0
  177. package/composables/useStateColor.test.ts +325 -0
  178. package/composables/useStateColor.ts +128 -0
  179. package/composables/useVeeValidateField.test.ts +159 -0
  180. package/composables/useVeeValidateField.ts +67 -0
  181. package/config/home-links.js +1 -1
  182. package/config/labels-annotations.js +1 -0
  183. package/config/pagination-table-headers.js +18 -1
  184. package/config/product/explorer.js +17 -4
  185. package/config/product/manager.js +84 -21
  186. package/config/router/index.js +16 -0
  187. package/config/router/navigation-guards/__tests__/authentication.test.ts +130 -0
  188. package/config/router/navigation-guards/authentication.js +10 -4
  189. package/config/router/routes.js +26 -6
  190. package/config/settings.ts +0 -2
  191. package/config/table-headers.js +23 -5
  192. package/config/types.js +11 -1
  193. package/core/__tests__/plugin-products.test.ts +904 -20
  194. package/core/plugin-products-base.ts +110 -10
  195. package/core/plugin-products.ts +4 -0
  196. package/core/plugin-types.ts +194 -31
  197. package/core/plugin.ts +18 -7
  198. package/core/productDebugger.js +9 -4
  199. package/core/types-provisioning.ts +77 -31
  200. package/core/types.ts +72 -22
  201. package/detail/__tests__/pod.test.ts +41 -0
  202. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +114 -0
  203. package/detail/__tests__/workload.test.ts +3 -152
  204. package/detail/catalog.cattle.io.clusterrepo.vue +1 -1
  205. package/detail/harvesterhci.io.management.cluster.vue +6 -2
  206. package/detail/pod.vue +1 -1
  207. package/detail/provisioning.cattle.io.cluster.vue +34 -14
  208. package/detail/workload/index.vue +12 -55
  209. package/edit/__tests__/catalog.cattle.io.clusterrepo.test.ts +248 -0
  210. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +105 -0
  211. package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/General.test.ts.snap +6 -0
  212. package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/index.test.ts.snap +1 -0
  213. package/edit/auth/__tests__/azuread.test.ts +247 -39
  214. package/edit/auth/__tests__/github.test.ts +234 -0
  215. package/edit/auth/__tests__/oidc.test.ts +26 -6
  216. package/edit/auth/__tests__/saml.test.ts +196 -0
  217. package/edit/auth/azuread.vue +197 -56
  218. package/edit/auth/github.vue +72 -13
  219. package/edit/auth/ldap/__tests__/index.test.ts +206 -0
  220. package/edit/auth/ldap/config.vue +8 -0
  221. package/edit/auth/ldap/index.vue +75 -1
  222. package/edit/auth/oidc.vue +119 -73
  223. package/edit/auth/saml.vue +76 -12
  224. package/edit/catalog.cattle.io.clusterrepo.vue +140 -32
  225. package/edit/fleet.cattle.io.helmop.vue +491 -136
  226. package/edit/management.cattle.io.user.vue +5 -2
  227. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +13 -4
  228. package/edit/networking.k8s.io.ingress/RulePath.vue +8 -4
  229. package/edit/networking.k8s.io.ingress/index.vue +75 -20
  230. package/edit/provisioning.cattle.io.cluster/__tests__/MachinePool.test.ts +104 -0
  231. package/edit/provisioning.cattle.io.cluster/index.vue +11 -7
  232. package/edit/provisioning.cattle.io.cluster/rke2.vue +92 -14
  233. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +22 -0
  234. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +37 -4
  235. package/edit/provisioning.cattle.io.cluster/tabs/registries/__tests__/RegistryConfigs.test.ts +132 -7
  236. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +2 -1
  237. package/edit/secret/__tests__/ssh.test.ts +5 -6
  238. package/edit/secret/basic.vue +31 -0
  239. package/edit/secret/index.vue +68 -17
  240. package/edit/secret/registry.vue +38 -0
  241. package/edit/secret/ssh.vue +29 -0
  242. package/edit/secret/tls.vue +30 -0
  243. package/edit/service.vue +4 -4
  244. package/edit/workload/Upgrading.vue +3 -3
  245. package/edit/workload/__tests__/Upgrading.test.ts +6 -9
  246. package/edit/workload/mixins/workload.js +2 -1
  247. package/list/fleet.cattle.io.bundle.vue +7 -104
  248. package/list/fleet.cattle.io.clusterregistrationtoken.vue +20 -0
  249. package/list/group.principal.vue +5 -4
  250. package/list/harvesterhci.io.management.cluster.vue +8 -9
  251. package/list/management.cattle.io.user.vue +12 -9
  252. package/list/provisioning.cattle.io.cluster.vue +268 -180
  253. package/list/utils/management.cattle.io.cluster.utils.ts +128 -0
  254. package/mixins/__tests__/auth-config.test.ts +90 -0
  255. package/mixins/__tests__/chart.test.ts +206 -0
  256. package/mixins/__tests__/resource-fetch-api-pagination.test.ts +48 -0
  257. package/mixins/auth-config.js +7 -0
  258. package/mixins/brand.js +2 -1
  259. package/mixins/chart.js +22 -9
  260. package/mixins/child-hook.js +12 -6
  261. package/mixins/create-edit-view/impl.js +5 -3
  262. package/mixins/resource-fetch-api-pagination.js +62 -6
  263. package/models/__tests__/catalog.cattle.io.clusterrepo.test.ts +57 -0
  264. package/models/__tests__/compliance.cattle.io.clusterscan.test.ts +144 -0
  265. package/models/__tests__/ext.cattle.io.kubeconfig.test.ts +67 -67
  266. package/models/__tests__/fleet-application.test.ts +175 -0
  267. package/models/__tests__/fleet.cattle.io.bundle.test.ts +169 -0
  268. package/models/__tests__/fleet.cattle.io.helmop.test.ts +84 -0
  269. package/models/__tests__/management.cattle.io.cluster.test.ts +1 -1
  270. package/models/__tests__/management.cattle.io.node.ts +28 -5
  271. package/models/__tests__/management.cattle.io.nodepool.ts +5 -4
  272. package/models/__tests__/namespace.test.ts +36 -0
  273. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +81 -11
  274. package/models/__tests__/workload.test.ts +401 -26
  275. package/models/base-cluster.x-k8s.io.js +26 -0
  276. package/models/catalog.cattle.io.clusterrepo.js +28 -4
  277. package/models/cluster.js +1 -1
  278. package/models/cluster.x-k8s.io.machine.js +4 -22
  279. package/models/cluster.x-k8s.io.machinedeployment.js +2 -20
  280. package/models/cluster.x-k8s.io.machineset.js +2 -20
  281. package/models/compliance.cattle.io.clusterscan.js +165 -2
  282. package/models/ext.cattle.io.kubeconfig.ts +4 -7
  283. package/models/fleet-application.js +7 -1
  284. package/models/fleet.cattle.io.helmop.js +20 -1
  285. package/models/management.cattle.io.cluster.js +434 -41
  286. package/models/management.cattle.io.node.js +50 -7
  287. package/models/management.cattle.io.nodepool.js +1 -1
  288. package/models/namespace.js +1 -1
  289. package/models/networking.k8s.io.ingress.js +12 -4
  290. package/models/pod.js +33 -1
  291. package/models/provisioning.cattle.io.cluster.js +51 -334
  292. package/models/rke.cattle.io.etcdsnapshot.js +1 -2
  293. package/models/workload.js +108 -13
  294. package/models/workload.service.js +5 -0
  295. package/package.json +22 -39
  296. package/pages/__tests__/readme.test.ts +49 -0
  297. package/pages/about.vue +5 -6
  298. package/pages/auth/login.vue +0 -35
  299. package/pages/auth/setup.vue +13 -3
  300. package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +2 -2
  301. package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +10 -1
  302. package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +76 -0
  303. package/pages/c/_cluster/apps/charts/__tests__/index.test.ts +93 -0
  304. package/pages/c/_cluster/apps/charts/chart.vue +62 -9
  305. package/pages/c/_cluster/apps/charts/index.vue +48 -10
  306. package/pages/c/_cluster/apps/charts/install.vue +122 -113
  307. package/pages/c/_cluster/auth/roles/index.vue +5 -4
  308. package/pages/c/_cluster/explorer/__tests__/index.test.ts +23 -25
  309. package/pages/c/_cluster/explorer/index.vue +5 -49
  310. package/pages/c/_cluster/explorer/workload-dashboard/ByNamespaceSection.vue +31 -0
  311. package/pages/c/_cluster/explorer/workload-dashboard/ByStateSection.vue +138 -0
  312. package/pages/c/_cluster/explorer/workload-dashboard/ByTypeSection.vue +30 -0
  313. package/pages/c/_cluster/explorer/workload-dashboard/WorkloadCard.vue +155 -0
  314. package/pages/c/_cluster/explorer/workload-dashboard/WorkloadNamespaceCard.vue +142 -0
  315. package/pages/c/_cluster/explorer/workload-dashboard/WorkloadTypeCard.vue +159 -0
  316. package/pages/c/_cluster/explorer/workload-dashboard/__tests__/composable.test.ts +561 -0
  317. package/pages/c/_cluster/explorer/workload-dashboard/composable.ts +440 -0
  318. package/pages/c/_cluster/explorer/workload-dashboard/index.vue +187 -0
  319. package/pages/c/_cluster/explorer/workload-dashboard/types.ts +80 -0
  320. package/pages/c/_cluster/fleet/application/create.vue +187 -136
  321. package/pages/c/_cluster/fleet/application/index.vue +5 -3
  322. package/pages/c/_cluster/fleet/application/suse-app-collection/ChartDetailBody.vue +338 -0
  323. package/pages/c/_cluster/fleet/application/suse-app-collection/ChartDetailHeader.vue +121 -0
  324. package/pages/c/_cluster/fleet/application/suse-app-collection/chart.vue +369 -0
  325. package/pages/c/_cluster/fleet/application/suse-app-collection/charts.vue +248 -0
  326. package/pages/c/_cluster/fleet/application/suse-app-collection/credentials.vue +310 -0
  327. package/pages/c/_cluster/fleet/index.vue +2 -2
  328. package/pages/c/_cluster/istio/__tests__/istio.index.test.ts +194 -0
  329. package/pages/c/_cluster/istio/index.vue +21 -6
  330. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +1 -0
  331. package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +815 -2
  332. package/pages/c/_cluster/uiplugins/index.vue +218 -197
  333. package/pages/diagnostic.vue +13 -17
  334. package/pages/fail-whale.vue +30 -7
  335. package/pages/home.vue +93 -306
  336. package/pages/readme.vue +88 -0
  337. package/plugins/clean-html.d.ts +9 -0
  338. package/plugins/dashboard-store/__tests__/resource-class.test.ts +181 -0
  339. package/plugins/dashboard-store/actions.js +40 -18
  340. package/plugins/dashboard-store/resource-class.js +67 -9
  341. package/plugins/steve/__tests__/actions.test.ts +212 -0
  342. package/plugins/steve/__tests__/subscribe.spec.ts +6 -3
  343. package/plugins/steve/actions.js +96 -0
  344. package/plugins/steve/steve-pagination-utils.ts +12 -4
  345. package/plugins/steve/subscribe.js +35 -5
  346. package/rancher-components/Accordion/Accordion.vue +53 -9
  347. package/rancher-components/Form/Checkbox/Checkbox.vue +14 -0
  348. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +10 -4
  349. package/rancher-components/Form/LabeledInput/LabeledInput.vue +7 -52
  350. package/rancher-components/Form/Radio/RadioButton.vue +17 -1
  351. package/rancher-components/Form/Radio/RadioGroup.vue +10 -0
  352. package/rancher-components/Pill/RcTag/RcTag.vue +3 -2
  353. package/rancher-components/RcButton/RcButton.test.ts +140 -1
  354. package/rancher-components/RcButton/RcButton.vue +126 -17
  355. package/rancher-components/RcButton/types.ts +3 -0
  356. package/rancher-components/RcDropdown/RcDropdownTrigger.vue +10 -8
  357. package/rancher-components/RcItemCard/RcItemCard.test.ts +18 -0
  358. package/rancher-components/RcItemCard/RcItemCard.vue +2 -2
  359. package/rancher-components/RcSection/RcSection.vue +28 -3
  360. package/scripts/extension/helm/package/Dockerfile +1 -1
  361. package/scripts/test-plugins-build.sh +2 -1
  362. package/store/__tests__/catalog.test.ts +115 -1
  363. package/store/__tests__/notifications.test.ts +434 -0
  364. package/store/__tests__/type-map.test.ts +556 -1
  365. package/store/action-menu.js +8 -3
  366. package/store/auth.js +1 -1
  367. package/store/aws.js +27 -16
  368. package/store/catalog.js +84 -3
  369. package/store/digitalocean.js +20 -38
  370. package/store/index.js +2 -0
  371. package/store/linode.js +25 -40
  372. package/store/plugins.js +7 -4
  373. package/store/pnap.js +1 -0
  374. package/store/type-map.js +111 -29
  375. package/tsconfig.paths.json +8 -8
  376. package/types/components/buttonGroup.ts +5 -0
  377. package/types/kube/kube-api.ts +14 -1
  378. package/types/rancher/steve.api.ts +12 -12
  379. package/types/resources/settings.d.ts +2 -1
  380. package/types/shell/index.d.ts +206 -72
  381. package/types/store/dashboard-store.types.ts +108 -11
  382. package/types/store/pagination.types.ts +6 -3
  383. package/utils/__tests__/alertmanagerconfig.test.ts +117 -0
  384. package/utils/__tests__/async.test.ts +87 -0
  385. package/utils/__tests__/auth.test.ts +273 -0
  386. package/utils/__tests__/aws.test.ts +140 -0
  387. package/utils/__tests__/banners.test.ts +176 -0
  388. package/utils/__tests__/chart.test.ts +64 -1
  389. package/utils/__tests__/color.test.ts +226 -0
  390. package/utils/__tests__/computed.test.ts +193 -0
  391. package/utils/__tests__/cspAdaptor.test.ts +163 -0
  392. package/utils/__tests__/dom.test.ts +81 -0
  393. package/utils/__tests__/duration.test.ts +176 -0
  394. package/utils/__tests__/dynamic-importer.test.ts +102 -0
  395. package/utils/__tests__/fleet-appco.test.ts +312 -0
  396. package/utils/__tests__/fleet.test.ts +340 -0
  397. package/utils/__tests__/ingress.test.ts +553 -0
  398. package/utils/__tests__/kube.test.ts +68 -0
  399. package/utils/__tests__/monitoring.test.ts +130 -0
  400. package/utils/__tests__/namespace-filter.test.ts +109 -0
  401. package/utils/__tests__/object.test.ts +22 -0
  402. package/utils/__tests__/pagination-utils.test.ts +361 -0
  403. package/utils/__tests__/parse-externalid.test.ts +137 -0
  404. package/utils/__tests__/perf-setting.utils.test.ts +98 -0
  405. package/utils/__tests__/platform.test.ts +91 -0
  406. package/utils/__tests__/poller-sequential.test.ts +177 -0
  407. package/utils/__tests__/poller.test.ts +170 -0
  408. package/utils/__tests__/position.test.ts +237 -0
  409. package/utils/__tests__/promise.test.ts +346 -0
  410. package/utils/__tests__/provider.test.ts +51 -1
  411. package/utils/__tests__/queue.test.ts +232 -0
  412. package/utils/__tests__/release-notes.test.ts +221 -0
  413. package/utils/__tests__/router.test.js +254 -1
  414. package/utils/__tests__/select.test.ts +208 -0
  415. package/utils/__tests__/settings.test.ts +140 -0
  416. package/utils/__tests__/sort-utils.test.ts +301 -0
  417. package/utils/__tests__/string-utils.test.ts +798 -0
  418. package/utils/__tests__/string.test.ts +23 -1
  419. package/utils/__tests__/style.test.ts +154 -0
  420. package/utils/__tests__/svg-filter.test.ts +184 -0
  421. package/utils/__tests__/time.test.ts +265 -1
  422. package/utils/__tests__/title.test.ts +47 -0
  423. package/utils/__tests__/units.test.ts +417 -0
  424. package/utils/__tests__/versions.test.ts +128 -0
  425. package/utils/__tests__/width.test.ts +53 -0
  426. package/utils/__tests__/window.test.ts +158 -0
  427. package/utils/__tests__/xccdf.test.ts +511 -0
  428. package/utils/chart.js +36 -0
  429. package/utils/crypto/__tests__/browserHashUtils.test.ts +98 -0
  430. package/utils/crypto/__tests__/index.test.ts +144 -0
  431. package/utils/duration.ts +104 -0
  432. package/utils/dynamic-content/__tests__/notification-handler.test.ts +196 -0
  433. package/utils/dynamic-content/info.ts +2 -1
  434. package/utils/error.js +13 -0
  435. package/utils/fleet-appco.ts +323 -0
  436. package/utils/fleet.ts +13 -3
  437. package/utils/gatekeeper/__tests__/util.test.ts +174 -0
  438. package/utils/gc/__tests__/gc-interval.test.ts +119 -0
  439. package/utils/gc/__tests__/gc-root-store.test.ts +225 -0
  440. package/utils/gc/__tests__/gc-route-changed.test.ts +96 -0
  441. package/utils/gc/__tests__/gc.test.ts +487 -0
  442. package/utils/ingress.ts +9 -1
  443. package/utils/object.js +22 -2
  444. package/utils/pagination-utils.ts +2 -1
  445. package/utils/provider.ts +12 -0
  446. package/utils/string.js +25 -2
  447. package/utils/uiplugins.ts +5 -5
  448. package/utils/validators/__tests__/cluster-name.test.ts +110 -0
  449. package/utils/validators/__tests__/container-images.test.ts +104 -0
  450. package/utils/validators/__tests__/cron-schedule.test.ts +79 -0
  451. package/utils/validators/__tests__/flow-output.test.ts +91 -0
  452. package/utils/validators/__tests__/index.test.ts +481 -0
  453. package/utils/validators/__tests__/kubernetes-name.test.ts +163 -0
  454. package/utils/validators/__tests__/logging-outputs.test.ts +58 -0
  455. package/utils/validators/__tests__/misc-validators.test.ts +246 -0
  456. package/utils/validators/__tests__/monitoring-route.test.ts +119 -0
  457. package/utils/validators/__tests__/pod-affinity.test.ts +382 -0
  458. package/utils/validators/__tests__/prometheusrule.test.ts +211 -0
  459. package/utils/validators/__tests__/role-template.test.ts +149 -0
  460. package/utils/validators/__tests__/service.test.ts +283 -0
  461. package/utils/validators/__tests__/setting.test.js +32 -0
  462. package/utils/validators/formRules/__tests__/index.test.ts +50 -0
  463. package/utils/validators/formRules/index.ts +5 -5
  464. package/utils/validators/machine-pool.ts +1 -1
  465. package/utils/validators/setting.js +18 -3
  466. package/utils/xccdf.ts +415 -0
  467. package/vue.config.js +1 -1
  468. package/assets/fonts/lato/lato-v17-latin-700.woff +0 -0
  469. package/assets/fonts/lato/lato-v17-latin-700.woff2 +0 -0
  470. package/assets/fonts/lato/lato-v17-latin-regular.woff +0 -0
  471. package/assets/fonts/lato/lato-v17-latin-regular.woff2 +0 -0
  472. package/pages/support/index.vue +0 -264
  473. package/utils/duration.js +0 -43
@@ -1,121 +1,215 @@
1
- <script>
1
+ <script lang="ts">
2
2
  import { Banner } from '@components/Banner';
3
- import ResourceTable from '@shell/components/ResourceTable';
4
- import Masthead from '@shell/components/ResourceList/Masthead';
5
- import { allHash } from '@shell/utils/promise';
6
- import { CAPI, MANAGEMENT, SNAPSHOT, NORMAN } from '@shell/config/types';
3
+ import Masthead from '@shell/components/ResourceList/Masthead.vue';
4
+ import { CAPI, COUNT, MANAGEMENT } from '@shell/config/types';
7
5
  import { MODE, _IMPORT } from '@shell/config/query-params';
8
- import { filterOnlyKubernetesClusters, filterHiddenLocalCluster } from '@shell/utils/cluster';
9
6
  import { mapFeature, HARVESTER as HARVESTER_FEATURE } from '@shell/store/features';
10
7
  import { NAME as EXPLORER } from '@shell/config/product/explorer';
11
- import ResourceFetch from '@shell/mixins/resource-fetch';
12
- import { BadgeState } from '@components/BadgeState';
13
8
  import { isAutoscalerFeatureFlagEnabled } from '@shell/utils/autoscaler-utils';
14
9
  import { AUTOSCALER_ENABLED } from '@shell/config/table-headers';
10
+ import PaginatedResourceTable from '@shell/components/PaginatedResourceTable.vue';
11
+ import { PagTableFetchPageSecondaryResourcesOpts, PagTableFetchSecondaryResourcesOpts, PagTableFetchSecondaryResourcesReturns } from '@shell/types/components/paginatedResourceTable';
12
+ import { FilterArgs, PaginationArgs, PaginationFilterField, PaginationParamFilter } from '@shell/types/store/pagination.types';
13
+ import { ActionFindPageArgs } from '@shell/types/store/dashboard-store.types';
14
+ import MachineSummaryGraph from '@shell/components/formatter/MachineSummaryGraph.vue';
15
+ import MgmtCluster from '@shell/models/management.cattle.io.cluster';
16
+ import ProvCluster from '@shell/models/provisioning.cattle.io.cluster';
17
+ import ManagementClusterUtils from '@shell/list/utils/management.cattle.io.cluster.utils';
18
+ import { STEVE_AUTOSCALER_ENABLED } from '@shell/config/pagination-table-headers';
19
+ import { filterHiddenLocalCluster, filterOnlyKubernetesClusters } from '@shell/utils/cluster';
20
+ import { RcButton } from '@components/RcButton';
15
21
 
16
22
  export default {
17
23
  components: {
18
- Banner, ResourceTable, Masthead, BadgeState
24
+ Banner,
25
+ PaginatedResourceTable,
26
+ Masthead,
27
+ MachineSummaryGraph,
28
+ RcButton,
19
29
  },
20
- mixins: [ResourceFetch],
21
- props: {
22
- loadIndeterminate: {
23
- type: Boolean,
24
- default: false
25
- },
26
30
 
27
- incrementalLoadingIndicator: {
28
- type: Boolean,
29
- default: false
30
- },
31
+ data() {
32
+ const mgmtClusterSchema = this.$store.getters['management/schemaFor'](MANAGEMENT.CLUSTER);
33
+ const headers = this.$store.getters['type-map/headersFor'](mgmtClusterSchema, false);
34
+ const paginationHeaders = this.$store.getters['type-map/headersFor'](mgmtClusterSchema, true);
31
35
 
32
- useQueryParamsForSimpleFiltering: {
33
- type: Boolean,
34
- default: false
36
+ if (isAutoscalerFeatureFlagEnabled(this.$store)) {
37
+ headers.splice(-3, 0, AUTOSCALER_ENABLED);
38
+ paginationHeaders.splice(-3, 0, STEVE_AUTOSCALER_ENABLED);
35
39
  }
36
- },
37
40
 
38
- async fetch() {
39
- this.$initializeFetchData(CAPI.RANCHER_CLUSTER);
40
- const hash = {
41
- rancherClusters: this.$fetchType(CAPI.RANCHER_CLUSTER),
42
- normanClusters: this.$fetchType(NORMAN.CLUSTER, [], 'rancher'),
43
- mgmtClusters: this.$fetchType(MANAGEMENT.CLUSTER),
41
+ return {
42
+ headers,
43
+ paginationHeaders,
44
+
45
+ clusterCount: undefined as number | undefined,
46
+
47
+ paginationContext: 'cluster-management',
48
+
49
+ mgmtClusterSchema,
50
+ provClusterSchema: this.$store.getters['management/schemaFor'](CAPI.RANCHER_CLUSTER),
44
51
  };
52
+ },
45
53
 
46
- if ( this.$store.getters['management/canList'](SNAPSHOT) ) {
47
- hash.etcdSnapshots = this.$fetchType(SNAPSHOT);
48
- }
54
+ // Forget the types when we leave the page
55
+ beforeUnmount() {
56
+ ManagementClusterUtils.forgetSecondaryResources({ context: this.paginationContext }, { $store: this.$store });
57
+ },
49
58
 
50
- if ( this.$store.getters['management/canList'](CAPI.MACHINE) ) {
51
- hash.capiMachines = this.$fetchType(CAPI.MACHINE);
52
- }
59
+ methods: {
60
+ /**
61
+ * SSP disabled, filter all rows via...
62
+ */
63
+ filterRowsLocal(rows: MgmtCluster[]) {
64
+ const filteredRows = ManagementClusterUtils.filterRowsLocal(rows, { $store: this.$store });
53
65
 
54
- if ( this.$store.getters['management/canList'](MANAGEMENT.NODE) ) {
55
- hash.mgmtNodes = this.$fetchType(MANAGEMENT.NODE);
56
- }
66
+ this.clusterCount = filteredRows.length;
57
67
 
58
- if ( this.$store.getters['management/canList'](MANAGEMENT.NODE_POOL) ) {
59
- hash.mgmtPools = this.$fetchType(MANAGEMENT.NODE_POOL);
60
- }
68
+ return filteredRows;
69
+ },
61
70
 
62
- if ( this.$store.getters['management/canList'](MANAGEMENT.NODE_TEMPLATE) ) {
63
- hash.mgmtTemplates = this.$fetchType(MANAGEMENT.NODE_TEMPLATE);
64
- }
71
+ /**
72
+ * SSP enabled, filter all rows via...
73
+ */
74
+ filterRowsApi(pagination: PaginationArgs): PaginationArgs {
75
+ return ManagementClusterUtils.filterRowsApi(pagination, { $store: this.$store });
76
+ },
65
77
 
66
- if ( this.$store.getters['management/canList'](CAPI.MACHINE_DEPLOYMENT) ) {
67
- hash.machineDeployments = this.$fetchType(CAPI.MACHINE_DEPLOYMENT);
68
- }
78
+ /**
79
+ * Fetch secondary resources on load
80
+ *
81
+ * Of type #PagTableFetchSecondaryResources
82
+ */
83
+ fetchSecondaryResources(opts: PagTableFetchSecondaryResourcesOpts): PagTableFetchSecondaryResourcesReturns {
84
+ if (opts.canPaginate) {
85
+ return Promise.resolve();
86
+ }
69
87
 
70
- // Fetch RKE template revisions so we can show when an updated template is available
71
- // This request does not need to be blocking
72
- if ( this.$store.getters['management/canList'](MANAGEMENT.RKE_TEMPLATE_REVISION) ) {
73
- this.$fetchType(MANAGEMENT.RKE_TEMPLATE_REVISION);
74
- }
88
+ const promises = ManagementClusterUtils.fetchSecondaryResources(opts, { $store: this.$store });
75
89
 
76
- const res = await allHash(hash);
90
+ // Additional requests required to support columns in this view (e.g. machines)
77
91
 
78
- this.mgmtClusters = res.mgmtClusters;
79
- this.showRke1DeprecationWarning = this.rows.some((r) => r.isRke1);
80
- },
92
+ if ( this.$store.getters['management/canList'](CAPI.MACHINE_DEPLOYMENT)) {
93
+ this.$store.dispatch(`management/findAll`, { type: CAPI.MACHINE_DEPLOYMENT });
94
+ }
81
95
 
82
- data() {
83
- return {
84
- resource: CAPI.RANCHER_CLUSTER,
85
- schema: this.$store.getters['management/schemaFor'](CAPI.RANCHER_CLUSTER),
86
- mgmtClusters: [],
87
- showRke1DeprecationWarning: false
88
- };
89
- },
96
+ if ( this.$store.getters['management/canList'](MANAGEMENT.NODE_POOL)) {
97
+ this.$store.dispatch(`management/findAll`, { type: MANAGEMENT.NODE_POOL });
98
+ }
99
+
100
+ return Promise.all(promises);
101
+ },
102
+
103
+ /**
104
+ * Fetch secondary resources on page change
105
+ */
106
+ async fetchPageSecondaryResources({
107
+ canPaginate, force, page, pagResult
108
+ }: PagTableFetchPageSecondaryResourcesOpts) {
109
+ this.clusterCount = !canPaginate || !page?.length ? 0 : pagResult.count;
110
+
111
+ if (!canPaginate || !page?.length) {
112
+ return;
113
+ }
114
+
115
+ const promises = await ManagementClusterUtils.fetchPageSecondaryResources({
116
+ canPaginate, force, page, pagResult
117
+ }, { $store: this.$store });
118
+
119
+ // Additional requests required to support columns in this view (e.g. machines)
120
+
121
+ if ( this.$store.getters['management/canList'](CAPI.MACHINE_DEPLOYMENT)) {
122
+ const opt: ActionFindPageArgs = {
123
+ force,
124
+ pagination: new FilterArgs({
125
+ filters: PaginationParamFilter.createMultipleFields(page.map((r: any) => new PaginationFilterField({
126
+ field: 'spec.clusterName',
127
+ value: r.provClusterName
128
+ }))),
129
+ })
130
+ };
131
+
132
+ this.$store.dispatch(`management/findPage`, { type: CAPI.MACHINE_DEPLOYMENT, opt });
133
+ }
134
+
135
+ if ( this.$store.getters['management/canList'](MANAGEMENT.NODE_POOL)) {
136
+ const nodePoolFilters = PaginationParamFilter.createMultipleFields(page
137
+ .filter((p: any) => p.id)
138
+ .map((r: any) => new PaginationFilterField({
139
+ field: 'spec.clusterName',
140
+ value: r.id
141
+ })));
142
+
143
+ promises.push(this.$store.dispatch(`management/findPage`, {
144
+ type: MANAGEMENT.NODE_POOL,
145
+ opt: {
146
+ force,
147
+ pagination: new FilterArgs({ filters: nodePoolFilters })
148
+ }
149
+ }));
150
+ }
151
+
152
+ await Promise.all(promises);
153
+ },
154
+
155
+ /**
156
+ * Explorer world, listing PCIC, SSP disabled, filter all rows via...
157
+ */
158
+ filterProvRowsLocal(rows: ProvCluster[]) {
159
+ if (!rows.length) {
160
+ // no rows to filter on, so immediately return no rows
161
+ return [];
162
+ }
163
+
164
+ let filteredRows = [];
90
165
 
91
- computed: {
92
- filteredRows() {
93
- // If Harvester feature is enabled, hide Harvester Clusters
94
166
  if (this.harvesterEnabled) {
95
- return filterHiddenLocalCluster(filterOnlyKubernetesClusters(this.rows, this.$store), this.$store);
167
+ // If Harvester feature is enabled, hide Harvester Clusters
168
+ filteredRows = filterHiddenLocalCluster(filterOnlyKubernetesClusters(rows, this.$store), this.$store);
169
+ } else {
170
+ // Otherwise, show Harvester clusters - these will be shown with a warning
171
+ filteredRows = filterOnlyKubernetesClusters(rows, this.$store);
96
172
  }
97
173
 
98
- // Otherwise, show Harvester clusters - these will be shown with a warning
99
- return filterHiddenLocalCluster(this.rows, this.$store);
174
+ this.clusterCount = filteredRows.length;
175
+
176
+ return filteredRows;
100
177
  },
101
178
 
102
- hiddenHarvesterCount() {
179
+ /**
180
+ * Explorer world, listing PCIC, SSP enabled, filter all rows via...
181
+ */
182
+ filterProvRowsApi(pagination: PaginationArgs): PaginationArgs {
183
+ return this.filterRowsApi(pagination);
184
+ }
185
+ },
186
+
187
+ computed: {
188
+ isExplorer() {
103
189
  const product = this.$store.getters['currentProduct'];
104
- const isExplorer = product?.name === EXPLORER;
105
190
 
106
- // Don't show Harvester banner message on the cluster management page or if Harvester if not enabled
107
- if (!isExplorer || !this.harvesterEnabled) {
191
+ return product?.name === EXPLORER;
192
+ },
193
+
194
+ hiddenHarvesterCount() {
195
+ // Don't show Harvester banner message on the cluster management page or if Harvester is not enabled
196
+ if (!this.isExplorer || !this.harvesterEnabled || this.clusterCount === undefined) {
108
197
  return 0;
109
198
  }
110
199
 
111
- return this.rows.length - filterOnlyKubernetesClusters(this.rows, this.$store).length;
200
+ const allClusters = this.$store.getters['management/count']({ name: CAPI.RANCHER_CLUSTER });
201
+ // clusterCount is total excluding local (if not counted) and harvester (if not counted)
202
+ // at this point though (viewing prov clusters in explorer) we must be in the local cluster, so can exclude that exclusion
203
+ const nonHarvesterClusters = this.clusterCount;
204
+
205
+ return allClusters - nonHarvesterClusters;
112
206
  },
113
207
 
114
208
  createLocation() {
115
- const options = this.$store.getters[`type-map/optionsFor`](this.resource)?.custom || {};
209
+ const options = this.$store.getters[`type-map/optionsFor`](CAPI.RANCHER_CLUSTER)?.custom || {};
116
210
  const params = {
117
211
  product: this.$store.getters['currentProduct'].name,
118
- resource: this.resource
212
+ resource: CAPI.RANCHER_CLUSTER
119
213
  };
120
214
  const defaultLocation = {
121
215
  name: 'c-cluster-product-resource-create',
@@ -126,10 +220,10 @@ export default {
126
220
  },
127
221
 
128
222
  importLocation() {
129
- const options = this.$store.getters[`type-map/optionsFor`](this.resource)?.custom || {};
223
+ const options = this.$store.getters[`type-map/optionsFor`](CAPI.RANCHER_CLUSTER)?.custom || {};
130
224
  const params = {
131
225
  product: this.$store.getters['currentProduct'].name,
132
- resource: this.resource
226
+ resource: CAPI.RANCHER_CLUSTER
133
227
  };
134
228
  const defaultLocation = {
135
229
  name: 'c-cluster-product-resource-create',
@@ -141,130 +235,124 @@ export default {
141
235
  },
142
236
 
143
237
  canImport() {
144
- const schema = this.$store.getters['management/schemaFor'](CAPI.RANCHER_CLUSTER);
145
-
146
- return !!schema?.collectionMethods.find((x) => x.toLowerCase() === 'post');
238
+ return !!this.provClusterSchema?.collectionMethods.find((x: string) => x.toLowerCase() === 'post');
147
239
  },
148
240
 
149
241
  harvesterEnabled: mapFeature(HARVESTER_FEATURE),
150
242
 
151
- nonStandardNamespaces() {
152
- // Show the namespace grouping option if there's clusters with namespaces other than 'fleet-default' or 'fleet-local'
153
- // This will be used when there's clusters from extension based provisioners
154
- // We should re-visit this for scaling reasons
155
- return this.filteredRows.some((c) => c.metadata.namespace !== 'fleet-local' && c.metadata.namespace !== 'fleet-default');
156
- },
243
+ nonStandardWorkspace() {
244
+ // Show the workspace grouping option if there's clusters with workspaces other than 'fleet-default' or 'fleet-local'
157
245
 
158
- headers() {
159
- const headers = this.$store.getters['type-map/headersFor'](this.schema);
246
+ // Note - This _just_ looks at namespaces, which are normally 1-1 with namespaces and also cover cases where clusters aren't in namespaces
247
+ // The only exception is for v2prov clusters that were moved workspace after enabling `provisioningv2-fleet-workspace-back-population`
248
+ // If we need to fully support this we can either
249
+ // 1. always show grouping
250
+ // 2. use a summary request to determine to show it
251
+ // a. on visit to list and vai on (lets keep it simple) make a request to /v1/management.cattle.io.clusters?summary=spec.fleetWorkspaceName (plus whatever new parm to avoid return of `data` field)
252
+ // b. check for values other than fleet-local and fleet-default in the response
160
253
 
161
- if (isAutoscalerFeatureFlagEnabled(this.$store)) {
162
- headers.splice(-3, 0, AUTOSCALER_ENABLED);
163
- }
254
+ const counts = this.$store.getters['management/all'](COUNT)?.[0]?.counts || {};
255
+ const namespaces: { [nsName: string]: { count: number } } = counts[CAPI.RANCHER_CLUSTER]?.namespaces || counts.namespaces || {};
164
256
 
165
- return headers;
166
- }
257
+ for (const ns in namespaces) {
258
+ if (ns !== 'fleet-local' && ns !== 'fleet-default' && namespaces[ns].count > 0) {
259
+ return true;
260
+ }
261
+ }
167
262
 
263
+ return false;
264
+ },
168
265
  },
169
266
 
170
- $loadingResources() {
171
- // results are filtered so we wouldn't get the correct count on indicator...
172
- return { loadIndeterminate: true };
173
- }
174
-
175
267
  };
176
268
  </script>
177
269
 
178
270
  <template>
179
271
  <div>
180
- <Banner
181
- v-if="showRke1DeprecationWarning"
182
- color="warning"
183
- label-key="cluster.banner.rke1DeprecationMessage"
184
- />
185
-
186
272
  <Banner
187
273
  v-if="hiddenHarvesterCount"
188
274
  color="info"
189
275
  :label="t('cluster.harvester.clusterWarning', {count: hiddenHarvesterCount} )"
190
276
  />
191
277
 
192
- <Masthead
193
- :schema="schema"
194
- :resource="resource"
195
- :create-location="createLocation"
196
- component-testid="cluster-manager-list"
197
- :show-incremental-loading-indicator="incrementalLoadingIndicator"
198
- :load-resources="loadResources"
199
- :load-indeterminate="loadIndeterminate"
200
- >
201
- <template
202
- v-if="canImport"
203
- #extraActions
278
+ <template v-if="isExplorer">
279
+ <PaginatedResourceTable
280
+ :schema="provClusterSchema"
281
+
282
+ :local-filter="filterProvRowsLocal"
283
+ :api-filter="filterProvRowsApi"
284
+ />
285
+ </template>
286
+ <template v-else>
287
+ <Masthead
288
+ :schema="provClusterSchema"
289
+ :resource="provClusterSchema.id"
290
+ :create-location="createLocation"
291
+ component-testid="cluster-manager-list"
204
292
  >
205
- <router-link
206
- :to="importLocation"
207
- class="btn role-primary mr-10"
208
- data-testid="cluster-manager-list-import"
293
+ <template
294
+ v-if="canImport"
295
+ #extraActions
209
296
  >
210
- {{ t('cluster.importAction') }}
211
- </router-link>
212
- </template>
213
- </Masthead>
214
- <ResourceTable
215
- :headers="headers"
216
- :table-actions="true"
217
- :rows="filteredRows"
218
- :namespaced="nonStandardNamespaces"
219
- :loading="loading"
220
- :use-query-params-for-simple-filtering="useQueryParamsForSimpleFiltering"
221
- :data-testid="'cluster-list'"
222
- :force-update-live-and-delayed="forceUpdateLiveAndDelayed"
223
- >
224
- <!-- Why are state column and subrow overwritten here? -->
225
- <!-- for rke1 clusters, where they try to use the mgmt cluster stateObj instead of prov cluster stateObj, -->
226
- <!-- updates were getting lost. This isn't performant as normal columns, but the list shouldn't grow -->
227
- <!-- big enough for the performance to matter -->
228
- <template #cell:state="{row}">
229
- <BadgeState
230
- :color="row.stateBackground"
231
- :label="row.stateDisplay"
232
- />
233
- </template>
234
- <template #cell:summary="{row}">
235
- <span v-if="!row.stateParts.length">{{ row.nodes.length }}</span>
236
- </template>
237
- <template #col:kubernetesVersion="{row}">
238
- <td class="col-name">
239
- <span>
240
- {{ row.kubernetesVersion }}
241
- </span>
242
- <div
243
- v-clean-tooltip="{content: row.architecture.tooltip, placement: 'left'}"
244
- class="text-muted"
297
+ <rc-button
298
+ size="large"
299
+ class="mr-10"
300
+ :to="importLocation"
301
+ data-testid="cluster-manager-list-import"
245
302
  >
246
- {{ row.architecture.label }}
247
- </div>
248
- </td>
249
- </template>
250
- <template #cell:explorer="{row}">
251
- <router-link
252
- v-if="row.canExplore"
253
- data-testid="cluster-manager-list-explore-management"
254
- class="btn btn-sm role-secondary"
255
- :to="{name: 'c-cluster', params: {cluster: row.mgmt.id}}"
256
- >
257
- {{ t('cluster.explore') }}
258
- </router-link>
259
- <button
260
- v-else
261
- data-testid="cluster-manager-list-explore"
262
- :disabled="true"
263
- class="btn btn-sm role-secondary"
264
- >
265
- {{ t('cluster.explore') }}
266
- </button>
267
- </template>
268
- </ResourceTable>
303
+ {{ t('cluster.importAction') }}
304
+ </rc-button>
305
+ </template>
306
+ </Masthead>
307
+
308
+ <PaginatedResourceTable
309
+ :schema="mgmtClusterSchema"
310
+
311
+ :headers="headers"
312
+ :pagination-headers="paginationHeaders"
313
+ :context="paginationContext"
314
+
315
+ :use-query-params-for-simple-filtering="true"
316
+
317
+ :local-filter="filterRowsLocal"
318
+ :api-filter="filterRowsApi"
319
+
320
+ :fetch-secondary-resources="fetchSecondaryResources"
321
+ :fetch-page-secondary-resources="fetchPageSecondaryResources"
322
+
323
+ :groupable="nonStandardWorkspace"
324
+ :namespaced="true"
325
+
326
+ :data-testid="'cluster-list'"
327
+ >
328
+ <template #cell:summary="{row}">
329
+ <!-- Replace the MACHINE_SUMMARY columns contents... but only if there's no stateParts -->
330
+ <span v-if="!row.stateParts.length">{{ row.statusInfo.nodeCount || 0 }}</span>
331
+ <MachineSummaryGraph
332
+ v-else
333
+ :row="row"
334
+ />
335
+ </template>
336
+ <template #cell:explorer="{row}">
337
+ <!-- Align side nav cluster, home page name link and cluster management cluster explor buttons on canExplore -->
338
+ <rc-button
339
+ v-if="row.canExplore"
340
+ variant="secondary"
341
+ data-testid="cluster-manager-list-explore-management"
342
+ :to="{name: 'c-cluster', params: {cluster: row.id}}"
343
+ >
344
+ {{ t('cluster.explore') }}
345
+ </rc-button>
346
+ <rc-button
347
+ v-else
348
+ variant="secondary"
349
+ data-testid="cluster-manager-list-explore"
350
+ :disabled="true"
351
+ >
352
+ {{ t('cluster.explore') }}
353
+ </rc-button>
354
+ </template>
355
+ </PaginatedResourceTable>
356
+ </template>
269
357
  </div>
270
358
  </template>
@@ -0,0 +1,128 @@
1
+ import MgmtCluster from '@shell/models/management.cattle.io.cluster';
2
+ import { filterHiddenLocalCluster, filterOnlyKubernetesClusters, paginationFilterClusters } from '@shell/utils/cluster';
3
+ import { VuexStore } from '@shell/types/store/vuex';
4
+ import { FilterArgs, PaginationArgs, PaginationFilterEquality, PaginationParamFilter } from '@shell/types/store/pagination.types';
5
+ import { sameContents } from '@shell/utils/array';
6
+ import { PagTableFetchPageSecondaryResourcesOpts, PagTableFetchSecondaryResourcesOpts } from '@shell/types/components/paginatedResourceTable';
7
+ import { CAPI } from '@shell/config/types';
8
+ import { ActionFindPageArgs } from '@shell/types/store/dashboard-store.types';
9
+
10
+ interface CommonConfig {
11
+ $store: VuexStore
12
+ }
13
+
14
+ /**
15
+ * Utils to support listing management.cattle.io.clusters
16
+ */
17
+ class ManagementClusterUtils {
18
+ /**
19
+ * Filter out hidden clusters from list of all clusters
20
+ */
21
+ filterRowsLocal(rows: MgmtCluster[], { $store }: CommonConfig): MgmtCluster[] {
22
+ return filterHiddenLocalCluster(filterOnlyKubernetesClusters(rows || [], $store), $store);
23
+ }
24
+
25
+ /**
26
+ * Filter out hidden clusters via api
27
+ */
28
+ filterRowsApi(pagination: PaginationArgs, { $store }: CommonConfig): PaginationArgs {
29
+ if (!pagination.filters) {
30
+ pagination.filters = [];
31
+ }
32
+
33
+ const existingFilters = pagination.filters;
34
+ const requiredFilters = paginationFilterClusters($store, false);
35
+
36
+ for (let i = 0; i < requiredFilters.length; i++) {
37
+ let found = false;
38
+ const required = requiredFilters[i];
39
+
40
+ for (let j = 0; j < existingFilters.length; j++) {
41
+ const existing = existingFilters[j];
42
+
43
+ if (
44
+ required.fields.length === existing.fields.length &&
45
+ sameContents(required.fields.map((e) => e.field), existing.fields.map((e) => e.field))
46
+ ) {
47
+ Object.assign(existing, required);
48
+ found = true;
49
+ break;
50
+ }
51
+ }
52
+
53
+ if (!found) {
54
+ pagination.filters.push(required);
55
+ }
56
+ }
57
+
58
+ return pagination;
59
+ }
60
+
61
+ /**
62
+ * Fetch resources used to support vai off world
63
+ *
64
+ * Of type PagTableFetchSecondaryResources
65
+ */
66
+ fetchSecondaryResources(opts: PagTableFetchSecondaryResourcesOpts, { $store }: CommonConfig): Promise<any>[] {
67
+ if (opts.canPaginate) {
68
+ return [];
69
+ }
70
+
71
+ const promises = [];
72
+
73
+ if ( $store.getters['management/canList'](CAPI.RANCHER_CLUSTER) ) {
74
+ promises.push($store.dispatch('management/findAll', { type: CAPI.RANCHER_CLUSTER }));
75
+ }
76
+
77
+ return promises;
78
+ }
79
+
80
+ /**
81
+ * Fetch resources used to support vai on and the current page
82
+ */
83
+ async fetchPageSecondaryResources({
84
+ canPaginate, force, page, pagResult
85
+ }: PagTableFetchPageSecondaryResourcesOpts, { $store }: CommonConfig): Promise<Promise<any>[]> {
86
+ if (!canPaginate || !page?.length) {
87
+ return [];
88
+ }
89
+
90
+ const promises = [];
91
+
92
+ if ( $store.getters['management/canList'](CAPI.RANCHER_CLUSTER) ) {
93
+ const opt: ActionFindPageArgs = {
94
+ force,
95
+ pagination: new FilterArgs({
96
+ filters: new PaginationParamFilter({
97
+ fields: [{
98
+ value: page.map((r: any) => r.provClusterId).join(','),
99
+ equality: PaginationFilterEquality.IN,
100
+ field: 'id',
101
+ }],
102
+ })
103
+ })
104
+ };
105
+
106
+ // Prov clusters
107
+ promises.push($store.dispatch(`management/findPage`, { type: CAPI.RANCHER_CLUSTER, opt }));
108
+ }
109
+
110
+ return promises;
111
+ }
112
+
113
+ forgetSecondaryResources({ context }: { context?: string } = {}, { $store }: CommonConfig) {
114
+ const canList = $store.getters['management/canList'](CAPI.RANCHER_CLUSTER);
115
+ const canPaginate = $store.getters['management/paginationEnabled']({
116
+ id: CAPI.RANCHER_CLUSTER,
117
+ context
118
+ });
119
+
120
+ if (canList && canPaginate) {
121
+ $store.dispatch('management/forgetType', CAPI.RANCHER_CLUSTER);
122
+ }
123
+ }
124
+ }
125
+
126
+ const instance = new ManagementClusterUtils();
127
+
128
+ export default instance;