@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
@@ -1,22 +1,17 @@
1
1
  import {
2
- CAPI, MANAGEMENT, NAMESPACE, NORMAN, SNAPSHOT, HCI, LOCAL_CLUSTER,
2
+ CAPI, MANAGEMENT, NAMESPACE, NORMAN, SNAPSHOT, LOCAL_CLUSTER,
3
3
  CONFIG_MAP, AUTOSCALER_CONFIG_MAP_ID,
4
4
  EVENT
5
5
  } from '@shell/config/types';
6
6
  import SteveModel from '@shell/plugins/steve/steve-class';
7
7
  import { findBy } from '@shell/utils/array';
8
8
  import { get, set } from '@shell/utils/object';
9
- import { sortBy } from '@shell/utils/sort';
10
- import { ucFirst } from '@shell/utils/string';
11
9
  import { compare } from '@shell/utils/version';
12
- import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
13
- import { CAPI as CAPI_ANNOTATIONS, NODE_ARCHITECTURE } from '@shell/config/labels-annotations';
14
- import { KEV1 } from '@shell/models/management.cattle.io.kontainerdriver';
10
+ import { CAPI as CAPI_ANNOTATIONS } from '@shell/config/labels-annotations';
15
11
  import jsyaml from 'js-yaml';
16
12
  import { defineAsyncComponent, markRaw } from 'vue';
17
13
  import stevePaginationUtils from '@shell/plugins/steve/steve-pagination-utils';
18
14
  import { PaginationFilterField, PaginationParamFilter } from '@shell/types/store/pagination.types';
19
- import { isHostedProvider } from '@shell/utils/provider';
20
15
 
21
16
  const RKE1_ALLOWED_ACTIONS = [
22
17
  'promptRemove',
@@ -97,7 +92,7 @@ export default class ProvCluster extends SteveModel {
97
92
  }
98
93
 
99
94
  get canExplore() {
100
- return this.mgmt?.isReady && !this.hasError;
95
+ return this.mgmt?.canExplore;
101
96
  }
102
97
 
103
98
  get canEdit() {
@@ -222,25 +217,11 @@ export default class ProvCluster extends SteveModel {
222
217
  }
223
218
 
224
219
  get normanCluster() {
225
- const name = this.status?.clusterName;
226
-
227
- if ( !name ) {
228
- return null;
229
- }
230
-
231
- const out = this.$rootGetters['rancher/byId'](NORMAN.CLUSTER, name);
232
-
233
- return out;
220
+ return this.mgmt?.normanCluster;
234
221
  }
235
222
 
236
223
  async findNormanCluster() {
237
- const name = this.status?.clusterName;
238
-
239
- if ( !name ) {
240
- return null;
241
- }
242
-
243
- return await this.$dispatch('rancher/find', { type: NORMAN.CLUSTER, id: name }, { root: true });
224
+ return this.mgmt?.findNormanCluster();
244
225
  }
245
226
 
246
227
  explore() {
@@ -253,15 +234,7 @@ export default class ProvCluster extends SteveModel {
253
234
  }
254
235
 
255
236
  async goToHarvesterCluster() {
256
- const harvesterCluster = await this.$dispatch('create', {
257
- ...this,
258
- type: HCI.CLUSTER
259
- });
260
-
261
- try {
262
- await harvesterCluster.goToCluster();
263
- } catch {
264
- }
237
+ return this.mgmt?.goToHarvesterCluster();
265
238
  }
266
239
 
267
240
  get canDelete() {
@@ -277,15 +250,7 @@ export default class ProvCluster extends SteveModel {
277
250
  }
278
251
 
279
252
  get isHostedKubernetesProvider() {
280
- const context = {
281
- dispatch: this.$dispatch,
282
- getters: this.$getters,
283
- axios: this.$axios,
284
- $extension: this.$extension,
285
- t: (...args) => this.t.apply(this, args),
286
- };
287
-
288
- return isHostedProvider(context, this.provisioner);
253
+ return this.mgmt?.isHostedKubernetesProvider;
289
254
  }
290
255
 
291
256
  get providerConfig() {
@@ -300,18 +265,7 @@ export default class ProvCluster extends SteveModel {
300
265
  }
301
266
 
302
267
  get isPrivateHostedProvider() {
303
- if (this.isHostedKubernetesProvider && this.mgmt && this.provisioner) {
304
- switch (this.provisioner.toLowerCase()) {
305
- case 'gke':
306
- return this.mgmt.spec?.gkeConfig?.privateClusterConfig?.enablePrivateEndpoint;
307
- case 'eks':
308
- return this.mgmt.spec?.eksConfig?.privateAccess;
309
- case 'aks':
310
- return this.mgmt.spec?.aksConfig?.privateCluster;
311
- }
312
- }
313
-
314
- return false;
268
+ return this.mgmt?.isPrivateHostedProvider || false;
315
269
  }
316
270
 
317
271
  get isLocal() {
@@ -320,7 +274,7 @@ export default class ProvCluster extends SteveModel {
320
274
 
321
275
  // Is the cluster a legacy (unsupported) KEV1 cluster?
322
276
  get isKev1() {
323
- return KEV1.includes(this.mgmt?.spec?.genericEngineConfig?.driverName);
277
+ return this.mgmt?.isKev1;
324
278
  }
325
279
 
326
280
  get isImported() {
@@ -328,39 +282,11 @@ export default class ProvCluster extends SteveModel {
328
282
  return false;
329
283
  }
330
284
 
331
- // imported rke2 and k3s have status.driver === rke2 and k3s respectively
332
- // Provisioned rke2 and k3s have status.driver === imported
333
- const provider = this.mgmt?.status?.provider;
334
- const driver = this.mgmt?.status?.driver;
335
-
336
- // The main case
337
- if (provider === 'k3s' || provider === 'rke2') {
338
- return driver === provider;
339
- }
340
- // The 'waiting' case
341
- if (!provider && (driver === 'k3s' || driver === 'rke2')) {
342
- return true;
343
- }
344
-
345
- // imported KEv2
346
- // we can't rely on this.provisioner to determine imported-ness for these clusters, as it will return 'aks' 'eks' 'gke' for both provisioned and imported clusters
347
- if (this.isHostedKubernetesProvider && !!this.providerConfig.imported) {
348
- return true;
349
- }
350
-
351
- return this.provisioner === 'imported';
285
+ return this.mgmt?.isImported;
352
286
  }
353
287
 
354
288
  get isCustom() {
355
- if ( this.isRke2 ) {
356
- return !(this.spec?.rkeConfig?.machinePools?.length);
357
- }
358
-
359
- if ( this.isRke1 ) {
360
- return !this.pools?.length;
361
- }
362
-
363
- return false;
289
+ return this.mgmt?.isCustom;
364
290
  }
365
291
 
366
292
  get confirmRemove() {
@@ -368,24 +294,24 @@ export default class ProvCluster extends SteveModel {
368
294
  }
369
295
 
370
296
  get isImportedK3s() {
371
- return this.isImported && this.isK3s;
297
+ return this.mgmt?.isImportedK3s;
372
298
  }
373
299
 
374
300
  get isImportedRke2() {
375
- return this.isImported && this.mgmt?.status?.provider?.startsWith('rke2');
301
+ return this.mgmt?.isImportedRke2;
376
302
  }
377
303
 
378
304
  get isK3s() {
379
- return this.mgmt?.status ? this.mgmt?.status.provider === 'k3s' : (this.spec?.kubernetesVersion || '').includes('k3s') ;
305
+ return this.mgmt?.isK3s;
380
306
  }
381
307
 
382
308
  get isRke2() {
309
+ // This isn't mapped to mgmt isRke2 to ensure the create flow --> edit yaml (where no mgmt cluster exists) works correctly
383
310
  return !!this.spec?.rkeConfig;
384
311
  }
385
312
 
386
313
  get isRke1() {
387
- // rancherKubernetesEngineConfig is not defined on imported RKE1 clusters
388
- return !!this.mgmt?.spec?.rancherKubernetesEngineConfig || this.mgmt?.labels['provider.cattle.io'] === 'rke';
314
+ return false;
389
315
  }
390
316
 
391
317
  get isHarvester() {
@@ -394,23 +320,19 @@ export default class ProvCluster extends SteveModel {
394
320
 
395
321
  // identify v2 provisioning clusters created using upstream capi infrastructure providers instead of rancher/machine
396
322
  get isCapiHybrid() {
397
- if (!this.isRke2) {
398
- return false;
399
- }
400
-
401
- const machineReferences = (this.spec?.rkeConfig?.machinePools || []).map((pool) => pool.machineConfigRef);
402
-
403
- const capiMachines = machineReferences.find((r) => r?.apiVersion?.includes('cluster.x-k8s.io'));
404
-
405
- return !!capiMachines;
323
+ return this.mgmt?.isCapiHybrid;
406
324
  }
407
325
 
408
326
  get mgmtClusterId() {
327
+ if (this.status?.clusterName) {
328
+ return this.status.clusterName;
329
+ }
330
+
409
331
  // when a cluster is created `this` instance isn't immediately updated with `status.clusterName`
410
332
  // Workaround - Get fresh copy from the store
411
333
  const pCluster = this.$rootGetters['management/byId'](CAPI.RANCHER_CLUSTER, this.id);
412
334
 
413
- return this.status?.clusterName || pCluster?.status?.clusterName;
335
+ return pCluster?.status?.clusterName;
414
336
  }
415
337
 
416
338
  get mgmt() {
@@ -424,7 +346,7 @@ export default class ProvCluster extends SteveModel {
424
346
  // nodeGroups can be undefined for an EKS cluster that has just been created and has not
425
347
  // had any node groups added to it
426
348
  get eksNodeGroups() {
427
- return this.mgmt?.spec?.eksConfig?.nodeGroups || [];
349
+ return this.mgmt?.eksNodeGroups || [];
428
350
  }
429
351
 
430
352
  waitForProvisioner(timeout, interval) {
@@ -435,157 +357,47 @@ export default class ProvCluster extends SteveModel {
435
357
 
436
358
  waitForMgmt(timeout = 60000, interval) {
437
359
  return this.waitForTestFn(() => {
438
- // `this` instance isn't getting updated with `status.clusterName`
439
- // Workaround - Get fresh copy from the store
440
- const pCluster = this.$rootGetters['management/byId'](CAPI.RANCHER_CLUSTER, this.id);
441
- const name = this.status?.clusterName || pCluster?.status?.clusterName;
360
+ const mgmtId = this.mgmtClusterId;
442
361
 
443
362
  try {
444
- if (name) {
363
+ if (mgmtId) {
445
364
  // Just in case we're not generically watching all mgmt clusters and...
446
365
  // thus won't receive new mgmt cluster over socket...
447
366
  // fire and forget a request to fetch it (this won't make multiple requests if one is already running)
448
- this.$dispatch('find', { type: MANAGEMENT.CLUSTER, id: name });
367
+ this.$dispatch('find', { type: MANAGEMENT.CLUSTER, id: mgmtId });
449
368
  }
450
369
  } catch {}
451
370
 
452
- return name && !!this.$rootGetters['management/byId'](MANAGEMENT.CLUSTER, name);
453
- }, this.$rootGetters['i18n/t']('cluster.managementTimeout'), timeout, interval);
371
+ return mgmtId && !!this.$rootGetters['management/byId'](MANAGEMENT.CLUSTER, mgmtId);
372
+ }, this.$rootGetters['i18n/t']('cluster.managementTimeout', { type: MANAGEMENT.CLUSTER, name: this.mgmtClusterId }), timeout, interval);
454
373
  }
455
374
 
456
375
  get provisioner() {
457
- if ( this.isRke2 ) {
458
- const allKeys = Object.keys(this.spec);
459
- const configKey = allKeys.find( (k) => k.endsWith('Config'));
460
-
461
- if ( configKey === 'rkeConfig') {
462
- return 'rke2';
463
- } else if ( configKey ) {
464
- return configKey.replace(/config$/i, '');
465
- }
466
- } else if ( this.mgmt ) {
467
- return this.mgmt.provisioner;
468
- }
469
-
470
- return null;
376
+ return this.mgmt?.provisioner;
471
377
  }
472
378
 
473
379
  get provisionerDisplay() {
474
- // Allow a model extension to override the display of the provisioner
475
- if (this.customProvisionerHelper?.provisionerDisplay) {
476
- return this.customProvisionerHelper?.provisionerDisplay(this);
477
- }
478
-
479
- let provisioner = (this.provisioner || '').toLowerCase();
480
-
481
- // RKE provisioner can actually do K3s too...
482
- if ( provisioner === 'rke2' && this.spec?.kubernetesVersion?.includes('k3s') ) {
483
- provisioner = 'k3s';
484
- } else if ( this.isImportedK3s ) {
485
- provisioner = 'k3s';
486
- } else if ( this.isImportedRke2 ) {
487
- provisioner = 'rke2';
488
- } else if ((this.isImported || this.isLocal) && this.isRke1) {
489
- provisioner = 'rke';
490
- }
491
-
492
- return this.$rootGetters['i18n/withFallback'](`cluster.provider."${ provisioner }"`, null, ucFirst(provisioner));
380
+ return this.mgmt?.provisionerDisplay;
493
381
  }
494
382
 
495
383
  get providerLogo() {
496
384
  return this.mgmt?.providerLogo;
497
385
  }
498
386
 
499
- get nodesArchitecture() {
500
- const obj = {};
501
-
502
- this.nodes?.forEach((node) => {
503
- if (!node.metadata?.state?.transitioning) {
504
- const architecture = node.status?.nodeLabels?.[NODE_ARCHITECTURE];
505
-
506
- const key = architecture || this.t('cluster.architecture.label.unknown');
507
-
508
- obj[key] = (obj[key] || 0) + 1;
509
- }
510
- });
511
-
512
- return obj;
513
- }
514
-
515
387
  get architecture() {
516
- const keys = Object.keys(this.nodesArchitecture);
517
-
518
- switch (keys.length) {
519
- case 0:
520
- return { label: this.t('generic.provisioning') };
521
- case 1:
522
- return { label: keys[0] };
523
- default:
524
- return {
525
- label: this.t('cluster.architecture.label.mixed'),
526
- tooltip: keys.reduce((acc, k) => `${ acc }${ k }: ${ this.nodesArchitecture[k] }<br>`, '')
527
- };
528
- }
388
+ return this.mgmt?.architecture;
529
389
  }
530
390
 
531
391
  get kubernetesVersion() {
532
- const unknown = this.$rootGetters['i18n/t']('generic.unknown');
533
-
534
- if ( this.isRke2 ) {
535
- const fromStatus = this.status?.version?.gitVersion;
536
- const fromSpec = this.spec?.kubernetesVersion;
537
-
538
- return fromStatus || fromSpec || unknown;
539
- } else if ( this.mgmt ) {
540
- return this.mgmt.kubernetesVersion || unknown;
541
- } else {
542
- return unknown;
543
- }
392
+ return this.mgmt?.kubernetesVersion;
544
393
  }
545
394
 
546
395
  get machineProvider() {
547
- // First check annotation - useful for clusters created by extension providers
548
- const fromAnnotation = this.annotations?.[CAPI_ANNOTATIONS.UI_CUSTOM_PROVIDER];
549
-
550
- if (fromAnnotation) {
551
- return fromAnnotation;
552
- }
553
-
554
- if (this.isHarvester) {
555
- return HARVESTER;
556
- } else if ( this.isImported || this.isCapiHybrid ) {
557
- return null;
558
- } else if ( this.isRke2 ) {
559
- const kind = this.spec?.rkeConfig?.machinePools?.[0]?.machineConfigRef?.kind?.toLowerCase();
560
-
561
- if ( kind ) {
562
- return kind.replace(/config$/i, '').toLowerCase();
563
- }
564
-
565
- return null;
566
- } else if ( this.mgmt?.machineProvider ) {
567
- return this.mgmt.machineProvider.toLowerCase();
568
- }
569
-
570
- return null;
396
+ return this.mgmt?.machineProvider?.toLowerCase();
571
397
  }
572
398
 
573
399
  get machineProviderDisplay() {
574
- if (this.customProvisionerHelper?.machineProviderDisplay) {
575
- return this.customProvisionerHelper?.machineProviderDisplay(this);
576
- }
577
-
578
- if ( this.isImported ) {
579
- return null;
580
- }
581
-
582
- const provider = (this.machineProvider || '').toLowerCase();
583
-
584
- if ( provider ) {
585
- return this.$rootGetters['i18n/withFallback'](`cluster.provider."${ provider }"`, null, provider);
586
- } else {
587
- return this.$rootGetters['i18n/t']('generic.unknown');
588
- }
400
+ return this.mgmt?.machineProviderDisplay;
589
401
  }
590
402
 
591
403
  get machinePoolDefaults() {
@@ -613,120 +425,47 @@ export default class ProvCluster extends SteveModel {
613
425
  }
614
426
 
615
427
  get nodes() {
616
- return this.$rootGetters['management/all'](MANAGEMENT.NODE).filter((node) => node.id.startsWith(this.mgmtClusterId));
428
+ return this.mgmt?.nodes || [];
617
429
  }
618
430
 
619
431
  get machines() {
620
- return this.$rootGetters['management/all'](CAPI.MACHINE).filter((machine) => {
621
- if ( machine.metadata?.namespace !== this.metadata.namespace ) {
622
- return false;
623
- }
624
-
625
- return machine.spec?.clusterName === this.metadata.name;
626
- });
432
+ return this.mgmt?.machines || [];
627
433
  }
628
434
 
629
435
  get displayName() {
630
- if ( this.mgmt && !this.isRke2 ) {
631
- return this.mgmt.spec.displayName;
632
- }
633
-
634
- return null;
436
+ return this.mgmt?.nameDisplay || null;
635
437
  }
636
438
 
637
439
  get pools() {
638
- const deployments = this.$rootGetters['management/all'](CAPI.MACHINE_DEPLOYMENT).filter((pool) => pool.spec?.clusterName === this.metadata.name);
639
-
640
- if (!!deployments.length) {
641
- return deployments;
642
- }
643
-
644
- return this.$rootGetters['management/all'](MANAGEMENT.NODE_POOL).filter((pool) => pool.spec.clusterName === this.status?.clusterName);
440
+ return this.mgmt?.pools || [];
645
441
  }
646
442
 
647
443
  get desired() {
648
- return this.pools.reduce((acc, pool) => acc + (pool.desired || 0), 0);
444
+ return this.mgmt?.desired || 0;
649
445
  }
650
446
 
651
447
  get pending() {
652
- return this.pools.reduce((acc, pool) => acc + (pool.pending || 0), 0);
448
+ return this.mgmt?.pending || 0;
653
449
  }
654
450
 
655
451
  get outdated() {
656
- return this.pools.reduce((acc, pool) => acc + (pool.outdated || 0), 0);
452
+ return this.mgmt?.outdated || 0;
657
453
  }
658
454
 
659
455
  get ready() {
660
- return this.pools.reduce((acc, pool) => acc + (pool.ready || 0), 0);
456
+ return this.mgmt?.ready || 0;
661
457
  }
662
458
 
663
459
  get unavailable() {
664
- return this.pools.reduce((acc, pool) => acc + (pool.unavailable || 0), 0);
460
+ return this.mgmt?.unavailable || 0;
665
461
  }
666
462
 
667
463
  get unavailableMachines() {
668
- if (this.isReady) {
669
- if (this.isRke1) {
670
- const names = this.nodes.filter((node) => {
671
- return node.status.conditions.find((c) => c.error && c.type === 'Ready');
672
- }).map((node) => {
673
- const name = node.status.nodeName || node.metadata.name;
674
-
675
- return this.t('cluster.availabilityWarnings.node', { name });
676
- });
677
-
678
- return names.join('<br>');
679
- } else {
680
- const names = this.machines.filter((machine) => {
681
- return machine.status?.conditions?.find((c) => c.error && c.type === 'NodeHealthy');
682
- }).map((machine) => {
683
- if (machine.status?.nodeRef?.name) {
684
- return this.t('cluster.availabilityWarnings.node', { name: machine.status.nodeRef.name });
685
- }
686
-
687
- return this.t('cluster.availabilityWarnings.machine', { name: machine.metadata.name });
688
- });
689
-
690
- return names.join('<br>');
691
- }
692
- }
693
-
694
- return '';
464
+ return this.mgmt?.unavailableMachines || '';
695
465
  }
696
466
 
697
467
  get stateParts() {
698
- const out = [
699
- {
700
- label: 'Pending',
701
- color: 'bg-info',
702
- textColor: 'text-info',
703
- value: this.pending,
704
- sort: 1,
705
- },
706
- {
707
- label: 'Outdated',
708
- color: 'bg-warning',
709
- textColor: 'text-warning',
710
- value: this.outdated,
711
- sort: 2,
712
- },
713
- {
714
- label: 'Unavailable',
715
- color: 'bg-error',
716
- textColor: 'text-error',
717
- value: this.unavailable,
718
- sort: 3,
719
- },
720
- {
721
- label: 'Ready',
722
- color: 'bg-success',
723
- textColor: 'text-success',
724
- value: this.ready,
725
- sort: 4,
726
- },
727
- ].filter((x) => x.value > 0);
728
-
729
- return sortBy(out, 'sort:desc');
468
+ return this.mgmt?.stateParts;
730
469
  }
731
470
 
732
471
  async getOrCreateToken() {
@@ -995,27 +734,7 @@ export default class ProvCluster extends SteveModel {
995
734
  }
996
735
 
997
736
  get hasError() {
998
- // Before we were just checking for this.status?.conditions?.some((condition) => condition.error === true)
999
- // but this is wrong as an error might exist but it might not be meaningful in the context of readiness of a cluster
1000
- // which is what this 'hasError' is used for.
1001
- // We now check if there's a ready condition after an error, which helps dictate the readiness of a cluster
1002
- // Based on the findings in https://github.com/rancher/dashboard/issues/10043
1003
- if (this.status?.conditions && this.status?.conditions.length) {
1004
- // if there are errors, we compare with how recent the "Ready" condition is compared to that error, otherwise we just move on
1005
- if (this.status?.conditions.some((c) => c.error === true)) {
1006
- // there's no ready condition and has an error, mark it
1007
- if (!this.status?.conditions.some((c) => c.type === 'Ready')) {
1008
- return true;
1009
- }
1010
-
1011
- const filteredConditions = this.status?.conditions.filter((c) => c.error === true || c.type === 'Ready');
1012
- const mostRecentCondition = filteredConditions.reduce((a, b) => ((a.lastUpdateTime > b.lastUpdateTime) ? a : b));
1013
-
1014
- return mostRecentCondition.error;
1015
- }
1016
- }
1017
-
1018
- return false;
737
+ return this.mgmt ? this.mgmt.hasError : true;
1019
738
  }
1020
739
 
1021
740
  get namespaceLocation() {
@@ -1242,9 +961,7 @@ export default class ProvCluster extends SteveModel {
1242
961
  }
1243
962
 
1244
963
  get isAutoscalerEnabled() {
1245
- return !!this.spec?.rkeConfig?.machinePools?.some((pool) => {
1246
- return typeof pool.autoscalingMinSize !== 'undefined' || typeof pool.autoscalingMaxSize !== 'undefined';
1247
- });
964
+ return this.mgmt?.isAutoscalerEnabled;
1248
965
  }
1249
966
 
1250
967
  get isAutoscalerPaused() {
@@ -1,7 +1,6 @@
1
1
  import NormanModel from '@shell/plugins/steve/norman-class';
2
2
  import { SNAPSHOT } from '@shell/config/labels-annotations';
3
3
  import { CAPI } from '@shell/config/types';
4
- import { findBy } from '@shell/utils/array';
5
4
  import { get } from '@shell/utils/object';
6
5
  import { base64Decode } from '@shell/utils/crypto';
7
6
  import { ucFirst } from '@shell/utils/string';
@@ -39,7 +38,7 @@ export default class EtcdBackup extends NormanModel {
39
38
  }
40
39
 
41
40
  get cluster() {
42
- return findBy(this.$rootGetters['management/all'](CAPI.RANCHER_CLUSTER), 'metadata.name', this.clusterName);
41
+ return this.$rootGetters['management/byId'](CAPI.RANCHER_CLUSTER, `${ this.metadata.namespace }/${ this.clusterName }`);
43
42
  }
44
43
 
45
44
  get rke2() {