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

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 (272) 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/translations/en-us.yaml +22 -5
  56. package/chart/monitoring/index.vue +10 -1
  57. package/components/ActionDropdownShell.vue +2 -1
  58. package/components/CruResourceFooter.vue +9 -5
  59. package/components/ExplorerProjectsNamespaces.vue +1 -1
  60. package/components/InstallHelmCharts.vue +2 -2
  61. package/components/LandingPagePreference.vue +14 -5
  62. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +15 -1
  63. package/components/Resource/Detail/Metadata/index.vue +6 -0
  64. package/components/Resource/Detail/ResourcePopover/index.vue +12 -1
  65. package/components/Resource/Detail/SpacedRow.vue +3 -1
  66. package/components/Resource/Detail/TitleBar/index.vue +10 -11
  67. package/components/ResourceList/Masthead.vue +12 -8
  68. package/components/SelectIconGrid.vue +0 -10
  69. package/components/SingleClusterInfo.vue +1 -0
  70. package/components/SortableTable/__tests__/sorting.test.ts +126 -0
  71. package/components/SortableTable/index.vue +6 -9
  72. package/components/SortableTable/selection.js +23 -5
  73. package/components/SortableTable/sorting.js +6 -3
  74. package/components/Wizard.vue +14 -13
  75. package/components/fleet/FleetBundles.vue +100 -12
  76. package/components/fleet/FleetClusterTargets/index.vue +37 -15
  77. package/components/fleet/__tests__/FleetClusterTargets.test.ts +149 -115
  78. package/components/fleet/__tests__/FleetClusters.test.ts +12 -12
  79. package/components/form/LabeledSelect.vue +20 -3
  80. package/components/form/NameNsDescription.vue +11 -0
  81. package/components/form/Security.vue +6 -2
  82. package/components/form/WorkloadPorts.vue +2 -7
  83. package/components/form/__tests__/Security.test.ts +76 -0
  84. package/components/formatter/Autoscaler.vue +4 -4
  85. package/components/formatter/ClusterKubeVersion.vue +27 -0
  86. package/components/formatter/ClusterLink.vue +1 -7
  87. package/components/formatter/ClusterProvider.vue +6 -10
  88. package/components/formatter/FleetSummaryGraph.vue +0 -3
  89. package/components/formatter/MachineSummaryGraph.vue +1 -1
  90. package/components/formatter/PodsUsage.vue +2 -2
  91. package/components/formatter/__tests__/Autoscaler.test.ts +19 -22
  92. package/components/formatter/__tests__/FleetSummaryGraph.test.ts +216 -0
  93. package/components/formatter/__tests__/PodsUsage.test.ts +6 -10
  94. package/components/nav/NamespaceFilter.vue +2 -2
  95. package/components/nav/TopLevelMenu.helper.ts +15 -3
  96. package/components/nav/TopLevelMenu.vue +16 -5
  97. package/components/nav/__tests__/TopLevelMenu.test.ts +145 -21
  98. package/components/templates/home.vue +18 -0
  99. package/components/templates/plain.vue +18 -0
  100. package/components/templates/standalone.vue +17 -0
  101. package/composables/useFormValidation.ts +93 -0
  102. package/composables/useVeeValidateField.test.ts +159 -0
  103. package/composables/useVeeValidateField.ts +67 -0
  104. package/config/pagination-table-headers.js +18 -1
  105. package/config/product/manager.js +82 -21
  106. package/config/router/routes.js +6 -0
  107. package/config/table-headers.js +20 -1
  108. package/config/types.js +2 -1
  109. package/core/__tests__/plugin-products.test.ts +904 -20
  110. package/core/plugin-products-base.ts +107 -7
  111. package/core/plugin-products.ts +4 -0
  112. package/core/plugin-types.ts +111 -1
  113. package/core/plugin.ts +15 -7
  114. package/core/productDebugger.js +9 -4
  115. package/core/types-provisioning.ts +43 -30
  116. package/core/types.ts +57 -20
  117. package/detail/__tests__/pod.test.ts +41 -0
  118. package/detail/harvesterhci.io.management.cluster.vue +6 -2
  119. package/detail/pod.vue +1 -1
  120. package/detail/provisioning.cattle.io.cluster.vue +4 -10
  121. package/edit/auth/__tests__/azuread.test.ts +217 -34
  122. package/edit/auth/azuread.vue +122 -14
  123. package/edit/auth/oidc.vue +2 -2
  124. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +13 -4
  125. package/edit/networking.k8s.io.ingress/RulePath.vue +8 -4
  126. package/edit/networking.k8s.io.ingress/index.vue +75 -20
  127. package/edit/provisioning.cattle.io.cluster/__tests__/MachinePool.test.ts +104 -0
  128. package/edit/provisioning.cattle.io.cluster/index.vue +11 -7
  129. package/edit/provisioning.cattle.io.cluster/rke2.vue +8 -4
  130. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +11 -0
  131. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +37 -4
  132. package/edit/provisioning.cattle.io.cluster/tabs/registries/__tests__/RegistryConfigs.test.ts +132 -7
  133. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +2 -1
  134. package/edit/secret/__tests__/ssh.test.ts +5 -6
  135. package/edit/secret/basic.vue +31 -0
  136. package/edit/secret/index.vue +68 -17
  137. package/edit/secret/registry.vue +38 -0
  138. package/edit/secret/ssh.vue +29 -0
  139. package/edit/secret/tls.vue +30 -0
  140. package/edit/service.vue +4 -4
  141. package/edit/workload/Upgrading.vue +3 -3
  142. package/edit/workload/__tests__/Upgrading.test.ts +6 -9
  143. package/edit/workload/mixins/workload.js +2 -1
  144. package/list/fleet.cattle.io.bundle.vue +7 -104
  145. package/list/fleet.cattle.io.clusterregistrationtoken.vue +20 -0
  146. package/list/provisioning.cattle.io.cluster.vue +262 -180
  147. package/list/utils/management.cattle.io.cluster.utils.ts +128 -0
  148. package/mixins/__tests__/chart.test.ts +112 -0
  149. package/mixins/brand.js +2 -1
  150. package/mixins/chart.js +12 -8
  151. package/mixins/resource-fetch-api-pagination.js +41 -5
  152. package/models/__tests__/ext.cattle.io.kubeconfig.test.ts +67 -67
  153. package/models/__tests__/management.cattle.io.cluster.test.ts +1 -1
  154. package/models/__tests__/management.cattle.io.node.ts +6 -5
  155. package/models/__tests__/management.cattle.io.nodepool.ts +5 -4
  156. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +32 -11
  157. package/models/base-cluster.x-k8s.io.js +26 -0
  158. package/models/cluster.js +1 -1
  159. package/models/cluster.x-k8s.io.machine.js +4 -22
  160. package/models/cluster.x-k8s.io.machinedeployment.js +2 -20
  161. package/models/cluster.x-k8s.io.machineset.js +2 -20
  162. package/models/compliance.cattle.io.clusterscan.js +130 -2
  163. package/models/ext.cattle.io.kubeconfig.ts +4 -7
  164. package/models/fleet-application.js +3 -1
  165. package/models/management.cattle.io.cluster.js +417 -40
  166. package/models/management.cattle.io.node.js +6 -4
  167. package/models/management.cattle.io.nodepool.js +1 -1
  168. package/models/networking.k8s.io.ingress.js +12 -4
  169. package/models/provisioning.cattle.io.cluster.js +47 -330
  170. package/models/rke.cattle.io.etcdsnapshot.js +1 -2
  171. package/package.json +11 -29
  172. package/pages/__tests__/readme.test.ts +49 -0
  173. package/pages/auth/setup.vue +2 -3
  174. package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +76 -0
  175. package/pages/c/_cluster/apps/charts/chart.vue +60 -8
  176. package/pages/c/_cluster/apps/charts/install.vue +10 -7
  177. package/pages/c/_cluster/explorer/__tests__/index.test.ts +23 -25
  178. package/pages/c/_cluster/explorer/index.vue +5 -49
  179. package/pages/c/_cluster/istio/__tests__/istio.index.test.ts +194 -0
  180. package/pages/c/_cluster/istio/index.vue +21 -6
  181. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +1 -0
  182. package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +719 -2
  183. package/pages/c/_cluster/uiplugins/index.vue +203 -197
  184. package/pages/diagnostic.vue +13 -17
  185. package/pages/fail-whale.vue +18 -0
  186. package/pages/home.vue +77 -260
  187. package/pages/readme.vue +88 -0
  188. package/plugins/dashboard-store/__tests__/resource-class.test.ts +88 -0
  189. package/plugins/dashboard-store/actions.js +40 -18
  190. package/plugins/dashboard-store/resource-class.js +5 -2
  191. package/plugins/steve/__tests__/subscribe.spec.ts +6 -3
  192. package/plugins/steve/steve-pagination-utils.ts +11 -3
  193. package/plugins/steve/subscribe.js +35 -5
  194. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +10 -4
  195. package/rancher-components/Form/LabeledInput/LabeledInput.vue +7 -52
  196. package/rancher-components/RcButton/RcButton.test.ts +37 -1
  197. package/rancher-components/RcButton/RcButton.vue +38 -8
  198. package/rancher-components/RcDropdown/RcDropdownTrigger.vue +10 -8
  199. package/store/__tests__/catalog.test.ts +115 -1
  200. package/store/__tests__/type-map.test.ts +556 -1
  201. package/store/action-menu.js +8 -3
  202. package/store/auth.js +1 -1
  203. package/store/aws.js +27 -16
  204. package/store/catalog.js +27 -3
  205. package/store/digitalocean.js +20 -38
  206. package/store/index.js +2 -0
  207. package/store/linode.js +25 -40
  208. package/store/pnap.js +1 -0
  209. package/store/type-map.js +111 -29
  210. package/tsconfig.paths.json +8 -8
  211. package/types/kube/kube-api.ts +14 -1
  212. package/types/rancher/steve.api.ts +12 -12
  213. package/types/resources/settings.d.ts +2 -1
  214. package/types/shell/index.d.ts +102 -2
  215. package/types/store/dashboard-store.types.ts +108 -11
  216. package/types/store/pagination.types.ts +6 -3
  217. package/utils/__tests__/alertmanagerconfig.test.ts +117 -0
  218. package/utils/__tests__/async.test.ts +87 -0
  219. package/utils/__tests__/aws.test.ts +140 -0
  220. package/utils/__tests__/banners.test.ts +176 -0
  221. package/utils/__tests__/chart.test.ts +64 -1
  222. package/utils/__tests__/color.test.ts +226 -0
  223. package/utils/__tests__/duration.test.ts +140 -0
  224. package/utils/__tests__/fleet.test.ts +340 -0
  225. package/utils/__tests__/ingress.test.ts +553 -0
  226. package/utils/__tests__/kube.test.ts +68 -0
  227. package/utils/__tests__/namespace-filter.test.ts +109 -0
  228. package/utils/__tests__/pagination-utils.test.ts +361 -0
  229. package/utils/__tests__/parse-externalid.test.ts +137 -0
  230. package/utils/__tests__/perf-setting.utils.test.ts +98 -0
  231. package/utils/__tests__/poller-sequential.test.ts +177 -0
  232. package/utils/__tests__/poller.test.ts +170 -0
  233. package/utils/__tests__/promise.test.ts +346 -0
  234. package/utils/__tests__/settings.test.ts +140 -0
  235. package/utils/__tests__/sort-utils.test.ts +301 -0
  236. package/utils/__tests__/string-utils.test.ts +798 -0
  237. package/utils/__tests__/string.test.ts +23 -1
  238. package/utils/__tests__/style.test.ts +154 -0
  239. package/utils/__tests__/svg-filter.test.ts +184 -0
  240. package/utils/__tests__/units.test.ts +417 -0
  241. package/utils/__tests__/versions.test.ts +128 -0
  242. package/utils/__tests__/xccdf.test.ts +391 -0
  243. package/utils/chart.js +36 -0
  244. package/utils/fleet.ts +13 -3
  245. package/utils/gatekeeper/__tests__/util.test.ts +174 -0
  246. package/utils/gc/__tests__/gc-interval.test.ts +119 -0
  247. package/utils/gc/__tests__/gc-root-store.test.ts +225 -0
  248. package/utils/gc/__tests__/gc-route-changed.test.ts +96 -0
  249. package/utils/gc/__tests__/gc.test.ts +487 -0
  250. package/utils/ingress.ts +9 -1
  251. package/utils/pagination-utils.ts +2 -1
  252. package/utils/string.js +25 -2
  253. package/utils/uiplugins.ts +5 -5
  254. package/utils/validators/__tests__/cluster-name.test.ts +110 -0
  255. package/utils/validators/__tests__/cron-schedule.test.ts +79 -0
  256. package/utils/validators/__tests__/index.test.ts +481 -0
  257. package/utils/validators/__tests__/kubernetes-name.test.ts +163 -0
  258. package/utils/validators/__tests__/misc-validators.test.ts +246 -0
  259. package/utils/validators/__tests__/pod-affinity.test.ts +382 -0
  260. package/utils/validators/__tests__/prometheusrule.test.ts +211 -0
  261. package/utils/validators/__tests__/role-template.test.ts +149 -0
  262. package/utils/validators/__tests__/service.test.ts +283 -0
  263. package/utils/validators/__tests__/setting.test.js +32 -0
  264. package/utils/validators/formRules/__tests__/index.test.ts +50 -0
  265. package/utils/validators/formRules/index.ts +5 -5
  266. package/utils/validators/machine-pool.ts +1 -1
  267. package/utils/validators/setting.js +18 -3
  268. package/utils/xccdf.ts +418 -0
  269. package/assets/fonts/lato/lato-v17-latin-700.woff +0 -0
  270. package/assets/fonts/lato/lato-v17-latin-700.woff2 +0 -0
  271. package/assets/fonts/lato/lato-v17-latin-regular.woff +0 -0
  272. package/assets/fonts/lato/lato-v17-latin-regular.woff2 +0 -0
@@ -4,6 +4,8 @@ import { Banner } from '@components/Banner';
4
4
  import ResourceTable from '@shell/components/ResourceTable';
5
5
  import { isHarvesterCluster } from '@shell/utils/cluster';
6
6
  import ResourceFetch from '@shell/mixins/resource-fetch';
7
+ import { HARVESTER_CONTAINER } from '@shell/store/features';
8
+ import { checkSchemasForFindAllHash } from '@shell/utils/auth';
7
9
 
8
10
  export default {
9
11
  name: 'ListClusterGroup',
@@ -25,6 +27,16 @@ export default {
25
27
  },
26
28
 
27
29
  async fetch() {
30
+ try {
31
+ await checkSchemasForFindAllHash({
32
+ cluster: {
33
+ inStoreType: 'management',
34
+ type: FLEET.CLUSTER
35
+ },
36
+ }, this.$store);
37
+ } catch (e) {
38
+ }
39
+
28
40
  await this.$fetchType(this.resource);
29
41
  if (this.$store.getters['management/schemaFor']( FLEET.CLUSTER )) {
30
42
  this.allFleet = await this.$store.getters['management/all'](FLEET.CLUSTER);
@@ -35,6 +47,10 @@ export default {
35
47
  return { allFleet: [] };
36
48
  },
37
49
 
50
+ mounted() {
51
+ this.areHarvesterHostsVisible = this.$store.getters['features/get'](HARVESTER_CONTAINER);
52
+ },
53
+
38
54
  computed: {
39
55
  harvesterClusters() {
40
56
  const harvester = {};
@@ -50,6 +66,10 @@ export default {
50
66
  tokens() {
51
67
  const harvester = this.harvesterClusters;
52
68
 
69
+ if (this.areHarvesterHostsVisible) {
70
+ return this.rows;
71
+ }
72
+
53
73
  return this.rows.filter((token) => {
54
74
  const refs = token.metadata?.ownerReferences || [];
55
75
 
@@ -1,121 +1,210 @@
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';
15
20
 
16
21
  export default {
17
22
  components: {
18
- Banner, ResourceTable, Masthead, BadgeState
23
+ Banner, PaginatedResourceTable, Masthead, MachineSummaryGraph
19
24
  },
20
- mixins: [ResourceFetch],
21
- props: {
22
- loadIndeterminate: {
23
- type: Boolean,
24
- default: false
25
- },
26
25
 
27
- incrementalLoadingIndicator: {
28
- type: Boolean,
29
- default: false
30
- },
26
+ data() {
27
+ const mgmtClusterSchema = this.$store.getters['management/schemaFor'](MANAGEMENT.CLUSTER);
28
+ const headers = this.$store.getters['type-map/headersFor'](mgmtClusterSchema, false);
29
+ const paginationHeaders = this.$store.getters['type-map/headersFor'](mgmtClusterSchema, true);
31
30
 
32
- useQueryParamsForSimpleFiltering: {
33
- type: Boolean,
34
- default: false
31
+ if (isAutoscalerFeatureFlagEnabled(this.$store)) {
32
+ headers.splice(-3, 0, AUTOSCALER_ENABLED);
33
+ paginationHeaders.splice(-3, 0, STEVE_AUTOSCALER_ENABLED);
35
34
  }
36
- },
37
35
 
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),
36
+ return {
37
+ headers,
38
+ paginationHeaders,
39
+
40
+ clusterCount: undefined as number | undefined,
41
+
42
+ paginationContext: 'cluster-management',
43
+
44
+ mgmtClusterSchema,
45
+ provClusterSchema: this.$store.getters['management/schemaFor'](CAPI.RANCHER_CLUSTER),
44
46
  };
47
+ },
45
48
 
46
- if ( this.$store.getters['management/canList'](SNAPSHOT) ) {
47
- hash.etcdSnapshots = this.$fetchType(SNAPSHOT);
48
- }
49
+ // Forget the types when we leave the page
50
+ beforeUnmount() {
51
+ ManagementClusterUtils.forgetSecondaryResources({ context: this.paginationContext }, { $store: this.$store });
52
+ },
49
53
 
50
- if ( this.$store.getters['management/canList'](CAPI.MACHINE) ) {
51
- hash.capiMachines = this.$fetchType(CAPI.MACHINE);
52
- }
54
+ methods: {
55
+ /**
56
+ * SSP disabled, filter all rows via...
57
+ */
58
+ filterRowsLocal(rows: MgmtCluster[]) {
59
+ const filteredRows = ManagementClusterUtils.filterRowsLocal(rows, { $store: this.$store });
53
60
 
54
- if ( this.$store.getters['management/canList'](MANAGEMENT.NODE) ) {
55
- hash.mgmtNodes = this.$fetchType(MANAGEMENT.NODE);
56
- }
61
+ this.clusterCount = filteredRows.length;
57
62
 
58
- if ( this.$store.getters['management/canList'](MANAGEMENT.NODE_POOL) ) {
59
- hash.mgmtPools = this.$fetchType(MANAGEMENT.NODE_POOL);
60
- }
63
+ return filteredRows;
64
+ },
61
65
 
62
- if ( this.$store.getters['management/canList'](MANAGEMENT.NODE_TEMPLATE) ) {
63
- hash.mgmtTemplates = this.$fetchType(MANAGEMENT.NODE_TEMPLATE);
64
- }
66
+ /**
67
+ * SSP enabled, filter all rows via...
68
+ */
69
+ filterRowsApi(pagination: PaginationArgs): PaginationArgs {
70
+ return ManagementClusterUtils.filterRowsApi(pagination, { $store: this.$store });
71
+ },
65
72
 
66
- if ( this.$store.getters['management/canList'](CAPI.MACHINE_DEPLOYMENT) ) {
67
- hash.machineDeployments = this.$fetchType(CAPI.MACHINE_DEPLOYMENT);
68
- }
73
+ /**
74
+ * Fetch secondary resources on load
75
+ *
76
+ * Of type #PagTableFetchSecondaryResources
77
+ */
78
+ fetchSecondaryResources(opts: PagTableFetchSecondaryResourcesOpts): PagTableFetchSecondaryResourcesReturns {
79
+ if (opts.canPaginate) {
80
+ return Promise.resolve();
81
+ }
69
82
 
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
- }
83
+ const promises = ManagementClusterUtils.fetchSecondaryResources(opts, { $store: this.$store });
75
84
 
76
- const res = await allHash(hash);
85
+ // Additional requests required to support columns in this view (e.g. machines)
77
86
 
78
- this.mgmtClusters = res.mgmtClusters;
79
- this.showRke1DeprecationWarning = this.rows.some((r) => r.isRke1);
80
- },
87
+ if ( this.$store.getters['management/canList'](CAPI.MACHINE_DEPLOYMENT)) {
88
+ this.$store.dispatch(`management/findAll`, { type: CAPI.MACHINE_DEPLOYMENT });
89
+ }
81
90
 
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
- },
91
+ if ( this.$store.getters['management/canList'](MANAGEMENT.NODE_POOL)) {
92
+ this.$store.dispatch(`management/findAll`, { type: MANAGEMENT.NODE_POOL });
93
+ }
94
+
95
+ return Promise.all(promises);
96
+ },
97
+
98
+ /**
99
+ * Fetch secondary resources on page change
100
+ */
101
+ async fetchPageSecondaryResources({
102
+ canPaginate, force, page, pagResult
103
+ }: PagTableFetchPageSecondaryResourcesOpts) {
104
+ this.clusterCount = !canPaginate || !page?.length ? 0 : pagResult.count;
105
+
106
+ if (!canPaginate || !page?.length) {
107
+ return;
108
+ }
109
+
110
+ const promises = await ManagementClusterUtils.fetchPageSecondaryResources({
111
+ canPaginate, force, page, pagResult
112
+ }, { $store: this.$store });
113
+
114
+ // Additional requests required to support columns in this view (e.g. machines)
115
+
116
+ if ( this.$store.getters['management/canList'](CAPI.MACHINE_DEPLOYMENT)) {
117
+ const opt: ActionFindPageArgs = {
118
+ force,
119
+ pagination: new FilterArgs({
120
+ filters: PaginationParamFilter.createMultipleFields(page.map((r: any) => new PaginationFilterField({
121
+ field: 'spec.clusterName',
122
+ value: r.provClusterName
123
+ }))),
124
+ })
125
+ };
126
+
127
+ this.$store.dispatch(`management/findPage`, { type: CAPI.MACHINE_DEPLOYMENT, opt });
128
+ }
129
+
130
+ if ( this.$store.getters['management/canList'](MANAGEMENT.NODE_POOL)) {
131
+ const nodePoolFilters = PaginationParamFilter.createMultipleFields(page
132
+ .filter((p: any) => p.id)
133
+ .map((r: any) => new PaginationFilterField({
134
+ field: 'spec.clusterName',
135
+ value: r.id
136
+ })));
137
+
138
+ promises.push(this.$store.dispatch(`management/findPage`, {
139
+ type: MANAGEMENT.NODE_POOL,
140
+ opt: {
141
+ force,
142
+ pagination: new FilterArgs({ filters: nodePoolFilters })
143
+ }
144
+ }));
145
+ }
146
+
147
+ await Promise.all(promises);
148
+ },
149
+
150
+ /**
151
+ * Explorer world, listing PCIC, SSP disabled, filter all rows via...
152
+ */
153
+ filterProvRowsLocal(rows: ProvCluster[]) {
154
+ if (!rows.length) {
155
+ // no rows to filter on, so immediately return no rows
156
+ return [];
157
+ }
158
+
159
+ let filteredRows = [];
90
160
 
91
- computed: {
92
- filteredRows() {
93
- // If Harvester feature is enabled, hide Harvester Clusters
94
161
  if (this.harvesterEnabled) {
95
- return filterHiddenLocalCluster(filterOnlyKubernetesClusters(this.rows, this.$store), this.$store);
162
+ // If Harvester feature is enabled, hide Harvester Clusters
163
+ filteredRows = filterHiddenLocalCluster(filterOnlyKubernetesClusters(rows, this.$store), this.$store);
164
+ } else {
165
+ // Otherwise, show Harvester clusters - these will be shown with a warning
166
+ filteredRows = filterOnlyKubernetesClusters(rows, this.$store);
96
167
  }
97
168
 
98
- // Otherwise, show Harvester clusters - these will be shown with a warning
99
- return filterHiddenLocalCluster(this.rows, this.$store);
169
+ this.clusterCount = filteredRows.length;
170
+
171
+ return filteredRows;
100
172
  },
101
173
 
102
- hiddenHarvesterCount() {
174
+ /**
175
+ * Explorer world, listing PCIC, SSP enabled, filter all rows via...
176
+ */
177
+ filterProvRowsApi(pagination: PaginationArgs): PaginationArgs {
178
+ return this.filterRowsApi(pagination);
179
+ }
180
+ },
181
+
182
+ computed: {
183
+ isExplorer() {
103
184
  const product = this.$store.getters['currentProduct'];
104
- const isExplorer = product?.name === EXPLORER;
105
185
 
106
- // Don't show Harvester banner message on the cluster management page or if Harvester if not enabled
107
- if (!isExplorer || !this.harvesterEnabled) {
186
+ return product?.name === EXPLORER;
187
+ },
188
+
189
+ hiddenHarvesterCount() {
190
+ // Don't show Harvester banner message on the cluster management page or if Harvester is not enabled
191
+ if (!this.isExplorer || !this.harvesterEnabled || this.clusterCount === undefined) {
108
192
  return 0;
109
193
  }
110
194
 
111
- return this.rows.length - filterOnlyKubernetesClusters(this.rows, this.$store).length;
195
+ const allClusters = this.$store.getters['management/count']({ name: CAPI.RANCHER_CLUSTER });
196
+ // clusterCount is total excluding local (if not counted) and harvester (if not counted)
197
+ // at this point though (viewing prov clusters in explorer) we must be in the local cluster, so can exclude that exclusion
198
+ const nonHarvesterClusters = this.clusterCount;
199
+
200
+ return allClusters - nonHarvesterClusters;
112
201
  },
113
202
 
114
203
  createLocation() {
115
- const options = this.$store.getters[`type-map/optionsFor`](this.resource)?.custom || {};
204
+ const options = this.$store.getters[`type-map/optionsFor`](CAPI.RANCHER_CLUSTER)?.custom || {};
116
205
  const params = {
117
206
  product: this.$store.getters['currentProduct'].name,
118
- resource: this.resource
207
+ resource: CAPI.RANCHER_CLUSTER
119
208
  };
120
209
  const defaultLocation = {
121
210
  name: 'c-cluster-product-resource-create',
@@ -126,10 +215,10 @@ export default {
126
215
  },
127
216
 
128
217
  importLocation() {
129
- const options = this.$store.getters[`type-map/optionsFor`](this.resource)?.custom || {};
218
+ const options = this.$store.getters[`type-map/optionsFor`](CAPI.RANCHER_CLUSTER)?.custom || {};
130
219
  const params = {
131
220
  product: this.$store.getters['currentProduct'].name,
132
- resource: this.resource
221
+ resource: CAPI.RANCHER_CLUSTER
133
222
  };
134
223
  const defaultLocation = {
135
224
  name: 'c-cluster-product-resource-create',
@@ -141,130 +230,123 @@ export default {
141
230
  },
142
231
 
143
232
  canImport() {
144
- const schema = this.$store.getters['management/schemaFor'](CAPI.RANCHER_CLUSTER);
145
-
146
- return !!schema?.collectionMethods.find((x) => x.toLowerCase() === 'post');
233
+ return !!this.provClusterSchema?.collectionMethods.find((x: string) => x.toLowerCase() === 'post');
147
234
  },
148
235
 
149
236
  harvesterEnabled: mapFeature(HARVESTER_FEATURE),
150
237
 
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
- },
238
+ nonStandardWorkspace() {
239
+ // Show the workspace grouping option if there's clusters with workspaces other than 'fleet-default' or 'fleet-local'
157
240
 
158
- headers() {
159
- const headers = this.$store.getters['type-map/headersFor'](this.schema);
241
+ // Note - This _just_ looks at namespaces, which are normally 1-1 with namespaces and also cover cases where clusters aren't in namespaces
242
+ // The only exception is for v2prov clusters that were moved workspace after enabling `provisioningv2-fleet-workspace-back-population`
243
+ // If we need to fully support this we can either
244
+ // 1. always show grouping
245
+ // 2. use a summary request to determine to show it
246
+ // 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)
247
+ // b. check for values other than fleet-local and fleet-default in the response
160
248
 
161
- if (isAutoscalerFeatureFlagEnabled(this.$store)) {
162
- headers.splice(-3, 0, AUTOSCALER_ENABLED);
163
- }
249
+ const counts = this.$store.getters['management/all'](COUNT)?.[0]?.counts || {};
250
+ const namespaces: { [nsName: string]: { count: number } } = counts[CAPI.RANCHER_CLUSTER]?.namespaces || counts.namespaces || {};
164
251
 
165
- return headers;
166
- }
252
+ for (const ns in namespaces) {
253
+ if (ns !== 'fleet-local' && ns !== 'fleet-default' && namespaces[ns].count > 0) {
254
+ return true;
255
+ }
256
+ }
167
257
 
258
+ return false;
259
+ },
168
260
  },
169
261
 
170
- $loadingResources() {
171
- // results are filtered so we wouldn't get the correct count on indicator...
172
- return { loadIndeterminate: true };
173
- }
174
-
175
262
  };
176
263
  </script>
177
264
 
178
265
  <template>
179
266
  <div>
180
- <Banner
181
- v-if="showRke1DeprecationWarning"
182
- color="warning"
183
- label-key="cluster.banner.rke1DeprecationMessage"
184
- />
185
-
186
267
  <Banner
187
268
  v-if="hiddenHarvesterCount"
188
269
  color="info"
189
270
  :label="t('cluster.harvester.clusterWarning', {count: hiddenHarvesterCount} )"
190
271
  />
191
272
 
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
273
+ <template v-if="isExplorer">
274
+ <PaginatedResourceTable
275
+ :schema="provClusterSchema"
276
+
277
+ :local-filter="filterProvRowsLocal"
278
+ :api-filter="filterProvRowsApi"
279
+ />
280
+ </template>
281
+ <template v-else>
282
+ <Masthead
283
+ :schema="provClusterSchema"
284
+ :resource="provClusterSchema.id"
285
+ :create-location="createLocation"
286
+ component-testid="cluster-manager-list"
204
287
  >
205
- <router-link
206
- :to="importLocation"
207
- class="btn role-primary mr-10"
208
- data-testid="cluster-manager-list-import"
288
+ <template
289
+ v-if="canImport"
290
+ #extraActions
209
291
  >
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"
292
+ <router-link
293
+ :to="importLocation"
294
+ class="btn role-primary mr-10"
295
+ data-testid="cluster-manager-list-import"
245
296
  >
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>
297
+ {{ t('cluster.importAction') }}
298
+ </router-link>
299
+ </template>
300
+ </Masthead>
301
+
302
+ <PaginatedResourceTable
303
+ :schema="mgmtClusterSchema"
304
+
305
+ :headers="headers"
306
+ :pagination-headers="paginationHeaders"
307
+ :context="paginationContext"
308
+
309
+ :use-query-params-for-simple-filtering="true"
310
+
311
+ :local-filter="filterRowsLocal"
312
+ :api-filter="filterRowsApi"
313
+
314
+ :fetch-secondary-resources="fetchSecondaryResources"
315
+ :fetch-page-secondary-resources="fetchPageSecondaryResources"
316
+
317
+ :groupable="nonStandardWorkspace"
318
+ :namespaced="true"
319
+
320
+ :data-testid="'cluster-list'"
321
+ >
322
+ <template #cell:summary="{row}">
323
+ <!-- Replace the MACHINE_SUMMARY columns contents... but only if there's no stateParts -->
324
+ <span v-if="!row.stateParts.length">{{ row.statusInfo.nodeCount || 0 }}</span>
325
+ <MachineSummaryGraph
326
+ v-else
327
+ :row="row"
328
+ />
329
+ </template>
330
+ <template #cell:explorer="{row}">
331
+ <!-- Align side nav cluster, home page name link and cluster management cluster explor buttons on canExplore -->
332
+ <router-link
333
+ v-if="row.canExplore"
334
+ data-testid="cluster-manager-list-explore-management"
335
+ class="btn btn-sm role-secondary"
336
+ :to="{name: 'c-cluster', params: {cluster: row.id}}"
337
+ >
338
+ {{ t('cluster.explore') }}
339
+ </router-link>
340
+ <button
341
+ v-else
342
+ data-testid="cluster-manager-list-explore"
343
+ :disabled="true"
344
+ class="btn btn-sm role-secondary"
345
+ >
346
+ {{ t('cluster.explore') }}
347
+ </button>
348
+ </template>
349
+ </PaginatedResourceTable>
350
+ </template>
269
351
  </div>
270
352
  </template>