@rancher/shell 0.1.0 → 0.1.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 (595) hide show
  1. package/assets/styles/base/_basic.scss +0 -1
  2. package/assets/styles/base/_variables.scss +2 -0
  3. package/assets/styles/global/_labeled-input.scss +6 -1
  4. package/assets/styles/global/_select.scss +9 -0
  5. package/assets/styles/vendor/vue-js-modal.scss +4 -0
  6. package/assets/translations/en-us.yaml +240 -16
  7. package/assets/translations/zh-hans.yaml +335 -111
  8. package/chart/example.vue +1 -1
  9. package/chart/istio.vue +2 -2
  10. package/chart/logging/index.vue +2 -2
  11. package/chart/monitoring/alerting/index.vue +2 -2
  12. package/chart/monitoring/grafana/index.vue +2 -2
  13. package/chart/monitoring/index.vue +2 -2
  14. package/chart/monitoring/prometheus/index.vue +4 -4
  15. package/chart/rancher-alerting-drivers.vue +17 -3
  16. package/chart/rancher-backup/S3.vue +37 -4
  17. package/chart/rancher-backup/index.vue +3 -3
  18. package/cloud-credential/aws.vue +1 -1
  19. package/cloud-credential/azure.vue +1 -1
  20. package/cloud-credential/digitalocean.vue +1 -1
  21. package/cloud-credential/gcp.vue +1 -1
  22. package/cloud-credential/generic.vue +1 -1
  23. package/cloud-credential/harvester.vue +2 -2
  24. package/cloud-credential/linode.vue +1 -1
  25. package/cloud-credential/s3.vue +2 -2
  26. package/cloud-credential/vmwarevsphere.vue +1 -1
  27. package/components/ActionMenu.vue +11 -1
  28. package/components/Alert.vue +1 -1
  29. package/components/AssignTo.vue +2 -2
  30. package/components/AsyncButton.vue +25 -12
  31. package/components/AwsComplianceBanner.vue +44 -0
  32. package/components/BannerGraphic.vue +11 -2
  33. package/components/ChartReadme.vue +10 -2
  34. package/components/CompoundStatusBadge.vue +50 -0
  35. package/components/CopyToClipboardText.vue +25 -4
  36. package/components/CruResource.vue +185 -16
  37. package/components/CruResourceFooter.vue +17 -1
  38. package/components/EtcdInfoBanner.vue +1 -1
  39. package/components/FilterLabel.vue +254 -0
  40. package/components/GlobalRoleBindings.vue +2 -2
  41. package/components/GrafanaDashboard.vue +1 -1
  42. package/components/GrowlManager.vue +20 -9
  43. package/components/HarvesterServiceAddOnConfig.vue +2 -2
  44. package/components/Import.vue +2 -2
  45. package/components/LandingPagePreference.vue +2 -2
  46. package/components/Markdown.vue +44 -12
  47. package/components/ModalWithCard.vue +2 -2
  48. package/components/MoveModal.vue +1 -1
  49. package/components/PercentageBar.vue +1 -1
  50. package/components/PromptChangePassword.vue +1 -1
  51. package/components/PromptModal.vue +13 -2
  52. package/components/PromptRemove.vue +64 -33
  53. package/components/PromptRestore.vue +3 -3
  54. package/components/Questions/Boolean.vue +1 -1
  55. package/components/Questions/Float.vue +1 -1
  56. package/components/Questions/Int.vue +1 -1
  57. package/components/Questions/Reference.vue +1 -1
  58. package/components/Questions/String.vue +1 -1
  59. package/components/RelatedResources.vue +1 -1
  60. package/components/RelatedWorkloadsTable.vue +3 -1
  61. package/components/ResourceDetail/Masthead.vue +27 -9
  62. package/components/ResourceDetail/index.vue +72 -7
  63. package/components/ResourceList/Masthead.vue +22 -0
  64. package/components/ResourceList/ResourceLoadingIndicator.vue +137 -0
  65. package/components/ResourceList/index.vue +42 -7
  66. package/components/ResourceTable.vue +11 -2
  67. package/components/ResourceYaml.vue +7 -1
  68. package/components/SelectIconGrid.vue +14 -1
  69. package/components/SortableTable/THead.vue +1 -1
  70. package/components/SortableTable/debug.js +117 -0
  71. package/components/SortableTable/index.vue +200 -43
  72. package/components/SortableTable/paging.js +2 -12
  73. package/components/SortableTable/selection.js +3 -0
  74. package/components/SortableTable/sorting.js +3 -1
  75. package/components/Tabbed/Tab.vue +25 -4
  76. package/components/Tabbed/index.vue +133 -119
  77. package/components/TypeDescription.vue +1 -1
  78. package/components/VMConsoleBar.vue +1 -1
  79. package/components/Wizard.vue +53 -14
  80. package/components/YamlEditor.vue +10 -0
  81. package/components/__tests__/CopyCode.test.ts +1 -7
  82. package/components/__tests__/CruResource.test.ts +1 -8
  83. package/components/auth/AllowedPrincipals.vue +1 -1
  84. package/components/auth/AuthBanner.vue +2 -1
  85. package/components/auth/AzureWarning.vue +69 -0
  86. package/components/auth/RoleDetailEdit.vue +4 -4
  87. package/components/auth/login/ldap.vue +1 -1
  88. package/components/cards/ApplicationCard.vue +140 -0
  89. package/components/dialog/AddClusterMemberDialog.vue +1 -1
  90. package/components/dialog/AddCustomBadgeDialog.vue +4 -4
  91. package/components/dialog/AddProjectMemberDialog.vue +2 -2
  92. package/components/dialog/AddonConfigConfirmationDialog.vue +1 -1
  93. package/components/dialog/DrainNode.vue +3 -3
  94. package/components/dialog/ForceMachineRemoveDialog.vue +2 -2
  95. package/components/dialog/GenericPrompt.vue +2 -2
  96. package/components/dialog/RollbackWorkloadDialog.vue +2 -2
  97. package/components/dialog/RotateCertificatesDialog.vue +3 -3
  98. package/components/dialog/RotateEncryptionKeyDialog.vue +11 -6
  99. package/components/dialog/SaveAsRKETemplateDialog.vue +3 -3
  100. package/components/dialog/harvester/AddHotplugModal.vue +3 -3
  101. package/components/dialog/harvester/BackupModal.vue +3 -3
  102. package/components/dialog/harvester/CloneTemplate.vue +3 -3
  103. package/components/dialog/harvester/EjectCDROMDialog.vue +3 -3
  104. package/components/dialog/harvester/ExportImageDialog.vue +3 -3
  105. package/components/dialog/harvester/MaintenanceDialog.vue +2 -2
  106. package/components/dialog/harvester/MigrationDialog.vue +2 -2
  107. package/components/dialog/harvester/RestoreDialog.vue +2 -2
  108. package/components/dialog/harvester/SupportBundle.vue +2 -2
  109. package/components/dialog/harvester/UnplugVolume.vue +2 -2
  110. package/components/fleet/FleetBundleResources.vue +1 -1
  111. package/components/fleet/FleetBundles.vue +1 -1
  112. package/components/fleet/FleetResources.vue +5 -3
  113. package/components/fleet/ForceDirectedTreeChart/chartIcons.js +17 -0
  114. package/components/fleet/ForceDirectedTreeChart/index.vue +553 -0
  115. package/components/form/ArrayList.vue +22 -3
  116. package/components/form/BannerSettings.vue +3 -3
  117. package/components/form/ChangePassword.vue +2 -2
  118. package/components/form/Command.vue +28 -9
  119. package/components/form/Error.vue +50 -0
  120. package/components/form/Footer.vue +2 -5
  121. package/components/form/HealthCheck.vue +2 -2
  122. package/components/form/HookOption.vue +2 -2
  123. package/components/form/InputWithSelect.vue +12 -2
  124. package/components/form/KeyValue.vue +5 -2
  125. package/components/form/LabeledSelect.vue +27 -14
  126. package/components/form/Labels.vue +12 -0
  127. package/components/form/MatchExpressions.vue +44 -10
  128. package/components/form/Members/ClusterPermissionsEditor.vue +3 -3
  129. package/components/form/Members/MembershipEditor.vue +10 -1
  130. package/components/form/Members/ProjectMembershipEditor.vue +1 -0
  131. package/components/form/NameNsDescription.vue +202 -79
  132. package/components/form/Networking.vue +1 -1
  133. package/components/form/NodeAffinity.vue +41 -26
  134. package/components/form/NodeScheduling.vue +29 -3
  135. package/components/form/NotificationSettings.vue +2 -2
  136. package/components/form/Password.vue +1 -1
  137. package/components/form/PodAffinity.vue +64 -6
  138. package/components/form/PodSecurity.vue +2 -2
  139. package/components/form/Ports.vue +1 -1
  140. package/components/form/Probe.vue +60 -17
  141. package/components/form/ProjectMemberEditor.vue +3 -3
  142. package/components/form/ResourceQuota/NamespaceRow.vue +46 -2
  143. package/components/form/ResourceQuota/Project.vue +4 -0
  144. package/components/form/ResourceTabs/index.vue +19 -7
  145. package/components/form/RuleSelector.vue +1 -1
  146. package/components/form/Security.vue +56 -14
  147. package/components/form/Select.vue +52 -10
  148. package/components/form/SelectOrCreateAuthSecret.vue +70 -31
  149. package/components/form/ServiceNameSelect.vue +1 -1
  150. package/components/form/ServicePorts.vue +10 -2
  151. package/components/form/ShellInput.vue +1 -1
  152. package/components/form/SimpleSecretSelector.vue +2 -2
  153. package/components/form/Tolerations.vue +1 -1
  154. package/components/form/UnitInput.vue +12 -3
  155. package/components/form/ValueFromResource.vue +1 -1
  156. package/components/form/WorkloadPorts.vue +1 -1
  157. package/components/form/__tests__/Command.test.ts +63 -0
  158. package/components/form/__tests__/Error.test.ts +56 -0
  159. package/components/form/__tests__/MatchExpressions.test.ts +79 -0
  160. package/components/form/__tests__/Probe.test.ts +62 -0
  161. package/components/form/__tests__/Security.test.ts +55 -0
  162. package/components/form/__tests__/UnitInput.test.ts +31 -23
  163. package/components/formatter/BadgeStateFormatter.vue +1 -1
  164. package/components/formatter/Capitalize.vue +7 -0
  165. package/components/formatter/ClusterLink.vue +6 -2
  166. package/components/formatter/ClusterProvider.vue +36 -0
  167. package/components/formatter/DelayedValue.vue +43 -0
  168. package/components/formatter/Endpoints.vue +2 -2
  169. package/components/formatter/HarvesterDiskState.vue +1 -1
  170. package/components/formatter/HarvesterIpAddress.vue +37 -18
  171. package/components/formatter/HarvesterMigrationState.vue +1 -1
  172. package/components/formatter/HarvesterVmState.vue +1 -1
  173. package/components/formatter/LinkDetail.vue +11 -2
  174. package/components/formatter/LinkName.vue +2 -2
  175. package/components/formatter/LiveExpiryBadgeState.vue +1 -1
  176. package/components/formatter/LivePodRestarts.vue +47 -0
  177. package/components/formatter/MachineSummaryGraph.vue +51 -5
  178. package/components/formatter/PodsUsage.vue +5 -3
  179. package/components/formatter/Weight.vue +1 -1
  180. package/components/formatter/WorkloadHealthScale.vue +17 -6
  181. package/components/nav/HarvesterUpgrade.vue +15 -5
  182. package/components/nav/Header.vue +15 -6
  183. package/components/nav/Jump.vue +1 -1
  184. package/components/nav/NamespaceFilter.vue +30 -10
  185. package/components/nav/TopLevelMenu.vue +52 -14
  186. package/components/nav/WindowManager/ContainerLogs.vue +14 -2
  187. package/components/nav/WorkspaceSwitcher.vue +1 -1
  188. package/components/{NovncConsole.vue → novnc/NovncConsole.vue} +0 -0
  189. package/components/novnc/NovncConsoleItem.vue +89 -0
  190. package/components/novnc/NovncConsoleWrapper.vue +243 -0
  191. package/config/labels-annotations.js +6 -2
  192. package/config/product/explorer.js +7 -3
  193. package/config/product/fleet.js +4 -1
  194. package/config/product/manager.js +5 -6
  195. package/config/product/settings.js +12 -1
  196. package/config/query-params.js +2 -0
  197. package/config/roles.ts +5 -0
  198. package/config/settings.js +60 -63
  199. package/config/table-headers.js +47 -18
  200. package/config/types.js +24 -8
  201. package/content/docs/en-us/whats-new.md +25 -0
  202. package/core/plugin.ts +12 -2
  203. package/creators/app/init +7 -1
  204. package/creators/pkg/tsconfig.json +2 -3
  205. package/detail/catalog.cattle.io.app.vue +1 -1
  206. package/detail/cis.cattle.io.clusterscan.vue +1 -1
  207. package/detail/fleet.cattle.io.bundle.vue +73 -21
  208. package/detail/fleet.cattle.io.gitrepo.vue +5 -4
  209. package/detail/harvesterhci.io.host/HarvesterHostBasic.vue +25 -4
  210. package/detail/harvesterhci.io.host/HarvesterHostDisk.vue +2 -2
  211. package/detail/harvesterhci.io.virtualmachinebackup/index.vue +1 -1
  212. package/detail/helm.cattle.io.projecthelmchart.vue +1 -1
  213. package/detail/networking.k8s.io.ingress.vue +10 -2
  214. package/detail/pod.vue +37 -1
  215. package/detail/provisioning.cattle.io.cluster.vue +102 -15
  216. package/detail/workload/index.vue +163 -15
  217. package/edit/auth/azuread.vue +146 -34
  218. package/edit/auth/github.vue +3 -3
  219. package/edit/auth/googleoauth.vue +3 -3
  220. package/edit/auth/ldap/config.vue +15 -7
  221. package/edit/auth/ldap/index.vue +2 -2
  222. package/edit/auth/oidc.vue +3 -3
  223. package/edit/auth/saml.vue +3 -3
  224. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
  225. package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +1 -1
  226. package/edit/autoscaling.horizontalpodautoscaler/metric-object-reference.vue +1 -1
  227. package/edit/autoscaling.horizontalpodautoscaler/metric-target.vue +1 -1
  228. package/edit/autoscaling.horizontalpodautoscaler/metrics-row.vue +1 -1
  229. package/edit/catalog.cattle.io.clusterrepo.vue +2 -2
  230. package/edit/cis.cattle.io.clusterscan.vue +4 -4
  231. package/edit/cis.cattle.io.clusterscanbenchmark.vue +1 -1
  232. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -1
  233. package/edit/fleet.cattle.io.cluster.vue +1 -0
  234. package/edit/fleet.cattle.io.clustergroup.vue +1 -1
  235. package/edit/fleet.cattle.io.gitrepo.vue +290 -157
  236. package/edit/harvesterhci.io.host/HarvesterDisk.vue +4 -5
  237. package/edit/harvesterhci.io.host/index.vue +28 -19
  238. package/edit/harvesterhci.io.keypair.vue +1 -1
  239. package/edit/harvesterhci.io.managedchart/rancher-monitoring.vue +1 -1
  240. package/edit/harvesterhci.io.management.cluster.vue +1 -1
  241. package/edit/harvesterhci.io.networkattachmentdefinition.vue +2 -2
  242. package/edit/harvesterhci.io.setting/additional-ca.vue +1 -1
  243. package/edit/harvesterhci.io.setting/backup-target.vue +1 -1
  244. package/edit/harvesterhci.io.setting/http-proxy.vue +1 -1
  245. package/edit/harvesterhci.io.setting/index.vue +3 -3
  246. package/edit/harvesterhci.io.setting/overcommit-config.vue +4 -1
  247. package/edit/harvesterhci.io.setting/ssl-parameters.vue +1 -1
  248. package/edit/harvesterhci.io.setting/support-bundle-image.vue +1 -1
  249. package/edit/harvesterhci.io.setting/vip-pools.vue +1 -1
  250. package/edit/harvesterhci.io.setting/vm-force-reset-policy.vue +2 -2
  251. package/edit/harvesterhci.io.virtualmachinebackup.vue +2 -2
  252. package/edit/harvesterhci.io.virtualmachineimage.vue +2 -2
  253. package/edit/harvesterhci.io.virtualmachinetemplateversion.vue +26 -18
  254. package/edit/helm.cattle.io.projecthelmchart.vue +3 -3
  255. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +2 -2
  256. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/AccessCredentialsUsers.vue +1 -1
  257. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/index.vue +1 -1
  258. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/DataTemplate.vue +1 -0
  259. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/index.vue +2 -1
  260. package/edit/kubevirt.io.virtualmachine/VirtualMachineCpuMemory.vue +3 -1
  261. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/__tests__/HarvesterEditNetwork.test.ts +41 -0
  262. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue +79 -36
  263. package/edit/kubevirt.io.virtualmachine/VirtualMachineReserved.vue +54 -0
  264. package/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue +1 -1
  265. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +2 -3
  266. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditContainer.test.ts +40 -0
  267. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditExisting.test.ts +102 -0
  268. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVMImage.test.ts +117 -0
  269. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVolume.test.ts +74 -0
  270. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/container.vue +59 -13
  271. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue +72 -16
  272. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/vmImage.vue +74 -14
  273. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue +35 -9
  274. package/edit/kubevirt.io.virtualmachine/index.vue +33 -24
  275. package/edit/logging-flow/index.vue +1 -1
  276. package/edit/logging.banzaicloud.io.output/index.vue +1 -1
  277. package/edit/logging.banzaicloud.io.output/providers/awsElasticsearch.vue +1 -1
  278. package/edit/logging.banzaicloud.io.output/providers/azurestorage.vue +1 -1
  279. package/edit/logging.banzaicloud.io.output/providers/cloudwatch.vue +1 -1
  280. package/edit/logging.banzaicloud.io.output/providers/datadog.vue +2 -2
  281. package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +2 -2
  282. package/edit/logging.banzaicloud.io.output/providers/file.vue +1 -1
  283. package/edit/logging.banzaicloud.io.output/providers/forward.vue +1 -1
  284. package/edit/logging.banzaicloud.io.output/providers/gcs.vue +2 -2
  285. package/edit/logging.banzaicloud.io.output/providers/gelf.vue +2 -2
  286. package/edit/logging.banzaicloud.io.output/providers/kafka.vue +2 -2
  287. package/edit/logging.banzaicloud.io.output/providers/kinesisStream.vue +1 -1
  288. package/edit/logging.banzaicloud.io.output/providers/logdna.vue +1 -1
  289. package/edit/logging.banzaicloud.io.output/providers/logz.vue +2 -2
  290. package/edit/logging.banzaicloud.io.output/providers/loki.vue +2 -2
  291. package/edit/logging.banzaicloud.io.output/providers/newrelic.vue +1 -1
  292. package/edit/logging.banzaicloud.io.output/providers/s3.vue +2 -2
  293. package/edit/logging.banzaicloud.io.output/providers/splunkHec.vue +2 -2
  294. package/edit/logging.banzaicloud.io.output/providers/sumologic.vue +1 -1
  295. package/edit/logging.banzaicloud.io.output/providers/syslog.vue +2 -2
  296. package/edit/management.cattle.io.clusterroletemplatebinding.vue +2 -0
  297. package/edit/management.cattle.io.node.vue +71 -0
  298. package/edit/management.cattle.io.project.vue +28 -23
  299. package/edit/management.cattle.io.setting.vue +14 -3
  300. package/edit/management.cattle.io.user.vue +1 -1
  301. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +4 -4
  302. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +13 -13
  303. package/edit/monitoring.coreos.com.alertmanagerconfig/routeConfig.vue +18 -10
  304. package/edit/monitoring.coreos.com.alertmanagerconfig/tls.vue +2 -2
  305. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +12 -7
  306. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +12 -7
  307. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +20 -11
  308. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +13 -8
  309. package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +25 -7
  310. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +2 -2
  311. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +20 -7
  312. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +1 -1
  313. package/edit/monitoring.coreos.com.prometheusrule/index.vue +19 -8
  314. package/edit/monitoring.coreos.com.receiver/auth.vue +1 -1
  315. package/edit/monitoring.coreos.com.receiver/index.vue +2 -2
  316. package/edit/monitoring.coreos.com.receiver/tls.vue +2 -2
  317. package/edit/monitoring.coreos.com.receiver/types/email.vue +2 -2
  318. package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +2 -2
  319. package/edit/monitoring.coreos.com.receiver/types/pagerduty.vue +2 -2
  320. package/edit/monitoring.coreos.com.receiver/types/slack.vue +2 -2
  321. package/edit/monitoring.coreos.com.receiver/types/webhook.banner.vue +1 -1
  322. package/edit/monitoring.coreos.com.receiver/types/webhook.vue +3 -3
  323. package/edit/monitoring.coreos.com.route.vue +2 -2
  324. package/edit/namespace.vue +0 -8
  325. package/edit/network.harvesterhci.io.clusternetwork/vlan.vue +1 -1
  326. package/edit/networking.istio.io.destinationrule/LoadBalancer.vue +2 -2
  327. package/edit/networking.istio.io.destinationrule/index.vue +1 -1
  328. package/edit/networking.k8s.io.ingress/Certificate.vue +5 -1
  329. package/edit/networking.k8s.io.ingress/Certificates.vue +5 -0
  330. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +17 -2
  331. package/edit/networking.k8s.io.ingress/IngressClass.vue +63 -0
  332. package/edit/networking.k8s.io.ingress/Rule.vue +42 -6
  333. package/edit/networking.k8s.io.ingress/RulePath.vue +29 -5
  334. package/edit/networking.k8s.io.ingress/Rules.vue +11 -0
  335. package/edit/networking.k8s.io.ingress/index.vue +104 -15
  336. package/edit/networking.k8s.io.networkpolicy/PolicyRulePort.vue +1 -1
  337. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +2 -2
  338. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -2
  339. package/edit/persistentvolume/index.vue +1 -1
  340. package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +2 -2
  341. package/edit/persistentvolume/plugins/azureDisk.vue +2 -2
  342. package/edit/persistentvolume/plugins/azureFile.vue +2 -2
  343. package/edit/persistentvolume/plugins/cephfs.vue +4 -4
  344. package/edit/persistentvolume/plugins/cinder.vue +2 -2
  345. package/edit/persistentvolume/plugins/csi.vue +2 -2
  346. package/edit/persistentvolume/plugins/fc.vue +4 -4
  347. package/edit/persistentvolume/plugins/flexVolume.vue +2 -2
  348. package/edit/persistentvolume/plugins/flocker.vue +1 -1
  349. package/edit/persistentvolume/plugins/gcePersistentDisk.vue +2 -2
  350. package/edit/persistentvolume/plugins/glusterfs.vue +2 -2
  351. package/edit/persistentvolume/plugins/hostPath.vue +1 -1
  352. package/edit/persistentvolume/plugins/iscsi.vue +4 -4
  353. package/edit/persistentvolume/plugins/local.vue +1 -1
  354. package/edit/persistentvolume/plugins/longhorn.vue +2 -2
  355. package/edit/persistentvolume/plugins/nfs.vue +2 -2
  356. package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -1
  357. package/edit/persistentvolume/plugins/portworxVolume.vue +2 -2
  358. package/edit/persistentvolume/plugins/quobyte.vue +2 -2
  359. package/edit/persistentvolume/plugins/rbd.vue +4 -4
  360. package/edit/persistentvolume/plugins/scaleIO.vue +2 -2
  361. package/edit/persistentvolume/plugins/storageos.vue +2 -2
  362. package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -1
  363. package/edit/persistentvolumeclaim.vue +24 -8
  364. package/edit/provisioning.cattle.io.cluster/ACE.vue +2 -2
  365. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +8 -3
  366. package/edit/provisioning.cattle.io.cluster/DrainOptions.vue +2 -2
  367. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +15 -3
  368. package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +16 -3
  369. package/edit/provisioning.cattle.io.cluster/S3Config.vue +2 -2
  370. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +1 -1
  371. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.tests.ts +1 -7
  372. package/edit/provisioning.cattle.io.cluster/import.vue +2 -1
  373. package/edit/provisioning.cattle.io.cluster/index.vue +26 -7
  374. package/edit/provisioning.cattle.io.cluster/rke2.vue +136 -48
  375. package/edit/resources.cattle.io.backup.vue +26 -8
  376. package/edit/resources.cattle.io.restore.vue +3 -3
  377. package/edit/secret/basic.vue +1 -1
  378. package/edit/secret/index.vue +80 -2
  379. package/edit/secret/registry.vue +2 -2
  380. package/edit/secret/ssh.vue +1 -1
  381. package/edit/secret/tls.vue +1 -1
  382. package/edit/service.vue +47 -11
  383. package/edit/serviceaccount.vue +1 -1
  384. package/edit/storage.k8s.io.storageclass/index.vue +1 -1
  385. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/aws-ebs.vue +7 -3
  386. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/azure-disk.vue +1 -1
  387. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/azure-file.vue +1 -1
  388. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/cinder.vue +2 -2
  389. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/gce-pd.vue +2 -2
  390. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/glusterfs.vue +1 -1
  391. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/portworx-volume.vue +1 -1
  392. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/quobyte.vue +1 -1
  393. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/rbd.vue +1 -1
  394. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/scaleio.vue +1 -1
  395. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/storageos.vue +1 -1
  396. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/vsphere-volume.vue +1 -1
  397. package/edit/token.vue +3 -3
  398. package/edit/ui.cattle.io.navlink.vue +2 -2
  399. package/edit/workload/Job.vue +111 -23
  400. package/edit/workload/Upgrading.vue +77 -22
  401. package/edit/workload/__tests__/Job.test.ts +72 -0
  402. package/edit/workload/__tests__/Upgrading.test.ts +60 -0
  403. package/edit/workload/index.vue +13 -1085
  404. package/edit/workload/mixins/workload.js +900 -0
  405. package/edit/workload/storage/Mount.vue +2 -2
  406. package/edit/workload/storage/awsElasticBlockStore.vue +1 -1
  407. package/edit/workload/storage/azureDisk.vue +2 -2
  408. package/edit/workload/storage/azureFile.vue +1 -1
  409. package/edit/workload/storage/ephemeralVolume/index.vue +2 -2
  410. package/edit/workload/storage/gcePersistentDisk.vue +1 -1
  411. package/edit/workload/storage/hostPath.vue +1 -1
  412. package/edit/workload/storage/nfs.vue +2 -2
  413. package/edit/workload/storage/persistentVolumeClaim/index.vue +2 -2
  414. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +3 -3
  415. package/edit/workload/storage/secret.vue +2 -2
  416. package/edit/workload/storage/vsphereVolume.vue +1 -1
  417. package/edit/workload/types/Deployment.vue +377 -0
  418. package/edit/workload/types/Generic.vue +295 -0
  419. package/layouts/default.vue +26 -7
  420. package/layouts/error.vue +3 -2
  421. package/layouts/home.vue +12 -2
  422. package/layouts/plain.vue +18 -2
  423. package/layouts/unauthenticated.vue +2 -1
  424. package/list/catalog.cattle.io.clusterrepo.vue +1 -1
  425. package/list/fleet.cattle.io.bundle.vue +1 -1
  426. package/list/fleet.cattle.io.cluster.vue +1 -1
  427. package/list/fleet.cattle.io.clusterregistrationtoken.vue +1 -1
  428. package/list/harvesterhci.io.dashboard/HarvesterUpgrade.vue +9 -8
  429. package/list/harvesterhci.io.dashboard/UpgradeInfo.vue +40 -0
  430. package/list/harvesterhci.io.dashboard/index.vue +14 -36
  431. package/list/harvesterhci.io.host/index.vue +24 -12
  432. package/list/harvesterhci.io.networkattachmentdefinition.vue +1 -1
  433. package/list/harvesterhci.io.setting.vue +1 -1
  434. package/list/harvesterhci.io.virtualmachinebackup.vue +1 -1
  435. package/list/harvesterhci.io.virtualmachineimage.vue +36 -3
  436. package/list/harvesterhci.io.virtualmachinetemplateversion.vue +1 -5
  437. package/list/helm.cattle.io.projecthelmchart.vue +1 -1
  438. package/list/kubevirt.io.virtualmachine.vue +4 -2
  439. package/list/management.cattle.io.feature.vue +3 -3
  440. package/list/management.cattle.io.setting.vue +2 -2
  441. package/list/monitoring.coreos.com.alertmanagerconfig.vue +1 -1
  442. package/list/namespace.vue +3 -1
  443. package/list/node.vue +10 -3
  444. package/list/persistentvolumeclaim.vue +42 -0
  445. package/list/provisioning.cattle.io.cluster.vue +22 -20
  446. package/list/workload.vue +31 -6
  447. package/machine-config/amazonec2.vue +37 -12
  448. package/machine-config/azure.vue +3 -3
  449. package/machine-config/digitalocean.vue +2 -2
  450. package/machine-config/generic.vue +1 -1
  451. package/machine-config/harvester.vue +124 -25
  452. package/machine-config/linode.vue +2 -2
  453. package/machine-config/vmwarevsphere.vue +5 -5
  454. package/middleware/authenticated.js +36 -6
  455. package/middleware/unauthenticated.js +22 -0
  456. package/mixins/brand.js +50 -3
  457. package/mixins/browser-tab-visibility.js +37 -0
  458. package/mixins/chart.js +36 -4
  459. package/mixins/{compact-input.js → compact-input.ts} +5 -3
  460. package/mixins/form-validation.js +122 -0
  461. package/mixins/harvester-vm/index.js +134 -90
  462. package/mixins/labeled-form-element.ts +193 -0
  463. package/mixins/resource-fetch.js +173 -0
  464. package/models/cluster.x-k8s.io.machine.js +6 -2
  465. package/models/etcdbackup.js +4 -0
  466. package/models/event.js +4 -0
  467. package/models/fleet.cattle.io.bundle.js +1 -1
  468. package/models/fleet.cattle.io.gitrepo.js +10 -0
  469. package/models/harvester/harvesterhci.io.virtualmachinebackup.js +5 -2
  470. package/models/harvester/harvesterhci.io.virtualmachineimage.js +11 -8
  471. package/models/harvester/harvesterhci.io.virtualmachinetemplateversion.js +11 -2
  472. package/models/harvester/kubevirt.io.virtualmachine.js +2 -2
  473. package/models/harvester/kubevirt.io.virtualmachineinstance.js +1 -1
  474. package/models/harvester/node.js +27 -32
  475. package/models/harvester/persistentvolumeclaim.js +1 -1
  476. package/models/management.cattle.io.cluster.js +17 -11
  477. package/models/management.cattle.io.clusterroletemplatebinding.js +2 -2
  478. package/models/management.cattle.io.globalrole.js +19 -0
  479. package/models/management.cattle.io.node.js +10 -11
  480. package/models/management.cattle.io.project.js +60 -26
  481. package/models/management.cattle.io.roletemplate.js +19 -0
  482. package/models/monitoring.coreos.com.alertmanagerconfig.js +3 -2
  483. package/models/monitoring.coreos.com.prometheusrule.js +9 -0
  484. package/models/namespace.js +9 -1
  485. package/models/networking.k8s.io.ingress.js +17 -5
  486. package/models/persistentvolumeclaim.js +47 -1
  487. package/models/projectroletemplatebinding.js +2 -2
  488. package/models/provisioning.cattle.io.cluster.js +92 -13
  489. package/models/rke.cattle.io.etcdsnapshot.js +4 -0
  490. package/models/service.js +11 -5
  491. package/models/storage.k8s.io.storageclass.js +14 -1
  492. package/models/workload.js +7 -2
  493. package/nuxt.config.js +27 -7
  494. package/package.json +10 -14
  495. package/pages/about.vue +15 -1
  496. package/pages/account/index.vue +1 -1
  497. package/pages/auth/login.vue +17 -5
  498. package/pages/auth/setup.vue +47 -9
  499. package/pages/c/_cluster/_product/_resource/create.vue +1 -1
  500. package/pages/c/_cluster/_product/members/index.vue +6 -1
  501. package/pages/c/_cluster/_product/projectsnamespaces.vue +113 -11
  502. package/pages/c/_cluster/apps/charts/chart.vue +1 -1
  503. package/pages/c/_cluster/apps/charts/index.vue +2 -2
  504. package/pages/c/_cluster/apps/charts/install.vue +197 -19
  505. package/pages/c/_cluster/auth/config/index.vue +1 -1
  506. package/pages/c/_cluster/explorer/EventsTable.vue +1 -15
  507. package/pages/c/_cluster/explorer/index.vue +64 -35
  508. package/pages/c/_cluster/explorer/tools/index.vue +1 -1
  509. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +249 -0
  510. package/pages/c/_cluster/fleet/index.vue +47 -65
  511. package/pages/c/_cluster/harvester/airgapupgrade/index.vue +7 -4
  512. package/pages/c/_cluster/harvester/console/_uid/vnc.vue +7 -1
  513. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +8 -14
  514. package/pages/c/_cluster/monitoring/index.vue +1 -1
  515. package/pages/c/_cluster/monitoring/route-receiver/index.vue +1 -1
  516. package/pages/c/_cluster/settings/banners.vue +2 -2
  517. package/pages/c/_cluster/settings/brand.vue +62 -7
  518. package/pages/c/_cluster/settings/performance.vue +167 -0
  519. package/pages/diagnostic.vue +468 -0
  520. package/pages/fail-whale.vue +17 -5
  521. package/pages/home.vue +36 -22
  522. package/pages/plugins.vue +1 -1
  523. package/pages/prefs.vue +20 -7
  524. package/pages/support/index.vue +51 -9
  525. package/pkg/auto-import.js +1 -1
  526. package/pkg/dynamic-importer.lib.js +8 -0
  527. package/pkg/tsconfig.json +26 -9
  528. package/pkg/vue.config.js +8 -0
  529. package/plugins/console.js +29 -0
  530. package/plugins/dashboard-store/actions.js +171 -28
  531. package/plugins/dashboard-store/getters.js +13 -1
  532. package/plugins/dashboard-store/index.js +5 -1
  533. package/plugins/dashboard-store/mutations.js +72 -22
  534. package/plugins/dashboard-store/resource-class.js +259 -184
  535. package/plugins/i18n.js +9 -3
  536. package/plugins/steve/actions.js +16 -1
  537. package/plugins/steve/getters.js +9 -1
  538. package/plugins/steve/index.js +6 -2
  539. package/plugins/steve/mutations.js +100 -5
  540. package/plugins/steve/norman-class.js +8 -0
  541. package/plugins/steve/performanceTesting.js +5 -0
  542. package/plugins/steve/subscribe.js +144 -12
  543. package/plugins/steve/web-worker.steve-sub-worker.js +129 -0
  544. package/promptRemove/kubevirt.io.virtualmachine.vue +3 -17
  545. package/promptRemove/management.cattle.io.project.vue +128 -0
  546. package/promptRemove/pod.vue +131 -0
  547. package/rancher-components/BadgeState/BadgeState.spec.ts +12 -0
  548. package/{components → rancher-components/BadgeState}/BadgeState.vue +18 -10
  549. package/rancher-components/BadgeState/index.ts +1 -0
  550. package/{components/__tests__ → rancher-components/Banner}/Banner.test.ts +1 -1
  551. package/{components → rancher-components/Banner}/Banner.vue +22 -7
  552. package/rancher-components/Banner/index.ts +1 -0
  553. package/{components → rancher-components/Card}/Card.vue +58 -12
  554. package/rancher-components/Card/index.ts +1 -0
  555. package/{components/form → rancher-components/Form/Checkbox}/Checkbox.vue +118 -25
  556. package/rancher-components/Form/Checkbox/index.ts +1 -0
  557. package/{components/form/__tests__ → rancher-components/Form/LabeledInput}/LabeledInput.test.ts +13 -2
  558. package/rancher-components/Form/LabeledInput/LabeledInput.vue +341 -0
  559. package/rancher-components/Form/LabeledInput/index.ts +1 -0
  560. package/{components/form → rancher-components/Form/Radio}/RadioButton.vue +50 -22
  561. package/{components/form → rancher-components/Form/Radio}/RadioGroup.vue +76 -28
  562. package/rancher-components/Form/Radio/index.ts +2 -0
  563. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +169 -0
  564. package/rancher-components/Form/TextArea/index.ts +1 -0
  565. package/rancher-components/Form/index.ts +4 -0
  566. package/{components/form → rancher-components/LabeledTooltip}/LabeledTooltip.vue +32 -11
  567. package/rancher-components/LabeledTooltip/index.ts +1 -0
  568. package/scripts/build-pkg.sh +4 -0
  569. package/scripts/publish-shell.sh +37 -18
  570. package/scripts/test-plugins-build.sh +115 -0
  571. package/store/catalog.js +4 -0
  572. package/store/growl.js +6 -0
  573. package/store/i18n.js +18 -9
  574. package/store/index.js +190 -107
  575. package/store/prefs.js +8 -2
  576. package/store/resource-fetch.js +44 -0
  577. package/store/type-map.js +43 -7
  578. package/store/uiplugins.ts +1 -1
  579. package/utils/favicon.js +40 -0
  580. package/utils/object.js +26 -9
  581. package/utils/promise.js +20 -0
  582. package/utils/socket.js +10 -1
  583. package/utils/string.js +16 -0
  584. package/utils/validators/formRules/__tests__/index.test.ts +928 -0
  585. package/utils/validators/formRules/index.ts +447 -0
  586. package/utils/validators/prometheusrule.js +1 -1
  587. package/utils/validators/vm.js +12 -5
  588. package/utils/width.js +39 -0
  589. package/yarn-error.log +196 -0
  590. package/components/NovncConsoleWrapper.vue +0 -150
  591. package/components/form/Container.vue +0 -143
  592. package/components/form/LabeledInput.vue +0 -245
  593. package/components/form/Scheduling.vue +0 -115
  594. package/components/form/TextAreaAutoGrow.vue +0 -127
  595. package/mixins/labeled-form-element.js +0 -137
@@ -6,13 +6,15 @@ import merge from 'lodash/merge';
6
6
  import { mapGetters } from 'vuex';
7
7
 
8
8
  import CreateEditView from '@shell/mixins/create-edit-view';
9
+ import FormValidation from '@shell/mixins/form-validation';
9
10
 
10
11
  import {
11
12
  CAPI,
12
13
  MANAGEMENT,
13
14
  NORMAN,
14
15
  SCHEMA,
15
- DEFAULT_WORKSPACE
16
+ DEFAULT_WORKSPACE,
17
+ SECRET
16
18
  } from '@shell/config/types';
17
19
  import { _CREATE, _EDIT, _VIEW } from '@shell/config/query-params';
18
20
 
@@ -29,16 +31,16 @@ import { isHarvesterSatisfiesVersion } from '@shell/utils/cluster';
29
31
 
30
32
  import ArrayList from '@shell/components/form/ArrayList';
31
33
  import ArrayListGrouped from '@shell/components/form/ArrayListGrouped';
32
- import BadgeState from '@shell/components/BadgeState';
33
- import Banner from '@shell/components/Banner';
34
- import Checkbox from '@shell/components/form/Checkbox';
34
+ import { BadgeState } from '@components/BadgeState';
35
+ import { Banner } from '@components/Banner';
36
+ import { Checkbox } from '@components/Form/Checkbox';
35
37
  import CruResource from '@shell/components/CruResource';
36
- import LabeledInput from '@shell/components/form/LabeledInput';
38
+ import { LabeledInput } from '@components/Form/LabeledInput';
37
39
  import LabeledSelect from '@shell/components/form/LabeledSelect';
38
40
  import Loading from '@shell/components/Loading';
39
41
  import MatchExpressions from '@shell/components/form/MatchExpressions';
40
42
  import NameNsDescription from '@shell/components/form/NameNsDescription';
41
- import RadioGroup from '@shell/components/form/RadioGroup';
43
+ import { RadioGroup } from '@components/Form/Radio';
42
44
  import Tab from '@shell/components/Tabbed/Tab';
43
45
  import Tabbed from '@shell/components/Tabbed';
44
46
  import UnitInput from '@shell/components/form/UnitInput';
@@ -52,6 +54,8 @@ import { LEGACY } from '@shell/store/features';
52
54
  import semver from 'semver';
53
55
  import { canViewClusterMembershipEditor } from '@shell/components/form/Members/ClusterMembershipEditor.vue';
54
56
  import { SETTING } from '@shell/config/settings';
57
+ import { base64Encode } from '@shell/utils/crypto';
58
+ import { CAPI as CAPI_ANNOTATIONS } from '@shell/config/labels-annotations';
55
59
  import ACE from './ACE';
56
60
  import AgentEnv from './AgentEnv';
57
61
  import DrainOptions from './DrainOptions';
@@ -101,7 +105,7 @@ export default {
101
105
  YamlEditor,
102
106
  },
103
107
 
104
- mixins: [CreateEditView],
108
+ mixins: [CreateEditView, FormValidation],
105
109
 
106
110
  props: {
107
111
  mode: {
@@ -286,28 +290,32 @@ export default {
286
290
  }
287
291
 
288
292
  return {
289
- loadedOnce: false,
290
- lastIdx: 0,
291
- allPSPs: null,
292
- nodeComponent: null,
293
- credentialId: null,
294
- credential: null,
295
- machinePools: null,
296
- rke2Versions: null,
297
- k3sVersions: null,
298
- defaultRke2: '',
299
- defaultK3s: '',
300
- s3Backup: false,
301
- versionInfo: {},
302
- membershipUpdate: {},
303
- systemRegistry: null,
304
- registryHost: null,
305
- registryMode: null,
306
- registrySecret: null,
307
- userChartValues: {},
308
- userChartValuesTemp: {},
309
- addonsRev: 0,
310
- clusterIsAlreadyCreated: !!this.value.id
293
+ loadedOnce: false,
294
+ lastIdx: 0,
295
+ allPSPs: null,
296
+ nodeComponent: null,
297
+ credentialId: null,
298
+ credential: null,
299
+ machinePools: null,
300
+ rke2Versions: null,
301
+ k3sVersions: null,
302
+ defaultRke2: '',
303
+ defaultK3s: '',
304
+ s3Backup: false,
305
+ versionInfo: {},
306
+ membershipUpdate: {},
307
+ showDeprecatedPatchVersions: false,
308
+ systemRegistry: null,
309
+ registryHost: null,
310
+ registryMode: null,
311
+ registrySecret: null,
312
+ userChartValues: {},
313
+ userChartValuesTemp: {},
314
+ addonsRev: 0,
315
+ clusterIsAlreadyCreated: !!this.value.id,
316
+ fvFormRuleSets: [{
317
+ path: 'metadata.name', rules: ['subDomain'], translationKey: 'nameNsDescription.name.label'
318
+ }]
311
319
  };
312
320
  },
313
321
 
@@ -385,10 +393,20 @@ export default {
385
393
  const cur = this.liveValue?.spec?.kubernetesVersion || '';
386
394
  const existingRke2 = this.mode === _EDIT && cur.includes('rke2');
387
395
  const existingK3s = this.mode === _EDIT && cur.includes('k3s');
388
- const rke2 = this.filterAndMap(this.rke2Versions, (existingRke2 ? cur : null), cur, this.defaultRke2);
389
- const k3s = this.filterAndMap(this.k3sVersions, (existingK3s ? cur : null), cur, this.defaultK3s);
390
- const showRke2 = rke2.length && !existingK3s;
391
- const showK3s = k3s.length && !existingRke2;
396
+
397
+ let allValidRke2Versions = this.getAllOptionsAfterMinVersion(this.rke2Versions, (existingRke2 ? cur : null), this.defaultRke2);
398
+ let allValidK3sVersions = this.getAllOptionsAfterMinVersion(this.k3sVersions, (existingK3s ? cur : null), this.defaultK3s);
399
+
400
+ if (!this.showDeprecatedPatchVersions) {
401
+ // Normally, we only want to show the most recent patch version
402
+ // for each Kubernetes minor version. However, if the user
403
+ // opts in to showing deprecated versions, we don't filter them.
404
+ allValidRke2Versions = this.filterOutDeprecatedPatchVersions(allValidRke2Versions, cur);
405
+ allValidK3sVersions = this.filterOutDeprecatedPatchVersions(allValidK3sVersions, cur);
406
+ }
407
+
408
+ const showRke2 = allValidRke2Versions.length && !existingK3s;
409
+ const showK3s = allValidK3sVersions.length && !existingRke2;
392
410
  const out = [];
393
411
 
394
412
  if ( showRke2 ) {
@@ -396,7 +414,7 @@ export default {
396
414
  out.push({ kind: 'group', label: this.t('cluster.provider.rke2') });
397
415
  }
398
416
 
399
- out.push(...rke2);
417
+ out.push(...allValidRke2Versions);
400
418
  }
401
419
 
402
420
  if ( showK3s ) {
@@ -408,7 +426,7 @@ export default {
408
426
  });
409
427
  }
410
428
 
411
- out.push(...k3s);
429
+ out.push(...allValidK3sVersions);
412
430
  }
413
431
 
414
432
  if ( cur ) {
@@ -745,7 +763,7 @@ export default {
745
763
  const first = all[0]?.value;
746
764
  const preferred = all.find(x => x.value === this.defaultRke2)?.value;
747
765
 
748
- const rke2 = this.filterAndMap(this.rke2Versions, null);
766
+ const rke2 = this.getAllOptionsAfterMinVersion(this.rke2Versions, null);
749
767
  const showRke2 = rke2.length;
750
768
  let out;
751
769
 
@@ -1022,7 +1040,7 @@ export default {
1022
1040
  // We don't allow the user to edit any of the fields in metadata from the UI so it's safe to override it with the
1023
1041
  // metadata defined by the latest backend value. This is primarily used to ensure the resourceVersion is up to date.
1024
1042
  delete clonedCurrentConfig.metadata;
1025
- machinePool.config = merge(machinePool.config, clonedLatestConfig);
1043
+ machinePool.config = merge(clonedLatestConfig, clonedCurrentConfig);
1026
1044
  }
1027
1045
  },
1028
1046
 
@@ -1169,7 +1187,9 @@ export default {
1169
1187
 
1170
1188
  this.applyChartValues(this.value.spec.rkeConfig);
1171
1189
 
1172
- if (this.agentConfig['cloud-provider-name'] === HARVESTER && clusterId && this.isCreate) {
1190
+ const isUpgrade = this.isEdit && this.liveValue?.spec?.kubernetesVersion !== this.value?.spec?.kubernetesVersion;
1191
+
1192
+ if (this.agentConfig['cloud-provider-name'] === HARVESTER && clusterId && (this.isCreate || isUpgrade)) {
1173
1193
  const namespace = this.machinePools?.[0]?.config?.vmNamespace;
1174
1194
 
1175
1195
  const res = await this.$store.dispatch('management/request', {
@@ -1182,13 +1202,30 @@ export default {
1182
1202
  },
1183
1203
  });
1184
1204
 
1185
- set(this.agentConfig, 'cloud-provider-config', res.data);
1205
+ const kubeconfig = res.data;
1206
+
1207
+ const harvesterKubeconfigSecret = await this.createKubeconfigSecret(kubeconfig);
1208
+
1209
+ set(this.agentConfig, 'cloud-provider-config', `secret://fleet-default:${ harvesterKubeconfigSecret?.metadata?.name }`);
1186
1210
  set(this.chartValues, `${ HARVESTER_CLOUD_PROVIDER }.clusterName`, this.value.metadata.name);
1187
1211
  set(this.chartValues, `${ HARVESTER_CLOUD_PROVIDER }.cloudConfigPath`, '/var/lib/rancher/rke2/etc/config-files/cloud-provider-config');
1188
1212
  }
1189
1213
 
1190
1214
  await this.save(btnCb);
1191
1215
  },
1216
+ // create a secret to reference the harvester cluster kubeconfig in rkeConfig
1217
+ async createKubeconfigSecret(kubeconfig = '') {
1218
+ const clusterName = this.value.metadata.name;
1219
+ const secret = await this.$store.dispatch('management/create', {
1220
+ type: SECRET,
1221
+ metadata: {
1222
+ namespace: 'fleet-default', generateName: 'harvesterconfig', annotations: { [CAPI_ANNOTATIONS.SECRET_AUTH]: clusterName, [CAPI_ANNOTATIONS.SECRET_WILL_DELETE]: 'true' }
1223
+ },
1224
+ data: { credential: base64Encode(kubeconfig) }
1225
+ });
1226
+
1227
+ return secret.save({ url: '/v1/secrets', method: 'POST' });
1228
+ },
1192
1229
 
1193
1230
  cancel() {
1194
1231
  this.$router.push({
@@ -1407,7 +1444,7 @@ export default {
1407
1444
  }
1408
1445
  },
1409
1446
 
1410
- filterAndMap(versions, minVersion, currentVersion, defaultVersion) {
1447
+ getAllOptionsAfterMinVersion(versions, minVersion, defaultVersion) {
1411
1448
  const out = (versions || []).filter(obj => !!obj.serverArgs).map((obj) => {
1412
1449
  let disabled = false;
1413
1450
  let experimental = false;
@@ -1430,11 +1467,49 @@ export default {
1430
1467
  disabled,
1431
1468
  };
1432
1469
  });
1433
-
1434
1470
  const sorted = sortBy(out, 'sort:desc');
1471
+
1472
+ const mostRecentPatchVersions = this.getMostRecentPatchVersions(sorted);
1473
+
1474
+ const sortedWithDeprecatedLabel = sorted.map((optionData) => {
1475
+ const majorMinor = `${ semver.major(optionData.value) }.${ semver.minor(optionData.value) }`;
1476
+
1477
+ if (mostRecentPatchVersions[majorMinor] === optionData.value) {
1478
+ return optionData;
1479
+ }
1480
+
1481
+ return {
1482
+ ...optionData,
1483
+ label: `${ optionData.label } (${ this.t('cluster.kubernetesVersion.deprecated') })`
1484
+ };
1485
+ });
1486
+
1487
+ return sortedWithDeprecatedLabel;
1488
+ },
1489
+
1490
+ getMostRecentPatchVersions(sortedVersions) {
1491
+ // Get the most recent patch version for each Kubernetes minor version.
1435
1492
  const versionMap = {};
1436
1493
 
1437
- return sorted.filter((version) => {
1494
+ sortedVersions.forEach((version) => {
1495
+ const majorMinor = `${ semver.major(version.value) }.${ semver.minor(version.value) }`;
1496
+
1497
+ if (!versionMap[majorMinor]) {
1498
+ // Because we start with a sorted list of versions, we know the
1499
+ // highest patch version is first in the list, so we only keep the
1500
+ // first of each minor version in the list.
1501
+ versionMap[majorMinor] = version.value;
1502
+ }
1503
+ });
1504
+
1505
+ return versionMap;
1506
+ },
1507
+
1508
+ filterOutDeprecatedPatchVersions(allVersions, currentVersion) {
1509
+ // Get the most recent patch version for each Kubernetes minor version.
1510
+ const mostRecentPatchVersions = this.getMostRecentPatchVersions(allVersions);
1511
+
1512
+ const filteredVersions = allVersions.filter((version) => {
1438
1513
  // Always show pre-releases
1439
1514
  if (semver.prerelease(version.value)) {
1440
1515
  return true;
@@ -1443,14 +1518,14 @@ export default {
1443
1518
  const majorMinor = `${ semver.major(version.value) }.${ semver.minor(version.value) }`;
1444
1519
 
1445
1520
  // Always show current version, else show if we haven't shown anything for this major.minor version yet
1446
- if (version === currentVersion || !versionMap[majorMinor]) {
1447
- versionMap[majorMinor] = true;
1448
-
1521
+ if (version === currentVersion || mostRecentPatchVersions[majorMinor] === version.value) {
1449
1522
  return true;
1450
1523
  }
1451
1524
 
1452
1525
  return false;
1453
1526
  });
1527
+
1528
+ return filteredVersions;
1454
1529
  },
1455
1530
 
1456
1531
  generateYaml() {
@@ -1489,7 +1564,7 @@ export default {
1489
1564
  v-else
1490
1565
  ref="cruresource"
1491
1566
  :mode="mode"
1492
- :validation-passed="validationPassed()"
1567
+ :validation-passed="validationPassed() && fvFormIsValid"
1493
1568
  :resource="value"
1494
1569
  :errors="errors"
1495
1570
  :cancel-event="true"
@@ -1497,10 +1572,11 @@ export default {
1497
1572
  :apply-hooks="applyHooks"
1498
1573
  :generate-yaml="generateYaml"
1499
1574
  class="rke2"
1575
+ component-testid="rke2-custom-create"
1500
1576
  @done="done"
1501
1577
  @finish="saveOverride"
1502
1578
  @cancel="cancel"
1503
- @error="e=>errors = e"
1579
+ @error="fvUnreportedValidationErrors"
1504
1580
  >
1505
1581
  <Banner
1506
1582
  v-if="isEdit"
@@ -1527,6 +1603,7 @@ export default {
1527
1603
  name-placeholder="cluster.name.placeholder"
1528
1604
  description-label="cluster.description.label"
1529
1605
  description-placeholder="cluster.description.placeholder"
1606
+ :rules="{name:fvGetAndReportPathRules('metadata.name')}"
1530
1607
  />
1531
1608
 
1532
1609
  <Banner v-if="appsOSWarning" color="error">
@@ -1567,7 +1644,7 @@ export default {
1567
1644
  @addTab="addMachinePool($event)"
1568
1645
  @removeTab="removeMachinePool($event)"
1569
1646
  >
1570
- <template v-for="obj in machinePools">
1647
+ <template v-for="(obj, idx) in machinePools">
1571
1648
  <Tab v-if="!obj.remove" :key="obj.id" :name="obj.id" :label="obj.pool.name || '(Not Named)'" :show-header="false">
1572
1649
  <MachinePool
1573
1650
  ref="pool"
@@ -1576,6 +1653,8 @@ export default {
1576
1653
  :mode="mode"
1577
1654
  :provider="provider"
1578
1655
  :credential-id="credentialId"
1656
+ :idx="idx"
1657
+ :machine-pools="machinePools"
1579
1658
  @error="e=>errors = e"
1580
1659
  />
1581
1660
  </Tab>
@@ -1600,6 +1679,12 @@ export default {
1600
1679
  :options="versionOptions"
1601
1680
  label-key="cluster.kubernetesVersion.label"
1602
1681
  />
1682
+ <Checkbox
1683
+ v-model="showDeprecatedPatchVersions"
1684
+ :label="t('cluster.kubernetesVersion.deprecatedPatches')"
1685
+ :tooltip="t('cluster.kubernetesVersion.deprecatedPatchWarning')"
1686
+ class="patch-version"
1687
+ />
1603
1688
  <div v-if="showK3sTechPreviewWarning" class="k3s-tech-preview-info">
1604
1689
  {{ t('cluster.k3s.techPreview') }}
1605
1690
  </div>
@@ -2092,4 +2177,7 @@ export default {
2092
2177
  color: var(--error);
2093
2178
  padding-top: 10px;
2094
2179
  }
2180
+ .patch-version {
2181
+ margin-top: 5px;
2182
+ }
2095
2183
  </style>
@@ -1,11 +1,12 @@
1
1
  <script>
2
2
  import CruResource from '@shell/components/CruResource';
3
3
  import createEditView from '@shell/mixins/create-edit-view';
4
- import LabeledInput from '@shell/components/form/LabeledInput';
4
+ import formValidation from '@shell/mixins/form-validation';
5
+ import { LabeledInput } from '@components/Form/LabeledInput';
5
6
  import UnitInput from '@shell/components/form/UnitInput';
6
7
  import LabeledSelect from '@shell/components/form/LabeledSelect';
7
- import Banner from '@shell/components/Banner';
8
- import RadioGroup from '@shell/components/form/RadioGroup';
8
+ import { Banner } from '@components/Banner';
9
+ import { RadioGroup } from '@components/Form/Radio';
9
10
  import NameNsDescription from '@shell/components/form/NameNsDescription';
10
11
  import Loading from '@shell/components/Loading';
11
12
  import S3 from '@shell/chart/rancher-backup/S3';
@@ -28,7 +29,7 @@ export default {
28
29
  Loading,
29
30
  S3,
30
31
  },
31
- mixins: [createEditView],
32
+ mixins: [createEditView, formValidation],
32
33
 
33
34
  props: {
34
35
  value: {
@@ -81,7 +82,17 @@ export default {
81
82
  }
82
83
 
83
84
  return {
84
- allSecrets: [], resourceSet: null, s3, storageSource, useEncryption, apps: [], setSchedule, name: this.value?.metadata?.name,
85
+ allSecrets: [],
86
+ resourceSet: null,
87
+ s3,
88
+ storageSource,
89
+ useEncryption,
90
+ apps: [],
91
+ setSchedule,
92
+ name: this.value?.metadata?.name,
93
+ fvFormRuleSets: [{
94
+ path: 'metadata.name', rules: ['dnsLabel', 'noUpperCase'], translationKey: 'nameNsDescription.name.label'
95
+ }]
85
96
  };
86
97
  },
87
98
 
@@ -127,7 +138,7 @@ export default {
127
138
  },
128
139
 
129
140
  validated() {
130
- return !!this.name && (!this.useEncryption || !!this.value?.spec?.encryptionConfigSecretName);
141
+ return !!this.name && (!this.useEncryption || !!this.value?.spec?.encryptionConfigSecretName) && this.fvFormIsValid;
131
142
  },
132
143
 
133
144
  ...mapGetters({ t: 'i18n/t' })
@@ -167,9 +178,16 @@ export default {
167
178
  <template>
168
179
  <Loading v-if="$fetchState.pending" />
169
180
  <div v-else>
170
- <CruResource :validation-passed="validated" :done-route="doneRoute" :resource="value" :mode="mode" @finish="save">
181
+ <CruResource
182
+ :validation-passed="validated"
183
+ :done-route="doneRoute"
184
+ :resource="value"
185
+ :mode="mode"
186
+ :errors="fvUnreportedValidationErrors"
187
+ @finish="save"
188
+ >
171
189
  <template>
172
- <NameNsDescription :mode="mode" :value="value" :namespaced="false" @change="name=value.metadata.name" />
190
+ <NameNsDescription :mode="mode" :value="value" :namespaced="false" :rules="{name: fvGetAndReportPathRules('metadata.name')}" @change="name=value.metadata.name" />
173
191
  <template v-if="!!resourceSet">
174
192
  <div class="bordered-section">
175
193
  <RadioGroup
@@ -1,12 +1,12 @@
1
1
  <script>
2
2
  import CruResource from '@shell/components/CruResource';
3
3
  import createEditView from '@shell/mixins/create-edit-view';
4
- import LabeledInput from '@shell/components/form/LabeledInput';
4
+ import { LabeledInput } from '@components/Form/LabeledInput';
5
5
  import UnitInput from '@shell/components/form/UnitInput';
6
- import Checkbox from '@shell/components/form/Checkbox';
6
+ import { Checkbox } from '@components/Form/Checkbox';
7
7
  import LabeledSelect from '@shell/components/form/LabeledSelect';
8
8
  import Loading from '@shell/components/Loading';
9
- import RadioGroup from '@shell/components/form/RadioGroup';
9
+ import { RadioGroup } from '@components/Form/Radio';
10
10
  import S3 from '@shell/chart/rancher-backup/S3';
11
11
  import { mapGetters } from 'vuex';
12
12
  import { SECRET, BACKUP_RESTORE, CATALOG } from '@shell/config/types';
@@ -1,5 +1,5 @@
1
1
  <script>
2
- import LabeledInput from '@shell/components/form/LabeledInput';
2
+ import { LabeledInput } from '@components/Form/LabeledInput';
3
3
 
4
4
  export default {
5
5
  components: { LabeledInput },
@@ -3,6 +3,8 @@ import { SECRET_TYPES as TYPES } from '@shell/config/secret';
3
3
  import { MANAGEMENT, NAMESPACE, DEFAULT_WORKSPACE } from '@shell/config/types';
4
4
  import CreateEditView from '@shell/mixins/create-edit-view';
5
5
  import NameNsDescription from '@shell/components/form/NameNsDescription';
6
+ import { LabeledInput } from '@components/Form/LabeledInput';
7
+ import LabeledSelect from '@shell/components/form/LabeledSelect';
6
8
  import CruResource from '@shell/components/CruResource';
7
9
  import {
8
10
  CLOUD_CREDENTIAL, _CLONE, _CREATE, _EDIT, _FLAGGED
@@ -32,6 +34,8 @@ export default {
32
34
  name: 'CruSecret',
33
35
 
34
36
  components: {
37
+ LabeledInput,
38
+ LabeledSelect,
35
39
  Loading,
36
40
  NameNsDescription,
37
41
  CruResource,
@@ -63,14 +67,41 @@ export default {
63
67
  this.$set(this.value, 'data', {});
64
68
  }
65
69
 
70
+ const secretTypes = [
71
+ {
72
+ label: 'Custom',
73
+ value: 'custom'
74
+ },
75
+ {
76
+ label: 'divider',
77
+ disabled: true,
78
+ kind: 'divider'
79
+ }
80
+ ];
81
+
82
+ Object.values(TYPES).forEach((t) => {
83
+ secretTypes.push({
84
+ label: t,
85
+ value: t
86
+ });
87
+ });
88
+
66
89
  return {
67
90
  isCloud,
68
- nodeDrivers: null,
69
-
91
+ nodeDrivers: null,
92
+ secretTypes,
93
+ secretType: this.value._type,
94
+ initialSecretType: this.value._type
70
95
  };
71
96
  },
72
97
 
73
98
  computed: {
99
+ isCustomSecretCreate() {
100
+ return this.mode === _CREATE && this.$route.query.type === 'custom';
101
+ },
102
+ showCustomSecretType() {
103
+ return this.secretType === 'custom';
104
+ },
74
105
  typeKey() {
75
106
  if ( this.isCloud ) {
76
107
  return 'cloud';
@@ -147,6 +178,13 @@ export default {
147
178
  docLink: this.t(`secret.typeDescriptions.'${ id }'.docLink`)
148
179
  });
149
180
  }
181
+
182
+ out.push({
183
+ id: 'custom',
184
+ label: this.t('secret.customType'),
185
+ bannerAbbrv: this.initialDisplayFor('custom'),
186
+ description: this.t('secret.typeDescriptions.custom.description')
187
+ });
150
188
  }
151
189
 
152
190
  return sortBy(out, 'label');
@@ -237,6 +275,12 @@ export default {
237
275
 
238
276
  this.$set(this.value, '_type', type);
239
277
  this.$emit('set-subtype', this.typeDisplay(type, driver));
278
+
279
+ this.secretType = type;
280
+
281
+ if (this.mode === _CREATE && type === 'custom') {
282
+ this.$set(this.value, '_type', '');
283
+ }
240
284
  },
241
285
 
242
286
  typeDisplay(type, driver) {
@@ -254,6 +298,12 @@ export default {
254
298
 
255
299
  return this.$store.getters['i18n/withFallback'](`secret.initials."${ type }"`, null, fallback);
256
300
  },
301
+
302
+ selectCustomType(type) {
303
+ if (type !== 'custom') {
304
+ this.$set(this.value, '_type', type);
305
+ }
306
+ }
257
307
  },
258
308
  };
259
309
  </script>
@@ -276,6 +326,34 @@ export default {
276
326
  >
277
327
  <NameNsDescription v-model="value" :mode="mode" :namespaced="!isCloud" />
278
328
 
329
+ <div v-if="isCustomSecretCreate" class="row">
330
+ <div class="col span-3">
331
+ <LabeledSelect
332
+ v-model="secretType"
333
+ :options="secretTypes"
334
+ :searchable="false"
335
+ :mode="mode"
336
+ :multiple="false"
337
+ :reduce="(e) => e.value"
338
+ label-key="secret.type"
339
+ required
340
+ @input="selectCustomType"
341
+ />
342
+ </div>
343
+
344
+ <div class="col span-3">
345
+ <LabeledInput
346
+ v-if="showCustomSecretType"
347
+ ref="customType"
348
+ v-model="value._type"
349
+ v-focus
350
+ label-key="secret.customType"
351
+ :mode="mode"
352
+ required
353
+ />
354
+ </div>
355
+ </div>
356
+
279
357
  <div class="spacer"></div>
280
358
  <component
281
359
  :is="cloudComponent"
@@ -1,6 +1,6 @@
1
1
  <script>
2
- import LabeledInput from '@shell/components/form/LabeledInput';
3
- import RadioGroup from '@shell/components/form/RadioGroup';
2
+ import { LabeledInput } from '@components/Form/LabeledInput';
3
+ import { RadioGroup } from '@components/Form/Radio';
4
4
 
5
5
  export default {
6
6
  components: { LabeledInput, RadioGroup },
@@ -1,5 +1,5 @@
1
1
  <script>
2
- import LabeledInput from '@shell/components/form/LabeledInput';
2
+ import { LabeledInput } from '@components/Form/LabeledInput';
3
3
  import FileSelector, { createOnSelected } from '@shell/components/form/FileSelector';
4
4
 
5
5
  export default {
@@ -1,6 +1,6 @@
1
1
  <script>
2
2
  import { _EDIT } from '@shell/config/query-params';
3
- import LabeledInput from '@shell/components/form/LabeledInput';
3
+ import { LabeledInput } from '@components/Form/LabeledInput';
4
4
  import FileSelector, { createOnSelected } from '@shell/components/form/FileSelector';
5
5
 
6
6
  export default {