@rancher/shell 0.3.0 → 0.3.2

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 (342) 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/_gauges.scss +1 -1
  4. package/assets/styles/global/_layout.scss +5 -2
  5. package/assets/styles/global/_select.scss +1 -4
  6. package/assets/styles/themes/_dark.scss +5 -4
  7. package/assets/styles/themes/_light.scss +4 -3
  8. package/assets/styles/themes/_suse.scss +1 -1
  9. package/assets/styles/vendor/vue-select.scss +4 -3
  10. package/assets/translations/en-us.yaml +673 -73
  11. package/assets/translations/zh-hans.yaml +720 -207
  12. package/chart/monitoring/steps/uninstall-v1.vue +2 -2
  13. package/cloud-credential/azure.vue +23 -0
  14. package/cloud-credential/harvester.vue +25 -62
  15. package/cloud-credential/pnap.vue +80 -0
  16. package/components/.DS_Store +0 -0
  17. package/components/ActionMenu.vue +28 -7
  18. package/components/AdvancedSection.vue +9 -2
  19. package/components/Alert.vue +2 -2
  20. package/components/ButtonDropdown.vue +0 -2
  21. package/components/ButtonGroup.vue +1 -0
  22. package/components/CollapsibleCard.vue +0 -1
  23. package/components/CruResource.vue +41 -4
  24. package/components/DetailTop.vue +72 -4
  25. package/components/DisableAuthProviderModal.vue +106 -0
  26. package/{rancher-components/components/Utils/DraggableZone → components}/DraggableZone.vue +0 -0
  27. package/components/ExplorerMembers.vue +253 -30
  28. package/components/ExplorerProjectsNamespaces.vue +77 -33
  29. package/components/ExtensionPanel.vue +42 -0
  30. package/components/GrowlManager.vue +3 -3
  31. package/components/IconOrSvg.vue +178 -0
  32. package/components/LogItem.vue +69 -0
  33. package/components/PodSecurityAdmission.vue +302 -0
  34. package/components/PromptModal.vue +1 -0
  35. package/components/ResourceDetail/Masthead.vue +69 -4
  36. package/components/ResourceDetail/index.vue +12 -5
  37. package/components/ResourceList/Masthead.vue +11 -1
  38. package/components/ResourceList/ResourceLoadingIndicator.vue +12 -2
  39. package/components/ResourceList/index.vue +66 -12
  40. package/components/ResourceList/resource-list.config.js +7 -0
  41. package/components/ResourceTable.vue +33 -6
  42. package/components/SimpleBox.vue +1 -1
  43. package/components/SortableTable/THead.vue +21 -14
  44. package/components/SortableTable/filtering.js +1 -1
  45. package/components/SortableTable/index.vue +21 -10
  46. package/components/SortableTable/selection.js +15 -3
  47. package/components/Tabbed/Tab.vue +1 -1
  48. package/components/Tabbed/index.vue +20 -15
  49. package/components/__tests__/.DS_Store +0 -0
  50. package/components/__tests__/AsyncButton.test.ts +140 -0
  51. package/components/__tests__/BackLink.test.ts +33 -0
  52. package/components/__tests__/ButtonGroup.test.ts +124 -0
  53. package/components/__tests__/ClusterBadge.test.ts +32 -0
  54. package/components/__tests__/CollapsibleCard.test.ts +64 -0
  55. package/components/__tests__/ConsumptionGauge.test.ts +88 -0
  56. package/components/__tests__/CruResource.test.ts +3 -2
  57. package/components/__tests__/FixedBanner.test.ts +129 -0
  58. package/components/__tests__/GrowlManager.test.ts +147 -0
  59. package/components/__tests__/NamespaceFilter.test.ts +33 -25
  60. package/components/__tests__/PercentageBar.test.ts +32 -0
  61. package/components/__tests__/PodSecurityAdmission.test.ts +398 -0
  62. package/components/auth/AuthBanner.vue +20 -10
  63. package/components/auth/RoleDetailEdit.vue +26 -17
  64. package/components/auth/SelectPrincipal.vue +36 -5
  65. package/components/form/ArrayList.vue +3 -35
  66. package/components/form/ArrayListGrouped.vue +13 -4
  67. package/components/form/ArrayListSelect.vue +5 -5
  68. package/components/form/Error.vue +8 -0
  69. package/components/form/KeyValue.vue +39 -7
  70. package/components/form/LabeledSelect.vue +5 -2
  71. package/components/form/Labels.vue +46 -16
  72. package/components/form/Members/ClusterPermissionsEditor.vue +17 -17
  73. package/components/form/Members/MembershipEditor.vue +12 -12
  74. package/components/form/NameNsDescription.vue +1 -1
  75. package/components/form/NodeScheduling.vue +1 -1
  76. package/components/form/Probe.vue +3 -3
  77. package/components/form/ResourceQuota/Project.vue +6 -6
  78. package/components/form/ResourceTabs/index.vue +24 -6
  79. package/components/form/Security.vue +7 -6
  80. package/components/form/Select.vue +3 -2
  81. package/components/form/SelectOrCreateAuthSecret.vue +22 -29
  82. package/components/form/ServicePorts.vue +8 -0
  83. package/components/form/WorkloadPorts.vue +7 -1
  84. package/components/form/__tests__/ArrayList.test.ts +74 -0
  85. package/components/form/__tests__/ArrayListGrouped.test.ts +6 -4
  86. package/components/formatter/Checked.vue +1 -1
  87. package/components/formatter/ClusterLink.vue +5 -0
  88. package/components/formatter/IconIsDefault.vue +2 -2
  89. package/components/formatter/InternalExternalIP.vue +11 -8
  90. package/components/formatter/LiveDuration.vue +78 -0
  91. package/components/formatter/WorkloadHealthScale.vue +5 -3
  92. package/components/nav/Header.vue +74 -7
  93. package/components/nav/NamespaceFilter.vue +146 -63
  94. package/components/nav/TopLevelMenu.vue +22 -19
  95. package/components/nav/WindowManager/ContainerLogs.vue +83 -126
  96. package/components/nav/WindowManager/ContainerShell.vue +9 -7
  97. package/components/nav/WindowManager/Window.vue +2 -0
  98. package/components/nav/WindowManager/index.vue +10 -0
  99. package/config/elemental-types.js +9 -0
  100. package/config/features.js +2 -0
  101. package/config/home-links.js +4 -1
  102. package/config/pod-security-admission.ts +82 -0
  103. package/config/product/apps.js +1 -1
  104. package/config/product/auth.js +6 -5
  105. package/config/product/backup.js +1 -1
  106. package/config/product/explorer.js +6 -6
  107. package/config/product/fleet.js +1 -1
  108. package/config/product/manager.js +6 -2
  109. package/config/query-params.js +1 -0
  110. package/config/secret.js +0 -1
  111. package/config/settings.ts +26 -9
  112. package/config/table-headers.js +22 -11
  113. package/config/types.js +4 -1
  114. package/config/uiplugins.js +3 -3
  115. package/content/docs/zh-hans/getting-started.md +113 -137
  116. package/content/docs/zh-hans/whats-new.md +8 -46
  117. package/core/plugin-helpers.js +171 -0
  118. package/core/plugin.ts +61 -1
  119. package/core/plugins.js +33 -0
  120. package/core/types.ts +128 -2
  121. package/creators/pkg/package-lock.json +37 -0
  122. package/creators/pkg/package.json +1 -1
  123. package/detail/catalog.cattle.io.app.vue +1 -1
  124. package/detail/pod.vue +1 -1
  125. package/detail/provisioning.cattle.io.cluster.vue +35 -9
  126. package/detail/service.vue +2 -9
  127. package/detail/workload/index.vue +0 -1
  128. package/dialog/AddClusterMemberDialog.vue +22 -28
  129. package/dialog/AddProjectMemberDialog.vue +53 -9
  130. package/dialog/DiagnosticTimingsDialog.vue +8 -7
  131. package/dialog/DrainNode.vue +44 -48
  132. package/dialog/ForceMachineRemoveDialog.vue +5 -7
  133. package/dialog/GenericPrompt.vue +15 -20
  134. package/dialog/RollbackWorkloadDialog.vue +15 -46
  135. package/dialog/RotateCertificatesDialog.vue +5 -7
  136. package/dialog/RotateEncryptionKeyDialog.vue +5 -9
  137. package/dialog/SaveAsRKETemplateDialog.vue +5 -13
  138. package/dialog/ScaleMachineDownDialog.vue +1 -1
  139. package/dialog/ScalePoolDownDialog.vue +121 -0
  140. package/edit/__tests__/management.cattle.io.setting.test.ts +3 -3
  141. package/edit/auth/azuread.vue +16 -16
  142. package/edit/auth/github.vue +8 -0
  143. package/edit/auth/googleoauth.vue +10 -1
  144. package/edit/auth/ldap/index.vue +10 -0
  145. package/edit/auth/oidc.vue +10 -0
  146. package/edit/auth/saml.vue +10 -0
  147. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
  148. package/edit/catalog.cattle.io.clusterrepo.vue +3 -0
  149. package/edit/cloudcredential.vue +3 -7
  150. package/edit/logging-flow/Match.vue +39 -8
  151. package/edit/logging-flow/index.vue +27 -4
  152. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +107 -0
  153. package/edit/management.cattle.io.project.vue +8 -1
  154. package/edit/management.cattle.io.setting.vue +5 -2
  155. package/edit/management.cattle.io.user.vue +7 -1
  156. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +36 -8
  157. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +2 -2
  158. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +14 -6
  159. package/edit/namespace.vue +18 -4
  160. package/edit/networking.k8s.io.ingress/Certificate.vue +1 -0
  161. package/edit/networking.k8s.io.ingress/IngressClass.vue +8 -6
  162. package/edit/networking.k8s.io.ingress/RulePath.vue +12 -6
  163. package/edit/networking.k8s.io.ingress/index.vue +8 -6
  164. package/edit/persistentvolume/index.vue +30 -27
  165. package/edit/persistentvolume/plugins/cephfs.vue +29 -29
  166. package/edit/persistentvolume/plugins/csi.vue +102 -62
  167. package/edit/persistentvolume/plugins/fc.vue +19 -19
  168. package/edit/persistentvolume/plugins/iscsi.vue +45 -45
  169. package/edit/persistentvolume/plugins/rbd.vue +39 -39
  170. package/edit/persistentvolumeclaim.vue +78 -75
  171. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +11 -7
  172. package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +10 -1
  173. package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +87 -27
  174. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +3 -6
  175. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +96 -0
  176. package/edit/provisioning.cattle.io.cluster/import.vue +1 -1
  177. package/edit/provisioning.cattle.io.cluster/index.vue +29 -6
  178. package/edit/provisioning.cattle.io.cluster/rke2.vue +445 -154
  179. package/edit/secret/index.vue +3 -7
  180. package/edit/service.vue +3 -1
  181. package/edit/storage.k8s.io.storageclass/index.vue +100 -16
  182. package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +114 -0
  183. package/edit/workload/__tests__/index.test.ts +98 -0
  184. package/edit/workload/index.vue +58 -8
  185. package/edit/workload/mixins/workload.js +107 -70
  186. package/edit/workload/storage/ContainerMountPaths.vue +0 -10
  187. package/edit/workload/storage/emptyDir.vue +88 -0
  188. package/edit/workload/storage/ephemeralVolume/index.vue +1 -1
  189. package/edit/workload/storage/index.vue +8 -0
  190. package/edit/workload/storage/persistentVolumeClaim/index.vue +1 -1
  191. package/layouts/default.vue +57 -44
  192. package/list/__tests__/workload.test.ts +5 -2
  193. package/list/catalog.cattle.io.app.vue +1 -0
  194. package/list/cis.cattle.io.clusterscan.vue +1 -0
  195. package/list/fleet.cattle.io.bundle.vue +5 -6
  196. package/list/fleet.cattle.io.cluster.vue +6 -3
  197. package/list/fleet.cattle.io.clusterregistrationtoken.vue +5 -6
  198. package/list/fleet.cattle.io.gitrepo.vue +4 -9
  199. package/list/helm.cattle.io.projecthelmchart.vue +1 -5
  200. package/list/logging.banzaicloud.io.clusterflow.vue +4 -1
  201. package/list/logging.banzaicloud.io.flow.vue +6 -5
  202. package/list/management.cattle.io.cluster.vue +1 -0
  203. package/list/management.cattle.io.feature.vue +3 -4
  204. package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +47 -0
  205. package/list/management.cattle.io.setting.vue +2 -2
  206. package/list/management.cattle.io.user.vue +4 -10
  207. package/list/monitoring.coreos.com.alertmanagerconfig.vue +2 -7
  208. package/list/node.vue +8 -5
  209. package/list/persistentvolume.vue +3 -3
  210. package/list/persistentvolumeclaim.vue +3 -4
  211. package/list/provisioning.cattle.io.cluster.vue +18 -19
  212. package/list/service.vue +6 -14
  213. package/list/workload.vue +43 -38
  214. package/machine-config/azure.vue +429 -60
  215. package/machine-config/pnap.vue +288 -0
  216. package/mixins/auth-config.js +1 -3
  217. package/mixins/browser-tab-visibility.js +8 -14
  218. package/mixins/chart.js +1 -1
  219. package/mixins/create-edit-view/impl.js +4 -0
  220. package/mixins/create-edit-view/index.js +4 -2
  221. package/mixins/resource-fetch-namespaced.js +98 -0
  222. package/mixins/resource-fetch.js +79 -45
  223. package/mixins/resource-manager.js +1 -23
  224. package/models/apps.controllerrevision.js +7 -0
  225. package/models/apps.daemonset.js +18 -0
  226. package/models/apps.deployment.js +44 -0
  227. package/models/apps.replicaset.js +7 -0
  228. package/models/apps.statefulset.js +18 -0
  229. package/models/batch.job.js +7 -14
  230. package/models/cluster/node.js +10 -2
  231. package/models/cluster.x-k8s.io.machine.js +26 -4
  232. package/models/cluster.x-k8s.io.machinedeployment.js +12 -2
  233. package/models/event.js +7 -0
  234. package/models/logging.banzaicloud.io.flow.js +4 -0
  235. package/models/management.cattle.io.cluster.js +1 -1
  236. package/models/management.cattle.io.clusterroletemplatebinding.js +1 -1
  237. package/models/management.cattle.io.globalrole.js +2 -2
  238. package/models/management.cattle.io.node.js +37 -2
  239. package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.ts +4 -0
  240. package/models/management.cattle.io.project.js +30 -11
  241. package/models/management.cattle.io.setting.js +1 -1
  242. package/models/management.cattle.io.user.js +37 -1
  243. package/models/namespace.js +42 -5
  244. package/models/persistentvolume.js +14 -2
  245. package/models/pod.js +15 -0
  246. package/models/projectroletemplatebinding.js +7 -0
  247. package/models/provisioning.cattle.io.cluster.js +61 -10
  248. package/models/rke-machine.cattle.io.pnapmachinetemplate.js +15 -0
  249. package/models/service.js +14 -13
  250. package/models/storage.k8s.io.storageclass.js +33 -18
  251. package/models/workload.js +38 -7
  252. package/nuxt.config.js +27 -17
  253. package/package.json +7 -7
  254. package/pages/about.vue +14 -2
  255. package/pages/c/_cluster/apps/charts/index.vue +21 -3
  256. package/pages/c/_cluster/apps/charts/install.vue +59 -22
  257. package/pages/c/_cluster/auth/config/_id.vue +6 -0
  258. package/pages/c/_cluster/auth/config/index.vue +8 -6
  259. package/pages/c/_cluster/auth/group.principal/assign-edit.vue +1 -1
  260. package/pages/c/_cluster/auth/roles/index.vue +1 -1
  261. package/pages/c/_cluster/explorer/index.vue +51 -6
  262. package/pages/c/_cluster/longhorn/index.vue +1 -1
  263. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +15 -4
  264. package/pages/c/_cluster/monitoring/index.vue +1 -1
  265. package/pages/c/_cluster/neuvector/index.vue +1 -1
  266. package/pages/c/_cluster/settings/performance.vue +48 -2
  267. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +2 -0
  268. package/pages/c/_cluster/uiplugins/InstallDialog.vue +3 -0
  269. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +42 -2
  270. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +2 -0
  271. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +1 -0
  272. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +2 -0
  273. package/pages/c/_cluster/uiplugins/index.vue +42 -3
  274. package/pages/diagnostic.vue +5 -4
  275. package/pages/home.vue +105 -30
  276. package/pages/prefs.vue +23 -12
  277. package/pages/rio/mesh.vue +1 -1
  278. package/pkg/dynamic-importer.lib.js +8 -0
  279. package/pkg/vue.config.js +4 -0
  280. package/plugins/dashboard-store/__tests__/mutations.spec.js +406 -0
  281. package/plugins/dashboard-store/actions.js +32 -25
  282. package/plugins/dashboard-store/getters.js +50 -33
  283. package/plugins/dashboard-store/mutations.js +134 -28
  284. package/plugins/dashboard-store/resource-class.js +37 -42
  285. package/plugins/steve/actions.js +30 -0
  286. package/plugins/steve/caches/resourceCache.js +60 -0
  287. package/plugins/steve/getters.js +44 -1
  288. package/plugins/steve/mutations.js +97 -36
  289. package/plugins/steve/resourceWatcher.js +277 -0
  290. package/plugins/steve/schema.utils.js +25 -0
  291. package/plugins/steve/subscribe.js +288 -115
  292. package/plugins/steve/worker/index.js +17 -0
  293. package/plugins/steve/worker/web-worker.advanced.js +302 -0
  294. package/plugins/steve/{web-worker.steve-sub-worker.js → worker/web-worker.basic.js} +3 -44
  295. package/rancher-components/Card/Card.vue +3 -3
  296. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +1 -0
  297. package/rancher-components/StringList/StringList.test.ts +45 -420
  298. package/rancher-components/StringList/StringList.vue +1 -10
  299. package/rancher-components/components/Banner/Banner.test.ts +44 -0
  300. package/rancher-components/components/Banner/Banner.vue +130 -61
  301. package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +13 -22
  302. package/rancher-components/components/Form/Checkbox/Checkbox.vue +8 -6
  303. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +9 -9
  304. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +0 -1
  305. package/rancher-components/components/StringList/StringList.test.ts +7 -7
  306. package/rancher-components/components/StringList/StringList.vue +21 -15
  307. package/scripts/test-plugins-build.sh +8 -0
  308. package/static/loading-indicator.html +1 -1
  309. package/store/action-menu.js +4 -3
  310. package/store/index.js +54 -3
  311. package/store/plugins.js +0 -17
  312. package/store/pnap.js +128 -0
  313. package/store/prefs.js +4 -2
  314. package/store/type-map.js +81 -13
  315. package/types/pod-security-admission.ts +36 -0
  316. package/types/shell/index.d.ts +497 -396
  317. package/utils/__tests__/object.test.ts +17 -1
  318. package/utils/__tests__/pod-security-admission.test.ts +61 -0
  319. package/utils/async.ts +36 -0
  320. package/utils/color.js +45 -0
  321. package/utils/crypto/browserHashUtils.js +18 -0
  322. package/utils/dynamic-importer.js +8 -0
  323. package/utils/install-redirect.js +1 -1
  324. package/utils/object.js +24 -0
  325. package/utils/pod-security-admission.ts +39 -0
  326. package/utils/socket.js +61 -24
  327. package/utils/string.js +2 -0
  328. package/utils/svg-filter.js +301 -0
  329. package/utils/time.js +49 -0
  330. package/utils/validators/cidr.js +4 -0
  331. package/utils/validators/formRules/__tests__/index.test.ts +23 -3
  332. package/utils/validators/formRules/index.ts +14 -0
  333. package/config/product/harvester-manager.js +0 -162
  334. package/edit/harvesterhci.io.management.cluster.vue +0 -153
  335. package/list/harvesterhci.io.management.cluster.vue +0 -241
  336. package/machine-config/harvester.vue +0 -693
  337. package/models/harvesterhci.io.management.cluster.js +0 -228
  338. package/pages/c/_cluster/harvesterManager/index.vue +0 -24
  339. package/rancher-components/Card/Card.test.ts +0 -39
  340. package/rancher-components/Utils/DraggableZone/DraggableZone.vue +0 -181
  341. package/rancher-components/Utils/DraggableZone/index.ts +0 -1
  342. package/rancher-components/components/Utils/DraggableZone/index.ts +0 -1
@@ -77,31 +77,7 @@ export default {
77
77
  const defaultTab = this.$route.query[FOCUS] || null;
78
78
 
79
79
  return {
80
- secondaryResourceData: {
81
- namespace: this.value?.metadata?.namespace || null,
82
- data: {
83
- [PV]: {
84
- applyTo: [
85
- { var: 'persistentVolumes' },
86
- {
87
- var: 'persistentVolumeOptions',
88
- parsingFunc: (data) => {
89
- return data
90
- .map((s) => {
91
- const status = s.status.phase === 'Available' ? '' : ` (${ s.status.phase })`;
92
-
93
- return {
94
- label: `${ s.metadata.name }${ status }`,
95
- value: s.metadata.name
96
- };
97
- })
98
- .sort((l, r) => l.label.localeCompare(r.label));
99
- }
100
- }
101
- ]
102
- },
103
- }
104
- },
80
+ secondaryResourceData: this.secondaryResourceDataConfig(),
105
81
  sourceOptions,
106
82
  source: this.value.spec.volumeName ? sourceOptions[1].value : sourceOptions[0].value,
107
83
  immutableMode: this.realMode === _CREATE ? _CREATE : _VIEW,
@@ -178,6 +154,33 @@ export default {
178
154
  }
179
155
  },
180
156
  methods: {
157
+ secondaryResourceDataConfig() {
158
+ return {
159
+ namespace: this.value?.metadata?.namespace || null,
160
+ data: {
161
+ [PV]: {
162
+ applyTo: [
163
+ { var: 'persistentVolumes' },
164
+ {
165
+ var: 'persistentVolumeOptions',
166
+ parsingFunc: (data) => {
167
+ return data
168
+ .map((s) => {
169
+ const status = s.status.phase === 'Available' ? '' : ` (${ s.status.phase })`;
170
+
171
+ return {
172
+ label: `${ s.metadata.name }${ status }`,
173
+ value: s.metadata.name
174
+ };
175
+ })
176
+ .sort((l, r) => l.label.localeCompare(r.label));
177
+ }
178
+ }
179
+ ]
180
+ },
181
+ }
182
+ };
183
+ },
181
184
  checkboxSetter(key, value) {
182
185
  if (value) {
183
186
  this.value.spec.accessModes.push(key);
@@ -230,16 +233,16 @@ export default {
230
233
  :namespaced="true"
231
234
  />
232
235
 
233
- <ResourceTabs
234
- v-model="value"
235
- :mode="mode"
236
- :side-tabs="true"
237
- :default-tab="defaultTab"
236
+ <ResourceTabs
237
+ v-model="value"
238
+ :mode="mode"
239
+ :side-tabs="true"
240
+ :default-tab="defaultTab"
238
241
  >
239
- <Tab
240
- name="volumeclaim"
241
- :label="t('persistentVolumeClaim.volumeClaim.label')"
242
- :weight="4"
242
+ <Tab
243
+ name="volumeclaim"
244
+ :label="t('persistentVolumeClaim.volumeClaim.label')"
245
+ :weight="4"
243
246
  >
244
247
  <div class="row">
245
248
  <div class="col span-6">
@@ -254,9 +257,9 @@ export default {
254
257
  </div>
255
258
  <div class="col span-6">
256
259
  <div class="row">
257
- <div
258
- v-if="source === 'new'"
259
- class="col span-12"
260
+ <div
261
+ v-if="source === 'new'"
262
+ class="col span-12"
260
263
  >
261
264
  <LabeledSelect
262
265
  v-if="canListStorageClasses"
@@ -273,9 +276,9 @@ export default {
273
276
  :tooltip="t('persistentVolumeClaim.volumeClaim.tooltips.noStorageClass')"
274
277
  />
275
278
  </div>
276
- <div
277
- v-else
278
- class="col span-12"
279
+ <div
280
+ v-else
281
+ class="col span-12"
279
282
  >
280
283
  <LabeledSelect
281
284
  v-if="canListPersistentVolumes"
@@ -308,17 +311,17 @@ export default {
308
311
  :min="1"
309
312
  :required="true"
310
313
  />
311
- <Banner
312
- v-if="isEdit && !value.expandable"
313
- color="info"
314
- class="mt-10"
314
+ <Banner
315
+ v-if="isEdit && !value.expandable"
316
+ color="info"
317
+ class="mt-10"
315
318
  >
316
319
  {{ t('persistentVolumeClaim.expand.notSupported') }}
317
320
  </Banner>
318
- <Banner
319
- v-else-if="isEdit && !value.bound"
320
- color="info"
321
- class="mt-10"
321
+ <Banner
322
+ v-else-if="isEdit && !value.bound"
323
+ color="info"
324
+ class="mt-10"
322
325
  >
323
326
  {{ t('persistentVolumeClaim.expand.notBound') }}
324
327
  </Banner>
@@ -327,42 +330,42 @@ export default {
327
330
  </div>
328
331
  </div>
329
332
  </Tab>
330
- <Tab
331
- name="customize"
332
- :label="t('persistentVolumeClaim.customize.label')"
333
- :weight="3"
333
+ <Tab
334
+ name="customize"
335
+ :label="t('persistentVolumeClaim.customize.label')"
336
+ :weight="3"
334
337
  >
335
338
  <div class="access">
336
339
  <h3>{{ t('persistentVolumeClaim.accessModes') }}</h3>
337
340
  <span class="text-error">*</span>
338
341
  </div>
339
- <div>
340
- <Checkbox
341
- v-model="readWriteOnce"
342
- :label="t('persistentVolumeClaim.customize.accessModes.readWriteOnce')"
343
- :mode="immutableMode"
344
- />
342
+ <div>
343
+ <Checkbox
344
+ v-model="readWriteOnce"
345
+ :label="t('persistentVolumeClaim.customize.accessModes.readWriteOnce')"
346
+ :mode="immutableMode"
347
+ />
345
348
  </div>
346
- <div>
347
- <Checkbox
348
- v-model="readOnlyMany"
349
- :label="t('persistentVolumeClaim.customize.accessModes.readOnlyMany')"
350
- :mode="immutableMode"
351
- />
349
+ <div>
350
+ <Checkbox
351
+ v-model="readOnlyMany"
352
+ :label="t('persistentVolumeClaim.customize.accessModes.readOnlyMany')"
353
+ :mode="immutableMode"
354
+ />
352
355
  </div>
353
- <div>
354
- <Checkbox
355
- v-model="readWriteMany"
356
- :label="t('persistentVolumeClaim.customize.accessModes.readWriteMany')"
357
- :mode="immutableMode"
358
- />
356
+ <div>
357
+ <Checkbox
358
+ v-model="readWriteMany"
359
+ :label="t('persistentVolumeClaim.customize.accessModes.readWriteMany')"
360
+ :mode="immutableMode"
361
+ />
359
362
  </div>
360
363
  </Tab>
361
- <Tab
362
- v-if="isView"
363
- name="status"
364
- :label="t('persistentVolumeClaim.status.label')"
365
- :weight="2"
364
+ <Tab
365
+ v-if="isView"
366
+ name="status"
367
+ :label="t('persistentVolumeClaim.status.label')"
368
+ :weight="2"
366
369
  >
367
370
  <StatusTable :resource="value" />
368
371
  </Tab>
@@ -2,7 +2,6 @@
2
2
  import { LabeledInput } from '@components/Form/LabeledInput';
3
3
  import { Checkbox } from '@components/Form/Checkbox';
4
4
  import { _EDIT } from '@shell/config/query-params';
5
- import { importMachineConfig } from '@shell/utils/dynamic-importer';
6
5
  import Taints from '@shell/components/form/Taints.vue';
7
6
  import KeyValue from '@shell/components/form/KeyValue.vue';
8
7
  import AdvancedSection from '@shell/components/AdvancedSection.vue';
@@ -109,13 +108,11 @@ export default {
109
108
 
110
109
  computed: {
111
110
  configComponent() {
112
- const haveProviders = this.$store.getters['plugins/machineDrivers'];
113
-
114
- if ( haveProviders.includes(this.provider) ) {
115
- return importMachineConfig(this.provider);
111
+ if (this.$store.getters['type-map/hasCustomMachineConfigComponent'](this.provider)) {
112
+ return this.$store.getters['type-map/importMachineConfig'](this.provider);
116
113
  }
117
114
 
118
- return importMachineConfig('generic');
115
+ return this.$store.getters['type-map/importMachineConfig']('generic');
119
116
  },
120
117
 
121
118
  isWindows() {
@@ -155,6 +152,12 @@ export default {
155
152
 
156
153
  return errors;
157
154
  }
155
+ },
156
+ // handle emitted matched machine inventories on selector so that machine count
157
+ // on machine pool can be kept up to date
158
+ // (only used on Elemental because it comes from "machineinventoryselectortemplate" machine-config)
159
+ updateMachineCount(val) {
160
+ this.value.pool.quantity = val || 1;
158
161
  }
159
162
  }
160
163
  };
@@ -208,7 +211,7 @@ export default {
208
211
  <hr class="mt-10">
209
212
  <component
210
213
  :is="configComponent"
211
- v-if="value.config"
214
+ v-if="value.config && configComponent"
212
215
  ref="configComponent"
213
216
  :cluster="cluster"
214
217
  :uuid="uuid"
@@ -219,6 +222,7 @@ export default {
219
222
  :pool-index="idx"
220
223
  :machine-pools="machinePools"
221
224
  @error="e=>errors = e"
225
+ @updateMachineCount="updateMachineCount"
222
226
  />
223
227
  <Banner
224
228
  v-else-if="value.configMissing"
@@ -75,6 +75,10 @@ export default {
75
75
  window.z = this;
76
76
  },
77
77
 
78
+ // created() {
79
+ // set(this.value, 'spec.rkeConfig.registries.configs', {});
80
+ // },
81
+
78
82
  methods: {
79
83
  update() {
80
84
  const configs = {};
@@ -91,6 +95,7 @@ export default {
91
95
  }
92
96
 
93
97
  set(this.value, 'spec.rkeConfig.registries.configs', configs);
98
+ this.$emit('updateConfigs', configs);
94
99
  },
95
100
 
96
101
  wrapRegisterBeforeHook(fn, ...args) {
@@ -118,12 +123,16 @@ export default {
118
123
  class="icon icon-info"
119
124
  />
120
125
  </h3>
126
+ <p class="mb-20">
127
+ {{ t('registryConfig.description') }}
128
+ </p>
121
129
  <ArrayListGrouped
122
130
  v-model="entries"
123
131
  :add-label="t('registryConfig.addLabel')"
124
132
  :default-add-value="defaultAddValue"
133
+ :initial-empty-row="true"
125
134
  :mode="mode"
126
- @input="update()"
135
+ @input="update"
127
136
  >
128
137
  <template #default="{row}">
129
138
  <div class="row">
@@ -1,9 +1,13 @@
1
1
  <script>
2
+ import ArrayListGrouped from '@shell/components/form/ArrayListGrouped';
2
3
  import KeyValue from '@shell/components/form/KeyValue';
4
+ import { LabeledInput } from '@components/Form/LabeledInput';
3
5
  import { set } from '@shell/utils/object';
4
6
 
5
7
  export default {
6
- components: { KeyValue },
8
+ components: {
9
+ ArrayListGrouped, KeyValue, LabeledInput
10
+ },
7
11
 
8
12
  props: {
9
13
  mode: {
@@ -25,12 +29,29 @@ export default {
25
29
  entries.push({
26
30
  hostname,
27
31
  endpoints: (mirrorMap[hostname].endpoint || []).join(', '),
32
+ rewrite: mirrorMap[hostname].rewrite || {},
28
33
  });
29
34
  }
30
35
 
31
36
  return { entries };
32
37
  },
33
38
 
39
+ created() {
40
+ if (!this.value.spec.rkeConfig?.registries?.mirrors) {
41
+ set(this.value, 'spec.rkeConfig.registries.mirrors', {});
42
+ }
43
+ },
44
+
45
+ computed: {
46
+ defaultAddValue() {
47
+ return {
48
+ hostname: '',
49
+ endpoints: '',
50
+ rewrite: {}
51
+ };
52
+ },
53
+ },
54
+
34
55
  methods: {
35
56
  update(entries) {
36
57
  const mirrors = {};
@@ -41,8 +62,10 @@ export default {
41
62
  }
42
63
 
43
64
  mirrors[entry.hostname] = { endpoint: entry.endpoints.split(/\s*,\s*/).map(x => x.trim()) };
65
+ if (entry.rewrite) {
66
+ mirrors[entry.hostname].rewrite = entry.rewrite;
67
+ }
44
68
  }
45
-
46
69
  set(this.value, 'spec.rkeConfig.registries.mirrors', mirrors);
47
70
  },
48
71
  }
@@ -50,29 +73,66 @@ export default {
50
73
  </script>
51
74
 
52
75
  <template>
53
- <KeyValue
54
- key="labels"
55
- :value="entries"
56
- :as-map="false"
57
- key-label="Registry Hostname"
58
- key-name="hostname"
59
- key-placeholder="e.g. docker.io or *"
60
- value-label="Mirror Endpoints"
61
- value-placeholder="e.g. a.registry.com:5000, b.registry.com:5000"
62
- value-name="endpoints"
63
- :add-label="t('registryMirror.addLabel')"
64
- :mode="mode"
65
- :read-allowed="false"
66
- @input="update"
67
- >
68
- <template #title>
69
- <h3>
70
- {{ t('registryMirror.header') }}
71
- <i
72
- v-tooltip="t('registryMirror.toolTip')"
73
- class="icon icon-info"
74
- />
75
- </h3>
76
- </template>
77
- </KeyValue>
76
+ <div>
77
+ <h3>
78
+ {{ t('registryMirror.header') }}
79
+ <i
80
+ v-tooltip="t('registryMirror.toolTip')"
81
+ class="icon icon-info"
82
+ />
83
+ </h3>
84
+ <p class="mb-20">
85
+ {{ t('registryMirror.description') }}
86
+ </p>
87
+ <ArrayListGrouped
88
+ v-model="entries"
89
+ :add-label="t('registryMirror.addLabel')"
90
+ :default-add-value="defaultAddValue"
91
+ :initial-empty-row="true"
92
+ :mode="mode"
93
+ @input="update"
94
+ >
95
+ <template #default="{row}">
96
+ <div class="row">
97
+ <div class="col span-6">
98
+ <LabeledInput
99
+ v-model="row.value.hostname"
100
+ :label="t('registryMirror.hostnameLabel')"
101
+ :placeholder="t('registryMirror.hostnamePlaceholder')"
102
+ :mode="mode"
103
+ />
104
+ </div>
105
+ <div class="col span-6">
106
+ <LabeledInput
107
+ v-model="row.value.endpoints"
108
+ :label="t('registryMirror.endpointsLabel')"
109
+ :placeholder="t('registryMirror.endpointsPlaceholder')"
110
+ :mode="mode"
111
+ />
112
+ </div>
113
+ </div>
114
+ <div class="row mt-20">
115
+ <div class="col span-12">
116
+ <h3>
117
+ {{ t('registryMirrorRewrite.header') }}
118
+ <i
119
+ v-tooltip="t('registryMirrorRewrite.toolTip')"
120
+ class="icon icon-info"
121
+ />
122
+ </h3>
123
+ <KeyValue
124
+ v-model="row.value.rewrite"
125
+ :mode="mode"
126
+ :add-label="t('registryMirrorRewrite.addLabel')"
127
+ :read-allowed="false"
128
+ :key-label="t('registryMirrorRewrite.keyLabel')"
129
+ :key-placeholder="t('registryMirrorRewrite.keyPlaceholder')"
130
+ :value-label="t('registryMirrorRewrite.valueLabel')"
131
+ :value-placeholder="t('registryMirrorRewrite.valuePlaceholder')"
132
+ />
133
+ </div>
134
+ </div>
135
+ </template>
136
+ </ArrayListGrouped>
137
+ </div>
78
138
  </template>
@@ -6,7 +6,6 @@ import CreateEditView from '@shell/mixins/create-edit-view';
6
6
  import CruResource from '@shell/components/CruResource';
7
7
  import NameNsDescription from '@shell/components/form/NameNsDescription';
8
8
  import { Banner } from '@components/Banner';
9
- import { importCloudCredential } from '@shell/utils/dynamic-importer';
10
9
  import { CAPI } from '@shell/config/labels-annotations';
11
10
  import { clear } from '@shell/utils/array';
12
11
 
@@ -132,13 +131,11 @@ export default {
132
131
  },
133
132
 
134
133
  createComponent() {
135
- const haveDrivers = this.$store.getters['plugins/credentialDrivers'];
136
-
137
- if ( haveDrivers.includes(this.driverName) ) {
138
- return importCloudCredential(this.driverName);
134
+ if (this.$store.getters['type-map/hasCustomCloudCredentialComponent'](this.driverName)) {
135
+ return this.$store.getters['type-map/importCloudCredential'](this.driverName);
139
136
  }
140
137
 
141
- return importCloudCredential('generic');
138
+ return this.$store.getters['type-map/importCloudCredential']('generic');
142
139
  },
143
140
 
144
141
  validationPassed() {
@@ -0,0 +1,96 @@
1
+ import { mount } from '@vue/test-utils';
2
+ import rke2 from '@shell/edit/provisioning.cattle.io.cluster/rke2.vue';
3
+
4
+ describe('component: rke2', () => {
5
+ it.each([
6
+ 'v1.25.0+rke2r1',
7
+ 'v1.24.0+rke2r1',
8
+ 'v1.23.0+rke2r1',
9
+ 'v1.25.0+k3s1',
10
+ 'v1.24.0+k3s1',
11
+ 'v1.23.0+k3s1',
12
+ ])('should display PSA option', () => {
13
+ const label = 'whatever';
14
+ const option = { label, value: label };
15
+ const wrapper = mount(rke2, {
16
+ propsData: {
17
+ mode: 'create',
18
+ value: {
19
+ spec: {
20
+ rkeConfig: { etcd: { disableSnapshots: false } },
21
+ chartValues: {},
22
+ defaultPodSecurityAdmissionConfigurationTemplateName: label,
23
+ kubernetesVersion: 'v1.25.0+rke2r1'
24
+ }
25
+ },
26
+ provider: 'whatever',
27
+ resource: {}
28
+ },
29
+ computed: {
30
+ showForm() {
31
+ return true;
32
+ },
33
+ hasMachinePools() {
34
+ return false;
35
+ },
36
+ showk8s21LegacyWarning() {
37
+ return false;
38
+ },
39
+ },
40
+ mocks: {
41
+ $fetchState: { pending: false },
42
+ $route: {
43
+ name: 'anything',
44
+ query: { AS: 'yaml' },
45
+ },
46
+ $store: {
47
+ getters: {
48
+ currentStore: () => 'current_store',
49
+ 'management/schemaFor': jest.fn(),
50
+ 'current_store/all': jest.fn(),
51
+ 'i18n/t': jest.fn(),
52
+ 'i18n/withFallback': jest.fn(),
53
+ },
54
+ dispatch: {
55
+ 'management/find': jest.fn(),
56
+ 'management/findAll': () => ([option]),
57
+ }
58
+ },
59
+ },
60
+ stubs: {
61
+ CruResource: { template: '<div><slot></slot></div>' }, // Required to render the slot content
62
+ Banner: true,
63
+ LabeledSelect: true,
64
+ ACE: true,
65
+ AgentEnv: true,
66
+ ArrayList: true,
67
+ ArrayListGrouped: true,
68
+ BadgeState: true,
69
+ Checkbox: true,
70
+ ClusterMembershipEditor: true,
71
+ DrainOptions: true,
72
+ LabeledInput: true,
73
+ Labels: true,
74
+ Loading: true,
75
+ MachinePool: true,
76
+ MatchExpressions: true,
77
+ NameNsDescription: true,
78
+ Questions: true,
79
+ RadioGroup: true,
80
+ RegistryConfigs: true,
81
+ RegistryMirrors: true,
82
+ S3Config: true,
83
+ SelectCredential: true,
84
+ SelectOrCreateAuthSecret: true,
85
+ Tab: true,
86
+ Tabbed: true,
87
+ UnitInput: true,
88
+ YamlEditor: true,
89
+ }
90
+ });
91
+
92
+ const select = wrapper.find('[data-testid="rke2-custom-edit-psa"]');
93
+
94
+ expect((select.vm as unknown as any).options[0].label).toBe(`${ label } (Current)`);
95
+ });
96
+ });
@@ -10,7 +10,7 @@ import { CAPI, HCI } from '@shell/config/types';
10
10
  import ClusterMembershipEditor from '@shell/components/form/Members/ClusterMembershipEditor';
11
11
  import { Banner } from '@components/Banner';
12
12
  import { canViewClusterMembershipEditor } from '@shell/components/form/Members/ClusterMembershipEditor.vue';
13
- import { NAME as HARVESTER_MANAGER } from '@shell/config/product/harvester-manager';
13
+ import { NAME as HARVESTER_MANAGER } from '@/pkg/harvester-manager/config/harvester-manager';
14
14
  import { HARVESTER as HARVESTER_FEATURE, mapFeature } from '@shell/store/features';
15
15
  import { addObject } from '@shell/utils/array';
16
16
  import { HIDE_DESC, mapPref } from '@shell/store/prefs';
@@ -18,6 +18,7 @@ import { CAPI, MANAGEMENT, DEFAULT_WORKSPACE } from '@shell/config/types';
18
18
  import { mapFeature, RKE2 as RKE2_FEATURE } from '@shell/store/features';
19
19
  import { allHash } from '@shell/utils/promise';
20
20
  import { BLANK_CLUSTER } from '@shell/store';
21
+ import { ELEMENTAL_PRODUCT_NAME, ELEMENTAL_CLUSTER_PROVIDER } from '../../config/elemental-types';
21
22
  import Rke2Config from './rke2';
22
23
  import Import from './import';
23
24
 
@@ -32,7 +33,7 @@ const SORT_GROUPS = {
32
33
  custom2: 5,
33
34
  };
34
35
 
35
- // uSed to proxy stylesheets for custom drviers that provide custom UI (RKE1)
36
+ // uSed to proxy stylesheets for custom drivers that provide custom UI (RKE1)
36
37
  const PROXY_ENDPOINT = '/meta/proxy';
37
38
 
38
39
  export default {
@@ -157,6 +158,7 @@ export default {
157
158
 
158
159
  computed: {
159
160
  ...mapGetters({ allCharts: 'catalog/charts' }),
161
+ ...mapGetters('type-map', ['activeProducts']),
160
162
  preferredProvisioner: mapPref(PROVISIONER),
161
163
  _RKE1: () => _RKE1,
162
164
  _RKE2: () => _RKE2,
@@ -205,10 +207,6 @@ export default {
205
207
 
206
208
  rke2Enabled: mapFeature(RKE2_FEATURE),
207
209
 
208
- showRkeToggle() {
209
- return this.rke2Enabled && !this.isImport;
210
- },
211
-
212
210
  provisioner: {
213
211
  get() {
214
212
  // This can incorrectly return rke1 instead
@@ -246,6 +244,7 @@ export default {
246
244
  subTypes() {
247
245
  const getters = this.$store.getters;
248
246
  const isImport = this.isImport;
247
+ const isElementalActive = !!this.activeProducts.find(item => item.name === ELEMENTAL_PRODUCT_NAME);
249
248
 
250
249
  const out = [];
251
250
 
@@ -287,6 +286,10 @@ export default {
287
286
  });
288
287
 
289
288
  addType('custom', 'custom2', false);
289
+
290
+ if (isElementalActive) {
291
+ addType(ELEMENTAL_CLUSTER_PROVIDER, 'custom2', false);
292
+ }
290
293
  }
291
294
  }
292
295
 
@@ -352,9 +355,29 @@ export default {
352
355
 
353
356
  return sortBy(Object.values(out), 'sort');
354
357
  },
358
+
359
+ firstNodeDriverItem() {
360
+ return this.groupedSubTypes.findIndex(obj => [_RKE1, _RKE2].includes(obj.name));
361
+ },
362
+
363
+ firstCustomClusterItem() {
364
+ return this.groupedSubTypes.findIndex(obj => ['custom', 'custom1', 'custom2'].includes(obj.name));
365
+ },
355
366
  },
356
367
 
357
368
  methods: {
369
+ showRkeToggle(i) {
370
+ if (this.isImport || !this.rke2Enabled) {
371
+ return false;
372
+ }
373
+
374
+ if (this.firstNodeDriverItem >= 0) {
375
+ return i === this.firstNodeDriverItem;
376
+ }
377
+
378
+ return i === this.firstCustomClusterItem;
379
+ },
380
+
358
381
  loadStylesheet(url, id) {
359
382
  if ( !id ) {
360
383
  console.error('loadStylesheet called without an id'); // eslint-disable-line no-console
@@ -469,7 +492,7 @@ export default {
469
492
  >
470
493
  <h4>
471
494
  <div
472
- v-if="showRkeToggle && [_RKE1,_RKE2].includes(obj.name)"
495
+ v-if="showRkeToggle(i)"
473
496
  class="grouped-type"
474
497
  >
475
498
  <ToggleSwitch