@rancher/shell 3.0.12-rc.1 → 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 (376) 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/images/providers/entraid-black.svg +4 -0
  54. package/assets/images/providers/entraid.svg +9 -0
  55. package/assets/images/vendor/entraid.svg +9 -0
  56. package/assets/styles/app.scss +0 -1
  57. package/assets/styles/base/_variables.scss +2 -0
  58. package/assets/styles/fonts/_fontstack.scss +132 -8
  59. package/assets/translations/en-us.yaml +41 -22
  60. package/assets/translations/zh-hans.yaml +4 -8
  61. package/chart/__tests__/S3.test.ts +10 -3
  62. package/chart/monitoring/index.vue +10 -1
  63. package/components/ActionDropdownShell.vue +2 -1
  64. package/components/CountBox.vue +20 -0
  65. package/components/CreateDriver.vue +0 -12
  66. package/components/CruResourceFooter.vue +9 -5
  67. package/components/DetailText.vue +12 -3
  68. package/components/ExplorerProjectsNamespaces.vue +1 -1
  69. package/components/InstallHelmCharts.vue +2 -2
  70. package/components/LandingPagePreference.vue +14 -5
  71. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +15 -1
  72. package/components/Resource/Detail/Metadata/index.vue +6 -0
  73. package/components/Resource/Detail/ResourcePopover/index.vue +12 -1
  74. package/components/Resource/Detail/SpacedRow.vue +3 -1
  75. package/components/Resource/Detail/TitleBar/index.vue +10 -11
  76. package/components/ResourceList/Masthead.vue +12 -8
  77. package/components/SelectIconGrid.vue +5 -10
  78. package/components/SingleClusterInfo.vue +1 -0
  79. package/components/SortableTable/__tests__/sorting.test.ts +126 -0
  80. package/components/SortableTable/index.vue +6 -9
  81. package/components/SortableTable/selection.js +23 -5
  82. package/components/SortableTable/sorting.js +6 -3
  83. package/components/Wizard.vue +14 -13
  84. package/components/__tests__/CountBox.test.ts +72 -0
  85. package/components/__tests__/DetailText.test.ts +113 -0
  86. package/components/fleet/FleetBundles.vue +100 -12
  87. package/components/fleet/FleetClusterTargets/index.vue +54 -15
  88. package/components/fleet/__tests__/FleetClusterTargets.test.ts +149 -115
  89. package/components/fleet/__tests__/FleetClusters.test.ts +12 -12
  90. package/components/form/InputWithSelect.vue +18 -10
  91. package/components/form/KeyValue.vue +17 -1
  92. package/components/form/LabeledSelect.vue +101 -26
  93. package/components/form/NameNsDescription.vue +11 -0
  94. package/components/form/Security.vue +6 -2
  95. package/components/form/Select.vue +73 -56
  96. package/components/form/ServiceNameSelect.vue +13 -11
  97. package/components/form/WorkloadPorts.vue +2 -7
  98. package/components/form/__tests__/KeyValue.test.ts +66 -0
  99. package/components/form/__tests__/NodeScheduling.test.ts +9 -0
  100. package/components/form/__tests__/Security.test.ts +76 -0
  101. package/components/form/labeled-select-utils/useLabeledSelectPagination.ts +138 -0
  102. package/components/formatter/Autoscaler.vue +4 -4
  103. package/components/formatter/ClusterKubeVersion.vue +27 -0
  104. package/components/formatter/ClusterLink.vue +1 -7
  105. package/components/formatter/ClusterProvider.vue +6 -10
  106. package/components/formatter/FleetSummaryGraph.vue +0 -3
  107. package/components/formatter/MachineSummaryGraph.vue +1 -1
  108. package/components/formatter/PodsUsage.vue +2 -2
  109. package/components/formatter/__tests__/Autoscaler.test.ts +19 -22
  110. package/components/formatter/__tests__/FleetSummaryGraph.test.ts +216 -0
  111. package/components/formatter/__tests__/PodsUsage.test.ts +6 -10
  112. package/components/nav/Group.vue +7 -6
  113. package/components/nav/Header.vue +24 -3
  114. package/components/nav/NamespaceFilter.vue +2 -2
  115. package/components/nav/NotificationCenter/Notification.vue +4 -1
  116. package/components/nav/NotificationCenter/NotificationHeader.vue +20 -8
  117. package/components/nav/NotificationCenter/__tests__/NotificationHeader.test.ts +80 -0
  118. package/components/nav/TopLevelMenu.helper.ts +15 -3
  119. package/components/nav/TopLevelMenu.vue +16 -5
  120. package/components/nav/Type.vue +8 -7
  121. package/components/nav/WindowManager/index.vue +2 -1
  122. package/components/nav/WorkspaceSwitcher.vue +13 -0
  123. package/components/nav/__tests__/Group.test.ts +67 -0
  124. package/components/nav/__tests__/Header.test.ts +235 -0
  125. package/components/nav/__tests__/TopLevelMenu.test.ts +145 -21
  126. package/components/nav/__tests__/Type.test.ts +20 -3
  127. package/components/templates/default.vue +34 -4
  128. package/components/templates/home.vue +30 -25
  129. package/components/templates/plain.vue +31 -26
  130. package/components/templates/standalone.vue +17 -0
  131. package/composables/useFormValidation.ts +93 -0
  132. package/composables/useLabeledFormElement.ts +10 -2
  133. package/composables/useLabeledSelect.ts +60 -0
  134. package/composables/useUserRetentionValidation.ts +1 -49
  135. package/composables/useVeeValidateField.test.ts +159 -0
  136. package/composables/useVeeValidateField.ts +67 -0
  137. package/config/cookies.js +0 -1
  138. package/config/labels-annotations.js +1 -0
  139. package/config/pagination-table-headers.js +18 -1
  140. package/config/product/manager.js +82 -21
  141. package/config/query-params.js +1 -0
  142. package/config/router/routes.js +6 -8
  143. package/config/table-headers.js +20 -1
  144. package/config/types.js +2 -1
  145. package/core/__tests__/plugin-products.test.ts +1505 -30
  146. package/core/plugin-products-base.ts +137 -20
  147. package/core/plugin-products-helpers.ts +5 -4
  148. package/core/plugin-products.ts +4 -0
  149. package/core/plugin-types.ts +129 -4
  150. package/core/plugin.ts +15 -7
  151. package/core/productDebugger.js +9 -4
  152. package/core/types-provisioning.ts +43 -30
  153. package/core/types.ts +58 -19
  154. package/detail/__tests__/management.cattle.io.fleetworkspace.test.ts +128 -0
  155. package/detail/__tests__/pod.test.ts +41 -0
  156. package/detail/harvesterhci.io.management.cluster.vue +6 -2
  157. package/detail/management.cattle.io.fleetworkspace.vue +49 -0
  158. package/detail/pod.vue +1 -1
  159. package/detail/provisioning.cattle.io.cluster.vue +4 -10
  160. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +9 -0
  161. package/edit/__tests__/kontainerDriver.test.ts +0 -13
  162. package/edit/__tests__/nodeDriver.test.ts +5 -11
  163. package/edit/__tests__/resources.cattle.io.restore.test.ts +9 -0
  164. package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/General.test.ts.snap +6 -0
  165. package/edit/auth/__tests__/azuread.test.ts +217 -34
  166. package/edit/auth/__tests__/oidc.test.ts +54 -0
  167. package/edit/auth/azuread.vue +123 -15
  168. package/edit/auth/oidc.vue +10 -2
  169. package/edit/kontainerDriver.vue +1 -2
  170. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +13 -4
  171. package/edit/networking.k8s.io.ingress/RulePath.vue +8 -4
  172. package/edit/networking.k8s.io.ingress/index.vue +75 -20
  173. package/edit/nodeDriver.vue +0 -2
  174. package/edit/provisioning.cattle.io.cluster/AgentEnv.vue +1 -0
  175. package/edit/provisioning.cattle.io.cluster/__tests__/AgentEnv.test.ts +25 -0
  176. package/edit/provisioning.cattle.io.cluster/__tests__/MachinePool.test.ts +104 -0
  177. package/edit/provisioning.cattle.io.cluster/index.vue +81 -106
  178. package/edit/provisioning.cattle.io.cluster/rke2.vue +8 -4
  179. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +11 -0
  180. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +37 -4
  181. package/edit/provisioning.cattle.io.cluster/tabs/registries/__tests__/RegistryConfigs.test.ts +132 -7
  182. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +2 -1
  183. package/edit/secret/__tests__/ssh.test.ts +5 -6
  184. package/edit/secret/basic.vue +31 -0
  185. package/edit/secret/index.vue +68 -17
  186. package/edit/secret/registry.vue +38 -0
  187. package/edit/secret/ssh.vue +29 -0
  188. package/edit/secret/tls.vue +30 -0
  189. package/edit/service.vue +4 -4
  190. package/edit/workload/Upgrading.vue +3 -3
  191. package/edit/workload/__tests__/Upgrading.test.ts +6 -9
  192. package/edit/workload/mixins/workload.js +2 -1
  193. package/initialize/App.vue +29 -2
  194. package/initialize/install-plugins.js +0 -2
  195. package/list/__tests__/management.cattle.io.feature.test.ts +105 -0
  196. package/list/catalog.cattle.io.app.vue +25 -5
  197. package/list/fleet.cattle.io.bundle.vue +7 -104
  198. package/list/fleet.cattle.io.clusterregistrationtoken.vue +20 -0
  199. package/list/management.cattle.io.feature.vue +1 -1
  200. package/list/management.cattle.io.fleetworkspace.vue +8 -0
  201. package/list/provisioning.cattle.io.cluster.vue +262 -180
  202. package/list/utils/management.cattle.io.cluster.utils.ts +128 -0
  203. package/machine-config/amazonec2.vue +1 -0
  204. package/mixins/__tests__/chart.test.ts +112 -0
  205. package/mixins/brand.js +2 -1
  206. package/mixins/chart.js +50 -15
  207. package/mixins/resource-fetch-api-pagination.js +41 -5
  208. package/models/__tests__/catalog.cattle.io.app.test.ts +15 -1
  209. package/models/__tests__/catalog.cattle.io.clusterrepo.test.ts +84 -0
  210. package/models/__tests__/chart.test.ts +99 -6
  211. package/models/__tests__/ext.cattle.io.kubeconfig.test.ts +67 -67
  212. package/models/__tests__/management.cattle.io.cluster.test.ts +1 -1
  213. package/models/__tests__/management.cattle.io.feature.test.ts +131 -0
  214. package/models/__tests__/management.cattle.io.node.ts +6 -5
  215. package/models/__tests__/management.cattle.io.nodepool.ts +5 -4
  216. package/models/__tests__/monitoring.coreos.com.alertmanagerconfig.test.ts +98 -0
  217. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +32 -11
  218. package/models/base-cluster.x-k8s.io.js +26 -0
  219. package/models/catalog.cattle.io.app.js +21 -17
  220. package/models/catalog.cattle.io.clusterrepo.js +39 -11
  221. package/models/chart.js +33 -19
  222. package/models/cluster.js +1 -1
  223. package/models/cluster.x-k8s.io.machine.js +4 -22
  224. package/models/cluster.x-k8s.io.machinedeployment.js +2 -20
  225. package/models/cluster.x-k8s.io.machineset.js +2 -20
  226. package/models/compliance.cattle.io.clusterscan.js +130 -2
  227. package/models/ext.cattle.io.kubeconfig.ts +4 -7
  228. package/models/fleet-application.js +4 -2
  229. package/models/fleet.cattle.io.bundle.js +1 -1
  230. package/models/kontainerdriver.js +11 -0
  231. package/models/management.cattle.io.authconfig.js +5 -1
  232. package/models/management.cattle.io.cluster.js +402 -78
  233. package/models/management.cattle.io.feature.js +3 -3
  234. package/models/management.cattle.io.kontainerdriver.js +1 -26
  235. package/models/management.cattle.io.node.js +6 -4
  236. package/models/management.cattle.io.nodepool.js +1 -1
  237. package/models/monitoring.coreos.com.alertmanagerconfig.js +31 -17
  238. package/models/networking.k8s.io.ingress.js +12 -4
  239. package/models/nodedriver.js +7 -0
  240. package/models/provisioning.cattle.io.cluster.js +47 -330
  241. package/models/rke.cattle.io.etcdsnapshot.js +1 -2
  242. package/package.json +20 -37
  243. package/pages/__tests__/readme.test.ts +49 -0
  244. package/pages/auth/setup.vue +2 -3
  245. package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +265 -0
  246. package/pages/c/_cluster/apps/charts/__tests__/index.test.ts +55 -0
  247. package/pages/c/_cluster/apps/charts/__tests__/install.test.ts +53 -0
  248. package/pages/c/_cluster/apps/charts/chart.vue +275 -39
  249. package/pages/c/_cluster/apps/charts/index.vue +2 -2
  250. package/pages/c/_cluster/apps/charts/install.vue +18 -10
  251. package/pages/c/_cluster/auth/user.retention/index.vue +55 -22
  252. package/pages/c/_cluster/explorer/__tests__/index.test.ts +23 -25
  253. package/pages/c/_cluster/explorer/index.vue +5 -49
  254. package/pages/c/_cluster/istio/__tests__/istio.index.test.ts +194 -0
  255. package/pages/c/_cluster/istio/index.vue +21 -6
  256. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +5 -7
  257. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +40 -2
  258. package/pages/c/_cluster/uiplugins/__tests__/PluginInfoPanel.test.ts +61 -0
  259. package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +735 -13
  260. package/pages/c/_cluster/uiplugins/index.vue +226 -222
  261. package/pages/diagnostic.vue +13 -17
  262. package/pages/fail-whale.vue +18 -0
  263. package/pages/home.vue +77 -260
  264. package/pages/readme.vue +88 -0
  265. package/plugins/dashboard-store/__tests__/resource-class.test.ts +88 -0
  266. package/plugins/dashboard-store/actions.js +40 -18
  267. package/plugins/dashboard-store/resource-class.js +5 -2
  268. package/plugins/steve/__tests__/subscribe.spec.ts +6 -3
  269. package/plugins/steve/steve-pagination-utils.ts +11 -3
  270. package/plugins/steve/subscribe.js +35 -5
  271. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +211 -1
  272. package/rancher-components/Form/LabeledInput/LabeledInput.vue +37 -4
  273. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +1 -1
  274. package/rancher-components/RcButton/RcButton.test.ts +37 -1
  275. package/rancher-components/RcButton/RcButton.vue +38 -8
  276. package/rancher-components/RcDropdown/RcDropdownTrigger.vue +10 -8
  277. package/scripts/test-plugins-build.sh +5 -2
  278. package/server/server-middleware.js +2 -2
  279. package/static/humans.txt +1 -0
  280. package/static/robots.txt +34 -0
  281. package/static/welcome-cow.svg +18 -0
  282. package/store/__tests__/catalog.test.ts +276 -12
  283. package/store/__tests__/type-map.test.ts +556 -1
  284. package/store/action-menu.js +8 -3
  285. package/store/auth.js +1 -4
  286. package/store/aws.js +27 -16
  287. package/store/catalog.js +87 -11
  288. package/store/digitalocean.js +20 -38
  289. package/store/index.js +2 -0
  290. package/store/linode.js +25 -40
  291. package/store/pnap.js +1 -0
  292. package/store/type-map.js +111 -29
  293. package/tsconfig.paths.json +8 -8
  294. package/types/kube/kube-api.ts +14 -1
  295. package/types/rancher/steve.api.ts +12 -12
  296. package/types/resources/settings.d.ts +2 -1
  297. package/types/shell/index.d.ts +128 -24
  298. package/types/store/dashboard-store.types.ts +108 -11
  299. package/types/store/pagination.types.ts +6 -3
  300. package/utils/__tests__/alertmanagerconfig.test.ts +117 -0
  301. package/utils/__tests__/async.test.ts +87 -0
  302. package/utils/__tests__/aws.test.ts +140 -0
  303. package/utils/__tests__/banners.test.ts +176 -0
  304. package/utils/__tests__/chart.test.ts +64 -1
  305. package/utils/__tests__/color.test.ts +226 -0
  306. package/utils/__tests__/duration.test.ts +140 -0
  307. package/utils/__tests__/fleet.test.ts +340 -0
  308. package/utils/__tests__/git.test.ts +270 -0
  309. package/utils/__tests__/inactivity.test.ts +316 -0
  310. package/utils/__tests__/ingress.test.ts +553 -0
  311. package/utils/__tests__/kube.test.ts +68 -0
  312. package/utils/__tests__/namespace-filter.test.ts +109 -0
  313. package/utils/__tests__/object.test.ts +77 -0
  314. package/utils/__tests__/pagination-utils.test.ts +361 -0
  315. package/utils/__tests__/parse-externalid.test.ts +137 -0
  316. package/utils/__tests__/perf-setting.utils.test.ts +98 -0
  317. package/utils/__tests__/poller-sequential.test.ts +177 -0
  318. package/utils/__tests__/poller.test.ts +170 -0
  319. package/utils/__tests__/promise.test.ts +346 -0
  320. package/utils/__tests__/settings.test.ts +140 -0
  321. package/utils/__tests__/sort-utils.test.ts +301 -0
  322. package/utils/__tests__/string-utils.test.ts +798 -0
  323. package/utils/__tests__/string.test.ts +23 -1
  324. package/utils/__tests__/style.test.ts +154 -0
  325. package/utils/__tests__/svg-filter.test.ts +184 -0
  326. package/utils/__tests__/time.test.ts +14 -1
  327. package/utils/__tests__/units.test.ts +417 -0
  328. package/utils/__tests__/url.test.ts +246 -0
  329. package/utils/__tests__/versions.test.ts +128 -0
  330. package/utils/__tests__/xccdf.test.ts +391 -0
  331. package/utils/chart.js +36 -0
  332. package/utils/fleet.ts +13 -3
  333. package/utils/gatekeeper/__tests__/util.test.ts +174 -0
  334. package/utils/gc/__tests__/gc-interval.test.ts +119 -0
  335. package/utils/gc/__tests__/gc-root-store.test.ts +225 -0
  336. package/utils/gc/__tests__/gc-route-changed.test.ts +96 -0
  337. package/utils/gc/__tests__/gc.test.ts +487 -0
  338. package/utils/ingress.ts +9 -1
  339. package/utils/object.js +33 -2
  340. package/utils/pagination-utils.ts +2 -1
  341. package/utils/string.js +25 -2
  342. package/utils/time.ts +5 -0
  343. package/utils/uiplugins.ts +5 -5
  344. package/utils/validators/__tests__/cluster-name.test.ts +110 -0
  345. package/utils/validators/__tests__/cron-schedule.test.ts +79 -0
  346. package/utils/validators/__tests__/index.test.ts +481 -0
  347. package/utils/validators/__tests__/kubernetes-name.test.ts +163 -0
  348. package/utils/validators/__tests__/misc-validators.test.ts +246 -0
  349. package/utils/validators/__tests__/pod-affinity.test.ts +382 -0
  350. package/utils/validators/__tests__/prometheusrule.test.ts +211 -0
  351. package/utils/validators/__tests__/role-template.test.ts +149 -0
  352. package/utils/validators/__tests__/service.test.ts +283 -0
  353. package/utils/validators/__tests__/setting.test.js +32 -0
  354. package/utils/validators/formRules/__tests__/index.test.ts +50 -0
  355. package/utils/validators/formRules/index.ts +5 -5
  356. package/utils/validators/machine-pool.ts +1 -1
  357. package/utils/validators/setting.js +18 -3
  358. package/utils/xccdf.ts +418 -0
  359. package/vue.config.js +0 -9
  360. package/assets/fonts/lato/lato-v17-latin-700.woff +0 -0
  361. package/assets/fonts/lato/lato-v17-latin-700.woff2 +0 -0
  362. package/assets/fonts/lato/lato-v17-latin-regular.woff +0 -0
  363. package/assets/fonts/lato/lato-v17-latin-regular.woff2 +0 -0
  364. package/assets/images/providers/azuread-black.svg +0 -22
  365. package/assets/images/providers/azuread.svg +0 -25
  366. package/assets/images/vendor/azuread.svg +0 -18
  367. package/assets/styles/fonts/_dots.scss +0 -18
  368. package/components/EmberPage.vue +0 -622
  369. package/components/EmberPageView.vue +0 -39
  370. package/components/form/labeled-select-utils/labeled-select-pagination.ts +0 -116
  371. package/mixins/labeled-form-element.ts +0 -225
  372. package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -28
  373. package/pages/c/_cluster/manager/pages/_page.vue +0 -22
  374. package/pages/c/_cluster/mcapps/pages/_page.vue +0 -22
  375. package/plugins/ember-cookie.js +0 -17
  376. package/utils/ember-page.js +0 -30
@@ -1,22 +1,25 @@
1
- import { CATALOG, CLUSTER_BADGE } from '@shell/config/labels-annotations';
1
+ import { CATALOG, CLUSTER_BADGE, NODE_ARCHITECTURE } from '@shell/config/labels-annotations';
2
2
  import {
3
- NODE, FLEET, MANAGEMENT, CAPI, EXT
3
+ NODE, FLEET, MANAGEMENT, CAPI, EXT,
4
+ NORMAN,
5
+ HCI
4
6
  } from '@shell/config/types';
5
7
  import { insertAt, addObject, removeObject } from '@shell/utils/array';
6
8
  import { downloadFile } from '@shell/utils/download';
7
9
  import { parseSi } from '@shell/utils/units';
8
10
  import { parseColor, textColor } from '@shell/utils/color';
9
- import { addParams } from '@shell/utils/url';
10
- import { isEmpty } from '@shell/utils/object';
11
+ import { isEmpty, isEqual } from '@shell/utils/object';
11
12
  import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
12
13
  import { isHarvesterCluster } from '@shell/utils/cluster';
13
14
  import SteveModel from '@shell/plugins/steve/steve-class';
14
15
  import { LINUX, WINDOWS } from '@shell/store/catalog';
15
- import { KONTAINER_TO_DRIVER } from './management.cattle.io.kontainerdriver';
16
+ import { KEV1 } from './management.cattle.io.kontainerdriver';
16
17
  import { requireAsset } from '@shell/utils/require-asset';
17
18
  import { PINNED_CLUSTERS } from '@shell/store/prefs';
18
19
  import { copyTextToClipboard } from '@shell/utils/clipboard';
19
20
  import { isHostedProvider } from '@shell/utils/provider';
21
+ import { ucFirst } from '@shell/utils/string';
22
+ import { sortBy } from '@shell/utils/sort';
20
23
 
21
24
  const DEFAULT_BADGE_COLOR = '#707070';
22
25
 
@@ -57,6 +60,30 @@ export default class MgmtCluster extends SteveModel {
57
60
  return (schema?.collectionMethods || []).includes('POST');
58
61
  }
59
62
 
63
+ get availableActions() {
64
+ // If on the Cluster Management Cluster List use the provisioning cluster actions instead of the management cluster
65
+ // This resolution feels a bit hacky, however the alternative would be to create a table prop and lots of weird plumbing
66
+ // It's a small use case, so just doing a limited solution
67
+ const listLocation = this.provCluster?.listLocation || {};
68
+ const currentRoute = this.currentRoute();
69
+
70
+ // Compare params, but exclude cluster (could be a bad link which provides a specific cluster)
71
+ const { cluster: _1, ...lLProduct } = listLocation.params || {};
72
+ const { cluster: _2, ...cRParams } = currentRoute.params;
73
+ const paramsEqual = isEqual(lLProduct, cRParams);
74
+
75
+ const isClusterManagementListPage = listLocation?.name === currentRoute?.name && paramsEqual;
76
+
77
+ if (isClusterManagementListPage) {
78
+ return this.provCluster?.availableActions.map((action) => ({
79
+ ...action,
80
+ altResource: this.provCluster, // actions work by using the row's resource with the function name. this overrides that
81
+ }));
82
+ }
83
+
84
+ return super.availableActions;
85
+ }
86
+
60
87
  get _availableActions() {
61
88
  const out = super._availableActions;
62
89
 
@@ -98,75 +125,171 @@ export default class MgmtCluster extends SteveModel {
98
125
  }
99
126
 
100
127
  get provisioner() {
128
+ // Sometimes the driver will be empty (like unconnected custom rke2 clusters), so fall back on the new and improved status.provider
129
+ if (this.status?.provider) {
130
+ if (['gke', 'eks', 'aks', 'k3s'].includes(this.status.provider)) {
131
+ // Defensive coding. we're now using status.provider which uses lowercase for some distro's
132
+ // To support the old use case of upper case status.driver values make status.provider upper case...
133
+ return this.status.provider.toUpperCase();
134
+ }
135
+
136
+ return this.status.provider;
137
+ }
138
+
101
139
  // For imported K3s clusters, this.status.driver is 'k3s.'
102
- return this.status?.driver ? this.status.driver : 'imported';
140
+ if (this.status?.driver) {
141
+ return this.status.driver;
142
+ }
143
+
144
+ return 'imported';
103
145
  }
104
146
 
105
- get machineProvider() {
106
- const kind = this.machinePools?.[0]?.provider;
147
+ get provisionerDisplay() {
148
+ // Allow a model extension to override the display of the provisioner
149
+ if (this.customProvisionerHelper?.provisionerDisplay) {
150
+ return this.customProvisionerHelper?.provisionerDisplay(this);
151
+ }
152
+
153
+ let provisioner = this.provisioner?.toLowerCase();
107
154
 
108
- if ( kind ) {
109
- return kind.replace(/config$/i, '').toLowerCase();
110
- } else if ( this.spec?.internal ) {
111
- return 'local';
155
+ if (provisioner === 'rke.windows') {
156
+ provisioner = 'rkeWindows';
112
157
  }
113
158
 
114
- return null;
159
+ if (!this.$rootGetters['i18n/exists'](`cluster.provider.${ provisioner }`)) {
160
+ provisioner = 'other';
161
+ }
162
+
163
+ return this.$rootGetters['i18n/withFallback'](`cluster.provider."${ provisioner }"`, null, ucFirst(this.provisioner));
115
164
  }
116
165
 
117
- get providerForEmberParam() {
118
- // Ember wants one word called provider to tell what component to show, but has much indirect mapping to figure out what it is.
119
- let provider;
166
+ /**
167
+ * Get the custom provisioner helper for this model
168
+ */
169
+ get customProvisionerHelper() {
170
+ if (!this.provCluster) {
171
+ return null;
172
+ }
120
173
 
121
- // provisioner is status.driver
122
- const provisioner = KONTAINER_TO_DRIVER[(this.provisioner || '').toLowerCase()] || this.provisioner;
174
+ // Find the first model extension that says it can be used for this model
175
+ return this.modelExtensions.find((modelExt) => modelExt.useFor ? modelExt.useFor(this.provCluster) : false);
176
+ }
123
177
 
124
- if ( provisioner === 'rancherKubernetesEngine') {
125
- // Look for a cloud provider in one of the node templates
126
- if ( this.machinePools?.[0] ) {
127
- provider = this.machinePools[0]?.nodeTemplate?.spec?.driver || null;
128
- } else {
129
- provider = 'custom';
130
- }
131
- } else if ( this.driver ) {
132
- provider = this.driver;
133
- } else if ( provisioner && provisioner.endsWith('v2') ) {
134
- provider = provisioner;
178
+ get provider() {
179
+ return this.status?.provider;
180
+ }
181
+
182
+ get machineProvider() {
183
+ return this.status?.info.machineProvider;
184
+ }
185
+
186
+ get machineProviderDisplay() {
187
+ if (this.customProvisionerHelper?.machineProviderDisplay) {
188
+ return this.customProvisionerHelper?.machineProviderDisplay(this);
189
+ }
190
+
191
+ const provider = (this.machineProvider || '').toLowerCase();
192
+
193
+ if ( provider ) {
194
+ return this.$rootGetters['i18n/withFallback'](`cluster.provider."${ provider }"`, null, provider);
135
195
  } else {
136
- provider = 'import';
196
+ return this.$rootGetters['i18n/t']('generic.unknown');
137
197
  }
198
+ }
138
199
 
139
- return provider;
200
+ // Is the cluster a legacy (unsupported) KEV1 cluster?
201
+ get isKev1() {
202
+ return KEV1.includes(this.spec?.genericEngineConfig?.driverName);
140
203
  }
141
204
 
142
- get emberEditPath() {
143
- const provider = this.providerForEmberParam;
205
+ get isImported() {
206
+ const provider = this.status?.provider;
207
+ const driver = this.status?.driver;
144
208
 
145
- // Avoid passing falsy values as query parameters
146
- const qp = { };
209
+ // The main case
210
+ if (provider === 'k3s' || provider === 'rke2') {
211
+ return driver === provider;
212
+ }
213
+ // The 'waiting' case
214
+ if (!provider && (driver === 'k3s' || driver === 'rke2')) {
215
+ return true;
216
+ }
147
217
 
148
- if (provider) {
149
- qp['provider'] = provider;
218
+ // imported KEv2
219
+ // 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
220
+ if (this.isHostedKubernetesProvider && !!this.provCluster?.providerConfig?.imported) {
221
+ return true;
150
222
  }
151
223
 
152
- // Copied out of https://github.com/rancher/ui/blob/20f56dc54c4fc09b5f911e533cb751c13609adaf/app/models/cluster.js#L844
153
- if ( provider === 'import' && isEmpty(this.eksConfig) && isEmpty(this.gkeConfig) ) {
154
- qp.importProvider = 'other';
155
- } else if (
156
- (provider === 'amazoneks' && !isEmpty(this.eksConfig) ) ||
157
- (provider === 'gke' && !isEmpty(this.gkeConfig) )
158
- // || something for aks v2
159
- ) {
160
- qp.importProvider = KONTAINER_TO_DRIVER[provider];
224
+ return this.provisioner === 'imported';
225
+ }
226
+
227
+ get isCustom() {
228
+ if ( this.isRke2 ) {
229
+ return !(this.provCluster?.spec?.rkeConfig?.machinePools?.length);
161
230
  }
162
231
 
163
- const path = addParams(`/c/${ escape(this.id) }/edit`, qp);
232
+ return false;
233
+ }
234
+
235
+ get isImportedK3s() {
236
+ return this.isImported && this.isK3s;
237
+ }
164
238
 
165
- return path;
239
+ get isImportedRke2() {
240
+ return this.isImported && this.provider?.startsWith('rke2');
241
+ }
242
+
243
+ get isK3s() {
244
+ return this.status ? this.status.provider === 'k3s' : (this.kubernetesVersion || '').includes('k3s') ;
245
+ }
246
+
247
+ get isRke2() {
248
+ return !!this.provCluster?.isRke2;
249
+ }
250
+
251
+ // identify v2 provisioning clusters created using upstream capi infrastructure providers instead of rancher/machine
252
+ get isCapiHybrid() {
253
+ if (!this.isRke2) {
254
+ return false;
255
+ }
256
+
257
+ const machineReferences = (this.provCluster.spec?.rkeConfig?.machinePools || []).map((pool) => pool.machineConfigRef);
258
+
259
+ const capiMachines = machineReferences.find((r) => r?.apiVersion?.includes('cluster.x-k8s.io'));
260
+
261
+ return !!capiMachines;
262
+ }
263
+
264
+ get isHostedKubernetesProvider() {
265
+ const context = {
266
+ dispatch: this.$dispatch,
267
+ getters: this.$getters,
268
+ axios: this.$axios,
269
+ $extension: this.$extension,
270
+ t: (...args) => this.t.apply(this, args),
271
+ };
272
+
273
+ return isHostedProvider(context, this.provisioner);
274
+ }
275
+
276
+ get isPrivateHostedProvider() {
277
+ if (this.isHostedKubernetesProvider && this.provisioner) {
278
+ switch (this.provisioner.toLowerCase()) {
279
+ case 'gke':
280
+ return this.spec?.gkeConfig?.privateClusterConfig?.enablePrivateEndpoint;
281
+ case 'eks':
282
+ return this.spec?.eksConfig?.privateAccess;
283
+ case 'aks':
284
+ return this.spec?.aksConfig?.privateCluster;
285
+ }
286
+ }
287
+
288
+ return false;
166
289
  }
167
290
 
168
291
  get groupByLabel() {
169
- return this.$rootGetters['i18n/t']('resourceTable.groupLabel.notInAWorkspace');
292
+ return `Workspace: ${ this.spec.fleetWorkspaceName }`;
170
293
  }
171
294
 
172
295
  get isReady() {
@@ -191,10 +314,7 @@ export default class MgmtCluster extends SteveModel {
191
314
  }
192
315
 
193
316
  get kubernetesVersionRaw() {
194
- const fromStatus = this.status?.version?.gitVersion;
195
- const fromSpec = this.config?.kubernetesVersion;
196
-
197
- return fromStatus || fromSpec;
317
+ return this.statusInfo.kubernetesVersion;
198
318
  }
199
319
 
200
320
  get kubernetesVersion() {
@@ -214,7 +334,7 @@ export default class MgmtCluster extends SteveModel {
214
334
  }
215
335
 
216
336
  get providerOs() {
217
- if ( this.status?.provider.endsWith('.windows')) {
337
+ if ( this.provider?.endsWith('.windows')) {
218
338
  return 'windows';
219
339
  }
220
340
 
@@ -257,20 +377,8 @@ export default class MgmtCluster extends SteveModel {
257
377
  return isHarvesterCluster(this);
258
378
  }
259
379
 
260
- get isHostedKubernetesProvider() {
261
- const context = {
262
- dispatch: this.$dispatch,
263
- getters: this.$getters,
264
- axios: this.$axios,
265
- $extension: this.$extension,
266
- t: (...args) => this.t.apply(this, args),
267
- };
268
-
269
- return isHostedProvider(context, this.provisioner);
270
- }
271
-
272
380
  get providerLogo() {
273
- let provider = this.status?.provider || 'kubernetes';
381
+ let provider = this.provider || 'kubernetes';
274
382
 
275
383
  if (this.isHarvester) {
276
384
  provider = HARVESTER;
@@ -301,6 +409,136 @@ export default class MgmtCluster extends SteveModel {
301
409
  return this.providerLogo;
302
410
  }
303
411
 
412
+ get pools() {
413
+ const deployments = this.$rootGetters['management/all'](CAPI.MACHINE_DEPLOYMENT).filter((pool) => pool.spec?.clusterName === this.provClusterName);
414
+
415
+ if (!!deployments.length) {
416
+ return deployments;
417
+ }
418
+
419
+ return this.machinePools;
420
+ }
421
+
422
+ get desired() {
423
+ return this.pools.reduce((acc, pool) => acc + (pool.desired || 0), 0);
424
+ }
425
+
426
+ get pending() {
427
+ return this.pools.reduce((acc, pool) => acc + (pool.pending || 0), 0);
428
+ }
429
+
430
+ get outdated() {
431
+ return this.pools.reduce((acc, pool) => acc + (pool.outdated || 0), 0);
432
+ }
433
+
434
+ get ready() {
435
+ return this.pools.reduce((acc, pool) => acc + (pool.ready || 0), 0);
436
+ }
437
+
438
+ get stateParts() {
439
+ const out = [
440
+ {
441
+ label: 'Pending',
442
+ color: 'bg-info',
443
+ textColor: 'text-info',
444
+ value: this.pending,
445
+ sort: 1,
446
+ },
447
+ {
448
+ label: 'Outdated',
449
+ color: 'bg-warning',
450
+ textColor: 'text-warning',
451
+ value: this.outdated,
452
+ sort: 2,
453
+ },
454
+ {
455
+ label: 'Unavailable',
456
+ color: 'bg-error',
457
+ textColor: 'text-error',
458
+ value: this.unavailable,
459
+ sort: 3,
460
+ },
461
+ {
462
+ label: 'Ready',
463
+ color: 'bg-success',
464
+ textColor: 'text-success',
465
+ value: this.ready,
466
+ sort: 4,
467
+ },
468
+ ].filter((x) => x.value > 0);
469
+
470
+ return sortBy(out, 'sort:desc');
471
+ }
472
+
473
+ get nodes() {
474
+ return this.$getters['all'](MANAGEMENT.NODE).filter((node) => node.id.startsWith(this.id));
475
+ }
476
+
477
+ get nodesArchitecture() {
478
+ const obj = {};
479
+
480
+ this.nodes?.forEach((node) => {
481
+ if (!node.metadata?.state?.transitioning) {
482
+ const architecture = node.status?.nodeLabels?.[NODE_ARCHITECTURE];
483
+
484
+ const key = architecture || this.t('cluster.architecture.label.unknown');
485
+
486
+ obj[key] = (obj[key] || 0) + 1;
487
+ }
488
+ });
489
+
490
+ return obj;
491
+ }
492
+
493
+ get architecture() {
494
+ if (!this.statusInfo.arch) {
495
+ return { label: this.t('generic.provisioning') };
496
+ }
497
+ if (this.statusInfo.arch === 'mixed') {
498
+ return { label: this.t('cluster.architecture.label.mixed') };
499
+ }
500
+
501
+ return { label: this.statusInfo.arch };
502
+ }
503
+
504
+ get machines() {
505
+ return this.$rootGetters['management/all'](CAPI.MACHINE).filter((machine) => {
506
+ if ( machine.metadata?.namespace !== this.provClusterNamespace ) {
507
+ return false;
508
+ }
509
+
510
+ return machine.spec?.clusterName === this.provClusterName;
511
+ });
512
+ }
513
+
514
+ get unavailable() {
515
+ return this.pools.reduce((acc, pool) => acc + (pool.unavailable || 0), 0);
516
+ }
517
+
518
+ get unavailableMachines() {
519
+ if (this.isReady) {
520
+ const names = this.machines.filter((machine) => {
521
+ return machine.status?.conditions?.find((c) => c.error && c.type === 'NodeHealthy');
522
+ }).map((machine) => {
523
+ if (machine.status?.nodeRef?.name) {
524
+ return this.t('cluster.availabilityWarnings.node', { name: machine.status.nodeRef.name });
525
+ }
526
+
527
+ return this.t('cluster.availabilityWarnings.machine', { name: machine.metadata.name });
528
+ });
529
+
530
+ return names.join('<br>');
531
+ }
532
+
533
+ return '';
534
+ }
535
+
536
+ // nodeGroups can be undefined for an EKS cluster that has just been created and has not
537
+ // had any node groups added to it
538
+ get eksNodeGroups() {
539
+ return this.spec?.eksConfig?.nodeGroups || [];
540
+ }
541
+
304
542
  // Color to use as the underline for the icon in the app bar
305
543
  get iconColor() {
306
544
  return this.metadata?.annotations?.[CLUSTER_BADGE.COLOR];
@@ -354,8 +592,8 @@ export default class MgmtCluster extends SteveModel {
354
592
  }
355
593
 
356
594
  get availableCpu() {
357
- const reserved = parseSi(this.status.requested?.cpu);
358
- const allocatable = parseSi(this.status.allocatable?.cpu);
595
+ const reserved = parseSi(this.status?.requested?.cpu);
596
+ const allocatable = parseSi(this.status?.allocatable?.cpu);
359
597
 
360
598
  if ( allocatable > 0 && reserved >= 0 ) {
361
599
  return Math.max(0, allocatable - reserved);
@@ -365,8 +603,8 @@ export default class MgmtCluster extends SteveModel {
365
603
  }
366
604
 
367
605
  get availableMemory() {
368
- const reserved = parseSi(this.status.requested?.memory);
369
- const allocatable = parseSi(this.status.allocatable?.memory);
606
+ const reserved = parseSi(this.status?.requested?.memory);
607
+ const allocatable = parseSi(this.status?.allocatable?.memory);
370
608
 
371
609
  if ( allocatable > 0 && reserved >= 0 ) {
372
610
  return Math.max(0, allocatable - reserved);
@@ -450,17 +688,23 @@ export default class MgmtCluster extends SteveModel {
450
688
  }, initialAggregation);
451
689
  }
452
690
 
453
- get nodes() {
454
- return this.$getters['all'](MANAGEMENT.NODE).filter((node) => node.id.startsWith(this.id));
691
+ get normanCluster() {
692
+ return this.$rootGetters['rancher/byId'](NORMAN.CLUSTER, this.id);
693
+ }
694
+
695
+ async findNormanCluster() {
696
+ return await this.$dispatch('rancher/find', { type: NORMAN.CLUSTER, id: this.id }, { root: true });
697
+ }
698
+
699
+ get provCluster() {
700
+ return this.$rootGetters['management/byId'](CAPI.RANCHER_CLUSTER, this.provClusterId);
455
701
  }
456
702
 
457
703
  get provClusterId() {
458
- const isRKE1 = !!this.spec?.rancherKubernetesEngineConfig;
459
- // Note: RKE1 provisioning cluster IDs are in a different format. For example,
460
- // RKE2 cluster IDs include the name - fleet-default/cluster-name - whereas an RKE1
461
- // cluster has the less human readable management cluster ID in it: fleet-default/c-khk48
704
+ // Note - there's also status.info.provisioningClusterReg, which is a link to the lifecycle owning type
705
+ // for v2prov this would be a provisioning.cattle.io.cluster, but for others it wouldn't be.
462
706
 
463
- const verb = this.isLocal || isRKE1 || this.isHostedKubernetesProvider ? 'to' : 'from';
707
+ const verb = this.isLocal || this.isHostedKubernetesProvider ? 'to' : 'from';
464
708
  const res = findRelationship(verb, CAPI.RANCHER_CLUSTER, this.metadata?.relationships);
465
709
 
466
710
  if (res) {
@@ -470,6 +714,20 @@ export default class MgmtCluster extends SteveModel {
470
714
  return findRelationship(verb === 'to' ? 'from' : 'to', CAPI.RANCHER_CLUSTER, this.metadata?.relationships);
471
715
  }
472
716
 
717
+ get provClusterNamespace() {
718
+ // Could consider using `metadata.annotations."objectset.rio.cattle.io/owner-namespace"` instead of provClusterId from resource rels
719
+ const [namespace] = this.provClusterId?.split('/') || [];
720
+
721
+ return namespace;
722
+ }
723
+
724
+ get provClusterName() {
725
+ // Could consider using `metadata.annotations."objectset.rio.cattle.io/owner-name"` instead of provClusterId from resource rels
726
+ const [, name] = this.provClusterId?.split('/') || [];
727
+
728
+ return name;
729
+ }
730
+
473
731
  get pinned() {
474
732
  return this.$rootGetters['prefs/get'](PINNED_CLUSTERS).includes(this.id);
475
733
  }
@@ -489,4 +747,70 @@ export default class MgmtCluster extends SteveModel {
489
747
 
490
748
  this.$dispatch('prefs/set', { key: PINNED_CLUSTERS, value: types }, { root: true });
491
749
  }
750
+
751
+ get canExplore() {
752
+ return this.isReady && !this.hasError;
753
+ }
754
+
755
+ get hasError() {
756
+ // TODO: kinara - this was copied over from prov cluster. prov conditions vs mgmt conditions
757
+ // Before we were just checking for this.status?.conditions?.some((condition) => condition.error === true)
758
+ // but this is wrong as an error might exist but it might not be meaningful in the context of readiness of a cluster
759
+ // which is what this 'hasError' is used for.
760
+ // We now check if there's a ready condition after an error, which helps dictate the readiness of a cluster
761
+ // Based on the findings in https://github.com/rancher/dashboard/issues/10043
762
+ if (this.status?.conditions && this.status?.conditions.length) {
763
+ // if there are errors, we compare with how recent the "Ready" condition is compared to that error, otherwise we just move on
764
+ if (this.status?.conditions.some((c) => c.error === true)) {
765
+ // there's no ready condition and has an error, mark it
766
+ if (!this.status?.conditions.some((c) => c.type === 'Ready')) {
767
+ return true;
768
+ }
769
+
770
+ const filteredConditions = this.status?.conditions.filter((c) => c.error === true || c.type === 'Ready');
771
+ const mostRecentCondition = filteredConditions.reduce((a, b) => ((a.lastUpdateTime > b.lastUpdateTime) ? a : b));
772
+
773
+ return mostRecentCondition.error;
774
+ }
775
+ }
776
+
777
+ return false;
778
+ }
779
+
780
+ get isAutoscalerEnabled() {
781
+ if (!this.provCluster) {
782
+ return false;
783
+ }
784
+
785
+ return !!this.provCluster.spec?.rkeConfig?.machinePools?.some((pool) => {
786
+ return typeof pool.autoscalingMinSize !== 'undefined' || typeof pool.autoscalingMaxSize !== 'undefined';
787
+ });
788
+ }
789
+
790
+ _statusInfoWarned = false;
791
+ get statusInfo() {
792
+ if (!this.status.info) {
793
+ if (!this._statusInfoWarned) {
794
+ this._statusInfoWarned = true;
795
+ // eslint-disable-next-line no-console
796
+ console.warn(`management.cattle.io.cluster '${ this.id }' is missing 'status.info'. This could mean the resource is troubled, or an extension has brought in this new model which is used in an older rancher`);
797
+ }
798
+
799
+ return { };
800
+ }
801
+
802
+ return this.status.info;
803
+ }
804
+
805
+ async goToHarvesterCluster() {
806
+ const harvesterCluster = await this.$dispatch('create', {
807
+ ...this.provCluster,
808
+ type: HCI.CLUSTER
809
+ });
810
+
811
+ try {
812
+ await harvesterCluster.goToCluster();
813
+ } catch {
814
+ }
815
+ }
492
816
  }
@@ -8,7 +8,7 @@ export default class Feature extends HybridModel {
8
8
 
9
9
  get enabled() {
10
10
  // If lockedValue is not null, then this is the value that the flag is locked to, so that should be used
11
- if (this.status.lockedValue !== null) {
11
+ if (this.status && this.status.lockedValue !== null) {
12
12
  return this.status.lockedValue;
13
13
  }
14
14
 
@@ -17,7 +17,7 @@ export default class Feature extends HybridModel {
17
17
  }
18
18
 
19
19
  get restartRequired() {
20
- return !this.status.dynamic;
20
+ return !this.status?.dynamic;
21
21
  }
22
22
 
23
23
  get canYaml() {
@@ -43,7 +43,7 @@ export default class Feature extends HybridModel {
43
43
  // User can not disable or enable if the feature flag is locked
44
44
  // Note: lockedValue is the value that the feature flag is locked to, so it can be true or false
45
45
  // It can also be null, which indicates that the feature flag is not locked
46
- enableAction.enabled = enableAction.enabled && (this.status.lockedValue === null);
46
+ enableAction.enabled = enableAction.enabled && (this.status && this.status.lockedValue === null);
47
47
 
48
48
  out.unshift(enableAction);
49
49
 
@@ -2,10 +2,9 @@ import HybridModel from '@shell/plugins/steve/hybrid-class';
2
2
 
3
3
  const HIDDEN = ['rke', 'rancherkubernetesengine'];
4
4
 
5
- const V2 = ['amazoneks', 'googlegke', 'azureaks'];
6
5
  const IMPORTABLE = ['amazoneks', 'googlegke', 'azureaks'];
7
6
 
8
- // The Ember create page has short names that don't match the full kontainer driver
7
+ // Short names that map from the full kontainer driver name
9
8
  export const KONTAINER_TO_DRIVER = {
10
9
  amazonelasticcontainerservice: 'amazoneks',
11
10
  azurekubernetesservice: 'azureaks',
@@ -36,14 +35,6 @@ export const KEV1 = [
36
35
  'googlekubernetesengine',
37
36
  ];
38
37
 
39
- // And the Import page has even shorter ones that don't match kontainer or create...
40
- export const DRIVER_TO_IMPORT = {
41
- googlegke: 'gke',
42
- amazoneks: 'eks',
43
- azureaks: 'aks',
44
- alibaba: 'alibabacloud'
45
- };
46
-
47
38
  export default class KontainerDriver extends HybridModel {
48
39
  get showCreate() {
49
40
  if ( HIDDEN.includes(this.driverName) ) {
@@ -57,22 +48,6 @@ export default class KontainerDriver extends HybridModel {
57
48
  return this.showCreate && IMPORTABLE.includes(this.driverName);
58
49
  }
59
50
 
60
- get emberCreatePath() {
61
- let driver = this.driverName;
62
-
63
- if ( V2.includes(driver) && !driver.endsWith('v2') ) {
64
- driver += 'v2';
65
- }
66
-
67
- return `/g/clusters/add/launch/${ driver }`;
68
- }
69
-
70
- get emberImportPath() {
71
- const provider = DRIVER_TO_IMPORT[this.driverName] || this.driverName;
72
-
73
- return `/g/clusters/add/launch/import?importProvider=${ provider }`;
74
- }
75
-
76
51
  get driverName() {
77
52
  if (!this.spec.builtIn) {
78
53
  // if the driver is not built in, there's a good change its a custom one