@rancher/shell 3.0.8-rc.1 → 3.0.8-rc.12

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 (345) 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/styles/base/_typography.scss +1 -0
  27. package/assets/styles/fonts/_fontstack.scss +53 -1
  28. package/assets/styles/global/_cards.scss +0 -3
  29. package/assets/styles/global/_layout.scss +21 -35
  30. package/assets/styles/themes/_dark.scss +1 -1
  31. package/assets/styles/themes/_light.scss +1 -1
  32. package/assets/styles/themes/_modern.scss +11 -3
  33. package/assets/styles/themes/_suse.scss +116 -24
  34. package/assets/translations/en-us.yaml +94 -10
  35. package/components/AutoscalerCard.vue +113 -0
  36. package/components/AutoscalerTab.vue +94 -0
  37. package/components/BackLink.vue +8 -0
  38. package/components/BannerGraphic.vue +36 -21
  39. package/components/BrandImage.vue +17 -6
  40. package/components/ClusterIconMenu.vue +1 -1
  41. package/components/ClusterProviderIcon.vue +1 -1
  42. package/components/Cron/CronExpressionEditor.vue +1 -1
  43. package/components/Cron/CronExpressionEditorModal.vue +1 -1
  44. package/components/Drawer/Chrome.vue +2 -6
  45. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +4 -9
  46. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +3 -8
  47. package/components/Drawer/ResourceDetailDrawer/composables.ts +3 -4
  48. package/components/Drawer/ResourceDetailDrawer/index.vue +4 -9
  49. package/components/Drawer/ResourceDetailDrawer/types.ts +17 -0
  50. package/components/Drawer/types.ts +3 -0
  51. package/components/DynamicContent/DynamicContentBanner.vue +102 -0
  52. package/components/DynamicContent/DynamicContentCloseButton.vue +42 -0
  53. package/components/DynamicContent/DynamicContentIcon.vue +132 -0
  54. package/components/DynamicContent/DynamicContentPanel.vue +112 -0
  55. package/components/DynamicContent/content.ts +78 -0
  56. package/components/EmberPage.vue +1 -1
  57. package/components/IconOrSvg.vue +2 -2
  58. package/components/PaginatedResourceTable.vue +2 -6
  59. package/components/PopoverCard.vue +192 -0
  60. package/components/Questions/__tests__/index.test.ts +159 -0
  61. package/components/Resource/Detail/CopyToClipboard.vue +4 -1
  62. package/components/Resource/Detail/FetchLoader/composables.ts +18 -4
  63. package/components/Resource/Detail/Metadata/Annotations/index.vue +2 -2
  64. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +1 -1
  65. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +4 -0
  66. package/components/Resource/Detail/Metadata/KeyValueRow.vue +1 -1
  67. package/components/Resource/Detail/Metadata/Labels/index.vue +2 -2
  68. package/components/Resource/Detail/Metadata/composables.ts +9 -9
  69. package/components/Resource/Detail/Metadata/index.vue +3 -3
  70. package/components/Resource/Detail/ResourcePopover/ResourcePopoverCard.vue +2 -19
  71. package/components/Resource/Detail/ResourcePopover/__tests__/ResourcePopoverCard.test.ts +0 -29
  72. package/components/Resource/Detail/ResourcePopover/__tests__/index.test.ts +132 -150
  73. package/components/Resource/Detail/ResourcePopover/index.vue +54 -159
  74. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +0 -2
  75. package/components/Resource/Detail/TitleBar/composables.ts +2 -1
  76. package/components/Resource/Detail/TitleBar/index.vue +10 -6
  77. package/components/Resource/Detail/composables.ts +12 -0
  78. package/components/ResourceDetail/Masthead/latest.vue +29 -0
  79. package/components/ResourceDetail/index.vue +4 -1
  80. package/components/ResourceList/Masthead.vue +1 -1
  81. package/components/ResourceTable.vue +1 -1
  82. package/components/SortableTable/index.vue +2 -1
  83. package/components/Tabbed/__tests__/index.test.ts +86 -0
  84. package/components/{nav/WindowManager → Window}/ContainerLogs.vue +1 -1
  85. package/components/{nav/WindowManager → Window}/ContainerLogsActions.vue +1 -0
  86. package/components/{nav/WindowManager → Window}/__tests__/ContainerLogs.test.ts +1 -1
  87. package/components/{nav/WindowManager → Window}/__tests__/ContainerShell.test.ts +2 -2
  88. package/components/__tests__/AutoscalerCard.test.ts +154 -0
  89. package/components/__tests__/AutoscalerTab.test.ts +125 -0
  90. package/components/__tests__/PopoverCard.test.ts +204 -0
  91. package/components/auth/SelectPrincipal.vue +24 -6
  92. package/components/auth/__tests__/SelectPrincipal.test.ts +119 -0
  93. package/components/auth/login/ldap.vue +3 -3
  94. package/components/form/NodeScheduling.vue +2 -2
  95. package/components/formatter/Autoscaler.vue +97 -0
  96. package/components/formatter/InternalExternalIP.vue +198 -24
  97. package/components/formatter/__tests__/Autoscaler.test.ts +156 -0
  98. package/components/formatter/__tests__/InternalExternalIP.test.ts +133 -0
  99. package/components/google/util/__tests__/formatter.test.ts +47 -0
  100. package/components/google/util/formatter.ts +5 -2
  101. package/components/nav/Group.vue +21 -5
  102. package/components/nav/Header.vue +37 -17
  103. package/components/nav/NamespaceFilter.vue +13 -1
  104. package/components/nav/NotificationCenter/index.vue +2 -1
  105. package/components/nav/TopLevelMenu.helper.ts +16 -6
  106. package/components/nav/TopLevelMenu.vue +4 -2
  107. package/components/nav/Type.vue +8 -3
  108. package/components/{DraggableZone.vue → nav/WindowManager/PinArea.vue} +47 -80
  109. package/components/nav/WindowManager/composables/useComponentsMount.ts +70 -0
  110. package/components/nav/WindowManager/composables/useDimensionsHandler.ts +105 -0
  111. package/components/nav/WindowManager/composables/useDragHandler.ts +99 -0
  112. package/components/nav/WindowManager/composables/usePanelHandler.ts +72 -0
  113. package/components/nav/WindowManager/composables/usePanelsHandler.ts +14 -0
  114. package/components/nav/WindowManager/composables/useResizeHandler.ts +167 -0
  115. package/components/nav/WindowManager/composables/useTabsHandler.ts +51 -0
  116. package/components/nav/WindowManager/constants.ts +23 -0
  117. package/components/nav/WindowManager/index.vue +61 -575
  118. package/components/nav/WindowManager/panels/HorizontalPanel.vue +265 -0
  119. package/components/nav/WindowManager/panels/TabBodyContainer.vue +39 -0
  120. package/components/nav/WindowManager/panels/VerticalPanel.vue +308 -0
  121. package/components/nav/__tests__/Type.test.ts +59 -0
  122. package/components/templates/default.vue +4 -40
  123. package/components/templates/home.vue +31 -5
  124. package/components/templates/plain.vue +30 -4
  125. package/components/templates/standalone.vue +1 -1
  126. package/composables/useI18n.ts +10 -1
  127. package/composables/useInterval.ts +15 -0
  128. package/config/__test__/uiplugins.test.ts +309 -0
  129. package/config/labels-annotations.js +9 -1
  130. package/config/product/explorer.js +3 -1
  131. package/config/product/manager.js +20 -9
  132. package/config/router/navigation-guards/clusters.js +3 -3
  133. package/config/router/navigation-guards/products.js +1 -1
  134. package/config/router/routes.js +10 -2
  135. package/config/settings.ts +2 -1
  136. package/config/store.js +4 -2
  137. package/config/table-headers.js +8 -0
  138. package/config/types.js +9 -0
  139. package/config/uiplugins.js +46 -2
  140. package/config/version.js +1 -1
  141. package/core/__test__/extension-manager-impl.test.js +236 -0
  142. package/core/extension-manager-impl.js +21 -4
  143. package/core/plugin-helpers.ts +4 -2
  144. package/core/plugins-loader.js +2 -2
  145. package/core/types-provisioning.ts +8 -1
  146. package/detail/pod.vue +1 -0
  147. package/detail/provisioning.cattle.io.cluster.vue +19 -7
  148. package/dialog/DeveloperLoadExtensionDialog.vue +13 -4
  149. package/dialog/RollbackWorkloadDialog.vue +2 -5
  150. package/dialog/SearchDialog.vue +1 -0
  151. package/directives/ui-context.ts +103 -0
  152. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +2 -2
  153. package/edit/auth/__tests__/oidc.test.ts +26 -0
  154. package/edit/auth/github.vue +5 -0
  155. package/edit/auth/oidc.vue +5 -1
  156. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -0
  157. package/edit/cloudcredential.vue +1 -1
  158. package/edit/configmap.vue +1 -0
  159. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  160. package/edit/fleet.cattle.io.gitrepo.vue +0 -10
  161. package/edit/fleet.cattle.io.helmop.vue +6 -6
  162. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  163. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  164. package/edit/logging-flow/index.vue +1 -0
  165. package/edit/logging.banzaicloud.io.output/index.vue +1 -0
  166. package/edit/management.cattle.io.fleetworkspace.vue +1 -1
  167. package/edit/management.cattle.io.project.vue +1 -0
  168. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +4 -1
  169. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +2 -1
  170. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  171. package/edit/monitoring.coreos.com.receiver/index.vue +2 -1
  172. package/edit/monitoring.coreos.com.route.vue +1 -1
  173. package/edit/namespace.vue +1 -0
  174. package/edit/networking.istio.io.destinationrule/index.vue +1 -0
  175. package/edit/networking.k8s.io.ingress/index.vue +1 -0
  176. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +1 -0
  177. package/edit/networking.k8s.io.networkpolicy/index.vue +1 -0
  178. package/edit/node.vue +1 -0
  179. package/edit/persistentvolume/index.vue +27 -22
  180. package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +13 -14
  181. package/edit/persistentvolume/plugins/azureDisk.vue +49 -48
  182. package/edit/persistentvolume/plugins/azureFile.vue +15 -14
  183. package/edit/persistentvolume/plugins/cephfs.vue +15 -14
  184. package/edit/persistentvolume/plugins/cinder.vue +15 -14
  185. package/edit/persistentvolume/plugins/csi.vue +18 -16
  186. package/edit/persistentvolume/plugins/fc.vue +13 -14
  187. package/edit/persistentvolume/plugins/flexVolume.vue +15 -14
  188. package/edit/persistentvolume/plugins/flocker.vue +1 -3
  189. package/edit/persistentvolume/plugins/gcePersistentDisk.vue +13 -14
  190. package/edit/persistentvolume/plugins/glusterfs.vue +15 -14
  191. package/edit/persistentvolume/plugins/hostPath.vue +40 -39
  192. package/edit/persistentvolume/plugins/iscsi.vue +13 -14
  193. package/edit/persistentvolume/plugins/local.vue +1 -3
  194. package/edit/persistentvolume/plugins/longhorn.vue +23 -22
  195. package/edit/persistentvolume/plugins/nfs.vue +15 -14
  196. package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -14
  197. package/edit/persistentvolume/plugins/portworxVolume.vue +15 -14
  198. package/edit/persistentvolume/plugins/quobyte.vue +15 -14
  199. package/edit/persistentvolume/plugins/rbd.vue +15 -14
  200. package/edit/persistentvolume/plugins/scaleIO.vue +15 -14
  201. package/edit/persistentvolume/plugins/storageos.vue +15 -14
  202. package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -3
  203. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +32 -5
  204. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +35 -0
  205. package/edit/provisioning.cattle.io.cluster/__tests__/Networking.test.ts +155 -0
  206. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +21 -21
  207. package/edit/provisioning.cattle.io.cluster/index.vue +28 -18
  208. package/edit/provisioning.cattle.io.cluster/rke2.vue +50 -16
  209. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +107 -5
  210. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +92 -4
  211. package/edit/secret/index.vue +1 -1
  212. package/edit/service.vue +9 -4
  213. package/edit/serviceaccount.vue +1 -0
  214. package/edit/storage.k8s.io.storageclass/index.vue +1 -0
  215. package/edit/workload/index.vue +2 -1
  216. package/edit/workload/mixins/workload.js +1 -1
  217. package/initialize/App.vue +4 -4
  218. package/initialize/install-directives.js +2 -0
  219. package/initialize/install-plugins.js +19 -2
  220. package/list/provisioning.cattle.io.cluster.vue +15 -2
  221. package/machine-config/amazonec2.vue +42 -135
  222. package/machine-config/components/EC2Networking.vue +490 -0
  223. package/machine-config/components/__tests__/EC2Networking.test.ts +148 -0
  224. package/machine-config/components/__tests__/utils/vpcSubnetMockData.js +294 -0
  225. package/machine-config/digitalocean.vue +11 -0
  226. package/machine-config/google.vue +1 -1
  227. package/mixins/__tests__/brand.spec.ts +2 -2
  228. package/mixins/__tests__/chart.test.ts +21 -0
  229. package/mixins/brand.js +1 -7
  230. package/mixins/chart.js +7 -1
  231. package/mixins/create-edit-view/index.js +5 -0
  232. package/models/__tests__/chart.test.ts +33 -4
  233. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +112 -5
  234. package/models/chart.js +25 -13
  235. package/models/cluster/node.js +13 -6
  236. package/models/cluster.x-k8s.io.machine.js +10 -20
  237. package/models/cluster.x-k8s.io.machinedeployment.js +5 -1
  238. package/models/management.cattle.io.cluster.js +21 -3
  239. package/models/management.cattle.io.kontainerdriver.js +1 -0
  240. package/models/provisioning.cattle.io.cluster.js +249 -33
  241. package/package.json +8 -7
  242. package/pages/auth/login.vue +41 -5
  243. package/pages/auth/setup.vue +1 -1
  244. package/pages/auth/verify.vue +3 -3
  245. package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +135 -0
  246. package/pages/c/_cluster/apps/charts/chart.vue +33 -15
  247. package/pages/c/_cluster/apps/charts/index.vue +11 -13
  248. package/pages/c/_cluster/apps/charts/install.vue +1 -1
  249. package/pages/c/_cluster/explorer/index.vue +8 -6
  250. package/pages/c/_cluster/manager/hostedprovider/index.vue +220 -0
  251. package/pages/c/_cluster/settings/brand.vue +1 -1
  252. package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +7 -0
  253. package/pages/c/_cluster/uiplugins/catalogs.vue +147 -0
  254. package/pages/c/_cluster/uiplugins/index.vue +126 -184
  255. package/pages/home.vue +14 -4
  256. package/pkg/auto-import.js +3 -3
  257. package/pkg/dynamic-importer.lib.js +5 -1
  258. package/pkg/import.js +1 -1
  259. package/plugins/dashboard-client-init.js +3 -0
  260. package/plugins/dashboard-store/getters.js +19 -2
  261. package/plugins/dashboard-store/model-loader.js +1 -1
  262. package/plugins/dashboard-store/resource-class.js +10 -6
  263. package/plugins/dynamic-content.js +13 -0
  264. package/plugins/i18n.js +8 -0
  265. package/plugins/plugin.js +2 -2
  266. package/plugins/steve/__tests__/steve-pagination-utils.test.ts +333 -0
  267. package/plugins/steve/steve-class.js +1 -1
  268. package/plugins/steve/steve-pagination-utils.ts +39 -20
  269. package/plugins/steve/subscribe.js +17 -9
  270. package/plugins/subscribe-events.ts +4 -2
  271. package/rancher-components/Form/Checkbox/Checkbox.vue +1 -1
  272. package/rancher-components/Pill/RcStatusBadge/RcStatusBadge.vue +6 -34
  273. package/rancher-components/Pill/RcStatusBadge/index.ts +0 -1
  274. package/rancher-components/Pill/RcStatusBadge/types.ts +1 -1
  275. package/rancher-components/Pill/RcStatusIndicator/RcStatusIndicator.vue +5 -28
  276. package/rancher-components/Pill/RcStatusIndicator/types.ts +2 -1
  277. package/rancher-components/Pill/types.ts +0 -1
  278. package/rancher-components/RcDropdown/RcDropdownItem.vue +1 -0
  279. package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +5 -1
  280. package/rancher-components/RcIcon/RcIcon.test.ts +51 -0
  281. package/rancher-components/RcIcon/RcIcon.vue +46 -0
  282. package/rancher-components/RcIcon/index.ts +1 -0
  283. package/rancher-components/RcIcon/types.ts +160 -0
  284. package/rancher-components/utils/status.test.ts +67 -0
  285. package/rancher-components/utils/status.ts +77 -0
  286. package/scripts/typegen.sh +1 -0
  287. package/store/__tests__/catalog.test.ts +1 -1
  288. package/store/action-menu.js +8 -0
  289. package/store/auth.js +4 -4
  290. package/store/catalog.js +6 -0
  291. package/store/features.js +1 -0
  292. package/store/i18n.js +3 -3
  293. package/store/index.js +40 -19
  294. package/store/notifications.ts +51 -4
  295. package/store/plugins.js +7 -3
  296. package/store/prefs.js +6 -6
  297. package/store/type-map.js +7 -7
  298. package/store/ui-context.ts +86 -0
  299. package/store/wm.ts +244 -0
  300. package/types/notifications/index.ts +27 -3
  301. package/types/shell/index.d.ts +80 -4
  302. package/types/store/__tests__/pagination.types.spec.ts +137 -0
  303. package/types/store/pagination.types.ts +157 -9
  304. package/types/store/subscribe-events.types.ts +8 -1
  305. package/types/store/subscribe.types.ts +1 -0
  306. package/types/window-manager.ts +24 -0
  307. package/utils/__tests__/object.test.ts +19 -0
  308. package/utils/__tests__/provider.test.ts +98 -0
  309. package/utils/__tests__/selector-typed.test.ts +263 -0
  310. package/utils/__tests__/version.test.ts +19 -1
  311. package/utils/autoscaler-utils.ts +7 -0
  312. package/utils/back-off.ts +3 -3
  313. package/utils/brand.ts +29 -0
  314. package/utils/chart.js +18 -0
  315. package/utils/color.js +1 -1
  316. package/utils/dynamic-content/__tests__/announcement.test.ts +498 -0
  317. package/utils/dynamic-content/__tests__/info.test.ts +21 -9
  318. package/utils/dynamic-content/announcement.ts +142 -0
  319. package/utils/dynamic-content/example.json +40 -0
  320. package/utils/dynamic-content/index.ts +6 -2
  321. package/utils/dynamic-content/info.ts +44 -2
  322. package/utils/dynamic-content/new-release.ts +1 -1
  323. package/utils/dynamic-content/notification-handler.ts +48 -0
  324. package/utils/dynamic-content/types.d.ts +53 -1
  325. package/utils/dynamic-importer.js +2 -2
  326. package/utils/favicon.js +4 -4
  327. package/utils/object.js +20 -2
  328. package/utils/pagination-utils.ts +2 -2
  329. package/utils/pagination-wrapper.ts +13 -9
  330. package/utils/provider.ts +14 -0
  331. package/utils/scroll.js +7 -0
  332. package/utils/selector-typed.ts +6 -2
  333. package/utils/settings.ts +15 -0
  334. package/utils/unit-tests/pagination-utils.spec.ts +8 -8
  335. package/utils/validators/machine-pool.ts +13 -3
  336. package/utils/version.js +15 -0
  337. package/vue.config.js +3 -3
  338. package/assets/images/icons/document.svg +0 -3
  339. package/plugins/nuxt-client-init.js +0 -3
  340. package/store/wm.js +0 -95
  341. /package/components/{nav/WindowManager → Window}/ChartReadme.vue +0 -0
  342. /package/components/{nav/WindowManager → Window}/ContainerShell.vue +0 -0
  343. /package/components/{nav/WindowManager → Window}/KubectlShell.vue +0 -0
  344. /package/components/{nav/WindowManager → Window}/MachineSsh.vue +0 -0
  345. /package/components/{nav/WindowManager → Window}/Window.vue +0 -0
@@ -112,8 +112,8 @@ describe('component: rke2', () => {
112
112
  global: {
113
113
  mocks: {
114
114
  ...defaultMocks,
115
- $store: { dispatch: () => jest.fn(), getters: defaultGetters },
116
- $plugin: { getDynamic: jest.fn(() => undefined ) }
115
+ $store: { dispatch: () => jest.fn(), getters: defaultGetters },
116
+ $extension: { getDynamic: jest.fn(() => undefined ) }
117
117
  },
118
118
 
119
119
  stubs: defaultStubs,
@@ -143,8 +143,8 @@ describe('component: rke2', () => {
143
143
  global: {
144
144
  mocks: {
145
145
  ...defaultMocks,
146
- $store: { dispatch: () => jest.fn(), getters: defaultGetters },
147
- $plugin: { getDynamic: jest.fn(() => undefined ) },
146
+ $store: { dispatch: () => jest.fn(), getters: defaultGetters },
147
+ $extension: { getDynamic: jest.fn(() => undefined ) },
148
148
  },
149
149
 
150
150
  stubs: defaultStubs,
@@ -174,8 +174,8 @@ describe('component: rke2', () => {
174
174
  global: {
175
175
  mocks: {
176
176
  ...defaultMocks,
177
- $store: { dispatch: () => jest.fn(), getters: defaultGetters },
178
- $plugin: { getDynamic: jest.fn(() => undefined ) },
177
+ $store: { dispatch: () => jest.fn(), getters: defaultGetters },
178
+ $extension: { getDynamic: jest.fn(() => undefined ) },
179
179
  },
180
180
 
181
181
  stubs: defaultStubs,
@@ -231,7 +231,7 @@ describe('component: rke2', () => {
231
231
  },
232
232
  getters: defaultGetters
233
233
  },
234
- $plugin: { getDynamic: jest.fn(() => undefined ) },
234
+ $extension: { getDynamic: jest.fn(() => undefined ) },
235
235
  },
236
236
 
237
237
  stubs: defaultStubs,
@@ -275,7 +275,7 @@ describe('component: rke2', () => {
275
275
  'management/findAll': () => ([]),
276
276
  }
277
277
  },
278
- $plugin: { getDynamic: jest.fn(() => undefined ) },
278
+ $extension: { getDynamic: jest.fn(() => undefined ) },
279
279
  },
280
280
 
281
281
  stubs: defaultStubs,
@@ -324,7 +324,7 @@ describe('component: rke2', () => {
324
324
  'management/findAll': () => ([]),
325
325
  }
326
326
  },
327
- $plugin: { getDynamic: jest.fn(() => undefined ) },
327
+ $extension: { getDynamic: jest.fn(() => undefined ) },
328
328
  },
329
329
 
330
330
  stubs: defaultStubs,
@@ -369,8 +369,8 @@ describe('component: rke2', () => {
369
369
  global: {
370
370
  mocks: {
371
371
  ...defaultMocks,
372
- $store: { dispatch: () => jest.fn(), getters: defaultGetters },
373
- $plugin: { getDynamic: jest.fn(() => undefined ) },
372
+ $store: { dispatch: () => jest.fn(), getters: defaultGetters },
373
+ $extension: { getDynamic: jest.fn(() => undefined ) },
374
374
  },
375
375
  stubs: defaultStubs
376
376
  }
@@ -409,8 +409,8 @@ describe('component: rke2', () => {
409
409
  global: {
410
410
  mocks: {
411
411
  ...defaultMocks,
412
- $store: { dispatch: () => jest.fn(), getters: defaultGetters },
413
- $plugin: { getDynamic: jest.fn(() => undefined ) },
412
+ $store: { dispatch: () => jest.fn(), getters: defaultGetters },
413
+ $extension: { getDynamic: jest.fn(() => undefined ) },
414
414
  },
415
415
  stubs: defaultStubs
416
416
  }
@@ -441,8 +441,8 @@ describe('component: rke2', () => {
441
441
  global: {
442
442
  mocks: {
443
443
  ...defaultMocks,
444
- $store: { dispatch: () => jest.fn(), getters: defaultGetters },
445
- $plugin: { getDynamic: jest.fn(() => undefined ) },
444
+ $store: { dispatch: () => jest.fn(), getters: defaultGetters },
445
+ $extension: { getDynamic: jest.fn(() => undefined ) },
446
446
  },
447
447
  stubs: defaultStubs
448
448
  }
@@ -489,8 +489,8 @@ describe('component: rke2', () => {
489
489
  global: {
490
490
  mocks: {
491
491
  ...defaultMocks,
492
- $store: { dispatch: () => jest.fn(), getters: defaultGetters },
493
- $plugin: { getDynamic: jest.fn(() => undefined ) },
492
+ $store: { dispatch: () => jest.fn(), getters: defaultGetters },
493
+ $extension: { getDynamic: jest.fn(() => undefined ) },
494
494
  },
495
495
  stubs: defaultStubs
496
496
  }
@@ -536,8 +536,8 @@ describe('component: rke2', () => {
536
536
  global: {
537
537
  mocks: {
538
538
  ...defaultMocks,
539
- $store: { dispatch: () => jest.fn(), getters: defaultGetters },
540
- $plugin: { getDynamic: jest.fn(() => undefined ) },
539
+ $store: { dispatch: () => jest.fn(), getters: defaultGetters },
540
+ $extension: { getDynamic: jest.fn(() => undefined ) },
541
541
  },
542
542
  stubs: defaultStubs
543
543
  }
@@ -600,8 +600,8 @@ describe('component: rke2', () => {
600
600
  global: {
601
601
  mocks: {
602
602
  ...defaultMocks,
603
- $store: { dispatch: () => jest.fn(), getters: defaultGetters },
604
- $plugin: { getDynamic: jest.fn(() => undefined ) },
603
+ $store: { dispatch: () => jest.fn(), getters: defaultGetters },
604
+ $extension: { getDynamic: jest.fn(() => undefined ) },
605
605
  },
606
606
 
607
607
  stubs: defaultStubs,
@@ -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.$extension, obj.driverName, 'hosted', false);
325
336
  } else {
326
- addType(this.$plugin, obj.driverName, 'kontainer', false, (isImport ? obj.emberImportPath : obj.emberCreatePath));
337
+ addType(this.$extension, obj.driverName, 'hosted', false, (isImport ? obj.emberImportPath : obj.emberCreatePath));
327
338
  }
328
339
  });
329
340
  if (!isImport) {
@@ -340,7 +351,7 @@ export default {
340
351
 
341
352
  // If Elemental is installed, then add the elemental cluster provider
342
353
  if (isElementalActive) {
343
- addType(this.$plugin, ELEMENTAL_CLUSTER_PROVIDER, 'custom2', false);
354
+ addType(this.$extension, ELEMENTAL_CLUSTER_PROVIDER, 'custom2', false);
344
355
  }
345
356
 
346
357
  // Only add the RKE2 options if RKE2 is enabled
@@ -348,10 +359,10 @@ export default {
348
359
  machineTypes.forEach((type) => {
349
360
  const id = type.spec.displayName || type.id;
350
361
 
351
- addType(this.$plugin, id, _RKE2, false, null, undefined, type);
362
+ addType(this.$extension, id, _RKE2, false, null, undefined, type);
352
363
  });
353
364
 
354
- addType(this.$plugin, 'custom', 'custom2', false);
365
+ addType(this.$extension, 'custom', 'custom2', false);
355
366
  }
356
367
  }
357
368
  // Add from extensions
@@ -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);
@@ -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';
@@ -219,6 +219,10 @@ export default {
219
219
  this.value.spec.rkeConfig.machineGlobalConfig = {};
220
220
  }
221
221
 
222
+ if (!this.value.spec.rkeConfig.networking) {
223
+ this.value.spec.rkeConfig.networking = {};
224
+ }
225
+
222
226
  if (!this.value.spec.rkeConfig.machineSelectorConfig?.length) {
223
227
  this.value.spec.rkeConfig.machineSelectorConfig = [{ config: {} }];
224
228
  }
@@ -268,6 +272,7 @@ export default {
268
272
  machinePoolValidation: {}, // map of validation states for each machine pool
269
273
  machinePoolErrors: {},
270
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
271
276
  allNamespaces: [],
272
277
  extensionTabs: getApplicableExtensionEnhancements(this, ExtensionPoint.TAB, TabLocation.CLUSTER_CREATE_RKE2, this.$route, this),
273
278
  clusterAgentDeploymentCustomization: null,
@@ -497,7 +502,7 @@ export default {
497
502
  * 2) Override via hardcoded setting
498
503
  */
499
504
  cloudCredentialsOverride() {
500
- const cloudCredential = this.$plugin.getDynamic('cloud-credential', this.provider);
505
+ const cloudCredential = this.$extension.getDynamic('cloud-credential', this.provider);
501
506
 
502
507
  if (cloudCredential === undefined) {
503
508
  return CLOUD_CREDENTIAL_OVERRIDE[this.provider];
@@ -522,16 +527,16 @@ export default {
522
527
  * Extension provider where being provisioned by an extension
523
528
  */
524
529
  extensionProvider() {
525
- const extClass = this.$plugin.getDynamic('provisioner', this.provider);
530
+ const extClass = this.$extension.getDynamic('provisioner', this.provider);
526
531
 
527
532
  if (extClass) {
528
533
  return new extClass({
529
- dispatch: this.$store.dispatch,
530
- getters: this.$store.getters,
531
- axios: this.$store.$axios,
532
- $plugin: this.$store.app.$plugin,
533
- $t: this.t,
534
- isCreate: this.isCreate
534
+ dispatch: this.$store.dispatch,
535
+ getters: this.$store.getters,
536
+ axios: this.$store.$axios,
537
+ $extension: this.$store.app.$extension,
538
+ $t: this.t,
539
+ isCreate: this.isCreate
535
540
  });
536
541
  }
537
542
 
@@ -843,6 +848,10 @@ export default {
843
848
  }
844
849
  },
845
850
 
851
+ hasSomeIpv6Pools() {
852
+ return !!(this.machinePools || []).find((p) => p.hasIpv6);
853
+ },
854
+
846
855
  validationPassed() {
847
856
  const validRequiredPools = this.hasMachinePools ? this.hasRequiredNodes() : true;
848
857
 
@@ -853,8 +862,9 @@ export default {
853
862
 
854
863
  const hasAddonConfigErrors = Object.values(this.addonConfigValidation).filter((v) => v === false).length > 0;
855
864
 
856
- return validRequiredPools && base && !hasAddonConfigErrors;
865
+ return validRequiredPools && base && !hasAddonConfigErrors && !this.stackPreferenceError;
857
866
  },
867
+
858
868
  currentCluster() {
859
869
  if (this.mode === _EDIT) {
860
870
  return { ...this.value };
@@ -862,6 +872,7 @@ export default {
862
872
  return this.$store.getters['customisation/getPreviewCluster'];
863
873
  }
864
874
  },
875
+
865
876
  localValue: {
866
877
  get() {
867
878
  return this.value;
@@ -870,6 +881,7 @@ export default {
870
881
  this.$emit('update:value', newValue);
871
882
  }
872
883
  },
884
+
873
885
  hideFooter() {
874
886
  return this.needCredential && !this.credentialId;
875
887
  },
@@ -879,6 +891,7 @@ export default {
879
891
  this.fvFormIsValid &&
880
892
  this.etcdConfigValid;
881
893
  },
894
+
882
895
  },
883
896
 
884
897
  watch: {
@@ -975,6 +988,18 @@ export default {
975
988
  this.agentConfig['cloud-provider-name'] = undefined;
976
989
  }
977
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
+ },
978
1003
  },
979
1004
 
980
1005
  created() {
@@ -1303,13 +1328,14 @@ export default {
1303
1328
  const name = `pool${ ++this.lastIdx }`;
1304
1329
 
1305
1330
  const pool = {
1306
- id: name,
1331
+ id: name,
1307
1332
  config,
1308
- remove: false,
1309
- create: true,
1310
- update: false,
1311
- uid: name,
1312
- pool: {
1333
+ remove: false,
1334
+ create: true,
1335
+ update: false,
1336
+ uid: name,
1337
+ hasIpv6: false,
1338
+ pool: {
1313
1339
  name,
1314
1340
  etcdRole: numCurrentPools === 0,
1315
1341
  controlPlaneRole: numCurrentPools === 0,
@@ -2231,6 +2257,7 @@ export default {
2231
2257
  handleTabChange(data) {
2232
2258
  this.activeTab = data;
2233
2259
  },
2260
+
2234
2261
  }
2235
2262
  };
2236
2263
  </script>
@@ -2413,6 +2440,7 @@ export default {
2413
2440
  :side-tabs="true"
2414
2441
  class="min-height"
2415
2442
  :use-hash="useTabbedHash"
2443
+ :default-tab="defaultTab"
2416
2444
  @changed="handleTabChange"
2417
2445
  >
2418
2446
  <Tab
@@ -2445,6 +2473,7 @@ export default {
2445
2473
  :cloud-provider-options="cloudProviderOptions"
2446
2474
  :is-azure-provider-unsupported="isAzureProviderUnsupported"
2447
2475
  :can-azure-migrate-on-edit="canAzureMigrateOnEdit"
2476
+ :has-some-ipv6-pools="hasSomeIpv6Pools"
2448
2477
  @update:value="$emit('input', $event)"
2449
2478
  @cilium-values-changed="handleCiliumValuesChanged"
2450
2479
  @enabled-system-services-changed="handleEnabledSystemServicesChanged"
@@ -2492,12 +2521,15 @@ export default {
2492
2521
  v-if="haveArgInfo"
2493
2522
  name="networking"
2494
2523
  label-key="cluster.tabs.networking"
2524
+ :error="stackPreferenceError"
2495
2525
  >
2496
2526
  <Networking
2497
2527
  v-model:value="localValue"
2498
2528
  :mode="mode"
2499
2529
  :selected-version="selectedVersion"
2500
2530
  :truncate-limit="truncateLimit"
2531
+ :machine-pools="machinePools"
2532
+ :has-some-ipv6-pools="hasSomeIpv6Pools"
2501
2533
  @truncate-hostname-changed="truncateHostname"
2502
2534
  @cluster-cidr-changed="(val)=>localValue.spec.rkeConfig.machineGlobalConfig['cluster-cidr'] = val"
2503
2535
  @service-cidr-changed="(val)=>localValue.spec.rkeConfig.machineGlobalConfig['service-cidr'] = val"
@@ -2508,6 +2540,8 @@ export default {
2508
2540
  @local-cluster-auth-endpoint-changed="enableLocalClusterAuthEndpoint"
2509
2541
  @ca-certs-changed="(val)=>localValue.spec.localClusterAuthEndpoint.caCerts = val"
2510
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"
2511
2545
  />
2512
2546
  </Tab>
2513
2547
 
@@ -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"