@rancher/shell 3.0.7 → 3.0.8-rc.10

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 (375) hide show
  1. package/assets/brand/suse/banner.svg +1 -0
  2. package/assets/brand/suse/dark/banner.svg +1 -0
  3. package/assets/brand/suse/dark/login-landscape.svg +1 -0
  4. package/assets/brand/suse/dark/rancher-logo.svg +1 -1
  5. package/assets/brand/suse/favicon.png +0 -0
  6. package/assets/brand/suse/login-landscape.svg +1 -0
  7. package/assets/brand/suse/metadata.json +11 -1
  8. package/assets/brand/suse/rancher-logo.svg +1 -1
  9. package/assets/fonts/suse/suse-v2-latin-300.woff +0 -0
  10. package/assets/fonts/suse/suse-v2-latin-300.woff2 +0 -0
  11. package/assets/fonts/suse/suse-v2-latin-600.woff +0 -0
  12. package/assets/fonts/suse/suse-v2-latin-600.woff2 +0 -0
  13. package/assets/fonts/suse/suse-v2-latin-700.woff +0 -0
  14. package/assets/fonts/suse/suse-v2-latin-700.woff2 +0 -0
  15. package/assets/fonts/suse/suse-v2-latin-800.woff +0 -0
  16. package/assets/fonts/suse/suse-v2-latin-800.woff2 +0 -0
  17. package/assets/fonts/suse/suse-v2-latin-regular.woff +0 -0
  18. package/assets/fonts/suse/suse-v2-latin-regular.woff2 +0 -0
  19. package/assets/images/content/README.md +5 -0
  20. package/assets/images/content/cloud-native.svg +84 -0
  21. package/assets/images/content/dark/cloud-native.svg +21 -0
  22. package/assets/images/content/dark/shield.svg +59 -0
  23. package/assets/images/content/dark/suse.svg +10 -0
  24. package/assets/images/content/shield.svg +59 -0
  25. package/assets/images/content/suse.svg +10 -0
  26. package/assets/images/vendor/githubapp.svg +13 -0
  27. package/assets/styles/base/_typography.scss +2 -1
  28. package/assets/styles/fonts/_fontstack.scss +53 -1
  29. package/assets/styles/global/_cards.scss +0 -3
  30. package/assets/styles/global/_layout.scss +21 -35
  31. package/assets/styles/themes/_dark.scss +1 -1
  32. package/assets/styles/themes/_light.scss +1 -1
  33. package/assets/styles/themes/_modern.scss +16 -8
  34. package/assets/styles/themes/_suse.scss +116 -24
  35. package/assets/translations/en-us.yaml +185 -21
  36. package/assets/translations/zh-hans.yaml +0 -4
  37. package/components/AutoscalerCard.vue +113 -0
  38. package/components/AutoscalerTab.vue +94 -0
  39. package/components/BackLink.vue +8 -0
  40. package/components/BannerGraphic.vue +36 -21
  41. package/components/BrandImage.vue +17 -6
  42. package/components/ClusterIconMenu.vue +1 -1
  43. package/components/ClusterProviderIcon.vue +1 -1
  44. package/components/Cron/CronExpressionEditor.vue +1 -1
  45. package/components/Cron/CronExpressionEditorModal.vue +1 -1
  46. package/components/Drawer/Chrome.vue +2 -6
  47. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +4 -9
  48. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +3 -8
  49. package/components/Drawer/ResourceDetailDrawer/composables.ts +3 -4
  50. package/components/Drawer/ResourceDetailDrawer/index.vue +4 -9
  51. package/components/Drawer/ResourceDetailDrawer/types.ts +17 -0
  52. package/components/Drawer/types.ts +3 -0
  53. package/components/DynamicContent/DynamicContentBanner.vue +102 -0
  54. package/components/DynamicContent/DynamicContentCloseButton.vue +42 -0
  55. package/components/DynamicContent/DynamicContentIcon.vue +132 -0
  56. package/components/DynamicContent/DynamicContentPanel.vue +112 -0
  57. package/components/DynamicContent/content.ts +78 -0
  58. package/components/EmberPage.vue +1 -1
  59. package/components/IconOrSvg.vue +2 -2
  60. package/components/Inactivity.vue +222 -106
  61. package/components/InstallHelmCharts.vue +2 -2
  62. package/components/PaginatedResourceTable.vue +2 -6
  63. package/components/PopoverCard.vue +192 -0
  64. package/components/Questions/__tests__/index.test.ts +159 -0
  65. package/components/Resource/Detail/CopyToClipboard.vue +4 -1
  66. package/components/Resource/Detail/FetchLoader/composables.ts +18 -4
  67. package/components/Resource/Detail/Metadata/Annotations/index.vue +2 -2
  68. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +1 -1
  69. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +4 -0
  70. package/components/Resource/Detail/Metadata/KeyValueRow.vue +1 -1
  71. package/components/Resource/Detail/Metadata/Labels/index.vue +2 -2
  72. package/components/Resource/Detail/Metadata/composables.ts +9 -9
  73. package/components/Resource/Detail/Metadata/index.vue +3 -3
  74. package/components/Resource/Detail/ResourcePopover/ResourcePopoverCard.vue +2 -19
  75. package/components/Resource/Detail/ResourcePopover/__tests__/ResourcePopoverCard.test.ts +0 -29
  76. package/components/Resource/Detail/ResourcePopover/__tests__/index.test.ts +132 -150
  77. package/components/Resource/Detail/ResourcePopover/index.vue +54 -159
  78. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +0 -2
  79. package/components/Resource/Detail/TitleBar/composables.ts +2 -1
  80. package/components/Resource/Detail/TitleBar/index.vue +10 -6
  81. package/components/Resource/Detail/composables.ts +12 -0
  82. package/components/ResourceDetail/Masthead/latest.vue +29 -0
  83. package/components/ResourceDetail/index.vue +5 -2
  84. package/components/ResourceList/Masthead.vue +1 -1
  85. package/components/SortableTable/index.vue +18 -2
  86. package/components/Tabbed/__tests__/index.test.ts +86 -0
  87. package/components/{nav/WindowManager → Window}/ContainerLogs.vue +1 -1
  88. package/components/{nav/WindowManager → Window}/ContainerLogsActions.vue +1 -0
  89. package/components/{nav/WindowManager → Window}/__tests__/ContainerLogs.test.ts +1 -1
  90. package/components/{nav/WindowManager → Window}/__tests__/ContainerShell.test.ts +2 -2
  91. package/components/__tests__/AutoscalerCard.test.ts +154 -0
  92. package/components/__tests__/AutoscalerTab.test.ts +125 -0
  93. package/components/__tests__/PopoverCard.test.ts +204 -0
  94. package/components/auth/SelectPrincipal.vue +24 -6
  95. package/components/auth/__tests__/SelectPrincipal.test.ts +119 -0
  96. package/components/fleet/FleetConfigMapSelector.vue +117 -0
  97. package/components/fleet/FleetSecretSelector.vue +127 -0
  98. package/components/fleet/__tests__/FleetConfigMapSelector.test.ts +125 -0
  99. package/components/fleet/__tests__/FleetSecretSelector.test.ts +82 -0
  100. package/components/form/FileImageSelector.vue +13 -4
  101. package/components/form/FileSelector.vue +11 -2
  102. package/components/form/ResourceLabeledSelect.vue +1 -0
  103. package/components/form/__tests__/ResourceLabeledSelect.test.ts +90 -0
  104. package/components/formatter/Autoscaler.vue +97 -0
  105. package/components/formatter/InternalExternalIP.vue +198 -24
  106. package/components/formatter/__tests__/Autoscaler.test.ts +156 -0
  107. package/components/formatter/__tests__/InternalExternalIP.test.ts +133 -0
  108. package/components/google/util/__tests__/formatter.test.ts +47 -0
  109. package/components/google/util/formatter.ts +5 -2
  110. package/components/nav/Group.vue +12 -3
  111. package/components/nav/Header.vue +37 -16
  112. package/components/nav/NamespaceFilter.vue +13 -1
  113. package/components/nav/NotificationCenter/index.vue +2 -1
  114. package/components/nav/TopLevelMenu.helper.ts +16 -6
  115. package/components/nav/TopLevelMenu.vue +4 -2
  116. package/components/{DraggableZone.vue → nav/WindowManager/PinArea.vue} +47 -80
  117. package/components/nav/WindowManager/composables/useComponentsMount.ts +70 -0
  118. package/components/nav/WindowManager/composables/useDimensionsHandler.ts +105 -0
  119. package/components/nav/WindowManager/composables/useDragHandler.ts +99 -0
  120. package/components/nav/WindowManager/composables/usePanelHandler.ts +72 -0
  121. package/components/nav/WindowManager/composables/usePanelsHandler.ts +14 -0
  122. package/components/nav/WindowManager/composables/useResizeHandler.ts +167 -0
  123. package/components/nav/WindowManager/composables/useTabsHandler.ts +51 -0
  124. package/components/nav/WindowManager/constants.ts +23 -0
  125. package/components/nav/WindowManager/index.vue +61 -575
  126. package/components/nav/WindowManager/panels/HorizontalPanel.vue +265 -0
  127. package/components/nav/WindowManager/panels/TabBodyContainer.vue +39 -0
  128. package/components/nav/WindowManager/panels/VerticalPanel.vue +308 -0
  129. package/components/templates/default.vue +4 -40
  130. package/components/templates/home.vue +31 -5
  131. package/components/templates/plain.vue +30 -4
  132. package/components/templates/standalone.vue +1 -1
  133. package/composables/useI18n.ts +10 -1
  134. package/composables/useInterval.ts +15 -0
  135. package/config/__test__/uiplugins.test.ts +309 -0
  136. package/config/labels-annotations.js +9 -1
  137. package/config/product/auth.js +1 -0
  138. package/config/product/explorer.js +3 -1
  139. package/config/product/manager.js +20 -9
  140. package/config/query-params.js +1 -0
  141. package/config/router/routes.js +10 -2
  142. package/config/settings.ts +10 -2
  143. package/config/store.js +4 -2
  144. package/config/table-headers.js +8 -0
  145. package/config/types.js +11 -0
  146. package/config/uiplugins.js +46 -2
  147. package/config/version.js +1 -1
  148. package/core/__test__/extension-manager-impl.test.js +236 -0
  149. package/core/extension-manager-impl.js +23 -6
  150. package/core/plugin-helpers.ts +2 -0
  151. package/core/types-provisioning.ts +4 -1
  152. package/detail/pod.vue +1 -0
  153. package/detail/provisioning.cattle.io.cluster.vue +13 -1
  154. package/dialog/AddonConfigConfirmationDialog.vue +45 -1
  155. package/dialog/DeveloperLoadExtensionDialog.vue +12 -3
  156. package/dialog/RollbackWorkloadDialog.vue +2 -5
  157. package/directives/ui-context.ts +103 -0
  158. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +52 -11
  159. package/edit/auth/AuthProviderWarningBanners.vue +14 -1
  160. package/edit/auth/__tests__/oidc.test.ts +26 -0
  161. package/edit/auth/github-app-steps.vue +97 -0
  162. package/edit/auth/github-steps.vue +75 -0
  163. package/edit/auth/github.vue +99 -65
  164. package/edit/auth/oidc.vue +5 -1
  165. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -0
  166. package/edit/cloudcredential.vue +1 -1
  167. package/edit/configmap.vue +1 -0
  168. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  169. package/edit/fleet.cattle.io.gitrepo.vue +0 -10
  170. package/edit/fleet.cattle.io.helmop.vue +51 -2
  171. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  172. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  173. package/edit/logging-flow/index.vue +1 -0
  174. package/edit/logging.banzaicloud.io.output/index.vue +1 -0
  175. package/edit/management.cattle.io.fleetworkspace.vue +1 -1
  176. package/edit/management.cattle.io.project.vue +1 -0
  177. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +4 -1
  178. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +2 -1
  179. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  180. package/edit/monitoring.coreos.com.receiver/index.vue +2 -1
  181. package/edit/monitoring.coreos.com.route.vue +1 -1
  182. package/edit/namespace.vue +1 -0
  183. package/edit/networking.istio.io.destinationrule/index.vue +1 -0
  184. package/edit/networking.k8s.io.ingress/index.vue +1 -0
  185. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +15 -5
  186. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +1 -0
  187. package/edit/networking.k8s.io.networkpolicy/index.vue +1 -0
  188. package/edit/node.vue +1 -0
  189. package/edit/persistentvolume/index.vue +27 -22
  190. package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +13 -14
  191. package/edit/persistentvolume/plugins/azureDisk.vue +49 -48
  192. package/edit/persistentvolume/plugins/azureFile.vue +15 -14
  193. package/edit/persistentvolume/plugins/cephfs.vue +15 -14
  194. package/edit/persistentvolume/plugins/cinder.vue +15 -14
  195. package/edit/persistentvolume/plugins/csi.vue +18 -16
  196. package/edit/persistentvolume/plugins/fc.vue +13 -14
  197. package/edit/persistentvolume/plugins/flexVolume.vue +15 -14
  198. package/edit/persistentvolume/plugins/flocker.vue +1 -3
  199. package/edit/persistentvolume/plugins/gcePersistentDisk.vue +13 -14
  200. package/edit/persistentvolume/plugins/glusterfs.vue +15 -14
  201. package/edit/persistentvolume/plugins/hostPath.vue +40 -39
  202. package/edit/persistentvolume/plugins/iscsi.vue +13 -14
  203. package/edit/persistentvolume/plugins/local.vue +1 -3
  204. package/edit/persistentvolume/plugins/longhorn.vue +23 -22
  205. package/edit/persistentvolume/plugins/nfs.vue +15 -14
  206. package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -14
  207. package/edit/persistentvolume/plugins/portworxVolume.vue +15 -14
  208. package/edit/persistentvolume/plugins/quobyte.vue +15 -14
  209. package/edit/persistentvolume/plugins/rbd.vue +15 -14
  210. package/edit/persistentvolume/plugins/scaleIO.vue +15 -14
  211. package/edit/persistentvolume/plugins/storageos.vue +15 -14
  212. package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -3
  213. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +32 -5
  214. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +35 -0
  215. package/edit/provisioning.cattle.io.cluster/__tests__/Networking.test.ts +155 -0
  216. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +11 -9
  217. package/edit/provisioning.cattle.io.cluster/index.vue +25 -15
  218. package/edit/provisioning.cattle.io.cluster/rke2.vue +98 -17
  219. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +28 -2
  220. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +107 -5
  221. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +92 -4
  222. package/edit/secret/index.vue +1 -1
  223. package/edit/service.vue +9 -4
  224. package/edit/serviceaccount.vue +1 -0
  225. package/edit/storage.k8s.io.storageclass/index.vue +1 -0
  226. package/edit/workload/index.vue +2 -1
  227. package/edit/workload/mixins/workload.js +1 -1
  228. package/initialize/App.vue +4 -4
  229. package/initialize/install-directives.js +2 -0
  230. package/initialize/install-plugins.js +19 -2
  231. package/list/projectsecret.vue +1 -1
  232. package/list/provisioning.cattle.io.cluster.vue +15 -2
  233. package/machine-config/amazonec2.vue +42 -135
  234. package/machine-config/azure.vue +1 -1
  235. package/machine-config/components/EC2Networking.vue +490 -0
  236. package/machine-config/components/__tests__/EC2Networking.test.ts +148 -0
  237. package/machine-config/components/__tests__/utils/vpcSubnetMockData.js +294 -0
  238. package/machine-config/digitalocean.vue +11 -0
  239. package/machine-config/google.vue +1 -1
  240. package/mixins/__tests__/brand.spec.ts +2 -2
  241. package/mixins/__tests__/chart.test.ts +21 -0
  242. package/mixins/brand.js +1 -7
  243. package/mixins/chart.js +8 -2
  244. package/mixins/create-edit-view/index.js +5 -0
  245. package/models/__tests__/chart.test.ts +49 -12
  246. package/models/__tests__/compliance.cattle.io.clusterscanprofile.spec.js +30 -0
  247. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +112 -5
  248. package/models/catalog.cattle.io.app.js +1 -1
  249. package/models/chart.js +28 -14
  250. package/models/cluster/node.js +13 -6
  251. package/models/cluster.x-k8s.io.machine.js +10 -20
  252. package/models/cluster.x-k8s.io.machinedeployment.js +5 -1
  253. package/models/compliance.cattle.io.clusterscanprofile.js +1 -1
  254. package/models/management.cattle.io.authconfig.js +1 -0
  255. package/models/management.cattle.io.cluster.js +21 -3
  256. package/models/management.cattle.io.kontainerdriver.js +1 -0
  257. package/models/provisioning.cattle.io.cluster.js +249 -33
  258. package/package.json +6 -5
  259. package/pages/auth/login.vue +43 -4
  260. package/pages/auth/verify.vue +1 -1
  261. package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +3 -2
  262. package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +135 -0
  263. package/pages/c/_cluster/apps/charts/chart.vue +35 -17
  264. package/pages/c/_cluster/apps/charts/index.vue +11 -13
  265. package/pages/c/_cluster/apps/charts/install.vue +1 -1
  266. package/pages/c/_cluster/explorer/EventsTable.vue +89 -3
  267. package/pages/c/_cluster/explorer/index.vue +8 -6
  268. package/pages/c/_cluster/explorer/tools/index.vue +3 -3
  269. package/pages/c/_cluster/manager/hostedprovider/index.vue +220 -0
  270. package/pages/c/_cluster/settings/brand.vue +1 -1
  271. package/pages/c/_cluster/settings/performance.vue +12 -25
  272. package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +7 -0
  273. package/pages/c/_cluster/uiplugins/catalogs.vue +147 -0
  274. package/pages/c/_cluster/uiplugins/index.vue +126 -184
  275. package/pages/home.vue +327 -16
  276. package/pkg/dynamic-importer.lib.js +4 -0
  277. package/plugins/axios.js +2 -1
  278. package/plugins/dashboard-client-init.js +3 -0
  279. package/plugins/dashboard-store/actions.js +1 -1
  280. package/plugins/dashboard-store/getters.js +18 -1
  281. package/plugins/dashboard-store/resource-class.js +21 -6
  282. package/plugins/dynamic-content.js +13 -0
  283. package/plugins/i18n.js +8 -0
  284. package/plugins/steve/__tests__/steve-pagination-utils.test.ts +333 -0
  285. package/plugins/steve/steve-pagination-utils.ts +41 -22
  286. package/plugins/steve/subscribe.js +17 -9
  287. package/plugins/subscribe-events.ts +4 -2
  288. package/rancher-components/Form/Checkbox/Checkbox.vue +1 -1
  289. package/rancher-components/Pill/RcStatusBadge/RcStatusBadge.vue +6 -34
  290. package/rancher-components/Pill/RcStatusBadge/index.ts +0 -1
  291. package/rancher-components/Pill/RcStatusBadge/types.ts +1 -1
  292. package/rancher-components/Pill/RcStatusIndicator/RcStatusIndicator.vue +5 -28
  293. package/rancher-components/Pill/RcStatusIndicator/types.ts +2 -1
  294. package/rancher-components/Pill/types.ts +0 -1
  295. package/rancher-components/RcDropdown/RcDropdownItem.vue +1 -0
  296. package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +5 -1
  297. package/rancher-components/RcIcon/RcIcon.test.ts +51 -0
  298. package/rancher-components/RcIcon/RcIcon.vue +46 -0
  299. package/rancher-components/RcIcon/index.ts +1 -0
  300. package/rancher-components/RcIcon/types.ts +160 -0
  301. package/rancher-components/utils/status.test.ts +67 -0
  302. package/rancher-components/utils/status.ts +77 -0
  303. package/scripts/extension/publish +1 -1
  304. package/scripts/typegen.sh +1 -0
  305. package/store/action-menu.js +8 -0
  306. package/store/auth.js +11 -6
  307. package/store/aws.js +8 -6
  308. package/store/catalog.js +6 -0
  309. package/store/features.js +2 -0
  310. package/store/index.js +45 -20
  311. package/store/notifications.ts +51 -4
  312. package/store/plugins.js +7 -3
  313. package/store/prefs.js +12 -6
  314. package/store/type-map.js +3 -3
  315. package/store/ui-context.ts +86 -0
  316. package/store/wm.ts +244 -0
  317. package/types/kube/kube-api.ts +2 -1
  318. package/types/notifications/index.ts +27 -3
  319. package/types/rancher/index.d.ts +1 -0
  320. package/types/resources/settings.d.ts +29 -7
  321. package/types/shell/index.d.ts +138 -4
  322. package/types/store/__tests__/pagination.types.spec.ts +137 -0
  323. package/types/store/pagination.types.ts +157 -9
  324. package/types/store/subscribe-events.types.ts +8 -1
  325. package/types/store/subscribe.types.ts +1 -0
  326. package/types/window-manager.ts +24 -0
  327. package/utils/__tests__/cluster.test.ts +379 -1
  328. package/utils/__tests__/object.test.ts +19 -0
  329. package/utils/__tests__/provider.test.ts +98 -0
  330. package/utils/__tests__/selector-typed.test.ts +263 -0
  331. package/utils/__tests__/version.test.ts +19 -1
  332. package/utils/autoscaler-utils.ts +7 -0
  333. package/utils/back-off.ts +3 -3
  334. package/utils/brand.ts +29 -0
  335. package/utils/chart.js +18 -0
  336. package/utils/cluster.js +157 -3
  337. package/utils/color.js +1 -1
  338. package/utils/dynamic-content/__tests__/announcement.test.ts +498 -0
  339. package/utils/dynamic-content/__tests__/config.test.ts +187 -0
  340. package/utils/dynamic-content/__tests__/index.test.ts +390 -0
  341. package/utils/dynamic-content/__tests__/info.test.ts +275 -0
  342. package/utils/dynamic-content/__tests__/new-release.test.ts +216 -0
  343. package/utils/dynamic-content/__tests__/support-notice.test.ts +262 -0
  344. package/utils/dynamic-content/__tests__/util.test.ts +235 -0
  345. package/utils/dynamic-content/announcement.ts +142 -0
  346. package/utils/dynamic-content/config.ts +55 -0
  347. package/utils/dynamic-content/example.json +40 -0
  348. package/utils/dynamic-content/index.ts +277 -0
  349. package/utils/dynamic-content/info.ts +261 -0
  350. package/utils/dynamic-content/new-release.ts +126 -0
  351. package/utils/dynamic-content/notification-handler.ts +48 -0
  352. package/utils/dynamic-content/support-notice.ts +169 -0
  353. package/utils/dynamic-content/types.d.ts +153 -0
  354. package/utils/dynamic-content/util.ts +122 -0
  355. package/utils/dynamic-importer.js +2 -2
  356. package/utils/favicon.js +4 -4
  357. package/utils/inactivity.ts +104 -0
  358. package/utils/object.js +20 -2
  359. package/utils/pagination-utils.ts +19 -4
  360. package/utils/pagination-wrapper.ts +12 -8
  361. package/utils/provider.ts +14 -0
  362. package/utils/release-notes.ts +1 -1
  363. package/utils/scroll.js +7 -0
  364. package/utils/selector-typed.ts +6 -2
  365. package/utils/settings.ts +15 -0
  366. package/utils/validators/machine-pool.ts +13 -3
  367. package/utils/version.js +15 -0
  368. package/assets/images/icons/document.svg +0 -3
  369. package/plugins/nuxt-client-init.js +0 -3
  370. package/store/wm.js +0 -95
  371. /package/components/{nav/WindowManager → Window}/ChartReadme.vue +0 -0
  372. /package/components/{nav/WindowManager → Window}/ContainerShell.vue +0 -0
  373. /package/components/{nav/WindowManager → Window}/KubectlShell.vue +0 -0
  374. /package/components/{nav/WindowManager → Window}/MachineSsh.vue +0 -0
  375. /package/components/{nav/WindowManager → Window}/Window.vue +0 -0
@@ -475,16 +475,17 @@ describe('component: rke2', () => {
475
475
  },
476
476
  provider: 'custom'
477
477
  },
478
- data: () => ({
479
- agentArgs: {
478
+ computed: {
479
+ ...rke2.computed,
480
+ agentArgs: () => ({
480
481
  'cloud-provider-name': {
481
482
  options: [
482
483
  'azure',
483
484
  'amazon'
484
485
  ]
485
486
  }
486
- }
487
- }),
487
+ })
488
+ },
488
489
  global: {
489
490
  mocks: {
490
491
  ...defaultMocks,
@@ -519,9 +520,10 @@ describe('component: rke2', () => {
519
520
  },
520
521
  provider: 'custom'
521
522
  },
522
- data: () => ({
523
- canAzureMigrateOnEdit: true,
524
- agentArgs: {
523
+ computed: {
524
+ ...rke2.computed,
525
+ canAzureMigrateOnEdit: () => true,
526
+ agentArgs: () => ({
525
527
  'cloud-provider-name': {
526
528
  options: [
527
529
  'azure',
@@ -529,8 +531,8 @@ describe('component: rke2', () => {
529
531
  'external'
530
532
  ]
531
533
  }
532
- }
533
- }),
534
+ })
535
+ },
534
536
  global: {
535
537
  mocks: {
536
538
  ...defaultMocks,
@@ -163,9 +163,8 @@ export default {
163
163
  };
164
164
 
165
165
  this.extensions = this.$extension.getProviders(context);
166
- },
167
166
 
168
- data() {
167
+ // At this point, we know we definitely have the mgmt cluster, so we can access `isImported` and `isLocal`
169
168
  let subType = null;
170
169
 
171
170
  subType = this.$route.query[SUB_TYPE] || null;
@@ -176,6 +175,11 @@ export default {
176
175
  } else if (this.value.isLocal) {
177
176
  subType = LOCAL;
178
177
  }
178
+
179
+ this.subType = subType;
180
+ },
181
+
182
+ data() {
179
183
  const rkeType = this.$route.query[RKE_TYPE] || null;
180
184
  const chart = this.$route.query[CHART] || null;
181
185
  const isImport = this.realMode === _IMPORT;
@@ -184,7 +188,7 @@ export default {
184
188
  nodeDrivers: [],
185
189
  kontainerDrivers: [],
186
190
  extensions: [],
187
- subType,
191
+ subType: null,
188
192
  rkeType,
189
193
  chart,
190
194
  isImport,
@@ -216,7 +220,13 @@ export default {
216
220
  if (this.value) {
217
221
  // set subtype if editing EKS/GKE/AKS cluster -- this ensures that the component provided by extension is loaded instead of iframing old ember ui
218
222
  if (this.value.provisioner) {
219
- const matchingSubtype = this.subTypes.find((st) => DRIVER_TO_IMPORT[st.id.toLowerCase()] === this.value.provisioner.toLowerCase());
223
+ const matchingSubtype = this.subTypes.find((st) => {
224
+ const typeLower = st.id.toLowerCase();
225
+ const provisionerLower = this.value.provisioner.toLowerCase();
226
+
227
+ // This allows extensions to provide type for edit without breaking edit for Ember kontainer providers
228
+ return (!!st.component && (typeLower === provisionerLower)) || (DRIVER_TO_IMPORT[typeLower] === provisionerLower);
229
+ });
220
230
 
221
231
  if (matchingSubtype) {
222
232
  this.selectType(matchingSubtype.id, false);
@@ -319,11 +329,12 @@ export default {
319
329
  const vueKontainerTypes = getters['plugins/clusterDrivers'];
320
330
  const machineTypes = this.nodeDrivers.filter((x) => x.spec.active && x.state === 'active');
321
331
 
332
+ // Keeping this for non Rancher-managed kontainer drivers
322
333
  this.kontainerDrivers.filter((x) => (isImport ? x.showImport : x.showCreate)).forEach((obj) => {
323
334
  if ( vueKontainerTypes.includes(obj.driverName) ) {
324
- addType(this.$plugin, obj.driverName, 'kontainer', false);
335
+ addType(this.$plugin, obj.driverName, 'hosted', false);
325
336
  } else {
326
- addType(this.$plugin, obj.driverName, 'kontainer', false, (isImport ? obj.emberImportPath : obj.emberCreatePath));
337
+ addType(this.$plugin, obj.driverName, 'hosted', false, (isImport ? obj.emberImportPath : obj.emberCreatePath));
327
338
  }
328
339
  });
329
340
  if (!isImport) {
@@ -382,17 +393,16 @@ export default {
382
393
  }
383
394
 
384
395
  const subtype = {
385
- id: ext.id,
386
- label: ext.label || getters['i18n/t'](`cluster.provider.${ ext.id }`),
387
- description: ext.description,
396
+ id: ext.id,
397
+ label: ext.label || getters['i18n/t'](`cluster.provider.${ ext.id }`),
388
398
  icon,
389
399
  iconClass,
390
- group: ext.group || _RKE2,
391
- disabled: ext.disabled || false,
392
- link: ext.link,
393
- tag: ext.tag,
394
- component: ext.component,
395
- hidden: ext.hidden,
400
+ group: ext.group || _RKE2,
401
+ disabled: ext.disabled || false,
402
+ link: ext.link,
403
+ tag: ext.tag,
404
+ component: ext.component,
405
+ hidden: ext.hidden,
396
406
  };
397
407
 
398
408
  out.push(subtype);
@@ -28,7 +28,7 @@ import {
28
28
  } from '@shell/utils/object';
29
29
  import { allHash } from '@shell/utils/promise';
30
30
  import {
31
- getAllOptionsAfterCurrentVersion, filterOutDeprecatedPatchVersions, isHarvesterSatisfiesVersion, labelForAddon, initSchedulingCustomization
31
+ getAllOptionsAfterCurrentVersion, filterOutDeprecatedPatchVersions, isHarvesterSatisfiesVersion, labelForAddon, initSchedulingCustomization, addonConfigPreserve
32
32
  } from '@shell/utils/cluster';
33
33
 
34
34
  import { BadgeState } from '@components/BadgeState';
@@ -57,7 +57,7 @@ import { ExtensionPoint, TabLocation } from '@shell/core/types';
57
57
  import MemberRoles from '@shell/edit/provisioning.cattle.io.cluster/tabs/MemberRoles';
58
58
  import Basics from '@shell/edit/provisioning.cattle.io.cluster/tabs/Basics';
59
59
  import Etcd from '@shell/edit/provisioning.cattle.io.cluster/tabs/etcd';
60
- import Networking from '@shell/edit/provisioning.cattle.io.cluster/tabs/networking';
60
+ import Networking, { STACK_PREFS } from '@shell/edit/provisioning.cattle.io.cluster/tabs/networking';
61
61
  import Upgrade from '@shell/edit/provisioning.cattle.io.cluster/tabs/upgrade';
62
62
  import Registries from '@shell/edit/provisioning.cattle.io.cluster/tabs/registries';
63
63
  import AddOnConfig from '@shell/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig';
@@ -162,6 +162,10 @@ export default {
162
162
  this.schedulingCustomizationOriginallyEnabled = sc.schedulingCustomizationOriginallyEnabled;
163
163
  this.errors = this.errors.concat(sc.errors);
164
164
 
165
+ if (this.isEdit) {
166
+ this.originalKubeVersion = this.versionOptions.find((v) => v.value === this.liveValue.spec.kubernetesVersion);
167
+ }
168
+
165
169
  Object.entries(this.chartValues).forEach(([name, value]) => {
166
170
  const key = this.chartVersionKey(name);
167
171
 
@@ -215,6 +219,10 @@ export default {
215
219
  this.value.spec.rkeConfig.machineGlobalConfig = {};
216
220
  }
217
221
 
222
+ if (!this.value.spec.rkeConfig.networking) {
223
+ this.value.spec.rkeConfig.networking = {};
224
+ }
225
+
218
226
  if (!this.value.spec.rkeConfig.machineSelectorConfig?.length) {
219
227
  this.value.spec.rkeConfig.machineSelectorConfig = [{ config: {} }];
220
228
  }
@@ -264,6 +272,7 @@ export default {
264
272
  machinePoolValidation: {}, // map of validation states for each machine pool
265
273
  machinePoolErrors: {},
266
274
  addonConfigValidation: {}, // validation state of each addon config (boolean of whether codemirror's yaml lint passed)
275
+ stackPreferenceError: false, // spec.networking.stackPreference is validated in conjunction with hasSomeIpv6Pools
267
276
  allNamespaces: [],
268
277
  extensionTabs: getApplicableExtensionEnhancements(this, ExtensionPoint.TAB, TabLocation.CLUSTER_CREATE_RKE2, this.$route, this),
269
278
  clusterAgentDeploymentCustomization: null,
@@ -278,6 +287,9 @@ export default {
278
287
  REGISTRIES_TAB_NAME,
279
288
  labelForAddon,
280
289
  etcdConfigValid: true,
290
+ addonConfigDiffs: {},
291
+ originalKubeVersion: null,
292
+ isEmpty,
281
293
  };
282
294
  },
283
295
 
@@ -836,6 +848,10 @@ export default {
836
848
  }
837
849
  },
838
850
 
851
+ hasSomeIpv6Pools() {
852
+ return !!(this.machinePools || []).find((p) => p.hasIpv6);
853
+ },
854
+
839
855
  validationPassed() {
840
856
  const validRequiredPools = this.hasMachinePools ? this.hasRequiredNodes() : true;
841
857
 
@@ -846,8 +862,9 @@ export default {
846
862
 
847
863
  const hasAddonConfigErrors = Object.values(this.addonConfigValidation).filter((v) => v === false).length > 0;
848
864
 
849
- return validRequiredPools && base && !hasAddonConfigErrors;
865
+ return validRequiredPools && base && !hasAddonConfigErrors && !this.stackPreferenceError;
850
866
  },
867
+
851
868
  currentCluster() {
852
869
  if (this.mode === _EDIT) {
853
870
  return { ...this.value };
@@ -855,6 +872,7 @@ export default {
855
872
  return this.$store.getters['customisation/getPreviewCluster'];
856
873
  }
857
874
  },
875
+
858
876
  localValue: {
859
877
  get() {
860
878
  return this.value;
@@ -863,6 +881,7 @@ export default {
863
881
  this.$emit('update:value', newValue);
864
882
  }
865
883
  },
884
+
866
885
  hideFooter() {
867
886
  return this.needCredential && !this.credentialId;
868
887
  },
@@ -872,6 +891,7 @@ export default {
872
891
  this.fvFormIsValid &&
873
892
  this.etcdConfigValid;
874
893
  },
894
+
875
895
  },
876
896
 
877
897
  watch: {
@@ -921,8 +941,22 @@ export default {
921
941
  }
922
942
  },
923
943
 
924
- selectedVersion() {
925
- this.versionInfo = {}; // Invalidate cache such that version info relevent to selected kube version is updated
944
+ async selectedVersion(neu) {
945
+ if (this.isEdit) {
946
+ const {
947
+ addonConfigDiffs, addonNames, userChartValues, $store
948
+ } = this;
949
+
950
+ await addonConfigPreserve(
951
+ {
952
+ addonConfigDiffs, addonNames, userChartValues, $store
953
+ },
954
+ this.originalKubeVersion?.charts,
955
+ neu?.charts
956
+ );
957
+ }
958
+
959
+ this.versionInfo = {}; // Invalidate cache such that version info relevant to selected kube version is updated
926
960
 
927
961
  // Allow time for addonNames to update... then fetch any missing addons
928
962
  this.$nextTick(() => this.initAddons());
@@ -954,6 +988,18 @@ export default {
954
988
  this.agentConfig['cloud-provider-name'] = undefined;
955
989
  }
956
990
  },
991
+
992
+ hasSomeIpv6Pools(neu) {
993
+ if (this.isCreate && this.localValue.spec.rkeConfig.networking.stackPreference !== STACK_PREFS.IPV6) { // if stack pref is ipv6, the user has manually configured that and we shouldn't change it
994
+ if (neu) {
995
+ this.localValue.spec.rkeConfig.networking.stackPreference = STACK_PREFS.DUAL;
996
+
997
+ return;
998
+ }
999
+
1000
+ this.localValue.spec.rkeConfig.networking.stackPreference = STACK_PREFS.IPV4;
1001
+ }
1002
+ },
957
1003
  },
958
1004
 
959
1005
  created() {
@@ -1282,13 +1328,14 @@ export default {
1282
1328
  const name = `pool${ ++this.lastIdx }`;
1283
1329
 
1284
1330
  const pool = {
1285
- id: name,
1331
+ id: name,
1286
1332
  config,
1287
- remove: false,
1288
- create: true,
1289
- update: false,
1290
- uid: name,
1291
- pool: {
1333
+ remove: false,
1334
+ create: true,
1335
+ update: false,
1336
+ uid: name,
1337
+ hasIpv6: false,
1338
+ pool: {
1292
1339
  name,
1293
1340
  etcdRole: numCurrentPools === 0,
1294
1341
  controlPlaneRole: numCurrentPools === 0,
@@ -1511,10 +1558,15 @@ export default {
1511
1558
  });
1512
1559
  },
1513
1560
 
1514
- showAddonConfirmation() {
1515
- return new Promise((resolve, reject) => {
1561
+ showAddonConfirmation(addonNames, previousKubeVersion, newKubeVersion) {
1562
+ return new Promise((resolve) => {
1516
1563
  this.$store.dispatch('cluster/promptModal', {
1517
- component: 'AddonConfigConfirmationDialog',
1564
+ component: 'AddonConfigConfirmationDialog',
1565
+ componentProps: {
1566
+ addonNames,
1567
+ previousKubeVersion,
1568
+ newKubeVersion
1569
+ },
1518
1570
  resources: [(value) => resolve(value)]
1519
1571
  });
1520
1572
  });
@@ -1555,10 +1607,28 @@ export default {
1555
1607
  const isEditVersion = this.isEdit && this.liveValue?.spec?.kubernetesVersion !== this.value?.spec?.kubernetesVersion;
1556
1608
 
1557
1609
  if (isEditVersion) {
1558
- const shouldContinue = await this.showAddonConfirmation();
1610
+ const hasDiffs = Object.values(this.addonConfigDiffs).some((d) => !isEmpty(d));
1559
1611
 
1560
- if (!shouldContinue) {
1561
- return btnCb('cancelled');
1612
+ if (hasDiffs) {
1613
+ const addonNamesWithDiffs = [];
1614
+
1615
+ for (const name in this.addonConfigDiffs) {
1616
+ const diff = this.addonConfigDiffs[name];
1617
+
1618
+ if (!isEmpty(diff)) {
1619
+ addonNamesWithDiffs.push(name);
1620
+ }
1621
+ }
1622
+
1623
+ const shouldContinue = await this.showAddonConfirmation(
1624
+ addonNamesWithDiffs,
1625
+ this.liveValue.spec.kubernetesVersion,
1626
+ this.value.spec.kubernetesVersion
1627
+ );
1628
+
1629
+ if (!shouldContinue) {
1630
+ return btnCb('cancelled');
1631
+ }
1562
1632
  }
1563
1633
  }
1564
1634
 
@@ -2187,6 +2257,7 @@ export default {
2187
2257
  handleTabChange(data) {
2188
2258
  this.activeTab = data;
2189
2259
  },
2260
+
2190
2261
  }
2191
2262
  };
2192
2263
  </script>
@@ -2369,6 +2440,7 @@ export default {
2369
2440
  :side-tabs="true"
2370
2441
  class="min-height"
2371
2442
  :use-hash="useTabbedHash"
2443
+ :default-tab="defaultTab"
2372
2444
  @changed="handleTabChange"
2373
2445
  >
2374
2446
  <Tab
@@ -2401,6 +2473,7 @@ export default {
2401
2473
  :cloud-provider-options="cloudProviderOptions"
2402
2474
  :is-azure-provider-unsupported="isAzureProviderUnsupported"
2403
2475
  :can-azure-migrate-on-edit="canAzureMigrateOnEdit"
2476
+ :has-some-ipv6-pools="hasSomeIpv6Pools"
2404
2477
  @update:value="$emit('input', $event)"
2405
2478
  @cilium-values-changed="handleCiliumValuesChanged"
2406
2479
  @enabled-system-services-changed="handleEnabledSystemServicesChanged"
@@ -2448,12 +2521,15 @@ export default {
2448
2521
  v-if="haveArgInfo"
2449
2522
  name="networking"
2450
2523
  label-key="cluster.tabs.networking"
2524
+ :error="stackPreferenceError"
2451
2525
  >
2452
2526
  <Networking
2453
2527
  v-model:value="localValue"
2454
2528
  :mode="mode"
2455
2529
  :selected-version="selectedVersion"
2456
2530
  :truncate-limit="truncateLimit"
2531
+ :machine-pools="machinePools"
2532
+ :has-some-ipv6-pools="hasSomeIpv6Pools"
2457
2533
  @truncate-hostname-changed="truncateHostname"
2458
2534
  @cluster-cidr-changed="(val)=>localValue.spec.rkeConfig.machineGlobalConfig['cluster-cidr'] = val"
2459
2535
  @service-cidr-changed="(val)=>localValue.spec.rkeConfig.machineGlobalConfig['service-cidr'] = val"
@@ -2464,6 +2540,8 @@ export default {
2464
2540
  @local-cluster-auth-endpoint-changed="enableLocalClusterAuthEndpoint"
2465
2541
  @ca-certs-changed="(val)=>localValue.spec.localClusterAuthEndpoint.caCerts = val"
2466
2542
  @fqdn-changed="(val)=>localValue.spec.localClusterAuthEndpoint.fqdn = val"
2543
+ @stack-preference-changed="(val)=>localValue.spec.rkeConfig.networking.stackPreference = val"
2544
+ @validationChanged="(val)=>stackPreferenceError = !val"
2467
2545
  />
2468
2546
  </Tab>
2469
2547
 
@@ -2521,6 +2599,9 @@ export default {
2521
2599
  :addons-rev="addonsRev"
2522
2600
  :user-chart-values-temp="userChartValuesTemp"
2523
2601
  :init-yaml-editor="initYamlEditor"
2602
+ :has-diff="!isEmpty(addonConfigDiffs[v.name])"
2603
+ :previous-kube-version="liveValue?.spec?.kubernetesVersion"
2604
+ :new-kube-version="value.spec.kubernetesVersion"
2524
2605
  @update:value="$emit('input', $event)"
2525
2606
  @update-questions="syncChartValues"
2526
2607
  @update-values="updateValues"
@@ -48,6 +48,27 @@ export default {
48
48
  initYamlEditor: {
49
49
  type: Function,
50
50
  required: true,
51
+ },
52
+ /**
53
+ * Indicates if a configuration conflict was detected for this addon.
54
+ */
55
+ hasDiff: {
56
+ type: Boolean,
57
+ default: false
58
+ },
59
+ /**
60
+ * The Kubernetes version the user is upgrading from.
61
+ */
62
+ previousKubeVersion: {
63
+ type: String,
64
+ default: ''
65
+ },
66
+ /**
67
+ * The Kubernetes version the user is upgrading to.
68
+ */
69
+ newKubeVersion: {
70
+ type: String,
71
+ default: ''
51
72
  }
52
73
 
53
74
  },
@@ -73,10 +94,15 @@ export default {
73
94
  <template>
74
95
  <div>
75
96
  <Banner
76
- v-if="isEdit"
97
+ v-if="isEdit && hasDiff"
77
98
  color="warning"
78
99
  >
79
- {{ t('cluster.addOns.dependencyBanner') }}
100
+ <span
101
+ v-clean-html="t('cluster.addOns.dependencyBanner', {
102
+ previousKubeVersion,
103
+ newKubeVersion
104
+ }, true)"
105
+ />
80
106
  </Banner>
81
107
  <div
82
108
  v-if="versionInfo && addonVersion"
@@ -10,6 +10,7 @@ import UnitInput from '@shell/components/form/UnitInput.vue';
10
10
  import { randomStr } from '@shell/utils/string';
11
11
  import FormValidation from '@shell/mixins/form-validation';
12
12
  import { MACHINE_POOL_VALIDATION } from '@shell/utils/validators/machine-pool';
13
+ import { isAutoscalerFeatureFlagEnabled } from '@shell/utils/autoscaler-utils';
13
14
 
14
15
  export default {
15
16
 
@@ -99,6 +100,14 @@ export default {
99
100
  MACHINE_POOL_VALIDATION,
100
101
 
101
102
  fvFormRuleSets: MACHINE_POOL_VALIDATION.RULESETS,
103
+ fvExtraRules: {
104
+ isAutoscalerMaxGreaterThanMin: () => {
105
+ const min = this.value?.pool?.autoscalingMinSize || 0;
106
+ const max = this.value?.pool?.autoscalingMaxSize || 0;
107
+
108
+ return max - min >= 0 ? undefined : this.t('cluster.machinePool.autoscaler.validation.isAutoscalerMaxGreaterThanMin');
109
+ }
110
+ }
102
111
  };
103
112
  },
104
113
 
@@ -113,6 +122,25 @@ export default {
113
122
 
114
123
  isWindows() {
115
124
  return this.value?.config?.os === 'windows';
125
+ },
126
+
127
+ isAutoscalerFeatureEnabled() {
128
+ return isAutoscalerFeatureFlagEnabled(this.$store);
129
+ },
130
+
131
+ isAutoscalerEnabled: {
132
+ get() {
133
+ return typeof this.value?.pool?.autoscalingMinSize !== 'undefined' || typeof this.value?.pool?.autoscalingMinSize !== 'undefined';
134
+ },
135
+ set(val) {
136
+ if (!val) {
137
+ delete this.value.pool.autoscalingMinSize;
138
+ delete this.value.pool.autoscalingMaxSize;
139
+ } else {
140
+ this.value.pool.autoscalingMinSize = 1;
141
+ this.value.pool.autoscalingMaxSize = 2;
142
+ }
143
+ }
116
144
  }
117
145
  },
118
146
 
@@ -139,7 +167,18 @@ export default {
139
167
  this.$emit('validationChanged', newValue);
140
168
  },
141
169
  deep: true
142
- }
170
+ },
171
+
172
+ 'value.pool.etcdRole'(neu) {
173
+ if (neu) {
174
+ this.isAutoscalerEnabled = false;
175
+ }
176
+ },
177
+ 'value.pool.controlPlaneRole'(neu) {
178
+ if (neu) {
179
+ this.isAutoscalerEnabled = false;
180
+ }
181
+ },
143
182
  },
144
183
 
145
184
  /**
@@ -262,6 +301,7 @@ export default {
262
301
  </div>
263
302
  <div class="col span-4">
264
303
  <LabeledInput
304
+ v-if="!isAutoscalerFeatureEnabled || !isAutoscalerEnabled"
265
305
  v-model:value.number="value.pool.quantity"
266
306
  :mode="mode"
267
307
  :label="t('cluster.machinePool.quantity.label')"
@@ -272,6 +312,15 @@ export default {
272
312
  :rules="fvGetAndReportPathRules(MACHINE_POOL_VALIDATION.FIELDS.QUANTITY)"
273
313
  data-testid="machine-pool-quantity-input"
274
314
  />
315
+ <LabeledInput
316
+ v-else
317
+ :value="t('cluster.machinePool.autoscaler.machineCountValueOverride')"
318
+ :mode="mode"
319
+ :label="t('cluster.machinePool.quantity.label')"
320
+ :disabled="true"
321
+ :required="true"
322
+ data-testid="machine-pool-quantity-input"
323
+ />
275
324
  </div>
276
325
  <div class="col span-4 pt-5">
277
326
  <h3>
@@ -305,6 +354,7 @@ export default {
305
354
  :is="configComponent"
306
355
  v-if="value.config && configComponent"
307
356
  ref="configComponent"
357
+ v-model:has-ipv6="value.hasIpv6"
308
358
  :cluster="cluster"
309
359
  :uuid="uuid"
310
360
  :mode="mode"
@@ -344,15 +394,18 @@ export default {
344
394
  />
345
395
 
346
396
  <div class="spacer" />
397
+ <h3>
398
+ {{ t('cluster.machinePool.automation.label') }}
399
+ </h3>
347
400
  <div class="row">
348
401
  <div class="col span-4">
349
- <h3>
402
+ <h4>
350
403
  {{ t('cluster.machinePool.autoReplace.label') }}
351
404
  <i
352
405
  v-clean-tooltip="t('cluster.machinePool.autoReplace.toolTip')"
353
406
  class="icon icon-info icon-lg"
354
407
  />
355
- </h3>
408
+ </h4>
356
409
  <UnitInput
357
410
  v-model:value="unhealthyNodeTimeoutInteger"
358
411
  :hide-arrows="true"
@@ -365,9 +418,9 @@ export default {
365
418
  />
366
419
  </div>
367
420
  <div class="col span-4">
368
- <h3>
421
+ <h4>
369
422
  {{ t('cluster.machinePool.drain.header') }}
370
- </h3>
423
+ </h4>
371
424
  <Checkbox
372
425
  v-model:value="value.pool.drainBeforeDelete"
373
426
  :mode="mode"
@@ -376,6 +429,55 @@ export default {
376
429
  />
377
430
  </div>
378
431
  </div>
432
+ <div v-if="isAutoscalerFeatureEnabled">
433
+ <div class="row mt-10">
434
+ <div class="col span-12">
435
+ <h4>
436
+ {{ t('cluster.machinePool.autoscaler.heading') }}
437
+ </h4>
438
+ <Banner
439
+ v-if="value.pool.etcdRole || value.pool.controlPlaneRole"
440
+ color="warning"
441
+ label-key="cluster.machinePool.autoscaler.etcdControlPlaneWarning"
442
+ />
443
+ <Checkbox
444
+ v-model:value="isAutoscalerEnabled"
445
+ :mode="mode"
446
+ :label="t('cluster.machinePool.autoscaler.enable', undefined, true)"
447
+ :disabled="value.pool.etcdRole || value.pool.controlPlaneRole || busy"
448
+ />
449
+ </div>
450
+ </div>
451
+ <div
452
+ v-if="isAutoscalerEnabled"
453
+ class="row"
454
+ >
455
+ <div class="col span-4">
456
+ <UnitInput
457
+ v-model:value="value.pool.autoscalingMinSize"
458
+ :label="t('cluster.machinePool.autoscaler.min')"
459
+ :hide-arrows="true"
460
+ :placeholder="t('containerResourceLimit.cpuPlaceholder')"
461
+ :mode="mode"
462
+ :base-unit="t('cluster.machinePool.autoscaler.baseUnit')"
463
+ :rules="fvGetAndReportPathRules(MACHINE_POOL_VALIDATION.FIELDS.AUTOSCALER_MIN)"
464
+ :disabled="value.pool.etcdRole || value.pool.controlPlaneRole || busy"
465
+ />
466
+ </div>
467
+ <div class="col span-4">
468
+ <UnitInput
469
+ v-model:value="value.pool.autoscalingMaxSize"
470
+ :label="t('cluster.machinePool.autoscaler.max')"
471
+ :hide-arrows="true"
472
+ :placeholder="t('containerResourceLimit.cpuPlaceholder')"
473
+ :mode="mode"
474
+ :base-unit="t('cluster.machinePool.autoscaler.baseUnit')"
475
+ :rules="fvGetAndReportPathRules(MACHINE_POOL_VALIDATION.FIELDS.AUTOSCALER_MAX)"
476
+ :disabled="value.pool.etcdRole || value.pool.controlPlaneRole || busy"
477
+ />
478
+ </div>
479
+ </div>
480
+ </div>
379
481
  <div class="spacer" />
380
482
  <KeyValue
381
483
  v-model:value="value.pool.labels"