@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
@@ -6,6 +6,7 @@ import { NAME as EXPLORER } from '@shell/config/product/explorer';
6
6
  import { listNodeRoles } from '@shell/models/cluster/node';
7
7
  import { insertAt } from '@shell/utils/array';
8
8
  import { downloadUrl } from '@shell/utils/download';
9
+ import findLast from 'lodash/findLast';
9
10
  import HybridModel from '@shell/plugins/steve/hybrid-class';
10
11
 
11
12
  export default class MgmtNode extends HybridModel {
@@ -13,18 +14,18 @@ export default class MgmtNode extends HybridModel {
13
14
  const out = super._availableActions;
14
15
 
15
16
  const downloadKeys = {
16
- action: 'downloadKeys',
17
- enabled: !!this.norman?.links?.nodeConfig,
18
- icon: 'icon icon-fw icon-download',
19
- label: this.t('node.actions.downloadNodeConfig'),
17
+ action: 'downloadKeys',
18
+ enabled: !!this.norman?.links?.nodeConfig,
19
+ icon: 'icon icon-fw icon-download',
20
+ label: this.t('node.actions.downloadNodeConfig'),
20
21
  };
21
22
 
22
23
  const scaleDown = {
23
- action: 'scaleDown',
24
- enabled: !!this.canScaleDown,
25
- icon: 'icon icon-minus icon-fw',
26
- label: this.t('node.actions.scaleDown'),
27
- bulkable: true,
24
+ action: 'scaleDown',
25
+ enabled: !!this.canScaleDown,
26
+ icon: 'icon icon-minus icon-fw',
27
+ label: this.t('node.actions.scaleDown'),
28
+ bulkable: true,
28
29
  };
29
30
 
30
31
  insertAt(out, 0, { divider: true });
@@ -124,8 +125,42 @@ export default class MgmtNode extends HybridModel {
124
125
  return false;
125
126
  }
126
127
 
127
- get ipaddress() {
128
- return this.status.internalNodeStatus?.addresses?.find(({ type }) => type === ADDRESSES.INTERNAL_IP)?.address || '-';
128
+ get internalIp() {
129
+ // This shows in the IP address column for RKE1 nodes in the
130
+ // list of nodes in the cluster detail page of Cluster Management.
131
+
132
+ const internal = this.status?.addresses?.find(({ type }) => {
133
+ return type === ADDRESSES.INTERNAL_IP;
134
+ });
135
+
136
+ if (internal) {
137
+ return internal.address;
138
+ }
139
+
140
+ // For RKE1 clusters in EC2, node addresses are
141
+ // under status.rkeNode.address and status.rkeNode.internalAddress
142
+ if (!internal && this.status.rkeNode) {
143
+ return this.status.rkeNode.internalAddress;
144
+ }
145
+
146
+ return this.t('generic.none');
147
+ }
148
+
149
+ get externalIp() {
150
+ const addresses = this.status?.addresses || [];
151
+ const statusAddress = findLast(addresses, address => address.type === 'ExternalIP')?.address;
152
+
153
+ if (statusAddress) {
154
+ return statusAddress;
155
+ }
156
+
157
+ // For RKE1 clusters in EC2, node addresses are
158
+ // under status.rkeNode.address and status.rkeNode.internalAddress
159
+ if (!statusAddress && this.status.rkeNode) {
160
+ return this.status.rkeNode.address;
161
+ }
162
+
163
+ return this.t('generic.none');
129
164
  }
130
165
 
131
166
  get canScaleDown() {
@@ -79,9 +79,9 @@ export default class MgmtNodePool extends HybridModel {
79
79
  // These are used in `stateParts` which is show in the same context as `stateParts` for machine deployments (rke2 pools))
80
80
  // Using actual states here would look strange when against bucket states for RKE2
81
81
  const res = {
82
- pending: 0,
83
- unavailable: 0,
84
- ready: 0,
82
+ pending: 0,
83
+ unavailable: 0,
84
+ ready: 0,
85
85
  };
86
86
 
87
87
  if (!this.nodes) {
@@ -3,8 +3,8 @@ import HybridModel from '@shell/plugins/steve/hybrid-class';
3
3
 
4
4
  const CONFIG_KEYS = [
5
5
  {
6
- driver: 'aliyunecs',
7
- size: { key: 'instanceType' },
6
+ driver: 'aliyunecs',
7
+ size: { key: 'instanceType' },
8
8
  location: {
9
9
  getDisplayProperty(that) {
10
10
  return `${ that.providerConfig?.region }${ that.providerConfig?.zone }`;
@@ -12,8 +12,8 @@ const CONFIG_KEYS = [
12
12
  }
13
13
  },
14
14
  {
15
- driver: 'amazonec2',
16
- size: { key: 'instanceType' },
15
+ driver: 'amazonec2',
16
+ size: { key: 'instanceType' },
17
17
  location: {
18
18
  getDisplayProperty(that) {
19
19
  return `${ that.providerConfig?.region }${ that.providerConfig?.zone }`;
@@ -21,47 +21,47 @@ const CONFIG_KEYS = [
21
21
  }
22
22
  },
23
23
  {
24
- driver: 'azure',
25
- size: { key: 'size' },
24
+ driver: 'azure',
25
+ size: { key: 'size' },
26
26
  location: { key: 'location' }
27
27
  },
28
28
  {
29
- driver: 'digitalocean',
30
- size: { key: 'size' },
29
+ driver: 'digitalocean',
30
+ size: { key: 'size' },
31
31
  location: { key: 'region' }
32
32
  },
33
33
  {
34
- driver: 'exoscale',
35
- size: { key: 'instanceProfile' },
34
+ driver: 'exoscale',
35
+ size: { key: 'instanceProfile' },
36
36
  location: { key: 'availabilityZone' }
37
37
  },
38
38
  {
39
- driver: 'linode',
40
- size: { key: 'instanceType' },
39
+ driver: 'linode',
40
+ size: { key: 'instanceType' },
41
41
  location: { key: 'region' }
42
42
  },
43
43
  {
44
- driver: 'oci',
45
- size: { key: 'nodeShape' },
44
+ driver: 'oci',
45
+ size: { key: 'nodeShape' },
46
46
  location: {}
47
47
  },
48
48
  {
49
- driver: 'packet',
50
- size: { key: 'plan' },
49
+ driver: 'packet',
50
+ size: { key: 'plan' },
51
51
  location: { key: 'facilityCode' }
52
52
  },
53
53
  {
54
- driver: 'pnap',
55
- size: { key: 'serverType' },
54
+ driver: 'pnap',
55
+ size: { key: 'serverType' },
56
56
  location: { key: 'serverLocation' }
57
57
  },
58
58
  {
59
- driver: 'rackspace',
60
- size: { key: 'flavorId' },
59
+ driver: 'rackspace',
60
+ size: { key: 'flavorId' },
61
61
  location: { key: 'region' }
62
62
  },
63
63
  {
64
- driver: 'vmwarevsphere',
64
+ driver: 'vmwarevsphere',
65
65
  size: {
66
66
  getDisplayProperty(that) {
67
67
  const size = formatSi(that.providerConfig?.memorySize * 1048576, 1024, 'iB');
@@ -0,0 +1,4 @@
1
+ import SteveModel from '@shell/plugins/steve/steve-class';
2
+
3
+ export default class PodSecurityAdmissionTemplate extends SteveModel {
4
+ }
@@ -2,7 +2,7 @@ import { DEFAULT_PROJECT, SYSTEM_PROJECT } from '@shell/config/labels-annotation
2
2
  import { MANAGEMENT, NAMESPACE, NORMAN } from '@shell/config/types';
3
3
  import HybridModel from '@shell/plugins/steve/hybrid-class';
4
4
  import isEmpty from 'lodash/isEmpty';
5
- import { HARVESTER_NAME as HARVESTER } from '@shell/config/product/harvester-manager';
5
+ import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
6
6
 
7
7
  function clearUnusedResourceQuotas(spec, types) {
8
8
  types.forEach((type) => {
@@ -99,18 +99,36 @@ export default class Project extends HybridModel {
99
99
  // and the PUT request should have a query param _replace=true.
100
100
  const newValue = await norman.save({ replace: forceReplaceOnReq });
101
101
 
102
- try {
103
- await newValue.doAction('setpodsecuritypolicytemplate', { podSecurityPolicyTemplateId: this.spec.podSecurityPolicyTemplateId || null });
104
- } catch (err) {
105
- if ( err.status === 409 || err.status === 403 ) {
106
- // The backend updates each new project soon after it is created,
107
- // so there is a chance of a resource conflict or forbidden error. If that happens,
108
- // retry the action.
102
+ let retryCount = 0;
103
+
104
+ const finishProjectCreation = async() => {
105
+ try {
109
106
  await newValue.doAction('setpodsecuritypolicytemplate', { podSecurityPolicyTemplateId: this.spec.podSecurityPolicyTemplateId || null });
110
- } else {
111
- throw err;
107
+ } catch (err) {
108
+ if ( err.status === 409 || err.status === 403 ) {
109
+ // The backend updates each new project soon after it is created,
110
+ // so there is a chance of a 409 resource conflict or forbidden error. If that happens,
111
+ // retry the action.
112
+
113
+ // The 403 permission error can happen due to the user requesting
114
+ // the project before the project is fully created and the project
115
+ // permissions are assigned to the user so we allow some
116
+ // time for that process to complete.
117
+
118
+ if (retryCount < 3) {
119
+ retryCount++;
120
+ await setTimeout(() => {
121
+ // Delay for three seconds to avoid another failure due to latency.
122
+ finishProjectCreation();
123
+ }, '3000');
124
+ } else {
125
+ throw err;
126
+ }
127
+ }
112
128
  }
113
- }
129
+ };
130
+
131
+ await finishProjectCreation();
114
132
 
115
133
  return newValue;
116
134
  }
@@ -153,8 +171,8 @@ export default class Project extends HybridModel {
153
171
  get normanEditProject() {
154
172
  return (async() => {
155
173
  const normanProject = await this.$dispatch('rancher/find', {
156
- type: NORMAN.PROJECT,
157
- id: this.id.replace('/', ':'),
174
+ type: NORMAN.PROJECT,
175
+ id: this.id.replace('/', ':'),
158
176
  }, { root: true });
159
177
 
160
178
  const clearedResourceQuotas = clearUnusedResourceQuotas(this.spec, ['resourceQuota', 'namespaceDefaultResourceQuota']);
@@ -163,6 +181,7 @@ export default class Project extends HybridModel {
163
181
  normanProject.setLabels(this.metadata.labels);
164
182
  normanProject.setResourceQuotas(clearedResourceQuotas);
165
183
  normanProject.description = this.spec.description;
184
+ normanProject.name = this.spec.displayName;
166
185
  normanProject.containerDefaultResourceLimit = this.spec.containerDefaultResourceLimit;
167
186
 
168
187
  return normanProject;
@@ -80,9 +80,9 @@ export default class PRTB extends HybridModel {
80
80
  const name = `c-cluster-product-resource-id`;
81
81
 
82
82
  const params = {
83
- resource: MANAGEMENT.PROJECT,
84
- id: this.projectId,
85
- product: 'explorer',
83
+ resource: MANAGEMENT.PROJECT,
84
+ id: this.projectId,
85
+ product: 'explorer',
86
86
  };
87
87
 
88
88
  return { name, params };
@@ -96,9 +96,9 @@ export default class PRTB extends HybridModel {
96
96
  const name = `c-cluster-product-resource-id`;
97
97
 
98
98
  const params = {
99
- resource: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING,
100
- id: this.clusterName,
101
- product: 'explorer',
99
+ resource: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING,
100
+ id: this.clusterName,
101
+ product: 'explorer',
102
102
  };
103
103
 
104
104
  return { name, params };
@@ -4,44 +4,45 @@ import { DESCRIPTION } from '@shell/config/labels-annotations';
4
4
  import { NORMAN } from '@shell/config/types';
5
5
  import SteveDescriptionModel from '@shell/plugins/steve/steve-description-class';
6
6
  import Role from './rbac.authorization.k8s.io.role';
7
+ import { AS, MODE, _CLONE, _UNFLAG } from '@shell/config/query-params';
7
8
 
8
9
  export const CATTLE_API_GROUP = '.cattle.io';
9
10
 
10
11
  export const SUBTYPE_MAPPING = {
11
- GLOBAL: {
12
- key: 'GLOBAL',
13
- type: 'management.cattle.io.globalrole',
14
- defaultKey: 'newUserDefault',
15
- id: 'GLOBAL',
16
- labelKey: 'rbac.roletemplate.subtypes.GLOBAL.label',
12
+ GLOBAL: {
13
+ key: 'GLOBAL',
14
+ type: 'management.cattle.io.globalrole',
15
+ defaultKey: 'newUserDefault',
16
+ id: 'GLOBAL',
17
+ labelKey: 'rbac.roletemplate.subtypes.GLOBAL.label',
17
18
  },
18
- CLUSTER: {
19
- key: 'CLUSTER',
20
- type: 'management.cattle.io.roletemplate',
21
- context: 'cluster',
22
- defaultKey: 'clusterCreatorDefault',
23
- id: 'CLUSTER',
24
- labelKey: 'rbac.roletemplate.subtypes.CLUSTER.label',
19
+ CLUSTER: {
20
+ key: 'CLUSTER',
21
+ type: 'management.cattle.io.roletemplate',
22
+ context: 'cluster',
23
+ defaultKey: 'clusterCreatorDefault',
24
+ id: 'CLUSTER',
25
+ labelKey: 'rbac.roletemplate.subtypes.CLUSTER.label',
25
26
  },
26
27
  NAMESPACE: {
27
- key: 'NAMESPACE',
28
- type: 'management.cattle.io.roletemplate',
29
- context: 'project',
30
- defaultKey: 'projectCreatorDefault',
31
- id: 'NAMESPACE',
32
- labelKey: 'rbac.roletemplate.subtypes.NAMESPACE.label',
28
+ key: 'NAMESPACE',
29
+ type: 'management.cattle.io.roletemplate',
30
+ context: 'project',
31
+ defaultKey: 'projectCreatorDefault',
32
+ id: 'NAMESPACE',
33
+ labelKey: 'rbac.roletemplate.subtypes.NAMESPACE.label',
33
34
  },
34
35
  RBAC_ROLE: {
35
- key: 'RBAC_ROLE',
36
- type: 'rbac.authorization.k8s.io.role',
37
- id: 'RBAC_ROLE',
38
- labelKey: 'rbac.roletemplate.subtypes.RBAC_ROLE.label',
36
+ key: 'RBAC_ROLE',
37
+ type: 'rbac.authorization.k8s.io.role',
38
+ id: 'RBAC_ROLE',
39
+ labelKey: 'rbac.roletemplate.subtypes.RBAC_ROLE.label',
39
40
  },
40
41
  RBAC_CLUSTER_ROLE: {
41
- key: 'RBAC_CLUSTER_ROLE',
42
- type: 'rbac.authorization.k8s.io.clusterrole',
43
- id: 'RBAC_CLUSTER_ROLE',
44
- labelKey: 'rbac.roletemplate.subtypes.RBAC_CLUSTER_ROLE.label',
42
+ key: 'RBAC_CLUSTER_ROLE',
43
+ type: 'rbac.authorization.k8s.io.clusterrole',
44
+ id: 'RBAC_CLUSTER_ROLE',
45
+ labelKey: 'rbac.roletemplate.subtypes.RBAC_CLUSTER_ROLE.label',
45
46
  }
46
47
  };
47
48
 
@@ -55,6 +56,8 @@ export const VERBS = [
55
56
  'watch',
56
57
  ];
57
58
 
59
+ export const CREATE_VERBS = new Set(['PUT', 'blocked-PUT']);
60
+
58
61
  export default class RoleTemplate extends SteveDescriptionModel {
59
62
  get customValidationRules() {
60
63
  return Role.customValidationRules();
@@ -64,13 +67,13 @@ export default class RoleTemplate extends SteveDescriptionModel {
64
67
  const out = this._details;
65
68
 
66
69
  out.unshift({
67
- label: this.t('resourceDetail.detailTop.name'),
68
- content: get(this, 'name')
70
+ label: this.t('resourceDetail.detailTop.name'),
71
+ content: get(this, 'name')
69
72
  },
70
73
  // API returns a blank description property, this overrides our own link to the description
71
74
  {
72
- label: this.t('resourceDetail.detailTop.description'),
73
- content: this.metadata?.annotations?.[DESCRIPTION]
75
+ label: this.t('resourceDetail.detailTop.description'),
76
+ content: this.metadata?.annotations?.[DESCRIPTION]
74
77
  });
75
78
 
76
79
  return out;
@@ -159,6 +162,26 @@ export default class RoleTemplate extends SteveDescriptionModel {
159
162
  })();
160
163
  }
161
164
 
165
+ get canCreate() {
166
+ const schema = this.$getters['schemaFor'](this.type);
167
+
168
+ return schema?.resourceMethods.find(verb => CREATE_VERBS.has(verb));
169
+ }
170
+
171
+ goToClone(moreQuery = {}) {
172
+ const location = this.detailLocation;
173
+
174
+ location.query = {
175
+ ...location.query,
176
+ [MODE]: _CLONE,
177
+ [AS]: _UNFLAG,
178
+ roleContext: this.subtype,
179
+ ...moreQuery
180
+ };
181
+
182
+ this.currentRouter().push(location);
183
+ }
184
+
162
185
  async save() {
163
186
  const norman = await this.norman;
164
187
 
@@ -12,7 +12,7 @@ export default class Setting extends HybridModel {
12
12
  let out = super._availableActions;
13
13
 
14
14
  // Some settings are not editable
15
- if ( settingMetadata?.readOnly || this.fromEnv ) {
15
+ if ( settingMetadata?.readOnly ) {
16
16
  toFilter.push('goToEdit');
17
17
  }
18
18
 
@@ -1,7 +1,25 @@
1
1
  import { NORMAN } from '@shell/config/types';
2
- import HybridModel from '@shell/plugins/steve/hybrid-class';
2
+ import HybridModel, { cleanHybridResources } from '@shell/plugins/steve/hybrid-class';
3
3
 
4
4
  export default class User extends HybridModel {
5
+ // Preserve description
6
+ constructor(data, ctx, rehydrateNamespace = null, setClone = false) {
7
+ const _description = data.description;
8
+
9
+ super(data, ctx, rehydrateNamespace, setClone);
10
+ this.description = _description;
11
+ }
12
+
13
+ // Clean the Norman properties, but keep description
14
+ cleanResource(data) {
15
+ const desc = data.description;
16
+ const clean = cleanHybridResources(data);
17
+
18
+ clean._description = desc;
19
+
20
+ return clean;
21
+ }
22
+
5
23
  get isSystem() {
6
24
  for ( const p of this.principalIds || [] ) {
7
25
  if ( p.startsWith('system://') ) {
@@ -89,6 +107,24 @@ export default class User extends HybridModel {
89
107
  return this.metadata?.state?.name || 'unknown';
90
108
  }
91
109
 
110
+ get description() {
111
+ return this._description;
112
+ }
113
+
114
+ set description(value) {
115
+ this._description = value;
116
+ }
117
+
118
+ // Ensure when we clone that we preserve the description
119
+ toJSON() {
120
+ const data = super.toJSON();
121
+
122
+ data.description = this._description;
123
+ delete data._description;
124
+
125
+ return data;
126
+ }
127
+
92
128
  async save(opt) {
93
129
  const clone = await this.$dispatch('clone', { resource: this });
94
130
 
@@ -123,7 +159,7 @@ export default class User extends HybridModel {
123
159
 
124
160
  async refreshGroupMembership() {
125
161
  const user = await this.$dispatch('rancher/find', {
126
- type: NORMAN.USER,
162
+ type: NORMAN.USER,
127
163
  id: this.id,
128
164
  }, { root: true });
129
165
 
@@ -158,9 +194,9 @@ export default class User extends HybridModel {
158
194
  weight: 1
159
195
  },
160
196
  {
161
- action: 'refreshGroupMembership',
162
- label: this.t('authGroups.actions.refresh'),
163
- icon: 'icon icon-refresh',
197
+ action: 'refreshGroupMembership',
198
+ label: this.t('authGroups.actions.refresh'),
199
+ icon: 'icon icon-refresh',
164
200
  enabled: this.canRefreshAccess
165
201
  },
166
202
  { divider: true },
@@ -102,9 +102,9 @@ export default class AlertmanagerConfig extends SteveModel {
102
102
  alertmanagerconfigid: this.id
103
103
  },
104
104
  query: {
105
- mode: queryMode || _VIEW,
105
+ mode: queryMode || _VIEW,
106
106
  receiverName,
107
- currentView: _YAML
107
+ currentView: _YAML
108
108
  }
109
109
  };
110
110
  }
@@ -117,9 +117,9 @@ export default class AlertmanagerConfig extends SteveModel {
117
117
  alertmanagerconfigid: this.id
118
118
  },
119
119
  query: {
120
- mode: queryMode || _VIEW,
120
+ mode: queryMode || _VIEW,
121
121
  receiverName,
122
- currentView: _CONFIG
122
+ currentView: _CONFIG
123
123
  }
124
124
  };
125
125
  }
@@ -36,13 +36,13 @@ export const RECEIVERS_TYPES = [
36
36
  logo: require(`~shell/assets/images/vendor/email.svg`)
37
37
  },
38
38
  {
39
- name: 'webhook',
40
- label: 'monitoringReceiver.webhook.label',
41
- title: 'monitoringReceiver.webhook.title',
42
- key: 'webhook_configs',
43
- logo: require(`~shell/assets/images/vendor/webhook.svg`),
44
- banner: 'webhook.banner',
45
- addButton: 'webhook.add'
39
+ name: 'webhook',
40
+ label: 'monitoringReceiver.webhook.label',
41
+ title: 'monitoringReceiver.webhook.title',
42
+ key: 'webhook_configs',
43
+ logo: require(`~shell/assets/images/vendor/webhook.svg`),
44
+ banner: 'webhook.banner',
45
+ addButton: 'webhook.add'
46
46
  },
47
47
  {
48
48
  name: 'custom',
@@ -150,8 +150,8 @@ export default class Route extends SteveModel {
150
150
 
151
151
  get receiverLink() {
152
152
  return {
153
- text: this.spec.receiver,
154
- to: {
153
+ text: this.spec.receiver,
154
+ to: {
155
155
  name: 'c-cluster-product-resource-id',
156
156
  params: {
157
157
  resource: MONITORING.SPOOFED.RECEIVER, product: MONITORING_PRODUCT, id: this.spec.receiver
@@ -9,7 +9,9 @@ import { escapeHtml } from '@shell/utils/string';
9
9
  import { insertAt, isArray } from '@shell/utils/array';
10
10
  import SteveModel from '@shell/plugins/steve/steve-class';
11
11
  import Vue from 'vue';
12
- import { HARVESTER_NAME as HARVESTER } from '@shell/config/product/harvester-manager';
12
+ import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
13
+ import { hasPSALabels, getPSATooltipsDescription, getPSALabels } from '@shell/utils/pod-security-admission';
14
+ import { PSAIconsDisplay, PSALabelsNamespaceVersion } from '@shell/config/pod-security-admission';
13
15
 
14
16
  const OBSCURE_NAMESPACE_PREFIX = [
15
17
  'c-', // cluster namespace
@@ -185,11 +187,10 @@ export default class Namespace extends SteveModel {
185
187
  }
186
188
 
187
189
  get _detailLocation() {
188
- const _detailLocation = super._detailLocation;
190
+ let _detailLocation = super._detailLocation;
189
191
 
190
- // Harvester uses these resource directly... but has different routes. detailLocation covers routes leading to resource (like edit)
191
- if (this.$rootGetters['currentProduct'].inStore === HARVESTER) {
192
- _detailLocation.name = `${ HARVESTER }-${ _detailLocation.name }`.replace('-product', '');
192
+ if (this.$rootGetters['currentProduct'].hideNamespaceLocation) {
193
+ _detailLocation = false;
193
194
  }
194
195
 
195
196
  return _detailLocation;
@@ -210,4 +211,53 @@ export default class Namespace extends SteveModel {
210
211
  set resourceQuota(value) {
211
212
  Vue.set(this.metadata.annotations, RESOURCE_QUOTA, JSON.stringify(value));
212
213
  }
214
+
215
+ get detailTopTooltips() {
216
+ return this.psaTooltipsDescription;
217
+ }
218
+
219
+ get detailTopIcons() {
220
+ return PSAIconsDisplay;
221
+ }
222
+
223
+ /**
224
+ * Check if resource contains PSA labels
225
+ */
226
+ get hasSystemLabels() {
227
+ return hasPSALabels(this);
228
+ }
229
+
230
+ get filteredSystemLabels() {
231
+ return Object.entries(this.labels).reduce((res, [key, value]) => {
232
+ if (!PSALabelsNamespaceVersion.includes(key)) {
233
+ res[key] = value;
234
+ }
235
+
236
+ return res;
237
+ }, {});
238
+ }
239
+
240
+ /**
241
+ * Generate list of present keys which can be filtered based on existing label keys and system keys
242
+ */
243
+ get systemLabels() {
244
+ return getPSALabels(this);
245
+ }
246
+
247
+ get psaTooltipsDescription() {
248
+ return getPSATooltipsDescription(this);
249
+ }
250
+
251
+ // Preserve the project label - ensures we preserve project when cloning a namespace
252
+ cleanForNew() {
253
+ const project = this.metadata?.labels?.[PROJECT];
254
+
255
+ super.cleanForNew();
256
+
257
+ if (project) {
258
+ this.metadata = this.metadata || {};
259
+ this.metadata.labels = this.metadata.labels || {};
260
+ this.metadata.labels[PROJECT] = project;
261
+ }
262
+ }
213
263
  }
@@ -112,10 +112,22 @@ export const LONGHORN_DRIVER = 'driver.longhorn.io';
112
112
  export const LONGHORN_PLUGIN = VOLUME_PLUGINS.find(plugin => plugin.value === 'longhorn');
113
113
 
114
114
  export default class PV extends SteveModel {
115
+ // plugin display value table
115
116
  get source() {
116
- const plugin = this.isLonghorn ? LONGHORN_PLUGIN : VOLUME_PLUGINS.find(plugin => this.spec[plugin.value]);
117
+ const csiDriver = this.spec?.csi?.driver;
118
+ const fallback = `${ csiDriver } ${ this.t('persistentVolume.csi.drivers.suffix') }`;
117
119
 
118
- return this.t(plugin.labelKey);
120
+ if (csiDriver) {
121
+ return this.$rootGetters['i18n/withFallback'](`persistentVolume.csi.drivers.${ csiDriver.replaceAll('.', '-') }`, null, fallback);
122
+ }
123
+ const pluginDef = VOLUME_PLUGINS.find(plugin => this.spec[plugin.value]);
124
+
125
+ if (pluginDef) {
126
+ return this.t(pluginDef.labelKey);
127
+ }
128
+
129
+ // every source should be a csi driver or listed in VOLUME_PLUGIN but just in case..
130
+ return this.t('generic.unknown');
119
131
  }
120
132
 
121
133
  get isLonghorn() {