@rancher/shell 0.2.5 → 0.3.1

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 (635) hide show
  1. package/assets/styles/global/_button.scss +5 -1
  2. package/assets/styles/global/_columns.scss +4 -0
  3. package/assets/styles/global/_layout.scss +1 -2
  4. package/assets/styles/global/_select.scss +1 -4
  5. package/assets/styles/themes/_dark.scss +8 -4
  6. package/assets/styles/themes/_light.scss +9 -3
  7. package/assets/styles/themes/_suse.scss +1 -1
  8. package/assets/styles/vendor/vue-select.scss +4 -3
  9. package/assets/translations/en-us.yaml +682 -74
  10. package/assets/translations/zh-hans.yaml +554 -170
  11. package/chart/istio.vue +1 -1
  12. package/chart/monitoring/grafana/index.vue +1 -1
  13. package/chart/monitoring/index.vue +1 -1
  14. package/chart/monitoring/prometheus/index.vue +4 -4
  15. package/chart/monitoring/steps/uninstall-v1.vue +2 -2
  16. package/cloud-credential/azure.vue +23 -0
  17. package/cloud-credential/harvester.vue +25 -62
  18. package/cloud-credential/pnap.vue +80 -0
  19. package/components/AdvancedSection.vue +9 -2
  20. package/components/Alert.vue +2 -2
  21. package/components/AlertTable.vue +1 -1
  22. package/components/AssignTo.vue +1 -1
  23. package/components/AsyncButton.vue +2 -2
  24. package/components/BrandImage.vue +1 -1
  25. package/components/ButtonDropdown.vue +0 -2
  26. package/components/ButtonGroup.vue +2 -1
  27. package/components/ClusterProviderIcon.vue +2 -2
  28. package/components/Collapse.vue +6 -2
  29. package/components/CollapsibleCard.vue +2 -3
  30. package/components/ConsumptionGauge.vue +4 -4
  31. package/components/ContainerResourceLimit.vue +1 -1
  32. package/components/CountBox.vue +1 -1
  33. package/components/CountGauge.vue +1 -1
  34. package/components/CruResource.vue +43 -5
  35. package/components/DashboardMetrics.vue +2 -2
  36. package/components/DetailTop.vue +58 -3
  37. package/components/DisableAuthProviderModal.vue +106 -0
  38. package/components/DraggableZone.vue +181 -0
  39. package/components/ExplorerMembers.vue +253 -30
  40. package/components/ExplorerProjectsNamespaces.vue +82 -38
  41. package/components/FixedBanner.vue +6 -6
  42. package/components/GlobalRoleBindings.vue +6 -6
  43. package/components/GradientBox.vue +2 -2
  44. package/components/GrowlManager.vue +3 -3
  45. package/components/IconMessage.vue +4 -4
  46. package/components/IconOrSvg.vue +149 -0
  47. package/components/Import.vue +5 -5
  48. package/components/InputOrDisplay.vue +1 -1
  49. package/components/KeyValueView.vue +1 -1
  50. package/components/LabelValue.vue +1 -1
  51. package/components/LogItem.vue +69 -0
  52. package/components/ModalWithCard.vue +1 -1
  53. package/components/MoveModal.vue +1 -1
  54. package/components/PercentageBar.vue +2 -2
  55. package/components/PodSecurityAdmission.vue +302 -0
  56. package/components/PromptChangePassword.vue +1 -1
  57. package/components/PromptModal.vue +2 -1
  58. package/components/PromptRemove.vue +2 -2
  59. package/components/PromptRestore.vue +13 -13
  60. package/components/Questions/Question.js +1 -1
  61. package/components/ResourceCancelModal.vue +3 -3
  62. package/components/ResourceDetail/Masthead.vue +55 -3
  63. package/components/ResourceDetail/index.vue +12 -5
  64. package/components/ResourceList/Masthead.vue +12 -2
  65. package/components/ResourceList/ResourceLoadingIndicator.vue +12 -2
  66. package/components/ResourceList/index.vue +53 -12
  67. package/components/ResourceList/resource-list.config.js +7 -0
  68. package/components/ResourceSummary.vue +4 -4
  69. package/components/ResourceTable.vue +31 -6
  70. package/components/RoleBindings.vue +19 -19
  71. package/components/SimpleBox.vue +6 -2
  72. package/components/SingleClusterInfo.vue +5 -5
  73. package/components/SortableTable/THead.vue +20 -6
  74. package/components/SortableTable/actions.js +4 -2
  75. package/components/SortableTable/index.vue +30 -19
  76. package/components/SortableTable/selection.js +2 -2
  77. package/components/Tabbed/index.vue +20 -15
  78. package/components/TableSparkLine.vue +1 -1
  79. package/components/TypeDescription.vue +1 -1
  80. package/components/Wizard.vue +1 -1
  81. package/components/YamlEditor.vue +6 -6
  82. package/components/__tests__/ApplicationCard.test.ts +27 -0
  83. package/components/__tests__/AsyncButton.test.ts +140 -0
  84. package/components/__tests__/BackLink.test.ts +33 -0
  85. package/components/__tests__/ButtonGroup.test.ts +124 -0
  86. package/components/__tests__/ClusterBadge.test.ts +32 -0
  87. package/components/__tests__/Collapse.spec.ts +44 -0
  88. package/components/__tests__/CollapsibleCard.test.ts +64 -0
  89. package/components/__tests__/ConsumptionGauge.test.ts +88 -0
  90. package/components/__tests__/CruResource.test.ts +6 -5
  91. package/components/__tests__/FixedBanner.test.ts +129 -0
  92. package/components/__tests__/GrowlManager.test.ts +147 -0
  93. package/components/__tests__/NamespaceFilter.test.ts +221 -0
  94. package/components/__tests__/PercentageBar.test.ts +32 -0
  95. package/components/__tests__/PodSecurityAdmission.test.ts +398 -0
  96. package/components/__tests__/SimpleBox.spec.ts +28 -0
  97. package/components/auth/AuthBanner.vue +20 -10
  98. package/components/auth/RoleDetailEdit.vue +41 -30
  99. package/components/auth/SelectPrincipal.vue +45 -5
  100. package/components/auth/login/ldap.vue +3 -0
  101. package/components/cards/ApplicationCard.vue +10 -5
  102. package/components/fleet/FleetBundleResources.vue +8 -8
  103. package/components/fleet/FleetClusters.vue +10 -10
  104. package/components/fleet/FleetRepos.vue +5 -5
  105. package/components/fleet/FleetResources.vue +6 -6
  106. package/components/fleet/FleetSummary.vue +5 -5
  107. package/components/fleet/ResourcesSummary.vue +1 -1
  108. package/components/form/ArrayList.vue +3 -35
  109. package/components/form/ArrayListGrouped.vue +14 -5
  110. package/components/form/ArrayListSelect.vue +8 -8
  111. package/components/form/BannerSettings.vue +6 -6
  112. package/components/form/ChangePassword.vue +3 -3
  113. package/components/form/Error.vue +10 -2
  114. package/components/form/FileSelector.vue +3 -3
  115. package/components/form/Footer.vue +1 -1
  116. package/components/form/GithubPicker.vue +4 -4
  117. package/components/form/KeyValue.vue +41 -9
  118. package/components/form/LabeledSelect.vue +5 -2
  119. package/components/form/Labels.vue +46 -16
  120. package/components/form/MatchExpressions.vue +1 -1
  121. package/components/form/Members/ClusterPermissionsEditor.vue +28 -28
  122. package/components/form/Members/MembershipEditor.vue +14 -14
  123. package/components/form/NameNsDescription.vue +1 -1
  124. package/components/form/NodeAffinity.vue +1 -1
  125. package/components/form/NodeScheduling.vue +1 -1
  126. package/components/form/Password.vue +3 -3
  127. package/components/form/PodAffinity.vue +1 -1
  128. package/components/form/Probe.vue +3 -3
  129. package/components/form/ProjectMemberEditor.vue +1 -1
  130. package/components/form/ResourceQuota/Project.vue +6 -6
  131. package/components/form/ResourceQuota/shared.js +12 -12
  132. package/components/form/ResourceTabs/index.vue +1 -6
  133. package/components/form/SecretSelector.vue +1 -1
  134. package/components/form/Security.vue +8 -7
  135. package/components/form/Select.vue +7 -2
  136. package/components/form/SelectOrCreateAuthSecret.vue +22 -29
  137. package/components/form/ServicePorts.vue +8 -0
  138. package/components/form/SimpleSecretSelector.vue +1 -1
  139. package/components/form/Taints.vue +1 -1
  140. package/components/form/UnitInput.vue +7 -7
  141. package/components/form/ValueFromResource.vue +1 -1
  142. package/components/form/WorkloadPorts.vue +8 -2
  143. package/components/form/__tests__/ArrayList.test.ts +74 -0
  144. package/components/form/__tests__/ArrayListGrouped.test.ts +6 -4
  145. package/components/formatter/AppSummaryGraph.vue +4 -4
  146. package/components/formatter/BadgeStateFormatter.vue +2 -2
  147. package/components/formatter/Checked.vue +2 -2
  148. package/components/formatter/ClusterLink.vue +8 -3
  149. package/components/formatter/Date.vue +1 -1
  150. package/components/formatter/DelayedValue.vue +1 -1
  151. package/components/formatter/Endpoints.vue +1 -1
  152. package/components/formatter/FleetSummaryGraph.vue +4 -4
  153. package/components/formatter/IconIsDefault.vue +3 -3
  154. package/components/formatter/IconText.vue +4 -4
  155. package/components/formatter/ImagePercentageBar.vue +4 -4
  156. package/components/formatter/IngressFullPath.vue +1 -1
  157. package/components/formatter/InternalExternalIP.vue +11 -8
  158. package/components/formatter/LinkDetail.vue +3 -3
  159. package/components/formatter/List.vue +1 -1
  160. package/components/formatter/ListLink.vue +1 -1
  161. package/components/formatter/ListLinkDetail.vue +1 -1
  162. package/components/formatter/LiveDate.vue +3 -3
  163. package/components/formatter/LiveDuration.vue +78 -0
  164. package/components/formatter/LivePodRestarts.vue +1 -1
  165. package/components/formatter/Number.vue +1 -1
  166. package/components/formatter/Percentage.vue +2 -2
  167. package/components/formatter/PercentageBar.vue +3 -3
  168. package/components/formatter/PodImages.vue +1 -1
  169. package/components/formatter/Principal.vue +1 -1
  170. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  171. package/components/formatter/QualityText.vue +1 -1
  172. package/components/formatter/ReceiverIcons.vue +2 -2
  173. package/components/formatter/Scale.vue +1 -1
  174. package/components/formatter/ScanResult.vue +1 -1
  175. package/components/formatter/SecretData.vue +1 -1
  176. package/components/formatter/ServiceType.vue +1 -1
  177. package/components/formatter/Shortened.vue +1 -1
  178. package/components/formatter/VerticalScroll.vue +2 -2
  179. package/components/formatter/VirtualServiceGateways.vue +3 -3
  180. package/components/formatter/Weight.vue +2 -2
  181. package/components/formatter/WorkloadDetailEndpoints.vue +1 -1
  182. package/components/formatter/WorkloadHealthScale.vue +7 -5
  183. package/components/formatter/__tests__/Date.test.ts +60 -0
  184. package/components/formatter/__tests__/LinkDetail.test.ts +72 -0
  185. package/components/formatter/__tests__/LiveDate.test.ts +84 -0
  186. package/components/formatter/__tests__/Si.test.ts +35 -0
  187. package/components/graph/LinePlot.vue +1 -1
  188. package/components/graph/ProgressArc.vue +5 -5
  189. package/components/nav/GlobalLoading.vue +1 -1
  190. package/components/nav/Header.vue +6 -4
  191. package/components/nav/Jump.vue +3 -3
  192. package/components/nav/NamespaceFilter.vue +200 -68
  193. package/components/nav/TopLevelMenu.vue +24 -21
  194. package/components/nav/Type.vue +1 -1
  195. package/components/nav/WindowManager/ChartReadme.vue +1 -1
  196. package/components/nav/WindowManager/ContainerLogs.vue +84 -127
  197. package/components/nav/WindowManager/ContainerShell.vue +28 -7
  198. package/components/nav/WindowManager/KubectlShell.vue +6 -6
  199. package/components/nav/WindowManager/MachineSsh.vue +1 -1
  200. package/components/nav/WindowManager/Window.vue +2 -0
  201. package/components/nav/WindowManager/index.vue +206 -25
  202. package/config/elemental-types.js +9 -0
  203. package/config/features.js +2 -0
  204. package/config/home-links.js +4 -1
  205. package/config/labels-annotations.js +19 -19
  206. package/config/pod-security-admission.ts +82 -0
  207. package/config/product/apps.js +5 -5
  208. package/config/product/auth.js +22 -21
  209. package/config/product/cis.js +24 -24
  210. package/config/product/explorer.js +25 -24
  211. package/config/product/fleet.js +7 -7
  212. package/config/product/gatekeeper.js +7 -7
  213. package/config/product/istio.js +7 -7
  214. package/config/product/legacy.js +21 -21
  215. package/config/product/logging.js +90 -90
  216. package/config/product/manager.js +19 -15
  217. package/config/product/monitoring.js +36 -36
  218. package/config/product/multi-cluster-apps.js +24 -24
  219. package/config/product/settings.js +42 -42
  220. package/config/secret.js +0 -1
  221. package/config/settings.ts +39 -22
  222. package/config/table-headers.js +70 -52
  223. package/config/types.js +11 -8
  224. package/config/uiplugins.js +4 -4
  225. package/content/docs/zh-hans/getting-started.md +113 -137
  226. package/content/docs/zh-hans/whats-new.md +8 -46
  227. package/creators/app/app.package.json +4 -1
  228. package/creators/app/{.eslintignore → files/.eslintignore} +0 -0
  229. package/creators/app/{.eslintrc.js → files/.eslintrc.js} +0 -0
  230. package/creators/app/{.vscode → files/.vscode}/settings.json +0 -0
  231. package/creators/app/{babel.config.js → files/babel.config.js} +0 -0
  232. package/creators/app/{nuxt.config.js → files/nuxt.config.js} +0 -0
  233. package/creators/app/{tsconfig.json → files/tsconfig.json} +2 -1
  234. package/creators/app/init +16 -17
  235. package/creators/app/package.json +7 -1
  236. package/creators/pkg/{babel.config.js → files/babel.config.js} +0 -0
  237. package/creators/pkg/{index.ts → files/index.ts} +0 -0
  238. package/creators/pkg/{tsconfig.json → files/tsconfig.json} +13 -12
  239. package/creators/pkg/{vue.config.js → files/vue.config.js} +0 -0
  240. package/creators/pkg/init +1 -1
  241. package/creators/pkg/package.json +2 -2
  242. package/creators/update/init +56 -0
  243. package/creators/update/package.json +20 -0
  244. package/creators/update/upgrade +56 -0
  245. package/detail/catalog.cattle.io.app.vue +1 -1
  246. package/detail/cis.cattle.io.clusterscan.vue +6 -6
  247. package/detail/configmap.vue +1 -1
  248. package/detail/constraints.gatekeeper.sh.constraint.vue +1 -1
  249. package/detail/fleet.cattle.io.bundle.vue +5 -5
  250. package/detail/fleet.cattle.io.gitrepo.vue +5 -5
  251. package/detail/helm.cattle.io.projecthelmchart.vue +1 -1
  252. package/detail/management.cattle.io.user.vue +3 -3
  253. package/detail/namespace.vue +13 -13
  254. package/detail/node.vue +2 -2
  255. package/detail/pod.vue +2 -2
  256. package/detail/provisioning.cattle.io.cluster.vue +47 -10
  257. package/detail/secret.vue +2 -2
  258. package/detail/service.vue +2 -9
  259. package/detail/workload/index.vue +1 -2
  260. package/dialog/AddClusterMemberDialog.vue +23 -29
  261. package/dialog/AddCustomBadgeDialog.vue +4 -4
  262. package/dialog/AddProjectMemberDialog.vue +81 -30
  263. package/dialog/AddonConfigConfirmationDialog.vue +1 -1
  264. package/dialog/DiagnosticTimingsDialog.vue +9 -8
  265. package/dialog/DrainNode.vue +56 -60
  266. package/dialog/ForceMachineRemoveDialog.vue +6 -8
  267. package/dialog/GenericPrompt.vue +16 -21
  268. package/dialog/RollbackWorkloadDialog.vue +22 -53
  269. package/dialog/RotateCertificatesDialog.vue +9 -11
  270. package/dialog/RotateEncryptionKeyDialog.vue +6 -10
  271. package/dialog/SaveAsRKETemplateDialog.vue +6 -14
  272. package/dialog/ScaleMachineDownDialog.vue +2 -2
  273. package/dialog/ScalePoolDownDialog.vue +121 -0
  274. package/edit/__tests__/management.cattle.io.setting.test.ts +4 -4
  275. package/edit/auth/azuread.vue +18 -18
  276. package/edit/auth/github.vue +10 -2
  277. package/edit/auth/googleoauth.vue +10 -1
  278. package/edit/auth/ldap/index.vue +14 -4
  279. package/edit/auth/oidc.vue +13 -3
  280. package/edit/auth/saml.vue +14 -4
  281. package/edit/autoscaling.horizontalpodautoscaler/external-metric.vue +2 -2
  282. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
  283. package/edit/autoscaling.horizontalpodautoscaler/metric-object-reference.vue +1 -1
  284. package/edit/autoscaling.horizontalpodautoscaler/object-metric.vue +2 -2
  285. package/edit/autoscaling.horizontalpodautoscaler/pod-metric.vue +2 -2
  286. package/edit/cis.cattle.io.clusterscan.vue +2 -2
  287. package/edit/cloudcredential.vue +3 -7
  288. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -1
  289. package/edit/fleet.cattle.io.clustergroup.vue +3 -3
  290. package/edit/fleet.cattle.io.gitrepo.vue +9 -9
  291. package/edit/group.principal.vue +2 -2
  292. package/edit/helm.cattle.io.projecthelmchart.vue +3 -3
  293. package/edit/logging-flow/Match.vue +39 -8
  294. package/edit/logging-flow/index.vue +28 -5
  295. package/edit/logging.banzaicloud.io.output/providers/datadog.vue +1 -1
  296. package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +1 -1
  297. package/edit/logging.banzaicloud.io.output/providers/gcs.vue +1 -1
  298. package/edit/logging.banzaicloud.io.output/providers/gelf.vue +1 -1
  299. package/edit/logging.banzaicloud.io.output/providers/kafka.vue +1 -1
  300. package/edit/logging.banzaicloud.io.output/providers/logz.vue +1 -1
  301. package/edit/logging.banzaicloud.io.output/providers/loki.vue +1 -1
  302. package/edit/logging.banzaicloud.io.output/providers/opensearch.vue +213 -0
  303. package/edit/logging.banzaicloud.io.output/providers/redis.vue +142 -0
  304. package/edit/logging.banzaicloud.io.output/providers/s3.vue +1 -1
  305. package/edit/logging.banzaicloud.io.output/providers/splunkHec.vue +1 -1
  306. package/edit/logging.banzaicloud.io.output/providers/syslog.vue +1 -1
  307. package/edit/management.cattle.io.fleetworkspace.vue +1 -1
  308. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +107 -0
  309. package/edit/management.cattle.io.project.vue +11 -4
  310. package/edit/management.cattle.io.projectroletemplatebinding.vue +5 -5
  311. package/edit/management.cattle.io.setting.vue +6 -3
  312. package/edit/management.cattle.io.user.vue +11 -5
  313. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +33 -17
  314. package/edit/monitoring.coreos.com.alertmanagerconfig/tls.vue +1 -1
  315. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +6 -6
  316. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +5 -5
  317. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +3 -3
  318. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +3 -3
  319. package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +4 -4
  320. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +14 -6
  321. package/edit/monitoring.coreos.com.receiver/auth.vue +2 -2
  322. package/edit/monitoring.coreos.com.receiver/index.vue +1 -1
  323. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  324. package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +1 -1
  325. package/edit/monitoring.coreos.com.receiver/types/pagerduty.vue +1 -1
  326. package/edit/monitoring.coreos.com.receiver/types/webhook.vue +1 -1
  327. package/edit/monitoring.coreos.com.route.vue +1 -1
  328. package/edit/namespace.vue +18 -4
  329. package/edit/networking.istio.io.destinationrule/LoadBalancer.vue +1 -1
  330. package/edit/networking.k8s.io.ingress/Certificate.vue +1 -0
  331. package/edit/networking.k8s.io.ingress/Certificates.vue +3 -3
  332. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +2 -2
  333. package/edit/networking.k8s.io.ingress/IngressClass.vue +9 -7
  334. package/edit/networking.k8s.io.ingress/Rule.vue +1 -1
  335. package/edit/networking.k8s.io.ingress/RulePath.vue +17 -11
  336. package/edit/networking.k8s.io.ingress/Rules.vue +7 -7
  337. package/edit/networking.k8s.io.ingress/index.vue +8 -6
  338. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -1
  339. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +3 -3
  340. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +1 -1
  341. package/edit/networking.k8s.io.networkpolicy/index.vue +5 -5
  342. package/edit/persistentvolume/index.vue +30 -27
  343. package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +1 -1
  344. package/edit/persistentvolume/plugins/azureDisk.vue +1 -1
  345. package/edit/persistentvolume/plugins/azureFile.vue +1 -1
  346. package/edit/persistentvolume/plugins/cephfs.vue +31 -31
  347. package/edit/persistentvolume/plugins/cinder.vue +1 -1
  348. package/edit/persistentvolume/plugins/csi.vue +104 -64
  349. package/edit/persistentvolume/plugins/fc.vue +21 -21
  350. package/edit/persistentvolume/plugins/flexVolume.vue +2 -2
  351. package/edit/persistentvolume/plugins/flocker.vue +1 -1
  352. package/edit/persistentvolume/plugins/gcePersistentDisk.vue +1 -1
  353. package/edit/persistentvolume/plugins/glusterfs.vue +1 -1
  354. package/edit/persistentvolume/plugins/hostPath.vue +1 -1
  355. package/edit/persistentvolume/plugins/iscsi.vue +47 -47
  356. package/edit/persistentvolume/plugins/local.vue +1 -1
  357. package/edit/persistentvolume/plugins/longhorn.vue +2 -2
  358. package/edit/persistentvolume/plugins/nfs.vue +1 -1
  359. package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -1
  360. package/edit/persistentvolume/plugins/portworxVolume.vue +1 -1
  361. package/edit/persistentvolume/plugins/quobyte.vue +1 -1
  362. package/edit/persistentvolume/plugins/rbd.vue +41 -41
  363. package/edit/persistentvolume/plugins/scaleIO.vue +1 -1
  364. package/edit/persistentvolume/plugins/storageos.vue +1 -1
  365. package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -1
  366. package/edit/persistentvolumeclaim.vue +78 -75
  367. package/edit/provisioning.cattle.io.cluster/DrainOptions.vue +1 -1
  368. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +12 -8
  369. package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +10 -1
  370. package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +87 -27
  371. package/edit/provisioning.cattle.io.cluster/S3Config.vue +1 -1
  372. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +3 -6
  373. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.tests.ts +1 -1
  374. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +93 -0
  375. package/edit/provisioning.cattle.io.cluster/import.vue +3 -3
  376. package/edit/provisioning.cattle.io.cluster/index.vue +31 -8
  377. package/edit/provisioning.cattle.io.cluster/rke2.vue +458 -164
  378. package/edit/resources.cattle.io.backup.vue +2 -2
  379. package/edit/secret/generic.vue +1 -0
  380. package/edit/secret/index.vue +3 -7
  381. package/edit/service.vue +3 -1
  382. package/edit/storage.k8s.io.storageclass/index.vue +101 -17
  383. package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +114 -0
  384. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/no-provisioner.vue +1 -1
  385. package/edit/token.vue +1 -1
  386. package/edit/ui.cattle.io.navlink.vue +8 -8
  387. package/edit/workload/Job.vue +3 -3
  388. package/edit/workload/Upgrading.vue +1 -1
  389. package/edit/workload/VolumeClaimTemplate.vue +1 -1
  390. package/edit/workload/__tests__/index.test.ts +98 -0
  391. package/edit/workload/index.vue +61 -11
  392. package/edit/workload/mixins/workload.js +128 -91
  393. package/edit/workload/storage/ContainerMountPaths.vue +1 -11
  394. package/edit/workload/storage/Mount.vue +1 -1
  395. package/edit/workload/storage/azureDisk.vue +1 -1
  396. package/edit/workload/storage/azureFile.vue +1 -1
  397. package/edit/workload/storage/csi/index.vue +1 -1
  398. package/edit/workload/storage/emptyDir.vue +88 -0
  399. package/edit/workload/storage/ephemeralVolume/index.vue +2 -2
  400. package/edit/workload/storage/gcePersistentDisk.vue +1 -1
  401. package/edit/workload/storage/hostPath.vue +1 -1
  402. package/edit/workload/storage/index.vue +8 -0
  403. package/edit/workload/storage/nfs.vue +1 -1
  404. package/edit/workload/storage/persistentVolumeClaim/index.vue +2 -2
  405. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -1
  406. package/edit/workload/storage/secret.vue +1 -1
  407. package/edit/workload/storage/vsphereVolume.vue +1 -1
  408. package/layouts/default.vue +132 -58
  409. package/list/__tests__/workload.test.ts +53 -0
  410. package/list/catalog.cattle.io.app.vue +1 -0
  411. package/list/cis.cattle.io.clusterscan.vue +1 -0
  412. package/list/fleet.cattle.io.bundle.vue +5 -6
  413. package/list/fleet.cattle.io.cluster.vue +6 -3
  414. package/list/fleet.cattle.io.clusterregistrationtoken.vue +5 -6
  415. package/list/fleet.cattle.io.gitrepo.vue +5 -10
  416. package/list/group.principal.vue +8 -8
  417. package/list/helm.cattle.io.projecthelmchart.vue +2 -6
  418. package/list/logging.banzaicloud.io.clusterflow.vue +4 -1
  419. package/list/logging.banzaicloud.io.flow.vue +6 -5
  420. package/list/management.cattle.io.cluster.vue +1 -0
  421. package/list/management.cattle.io.feature.vue +4 -5
  422. package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +47 -0
  423. package/list/management.cattle.io.setting.vue +2 -2
  424. package/list/management.cattle.io.user.vue +4 -10
  425. package/list/monitoring.coreos.com.alertmanagerconfig.vue +2 -7
  426. package/list/node.vue +9 -6
  427. package/list/persistentvolume.vue +3 -3
  428. package/list/persistentvolumeclaim.vue +3 -4
  429. package/list/provisioning.cattle.io.cluster.vue +21 -22
  430. package/list/service.vue +6 -14
  431. package/list/workload.vue +43 -38
  432. package/machine-config/amazonec2.vue +1 -1
  433. package/machine-config/azure.vue +429 -60
  434. package/machine-config/pnap.vue +288 -0
  435. package/mixins/__tests__/create-edit-view.test.ts +1 -1
  436. package/mixins/auth-config.js +1 -3
  437. package/mixins/browser-tab-visibility.js +8 -14
  438. package/mixins/chart.js +15 -15
  439. package/mixins/create-edit-view/impl.js +4 -0
  440. package/mixins/create-edit-view/index.js +9 -7
  441. package/mixins/form-validation.js +1 -1
  442. package/mixins/labeled-form-element.ts +6 -6
  443. package/mixins/resource-fetch-namespaced.js +98 -0
  444. package/mixins/resource-fetch.js +82 -48
  445. package/mixins/resource-manager.js +2 -24
  446. package/models/apps.controllerrevision.js +7 -0
  447. package/models/apps.daemonset.js +18 -0
  448. package/models/apps.deployment.js +44 -0
  449. package/models/apps.replicaset.js +7 -0
  450. package/models/apps.statefulset.js +18 -0
  451. package/models/autoscaling.horizontalpodautoscaler.js +5 -5
  452. package/models/batch.cronjob.js +15 -15
  453. package/models/batch.job.js +15 -0
  454. package/models/catalog.cattle.io.app.js +6 -6
  455. package/models/catalog.cattle.io.clusterrepo.js +7 -7
  456. package/models/catalog.cattle.io.operation.js +5 -5
  457. package/models/chart.js +4 -4
  458. package/models/cis.cattle.io.clusterscan.js +10 -10
  459. package/models/cluster/node.js +46 -38
  460. package/models/cluster.x-k8s.io.machine.js +39 -17
  461. package/models/cluster.x-k8s.io.machinedeployment.js +12 -2
  462. package/models/constraints.gatekeeper.sh.constraint.js +1 -1
  463. package/models/etcdbackup.js +4 -4
  464. package/models/event.js +7 -0
  465. package/models/fleet.cattle.io.cluster.js +15 -15
  466. package/models/fleet.cattle.io.clustergroup.js +1 -1
  467. package/models/fleet.cattle.io.gitrepo.js +15 -15
  468. package/models/group.principal.js +1 -1
  469. package/models/logging.banzaicloud.io.clusterflow.js +2 -2
  470. package/models/logging.banzaicloud.io.flow.js +6 -2
  471. package/models/logging.banzaicloud.io.output.js +15 -3
  472. package/models/management.cattle.io.authconfig.js +4 -4
  473. package/models/management.cattle.io.cluster.js +10 -10
  474. package/models/management.cattle.io.clusterroletemplatebinding.js +9 -9
  475. package/models/management.cattle.io.globalrole.js +26 -5
  476. package/models/management.cattle.io.node.js +46 -11
  477. package/models/management.cattle.io.nodepool.js +3 -3
  478. package/models/management.cattle.io.nodetemplate.js +21 -21
  479. package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.ts +4 -0
  480. package/models/management.cattle.io.project.js +32 -13
  481. package/models/management.cattle.io.projectroletemplatebinding.js +6 -6
  482. package/models/management.cattle.io.roletemplate.js +54 -31
  483. package/models/management.cattle.io.setting.js +1 -1
  484. package/models/management.cattle.io.user.js +41 -5
  485. package/models/monitoring.coreos.com.alertmanagerconfig.js +4 -4
  486. package/models/monitoring.coreos.com.receiver.js +7 -7
  487. package/models/monitoring.coreos.com.route.js +2 -2
  488. package/models/namespace.js +55 -5
  489. package/models/persistentvolume.js +14 -2
  490. package/models/persistentvolumeclaim.js +4 -4
  491. package/models/pod.js +25 -10
  492. package/models/projectroletemplatebinding.js +7 -0
  493. package/models/provisioning.cattle.io.cluster.js +89 -38
  494. package/models/rbac.authorization.k8s.io.role.js +4 -4
  495. package/models/rke-machine.cattle.io.pnapmachinetemplate.js +15 -0
  496. package/models/rke.cattle.io.etcdsnapshot.js +4 -4
  497. package/models/service.js +29 -28
  498. package/models/storage.k8s.io.storageclass.js +41 -26
  499. package/models/workload.js +66 -35
  500. package/nuxt.config.js +59 -34
  501. package/package.json +7 -7
  502. package/pages/about.vue +15 -3
  503. package/pages/account/index.vue +1 -1
  504. package/pages/auth/login.vue +37 -7
  505. package/pages/auth/setup.vue +11 -11
  506. package/pages/c/_cluster/_product/_resource/_id.vue +2 -2
  507. package/pages/c/_cluster/apps/charts/chart.vue +4 -4
  508. package/pages/c/_cluster/apps/charts/index.vue +21 -20
  509. package/pages/c/_cluster/apps/charts/install.vue +73 -36
  510. package/pages/c/_cluster/auth/config/_id.vue +8 -2
  511. package/pages/c/_cluster/auth/config/index.vue +8 -6
  512. package/pages/c/_cluster/auth/group.principal/assign-edit.vue +1 -1
  513. package/pages/c/_cluster/auth/roles/_resource/_id.vue +2 -2
  514. package/pages/c/_cluster/auth/roles/index.vue +5 -7
  515. package/pages/c/_cluster/explorer/EventsTable.vue +8 -8
  516. package/pages/c/_cluster/explorer/index.vue +26 -20
  517. package/pages/c/_cluster/explorer/tools/index.vue +4 -4
  518. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +2 -2
  519. package/pages/c/_cluster/fleet/index.vue +10 -10
  520. package/pages/c/_cluster/gatekeeper/index.vue +1 -1
  521. package/pages/c/_cluster/legacy/index.vue +1 -1
  522. package/pages/c/_cluster/longhorn/index.vue +2 -2
  523. package/pages/c/_cluster/mcapps/index.vue +1 -1
  524. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +15 -4
  525. package/pages/c/_cluster/monitoring/index.vue +1 -1
  526. package/pages/c/_cluster/navlinks/_group.vue +1 -1
  527. package/pages/c/_cluster/neuvector/index.vue +2 -2
  528. package/pages/c/_cluster/settings/banners.vue +30 -30
  529. package/pages/c/_cluster/settings/brand.vue +9 -9
  530. package/pages/c/_cluster/settings/links.vue +6 -6
  531. package/pages/c/_cluster/settings/performance.vue +48 -2
  532. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +1 -1
  533. package/pages/c/_cluster/uiplugins/InstallDialog.vue +1 -1
  534. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +59 -9
  535. package/pages/c/_cluster/uiplugins/index.vue +30 -4
  536. package/pages/diagnostic.vue +5 -4
  537. package/pages/home.vue +105 -30
  538. package/pages/prefs.vue +23 -12
  539. package/pages/rio/mesh.vue +5 -5
  540. package/pages/support/index.vue +7 -7
  541. package/pkg/dynamic-importer.lib.js +8 -0
  542. package/pkg/vue.config.js +14 -1
  543. package/plugins/dashboard-store/__tests__/mutations.spec.js +406 -0
  544. package/plugins/dashboard-store/actions.js +32 -25
  545. package/plugins/dashboard-store/getters.js +50 -33
  546. package/plugins/dashboard-store/mutations.js +134 -28
  547. package/plugins/dashboard-store/normalize.js +1 -1
  548. package/plugins/dashboard-store/resource-class.js +121 -141
  549. package/plugins/steve/actions.js +30 -0
  550. package/plugins/steve/caches/resourceCache.js +60 -0
  551. package/plugins/steve/getters.js +44 -1
  552. package/plugins/steve/mutations.js +97 -36
  553. package/plugins/steve/resourceWatcher.js +277 -0
  554. package/plugins/steve/schema.utils.js +25 -0
  555. package/plugins/steve/subscribe.js +292 -119
  556. package/plugins/steve/worker/index.js +17 -0
  557. package/plugins/steve/worker/web-worker.advanced.js +302 -0
  558. package/plugins/steve/{web-worker.steve-sub-worker.js → worker/web-worker.basic.js} +6 -47
  559. package/promptRemove/management.cattle.io.project.vue +1 -1
  560. package/promptRemove/mixin/roleDeletionCheck.js +7 -7
  561. package/promptRemove/pod.vue +2 -2
  562. package/rancher-components/components/BadgeState/BadgeState.spec.ts +12 -0
  563. package/rancher-components/components/BadgeState/BadgeState.vue +111 -0
  564. package/rancher-components/components/BadgeState/index.ts +1 -0
  565. package/rancher-components/components/Banner/Banner.test.ts +57 -0
  566. package/rancher-components/components/Banner/Banner.vue +242 -0
  567. package/rancher-components/components/Banner/index.ts +1 -0
  568. package/rancher-components/components/Card/Card.test.ts +37 -0
  569. package/rancher-components/components/Card/Card.vue +166 -0
  570. package/rancher-components/components/Card/index.ts +1 -0
  571. package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +68 -0
  572. package/rancher-components/components/Form/Checkbox/Checkbox.vue +418 -0
  573. package/rancher-components/components/Form/Checkbox/index.ts +1 -0
  574. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +23 -0
  575. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +355 -0
  576. package/rancher-components/components/Form/LabeledInput/index.ts +1 -0
  577. package/rancher-components/components/Form/Radio/RadioButton.vue +276 -0
  578. package/rancher-components/components/Form/Radio/RadioGroup.vue +253 -0
  579. package/rancher-components/components/Form/Radio/index.ts +2 -0
  580. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +169 -0
  581. package/rancher-components/components/Form/TextArea/index.ts +1 -0
  582. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +94 -0
  583. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +149 -0
  584. package/rancher-components/components/Form/ToggleSwitch/index.ts +1 -0
  585. package/rancher-components/components/Form/index.ts +5 -0
  586. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +151 -0
  587. package/rancher-components/components/LabeledTooltip/index.ts +1 -0
  588. package/rancher-components/components/StringList/StringList.test.ts +483 -0
  589. package/rancher-components/components/StringList/StringList.vue +611 -0
  590. package/rancher-components/components/StringList/index.ts +1 -0
  591. package/scripts/publish-shell.sh +38 -5
  592. package/scripts/record-deps.js +37 -0
  593. package/scripts/test-plugins-build.sh +19 -7
  594. package/scripts/typegen.sh +84 -0
  595. package/static/loading-indicator.html +1 -1
  596. package/store/action-menu.js +3 -3
  597. package/store/auth.js +4 -4
  598. package/store/aws.js +4 -4
  599. package/store/catalog.js +22 -22
  600. package/store/index.js +58 -7
  601. package/store/plugins.js +2 -19
  602. package/store/pnap.js +128 -0
  603. package/store/prefs.js +13 -3
  604. package/store/type-map.js +101 -44
  605. package/store/uiplugins.ts +2 -2
  606. package/store/wm.js +10 -0
  607. package/types/pod-security-admission.ts +36 -0
  608. package/types/shell/index.d.ts +3159 -0
  609. package/types/vue-shim.d +20 -0
  610. package/utils/__tests__/object.test.ts +17 -1
  611. package/utils/__tests__/pod-security-admission.test.ts +61 -0
  612. package/utils/alertmanagerconfig.js +6 -6
  613. package/utils/async.ts +36 -0
  614. package/utils/color.js +45 -0
  615. package/utils/crypto/browserHashUtils.js +18 -0
  616. package/utils/dynamic-importer.js +8 -0
  617. package/utils/gc/gc-types.ts +1 -1
  618. package/utils/install-redirect.js +1 -1
  619. package/utils/object.js +26 -2
  620. package/utils/parse-externalid.js +5 -5
  621. package/utils/pod-security-admission.ts +39 -0
  622. package/utils/socket.js +61 -24
  623. package/utils/string.js +2 -0
  624. package/utils/svg-filter.js +301 -0
  625. package/utils/time.js +55 -0
  626. package/utils/validators/cidr.js +4 -0
  627. package/utils/validators/formRules/__tests__/index.test.ts +26 -6
  628. package/utils/validators/formRules/index.ts +14 -0
  629. package/config/product/harvester-manager.js +0 -162
  630. package/creators/pkg/nuxt.config.js +0 -6
  631. package/edit/harvesterhci.io.management.cluster.vue +0 -153
  632. package/list/harvesterhci.io.management.cluster.vue +0 -241
  633. package/machine-config/harvester.vue +0 -693
  634. package/models/harvesterhci.io.management.cluster.js +0 -228
  635. package/pages/c/_cluster/harvesterManager/index.vue +0 -24
@@ -4,7 +4,6 @@ import throttle from 'lodash/throttle';
4
4
  import isArray from 'lodash/isArray';
5
5
  import merge from 'lodash/merge';
6
6
  import { mapGetters } from 'vuex';
7
-
8
7
  import CreateEditView from '@shell/mixins/create-edit-view';
9
8
  import FormValidation from '@shell/mixins/form-validation';
10
9
 
@@ -29,6 +28,7 @@ import { sortBy } from '@shell/utils/sort';
29
28
  import { camelToTitle, nlToBr } from '@shell/utils/string';
30
29
  import { compare, sortable } from '@shell/utils/version';
31
30
  import { isHarvesterSatisfiesVersion } from '@shell/utils/cluster';
31
+ import * as VERSION from '@shell/utils/version';
32
32
 
33
33
  import ArrayList from '@shell/components/form/ArrayList';
34
34
  import ArrayListGrouped from '@shell/components/form/ArrayListGrouped';
@@ -66,6 +66,8 @@ import RegistryConfigs from './RegistryConfigs';
66
66
  import RegistryMirrors from './RegistryMirrors';
67
67
  import S3Config from './S3Config';
68
68
  import SelectCredential from './SelectCredential';
69
+ import AdvancedSection from '@shell/components/AdvancedSection.vue';
70
+ import { ELEMENTAL_SCHEMA_IDS, KIND, ELEMENTAL_CLUSTER_PROVIDER } from '../../config/elemental-types';
69
71
 
70
72
  const PUBLIC = 'public';
71
73
  const PRIVATE = 'private';
@@ -77,6 +79,7 @@ const HARVESTER_CLOUD_PROVIDER = 'harvester-cloud-provider';
77
79
  export default {
78
80
  components: {
79
81
  ACE,
82
+ AdvancedSection,
80
83
  AgentEnv,
81
84
  ArrayList,
82
85
  ArrayListGrouped,
@@ -136,6 +139,10 @@ export default {
136
139
  hash.allPSPs = await this.$store.dispatch('management/findAll', { type: MANAGEMENT.POD_SECURITY_POLICY_TEMPLATE });
137
140
  }
138
141
 
142
+ if (this.$store.getters['management/canList'](MANAGEMENT.PSA)) {
143
+ hash.allPSAs = await this.$store.dispatch('management/findAll', { type: MANAGEMENT.PSA });
144
+ }
145
+
139
146
  // Get the latest versions from the global settings if possible
140
147
  const globalSettings = await this.$store.getters['management/all'](MANAGEMENT.SETTING) || [];
141
148
  const defaultRke2Setting = globalSettings.find(setting => setting.id === 'rke2-default-version') || {};
@@ -157,6 +164,7 @@ export default {
157
164
  const res = await allHash(hash);
158
165
 
159
166
  this.allPSPs = res.allPSPs || [];
167
+ this.allPSAs = res.allPSAs || [];
160
168
  this.rke2Versions = res.rke2Versions.data || [];
161
169
  this.k3sVersions = res.k3sVersions.data || [];
162
170
 
@@ -230,6 +238,10 @@ export default {
230
238
  set(this.value.spec, 'defaultPodSecurityPolicyTemplateName', '');
231
239
  }
232
240
 
241
+ if ( this.value.spec.defaultPodSecurityAdmissionConfigurationTemplateName === undefined ) {
242
+ set(this.value.spec, 'defaultPodSecurityAdmissionConfigurationTemplateName', '');
243
+ }
244
+
233
245
  await this.initAddons();
234
246
  await this.initRegistry();
235
247
 
@@ -266,34 +278,42 @@ export default {
266
278
  set(this.value.spec, 'rkeConfig.machineSelectorConfig', [{ config: {} }]);
267
279
  }
268
280
 
281
+ // Store the initial PSP template name, so we can set it back if needed
282
+ const lastDefaultPodSecurityPolicyTemplateName = this.value.spec.defaultPodSecurityPolicyTemplateName;
283
+ const previousKubernetesVersion = this.value.spec.kubernetesVersion;
284
+
269
285
  return {
270
- loadedOnce: false,
271
- lastIdx: 0,
272
- allPSPs: null,
273
- nodeComponent: null,
274
- credentialId: null,
275
- credential: null,
276
- machinePools: null,
277
- rke2Versions: null,
278
- k3sVersions: null,
279
- defaultRke2: '',
280
- defaultK3s: '',
281
- s3Backup: false,
282
- versionInfo: {},
283
- membershipUpdate: {},
284
- showDeprecatedPatchVersions: false,
285
- systemRegistry: null,
286
- registryHost: null,
287
- registryMode: null,
288
- registrySecret: null,
289
- userChartValues: {},
290
- userChartValuesTemp: {},
291
- addonsRev: 0,
292
- clusterIsAlreadyCreated: !!this.value.id,
293
- fvFormRuleSets: [{
286
+ loadedOnce: false,
287
+ lastIdx: 0,
288
+ allPSPs: null,
289
+ allPSAs: [],
290
+ nodeComponent: null,
291
+ credentialId: null,
292
+ credential: null,
293
+ machinePools: null,
294
+ rke2Versions: null,
295
+ k3sVersions: null,
296
+ defaultRke2: '',
297
+ defaultK3s: '',
298
+ s3Backup: false,
299
+ versionInfo: {},
300
+ membershipUpdate: {},
301
+ showDeprecatedPatchVersions: false,
302
+ systemRegistry: null,
303
+ registryHost: null,
304
+ showCustomRegistryInput: false,
305
+ showCustomRegistryAdvancedInput: false,
306
+ registrySecret: null,
307
+ userChartValues: {},
308
+ userChartValuesTemp: {},
309
+ addonsRev: 0,
310
+ clusterIsAlreadyCreated: !!this.value.id,
311
+ fvFormRuleSets: [{
294
312
  path: 'metadata.name', rules: ['subDomain'], translationKey: 'nameNsDescription.name.label'
295
313
  }],
296
314
  harvesterVersionRange: {},
315
+ lastDefaultPodSecurityPolicyTemplateName,
316
+ previousKubernetesVersion,
297
317
  };
298
318
  },
299
319
 
@@ -309,6 +329,10 @@ export default {
309
329
  return this.value.spec.rkeConfig;
310
330
  },
311
331
 
332
+ isElementalCluster() {
333
+ return this.provider === ELEMENTAL_CLUSTER_PROVIDER || this.value?.machineProvider?.toLowerCase() === KIND.MACHINE_INV_SELECTOR_TEMPLATES.toLowerCase();
334
+ },
335
+
312
336
  advancedTitleAlt() {
313
337
  const machineSelectorLength = this.rkeConfig.machineSelectorConfig.length;
314
338
 
@@ -327,9 +351,35 @@ export default {
327
351
  return this.value.agentConfig;
328
352
  },
329
353
 
354
+ /**
355
+ * Return need of PSA if RKE and min k8s version
356
+ */
357
+ needsPSA() {
358
+ const release = this.value?.spec?.kubernetesVersion || '';
359
+ const isRKE2 = release.includes('rke2');
360
+ const version = release.match(/\d+/g);
361
+ const isRequiredVersion = version?.length ? +version[0] > 1 || +version[1] >= 23 : false;
362
+
363
+ return isRKE2 && isRequiredVersion;
364
+ },
365
+
366
+ /**
367
+ * Restrict use of PSP based on min k8s version
368
+ */
369
+ needsPSP() {
370
+ const release = this.value?.spec?.kubernetesVersion || '';
371
+ const version = release.match(/\d+/g);
372
+ const isRequiredVersion = version?.length ? +version[0] === 1 && +version[1] < 25 : false;
373
+
374
+ return isRequiredVersion;
375
+ },
376
+
330
377
  // kubeletConfigs() {
331
378
  // return this.value.spec.rkeConfig.machineSelectorConfig.filter(x => !!x.machineLabelSelector);
332
379
  // },
380
+ /**
381
+ * Check if k8s release version used is RKE2 ^1.25
382
+ */
333
383
 
334
384
  unsupportedSelectorConfig() {
335
385
  let global = 0;
@@ -419,7 +469,10 @@ export default {
419
469
  return { label: x, value: x };
420
470
  });
421
471
 
422
- out.unshift({ label: '(None)', value: '' });
472
+ out.unshift({
473
+ label: this.$store.getters['i18n/t']('cluster.rke2.cisProfile.option'),
474
+ value: ''
475
+ });
423
476
 
424
477
  return out;
425
478
  },
@@ -429,7 +482,10 @@ export default {
429
482
  return null;
430
483
  }
431
484
 
432
- const out = [{ label: 'RKE2 Default', value: '' }];
485
+ const out = [{
486
+ label: this.$store.getters['i18n/t']('cluster.rke2.defaultPodSecurityPolicyTemplateName.option'),
487
+ value: ''
488
+ }];
433
489
 
434
490
  if ( this.allPSPs ) {
435
491
  for ( const pspt of this.allPSPs ) {
@@ -449,6 +505,35 @@ export default {
449
505
  return out;
450
506
  },
451
507
 
508
+ /**
509
+ * Convert PSA templates into options, sorting and flagging if any selected
510
+ */
511
+ psaOptions() {
512
+ if ( !this.needsPSA ) {
513
+ return [];
514
+ }
515
+ const out = [{
516
+ label: this.$store.getters['i18n/t']('cluster.rke2.defaultPodSecurityAdmissionConfigurationTemplateName.option'),
517
+ value: ''
518
+ }];
519
+
520
+ if ( this.allPSAs ) {
521
+ for ( const psa of this.allPSAs ) {
522
+ out.push({
523
+ label: psa.nameDisplay,
524
+ value: psa.id,
525
+ });
526
+ }
527
+ }
528
+ const cur = this.value.spec.defaultPodSecurityAdmissionConfigurationTemplateName;
529
+
530
+ if ( cur && !out.find(x => x.value === cur) ) {
531
+ out.unshift({ label: `${ cur } (Current)`, value: cur });
532
+ }
533
+
534
+ return out;
535
+ },
536
+
452
537
  disableOptions() {
453
538
  return this.serverArgs.disable.options.map((value) => {
454
539
  return {
@@ -459,7 +544,10 @@ export default {
459
544
  },
460
545
 
461
546
  cloudProviderOptions() {
462
- const out = [{ label: '(None)', value: '' }];
547
+ const out = [{
548
+ label: this.$store.getters['i18n/t']('cluster.rke2.cloudProvider.defaultValue.label'),
549
+ value: '',
550
+ }];
463
551
 
464
552
  const preferred = this.$store.getters['plugins/cloudProviderForDriver'](this.provider);
465
553
 
@@ -506,11 +594,7 @@ export default {
506
594
  },
507
595
 
508
596
  haveArgInfo() {
509
- if ( this.selectedVersion?.serverArgs && this.selectedVersion?.agentArgs ) {
510
- return true;
511
- }
512
-
513
- return false;
597
+ return Boolean(this.selectedVersion?.serverArgs && this.selectedVersion?.agentArgs);
514
598
  },
515
599
 
516
600
  serverArgs() {
@@ -526,20 +610,11 @@ export default {
526
610
  },
527
611
 
528
612
  showCisProfile() {
529
- return this.provider === 'custom' && ( this.serverArgs.profile || this.agentArgs.profile );
530
- },
531
-
532
- registryOptions() {
533
- return [PUBLIC, PRIVATE, ADVANCED].map((opt) => {
534
- return {
535
- label: this.$store.getters['i18n/withFallback'](`cluster.privateRegistry.mode."${ opt }"`, null, opt),
536
- value: opt,
537
- };
538
- });
613
+ return (this.provider === 'custom' || this.isElementalCluster) && ( this.serverArgs.profile || this.agentArgs.profile );
539
614
  },
540
615
 
541
616
  needCredential() {
542
- if ( this.provider === 'custom' || this.provider === 'import' || this.mode === _VIEW ) {
617
+ if ( this.provider === 'custom' || this.provider === 'import' || this.isElementalCluster || this.mode === _VIEW ) {
543
618
  return false;
544
619
  }
545
620
 
@@ -559,13 +634,17 @@ export default {
559
634
  },
560
635
 
561
636
  machineConfigSchema() {
637
+ let schema;
638
+
562
639
  if ( !this.hasMachinePools ) {
563
640
  return null;
641
+ } else if (this.isElementalCluster) {
642
+ schema = ELEMENTAL_SCHEMA_IDS.MACHINE_INV_SELECTOR_TEMPLATES;
643
+ } else {
644
+ schema = `${ CAPI.MACHINE_CONFIG_GROUP }.${ this.provider }config`;
564
645
  }
565
646
 
566
- const schema = this.$store.getters['management/schemaFor'](`${ CAPI.MACHINE_CONFIG_GROUP }.${ this.provider }config`);
567
-
568
- return schema;
647
+ return this.$store.getters['management/schemaFor'](schema);
569
648
  },
570
649
 
571
650
  nodeTotals() {
@@ -849,6 +928,19 @@ export default {
849
928
  return false;
850
929
  }
851
930
  },
931
+
932
+ displayInvalidPspsBanner() {
933
+ const version = VERSION.parse(this.value.spec.kubernetesVersion);
934
+
935
+ const major = parseInt(version?.[0] || 0);
936
+ const minor = parseInt(version?.[1] || 0);
937
+
938
+ if (major === 1 && minor >= 25) {
939
+ return this.allPSPs?.length > 0;
940
+ }
941
+
942
+ return false;
943
+ }
852
944
  },
853
945
 
854
946
  watch: {
@@ -943,8 +1035,16 @@ export default {
943
1035
 
944
1036
  if ( existing?.length ) {
945
1037
  for ( const pool of existing ) {
946
- const type = `${ CAPI.MACHINE_CONFIG_GROUP }.${ pool.machineConfigRef.kind.toLowerCase() }`;
1038
+ let type;
1039
+
1040
+ if (this.isElementalCluster) {
1041
+ type = ELEMENTAL_SCHEMA_IDS.MACHINE_INV_SELECTOR_TEMPLATES;
1042
+ } else {
1043
+ type = `${ CAPI.MACHINE_CONFIG_GROUP }.${ pool.machineConfigRef.kind.toLowerCase() }`;
1044
+ }
1045
+
947
1046
  let config;
1047
+ let configMissing = false;
948
1048
 
949
1049
  if ( this.$store.getters['management/canList'](type) ) {
950
1050
  try {
@@ -954,6 +1054,12 @@ export default {
954
1054
  });
955
1055
  } catch (e) {
956
1056
  // Some users can't see the config, that's ok.
1057
+ // we will display a banner for a 404 only for elemental
1058
+ if (e?.status === 404) {
1059
+ if (this.isElementalCluster) {
1060
+ configMissing = true;
1061
+ }
1062
+ }
957
1063
  }
958
1064
  }
959
1065
 
@@ -963,10 +1069,11 @@ export default {
963
1069
  out.push({
964
1070
  id,
965
1071
  remove: false,
966
- create: false,
1072
+ create: false,
967
1073
  update: true,
968
- pool: clone(pool),
969
- config: config ? await this.$store.dispatch('management/clone', { resource: config }) : null,
1074
+ pool: clone(pool),
1075
+ config: config ? await this.$store.dispatch('management/clone', { resource: config }) : null,
1076
+ configMissing
970
1077
  });
971
1078
  }
972
1079
  }
@@ -990,12 +1097,12 @@ export default {
990
1097
 
991
1098
  const name = `pool${ ++this.lastIdx }`;
992
1099
  const pool = {
993
- id: name,
1100
+ id: name,
994
1101
  config,
995
1102
  remove: false,
996
- create: true,
1103
+ create: true,
997
1104
  update: false,
998
- pool: {
1105
+ pool: {
999
1106
  name,
1000
1107
  etcdRole: numCurrentPools === 0,
1001
1108
  controlPlaneRole: numCurrentPools === 0,
@@ -1005,8 +1112,8 @@ export default {
1005
1112
  quantity: 1,
1006
1113
  unhealthyNodeTimeout: '0m',
1007
1114
  machineConfigRef: {
1008
- kind: this.machineConfigSchema.attributes.kind,
1009
- name: null,
1115
+ kind: this.machineConfigSchema.attributes.kind,
1116
+ name: null,
1010
1117
  },
1011
1118
  },
1012
1119
  };
@@ -1014,6 +1121,11 @@ export default {
1014
1121
  if (this.provider === 'vmwarevsphere') {
1015
1122
  pool.pool.machineOS = 'linux';
1016
1123
  }
1124
+
1125
+ if (this.isElementalCluster) {
1126
+ pool.pool.machineConfigRef.apiVersion = `${ this.machineConfigSchema.attributes.group }/${ this.machineConfigSchema.attributes.version }`;
1127
+ }
1128
+
1017
1129
  this.machinePools.push(pool);
1018
1130
 
1019
1131
  this.$nextTick(() => {
@@ -1086,6 +1198,11 @@ export default {
1086
1198
  entry.config = await entry.config.save();
1087
1199
  }
1088
1200
 
1201
+ // Ensure Elemental clusters have a hostname prefix
1202
+ if (this.isElementalCluster && !entry.pool.hostnamePrefix ) {
1203
+ entry.pool.hostnamePrefix = `${ prefix }-`;
1204
+ }
1205
+
1089
1206
  finalPools.push(entry.pool);
1090
1207
  }
1091
1208
 
@@ -1111,7 +1228,7 @@ export default {
1111
1228
  },
1112
1229
 
1113
1230
  validationPassed() {
1114
- return (this.provider === 'custom' || !!this.credentialId);
1231
+ return (this.provider === 'custom' || this.isElementalCluster || !!this.credentialId);
1115
1232
  },
1116
1233
 
1117
1234
  cancelCredential() {
@@ -1202,9 +1319,10 @@ export default {
1202
1319
  const namespace = this.machinePools?.[0]?.config?.vmNamespace;
1203
1320
 
1204
1321
  const res = await this.$store.dispatch('management/request', {
1205
- url: `/k8s/clusters/${ clusterId }/v1/harvester/kubeconfig`,
1206
- method: 'POST',
1207
- data: {
1322
+ url: `/k8s/clusters/${ clusterId }/v1/harvester/kubeconfig`,
1323
+ method: 'POST',
1324
+ data: {
1325
+ csiClusterRoleName: 'harvesterhci.io:csi-driver',
1208
1326
  clusterRoleName: 'harvesterhci.io:cloudprovider',
1209
1327
  namespace,
1210
1328
  serviceAccountName: this.value.metadata.name,
@@ -1393,13 +1511,23 @@ export default {
1393
1511
  },
1394
1512
 
1395
1513
  async initRegistry() {
1396
- let registryMode = PUBLIC;
1397
- let registryHost = this.agentConfig?.['system-default-registry'] || '';
1398
- let registrySecret = null;
1399
- let regs = this.rkeConfig.registries;
1514
+ // Check for an existing cluster scoped registry
1515
+ const clusterRegistry = this.agentConfig?.['system-default-registry'] || '';
1400
1516
 
1517
+ // Check for the global registry
1401
1518
  this.systemRegistry = (await this.$store.dispatch('management/find', { type: MANAGEMENT.SETTING, id: SETTING.SYSTEM_DEFAULT_REGISTRY })).value || '';
1402
1519
 
1520
+ // The order of precedence is to use the cluster scoped registry
1521
+ // if it exists, then use the global scoped registry as a fallback
1522
+ if (clusterRegistry) {
1523
+ this.registryHost = clusterRegistry;
1524
+ } else {
1525
+ this.registryHost = this.systemRegistry;
1526
+ }
1527
+
1528
+ let registrySecret = null;
1529
+ let regs = this.rkeConfig.registries;
1530
+
1403
1531
  if ( !regs ) {
1404
1532
  regs = {};
1405
1533
  set(this.rkeConfig, 'registries', regs);
@@ -1413,75 +1541,85 @@ export default {
1413
1541
  set(regs, 'mirrors', {});
1414
1542
  }
1415
1543
 
1416
- if ( registryHost ) {
1417
- registryMode = PRIVATE;
1418
- } else if ( this.systemRegistry ) {
1419
- registryHost = this.systemRegistry;
1420
- registryMode = PRIVATE;
1544
+ const hostname = Object.keys(regs.configs)[0];
1545
+ const config = regs.configs[hostname];
1546
+
1547
+ if ( config ) {
1548
+ registrySecret = config.authConfigSecretName;
1421
1549
  }
1422
1550
 
1423
- if ( Object.keys(regs.mirrors || {}).length || Object.keys(regs.configs || {}).length > 1 ) {
1424
- registryMode = ADVANCED;
1425
- } else {
1426
- const hostname = Object.keys(regs.configs)[0];
1427
- const config = regs.configs[hostname];
1551
+ this.registrySecret = registrySecret;
1428
1552
 
1429
- if ( config ) {
1430
- if ( hostname !== registryHost || config.caBundle || config.insecureSkipVerify || config.tlsSecretName ) {
1431
- registryMode = ADVANCED;
1432
- } else {
1433
- registryMode = PRIVATE;
1434
- registrySecret = config.authConfigSecretName;
1435
- }
1553
+ const hasMirrorsOrAuthConfig = Object.keys(regs.configs).length > 0 || Object.keys(regs.mirrors).length > 0;
1554
+
1555
+ if (this.registryHost || registrySecret || hasMirrorsOrAuthConfig) {
1556
+ this.showCustomRegistryInput = true;
1557
+
1558
+ if (hasMirrorsOrAuthConfig) {
1559
+ this.showCustomRegistryAdvancedInput = true;
1436
1560
  }
1437
1561
  }
1438
-
1439
- this.registryHost = registryHost;
1440
- this.registryMode = registryMode;
1441
- this.registrySecret = registrySecret;
1442
1562
  },
1443
1563
 
1444
1564
  setRegistryConfig() {
1445
1565
  const hostname = (this.registryHost || '').trim();
1446
1566
 
1447
- if ( this.registryMode === PUBLIC ) {
1448
- if ( this.systemRegistry ) {
1449
- // Empty string overrides the system default to nothing
1450
- set(this.agentConfig, 'system-default-registry', '');
1451
- } else {
1452
- // No need to set anything
1453
- set(this.agentConfig, 'system-default-registry', undefined);
1454
- }
1455
- } else if ( !hostname || hostname === this.systemRegistry ) {
1567
+ if ( this.systemRegistry ) {
1568
+ // Empty string overrides the system default to nothing
1569
+ set(this.agentConfig, 'system-default-registry', '');
1570
+ } else {
1571
+ // No need to set anything
1572
+ set(this.agentConfig, 'system-default-registry', undefined);
1573
+ }
1574
+ if ( !hostname || hostname === this.systemRegistry ) {
1456
1575
  // Undefined removes the key which uses the global setting without hardcoding it into the config
1457
1576
  set(this.agentConfig, 'system-default-registry', undefined);
1458
1577
  } else {
1459
1578
  set(this.agentConfig, 'system-default-registry', hostname);
1460
1579
  }
1461
1580
 
1462
- if ( this.registryMode === ADVANCED ) {
1463
- // Leave it alone...
1464
- } else if ( this.registryMode === PRIVATE ) {
1465
- set(this.rkeConfig.registries, 'mirrors', {});
1581
+ if ( hostname && this.registrySecret ) {
1582
+ // For a registry with basic auth, but no mirrors,
1583
+ // add a single registry config with the basic auth secret.
1584
+ const basicAuthConfig = {
1585
+ [hostname]: {
1586
+ authConfigSecretName: this.registrySecret,
1587
+ caBundle: null,
1588
+ insecureSkipVerify: false,
1589
+ tlsSecretName: null,
1590
+ }
1591
+ };
1592
+
1593
+ const rkeConfig = this.value.spec.rkeConfig;
1466
1594
 
1467
- if ( this.registrySecret ) {
1468
- set(this.rkeConfig.registries, 'configs', {
1469
- [hostname]: {
1470
- authConfigSecretName: this.registrySecret,
1471
- caBundle: null,
1472
- insecureSkipVerify: false,
1473
- tlsSecretName: null,
1474
- }
1475
- });
1595
+ if (!rkeConfig) {
1596
+ this.value.spec.rkeConfig = { registries: { configs: basicAuthConfig } };
1597
+ } else if (rkeConfig.registries.configs && Object.keys(rkeConfig.registries.configs).length > 0) {
1598
+ // If some existing authentication secrets are already configured
1599
+ // for registry mirrors, the basic auth is added to the existing ones.
1600
+ const existingConfigs = rkeConfig.registries.configs;
1601
+
1602
+ this.value.spec.rkeConfig.registries.configs = { ...basicAuthConfig, ...existingConfigs };
1476
1603
  } else {
1477
- set(this.rkeConfig.registries, 'configs', {});
1604
+ const existingMirrorAndAuthConfig = this.value.spec.rkeConfig.registries;
1605
+
1606
+ this.value.spec.rkeConfig.registries = {
1607
+ ...existingMirrorAndAuthConfig,
1608
+ configs: basicAuthConfig
1609
+ };
1478
1610
  }
1479
- } else {
1480
- set(this.rkeConfig.registries, 'configs', {});
1481
- set(this.rkeConfig.registries, 'mirrors', {});
1482
1611
  }
1483
1612
  },
1484
1613
 
1614
+ updateConfigs(configs) {
1615
+ // Update authentication configuration
1616
+ // for each mirror
1617
+ if (!this.value.spec?.rkeConfig) {
1618
+ this.value.spec.rkeConfig = { registries: {} };
1619
+ }
1620
+ set(this.value.spec.rkeConfig.registries, 'configs', configs);
1621
+ },
1622
+
1485
1623
  getAllOptionsAfterMinVersion(versions, minVersion, defaultVersion) {
1486
1624
  const out = (versions || []).filter(obj => !!obj.serverArgs).map((obj) => {
1487
1625
  let disabled = false;
@@ -1623,6 +1761,64 @@ export default {
1623
1761
  }
1624
1762
  this.setHarvesterDefaultCloudProvider();
1625
1763
  },
1764
+ toggleCustomRegistry(e) {
1765
+ if (this.registryHost) {
1766
+ this.registryHost = null;
1767
+ this.registrySecret = null;
1768
+ } else {
1769
+ this.initRegistry();
1770
+ }
1771
+ },
1772
+ updateCisProfile() {
1773
+ // If the user selects any Worker CIS Profile,
1774
+ // protect-kernel-defaults should be set to false
1775
+ // in the RKE2 worker/agent config.
1776
+ const selectedCisProfile = this.agentConfig?.profile;
1777
+
1778
+ if (selectedCisProfile) {
1779
+ set(this.agentConfig, 'protect-kernel-defaults', true);
1780
+ } else {
1781
+ set(this.agentConfig, 'protect-kernel-defaults', false);
1782
+ }
1783
+ },
1784
+
1785
+ /**
1786
+ * Handle k8s changes side effects, like PSP and PSA resets
1787
+ */
1788
+ handleKubernetesChange(value) {
1789
+ if (value) {
1790
+ const version = VERSION.parse(value);
1791
+ const major = parseInt(version?.[0] || 0);
1792
+ const minor = parseInt(version?.[1] || 0);
1793
+
1794
+ // If the new version is 1.25 or greater, set the PSP Policy to 'RKE2 Default' (empty string)
1795
+ if (major === 1 && minor >= 25) {
1796
+ set(this.value.spec, 'defaultPodSecurityPolicyTemplateName', '');
1797
+ } else {
1798
+ const previous = VERSION.parse(this.previousKubernetesVersion);
1799
+ const major = parseInt(previous?.[0] || 0);
1800
+ const minor = parseInt(previous?.[1] || 0);
1801
+
1802
+ if (major === 1 && minor >= 25) {
1803
+ // Previous value was 1.25 or greater, so reset back
1804
+ set(this.value.spec, 'defaultPodSecurityPolicyTemplateName', this.lastDefaultPodSecurityPolicyTemplateName);
1805
+ }
1806
+ }
1807
+
1808
+ this.previousKubernetesVersion = value;
1809
+ set(this.value.spec, 'defaultPodSecurityAdmissionConfigurationTemplateName', '');
1810
+ }
1811
+ },
1812
+
1813
+ /**
1814
+ * Handle PSP changes side effects, like PSA resets
1815
+ */
1816
+ handlePspChange(value) {
1817
+ if (value) {
1818
+ this.lastDefaultPodSecurityPolicyTemplateName = value;
1819
+ }
1820
+ },
1821
+
1626
1822
  },
1627
1823
  };
1628
1824
  </script>
@@ -1652,12 +1848,14 @@ export default {
1652
1848
  @cancel="cancel"
1653
1849
  @error="fvUnreportedValidationErrors"
1654
1850
  >
1655
- <Banner
1656
- v-if="isEdit"
1657
- color="warning"
1658
- >
1659
- <span v-html="t('cluster.banner.rke2-k3-reprovisioning', {}, true)" />
1660
- </Banner>
1851
+ <div class="header-warnings">
1852
+ <Banner
1853
+ v-if="isEdit"
1854
+ color="warning"
1855
+ >
1856
+ <span v-html="t('cluster.banner.rke2-k3-reprovisioning', {}, true)" />
1857
+ </Banner>
1858
+ </div>
1661
1859
  <SelectCredential
1662
1860
  v-if="needCredential"
1663
1861
  v-model="credentialId"
@@ -1690,6 +1888,7 @@ export default {
1690
1888
  {{ appsOSWarning }}
1691
1889
  </Banner>
1692
1890
 
1891
+ <!-- Pools Extras -->
1693
1892
  <template v-if="hasMachinePools">
1694
1893
  <div class="clearfix">
1695
1894
  <h2
@@ -1723,6 +1922,7 @@ export default {
1723
1922
  </div>
1724
1923
  </div>
1725
1924
 
1925
+ <!-- Extra Tabs for Machine Pool -->
1726
1926
  <Tabbed
1727
1927
  ref="pools"
1728
1928
  :side-tabs="true"
@@ -1752,14 +1952,19 @@ export default {
1752
1952
  </Tab>
1753
1953
  </template>
1754
1954
  <div v-if="!unremovedMachinePools.length">
1755
- You do not have any machine pools defined, click the plus to add one.
1955
+ {{ t('cluster.machinePool.noPoolsDisclaimer') }}
1756
1956
  </div>
1757
1957
  </Tabbed>
1758
1958
  <div class="spacer" />
1759
1959
  </template>
1760
1960
 
1961
+ <!-- Cluster Tabs -->
1761
1962
  <h2 v-t="'cluster.tabs.cluster'" />
1762
- <Tabbed :side-tabs="true">
1963
+ <Tabbed
1964
+ :side-tabs="true"
1965
+ class="min-height"
1966
+ >
1967
+ <!-- Basic -->
1763
1968
  <Tab
1764
1969
  name="basic"
1765
1970
  label-key="cluster.tabs.basic"
@@ -1769,7 +1974,7 @@ export default {
1769
1974
  <Banner
1770
1975
  v-if="!haveArgInfo"
1771
1976
  color="warning"
1772
- label="Configuration information is not available for the selected Kubernetes version. The options available in this screen will be limited, you may want to use the YAML editor."
1977
+ :label="t('cluster.banner.haveArgInfo')"
1773
1978
  />
1774
1979
  <Banner
1775
1980
  v-if="showk8s21LegacyWarning"
@@ -1791,6 +1996,7 @@ export default {
1791
1996
  :mode="mode"
1792
1997
  :options="versionOptions"
1793
1998
  label-key="cluster.kubernetesVersion.label"
1999
+ @input="handleKubernetesChange($event)"
1794
2000
  />
1795
2001
  <Checkbox
1796
2002
  v-model="showDeprecatedPatchVersions"
@@ -1865,16 +2071,56 @@ export default {
1865
2071
  <h3>
1866
2072
  {{ t('cluster.rke2.security.header') }}
1867
2073
  </h3>
1868
- <div class="row">
2074
+ <Banner
2075
+ v-if="isEdit && displayInvalidPspsBanner"
2076
+ color="warning"
2077
+ >
2078
+ <span v-html="t('cluster.banner.invalidPsps', {}, true)" />
2079
+ </Banner>
2080
+ <Banner
2081
+ v-else-if="isCreate && !needsPSP"
2082
+ color="info"
2083
+ >
2084
+ <span v-html="t('cluster.banner.removedPsp', {}, true)" />
2085
+ </Banner>
2086
+ <Banner
2087
+ v-else-if="isCreate"
2088
+ color="info"
2089
+ >
2090
+ <span v-html="t('cluster.banner.deprecatedPsp', {}, true)" />
2091
+ </Banner>
2092
+ <div
2093
+ v-if="needsPSA"
2094
+ class="row mb-10"
2095
+ >
1869
2096
  <div class="col span-6">
2097
+ <!-- PSA template selector -->
2098
+ <LabeledSelect
2099
+ v-model="value.spec.defaultPodSecurityAdmissionConfigurationTemplateName"
2100
+ :mode="mode"
2101
+ data-testid="rke2-custom-edit-psa"
2102
+ :options="psaOptions"
2103
+ :label="t('cluster.rke2.defaultPodSecurityAdmissionConfigurationTemplateName.label')"
2104
+ />
2105
+ </div>
2106
+ </div>
2107
+
2108
+ <div class="row">
2109
+ <div
2110
+ v-if="pspOptions && needsPSP"
2111
+ class="col span-6"
2112
+ >
2113
+ <!-- PSP template selector -->
1870
2114
  <LabeledSelect
1871
- v-if="pspOptions"
1872
2115
  v-model="value.spec.defaultPodSecurityPolicyTemplateName"
2116
+ data-testid="rke2-custom-edit-psp"
1873
2117
  :mode="mode"
1874
2118
  :options="pspOptions"
1875
2119
  :label="t('cluster.rke2.defaultPodSecurityPolicyTemplateName.label')"
2120
+ @input="handlePspChange($event)"
1876
2121
  />
1877
2122
  </div>
2123
+
1878
2124
  <div
1879
2125
  v-if="showCisProfile"
1880
2126
  class="col span-6"
@@ -1891,7 +2137,8 @@ export default {
1891
2137
  v-model="agentConfig.profile"
1892
2138
  :mode="mode"
1893
2139
  :options="profileOptions"
1894
- label="Worker CIS Profile"
2140
+ :label="t('cis.workerProfile')"
2141
+ @input="updateCisProfile"
1895
2142
  />
1896
2143
  </div>
1897
2144
  </div>
@@ -1948,6 +2195,7 @@ export default {
1948
2195
  </div>
1949
2196
  </Tab>
1950
2197
 
2198
+ <!-- Member Roles -->
1951
2199
  <Tab
1952
2200
  v-if="canManageMembers"
1953
2201
  name="memberRoles"
@@ -1967,6 +2215,7 @@ export default {
1967
2215
  />
1968
2216
  </Tab>
1969
2217
 
2218
+ <!-- etcd -->
1970
2219
  <Tab
1971
2220
  name="etcd"
1972
2221
  label-key="cluster.tabs.etcd"
@@ -2044,6 +2293,7 @@ export default {
2044
2293
  </div>
2045
2294
  </Tab>
2046
2295
 
2296
+ <!-- Networking -->
2047
2297
  <Tab
2048
2298
  v-if="haveArgInfo"
2049
2299
  name="networking"
@@ -2145,6 +2395,7 @@ export default {
2145
2395
  />
2146
2396
  </Tab>
2147
2397
 
2398
+ <!-- Upgrade -->
2148
2399
  <Tab
2149
2400
  name="upgrade"
2150
2401
  label-key="cluster.tabs.upgrade"
@@ -2189,55 +2440,91 @@ export default {
2189
2440
  </div>
2190
2441
  </Tab>
2191
2442
 
2443
+ <!-- Registries -->
2192
2444
  <Tab
2193
2445
  name="registry"
2194
2446
  label-key="cluster.tabs.registry"
2195
2447
  >
2196
- <RadioGroup
2197
- v-model="registryMode"
2198
- name="registry-mode"
2199
- :options="registryOptions"
2200
- :mode="mode"
2201
- />
2202
-
2203
- <LabeledInput
2204
- v-if="registryMode !== PUBLIC"
2205
- v-model="registryHost"
2206
- class="mt-20"
2207
- :mode="mode"
2208
- :required="true"
2209
- :label="t('cluster.privateRegistry.systemDefaultRegistry.label')"
2210
- />
2211
-
2212
- <SelectOrCreateAuthSecret
2213
- v-if="registryMode === PRIVATE"
2214
- v-model="registrySecret"
2215
- :register-before-hook="registerBeforeHook"
2216
- :hook-priority="1"
2217
- :mode="mode"
2218
- in-store="management"
2219
- :allow-ssh="false"
2220
- :allow-rke="true"
2221
- :vertical="true"
2222
- :namespace="value.metadata.namespace"
2223
- generate-name="registryconfig-auth-"
2224
- />
2225
- <template v-else-if="registryMode === ADVANCED">
2226
- <RegistryMirrors
2227
- v-model="value"
2228
- class="mt-20"
2229
- :mode="mode"
2230
- />
2231
-
2232
- <RegistryConfigs
2233
- v-model="value"
2234
- class="mt-20"
2235
- :mode="mode"
2236
- :cluster-register-before-hook="registerBeforeHook"
2448
+ <div class="row">
2449
+ <h3>Registry for Rancher System Container Images</h3>
2450
+ </div>
2451
+ <div class="row">
2452
+ <div class="col span-12">
2453
+ <Banner
2454
+ :closable="false"
2455
+ class="cluster-tools-tip"
2456
+ color="info"
2457
+ label-key="cluster.privateRegistry.description"
2458
+ />
2459
+ </div>
2460
+ </div>
2461
+ <div class="row">
2462
+ <Checkbox
2463
+ v-model="showCustomRegistryInput"
2464
+ class="mb-20"
2465
+ :label="t('cluster.privateRegistry.label')"
2466
+ @input="toggleCustomRegistry"
2237
2467
  />
2468
+ </div>
2469
+ <div
2470
+ v-if="showCustomRegistryInput"
2471
+ class="row"
2472
+ >
2473
+ <div class="col span-6">
2474
+ <LabeledInput
2475
+ v-model="registryHost"
2476
+ label-key="catalog.chart.registry.custom.inputLabel"
2477
+ placeholder-key="catalog.chart.registry.custom.placeholder"
2478
+ :min-height="30"
2479
+ />
2480
+ <SelectOrCreateAuthSecret
2481
+ v-model="registrySecret"
2482
+ :register-before-hook="registerBeforeHook"
2483
+ :hook-priority="1"
2484
+ :mode="mode"
2485
+ in-store="management"
2486
+ :allow-ssh="false"
2487
+ :allow-rke="true"
2488
+ :vertical="true"
2489
+ :namespace="value.metadata.namespace"
2490
+ generate-name="registryconfig-auth-"
2491
+ />
2492
+ </div>
2493
+ </div>
2494
+ <template>
2495
+ <div
2496
+ v-if="showCustomRegistryInput"
2497
+ class="row"
2498
+ >
2499
+ <AdvancedSection
2500
+ class="col span-12 advanced"
2501
+ :is-open-by-default="showCustomRegistryAdvancedInput"
2502
+ :mode="mode"
2503
+ >
2504
+ <Banner
2505
+ :closable="false"
2506
+ class="cluster-tools-tip"
2507
+ color="info"
2508
+ :label-key="isK3s ? 'cluster.privateRegistry.docsLinkK3s' : 'cluster.privateRegistry.docsLinkRke2'"
2509
+ />
2510
+ <RegistryMirrors
2511
+ v-model="value"
2512
+ class="mt-20"
2513
+ :mode="mode"
2514
+ />
2515
+ <RegistryConfigs
2516
+ v-model="value"
2517
+ class="mt-20"
2518
+ :mode="mode"
2519
+ :cluster-register-before-hook="registerBeforeHook"
2520
+ @updateConfigs="updateConfigs"
2521
+ />
2522
+ </AdvancedSection>
2523
+ </div>
2238
2524
  </template>
2239
2525
  </Tab>
2240
2526
 
2527
+ <!-- Add-on Config -->
2241
2528
  <Tab
2242
2529
  name="addons"
2243
2530
  label-key="cluster.tabs.addons"
@@ -2301,6 +2588,7 @@ export default {
2301
2588
  </div>
2302
2589
  </Tab>
2303
2590
 
2591
+ <!-- Advanced -->
2304
2592
  <Tab
2305
2593
  v-if="haveArgInfo || agentArgs['protect-kernel-defaults']"
2306
2594
  name="advanced"
@@ -2411,7 +2699,13 @@ export default {
2411
2699
  </template>
2412
2700
 
2413
2701
  <style lang="scss" scoped>
2702
+ .min-height {
2703
+ min-height: 40em;
2704
+ }
2414
2705
  .patch-version {
2415
2706
  margin-top: 5px;
2416
2707
  }
2708
+ .header-warnings .banner {
2709
+ margin-bottom: 0;
2710
+ }
2417
2711
  </style>