@rancher/shell 0.5.3 → 2.0.0

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 (581) hide show
  1. package/assets/data/aws-regions.json +9 -0
  2. package/assets/images/vendor/openid.svg +18 -0
  3. package/assets/styles/app.scss +1 -2
  4. package/assets/styles/fonts/_icons.scss +3 -3
  5. package/assets/styles/global/_columns.scss +1 -1
  6. package/assets/styles/global/_labeled-input.scss +2 -0
  7. package/assets/styles/themes/_csp.scss +2 -2
  8. package/assets/styles/themes/_dark.scss +8 -2
  9. package/assets/styles/themes/_light.scss +2 -1
  10. package/assets/styles/themes/_suse.scss +1 -1
  11. package/assets/styles/vendor/vue-select.scss +5 -0
  12. package/assets/translations/en-us.yaml +296 -58
  13. package/assets/translations/zh-hans.yaml +5 -27
  14. package/babel.config.js +1 -1
  15. package/chart/__tests__/S3.test.ts +9 -2
  16. package/chart/monitoring/grafana/index.vue +6 -2
  17. package/chart/monitoring/prometheus/index.vue +2 -2
  18. package/chart/rancher-backup/S3.vue +11 -9
  19. package/chart/rancher-backup/index.vue +15 -5
  20. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  21. package/cloud-credential/generic.vue +18 -9
  22. package/cloud-credential/harvester.vue +11 -3
  23. package/components/AppModal.vue +167 -0
  24. package/components/AssignTo.vue +7 -4
  25. package/components/AsyncButton.vue +18 -5
  26. package/components/BackLink.vue +4 -4
  27. package/components/BannerGraphic.vue +1 -0
  28. package/components/BrandImage.vue +47 -1
  29. package/components/Carousel.vue +14 -8
  30. package/components/Certificates.vue +8 -11
  31. package/components/ClusterBadge.vue +12 -3
  32. package/components/ClusterIconMenu.vue +44 -16
  33. package/components/ClusterProviderIcon.vue +14 -3
  34. package/components/CodeMirror.vue +73 -38
  35. package/components/CommunityLinks.vue +12 -8
  36. package/components/CreateDriver.vue +81 -0
  37. package/components/CruResource.vue +51 -27
  38. package/components/DetailTop.vue +2 -2
  39. package/components/Dialog.vue +6 -5
  40. package/components/DisableAuthProviderModal.vue +14 -8
  41. package/components/DraggableZone.vue +2 -2
  42. package/components/ExplorerMembers.vue +3 -3
  43. package/components/ExplorerProjectsNamespaces.vue +6 -6
  44. package/components/FixedBanner.vue +47 -36
  45. package/components/GlobalRoleBindings.vue +26 -0
  46. package/components/Import.vue +10 -6
  47. package/components/Inactivity.vue +1 -5
  48. package/components/KeyValueView.vue +14 -10
  49. package/components/MessageLink.vue +2 -2
  50. package/components/ModalWithCard.vue +5 -8
  51. package/components/MoveModal.vue +35 -33
  52. package/components/PodSecurityAdmission.vue +3 -3
  53. package/components/PromptChangePassword.vue +33 -33
  54. package/components/PromptModal.vue +11 -21
  55. package/components/PromptRemove.vue +11 -17
  56. package/components/PromptRestore.vue +18 -16
  57. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  58. package/components/Questions/__tests__/Float.test.ts +9 -19
  59. package/components/Questions/__tests__/Int.test.ts +9 -19
  60. package/components/Questions/__tests__/String.test.ts +9 -19
  61. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  62. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  63. package/components/Questions/index.vue +18 -2
  64. package/components/ResourceCancelModal.vue +34 -29
  65. package/components/ResourceDetail/Masthead.vue +23 -7
  66. package/components/ResourceDetail/index.vue +5 -0
  67. package/components/ResourceList/Masthead.vue +28 -10
  68. package/components/ResourceList/index.vue +65 -14
  69. package/components/ResourceTable.vue +73 -19
  70. package/components/ResourceYaml.vue +1 -0
  71. package/components/SelectIconGrid.vue +3 -3
  72. package/components/SideNav.vue +15 -37
  73. package/components/SingleClusterInfo.vue +4 -4
  74. package/components/SortableTable/THead.vue +26 -12
  75. package/components/SortableTable/filtering.js +9 -1
  76. package/components/SortableTable/grouping.js +8 -1
  77. package/components/SortableTable/index.vue +142 -42
  78. package/components/SortableTable/paging.js +36 -7
  79. package/components/SortableTable/selection.js +2 -1
  80. package/components/SortableTable/sorting.js +24 -7
  81. package/components/TabTitle.vue +84 -0
  82. package/components/Tabbed/index.vue +6 -1
  83. package/components/TableDataUserIcon.vue +47 -0
  84. package/components/TypeDescription.vue +1 -0
  85. package/components/Wizard.vue +1 -0
  86. package/components/__tests__/AppModal.test.ts +98 -0
  87. package/components/__tests__/AsyncButton.test.ts +1 -3
  88. package/components/__tests__/BackLink.test.ts +1 -1
  89. package/components/__tests__/ButtonGroup.test.ts +3 -6
  90. package/components/__tests__/Carousel.test.ts +43 -0
  91. package/components/__tests__/Certificates.test.ts +29 -0
  92. package/components/__tests__/{CodeMirror.spec.ts → CodeMirror.test.ts} +5 -17
  93. package/components/__tests__/CruResource.test.ts +10 -9
  94. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  95. package/components/__tests__/FixedBanner.test.ts +5 -20
  96. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  97. package/components/__tests__/TabTitle.test.ts +129 -0
  98. package/components/auth/AzureWarning.vue +2 -2
  99. package/components/auth/RoleDetailEdit.vue +10 -0
  100. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  101. package/components/auth/login/oidc.vue +7 -1
  102. package/components/fleet/FleetClusters.vue +9 -9
  103. package/components/fleet/FleetIntro.vue +11 -17
  104. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  105. package/components/fleet/FleetRepos.vue +1 -0
  106. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  107. package/components/form/ArrayList.vue +30 -19
  108. package/components/form/ArrayListSelect.vue +9 -4
  109. package/components/form/ClusterAppearance.vue +132 -0
  110. package/components/form/ColorInput.vue +1 -0
  111. package/components/form/Error.vue +3 -3
  112. package/components/form/Footer.vue +2 -2
  113. package/components/form/GitPicker.vue +83 -38
  114. package/components/form/KeyValue.vue +67 -48
  115. package/components/form/LabeledSelect.vue +143 -43
  116. package/components/form/Labels.vue +3 -1
  117. package/components/form/NameNsDescription.vue +26 -9
  118. package/components/form/ResourceLabeledSelect.vue +187 -0
  119. package/components/form/ResourceTabs/index.vue +31 -15
  120. package/components/form/SecretSelector.vue +93 -18
  121. package/components/form/Select.vue +1 -1
  122. package/components/form/SelectOrCreateAuthSecret.vue +135 -62
  123. package/components/form/SimpleSecretSelector.vue +88 -28
  124. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  125. package/components/form/__tests__/KeyValue.test.ts +121 -12
  126. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  127. package/components/form/__tests__/NameNsDescription.test.ts +25 -15
  128. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  129. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  130. package/components/formatter/AppSummaryGraph.vue +2 -2
  131. package/components/formatter/CloudCredPublicData.vue +30 -0
  132. package/components/formatter/ClusterLink.vue +2 -2
  133. package/components/formatter/FleetSummaryGraph.vue +2 -1
  134. package/components/formatter/ImagePercentageBar.vue +0 -4
  135. package/components/formatter/IngressTarget.vue +18 -7
  136. package/components/formatter/Link.vue +2 -2
  137. package/components/formatter/LinkDetail.vue +2 -2
  138. package/components/formatter/LinkDetailImage.vue +2 -2
  139. package/components/formatter/LinkName.vue +2 -2
  140. package/components/formatter/LiveDate.vue +16 -0
  141. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  142. package/components/formatter/SecretType.vue +2 -2
  143. package/components/formatter/VirtualServiceGateways.vue +2 -2
  144. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  145. package/components/nav/Group.vue +7 -5
  146. package/components/nav/Header.vue +82 -43
  147. package/components/nav/NamespaceFilter.vue +8 -1
  148. package/components/nav/TopLevelMenu.vue +336 -125
  149. package/components/nav/Type.vue +58 -102
  150. package/components/nav/__tests__/TopLevelMenu.test.ts +370 -9
  151. package/components/nav/__tests__/Type.test.ts +321 -126
  152. package/components/nuxt/nuxt-child.js +0 -5
  153. package/components/nuxt/nuxt-error.vue +1 -1
  154. package/components/nuxt/nuxt-link.client.js +13 -95
  155. package/components/templates/default.vue +3 -3
  156. package/components/templates/error.vue +6 -10
  157. package/components/templates/standalone.vue +0 -4
  158. package/components/templates/unauthenticated.vue +1 -2
  159. package/components/user.retention/user-retention-header.vue +34 -0
  160. package/composables/useCompactInput.test.ts +36 -0
  161. package/composables/useCompactInput.ts +2 -2
  162. package/composables/useI18n.ts +26 -0
  163. package/composables/useLabeledFormElement.test.ts +135 -0
  164. package/composables/useStore.ts +16 -0
  165. package/config/home-links.js +32 -1
  166. package/config/labels-annotations.js +2 -1
  167. package/config/middleware.js +0 -6
  168. package/config/pagination-table-headers.js +57 -0
  169. package/config/pod-security-admission.ts +1 -1
  170. package/config/private-label.js +1 -3
  171. package/config/product/auth.js +1 -0
  172. package/config/product/explorer.js +167 -46
  173. package/config/product/legacy.js +3 -95
  174. package/config/product/manager.js +44 -11
  175. package/config/query-params.js +1 -0
  176. package/config/roles.ts +23 -0
  177. package/config/router/index.js +23 -0
  178. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  179. package/config/router/navigation-guards/authentication.js +63 -0
  180. package/config/router/navigation-guards/index.js +15 -0
  181. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  182. package/config/router/routes.js +487 -0
  183. package/config/settings.ts +38 -2
  184. package/config/store.js +7 -3
  185. package/config/table-headers.js +46 -1
  186. package/config/types.js +36 -16
  187. package/config/uiplugins.js +10 -5
  188. package/core/plugin-helpers.js +1 -1
  189. package/core/plugin.ts +2 -1
  190. package/core/plugins.js +289 -282
  191. package/creators/app/files/.eslintignore +0 -2
  192. package/creators/app/files/.vscode/settings.json +0 -1
  193. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  194. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  195. package/creators/pkg/init +32 -0
  196. package/detail/__tests__/service.test.ts +62 -0
  197. package/detail/catalog.cattle.io.app.vue +1 -1
  198. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  199. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  200. package/detail/namespace.vue +2 -2
  201. package/detail/networking.k8s.io.ingress.vue +52 -19
  202. package/detail/node.vue +20 -43
  203. package/detail/pod.vue +1 -68
  204. package/detail/provisioning.cattle.io.cluster.vue +2 -1
  205. package/detail/service.vue +1 -1
  206. package/detail/workload/index.vue +2 -15
  207. package/dialog/AddCustomBadgeDialog.vue +318 -161
  208. package/dialog/DeactivateDriverDialog.vue +118 -0
  209. package/dialog/RollbackWorkloadDialog.vue +2 -2
  210. package/dialog/RotateCertificatesDialog.vue +0 -21
  211. package/directives/clean-html.js +15 -0
  212. package/directives/clean-tooltip.js +32 -0
  213. package/directives/focus.js +41 -0
  214. package/directives/int-number.js +21 -0
  215. package/directives/positive-int-number.js +19 -0
  216. package/directives/trim-whitespace.js +19 -0
  217. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  218. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  219. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  220. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  221. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  222. package/edit/__tests__/nodeDriver.test.ts +107 -0
  223. package/edit/__tests__/service.test.ts +1 -5
  224. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  225. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  226. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  227. package/edit/auth/__tests__/azuread.test.ts +241 -0
  228. package/edit/auth/__tests__/oidc.test.ts +137 -0
  229. package/edit/auth/azuread.vue +133 -31
  230. package/edit/auth/github.vue +5 -17
  231. package/edit/auth/googleoauth.vue +5 -18
  232. package/edit/auth/ldap/index.vue +5 -17
  233. package/edit/auth/oidc.vue +143 -42
  234. package/edit/auth/saml.vue +5 -14
  235. package/edit/catalog.cattle.io.clusterrepo.vue +175 -20
  236. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  237. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  238. package/edit/cloudcredential.vue +26 -4
  239. package/edit/configmap.vue +10 -4
  240. package/edit/fleet.cattle.io.gitrepo.vue +7 -4
  241. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  242. package/edit/kontainerDriver.vue +65 -0
  243. package/edit/logging-flow/Match.vue +10 -9
  244. package/edit/logging-flow/index.vue +4 -19
  245. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  246. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  247. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  248. package/edit/management.cattle.io.project.vue +2 -1
  249. package/edit/management.cattle.io.setting.vue +20 -0
  250. package/edit/management.cattle.io.user.vue +2 -1
  251. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  252. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  253. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +1 -0
  254. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +3 -0
  255. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +2 -0
  256. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  257. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  258. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  259. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  260. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  261. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  262. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +45 -6
  263. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/selectors.test.ts +1 -1
  264. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  265. package/edit/nodeDriver.vue +65 -0
  266. package/edit/persistentvolume/index.vue +2 -2
  267. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +18 -9
  268. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +165 -1
  269. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +1 -1
  270. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +0 -3
  271. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  272. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +70 -12
  273. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +5 -0
  274. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  275. package/edit/provisioning.cattle.io.cluster/index.vue +21 -15
  276. package/edit/provisioning.cattle.io.cluster/rke2.vue +185 -114
  277. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +67 -7
  278. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +19 -6
  279. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  280. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +7 -0
  281. package/edit/provisioning.cattle.io.cluster/tabs/etcd/S3Config.vue +1 -0
  282. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +1 -0
  283. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +3 -0
  284. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +1 -0
  285. package/edit/resources.cattle.io.backup.vue +139 -124
  286. package/edit/resources.cattle.io.restore.vue +146 -126
  287. package/edit/service.vue +1 -0
  288. package/edit/serviceaccount.vue +46 -4
  289. package/edit/workload/__tests__/Job.test.ts +1 -3
  290. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  291. package/edit/workload/mixins/workload.js +34 -1
  292. package/edit/workload/storage/emptyDir.vue +2 -2
  293. package/initialize/App.vue +75 -0
  294. package/initialize/app-extended.js +128 -0
  295. package/initialize/entry-helpers.js +549 -0
  296. package/initialize/entry.js +32 -0
  297. package/initialize/install-components.js +23 -0
  298. package/initialize/install-directives.js +59 -0
  299. package/initialize/install-plugins.js +123 -0
  300. package/list/__tests__/workload.test.ts +1 -1
  301. package/list/cis.cattle.io.clusterscan.vue +16 -10
  302. package/list/group.principal.vue +2 -2
  303. package/list/management.cattle.io.feature.vue +11 -7
  304. package/list/management.cattle.io.user.vue +36 -3
  305. package/list/networking.k8s.io.ingress.vue +36 -0
  306. package/list/node.vue +211 -73
  307. package/list/provisioning.cattle.io.cluster.vue +17 -4
  308. package/list/ui.cattle.io.navlink.vue +2 -2
  309. package/list/workload.vue +22 -0
  310. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  311. package/machine-config/__tests__/vmwarevsphere.test.ts +162 -59
  312. package/machine-config/amazonec2.vue +1 -1
  313. package/machine-config/azure.vue +38 -21
  314. package/machine-config/generic.vue +11 -15
  315. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  316. package/machine-config/vmwarevsphere.vue +20 -11
  317. package/middleware/authenticated.js +9 -361
  318. package/mixins/__tests__/chart.test.ts +48 -6
  319. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  320. package/mixins/auth-config.js +3 -2
  321. package/mixins/brand.js +75 -57
  322. package/mixins/chart.js +27 -13
  323. package/mixins/create-edit-view/index.js +2 -2
  324. package/mixins/fetch.client.js +42 -48
  325. package/mixins/labeled-form-element.ts +21 -1
  326. package/mixins/page-actions.js +7 -5
  327. package/mixins/resource-fetch-api-pagination.js +304 -0
  328. package/mixins/resource-fetch-namespaced.js +1 -1
  329. package/mixins/resource-fetch.js +46 -5
  330. package/models/__tests__/cluster.test.ts +44 -0
  331. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  332. package/models/__tests__/schema.tests.ts +24 -0
  333. package/models/__tests__/steve-schema.test.ts +73 -0
  334. package/models/__tests__/workload.test.ts +1 -1
  335. package/models/catalog.cattle.io.app.js +8 -0
  336. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  337. package/models/catalog.cattle.io.uiplugin.js +7 -8
  338. package/models/cis.cattle.io.clusterscan.js +29 -8
  339. package/models/cloudcredential.js +9 -1
  340. package/models/cluster/node.js +4 -0
  341. package/models/cluster/schema.js +6 -0
  342. package/models/cluster.js +33 -0
  343. package/models/driver.js +62 -0
  344. package/models/fleet.cattle.io.cluster.js +23 -11
  345. package/models/fleet.cattle.io.gitrepo.js +10 -0
  346. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  347. package/models/kontainerdriver.js +68 -0
  348. package/models/management/schema.js +6 -0
  349. package/models/management.cattle.io.authconfig.js +3 -2
  350. package/models/management.cattle.io.cluster.js +5 -4
  351. package/models/management.cattle.io.globalrole.js +2 -0
  352. package/models/management.cattle.io.user.js +67 -2
  353. package/models/monitoring.coreos.com.receiver.js +3 -1
  354. package/models/monitoring.coreos.com.route.js +1 -1
  355. package/models/networking.k8s.io.ingress.js +2 -1
  356. package/models/nodedriver.js +68 -0
  357. package/models/provisioning.cattle.io.cluster.js +34 -1
  358. package/models/schema.js +28 -7
  359. package/models/service.js +2 -0
  360. package/models/steve-schema.ts +254 -0
  361. package/models/workload.js +1 -0
  362. package/package.json +6 -5
  363. package/pages/about.vue +12 -5
  364. package/pages/account/index.vue +7 -2
  365. package/pages/auth/login.vue +106 -102
  366. package/pages/auth/logout.vue +2 -2
  367. package/pages/auth/setup.vue +57 -64
  368. package/pages/auth/verify.vue +17 -17
  369. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  370. package/pages/c/_cluster/apps/charts/index.vue +37 -13
  371. package/pages/c/_cluster/apps/charts/install.vue +4 -4
  372. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  373. package/pages/c/_cluster/auth/config/index.vue +15 -9
  374. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  375. package/pages/c/_cluster/auth/user.retention/index.vue +384 -0
  376. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  377. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  378. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  379. package/pages/c/_cluster/explorer/index.vue +231 -72
  380. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  381. package/pages/c/_cluster/explorer/tools/index.vue +12 -176
  382. package/pages/c/_cluster/fleet/index.vue +88 -93
  383. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  384. package/pages/c/_cluster/longhorn/index.vue +52 -17
  385. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  386. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  387. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  388. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +94 -0
  389. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  390. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  391. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +63 -0
  392. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  393. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  394. package/pages/c/_cluster/monitoring/index.vue +1 -17
  395. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  396. package/pages/c/_cluster/neuvector/index.vue +1 -0
  397. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  398. package/pages/c/_cluster/settings/banners.vue +86 -8
  399. package/pages/c/_cluster/settings/brand.vue +258 -36
  400. package/pages/c/_cluster/settings/index.vue +4 -4
  401. package/pages/c/_cluster/settings/links.vue +5 -3
  402. package/pages/c/_cluster/settings/performance.vue +71 -2
  403. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  404. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +10 -7
  405. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  406. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  407. package/pages/c/_cluster/uiplugins/InstallDialog.vue +53 -18
  408. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  409. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  410. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  411. package/pages/c/_cluster/uiplugins/index.vue +38 -52
  412. package/pages/diagnostic.vue +1 -0
  413. package/pages/fail-whale.vue +103 -41
  414. package/pages/home.vue +81 -24
  415. package/pages/prefs.vue +8 -3
  416. package/pages/support/index.vue +12 -2
  417. package/plugins/clean-html-directive.js +5 -12
  418. package/plugins/clean-tooltip-directive.js +6 -31
  419. package/plugins/codemirror.js +0 -9
  420. package/plugins/dashboard-store/__tests__/mutations.test.ts +296 -313
  421. package/plugins/dashboard-store/actions.js +140 -32
  422. package/plugins/dashboard-store/getters.js +86 -39
  423. package/plugins/dashboard-store/index.js +0 -99
  424. package/plugins/dashboard-store/mutations.js +150 -48
  425. package/plugins/dashboard-store/resource-class.js +14 -109
  426. package/plugins/directives.js +6 -39
  427. package/plugins/ember-cookie.js +13 -0
  428. package/plugins/global-formatters.js +26 -5
  429. package/plugins/i18n.js +90 -56
  430. package/plugins/int-number.js +6 -20
  431. package/plugins/plugin.js +3 -3
  432. package/plugins/positive-int-number.js +6 -17
  433. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +124 -31
  434. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  435. package/plugins/steve/__tests__/subscribe.spec.ts +109 -0
  436. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  437. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  438. package/plugins/steve/actions.js +0 -1
  439. package/plugins/steve/getters.js +183 -63
  440. package/plugins/steve/hybrid-class.js +5 -1
  441. package/plugins/steve/mutations.js +29 -5
  442. package/plugins/steve/norman-class.js +123 -2
  443. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  444. package/plugins/steve/schema.d.ts +22 -0
  445. package/plugins/steve/steve-pagination-utils.ts +368 -0
  446. package/plugins/steve/subscribe.js +37 -75
  447. package/plugins/trim-whitespace.js +6 -34
  448. package/plugins/vue-js-modal.js +1 -1
  449. package/public/index.html +1 -0
  450. package/rancher-components/Accordion/Accordion.vue +3 -2
  451. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  452. package/rancher-components/Banner/Banner.test.ts +1 -5
  453. package/rancher-components/Banner/Banner.vue +2 -2
  454. package/rancher-components/Card/Card.vue +4 -4
  455. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  456. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  457. package/rancher-components/Form/LabeledInput/LabeledInput.vue +66 -30
  458. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  459. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  460. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  461. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  462. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  463. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  464. package/rancher-components/StringList/StringList.vue +8 -8
  465. package/rancher-components/components/Accordion/Accordion.vue +3 -2
  466. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  467. package/rancher-components/components/Banner/Banner.test.ts +1 -5
  468. package/rancher-components/components/Banner/Banner.vue +2 -2
  469. package/rancher-components/components/Card/Card.vue +4 -4
  470. package/rancher-components/components/Form/Checkbox/Checkbox.vue +4 -3
  471. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  472. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +66 -30
  473. package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -3
  474. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  475. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  476. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  477. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  478. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  479. package/rancher-components/components/StringList/StringList.vue +8 -8
  480. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +27 -8
  481. package/scripts/clean +1 -1
  482. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  483. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  484. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  485. package/scripts/extension/helm/package/Dockerfile +1 -1
  486. package/scripts/extension/helm/scripts/patch +27 -0
  487. package/scripts/extension/publish +6 -6
  488. package/scripts/serve-pkgs +0 -2
  489. package/scripts/test-plugins-build.sh +6 -6
  490. package/scripts/vue-migrate.js +683 -0
  491. package/store/__tests__/catalog.test.ts +224 -0
  492. package/store/auth.js +23 -4
  493. package/store/aws.js +53 -6
  494. package/store/catalog.js +21 -5
  495. package/store/cru-resource.ts +26 -0
  496. package/store/customisation.js +35 -0
  497. package/store/features.js +6 -4
  498. package/store/index.js +132 -39
  499. package/store/plugins.js +8 -4
  500. package/store/type-map.js +143 -143
  501. package/store/type-map.utils.ts +226 -0
  502. package/tsconfig.json +0 -1
  503. package/tsconfig.paths.json +4 -1
  504. package/types/components/labeledSelect.ts +50 -0
  505. package/types/resources/settings.d.ts +32 -0
  506. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  507. package/types/shell/index.d.ts +996 -782
  508. package/types/store/dashboard-store.types.ts +42 -0
  509. package/types/store/pagination.types.ts +457 -0
  510. package/types/store/type-map.ts +30 -0
  511. package/types/store/vuex.d.ts +9 -0
  512. package/types/vue-shim.d.ts +51 -0
  513. package/utils/__tests__/cluster.test.ts +20 -18
  514. package/utils/__tests__/create-yaml.test.ts +359 -2
  515. package/utils/__tests__/kontainer.test.ts +92 -0
  516. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  517. package/utils/alertmanagerconfig.js +19 -0
  518. package/utils/array.ts +40 -1
  519. package/utils/async.ts +2 -0
  520. package/utils/auth.js +152 -4
  521. package/utils/axios.js +2 -2
  522. package/utils/banners.js +103 -0
  523. package/utils/cluster.js +1 -1
  524. package/utils/config.js +4 -0
  525. package/utils/create-yaml.js +54 -27
  526. package/utils/error.js +25 -0
  527. package/utils/formatter.js +5 -3
  528. package/utils/git.ts +1 -1
  529. package/utils/install-redirect.js +1 -1
  530. package/utils/kontainer.ts +186 -0
  531. package/utils/monitoring.js +2 -37
  532. package/utils/pagination-utils.ts +154 -0
  533. package/utils/pod-security-admission.ts +1 -1
  534. package/utils/router.js +86 -0
  535. package/utils/settings.ts +46 -0
  536. package/utils/socket.js +1 -0
  537. package/utils/time.js +1 -0
  538. package/utils/title.ts +3 -0
  539. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  540. package/utils/validators/formRules/__tests__/index.test.ts +21 -0
  541. package/utils/validators/formRules/index.ts +3 -0
  542. package/utils/validators/index.js +1 -0
  543. package/vue.config.js +376 -421
  544. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  545. package/chart/monitoring/steps/uninstall-v1.vue +0 -135
  546. package/components/EventsTable.vue +0 -67
  547. package/components/TabbedLinks/index.vue +0 -94
  548. package/components/nuxt/nuxt-link.server.js +0 -16
  549. package/components/nuxt/nuxt.js +0 -101
  550. package/config/router.js +0 -425
  551. package/initialize/App.js +0 -152
  552. package/initialize/client.js +0 -734
  553. package/initialize/index.js +0 -287
  554. package/middleware/i18n.js +0 -10
  555. package/middleware/unauthenticated.js +0 -22
  556. package/mixins/v1-workload-metrics.js +0 -43
  557. package/pages/c/_cluster/apps/index.vue +0 -15
  558. package/pages/c/_cluster/auth/index.vue +0 -17
  559. package/pages/c/_cluster/index.vue +0 -15
  560. package/pages/c/_cluster/legacy/index.vue +0 -22
  561. package/pages/c/_cluster/manager/index.vue +0 -22
  562. package/pages/c/_cluster/mcapps/index.vue +0 -21
  563. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  564. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  565. package/plugins/index.js +0 -11
  566. package/plugins/portal-vue.js +0 -4
  567. package/plugins/portal.js +0 -4
  568. package/plugins/resize.js +0 -5
  569. package/plugins/shortkey.js +0 -4
  570. package/plugins/tooltip.js +0 -4
  571. package/plugins/v-select.js +0 -4
  572. package/utils/group.js +0 -70
  573. package/utils/nuxt.js +0 -638
  574. package/utils/router.scrollBehavior.js +0 -78
  575. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  576. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  577. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  578. /package/plugins/steve/__tests__/{steve-class.spec.ts → steve-class.test.ts} +0 -0
  579. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  580. /package/rancher-components/components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  581. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
@@ -26,6 +26,7 @@ import {
26
26
  } from '@shell/utils/object';
27
27
  import { allHash } from '@shell/utils/promise';
28
28
  import { sortBy } from '@shell/utils/sort';
29
+ import { vspherePoolConfigMerge } from '@shell/machine-config/vmwarevsphere-pool-config-merge';
29
30
 
30
31
  import { compare, sortable } from '@shell/utils/version';
31
32
  import { isHarvesterSatisfiesVersion } from '@shell/utils/cluster';
@@ -43,7 +44,7 @@ import semver from 'semver';
43
44
 
44
45
  import { SETTING } from '@shell/config/settings';
45
46
  import { base64Encode } from '@shell/utils/crypto';
46
- import { CAPI as CAPI_ANNOTATIONS } from '@shell/config/labels-annotations';
47
+ import { CAPI as CAPI_ANNOTATIONS, CLUSTER_BADGE } from '@shell/config/labels-annotations';
47
48
  import AgentEnv from '@shell/edit/provisioning.cattle.io.cluster/AgentEnv';
48
49
  import Labels from '@shell/edit/provisioning.cattle.io.cluster/Labels';
49
50
  import MachinePool from '@shell/edit/provisioning.cattle.io.cluster/tabs/MachinePool';
@@ -60,11 +61,14 @@ import Upgrade from '@shell/edit/provisioning.cattle.io.cluster/tabs/upgrade';
60
61
  import Registries from '@shell/edit/provisioning.cattle.io.cluster/tabs/registries';
61
62
  import AddOnConfig from '@shell/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig';
62
63
  import Advanced from '@shell/edit/provisioning.cattle.io.cluster/tabs/Advanced';
64
+ import ClusterAppearance from '@shell/components/form/ClusterAppearance';
63
65
 
64
66
  const HARVESTER = 'harvester';
65
67
  const HARVESTER_CLOUD_PROVIDER = 'harvester-cloud-provider';
66
68
  const NETBIOS_TRUNCATION_LENGTH = 15;
67
69
 
70
+ const VMWARE_VSPHERE = 'vmwarevsphere';
71
+
68
72
  /**
69
73
  * Classes to be adopted by the node badges in Machine pools
70
74
  */
@@ -106,7 +110,8 @@ export default {
106
110
  Upgrade,
107
111
  Registries,
108
112
  AddOnConfig,
109
- Advanced
113
+ Advanced,
114
+ ClusterAppearance
110
115
  },
111
116
 
112
117
  mixins: [CreateEditView, FormValidation],
@@ -149,15 +154,15 @@ export default {
149
154
  },
150
155
 
151
156
  data() {
152
- if ( !this.value.spec.rkeConfig ) {
157
+ if (!this.value.spec.rkeConfig) {
153
158
  set(this.value.spec, 'rkeConfig', {});
154
159
  }
155
160
 
156
- if ( !this.value.spec.rkeConfig.chartValues ) {
161
+ if (!this.value.spec.rkeConfig.chartValues) {
157
162
  set(this.value.spec.rkeConfig, 'chartValues', {});
158
163
  }
159
164
 
160
- if ( !this.value.spec.rkeConfig.upgradeStrategy ) {
165
+ if (!this.value.spec.rkeConfig.upgradeStrategy) {
161
166
  set(this.value.spec.rkeConfig, 'upgradeStrategy', {
162
167
  controlPlaneConcurrency: '1',
163
168
  controlPlaneDrainOptions: {},
@@ -166,11 +171,19 @@ export default {
166
171
  });
167
172
  }
168
173
 
169
- if ( !this.value.spec.rkeConfig.machineGlobalConfig ) {
174
+ if (!this.value.spec.rkeConfig.dataDirectories) {
175
+ set(this.value.spec.rkeConfig, 'dataDirectories', {
176
+ systemAgent: '',
177
+ provisioning: '',
178
+ k8sDistro: '',
179
+ });
180
+ }
181
+
182
+ if (!this.value.spec.rkeConfig.machineGlobalConfig) {
170
183
  set(this.value.spec, 'rkeConfig.machineGlobalConfig', {});
171
184
  }
172
185
 
173
- if ( !this.value.spec.rkeConfig.machineSelectorConfig?.length ) {
186
+ if (!this.value.spec.rkeConfig.machineSelectorConfig?.length) {
174
187
  set(this.value.spec, 'rkeConfig.machineSelectorConfig', [{ config: {} }]);
175
188
  }
176
189
 
@@ -221,6 +234,15 @@ export default {
221
234
  },
222
235
 
223
236
  computed: {
237
+ clusterName() {
238
+ return this.value.metadata?.name || '';
239
+ },
240
+ showClusterAppearance() {
241
+ return this.mode === _CREATE;
242
+ },
243
+ clusterBadgeAbbreviation() {
244
+ return this.$store.getters['customisation/getPreviewCluster'];
245
+ },
224
246
  rkeConfig() {
225
247
  return this.value.spec.rkeConfig;
226
248
  },
@@ -251,11 +273,11 @@ export default {
251
273
  // If there are any other properties set, or multiple configs with no selector
252
274
  // show a warning that you're editing only part of the config in the UI.
253
275
 
254
- for ( const conf of this.value.spec?.rkeConfig?.machineSelectorConfig ) {
255
- if ( conf.machineLabelSelector ) {
276
+ for (const conf of this.value.spec?.rkeConfig?.machineSelectorConfig) {
277
+ if (conf.machineLabelSelector) {
256
278
  const keys = Object.keys(conf.config || {});
257
279
 
258
- if ( keys.length === 0 || (keys.length === 1 && keys[0] === 'kubelet-arg') ) {
280
+ if (keys.length === 0 || (keys.length === 1 && keys[0] === 'kubelet-arg')) {
259
281
  kubeletOnly++;
260
282
  } else {
261
283
  other++;
@@ -268,7 +290,7 @@ export default {
268
290
  // eslint-disable-next-line no-console
269
291
  console.log(`Global: ${ global }, Kubelet Only: ${ kubeletOnly }, Other: ${ other }`);
270
292
 
271
- return ( global > 1 || other > 0 );
293
+ return (global > 1 || other > 0);
272
294
  },
273
295
 
274
296
  versionOptions() {
@@ -291,26 +313,26 @@ export default {
291
313
  const showK3s = allValidK3sVersions.length && !existingRke2;
292
314
  const out = [];
293
315
 
294
- if ( showRke2 ) {
295
- if ( showK3s ) {
316
+ if (showRke2) {
317
+ if (showK3s) {
296
318
  out.push({ kind: 'group', label: this.t('cluster.provider.rke2') });
297
319
  }
298
320
 
299
321
  out.push(...allValidRke2Versions);
300
322
  }
301
323
 
302
- if ( showK3s ) {
303
- if ( showRke2 ) {
324
+ if (showK3s) {
325
+ if (showRke2) {
304
326
  out.push({ kind: 'group', label: this.t('cluster.provider.k3s') });
305
327
  }
306
328
 
307
329
  out.push(...allValidK3sVersions);
308
330
  }
309
331
 
310
- if ( cur ) {
332
+ if (cur) {
311
333
  const existing = out.find((x) => x.value === cur);
312
334
 
313
- if ( existing ) {
335
+ if (existing) {
314
336
  existing.disabled = false;
315
337
  }
316
338
  }
@@ -324,7 +346,7 @@ export default {
324
346
  selectedVersion() {
325
347
  const str = this.value.spec.kubernetesVersion;
326
348
 
327
- if ( !str ) {
349
+ if (!str) {
328
350
  return;
329
351
  }
330
352
 
@@ -363,7 +385,7 @@ export default {
363
385
  },
364
386
 
365
387
  needCredential() {
366
- if ( this.provider === 'custom' || this.provider === 'import' || this.isElementalCluster || this.mode === _VIEW || (this.providerConfig?.spec?.builtin === false && this.providerConfig?.spec?.addCloudCredential === false) ) {
388
+ if (this.provider === 'custom' || this.provider === 'import' || this.isElementalCluster || this.mode === _VIEW || (this.providerConfig?.spec?.builtin === false && this.providerConfig?.spec?.addCloudCredential === false)) {
367
389
  return false;
368
390
  }
369
391
 
@@ -382,7 +404,7 @@ export default {
382
404
  },
383
405
 
384
406
  hasMachinePools() {
385
- if ( this.provider === 'custom' || this.provider === 'import' ) {
407
+ if (this.provider === 'custom' || this.provider === 'import') {
386
408
  return false;
387
409
  }
388
410
 
@@ -423,7 +445,7 @@ export default {
423
445
  machineConfigSchema() {
424
446
  let schema;
425
447
 
426
- if ( !this.hasMachinePools ) {
448
+ if (!this.hasMachinePools) {
427
449
  return null;
428
450
  } else if (this.isElementalCluster) {
429
451
  schema = ELEMENTAL_SCHEMA_IDS.MACHINE_INV_SELECTOR_TEMPLATES;
@@ -457,53 +479,53 @@ export default {
457
479
  tooltip: {},
458
480
  };
459
481
 
460
- for ( const role of roles ) {
482
+ for (const role of roles) {
461
483
  counts[role] = 0;
462
484
  out.color[role] = NODE_TOTAL.success.color;
463
485
  out.icon[role] = NODE_TOTAL.success.icon;
464
486
  }
465
487
 
466
- for ( const row of this.machinePools || [] ) {
467
- if ( row.remove ) {
488
+ for (const row of this.machinePools || []) {
489
+ if (row.remove) {
468
490
  continue;
469
491
  }
470
492
 
471
493
  const qty = parseInt(row.pool.quantity, 10);
472
494
 
473
- if ( isNaN(qty) ) {
495
+ if (isNaN(qty)) {
474
496
  continue;
475
497
  }
476
498
 
477
- for ( const role of roles ) {
499
+ for (const role of roles) {
478
500
  counts[role] = counts[role] + (row.pool[`${ role }Role`] ? qty : 0);
479
501
  }
480
502
  }
481
503
 
482
- for ( const role of roles ) {
504
+ for (const role of roles) {
483
505
  out.label[role] = this.t(`cluster.machinePool.nodeTotals.label.${ role }`, { count: counts[role] });
484
506
  out.tooltip[role] = this.t(`cluster.machinePool.nodeTotals.tooltip.${ role }`, { count: counts[role] });
485
507
  }
486
508
 
487
- if ( counts.etcd === 0 ) {
509
+ if (counts.etcd === 0) {
488
510
  out.color.etcd = NODE_TOTAL.error.color;
489
511
  out.icon.etcd = NODE_TOTAL.error.icon;
490
- } else if ( counts.etcd === 1 || counts.etcd % 2 === 0 || counts.etcd > 7 ) {
512
+ } else if (counts.etcd === 1 || counts.etcd % 2 === 0 || counts.etcd > 7) {
491
513
  out.color.etcd = NODE_TOTAL.warning.color;
492
514
  out.icon.etcd = NODE_TOTAL.warning.icon;
493
515
  }
494
516
 
495
- if ( counts.controlPlane === 0 ) {
517
+ if (counts.controlPlane === 0) {
496
518
  out.color.controlPlane = NODE_TOTAL.error.color;
497
519
  out.icon.controlPlane = NODE_TOTAL.error.icon;
498
- } else if ( counts.controlPlane === 1 ) {
520
+ } else if (counts.controlPlane === 1) {
499
521
  out.color.controlPlane = NODE_TOTAL.warning.color;
500
522
  out.icon.controlPlane = NODE_TOTAL.warning.icon;
501
523
  }
502
524
 
503
- if ( counts.worker === 0 ) {
525
+ if (counts.worker === 0) {
504
526
  out.color.worker = NODE_TOTAL.error.color;
505
527
  out.icon.worker = NODE_TOTAL.error.icon;
506
- } else if ( counts.worker === 1 ) {
528
+ } else if (counts.worker === 1) {
507
529
  out.color.worker = NODE_TOTAL.warning.color;
508
530
  out.icon.worker = NODE_TOTAL.warning.icon;
509
531
  }
@@ -533,11 +555,11 @@ export default {
533
555
  }
534
556
 
535
557
  if (this.showCloudProvider) { // Shouldn't be removed such that changes to it will re-trigger this watch
536
- if ( this.agentConfig?.['cloud-provider-name'] === 'rancher-vsphere' ) {
558
+ if (this.agentConfig?.['cloud-provider-name'] === 'rancher-vsphere') {
537
559
  names.push('rancher-vsphere-cpi', 'rancher-vsphere-csi');
538
560
  }
539
561
 
540
- if ( this.agentConfig?.['cloud-provider-name'] === HARVESTER ) {
562
+ if (this.agentConfig?.['cloud-provider-name'] === HARVESTER) {
541
563
  names.push(HARVESTER_CLOUD_PROVIDER);
542
564
  }
543
565
  }
@@ -562,11 +584,11 @@ export default {
562
584
  value: '',
563
585
  }];
564
586
 
565
- if ( !!this.agentArgs['cloud-provider-name']?.options ) {
587
+ if (!!this.agentArgs['cloud-provider-name']?.options) {
566
588
  const preferred = this.$store.getters['plugins/cloudProviderForDriver'](this.provider);
567
589
 
568
- for ( const opt of this.agentArgs['cloud-provider-name']?.options ) {
569
- // If we don't have a preferred provider... show all options
590
+ for (const opt of this.agentArgs['cloud-provider-name']?.options) {
591
+ // If we don't have a preferred provider... show all options
570
592
  const showAllOptions = preferred === undefined;
571
593
  // If we have a preferred provider... only show default, preferred and external
572
594
  const isPreferred = opt === preferred;
@@ -589,7 +611,7 @@ export default {
589
611
 
590
612
  const cur = this.agentConfig?.['cloud-provider-name'];
591
613
 
592
- if ( cur && !out.find((x) => x.value === cur) ) {
614
+ if (cur && !out.find((x) => x.value === cur)) {
593
615
  out.unshift({ label: `${ cur } (Current)`, value: cur });
594
616
  }
595
617
 
@@ -623,7 +645,7 @@ export default {
623
645
  }
624
646
  }
625
647
 
626
- if ( !out ) {
648
+ if (!out) {
627
649
  out = preferred || first;
628
650
  }
629
651
 
@@ -631,7 +653,7 @@ export default {
631
653
  },
632
654
 
633
655
  appsOSWarning() {
634
- if (this.mode !== _EDIT ) {
656
+ if (this.mode !== _EDIT) {
635
657
  return null;
636
658
  }
637
659
  const { linuxWorkerCount, windowsWorkerCount } = this.value?.mgmt?.status || {};
@@ -698,12 +720,40 @@ export default {
698
720
 
699
721
  return validRequiredPools && base;
700
722
  },
723
+ currentCluster() {
724
+ if (this.mode === _EDIT) {
725
+ return { ...this.value };
726
+ } else {
727
+ return this.$store.getters['customisation/getPreviewCluster'];
728
+ }
729
+ }
701
730
  },
702
731
 
703
732
  watch: {
733
+ clusterBadgeAbbreviation: {
734
+ immediate: true,
735
+ handler(neu) {
736
+ if (!neu) {
737
+ return;
738
+ }
739
+
740
+ if (Object.keys(neu.badge).length <= 0) {
741
+ return { ...this.value };
742
+ }
743
+
744
+ const obj = {
745
+ [CLUSTER_BADGE.ICON_TEXT]: neu.badge.iconText, [CLUSTER_BADGE.COLOR]: neu.badge.color, [CLUSTER_BADGE.TEXT]: neu.badge.text
746
+ };
747
+
748
+ this.value.metadata.annotations = {
749
+ ...this.value.metadata.annotations,
750
+ ...obj
751
+ };
752
+ }
753
+ },
704
754
 
705
755
  credentialId(val) {
706
- if ( val ) {
756
+ if (val) {
707
757
  this.credential = this.$store.getters['rancher/byId'](NORMAN.CLOUD_CREDENTIAL, this.credentialId);
708
758
 
709
759
  if (this.isHarvesterDriver) {
@@ -718,7 +768,7 @@ export default {
718
768
 
719
769
  addonNames(neu, old) {
720
770
  // To catch the 'some addons' --> 'no addons' case also check array length (`difference([], [1,2,3]) === []`)
721
- const diff = old.length !== neu.length || difference(neu, old).length ;
771
+ const diff = old.length !== neu.length || difference(neu, old).length;
722
772
 
723
773
  if (diff) {
724
774
  // Allow time for addonNames to update... then fetch any missing addons
@@ -780,32 +830,32 @@ export default {
780
830
  * Initialize all the cluster specs
781
831
  */
782
832
  async initSpecs() {
783
- if ( !this.value.spec ) {
833
+ if (!this.value.spec) {
784
834
  set(this.value, 'spec', {});
785
835
  }
786
836
 
787
- if ( !this.value.spec.machineSelectorConfig ) {
837
+ if (!this.value.spec.machineSelectorConfig) {
788
838
  set(this.value.spec, 'machineSelectorConfig', []);
789
839
  }
790
840
 
791
- if ( !this.value.spec.machineSelectorConfig.find((x) => !x.machineLabelSelector) ) {
841
+ if (!this.value.spec.machineSelectorConfig.find((x) => !x.machineLabelSelector)) {
792
842
  this.value.spec.machineSelectorConfig.unshift({ config: {} });
793
843
  }
794
844
 
795
- if ( this.value.spec.cloudCredentialSecretName ) {
845
+ if (this.value.spec.cloudCredentialSecretName) {
796
846
  await this.$store.dispatch('rancher/findAll', { type: NORMAN.CLOUD_CREDENTIAL });
797
847
  this.credentialId = `${ this.value.spec.cloudCredentialSecretName }`;
798
848
  }
799
849
 
800
- if ( !this.value.spec.kubernetesVersion ) {
850
+ if (!this.value.spec.kubernetesVersion) {
801
851
  set(this.value.spec, 'kubernetesVersion', this.defaultVersion);
802
852
  }
803
853
 
804
- if ( this.rkeConfig.etcd?.s3?.bucket ) {
854
+ if (this.rkeConfig.etcd?.s3?.bucket) {
805
855
  this.s3Backup = true;
806
856
  }
807
857
 
808
- if ( !this.rkeConfig.etcd ) {
858
+ if (!this.rkeConfig.etcd) {
809
859
  set(this.rkeConfig, 'etcd', {
810
860
  disableSnapshots: false,
811
861
  s3: null,
@@ -824,14 +874,14 @@ export default {
824
874
  this.allNamespaces = await this.$store.dispatch('management/findAll', { type: NAMESPACE });
825
875
  }
826
876
 
827
- if ( !this.machinePools ) {
877
+ if (!this.machinePools) {
828
878
  await this.initMachinePools(this.value.spec.rkeConfig.machinePools);
829
- if ( this.mode === _CREATE && !this.machinePools.length ) {
879
+ if (this.mode === _CREATE && !this.machinePools.length) {
830
880
  await this.addMachinePool();
831
881
  }
832
882
  }
833
883
 
834
- if ( this.value.spec.defaultPodSecurityAdmissionConfigurationTemplateName === undefined ) {
884
+ if (this.value.spec.defaultPodSecurityAdmissionConfigurationTemplateName === undefined) {
835
885
  set(this.value.spec, 'defaultPodSecurityAdmissionConfigurationTemplateName', '');
836
886
  }
837
887
  },
@@ -840,7 +890,7 @@ export default {
840
890
  * Fetch RKE versions and their configurations to be mapped to the form
841
891
  */
842
892
  async fetchRke2Versions() {
843
- if ( !this.rke2Versions ) {
893
+ if (!this.rke2Versions) {
844
894
  const hash = {
845
895
  rke2Versions: this.$store.dispatch('management/request', { url: '/v1-rke2-release/releases' }),
846
896
  k3sVersions: this.$store.dispatch('management/request', { url: '/v1-k3s-release/releases' }),
@@ -886,7 +936,7 @@ export default {
886
936
  defaultK3s = k3sChannels.find((x) => x.id === 'default')?.latest;
887
937
  }
888
938
 
889
- if ( !this.rke2Versions.length && !this.k3sVersions.length ) {
939
+ if (!this.rke2Versions.length && !this.k3sVersions.length) {
890
940
  throw new Error('No version info found in KDM');
891
941
  }
892
942
 
@@ -938,12 +988,12 @@ export default {
938
988
  */
939
989
  setAgentConfiguration() {
940
990
  // Cluster Agent Configuration
941
- if ( !this.value.spec[CLUSTER_AGENT_CUSTOMIZATION]) {
991
+ if (!this.value.spec[CLUSTER_AGENT_CUSTOMIZATION]) {
942
992
  set(this.value.spec, CLUSTER_AGENT_CUSTOMIZATION, {});
943
993
  }
944
994
 
945
995
  // Fleet Agent Configuration
946
- if ( !this.value.spec[FLEET_AGENT_CUSTOMIZATION] ) {
996
+ if (!this.value.spec[FLEET_AGENT_CUSTOMIZATION]) {
947
997
  set(this.value.spec, FLEET_AGENT_CUSTOMIZATION, {});
948
998
  }
949
999
  },
@@ -968,8 +1018,8 @@ export default {
968
1018
  async initMachinePools(existing) {
969
1019
  const out = [];
970
1020
 
971
- if ( existing?.length ) {
972
- for ( const pool of existing ) {
1021
+ if (existing?.length) {
1022
+ for (const pool of existing) {
973
1023
  let type;
974
1024
 
975
1025
  if (this.isElementalCluster) {
@@ -981,7 +1031,7 @@ export default {
981
1031
  let config;
982
1032
  let configMissing = false;
983
1033
 
984
- if ( this.$store.getters['management/canList'](type) ) {
1034
+ if (this.$store.getters['management/canList'](type)) {
985
1035
  try {
986
1036
  config = await this.$store.dispatch('management/find', {
987
1037
  type,
@@ -1018,7 +1068,7 @@ export default {
1018
1068
 
1019
1069
  async addMachinePool(idx) {
1020
1070
  // this.machineConfigSchema is the schema for the Machine Pool's machine configuration for the given provider
1021
- if ( !this.machineConfigSchema ) {
1071
+ if (!this.machineConfigSchema) {
1022
1072
  return;
1023
1073
  }
1024
1074
 
@@ -1065,7 +1115,7 @@ export default {
1065
1115
  },
1066
1116
  };
1067
1117
 
1068
- if (this.provider === 'vmwarevsphere') {
1118
+ if (this.provider === VMWARE_VSPHERE) {
1069
1119
  pool.pool.machineOS = 'linux';
1070
1120
  }
1071
1121
 
@@ -1076,7 +1126,7 @@ export default {
1076
1126
  this.machinePools.push(pool);
1077
1127
 
1078
1128
  this.$nextTick(() => {
1079
- if ( this.$refs.pools?.select ) {
1129
+ if (this.$refs.pools?.select) {
1080
1130
  this.$refs.pools.select(name);
1081
1131
  }
1082
1132
  });
@@ -1085,11 +1135,11 @@ export default {
1085
1135
  removeMachinePool(idx) {
1086
1136
  const entry = this.machinePools[idx];
1087
1137
 
1088
- if ( !entry ) {
1138
+ if (!entry) {
1089
1139
  return;
1090
1140
  }
1091
1141
 
1092
- if ( entry.create ) {
1142
+ if (entry.create) {
1093
1143
  // If this is a new pool that isn't saved yet, it can just be dropped
1094
1144
  removeObject(this.machinePools, entry);
1095
1145
  } else {
@@ -1110,7 +1160,12 @@ export default {
1110
1160
  // We don't allow the user to edit any of the fields in metadata from the UI so it's safe to override it with the
1111
1161
  // metadata defined by the latest backend value. This is primarily used to ensure the resourceVersion is up to date.
1112
1162
  delete clonedCurrentConfig.metadata;
1113
- machinePool.config = merge(clonedLatestConfig, clonedCurrentConfig);
1163
+
1164
+ if (this.provider === VMWARE_VSPHERE) {
1165
+ machinePool.config = vspherePoolConfigMerge(clonedLatestConfig, clonedCurrentConfig);
1166
+ } else {
1167
+ machinePool.config = merge(clonedLatestConfig, clonedCurrentConfig);
1168
+ }
1114
1169
  }
1115
1170
  },
1116
1171
 
@@ -1148,8 +1203,8 @@ export default {
1148
1203
  return await this.extensionProvider.saveMachinePoolConfigs(this.machinePools, this.value);
1149
1204
  }
1150
1205
 
1151
- for ( const entry of this.machinePools ) {
1152
- if ( entry.remove ) {
1206
+ for (const entry of this.machinePools) {
1207
+ if (entry.remove) {
1153
1208
  continue;
1154
1209
  }
1155
1210
 
@@ -1160,8 +1215,8 @@ export default {
1160
1215
 
1161
1216
  const prefix = `${ this.value.metadata.name }-${ entry.pool.name }`.substr(0, 50).toLowerCase();
1162
1217
 
1163
- if ( entry.create ) {
1164
- if ( !entry.config.metadata?.name ) {
1218
+ if (entry.create) {
1219
+ if (!entry.config.metadata?.name) {
1165
1220
  entry.config.metadata.generateName = `nc-${ prefix }-`;
1166
1221
  }
1167
1222
 
@@ -1171,12 +1226,12 @@ export default {
1171
1226
  entry.pool.machineConfigRef.name = neu.metadata.name;
1172
1227
  entry.create = false;
1173
1228
  entry.update = true;
1174
- } else if ( entry.update ) {
1229
+ } else if (entry.update) {
1175
1230
  entry.config = await entry.config.save();
1176
1231
  }
1177
1232
 
1178
1233
  // Ensure Elemental clusters have a hostname prefix
1179
- if (this.isElementalCluster && !entry.pool.hostnamePrefix ) {
1234
+ if (this.isElementalCluster && !entry.pool.hostnamePrefix) {
1180
1235
  entry.pool.hostnamePrefix = `${ prefix }-`;
1181
1236
  }
1182
1237
 
@@ -1187,11 +1242,11 @@ export default {
1187
1242
  },
1188
1243
 
1189
1244
  async cleanupMachinePools() {
1190
- for ( const entry of this.machinePools ) {
1191
- if ( entry.remove && entry.config ) {
1245
+ for (const entry of this.machinePools) {
1246
+ if (entry.remove && entry.config) {
1192
1247
  try {
1193
1248
  await entry.config.remove();
1194
- } catch (e) {}
1249
+ } catch (e) { }
1195
1250
  }
1196
1251
  }
1197
1252
  },
@@ -1212,7 +1267,7 @@ export default {
1212
1267
  },
1213
1268
 
1214
1269
  cancelCredential() {
1215
- if ( this.$refs.cruresource ) {
1270
+ if (this.$refs.cruresource) {
1216
1271
  this.$refs.cruresource.emitOrRoute();
1217
1272
  }
1218
1273
  },
@@ -1220,7 +1275,7 @@ export default {
1220
1275
  done() {
1221
1276
  let routeName = 'c-cluster-product-resource';
1222
1277
 
1223
- if ( this.mode === _CREATE && (this.provider === 'import' || this.provider === 'custom') ) {
1278
+ if (this.mode === _CREATE && (this.provider === 'import' || this.provider === 'custom')) {
1224
1279
  // Go show the registration command
1225
1280
  routeName = 'c-cluster-product-resource-namespace-id';
1226
1281
  }
@@ -1329,7 +1384,9 @@ export default {
1329
1384
  set(this.chartValues, `${ HARVESTER_CLOUD_PROVIDER }.global.cattle.clusterName`, this.value.metadata.name);
1330
1385
  }
1331
1386
 
1332
- set(this.chartValues, `${ HARVESTER_CLOUD_PROVIDER }.cloudConfigPath`, '/var/lib/rancher/rke2/etc/config-files/cloud-provider-config');
1387
+ const distroRoot = this.value?.spec?.rkeConfig?.dataDirectories?.k8sDistro?.length ? this.value?.spec?.rkeConfig?.dataDirectories?.k8sDistro : '/var/lib/rancher/rke2';
1388
+
1389
+ set(this.chartValues, `${ HARVESTER_CLOUD_PROVIDER }.cloudConfigPath`, `${ distroRoot }/etc/config-files/cloud-provider-config`);
1333
1390
  }
1334
1391
  } catch (err) {
1335
1392
  this.errors.push(err);
@@ -1365,7 +1422,7 @@ export default {
1365
1422
  return await this.extensionProvider?.saveCluster(this.value, this.schema);
1366
1423
  }
1367
1424
 
1368
- if ( this.isCreate ) {
1425
+ if (this.isCreate) {
1369
1426
  url = url || this.schema.linkFor('collection');
1370
1427
  const res = await this.value.save({ url });
1371
1428
 
@@ -1410,12 +1467,12 @@ export default {
1410
1467
  * 2) We're ready to cache any values the user provides for each addon
1411
1468
  */
1412
1469
  async initAddons() {
1413
- for ( const chartName of this.addonNames ) {
1470
+ for (const chartName of this.addonNames) {
1414
1471
  const entry = this.chartVersions[chartName];
1415
1472
 
1416
1473
  // prevent fetching of addon config for 'none' CNI option
1417
1474
  // https://github.com/rancher/dashboard/issues/10338
1418
- if ( this.versionInfo[chartName] || chartName.includes('none')) {
1475
+ if (this.versionInfo[chartName] || chartName.includes('none')) {
1419
1476
  continue;
1420
1477
  }
1421
1478
 
@@ -1451,7 +1508,7 @@ export default {
1451
1508
  refreshComponentWithYamls(key) {
1452
1509
  const component = this.$refs[key];
1453
1510
 
1454
- if ( component ) {
1511
+ if (component) {
1455
1512
  this.refreshYamls(component.$refs);
1456
1513
  }
1457
1514
  },
@@ -1459,11 +1516,11 @@ export default {
1459
1516
  refreshYamls(refs) {
1460
1517
  const keys = Object.keys(refs).filter((x) => x.startsWith('yaml'));
1461
1518
 
1462
- for ( const k of keys ) {
1519
+ for (const k of keys) {
1463
1520
  const entry = refs[k];
1464
1521
  const list = isArray(entry) ? entry : [entry];
1465
1522
 
1466
- for ( const component of list ) {
1523
+ for (const component of list) {
1467
1524
  component?.refresh(); // `yaml` ref can be undefined on switching from Basic to Addon tab (Azure --> Amazon --> addon)
1468
1525
  }
1469
1526
  }
@@ -1490,23 +1547,23 @@ export default {
1490
1547
  },
1491
1548
 
1492
1549
  initServerAgentArgs() {
1493
- for ( const k in this.serverArgs ) {
1494
- if ( this.serverConfig[k] === undefined ) {
1550
+ for (const k in this.serverArgs) {
1551
+ if (this.serverConfig[k] === undefined) {
1495
1552
  const def = this.serverArgs[k].default;
1496
1553
 
1497
1554
  set(this.serverConfig, k, (def !== undefined ? def : undefined));
1498
1555
  }
1499
1556
  }
1500
1557
 
1501
- for ( const k in this.agentArgs ) {
1502
- if ( this.agentConfig?.[k] === undefined ) {
1558
+ for (const k in this.agentArgs) {
1559
+ if (this.agentConfig?.[k] === undefined) {
1503
1560
  const def = this.agentArgs[k].default;
1504
1561
 
1505
1562
  set(this.agentConfig, k, (def !== undefined ? def : undefined));
1506
1563
  }
1507
1564
  }
1508
1565
 
1509
- if ( !this.serverConfig?.profile ) {
1566
+ if (!this.serverConfig?.profile) {
1510
1567
  set(this.serverConfig, 'profile', null);
1511
1568
  }
1512
1569
  },
@@ -1539,22 +1596,22 @@ export default {
1539
1596
  let registrySecret = null;
1540
1597
  let regs = this.rkeConfig.registries;
1541
1598
 
1542
- if ( !regs ) {
1599
+ if (!regs) {
1543
1600
  regs = {};
1544
1601
  set(this.rkeConfig, 'registries', regs);
1545
1602
  }
1546
1603
 
1547
- if ( !regs.configs ) {
1604
+ if (!regs.configs) {
1548
1605
  set(regs, 'configs', {});
1549
1606
  }
1550
1607
 
1551
- if ( !regs.mirrors ) {
1608
+ if (!regs.mirrors) {
1552
1609
  set(regs, 'mirrors', {});
1553
1610
  }
1554
1611
 
1555
1612
  const config = regs.configs[this.registryHost];
1556
1613
 
1557
- if ( config ) {
1614
+ if (config) {
1558
1615
  registrySecret = config.authConfigSecretName;
1559
1616
  }
1560
1617
 
@@ -1574,21 +1631,21 @@ export default {
1574
1631
  setRegistryConfig() {
1575
1632
  const hostname = (this.registryHost || '').trim();
1576
1633
 
1577
- if ( this.systemRegistry ) {
1634
+ if (this.systemRegistry) {
1578
1635
  // Empty string overrides the system default to nothing
1579
1636
  set(this.agentConfig, 'system-default-registry', '');
1580
1637
  } else {
1581
1638
  // No need to set anything
1582
1639
  set(this.agentConfig, 'system-default-registry', undefined);
1583
1640
  }
1584
- if ( !hostname || hostname === this.systemRegistry ) {
1641
+ if (!hostname || hostname === this.systemRegistry) {
1585
1642
  // Undefined removes the key which uses the global setting without hardcoding it into the config
1586
1643
  set(this.agentConfig, 'system-default-registry', undefined);
1587
1644
  } else {
1588
1645
  set(this.agentConfig, 'system-default-registry', hostname);
1589
1646
  }
1590
1647
 
1591
- if ( hostname && this.registrySecret ) {
1648
+ if (hostname && this.registrySecret) {
1592
1649
  // For a registry with basic auth, but no mirrors,
1593
1650
  // add a single registry config with the basic auth secret.
1594
1651
  const basicAuthConfig = {
@@ -1637,12 +1694,12 @@ export default {
1637
1694
  let isCurrentVersion = false;
1638
1695
  let label = obj.id;
1639
1696
 
1640
- if ( currentVersion ) {
1697
+ if (currentVersion) {
1641
1698
  disabled = compare(obj.id, currentVersion) < 0;
1642
1699
  isCurrentVersion = compare(obj.id, currentVersion) === 0;
1643
1700
  }
1644
1701
 
1645
- if ( defaultVersion ) {
1702
+ if (defaultVersion) {
1646
1703
  experimental = compare(defaultVersion, obj.id) < 0;
1647
1704
  }
1648
1705
 
@@ -1914,7 +1971,7 @@ export default {
1914
1971
  return this.t('cluster.banner.machinePoolError', {
1915
1972
  count: x[1].length, pool_name: x[0], fields: formattedFields
1916
1973
  }, true);
1917
- } )
1974
+ })
1918
1975
  .filter((x) => x);
1919
1976
 
1920
1977
  if (!errors) {
@@ -1925,7 +1982,7 @@ export default {
1925
1982
  },
1926
1983
  handleS3BackupChanged(neu) {
1927
1984
  this.s3Backup = neu;
1928
- if ( neu ) {
1985
+ if (neu) {
1929
1986
  // We need to make sure that s3 doesn't already have an existing value otherwise when editing a cluster with s3 defined this will clear s3.
1930
1987
  if (isEmpty(this.rkeConfig.etcd?.s3)) {
1931
1988
  set(this.rkeConfig.etcd, 's3', {});
@@ -1961,7 +2018,7 @@ export default {
1961
2018
  }
1962
2019
 
1963
2020
  for (const [index] of this.machinePools.entries()) { // validator machine config
1964
- if ( typeof this.$refs.pool[index]?.test === 'function' ) {
2021
+ if (typeof this.$refs.pool[index]?.test === 'function') {
1965
2022
  try {
1966
2023
  const res = await this.$refs.pool[index].test();
1967
2024
 
@@ -2001,12 +2058,13 @@ export default {
2001
2058
  @done="done"
2002
2059
  @finish="saveOverride"
2003
2060
  @cancel="cancel"
2004
- @error="e=>errors = e"
2061
+ @error="e => errors = e"
2005
2062
  >
2006
2063
  <div class="header-warnings">
2007
2064
  <Banner
2008
2065
  v-if="isEdit"
2009
2066
  color="warning"
2067
+ data-testid="edit-cluster-reprovisioning-documentation"
2010
2068
  >
2011
2069
  <span v-clean-html="t('cluster.banner.rke2-k3-reprovisioning', {}, true)" />
2012
2070
  </Banner>
@@ -2038,8 +2096,18 @@ export default {
2038
2096
  name-placeholder="cluster.name.placeholder"
2039
2097
  description-label="cluster.description.label"
2040
2098
  description-placeholder="cluster.description.placeholder"
2041
- :rules="{name:fvGetAndReportPathRules('metadata.name')}"
2042
- />
2099
+ :rules="{ name: fvGetAndReportPathRules('metadata.name') }"
2100
+ >
2101
+ <template
2102
+ slot="customize"
2103
+ >
2104
+ <ClusterAppearance
2105
+ :name="clusterName"
2106
+ :currentCluster="currentCluster"
2107
+ :mode="mode"
2108
+ />
2109
+ </template>
2110
+ </NameNsDescription>
2043
2111
 
2044
2112
  <Banner
2045
2113
  v-if="appsOSWarning"
@@ -2110,8 +2178,9 @@ export default {
2110
2178
  :machine-pools="machinePools"
2111
2179
  :busy="busy"
2112
2180
  :pool-id="obj.id"
2181
+ :pool-create-mode="obj.create"
2113
2182
  @error="handleMachinePoolError"
2114
- @validationChanged="v=>machinePoolValidationChanged(obj.id, v)"
2183
+ @validationChanged="v => machinePoolValidationChanged(obj.id, v)"
2115
2184
  />
2116
2185
  </Tab>
2117
2186
  </template>
@@ -2351,13 +2420,15 @@ export default {
2351
2420
  </template>
2352
2421
 
2353
2422
  <style lang="scss" scoped>
2354
- .min-height {
2355
- min-height: 40em;
2356
- }
2357
- .patch-version {
2358
- margin-top: 5px;
2359
- }
2360
- .header-warnings .banner {
2361
- margin-bottom: 0;
2362
- }
2423
+ .min-height {
2424
+ min-height: 40em;
2425
+ }
2426
+
2427
+ .patch-version {
2428
+ margin-top: 5px;
2429
+ }
2430
+
2431
+ .header-warnings .banner {
2432
+ margin-bottom: 0;
2433
+ }
2363
2434
  </style>