dashboard-shell-shell 1.0.122 → 1.0.1000000082

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 (372) hide show
  1. package/.DS_Store +0 -0
  2. package/assets/brand/harvester/favicon.png +0 -0
  3. package/assets/brand/suse/favicon.png +0 -0
  4. package/assets/icons/iconfont.css +19 -3
  5. package/assets/icons/iconfont.js +1 -1
  6. package/assets/icons/iconfont.json +28 -0
  7. package/assets/icons/iconfont.ttf +0 -0
  8. package/assets/icons/iconfont.woff +0 -0
  9. package/assets/icons/iconfont.woff2 +0 -0
  10. package/assets/images/pl/half-logo.svg +2 -23
  11. package/assets/styles/base/_functions.scss +0 -0
  12. package/assets/styles/base/_mixins.scss +0 -0
  13. package/assets/styles/base/_variables.scss +1 -1
  14. package/assets/styles/global/_labeled-input.scss +0 -1
  15. package/assets/styles/global/_layout.scss +1 -1
  16. package/assets/styles/global/_select.scss +4 -2
  17. package/assets/styles/global/_table.scss +5 -0
  18. package/assets/styles/vendor/vue-select.scss +2 -1
  19. package/assets/translations/en-us.yaml +1 -1
  20. package/assets/translations/zh-hans.yaml +25 -15
  21. package/chart/monitoring/index.vue +3 -1
  22. package/chart/monitoring/prometheus/index.vue +13 -10
  23. package/cloud-credential/aws.vue +2 -0
  24. package/components/ActionDropdown.vue +1 -1
  25. package/components/ActionDropdownShell.vue +71 -0
  26. package/components/ActionMenu.vue +2 -2
  27. package/components/ActionMenuShell.vue +3 -0
  28. package/components/AppModal.vue +84 -8
  29. package/components/AssignTo.vue +25 -11
  30. package/components/AsyncButton.vue +24 -7
  31. package/components/BannerGraphic.vue +1 -0
  32. package/components/ButtonDropdown.vue +26 -4
  33. package/components/ButtonGroup.vue +4 -0
  34. package/components/ButtonMultiAction.vue +1 -0
  35. package/components/CodeMirror.vue +19 -6
  36. package/components/CommunityLinks.vue +3 -3
  37. package/components/ConsumptionGauge.vue +24 -5
  38. package/components/CopyToClipboardText.vue +2 -1
  39. package/components/CruResource.vue +13 -7
  40. package/components/CruResourceFooter.vue +2 -2
  41. package/components/DashboardOptions.vue +29 -17
  42. package/components/DetailText.vue +5 -0
  43. package/components/DisableAuthProviderModal.vue +1 -0
  44. package/components/DotState.vue +84 -0
  45. package/components/ExplorerMembers.vue +1 -1
  46. package/components/ExplorerProjectsNamespaces.vue +88 -16
  47. package/components/FixedBanner.vue +19 -12
  48. package/components/GlobalRoleBindings.vue +5 -1
  49. package/components/GrafanaDashboard.vue +4 -4
  50. package/components/GrowlManager.vue +4 -1
  51. package/components/HardwareResourceGauge.vue +39 -3
  52. package/components/InfoBox.vue +3 -3
  53. package/components/InputOrDisplay.vue +28 -2
  54. package/components/LabelValue.vue +20 -1
  55. package/components/LandingPagePreference.vue +5 -3
  56. package/components/LocaleSelector.vue +39 -93
  57. package/components/ModalManager.vue +55 -0
  58. package/components/ModalWithCard.vue +13 -3
  59. package/components/MoveModal.vue +1 -0
  60. package/components/PodSecurityAdmission.vue +1 -1
  61. package/components/PromptChangePassword.vue +1 -1
  62. package/components/PromptModal.vue +16 -3
  63. package/components/PromptRemove.vue +29 -9
  64. package/components/PromptRestore.vue +1 -0
  65. package/components/ResourceCancelModal.vue +1 -0
  66. package/components/ResourceDetail/Masthead.vue +52 -17
  67. package/components/ResourceDetail/__tests__/Masthead.test.ts +5 -1
  68. package/components/ResourceDetail/index.vue +54 -16
  69. package/components/ResourceList/Masthead.vue +26 -4
  70. package/components/ResourceList/index.vue +4 -3
  71. package/components/ResourceTable.vue +1 -0
  72. package/components/SideNav.vue +20 -15
  73. package/components/SlideInPanelManager.vue +126 -0
  74. package/components/SortableTable/THead.vue +10 -4
  75. package/components/SortableTable/actions.js +1 -1
  76. package/components/SortableTable/index.vue +542 -553
  77. package/components/SortableTable/selection.js +2 -13
  78. package/components/StatusBadge.vue +77 -0
  79. package/components/Tabbed/Tab.vue +3 -3
  80. package/components/Tabbed/index.vue +47 -29
  81. package/components/Wizard.vue +2 -2
  82. package/components/YamlEditor.vue +1 -1
  83. package/components/__tests__/AsyncButton.test.ts +2 -2
  84. package/components/__tests__/FixedBanner.test.ts +3 -3
  85. package/components/__tests__/ModalManager.spec.ts +176 -0
  86. package/components/__tests__/SlideInPanelManager.spec.ts +166 -0
  87. package/components/auth/Principal.vue +10 -3
  88. package/components/auth/RoleDetailEdit.vue +1 -1
  89. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  90. package/components/form/ArrayList.vue +123 -85
  91. package/components/form/ArrayListGrouped.vue +10 -2
  92. package/components/form/ArrayListSelect.vue +1 -1
  93. package/components/form/Command.vue +6 -15
  94. package/components/form/EnvVars.vue +16 -8
  95. package/components/form/Footer.vue +10 -7
  96. package/components/form/HealthCheck.vue +3 -3
  97. package/components/form/HookOption.vue +11 -16
  98. package/components/form/InputWithSelect.vue +6 -5
  99. package/components/form/KeyValue.vue +39 -10
  100. package/components/form/LabeledSelect.vue +73 -77
  101. package/components/form/Labels.vue +6 -3
  102. package/components/form/LifecycleHooks.vue +3 -3
  103. package/components/form/MatchExpressions.vue +42 -17
  104. package/components/form/NameNsDescription.vue +163 -116
  105. package/components/form/Networking.vue +20 -12
  106. package/components/form/NodeAffinity.vue +31 -23
  107. package/components/form/NodeScheduling.vue +13 -3
  108. package/components/form/Password.vue +11 -5
  109. package/components/form/PodAffinity.vue +47 -48
  110. package/components/form/Probe.vue +68 -66
  111. package/components/form/ResourceQuota/Namespace.vue +4 -4
  112. package/components/form/ResourceQuota/NamespaceRow.vue +5 -7
  113. package/components/form/ResourceQuota/Project.vue +9 -5
  114. package/components/form/ResourceQuota/ProjectRow.vue +4 -6
  115. package/components/form/ResourceSelector.vue +7 -9
  116. package/components/form/SSHKnownHosts/KnownHostsEditDialog.vue +6 -3
  117. package/components/form/SSHKnownHosts/__tests__/KnownHostsEditDialog.test.ts +12 -1
  118. package/components/form/SSHKnownHosts/index.vue +16 -2
  119. package/components/form/Security.vue +54 -56
  120. package/components/form/Select.vue +44 -7
  121. package/components/form/ShellInput.vue +5 -1
  122. package/components/form/SimpleSecretSelector.vue +29 -9
  123. package/components/form/Tolerations.vue +5 -1
  124. package/components/form/UnitInput.vue +10 -5
  125. package/components/form/ValueFromResource.vue +134 -121
  126. package/components/form/WorkloadPorts.vue +18 -18
  127. package/components/form/__tests__/ArrayList.test.ts +5 -2
  128. package/components/form/__tests__/MatchExpressions.test.ts +12 -12
  129. package/components/form/__tests__/NameNsDescription.test.ts +115 -14
  130. package/components/form/__tests__/Probe.test.ts +12 -8
  131. package/components/form/__tests__/SSHKnownHosts.test.ts +11 -0
  132. package/components/form/__tests__/Select.test.ts +37 -0
  133. package/components/form/__tests__/UnitInput.test.ts +4 -5
  134. package/components/formatter/BadgeStateFormatter.vue +8 -5
  135. package/components/formatter/InternalExternalIP.vue +2 -0
  136. package/components/formatter/LiveDate.vue +3 -3
  137. package/components/formatter/SecretData.vue +20 -7
  138. package/components/nav/Favorite.vue +5 -1
  139. package/components/nav/Group.vue +18 -4
  140. package/components/nav/Header.vue +39 -13
  141. package/components/nav/Jump.vue +7 -0
  142. package/components/nav/NamespaceFilter.vue +21 -11
  143. package/components/nav/Pinned.vue +1 -1
  144. package/components/nav/TopLevelMenu.vue +5 -17
  145. package/components/nav/Type.vue +30 -33
  146. package/components/nav/__tests__/TopLevelMenu.test.ts +0 -40
  147. package/components/rancherResourceDetail/Masthead.vue +769 -0
  148. package/components/rancherResourceDetail/__tests__/Masthead.test.ts +65 -0
  149. package/components/rancherResourceDetail/index.vue +591 -0
  150. package/components/rancherResourceList/Masthead-btn.vue +225 -0
  151. package/components/rancherResourceList/Masthead.vue +375 -0
  152. package/components/rancherResourceList/ResourceLoadingIndicator.vue +140 -0
  153. package/components/rancherResourceList/index.vue +307 -0
  154. package/components/rancherResourceList/resource-list.config.js +7 -0
  155. package/components/rancherResourceTable.vue +783 -0
  156. package/components/rancherSortableTable/THead.vue +561 -0
  157. package/components/rancherSortableTable/actions.js +153 -0
  158. package/components/rancherSortableTable/advanced-filtering.js +272 -0
  159. package/components/rancherSortableTable/debug.js +117 -0
  160. package/components/rancherSortableTable/filtering.js +290 -0
  161. package/components/rancherSortableTable/grouping.js +48 -0
  162. package/components/rancherSortableTable/index.vue +2712 -0
  163. package/components/rancherSortableTable/paging.js +155 -0
  164. package/components/rancherSortableTable/selection.js +629 -0
  165. package/components/rancherSortableTable/sortable-config.ts +4 -0
  166. package/components/rancherSortableTable/sorting.js +129 -0
  167. package/components/templates/blank.vue +4 -1
  168. package/components/templates/default.vue +8 -0
  169. package/components/templates/home.vue +10 -1
  170. package/components/templates/plain.vue +10 -1
  171. package/composables/focusTrap.ts +11 -3
  172. package/composables/useRuntimeFlag.ts +29 -0
  173. package/config/private-label.js +15 -10
  174. package/config/router/routes.js +21 -13
  175. package/config/store.js +4 -0
  176. package/config/table-headers.js +3 -2
  177. package/config/uiplugins.js +5 -1
  178. package/core/plugin-routes.ts +5 -115
  179. package/core/plugins.js +1 -1
  180. package/core/types.ts +23 -2
  181. package/detail/__tests__/autoscaling.horizontalpodautoscaler.test.ts +84 -23
  182. package/detail/autoscaling.horizontalpodautoscaler/index.vue +13 -3
  183. package/detail/provisioning.cattle.io.cluster.vue +72 -6
  184. package/dialog/AddCustomBadgeDialog.vue +1 -0
  185. package/dialog/DeactivateDriverDialog.vue +5 -4
  186. package/dialog/ForceMachineRemoveDialog.vue +6 -3
  187. package/dialog/GitRepoForceUpdateDialog.vue +1 -1
  188. package/dialog/ScalePoolDownDialog.vue +2 -2
  189. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +16 -3
  190. package/edit/auth/__tests__/oidc.test.ts +162 -88
  191. package/edit/auth/azuread.vue +2 -1
  192. package/edit/auth/github.vue +1 -1
  193. package/edit/auth/googleoauth.vue +5 -1
  194. package/edit/auth/ldap/__tests__/config.test.ts +0 -14
  195. package/edit/auth/ldap/config.vue +0 -24
  196. package/edit/auth/ldap/index.vue +1 -1
  197. package/edit/auth/oidc.vue +39 -6
  198. package/edit/auth/saml.vue +1 -1
  199. package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +5 -2
  200. package/edit/cloudcredential.vue +24 -9
  201. package/edit/fleet.cattle.io.clustergroup.vue +5 -3
  202. package/edit/fleet.cattle.io.gitrepo.vue +2 -0
  203. package/edit/logging-flow/Match.vue +1 -1
  204. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +40 -9
  205. package/edit/management.cattle.io.user.vue +28 -3
  206. package/edit/monitoring.coreos.com.alertmanagerconfig/auth.vue +19 -19
  207. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +31 -31
  208. package/edit/monitoring.coreos.com.alertmanagerconfig/routeConfig.vue +36 -12
  209. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +6 -6
  210. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +10 -10
  211. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +4 -4
  212. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +4 -4
  213. package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +1 -1
  214. package/edit/monitoring.coreos.com.receiver/auth.vue +29 -29
  215. package/edit/monitoring.coreos.com.receiver/types/email.vue +6 -6
  216. package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +10 -10
  217. package/edit/monitoring.coreos.com.receiver/types/pagerduty.vue +5 -5
  218. package/edit/monitoring.coreos.com.receiver/types/slack.vue +4 -4
  219. package/edit/namespace.vue +1 -2
  220. package/edit/networking.k8s.io.ingress/IngressClass.vue +7 -3
  221. package/edit/networking.k8s.io.ingress/RulePath.vue +1 -1
  222. package/edit/networking.k8s.io.ingress/__tests__/IngressClass.test.ts +58 -0
  223. package/edit/persistentvolume/__tests__/persistentvolume.test.ts +14 -2
  224. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +4 -1
  225. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +26 -9
  226. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +8 -10
  227. package/edit/provisioning.cattle.io.cluster/rke2.vue +31 -40
  228. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +5 -2
  229. package/edit/provisioning.cattle.io.cluster/tabs/AgentConfiguration.vue +6 -1
  230. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +33 -2
  231. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +3 -3
  232. package/edit/service.vue +0 -3
  233. package/edit/token.vue +32 -11
  234. package/edit/workload/Job.vue +6 -6
  235. package/edit/workload/__tests__/Job.test.ts +0 -1
  236. package/edit/workload/index.vue +1 -0
  237. package/edit/workload/mixins/workload.js +3 -3
  238. package/initialize/install-plugins.js +2 -1
  239. package/list/harvesterhci.io.management.cluster.vue +4 -1
  240. package/list/management.cattle.io.feature.vue +1 -0
  241. package/list/namespace.vue +3 -1
  242. package/list/provisioning.cattle.io.cluster.vue +20 -12
  243. package/list/workload.vue +7 -6
  244. package/machine-config/__tests__/vmwarevsphere.test.ts +48 -3
  245. package/machine-config/azure.vue +16 -4
  246. package/machine-config/vmwarevsphere.vue +16 -0
  247. package/mixins/resource-fetch.js +2 -1
  248. package/models/__tests__/logging.banzaicloud.io.flow.test.ts +88 -0
  249. package/models/__tests__/namespace.test.ts +25 -1
  250. package/models/cloudcredential.js +5 -0
  251. package/models/kontainerdriver.js +6 -3
  252. package/models/logging.banzaicloud.io.flow.js +2 -1
  253. package/models/management.cattle.io.node.js +3 -3
  254. package/models/management.cattle.io.setting.js +2 -1
  255. package/models/namespace.js +4 -5
  256. package/models/nodedriver.js +6 -3
  257. package/models/storage.k8s.io.storageclass.js +2 -2
  258. package/models/workload.js +4 -1
  259. package/package.json +1 -1
  260. package/pages/about.vue +16 -8
  261. package/pages/account/index.vue +80 -24
  262. package/pages/account/pri.vue +229 -0
  263. package/pages/auth/login.vue +195 -44
  264. package/pages/auth/logout.vue +4 -1
  265. package/pages/auth/setup.vue +144 -19
  266. package/pages/auth/verify.vue +13 -8
  267. package/pages/auth copy/login.vue +595 -0
  268. package/pages/auth copy/logout.vue +47 -0
  269. package/pages/auth copy/setup.vue +523 -0
  270. package/pages/auth copy/verify.vue +203 -0
  271. package/pages/c/_cluster/_product/namespaces.vue +5 -5
  272. package/pages/c/_cluster/apps/charts/chart.vue +1 -1
  273. package/pages/c/_cluster/apps/charts/install.vue +26 -26
  274. package/pages/c/_cluster/auth/config/index.vue +10 -12
  275. package/pages/c/_cluster/explorer/EventsTable.vue +38 -33
  276. package/pages/c/_cluster/explorer/index.vue +17 -15
  277. package/pages/c/_cluster/istio/index.vue +2 -2
  278. package/pages/c/_cluster/longhorn/index.vue +1 -1
  279. package/pages/c/_cluster/monitoring/index.vue +1 -1
  280. package/pages/c/_cluster/monitoring/monitor/_namespace/_id.vue +4 -2
  281. package/pages/c/_cluster/monitoring/monitor/create.vue +4 -2
  282. package/pages/c/_cluster/monitoring/monitor/index.vue +2 -2
  283. package/pages/c/_cluster/monitoring/route-receiver/_id.vue +4 -2
  284. package/pages/c/_cluster/monitoring/route-receiver/create.vue +5 -2
  285. package/pages/c/_cluster/neuvector/index.vue +1 -1
  286. package/pages/c/_cluster/settings/brand.vue +3 -3
  287. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +8 -10
  288. package/pages/diagnostic.vue +59 -11
  289. package/pages/fail-whale.vue +14 -8
  290. package/pages/home.vue +24 -18
  291. package/pages/prefs.vue +9 -7
  292. package/pages/support/index.vue +4 -1
  293. package/pkg/tsconfig.json +9 -9
  294. package/pkg/vue.config.js +1 -1
  295. package/plugins/dashboard-store/normalize.js +3 -1
  296. package/plugins/dashboard-store/resource-class.js +31 -29
  297. package/plugins/internal-api/index.ts +37 -0
  298. package/plugins/internal-api/shared/base-api.ts +13 -0
  299. package/plugins/internal-api/shell/shell.api.ts +108 -0
  300. package/promptRemove/management.cattle.io.fleetworkspace.vue +1 -1
  301. package/promptRemove/management.cattle.io.globalrole.vue +1 -1
  302. package/promptRemove/management.cattle.io.project.vue +2 -2
  303. package/promptRemove/management.cattle.io.roletemplate.vue +1 -1
  304. package/promptRemove/pod.vue +1 -1
  305. package/public/index.html +2 -1
  306. package/rancher-components/BadgeState/BadgeState.vue +5 -1
  307. package/rancher-components/Banner/Banner.vue +8 -2
  308. package/rancher-components/Card/Card.vue +3 -6
  309. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -0
  310. package/rancher-components/Form/LabeledInput/LabeledInput.vue +5 -2
  311. package/rancher-components/Form/Radio/RadioButton.vue +3 -3
  312. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +1 -5
  313. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  314. package/rancher-components/RcDropdown/RcDropdownItem.vue +1 -2
  315. package/rancher-components/RcDropdown/RcDropdownMenu.vue +7 -3
  316. package/rancher-components/RcDropdown/types.ts +1 -0
  317. package/scripts/clean +0 -0
  318. package/scripts/extension/bundle +20 -0
  319. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +2 -2
  320. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -1
  321. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  322. package/scripts/extension/helm/scripts/package +0 -0
  323. package/scripts/extension/helm/scripts/patch +0 -0
  324. package/scripts/extension/helm/scripts/version +0 -0
  325. package/scripts/extension/helmpatch +44 -31
  326. package/scripts/extension/parse-tag-name +0 -0
  327. package/scripts/extension/publish +12 -12
  328. package/scripts/publish-shell.sh +18 -23
  329. package/scripts/serve-pkgs +0 -0
  330. package/scripts/sync-shell-deps +0 -0
  331. package/scripts/test-plugins-build.sh +4 -6
  332. package/scripts/typegen.sh +28 -46
  333. package/server/har-file.js +25 -3
  334. package/static/favicon.ico +0 -0
  335. package/static/favicon.png +0 -0
  336. package/static/loading-indicator.html +2 -2
  337. package/store/aws.js +9 -2
  338. package/store/features.js +2 -1
  339. package/store/i18n.js +3 -3
  340. package/store/modal.ts +71 -0
  341. package/store/slideInPanel.ts +47 -0
  342. package/store/type-map.js +9 -1
  343. package/types/cloud-shell/index.d.ts +11020 -0
  344. package/types/global-vue.d.ts +5 -0
  345. package/types/internal-api/shell/growl.d.ts +25 -0
  346. package/types/internal-api/shell/modal.d.ts +77 -0
  347. package/types/internal-api/shell/slideIn.d.ts +15 -0
  348. package/types/shell/index.d.ts +118 -128
  349. package/types/vue-shim.d.ts +4 -1
  350. package/utils/__tests__/object.test.ts +38 -4
  351. package/utils/__tests__/string.test.ts +2 -2
  352. package/utils/auth.js +1 -0
  353. package/utils/banners.js +0 -45
  354. package/utils/cluster.js +35 -0
  355. package/utils/color.js +9 -8
  356. package/utils/error.js +61 -3
  357. package/utils/errorTranslate.json +450 -30
  358. package/utils/object.js +46 -6
  359. package/utils/router.js +22 -1
  360. package/utils/select.js +26 -3
  361. package/utils/string.js +9 -8
  362. package/utils/title.ts +1 -1
  363. package/utils/validators/machine-pool.ts +20 -0
  364. package/vue.config.js +7 -2
  365. package/components/formatter/ExtensionCache.vue +0 -74
  366. package/components/formatter/Port.vue +0 -24
  367. package/components/formatter/SecretType.vue +0 -41
  368. package/types/resources/fleet.d.ts +0 -57
  369. package/types/resources/pod-security-admission.ts +0 -36
  370. package/types/resources/settings.d.ts +0 -93
  371. package/types/resources/userPreferences.d.ts +0 -13
  372. package/types/vue-shim.d +0 -20
@@ -1,5 +1,231 @@
1
1
  {
2
2
  "translations": [
3
+ {
4
+ "pattern": "can't connect to backup target[\\s\\S]*no route to host",
5
+ "replacement": "无法连接到备份目标:网络不可达,请检查备份服务器地址与路由",
6
+ "flags": "gi"
7
+ },
8
+ {
9
+ "pattern":"provider-networks.kubeovn.io",
10
+ "replacement": "物理网络"
11
+ },
12
+ {
13
+ "pattern":"password must be at least 12 characters",
14
+ "replacement": "密码最少12位字符"
15
+ },
16
+ {
17
+ "pattern":"vlans.kubeovn.io",
18
+ "replacement": "Vlan"
19
+ },
20
+ {
21
+ "pattern":"vpcs.kubeovn.io",
22
+ "replacement": "VPC"
23
+ },
24
+ {
25
+ "pattern":"subnets.kubeovn.io",
26
+ "replacement": "子网"
27
+ },
28
+ {
29
+ "pattern": "failed to validate vlan for subnet ([^,]+), failed to get vlan ([^:]+): vlan\\.kubeovn\\.io ["\"']([^\"']+)["\"'] not found",
30
+ "replacement": "子网 '$1' 验证 VLAN 失败:未找到 VLAN ($2)"
31
+ },
32
+ {
33
+ "pattern": "not observed",
34
+ "replacement": "未检测到"
35
+ },
36
+ {
37
+ "pattern": "file exists",
38
+ "replacement": "文件存在"
39
+ },
40
+ {
41
+ "pattern": "vmi is missing the ready condition",
42
+ "replacement": "虚拟机实例缺少就绪条件"
43
+ },
44
+ {
45
+ "pattern": "pvc ([^\\s]+)/([^\\s]+) does not exist, waiting for it to appear",
46
+ "replacement": "PVC '$2'(资源组 $1)不存在,正在等待其创建"
47
+ },
48
+ {
49
+ "pattern": "failed to set the setting ([^\\s]+) with invalid value ([^:]+): not enough hugepages-2mi capacity for node ([^,]+), requested ([^,]+), capacity ([^,\\]]+)",
50
+ "replacement": "节点 $3 的容量不足:需要 $4,可用 $5,无法设置 $1 为 $2"
51
+ },
52
+ {
53
+ "pattern": "subnet\\.kubeovn\\.io '([^']+)' is invalid: \\[metadata\\.name: invalid value: '[^']+': metadata\\.name in body should match [^,]+, spec\\.excludeIps\\[(\\d+)\\]: invalid value: '': spec\\.excludeIps\\[\\d+\\] in body should match [^\\]]+\\]",
54
+ "replacement": "子网 '{{1}}' 配置无效:1) 子网名称不能以数字开头;2) excludeIps[{{2}}] 必须填写合法的 IPv4/IPv6 或地址段,不能为空"
55
+ },
56
+ {
57
+ "pattern": "failed to validate vlan for subnet ([^,]+), subnet \\1 has invalid conflict vlan ([^\\s]+)",
58
+ "replacement": "子网 $1 校验 VLAN 失败:子网 $1 存在非法冲突 VLAN $2"
59
+ },
60
+ {
61
+ "pattern": "resource scheduled for deletion",
62
+ "replacement": "计划删除的资源"
63
+ },
64
+ {
65
+ "pattern": "failed to add nic ([^\\s]+) to external bridge ([^:]+): failed to get nic by name ([^:]+): link not found",
66
+ "replacement": "无法将网卡 $1 加入外部桥 $2:找不到名为 $3 的网卡(链路未找到)"
67
+ },
68
+ {
69
+ "pattern": "admission webhook(.*?)denied the request:",
70
+ "replacement": ""
71
+ },
72
+ {
73
+ "pattern": "(.+): a lowercase rfc 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character",
74
+ "replacement": "$1: 必须由小写字母数字字符,'-',并且必须以字母数字字符开头和结尾"
75
+ },
76
+ {
77
+ "pattern": "(.+) nodes are available: pod has unbound immediate persistentvolumeclaims. (.+)",
78
+ "replacement": "$1 节点是可用的"
79
+ },
80
+ {
81
+ "pattern": "(.+) does not conform to the kubernetes dns_label rules : must not contain dots",
82
+ "replacement": "$1 不符合规则:不能含有点"
83
+ },
84
+ {
85
+ "pattern": "failed to create vm backup, error: vm backup and snapshot use same crd - virtualmachinebackup. the (.+) snapshot is already existent. please use another name for it.",
86
+ "replacement": "创建虚拟机备份失败,错误:虚拟机备份和快照不能相同。这个 $1 快照已存在,请更换其他名称"
87
+ },
88
+ {
89
+ "pattern": "vm backup and snapshot use same crd - virtualmachinebackup. the (.+) snapshot is already existent. please use another name for it.",
90
+ "replacement": "虚拟机备份和快照不能相同。这个 $1 备份已存在,请更换其他名称"
91
+ },
92
+ {
93
+ "pattern": "json: cannot unmarshal string into go struct field (.+) of type int32",
94
+ "replacement": "$1 为数字,无法转成json字符串"
95
+ },
96
+ {
97
+ "pattern": "pcideviceclaim (.+) is already in use with vm (.+) in namespace (.+)",
98
+ "replacement": "PCI设备 $1 正在被 $3 中的虚拟机 $2 使用"
99
+ },
100
+ {
101
+ "pattern": "found pcideviceclaims: (.+) related to sriovnetworkdevice (.+) in use",
102
+ "replacement": "发现PCI设备:$1 所关联的SR-IOV网卡 $2 正在使用中"
103
+ },
104
+ {
105
+ "pattern": "can not delete the volume (.+) which is currently attached to VM: (.+)",
106
+ "replacement": "虚拟磁盘 $1 正在被虚拟机 $2 挂载,无法删除"
107
+ },
108
+ {
109
+ "pattern": "backuptargets.longhorn.io (.+) not found",
110
+ "replacement": "虚拟机备份目标 $1 未发现"
111
+ },
112
+ {
113
+ "pattern": "vlanconfig does not span (.+)",
114
+ "replacement": "VLAN 配置无法跨越 $1 "
115
+ },
116
+ {
117
+ "pattern": "storage class (.+) is used by virtual machine images: (.+)",
118
+ "replacement": "虚拟机存储池 $1 正在被虚拟机镜像使用"
119
+ },
120
+ {
121
+ "pattern": "(.+) delete pool before releasing all the allocated ip",
122
+ "replacement": "$1 在释放所有分配的IP之前删除池"
123
+ },
124
+ {
125
+ "pattern": "can't create ip pool (.+) because the ranges (.+) overlap with other pools",
126
+ "replacement": "地址池 $1 创建失败,因为区间与其他地址池重叠"
127
+ },
128
+ {
129
+ "pattern": "update (.+) failed: (.+) change the ipam from (.+) to (.+)",
130
+ "replacement": "更新 $1 失败:$2 将IP地址管理从 $3 修改为 $4"
131
+ },
132
+ {
133
+ "pattern": "the (.+) snapshot is already existent. (.+)",
134
+ "replacement": "快照 $1 已存在。$2"
135
+ },
136
+ {
137
+ "pattern": "failed to create vm backup(.+) error: the (.+) backup is already existent. (.+)",
138
+ "replacement": "创建虚拟机快照失败。原因:快照 $2 已存在。$3"
139
+ },
140
+ {
141
+ "pattern": "virtualmachinetemplates.cloudhci.io (.+) already exists",
142
+ "replacement": "虚拟机模版 $1 已存在"
143
+ },
144
+ {
145
+ "pattern": "virtualmachinetemplates.harvesterhci.io (.+) already exists",
146
+ "replacement": "虚拟机模版 $1 已存在"
147
+ },
148
+ {
149
+ "pattern": "keypairid (.+) is invalid, keypairs.harvesterhci.io (.+) not found",
150
+ "replacement": "密钥无效,密钥 $2 不存在。"
151
+ },
152
+ {
153
+ "pattern": "keypairid (.+) is invalid, keypairs.cloudhci.io (.+) not found",
154
+ "replacement": "密钥无效,密钥 $2 不存在。"
155
+ },
156
+ {
157
+ "pattern": "could not delete cluster network (.+) because vlanconfig\\(s\\) (.+) under this clusternetwork is/are still exist\\(s\\)",
158
+ "replacement": "无法删除集群网络 $1,因为这个集群网络还存在vlan配置 $2"
159
+ },
160
+ {
161
+ "pattern": "could not delete vlanconfig (.+) because it's blocked by vm\\(s\\) (.+) which must be stopped at first",
162
+ "replacement": "无法删除vlan配置 $1,正在被虚拟机 $2 使用,请先停止使用"
163
+ },
164
+ {
165
+ "pattern": "failed to append custom certificates: (.+)",
166
+ "replacement": "追加自定义证书失败:$1"
167
+ },
168
+ {
169
+ "pattern": "(.+) rscm.svg exceeds the file size limit of (.+) bytes",
170
+ "replacement": "svg图标文件大小超过了 $2 字节"
171
+ },
172
+ {
173
+ "pattern": "listener.spec.listeners.backendport",
174
+ "replacement": "后端监听端口"
175
+ },
176
+ {
177
+ "pattern": "listener.spec.listeners.port",
178
+ "replacement": "监听端口"
179
+ },
180
+ {
181
+ "pattern": "unable to complete request: stop/start already underway",
182
+ "replacement": "无法完成请求:停止/启动已在进行中"
183
+ },
184
+ {
185
+ "pattern": "no running backend servers",
186
+ "replacement": "没有运行的后端服务器"
187
+ },
188
+ {
189
+ "pattern": "cannot unmarshal number into(.*?)of type string",
190
+ "replacement": "不能数字开头和纯数字"
191
+ },
192
+ {
193
+ "pattern": "%harvester.virtualmachine.volume.vmimagevolumetip",
194
+ "replacement": "磁盘大小不能小于镜像规格"
195
+ },
196
+ {
197
+ "pattern": "is not live migratable as it is already in a migrating state",
198
+ "replacement": "已经处于迁移状态,无法实时迁移"
199
+ },
200
+ {
201
+ "pattern": "in-flight migration detected. active migration job",
202
+ "replacement": "检测到正在进行的迁移。活动迁移作业"
203
+ },
204
+ {
205
+ "pattern": "is currently already in progress for vmi",
206
+ "replacement": "目前已在虚拟机运行"
207
+ },
208
+ {
209
+ "pattern": "because it's still used by vm(s)",
210
+ "replacement": "因为正在被虚拟机使用:"
211
+ },
212
+ {
213
+ "pattern": "The VM is not in migrating state",
214
+ "replacement": "虚拟机未处于迁移状态"
215
+ },
216
+ {
217
+ "pattern": "can't enable maintenance mode or cordon on the last available node",
218
+ "replacement": "无法启用维护模式或在最后一个可用节点上封锁"
219
+ },
220
+ {
221
+ "pattern": "single controlplane cluster, cannot place controlplane in maintenance mode",
222
+ "replacement": "单个控制平面集群,无法将控制平面置于维护模式"
223
+ },
224
+
225
+ {
226
+ "pattern": "setting is not set",
227
+ "replacement": "配置项未设置"
228
+ },
3
229
  {
4
230
  "pattern": "contains cd-rom or container disk",
5
231
  "replacement": "含有cd-rom或硬盘"
@@ -34,8 +260,13 @@
34
260
  },
35
261
  {
36
262
  "pattern": "containers with unready status",
37
- "replacement": "未就绪状态"
263
+ "replacement": "虚拟机容器未就绪"
38
264
  },
265
+ {
266
+ "pattern": "status of pod readiness gate.*kubevirt.io/virtual-machine-unpaused",
267
+ "replacement": "只有当虚拟机处于运行状态(非暂停)时,才能进行暂停操作"
268
+ },
269
+
39
270
  {
40
271
  "pattern": "cannot unmarshal number into.*of type string",
41
272
  "replacement": "不能数字开头和纯数字"
@@ -90,7 +321,7 @@
90
321
  },
91
322
  {
92
323
  "pattern": "guest vm is not reported as running",
93
- "replacement": "guest未上报虚拟机为running状态"
324
+ "replacement": "虚拟机当前状态未上报为运行中"
94
325
  },
95
326
  {
96
327
  "pattern": "vmi does not exist",
@@ -136,14 +367,6 @@
136
367
  "pattern": "internal error occurred",
137
368
  "replacement": "内部错误"
138
369
  },
139
- {
140
- "pattern": "a lowercase rfc 1123 subdomain must consist of lower case alphanumeric characters",
141
- "replacement": "必须由小写字母数字字符"
142
- },
143
- {
144
- "pattern": "and must start and end with an alphanumeric character",
145
- "replacement": "并且必须以字母数字字符开头和结尾"
146
- },
147
370
  {
148
371
  "pattern": "regex used for validation is",
149
372
  "replacement": "用于验证的正则表达式为"
@@ -426,7 +649,7 @@
426
649
  },
427
650
  {
428
651
  "pattern": "the following vms cannot be migrated due to cdromorcontainerdiskpresent condition",
429
- "replacement": "因为CDRom或虚拟磁盘的状态,以下虚拟机无法迁移"
652
+ "replacement": "因为CDRom或虚拟磁盘的状态,以下虚拟机无法迁移"
430
653
  },
431
654
  {
432
655
  "pattern": "the object has been modified",
@@ -512,10 +735,6 @@
512
735
  "pattern": "to be ready",
513
736
  "replacement": "变成ready状态"
514
737
  },
515
- {
516
- "pattern": "nodes are available",
517
- "replacement": "节点是可用的"
518
- },
519
738
  {
520
739
  "pattern": "is not helpful for scheduling",
521
740
  "replacement": "对调度没有帮助"
@@ -560,30 +779,58 @@
560
779
  "pattern": "which exporting for image",
561
780
  "replacement": "正在被导入为镜像"
562
781
  },
782
+ {
783
+ "pattern": "spec.template.spec.hostname",
784
+ "replacement": "虚拟机名称"
785
+ },
563
786
  {
564
787
  "pattern": "loadbalancer.loadbalancer.harvesterhci.io",
565
788
  "replacement": "负载均衡器"
566
789
  },
790
+ {
791
+ "pattern": "loadbalancer.loadbalancer.cloudhci.io",
792
+ "replacement": "负载均衡器"
793
+ },
567
794
  {
568
795
  "pattern": "loadbalancers.loadbalancer.harvesterhci.io",
569
796
  "replacement": "负载均衡器"
570
797
  },
798
+ {
799
+ "pattern": "loadbalancers.loadbalancer.cloudhci.io",
800
+ "replacement": "负载均衡器"
801
+ },
571
802
  {
572
803
  "pattern": "virtualmachineimages.harvesterhci.io",
573
804
  "replacement": "虚拟机镜像"
574
805
  },
806
+ {
807
+ "pattern": "virtualmachineimages.cloudhci.io",
808
+ "replacement": "虚拟机镜像"
809
+ },
575
810
  {
576
811
  "pattern": "ippools.loadbalancer.harvesterhci.io",
577
812
  "replacement": "地址池"
578
813
  },
814
+ {
815
+ "pattern": "ippools.loadbalancer.cloudhci.io",
816
+ "replacement": "地址池"
817
+ },
579
818
  {
580
819
  "pattern": "virtualmachinebackup.harvesterhci.io",
581
820
  "replacement": "虚拟机备份"
582
821
  },
822
+ {
823
+ "pattern": "virtualmachinebackup.cloudhci.io",
824
+ "replacement": "虚拟机备份"
825
+ },
583
826
  {
584
827
  "pattern": "vlanconfigs.network.harvesterhci.io",
585
828
  "replacement": "集群网络"
586
829
  },
830
+ {
831
+ "pattern": "vlanconfigs.network.cloudhci.io",
832
+ "replacement": "集群网络"
833
+ },
587
834
  {
588
835
  "pattern": "persistentvolumeclaims",
589
836
  "replacement": "虚拟磁盘"
@@ -616,14 +863,26 @@
616
863
  "pattern": "clusternetwork.network.harvesterhci.io",
617
864
  "replacement": "集群网络"
618
865
  },
866
+ {
867
+ "pattern": "clusternetwork.network.cloudhci.io",
868
+ "replacement": "集群网络"
869
+ },
619
870
  {
620
871
  "pattern": "virtualmachinetemplate.harvesterhci.io",
621
872
  "replacement": "虚拟机模版"
622
873
  },
874
+ {
875
+ "pattern": "virtualmachinetemplate.cloudhci.io",
876
+ "replacement": "虚拟机模版"
877
+ },
623
878
  {
624
879
  "pattern": "schedulevmbackup.harvesterhci.io",
625
880
  "replacement": "虚拟机备份策略"
626
881
  },
882
+ {
883
+ "pattern": "schedulevmbackup.cloudhci.io",
884
+ "replacement": "虚拟机备份策略"
885
+ },
627
886
  {
628
887
  "pattern": "spec.retain",
629
888
  "replacement": "保存数量"
@@ -656,10 +915,18 @@
656
915
  "pattern": "keypair.harvesterhci.io",
657
916
  "replacement": "密钥"
658
917
  },
918
+ {
919
+ "pattern": "keypair.cloudhci.io",
920
+ "replacement": "密钥"
921
+ },
659
922
  {
660
923
  "pattern": "keypairs.harvesterhci.io",
661
924
  "replacement": "密钥"
662
925
  },
926
+ {
927
+ "pattern": "keypairs.cloudhci.io",
928
+ "replacement": "密钥"
929
+ },
663
930
  {
664
931
  "pattern": "spec.publickey",
665
932
  "replacement": "密钥名称"
@@ -688,6 +955,10 @@
688
955
  "pattern": "schedulevmbackups.harvesterhci.io",
689
956
  "replacement": "备份策略"
690
957
  },
958
+ {
959
+ "pattern": "schedulevmbackups.cloudhci.io",
960
+ "replacement": "备份策略"
961
+ },
691
962
  {
692
963
  "pattern": "already exists",
693
964
  "replacement": "已存在"
@@ -736,6 +1007,10 @@
736
1007
  "pattern": "message:",
737
1008
  "replacement": "详情:"
738
1009
  },
1010
+ {
1011
+ "pattern": "persistentvolumeclaim",
1012
+ "replacement": "虚拟磁盘"
1013
+ },
739
1014
  {
740
1015
  "pattern": "volume",
741
1016
  "replacement": "虚拟磁盘"
@@ -752,13 +1027,154 @@
752
1027
  "pattern": "under this clusternetwork is/are still exist(s)",
753
1028
  "replacement": "依然存在于这个集群网络下"
754
1029
  },
1030
+
1031
+ {
1032
+ "pattern": "container disk",
1033
+ "replacement": "磁盘"
1034
+ },
1035
+ {
1036
+ "pattern": ".backendport",
1037
+ "replacement": "后端端口"
1038
+ },
1039
+ {
1040
+ "pattern": ".port",
1041
+ "replacement": "端口"
1042
+ },
1043
+ {
1044
+ "pattern": "cpumanager",
1045
+ "replacement": " CPU管理器"
1046
+ },
1047
+ {
1048
+ "pattern": "cpu manager",
1049
+ "replacement": " CPU管理器"
1050
+ },
1051
+ {
1052
+ "pattern": "runstategy ",
1053
+ "replacement": "运行策略"
1054
+ },
1055
+ {
1056
+ "pattern": "network error",
1057
+ "replacement": "网络异常"
1058
+ },
1059
+
1060
+ {
1061
+ "pattern": "in error state",
1062
+ "replacement": "处于错误状态"
1063
+ },
1064
+ {
1065
+ "pattern": "cannot undercommit",
1066
+ "replacement": "无法提交"
1067
+ },
1068
+ {
1069
+ "pattern": "kubelet stopped posting node status",
1070
+ "replacement": "集群已停止发布节点状态"
1071
+ },
1072
+ {
1073
+ "pattern": "could not delete vlanConfig",
1074
+ "replacement": "不能删除集群网络"
1075
+ },
1076
+ {
1077
+ "pattern": "is still attached",
1078
+ "replacement": "还在使用中"
1079
+ },
1080
+ {
1081
+ "pattern": "because storage network nad",
1082
+ "replacement": "因为集群网络"
1083
+ },
1084
+ {
1085
+ "pattern": "is still in use by",
1086
+ "replacement": "正在使用中:"
1087
+ },
1088
+ {
1089
+ "pattern": "please stop all vms before configuring the storage-network setting",
1090
+ "replacement": "请先关闭所有虚拟机在配置storage-network前"
1091
+ },
1092
+ {
1093
+ "pattern": "unable to parse quantity's suffix",
1094
+ "replacement": "无法格式化数值后缀"
1095
+ },
1096
+ {
1097
+ "pattern": "schedule granularity 1m0s less than 1h0m0s",
1098
+ "replacement": "策略执行间隔应大于1小时"
1099
+ },
1100
+ {
1101
+ "pattern": "already has backup schedule",
1102
+ "replacement": "已有备份策略"
1103
+ },
1104
+ {
1105
+ "pattern": "the vm is not migratable",
1106
+ "replacement": "这个虚拟机是不可迁移的"
1107
+ },
1108
+ {
1109
+ "pattern": "is in migration",
1110
+ "replacement": "正在迁移中"
1111
+ },
1112
+
1113
+ {
1114
+ "pattern": "which must be stopped at first",
1115
+ "replacement": "请先停止使用"
1116
+ },
1117
+ {
1118
+ "pattern": "range should be subnet cidr",
1119
+ "replacement": "IP范围应该是子网CIDR"
1120
+ },
1121
+ {
1122
+ "pattern": "can't find volumesnapshotsclass longhorn for csi driver driver.longhorn.io",
1123
+ "replacement": "找不到磁盘快照驱动longhorn"
1124
+ },
1125
+ {
1126
+ "pattern": "live migration requires that all pvcs must be shared",
1127
+ "replacement": "热迁移要求所有磁盘必须是共享的"
1128
+ },
1129
+ {
1130
+ "pattern": "using readwritemany access mode",
1131
+ "replacement": "采用多读写访问模式"
1132
+ },
1133
+ {
1134
+ "pattern": "code = internal desc = waitforsnapshotobeready",
1135
+ "replacement": ""
1136
+ },
1137
+ {
1138
+ "pattern": "rpc error:",
1139
+ "replacement": "错误:",
1140
+ "isGlobal": true
1141
+ },
1142
+ {
1143
+ "pattern": "disksnotlivemigratable",
1144
+ "replacement": "磁盘不支持热迁移",
1145
+ "isGlobal": true
1146
+ },
1147
+ {
1148
+ "pattern": "is not shared",
1149
+ "replacement": "不是共享的",
1150
+ "isGlobal": true
1151
+ },
1152
+ {
1153
+ "pattern": "failed to update device mount",
1154
+ "replacement": "更新设备挂载失败",
1155
+ "isGlobal": true
1156
+ },
1157
+ {
1158
+ "pattern": "failed to execute",
1159
+ "replacement": "执行命令失败",
1160
+ "isGlobal": true
1161
+ },
1162
+ {
1163
+ "pattern": "target is busy",
1164
+ "replacement": "目标繁忙",
1165
+ "isGlobal": true
1166
+ },
1167
+ {
1168
+ "pattern": "invalidbodycontent 422:",
1169
+ "replacement": ","
1170
+ },
755
1171
  {
756
1172
  "pattern": "can't ",
757
1173
  "replacement": "不能"
758
1174
  },
759
1175
  {
760
1176
  "pattern": "could not",
761
- "replacement": "不能"
1177
+ "replacement": "无法"
762
1178
  },
763
1179
  {
764
1180
  "pattern": "cannot",
@@ -885,32 +1301,36 @@
885
1301
  "replacement": "参数"
886
1302
  },
887
1303
  {
888
- "pattern": "container disk",
889
- "replacement": "磁盘"
1304
+ "pattern": "disksize",
1305
+ "replacement": "磁盘大小"
890
1306
  },
891
1307
  {
892
- "pattern": ".port",
893
- "replacement": "端口"
1308
+ "pattern": "imagevirtualsize",
1309
+ "replacement": "镜像规格"
894
1310
  },
895
1311
  {
896
- "pattern": "cpumanager",
897
- "replacement": " CPU管理器"
1312
+ "pattern": "harvester",
1313
+ "replacement": "cloud"
898
1314
  },
899
1315
  {
900
- "pattern": "cpu manager",
901
- "replacement": " CPU管理器"
1316
+ "pattern": "error:",
1317
+ "replacement": "错误:"
902
1318
  },
903
1319
  {
904
- "pattern": "runstategy ",
905
- "replacement": "运行策略"
1320
+ "pattern": "json:",
1321
+ "replacement": ""
906
1322
  },
907
1323
  {
908
- "pattern": "network error",
909
- "replacement": "网络异常"
1324
+ "pattern": "监听",
1325
+ "replacement": "监听参数有误"
910
1326
  },
911
1327
  {
912
- "pattern": "harvester",
913
- "replacement": "cloud"
1328
+ "pattern": ""备份" 是必填项。",
1329
+ "replacement": "\"快照/备份\" 是必填项"
1330
+ },
1331
+ {
1332
+ "pattern": "%",
1333
+ "replacement": ""
914
1334
  }
915
1335
  ]
916
1336
  }
package/utils/object.js CHANGED
@@ -474,7 +474,8 @@ export function deepToRaw(obj, cache = new WeakSet()) {
474
474
  }
475
475
 
476
476
  /**
477
- * Helper function to alter Lodash merge function default behaviour on merging arrays while updating machine pool configuration.
477
+ * Helper function to alter Lodash merge function default behaviour on merging
478
+ * arrays and objects.
478
479
  *
479
480
  * In rke2.vue, the syncMachineConfigWithLatest function updates machine pool configuration by
480
481
  * merging the latest configuration received from the backend with the current configuration updated by the user.
@@ -486,16 +487,55 @@ export function deepToRaw(obj, cache = new WeakSet()) {
486
487
  * merge(lastSavedConfigFromBE, currentConfigByUser); // returns { a: ["test"] }; but we expect { a: [] };
487
488
  *
488
489
  * More info: https://github.com/lodash/lodash/issues/1313
489
- *
490
+
490
491
  * This helper function addresses the issue by always replacing the old array with the new array during the merge process.
491
492
  *
492
- * This helper is used for another case in rke2.vue to handle merging addon chart default values with the user's current values.
493
+ * This helper is also used for another case in rke2.vue to handle merging addon chart default values with the user's current values.
493
494
  * It fixed https://github.com/rancher/dashboard/issues/12418
495
+ *
496
+ * If `mutateOriginal` is true, the merge is done directly into `obj1` (mutating it).
497
+ * This is useful in cases like:
498
+ * machinePool.config = mergeWithReplace(clonedLatestConfig, clonedCurrentConfig, { mutateOriginal: true })
499
+ * where merging into a new empty object may lead to incomplete structure.
500
+ *
501
+ * Use `mutateOriginal` when you want to preserve obj1’s original shape, references,
502
+ * or when assigning the result directly to an existing object.
503
+ *
504
+ * @param {Object} [obj1={}] - The first object to merge
505
+ * @param {Object} [obj2={}] - The second object to merge
506
+ * @param {Object} [options={}] - Options for customizing merge behavior
507
+ * @param {boolean} [options.mutateOriginal=false] - true: mutates obj1
508
+ * directly. false: returns a new object
509
+ * @param {boolean} [options.replaceArray=true] - true: replaces arrays in obj1
510
+ * with arrays in obj2 when both properties are arrays
511
+ * false: default lodash merge behavior - recursively merges
512
+ * array members
513
+ * @param {boolean} [options.replaceObjectProps=false] - true: merges objects in
514
+ * obj1 with objects in obj2, overwriting duplicate props
515
+ * false: default lodash merge behavior - recursively merges
516
+ * object props
494
517
  */
495
- export function mergeWithReplaceArrays(obj1 = {}, obj2 = {}) {
496
- return mergeWith(obj1, obj2, (obj1Value, obj2Value) => {
497
- if (Array.isArray(obj1Value) && Array.isArray(obj2Value)) {
518
+ export function mergeWithReplace(
519
+ obj1 = {},
520
+ obj2 = {},
521
+ {
522
+ mutateOriginal = false,
523
+ replaceArray = true,
524
+ replaceObjectProps = false,
525
+ } = {}
526
+ ) {
527
+ const destination = mutateOriginal ? obj1 : {};
528
+
529
+ return mergeWith(destination, obj1, obj2, (obj1Value, obj2Value) => {
530
+ if (replaceArray && Array.isArray(obj1Value) && Array.isArray(obj2Value)) {
498
531
  return obj2Value;
499
532
  }
533
+
534
+ if (replaceObjectProps && isObject(obj1Value) && isObject(obj2Value)) {
535
+ return {
536
+ ...obj1Value,
537
+ ...obj2Value,
538
+ };
539
+ }
500
540
  });
501
541
  }