@rancher/shell 0.1.2 → 0.1.4

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 (347) hide show
  1. package/assets/brand/suse/dark/rancher-logo.svg +1 -148
  2. package/assets/brand/suse/rancher-logo.svg +1 -130
  3. package/assets/images/featured/img1.jpg +0 -0
  4. package/assets/images/featured.jpg +0 -0
  5. package/assets/images/generic-plugin.svg +7 -0
  6. package/assets/styles/themes/_dark.scss +3 -0
  7. package/assets/styles/themes/_light.scss +3 -0
  8. package/assets/styles/themes/_suse.scss +1 -1
  9. package/assets/translations/en-us.yaml +209 -813
  10. package/assets/translations/zh-hans.yaml +28 -792
  11. package/components/ActionMenu.vue +3 -3
  12. package/components/AsyncButton.vue +17 -2
  13. package/components/ButtonDropdown.vue +4 -0
  14. package/components/Carousel.vue +291 -0
  15. package/components/CodeMirror.vue +6 -8
  16. package/components/CommunityLinks.vue +70 -19
  17. package/components/ContainerResourceLimit.vue +14 -0
  18. package/components/CruResource.vue +11 -3
  19. package/components/Dialog.vue +102 -0
  20. package/components/ExplorerMembers.vue +121 -0
  21. package/components/ExplorerProjectsNamespaces.vue +404 -0
  22. package/components/GrafanaDashboard.vue +17 -2
  23. package/components/IconMessage.vue +9 -1
  24. package/components/LocaleSelector.vue +114 -0
  25. package/components/PromptModal.vue +2 -3
  26. package/components/ResourceList/index.vue +1 -1
  27. package/components/ResourceTable.vue +9 -7
  28. package/components/SimpleBox.vue +6 -4
  29. package/components/SingleClusterInfo.vue +1 -1
  30. package/components/SortableTable/index.vue +18 -25
  31. package/components/SortableTable/selection.js +1 -0
  32. package/components/Tabbed/Tab.vue +5 -0
  33. package/components/Tabbed/index.vue +29 -2
  34. package/components/auth/AzureWarning.vue +5 -1
  35. package/components/auth/Principal.vue +2 -1
  36. package/components/auth/RoleDetailEdit.vue +18 -11
  37. package/components/fleet/FleetBundles.vue +8 -3
  38. package/components/fleet/FleetRepos.vue +0 -2
  39. package/components/fleet/FleetSummary.vue +6 -0
  40. package/components/form/KeyValue.vue +80 -58
  41. package/components/form/NameNsDescription.vue +12 -8
  42. package/components/form/NodeScheduling.vue +1 -1
  43. package/components/form/ResourceTabs/index.vue +5 -1
  44. package/components/form/WorkloadPorts.vue +1 -1
  45. package/components/formatter/ClusterLink.vue +3 -7
  46. package/components/formatter/WorkloadHealthScale.vue +1 -1
  47. package/components/nav/Header.vue +9 -9
  48. package/components/nav/NamespaceFilter.vue +10 -7
  49. package/components/nav/TopLevelMenu.vue +10 -65
  50. package/components/nav/WindowManager/ContainerLogs.vue +1 -1
  51. package/config/footer.js +13 -14
  52. package/config/labels-annotations.js +2 -1
  53. package/config/product/explorer.js +5 -4
  54. package/config/product/harvester-manager.js +64 -2
  55. package/config/product/legacy.js +0 -47
  56. package/config/product/manager.js +9 -0
  57. package/config/product/multi-cluster-apps.js +0 -12
  58. package/config/product/settings.js +12 -1
  59. package/config/product/uiplugins.js +17 -0
  60. package/config/settings.js +37 -72
  61. package/config/table-headers.js +0 -1
  62. package/config/types.js +9 -25
  63. package/config/uiplugins.js +60 -0
  64. package/content/docs/en-us/getting-started.md +1 -26
  65. package/core/plugin-routes.ts +34 -22
  66. package/core/plugin.ts +15 -3
  67. package/core/plugins-loader.js +2 -0
  68. package/core/plugins.js +91 -36
  69. package/core/types.ts +7 -1
  70. package/detail/provisioning.cattle.io.cluster.vue +15 -2
  71. package/detail/workload/index.vue +11 -5
  72. package/{components/dialog → dialog}/AddClusterMemberDialog.vue +0 -0
  73. package/{components/dialog → dialog}/AddCustomBadgeDialog.vue +0 -0
  74. package/{components/dialog → dialog}/AddProjectMemberDialog.vue +0 -0
  75. package/{components/dialog → dialog}/AddonConfigConfirmationDialog.vue +0 -0
  76. package/dialog/DiagnosticTimingsDialog.vue +116 -0
  77. package/{components/dialog → dialog}/DrainNode.vue +0 -0
  78. package/{components/dialog → dialog}/ForceMachineRemoveDialog.vue +0 -0
  79. package/{components/dialog → dialog}/GenericPrompt.vue +0 -0
  80. package/{components/dialog → dialog}/RollbackWorkloadDialog.vue +0 -0
  81. package/{components/dialog → dialog}/RotateCertificatesDialog.vue +9 -3
  82. package/{components/dialog → dialog}/RotateEncryptionKeyDialog.vue +0 -0
  83. package/{components/dialog → dialog}/SaveAsRKETemplateDialog.vue +0 -0
  84. package/{components/dialog → dialog}/ScaleMachineDownDialog.vue +0 -0
  85. package/edit/auth/azuread.vue +44 -6
  86. package/edit/management.cattle.io.project.vue +2 -2
  87. package/edit/namespace.vue +17 -10
  88. package/edit/networking.k8s.io.ingress/index.vue +2 -2
  89. package/edit/persistentvolume/index.vue +3 -0
  90. package/edit/persistentvolumeclaim.vue +1 -0
  91. package/edit/pod.vue +27 -0
  92. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +1 -1
  93. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +33 -5
  94. package/edit/provisioning.cattle.io.cluster/rke2.vue +76 -5
  95. package/edit/service.vue +8 -6
  96. package/edit/workload/__tests__/Upgrading.test.ts +1 -0
  97. package/edit/workload/index.vue +375 -15
  98. package/edit/workload/mixins/workload.js +62 -7
  99. package/edit/workload/storage/ContainerMountPaths.vue +240 -0
  100. package/edit/workload/storage/Mount.vue +1 -0
  101. package/edit/workload/storage/awsElasticBlockStore.vue +20 -1
  102. package/edit/workload/storage/azureDisk.vue +22 -2
  103. package/edit/workload/storage/azureFile.vue +20 -2
  104. package/edit/workload/storage/csi/index.vue +23 -1
  105. package/edit/workload/storage/gcePersistentDisk.vue +20 -2
  106. package/edit/workload/storage/index.vue +23 -49
  107. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -0
  108. package/edit/workload/storage/vsphereVolume.vue +11 -1
  109. package/layouts/default.vue +63 -32
  110. package/layouts/error.vue +5 -1
  111. package/layouts/home.vue +14 -5
  112. package/layouts/plain.vue +10 -5
  113. package/list/harvesterhci.io.management.cluster.vue +74 -33
  114. package/list/management.cattle.io.setting.vue +3 -3
  115. package/list/namespace.vue +3 -5
  116. package/list/provisioning.cattle.io.cluster.vue +1 -1
  117. package/machine-config/amazonec2.vue +2 -0
  118. package/machine-config/harvester.vue +100 -51
  119. package/middleware/authenticated.js +56 -52
  120. package/mixins/form-validation.js +1 -1
  121. package/mixins/resource-fetch.js +3 -1
  122. package/models/catalog.cattle.io.uiplugin.js +34 -0
  123. package/models/cluster/node.js +25 -2
  124. package/models/fleet.cattle.io.bundle.js +27 -20
  125. package/models/harvesterhci.io.management.cluster.js +200 -5
  126. package/models/management.cattle.io.cluster.js +1 -1
  127. package/models/management.cattle.io.clusterroletemplatebinding.js +9 -0
  128. package/models/management.cattle.io.project.js +23 -2
  129. package/models/namespace.js +19 -3
  130. package/models/pod.js +19 -2
  131. package/models/provisioning.cattle.io.cluster.js +16 -6
  132. package/models/workload.js +9 -246
  133. package/models/workload.service.js +314 -0
  134. package/nuxt.config.js +80 -34
  135. package/package.json +107 -108
  136. package/pages/auth/login.vue +11 -2
  137. package/pages/auth/setup.vue +1 -1
  138. package/pages/c/_cluster/_product/members/index.vue +3 -93
  139. package/pages/c/_cluster/_product/projectsnamespaces.vue +6 -403
  140. package/pages/c/_cluster/apps/charts/index.vue +46 -1
  141. package/pages/c/_cluster/apps/charts/install.vue +10 -9
  142. package/pages/c/_cluster/explorer/index.vue +72 -9
  143. package/pages/c/_cluster/explorer/tools/index.vue +12 -5
  144. package/pages/c/_cluster/mcapps/index.vue +1 -1
  145. package/pages/c/_cluster/settings/brand.vue +0 -40
  146. package/pages/c/_cluster/settings/links.vue +200 -0
  147. package/pages/c/_cluster/settings/performance.vue +19 -16
  148. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +232 -0
  149. package/pages/c/_cluster/uiplugins/InstallDialog.vue +242 -0
  150. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +284 -0
  151. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +130 -0
  152. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +253 -0
  153. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +115 -0
  154. package/pages/c/_cluster/uiplugins/index.vue +694 -0
  155. package/pages/diagnostic.vue +185 -101
  156. package/pages/docs/_doc.vue +3 -1
  157. package/pages/fail-whale.vue +1 -10
  158. package/pages/home.vue +21 -56
  159. package/pages/index.vue +18 -4
  160. package/pages/prefs.vue +108 -86
  161. package/pages/safeMode.vue +17 -0
  162. package/pages/support/index.vue +23 -15
  163. package/pkg/auto-import.js +44 -7
  164. package/pkg/dynamic-importer.lib.js +4 -0
  165. package/pkg/dynamic-plugin-loader.js +28 -0
  166. package/pkg/import.js +2 -2
  167. package/pkg/model-loader-require.lib.js +3 -0
  168. package/pkg/vue.config.js +9 -6
  169. package/plugins/dashboard-store/model-loader-require.js +12 -0
  170. package/plugins/dashboard-store/model-loader.js +4 -1
  171. package/plugins/dashboard-store/resource-class.js +12 -5
  172. package/plugins/formatters.js +15 -0
  173. package/plugins/plugin.js +56 -4
  174. package/plugins/steve/actions.js +1 -1
  175. package/plugins/steve/index.js +6 -4
  176. package/plugins/steve/mutations.js +1 -1
  177. package/plugins/steve/subscribe.js +89 -56
  178. package/plugins/steve/web-worker.steve-sub-worker.js +24 -15
  179. package/promptRemove/management.cattle.io.globalrole.vue +47 -0
  180. package/promptRemove/management.cattle.io.roletemplate.vue +47 -0
  181. package/promptRemove/mixin/roleDeletionCheck.js +97 -0
  182. package/rancher-components/Form/Checkbox/Checkbox.test.ts +77 -0
  183. package/rancher-components/Form/Checkbox/Checkbox.vue +12 -2
  184. package/scripts/build-pkg.sh +48 -2
  185. package/scripts/drone-build-pkg.sh +31 -0
  186. package/scripts/publish-shell.sh +11 -12
  187. package/scripts/serve-pkgs +17 -10
  188. package/scripts/sync-shell-deps +37 -0
  189. package/store/catalog.js +12 -9
  190. package/store/i18n.js +26 -12
  191. package/store/index.js +4 -181
  192. package/store/prefs.js +46 -2
  193. package/store/type-map.js +47 -33
  194. package/store/uiplugins.ts +15 -61
  195. package/utils/__tests__/object.test.ts +0 -24
  196. package/utils/__tests__/selector.test.ts +1 -1
  197. package/utils/cluster.js +1 -1
  198. package/utils/custom-validators.js +1 -12
  199. package/utils/dynamic-importer.js +5 -1
  200. package/utils/grafana.js +2 -6
  201. package/utils/socket.js +41 -20
  202. package/utils/string.js +1 -7
  203. package/utils/validators/formRules/__tests__/index.test.ts +108 -0
  204. package/utils/validators/formRules/index.ts +9 -1
  205. package/utils/validators/setting.js +0 -35
  206. package/yarn-error.log +195 -0
  207. package/components/FilterLabel.vue +0 -254
  208. package/components/HarvesterUpgradeProgressBarList.vue +0 -109
  209. package/components/VMConsoleBar.vue +0 -87
  210. package/components/dialog/harvester/AddHotplugModal.vue +0 -159
  211. package/components/dialog/harvester/BackupModal.vue +0 -117
  212. package/components/dialog/harvester/CloneTemplate.vue +0 -125
  213. package/components/dialog/harvester/EjectCDROMDialog.vue +0 -157
  214. package/components/dialog/harvester/ExportImageDialog.vue +0 -152
  215. package/components/dialog/harvester/MaintenanceDialog.vue +0 -94
  216. package/components/dialog/harvester/MigrationDialog.vue +0 -154
  217. package/components/dialog/harvester/RestoreDialog.vue +0 -153
  218. package/components/dialog/harvester/SupportBundle.vue +0 -217
  219. package/components/dialog/harvester/UnplugVolume.vue +0 -108
  220. package/components/form/SerialConsole/index.vue +0 -267
  221. package/components/formatter/AttachVMWithName.vue +0 -46
  222. package/components/formatter/CloudInitType.vue +0 -27
  223. package/components/formatter/HarvesterBackupTargetValidation.vue +0 -43
  224. package/components/formatter/HarvesterCPUUsed.vue +0 -122
  225. package/components/formatter/HarvesterDiskState.vue +0 -66
  226. package/components/formatter/HarvesterHostName.vue +0 -66
  227. package/components/formatter/HarvesterIpAddress.vue +0 -90
  228. package/components/formatter/HarvesterMemoryUsed.vue +0 -140
  229. package/components/formatter/HarvesterMigrationState.vue +0 -85
  230. package/components/formatter/HarvesterNodeName.vue +0 -49
  231. package/components/formatter/HarvesterStorageUsed.vue +0 -194
  232. package/components/formatter/HarvesterVmState.vue +0 -123
  233. package/components/nav/HarvesterUpgrade.vue +0 -232
  234. package/components/novnc/NovncConsole.vue +0 -93
  235. package/components/novnc/NovncConsoleItem.vue +0 -89
  236. package/components/novnc/NovncConsoleWrapper.vue +0 -243
  237. package/config/harvester-map.js +0 -44
  238. package/config/harvester-table-headers.js +0 -27
  239. package/config/product/harvester.js +0 -305
  240. package/detail/harvesterhci.io.host/HarvesterHostBasic.vue +0 -364
  241. package/detail/harvesterhci.io.host/HarvesterHostDisk.vue +0 -200
  242. package/detail/harvesterhci.io.host/HarvesterHostNetwork.vue +0 -89
  243. package/detail/harvesterhci.io.host/VirtualMachineInstance.vue +0 -134
  244. package/detail/harvesterhci.io.host/index.vue +0 -243
  245. package/detail/harvesterhci.io.virtualmachinebackup/index.vue +0 -221
  246. package/detail/harvesterhci.io.virtualmachineimage.vue +0 -118
  247. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineBasics.vue +0 -279
  248. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineEvents.vue +0 -75
  249. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineKeypairs.vue +0 -114
  250. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineMigration.vue +0 -79
  251. package/detail/kubevirt.io.virtualmachine/index.vue +0 -213
  252. package/edit/harvesterhci.io.cloudtemplate.vue +0 -123
  253. package/edit/harvesterhci.io.host/HarvesterDisk.vue +0 -262
  254. package/edit/harvesterhci.io.host/index.vue +0 -533
  255. package/edit/harvesterhci.io.keypair.vue +0 -112
  256. package/edit/harvesterhci.io.managedchart/index.vue +0 -25
  257. package/edit/harvesterhci.io.managedchart/rancher-monitoring.vue +0 -172
  258. package/edit/harvesterhci.io.networkattachmentdefinition.vue +0 -210
  259. package/edit/harvesterhci.io.setting/additional-ca.vue +0 -36
  260. package/edit/harvesterhci.io.setting/backup-target.vue +0 -182
  261. package/edit/harvesterhci.io.setting/http-proxy.vue +0 -79
  262. package/edit/harvesterhci.io.setting/index.vue +0 -201
  263. package/edit/harvesterhci.io.setting/overcommit-config.vue +0 -94
  264. package/edit/harvesterhci.io.setting/ssl-certificates.vue +0 -117
  265. package/edit/harvesterhci.io.setting/ssl-parameters.vue +0 -161
  266. package/edit/harvesterhci.io.setting/support-bundle-image.vue +0 -134
  267. package/edit/harvesterhci.io.setting/support-bundle-namespaces.vue +0 -73
  268. package/edit/harvesterhci.io.setting/vip-pools.vue +0 -244
  269. package/edit/harvesterhci.io.setting/vm-force-reset-policy.vue +0 -81
  270. package/edit/harvesterhci.io.virtualmachinebackup.vue +0 -256
  271. package/edit/harvesterhci.io.virtualmachineimage.vue +0 -364
  272. package/edit/harvesterhci.io.virtualmachinetemplateversion.vue +0 -340
  273. package/edit/harvesterhci.io.volume.vue +0 -195
  274. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/AccessCredentialsUsers.vue +0 -190
  275. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/index.vue +0 -212
  276. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/basicAuth.vue +0 -94
  277. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/sshkey.vue +0 -85
  278. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/DataTemplate.vue +0 -153
  279. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/index.vue +0 -279
  280. package/edit/kubevirt.io.virtualmachine/VirtualMachineCpuMemory.vue +0 -113
  281. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/__tests__/HarvesterEditNetwork.test.ts +0 -41
  282. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue +0 -281
  283. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/index.vue +0 -142
  284. package/edit/kubevirt.io.virtualmachine/VirtualMachineReserved.vue +0 -54
  285. package/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue +0 -256
  286. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +0 -391
  287. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditContainer.test.ts +0 -40
  288. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditExisting.test.ts +0 -102
  289. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVMImage.test.ts +0 -117
  290. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVolume.test.ts +0 -74
  291. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/container.vue +0 -132
  292. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue +0 -303
  293. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/vmImage.vue +0 -285
  294. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue +0 -188
  295. package/edit/kubevirt.io.virtualmachine/index.vue +0 -642
  296. package/edit/network.harvesterhci.io.clusternetwork/index.vue +0 -19
  297. package/edit/network.harvesterhci.io.clusternetwork/vlan.vue +0 -134
  298. package/edit/workload/types/Deployment.vue +0 -377
  299. package/edit/workload/types/Generic.vue +0 -295
  300. package/list/harvesterhci.io.cloudtemplate.vue +0 -78
  301. package/list/harvesterhci.io.dashboard/HarvesterUpgrade.vue +0 -211
  302. package/list/harvesterhci.io.dashboard/UpgradeInfo.vue +0 -40
  303. package/list/harvesterhci.io.dashboard/index.vue +0 -752
  304. package/list/harvesterhci.io.host/index.vue +0 -186
  305. package/list/harvesterhci.io.networkattachmentdefinition.vue +0 -167
  306. package/list/harvesterhci.io.setting.vue +0 -241
  307. package/list/harvesterhci.io.virtualmachinebackup.vue +0 -172
  308. package/list/harvesterhci.io.virtualmachineimage.vue +0 -80
  309. package/list/harvesterhci.io.virtualmachinetemplateversion.vue +0 -173
  310. package/list/harvesterhci.io.volume.vue +0 -122
  311. package/list/kubevirt.io.virtualmachine.vue +0 -193
  312. package/mixins/harvester-vm/impl.js +0 -267
  313. package/mixins/harvester-vm/index.js +0 -1357
  314. package/models/harvester/configmap.js +0 -32
  315. package/models/harvester/harvesterhci.io.blockdevice.js +0 -55
  316. package/models/harvester/harvesterhci.io.keypair.js +0 -12
  317. package/models/harvester/harvesterhci.io.setting.js +0 -127
  318. package/models/harvester/harvesterhci.io.supportbundle.js +0 -35
  319. package/models/harvester/harvesterhci.io.upgrade.js +0 -226
  320. package/models/harvester/harvesterhci.io.virtualmachinebackup.js +0 -116
  321. package/models/harvester/harvesterhci.io.virtualmachineimage.js +0 -255
  322. package/models/harvester/harvesterhci.io.virtualmachinerestore.js +0 -43
  323. package/models/harvester/harvesterhci.io.virtualmachinetemplate.js +0 -69
  324. package/models/harvester/harvesterhci.io.virtualmachinetemplateversion.js +0 -227
  325. package/models/harvester/k8s.cni.cncf.io.networkattachmentdefinition.js +0 -32
  326. package/models/harvester/kubevirt.io.virtualmachine.js +0 -850
  327. package/models/harvester/kubevirt.io.virtualmachineinstance.js +0 -142
  328. package/models/harvester/management.cattle.io.managedchart.js +0 -191
  329. package/models/harvester/management.cattle.io.setting.js +0 -40
  330. package/models/harvester/network.harvesterhci.io.clusternetwork.js +0 -100
  331. package/models/harvester/network.harvesterhci.io.nodenetwork.js +0 -34
  332. package/models/harvester/node.js +0 -255
  333. package/models/harvester/persistentvolumeclaim.js +0 -166
  334. package/models/harvester/pod.js +0 -185
  335. package/pages/c/_cluster/harvester/airgapupgrade/index.vue +0 -309
  336. package/pages/c/_cluster/harvester/console/_uid/serial.vue +0 -51
  337. package/pages/c/_cluster/harvester/console/_uid/vnc.vue +0 -52
  338. package/pages/c/_cluster/harvester/index.vue +0 -24
  339. package/pages/c/_cluster/harvester/support/index.vue +0 -154
  340. package/pages/plugins.vue +0 -387
  341. package/pkg/model-loader.lib.js +0 -3
  342. package/promptRemove/kubevirt.io.virtualmachine.vue +0 -164
  343. package/server/verdaccio-middleware.js +0 -56
  344. package/store/harvester-common.js +0 -126
  345. package/utils/validators/vm-datavolumes.js +0 -38
  346. package/utils/validators/vm-image.js +0 -32
  347. package/utils/validators/vm.js +0 -221
@@ -0,0 +1,116 @@
1
+ <script>
2
+ import { exceptionToErrorsArray } from '@shell/utils/error';
3
+
4
+ import AsyncButton from '@shell/components/AsyncButton';
5
+ import { Card } from '@components/Card';
6
+ import { Banner } from '@components/Banner';
7
+
8
+ export default {
9
+ components: {
10
+ Card,
11
+ AsyncButton,
12
+ Banner,
13
+ },
14
+
15
+ props: {
16
+ resources: {
17
+ type: Array,
18
+ required: true
19
+ }
20
+ },
21
+
22
+ data() {
23
+ return { errors: [] };
24
+ },
25
+
26
+ computed: {
27
+ config() {
28
+ return this.resources[0];
29
+ },
30
+
31
+ applyMode() {
32
+ return 'diagnostic';
33
+ },
34
+
35
+ title() {
36
+ return this.t('about.diagnostic.modal.title');
37
+ },
38
+
39
+ body() {
40
+ return this.t('about.diagnostic.modal.body');
41
+ }
42
+ },
43
+
44
+ methods: {
45
+ close() {
46
+ this.$emit('close');
47
+ },
48
+
49
+ apply(btnCb) {
50
+ try {
51
+ this.config.downloadData(btnCb);
52
+ this.close();
53
+ } catch (err) {
54
+ console.error(err); // eslint-disable-line
55
+ this.errors = exceptionToErrorsArray(err);
56
+ btnCb(false);
57
+ }
58
+ }
59
+ }
60
+ };
61
+ </script>
62
+
63
+ <template>
64
+ <Card class="prompt-restore" :show-highlight-border="false">
65
+ <h4 slot="title" class="text-default-text" v-html="title" />
66
+
67
+ <template slot="body">
68
+ <slot name="body">
69
+ <div class="pl-10 pr-10" style="min-height: 50px;">
70
+ <div class="row">
71
+ {{ body }}
72
+ </div>
73
+
74
+ <AsyncButton
75
+ mode="timing"
76
+ class="row mt-20"
77
+ @click="config.gatherResponseTimes"
78
+ />
79
+ </div>
80
+ </slot>
81
+ </template>
82
+
83
+ <div slot="actions" class="bottom">
84
+ <Banner v-for="(err, i) in errors" :key="i" color="error" :label="err" />
85
+ <div class="buttons">
86
+ <button class="btn role-secondary mr-10" @click="close">
87
+ {{ t('generic.cancel') }}
88
+ </button>
89
+
90
+ <AsyncButton
91
+ :mode="applyMode"
92
+ @click="apply"
93
+ />
94
+ </div>
95
+ </div>
96
+ </Card>
97
+ </template>
98
+ <style lang='scss' scoped>
99
+ .prompt-restore {
100
+ margin: 0;
101
+ }
102
+ .bottom {
103
+ display: flex;
104
+ flex-direction: column;
105
+ flex: 1;
106
+ .banner {
107
+ margin-top: 0
108
+ }
109
+ .buttons {
110
+ display: flex;
111
+ justify-content: flex-end;
112
+ width: 100%;
113
+ }
114
+ }
115
+
116
+ </style>
File without changes
File without changes
@@ -40,19 +40,25 @@ export default {
40
40
 
41
41
  serviceOptions() {
42
42
  if (this.cluster.isRke2) {
43
- return [
43
+ const options = [
44
44
  'admin',
45
45
  'api-server',
46
46
  'controller-manager',
47
47
  'scheduler',
48
- 'rke2-controller',
49
- 'rke2-server',
50
48
  'cloud-controller',
51
49
  'etcd',
52
50
  'auth-proxy',
53
51
  'kubelet',
54
52
  'kube-proxy'
55
53
  ];
54
+
55
+ if ( this.cluster.isK3s ) {
56
+ options.push('k3s-controller', 'k3s-server');
57
+ } else {
58
+ options.push('rke2-controller', 'rke2-server');
59
+ }
60
+
61
+ return options.sort();
56
62
  }
57
63
  // For RKE1 clusters, Norman provides the list of service options:
58
64
  // type RotateCertificateInput struct {
@@ -1,4 +1,5 @@
1
1
  <script>
2
+ import isEqual from 'lodash/isEqual';
2
3
  import Loading from '@shell/components/Loading';
3
4
  import CreateEditView from '@shell/mixins/create-edit-view';
4
5
  import CruResource from '@shell/components/CruResource';
@@ -67,11 +68,17 @@ export default {
67
68
 
68
69
  async fetch() {
69
70
  await this.reloadModel();
71
+
72
+ if ( this.value?.graphEndpoint ) {
73
+ this.setInitialEndpoint(this.value.graphEndpoint);
74
+ }
70
75
  },
71
76
 
72
77
  data() {
73
78
  return {
74
79
  endpoint: 'standard',
80
+ oldEndpoint: false,
81
+
75
82
  // Storing the applicationSecret is necessary because norman doesn't support returning secrets and when we
76
83
  // override the steve authconfig with a norman config the applicationSecret is lost
77
84
  applicationSecret: this.value.applicationSecret
@@ -143,9 +150,6 @@ export default {
143
150
  handler() {
144
151
  this.model.accessMode = this.model.accessMode || 'unrestricted';
145
152
  this.model.rancherUrl = this.model.rancherUrl || this.replyUrl;
146
- if (this.endpoint !== 'custom') {
147
- this.setEndpoints(this.endpoint);
148
- }
149
153
 
150
154
  if (this.model.applicationSecret) {
151
155
  this.$set(this, 'applicationSecret', this.model.applicationSecret);
@@ -158,11 +162,13 @@ export default {
158
162
  methods: {
159
163
  setEndpoints(endpoint) {
160
164
  if (this.editConfig || !this.model.enabled) {
161
- Object.keys(ENDPOINT_MAPPING[endpoint]).forEach((key) => {
165
+ const endpointType = this.oldEndpoint && endpoint !== 'custom' ? OLD_ENDPOINTS : ENDPOINT_MAPPING;
166
+
167
+ Object.keys(endpointType[endpoint]).forEach((key) => {
162
168
  this.$set(
163
169
  this.model,
164
170
  key,
165
- ENDPOINT_MAPPING[endpoint][key].replace(
171
+ endpointType[endpoint][key].replace(
166
172
  TENANT_ID_TOKEN,
167
173
  this.model.tenantId
168
174
  )
@@ -171,6 +177,33 @@ export default {
171
177
  }
172
178
  },
173
179
 
180
+ setInitialEndpoint(endpoint) {
181
+ const newEndpointKey = this.determineEndpointKeyType(ENDPOINT_MAPPING);
182
+ const oldEndpointKey = Object.keys(OLD_ENDPOINTS).find(key => OLD_ENDPOINTS[key].graphEndpoint === endpoint);
183
+
184
+ if ( oldEndpointKey ) {
185
+ this.endpoint = this.determineEndpointKeyType(OLD_ENDPOINTS);
186
+ this.oldEndpoint = true;
187
+ } else {
188
+ this.endpoint = newEndpointKey;
189
+ }
190
+ },
191
+
192
+ determineEndpointKeyType(endpointTypes) {
193
+ let out = 'custom';
194
+
195
+ for ( const [endpointKey, endpointKeyValues] of Object.entries(endpointTypes) ) {
196
+ const mappedValues = Object.values(endpointKeyValues).map(endpoint => endpoint.replace(TENANT_ID_TOKEN, this.model?.tenantId));
197
+ const valuesToCheck = Object.keys(endpointKeyValues).map(key => this.value[key]);
198
+
199
+ if ( isEqual(mappedValues, valuesToCheck) ) {
200
+ out = endpointKey;
201
+ }
202
+ }
203
+
204
+ return out;
205
+ },
206
+
174
207
  getNewApplicationSecret() {
175
208
  const applicationSecretOrId =
176
209
  this.model.applicationSecret || this.applicationSecret;
@@ -291,7 +324,7 @@ export default {
291
324
  <InfoBox v-if="!model.enabled" id="reply-info" class="mt-20 mb-20 p-10">
292
325
  {{ t('authConfig.azuread.reply.info') }}
293
326
  <br />
294
- <label>{{ t('authConfig.azuread.reply.label') }} </label>
327
+ <label class="reply-url">{{ t('authConfig.azuread.reply.label') }} </label>
295
328
  <CopyToClipboardText :plain="true" :text="replyUrl" />
296
329
  </InfoBox>
297
330
 
@@ -387,4 +420,9 @@ export default {
387
420
  #reply-info {
388
421
  flex-grow: 0;
389
422
  }
423
+
424
+ .reply-url {
425
+ color: inherit;
426
+ font-weight: 700;
427
+ }
390
428
  </style>
@@ -16,7 +16,7 @@ import { NAME } from '@shell/config/product/explorer';
16
16
  import { PROJECT_ID, _VIEW, _CREATE, _EDIT } from '@shell/config/query-params';
17
17
  import ProjectMembershipEditor from '@shell/components/form/Members/ProjectMembershipEditor';
18
18
  import { canViewProjectMembershipEditor } from '@shell/components/form/Members/ProjectMembershipEditor.vue';
19
- import { NAME as HARVESTER } from '@shell/config/product/harvester';
19
+ import { HARVESTER_NAME as HARVESTER } from '@shell/config/product/harvester-manager';
20
20
  import { Banner } from '@components/Banner';
21
21
 
22
22
  export default {
@@ -188,7 +188,7 @@ export default {
188
188
  <template>
189
189
  <CruResource
190
190
  class="project"
191
- :done-route="'c-cluster-product-projectsnamespaces'"
191
+ :done-route="value.listLocation"
192
192
  :errors="fvUnreportedValidationErrors"
193
193
  :mode="mode"
194
194
  :resource="value"
@@ -15,7 +15,7 @@ import MoveModal from '@shell/components/MoveModal';
15
15
  import ResourceQuota from '@shell/components/form/ResourceQuota/Namespace';
16
16
  import Loading from '@shell/components/Loading';
17
17
  import { HARVESTER_TYPES, RANCHER_TYPES } from '@shell/components/form/ResourceQuota/shared';
18
- import { NAME as HARVESTER } from '@shell/config/product/harvester';
18
+ import { HARVESTER_NAME as HARVESTER } from '@shell/config/product/harvester-manager';
19
19
 
20
20
  export default {
21
21
  components: {
@@ -34,9 +34,11 @@ export default {
34
34
  mixins: [CreateEditView],
35
35
 
36
36
  async fetch() {
37
- this.projects = await this.$store.dispatch('management/findAll', { type: MANAGEMENT.PROJECT });
37
+ if (this.$store.getters['management/schemaFor'](MANAGEMENT.PROJECT)) {
38
+ this.projects = await this.$store.dispatch('management/findAll', { type: MANAGEMENT.PROJECT });
38
39
 
39
- this.project = this.projects.find(p => p.id.includes(this.projectName));
40
+ this.project = this.projects.find(p => p.id.includes(this.projectName));
41
+ }
40
42
  },
41
43
 
42
44
  data() {
@@ -62,8 +64,9 @@ export default {
62
64
 
63
65
  computed: {
64
66
  ...mapGetters(['isSingleProduct']),
65
- isHarvester() {
66
- return this.$store.getters['currentProduct'].inStore === HARVESTER;
67
+
68
+ isSingleHarvester() {
69
+ return this.$store.getters['currentProduct'].inStore === HARVESTER && this.isSingleProduct;
67
70
  },
68
71
 
69
72
  projectOpts() {
@@ -93,7 +96,11 @@ export default {
93
96
  },
94
97
 
95
98
  showResourceQuota() {
96
- return Object.keys(this.project?.spec?.resourceQuota?.limit || {}).length > 0;
99
+ return !this.isSingleHarvester && Object.keys(this.project?.spec?.resourceQuota?.limit || {}).length > 0;
100
+ },
101
+
102
+ showContainerResourceLimit() {
103
+ return !this.isSingleHarvester;
97
104
  }
98
105
  },
99
106
 
@@ -160,13 +167,13 @@ export default {
160
167
  :namespaced="false"
161
168
  :mode="mode"
162
169
  >
163
- <template v-if="!isSingleProduct" #project-col>
170
+ <template v-if="project" #project-col>
164
171
  <LabeledSelect v-model="projectName" :label="t('namespace.project.label')" :options="projectOpts" />
165
172
  </template>
166
173
  </NameNsDescription>
167
174
 
168
175
  <Tabbed :side-tabs="true">
169
- <Tab v-if="!isSingleProduct && showResourceQuota" :weight="1" name="container-resource-quotas" :label="t('namespace.resourceQuotas')">
176
+ <Tab v-if="showResourceQuota" :weight="1" name="container-resource-quotas" :label="t('namespace.resourceQuotas')">
170
177
  <div class="row">
171
178
  <div class="col span-12">
172
179
  <p class="helper-text mb-10">
@@ -177,7 +184,7 @@ export default {
177
184
  </div>
178
185
  <ResourceQuota v-model="value" :mode="mode" :project="project" :types="isHarvester ? HARVESTER_TYPES : RANCHER_TYPES" />
179
186
  </Tab>
180
- <Tab v-if="!isSingleProduct" :weight="0" name="container-resource-limit" :label="t('namespace.containerResourceLimit')">
187
+ <Tab v-if="showContainerResourceLimit" :weight="0" name="container-resource-limit" :label="t('namespace.containerResourceLimit')">
181
188
  <ContainerResourceLimit
182
189
  :key="JSON.stringify(containerResourceLimits)"
183
190
  :value="containerResourceLimits"
@@ -200,6 +207,6 @@ export default {
200
207
  />
201
208
  </Tab>
202
209
  </Tabbed>
203
- <MoveModal />
210
+ <MoveModal v-if="projects" />
204
211
  </CruResource>
205
212
  </template>
@@ -65,7 +65,7 @@ export default {
65
65
  path: 'metadata.name', rules: ['required', 'hostname'], translationKey: 'nameNsDescription.name.label'
66
66
  },
67
67
  {
68
- path: 'spec.rules.host', rules: ['hostname'], translationKey: 'ingress.rules.requestHost.label'
68
+ path: 'spec.rules.host', rules: ['wildcardHostname'], translationKey: 'ingress.rules.requestHost.label'
69
69
  },
70
70
  {
71
71
  path: 'spec.rules.http.paths.path', rules: ['absolutePath'], translationKey: 'ingress.rules.path.label'
@@ -83,7 +83,7 @@ export default {
83
83
  {
84
84
  path: 'spec.defaultBackend.service.port.number', rules: ['required', 'requiredInt', 'portNumber'], translationKey: 'ingress.defaultBackend.port.label'
85
85
  },
86
- { path: 'spec.tls.hosts', rules: ['required', 'hostname'] }
86
+ { path: 'spec.tls.hosts', rules: ['required', 'wildcardHostname'] }
87
87
  ],
88
88
  fvReportedValidationPaths: ['spec.rules.http.paths.backend.service.port.number', 'spec.rules.http.paths.path', 'spec.rules.http.paths.backend.service.name']
89
89
  };
@@ -295,4 +295,7 @@ export default {
295
295
  max-height: 100%;
296
296
  height: 100%;
297
297
  }
298
+ .info-box {
299
+ flex-grow: 0;
300
+ }
298
301
  </style>
@@ -269,6 +269,7 @@ export default {
269
269
  :output-modifier="true"
270
270
  :increment="1024"
271
271
  :min="1"
272
+ :required="true"
272
273
  />
273
274
  <Banner v-if="isEdit && !value.expandable" color="info" class="mt-10">
274
275
  {{ t('persistentVolumeClaim.expand.notSupported') }}
package/edit/pod.vue ADDED
@@ -0,0 +1,27 @@
1
+ <script>
2
+ import CreateEditView from '@shell/mixins/create-edit-view';
3
+ import FormValidation from '@shell/mixins/form-validation';
4
+ import WorkLoadMixin from '@shell/edit/workload/mixins/workload';
5
+ import Workload from '@shell/edit/workload/index.vue';
6
+
7
+ export default {
8
+ name: 'WorkloadDeployments',
9
+ components: { Workload },
10
+ mixins: [CreateEditView, FormValidation, WorkLoadMixin],
11
+ props: {
12
+ value: {
13
+ type: Object,
14
+ required: true,
15
+ },
16
+
17
+ mode: {
18
+ type: String,
19
+ default: 'create',
20
+ },
21
+ },
22
+ };
23
+ </script>
24
+
25
+ <template>
26
+ <Workload v-bind="$props" />
27
+ </template>
@@ -71,7 +71,7 @@ export default {
71
71
  const e = sanitizeValue(t.effect);
72
72
 
73
73
  if ( k && v && e ) {
74
- out.push(`--taint ${ k }=${ v }:${ e }`);
74
+ out.push(`--taints ${ k }=${ v }:${ e }`);
75
75
  }
76
76
  }
77
77
 
@@ -1,5 +1,4 @@
1
1
  <script>
2
-
3
2
  import { LabeledInput } from '@components/Form/LabeledInput';
4
3
  import { Checkbox } from '@components/Form/Checkbox';
5
4
  import { _EDIT } from '@shell/config/query-params';
@@ -64,11 +63,40 @@ export default {
64
63
 
65
64
  data() {
66
65
  const parseDuration = (duration) => {
67
- // The back end stores the timeout in Duration format, for example, "10m".
68
- // Here we convert that string to an integer.
69
- const numberString = duration.split('m')[0];
66
+ // The back end stores the timeout in Duration format, for example, "42d31h10m30s".
67
+ // Here we convert that string to an integer and return the duration as seconds.
68
+ const splitStr = duration.split(/([a-z])/);
69
+
70
+ const durationsAsSeconds = splitStr.reduce((old, neu, idx) => {
71
+ const parsed = parseInt(neu);
72
+
73
+ if ( isNaN(parsed) ) {
74
+ return old;
75
+ }
76
+
77
+ const interval = splitStr[(idx + 1)];
78
+
79
+ switch (interval) {
80
+ case 'd':
81
+ old.push(parsed * 24 * 60 * 60);
82
+ break;
83
+ case 'h':
84
+ old.push(parsed * 60 * 60);
85
+ break;
86
+ case 'm':
87
+ old.push(parsed * 60);
88
+ break;
89
+ case 's':
90
+ old.push(parsed);
91
+ break;
92
+ default:
93
+ break;
94
+ }
95
+
96
+ return old;
97
+ }, []);
70
98
 
71
- return parseInt(numberString, 10);
99
+ return durationsAsSeconds.reduce((old, neu) => old + neu);
72
100
  };
73
101
 
74
102
  return {
@@ -14,7 +14,8 @@ import {
14
14
  NORMAN,
15
15
  SCHEMA,
16
16
  DEFAULT_WORKSPACE,
17
- SECRET
17
+ SECRET,
18
+ HCI,
18
19
  } from '@shell/config/types';
19
20
  import { _CREATE, _EDIT, _VIEW } from '@shell/config/query-params';
20
21
 
@@ -311,7 +312,8 @@ export default {
311
312
  clusterIsAlreadyCreated: !!this.value.id,
312
313
  fvFormRuleSets: [{
313
314
  path: 'metadata.name', rules: ['subDomain'], translationKey: 'nameNsDescription.name.label'
314
- }]
315
+ }],
316
+ harvesterVersionRange: {},
315
317
  };
316
318
  },
317
319
 
@@ -499,7 +501,7 @@ export default {
499
501
  const isExternal = opt === 'external';
500
502
  let disabled = false;
501
503
 
502
- if (this.isHarvesterExternalCredential && isPreferred) {
504
+ if ((this.isHarvesterExternalCredential || this.isHarvesterIncompatible) && isPreferred) {
503
505
  disabled = true;
504
506
  }
505
507
 
@@ -850,6 +852,33 @@ export default {
850
852
  isHarvesterExternalCredential() {
851
853
  return this.credential?.harvestercredentialConfig?.clusterType === 'external';
852
854
  },
855
+
856
+ isHarvesterIncompatible() {
857
+ let ccmRke2Version = (this.chartVersions['harvester-cloud-provider'] || {})['version'];
858
+ let csiRke2Version = (this.chartVersions['harvester-csi-driver'] || {})['version'];
859
+
860
+ const ccmVersion = this.harvesterVersionRange?.['harvester-cloud-provider'];
861
+ const csiVersion = this.harvesterVersionRange?.['harvester-csi-provider'];
862
+
863
+ if ((ccmRke2Version || '').endsWith('00')) {
864
+ ccmRke2Version = ccmRke2Version.slice(0, -2);
865
+ }
866
+
867
+ if ((csiRke2Version || '').endsWith('00')) {
868
+ csiRke2Version = csiRke2Version.slice(0, -2);
869
+ }
870
+
871
+ if (ccmVersion && csiVersion) {
872
+ if (semver.satisfies(ccmRke2Version, ccmVersion) &&
873
+ semver.satisfies(csiRke2Version, csiVersion)) {
874
+ return false;
875
+ } else {
876
+ return true;
877
+ }
878
+ } else {
879
+ return false;
880
+ }
881
+ },
853
882
  },
854
883
 
855
884
  watch: {
@@ -867,7 +896,10 @@ export default {
867
896
  credentialId(val) {
868
897
  if ( val ) {
869
898
  this.credential = this.$store.getters['rancher/byId'](NORMAN.CLOUD_CREDENTIAL, this.credentialId);
870
- this.setHarvesterDefaultCloudProvider();
899
+
900
+ if (this.isHarvesterDriver) {
901
+ this.setHarvesterVersionRange();
902
+ }
871
903
  } else {
872
904
  this.credential = null;
873
905
  }
@@ -1562,12 +1594,36 @@ export default {
1562
1594
  get,
1563
1595
 
1564
1596
  setHarvesterDefaultCloudProvider() {
1565
- if (this.isHarvesterDriver && this.mode === _CREATE && this.agentConfig['cloud-provider-name'] === undefined && !this.isHarvesterExternalCredential) {
1597
+ if (this.isHarvesterDriver &&
1598
+ this.mode === _CREATE &&
1599
+ !this.agentConfig['cloud-provider-name'] &&
1600
+ !this.isHarvesterExternalCredential &&
1601
+ !this.isHarvesterIncompatible
1602
+ ) {
1566
1603
  this.agentConfig['cloud-provider-name'] = HARVESTER;
1567
1604
  } else {
1568
1605
  this.agentConfig['cloud-provider-name'] = '';
1569
1606
  }
1570
1607
  },
1608
+
1609
+ async setHarvesterVersionRange() {
1610
+ const clusterId = this.credential?.decodedData?.clusterId;
1611
+ const clusterType = this.credential?.decodedData?.clusterType;
1612
+
1613
+ if (clusterId && clusterType === 'imported') {
1614
+ const url = `/k8s/clusters/${ clusterId }/v1`;
1615
+ const res = await this.$store.dispatch('cluster/request', { url: `${ url }/${ HCI.SETTING }s` });
1616
+
1617
+ const version = (res?.data || []).find(s => s.id === 'harvester-csi-ccm-versions');
1618
+
1619
+ if (version) {
1620
+ this.harvesterVersionRange = JSON.parse(version.value || version.default || '{}');
1621
+ } else {
1622
+ this.harvesterVersionRange = {};
1623
+ }
1624
+ }
1625
+ this.setHarvesterDefaultCloudProvider();
1626
+ },
1571
1627
  },
1572
1628
  };
1573
1629
  </script>
@@ -1686,6 +1742,14 @@ export default {
1686
1742
  <Tab name="basic" label-key="cluster.tabs.basic" :weight="11" @active="refreshYamls">
1687
1743
  <Banner v-if="!haveArgInfo" color="warning" label="Configuration information is not available for the selected Kubernetes version. The options available in this screen will be limited, you may want to use the YAML editor." />
1688
1744
  <Banner v-if="showk8s21LegacyWarning" color="warning" :label="t('cluster.legacyWarning')" />
1745
+ <Banner
1746
+ v-if="isHarvesterDriver && isHarvesterIncompatible && showCloudProvider"
1747
+ color="warning"
1748
+ >
1749
+ <span
1750
+ v-html="t('cluster.harvester.warning.cloudProvider.incompatible', null, true)"
1751
+ />
1752
+ </Banner>
1689
1753
  <div class="row mb-10">
1690
1754
  <div class="col span-6">
1691
1755
  <LabeledSelect
@@ -1788,6 +1852,12 @@ export default {
1788
1852
  </div>
1789
1853
  </div>
1790
1854
 
1855
+ <div v-if="serverConfig.cni === 'cilium' && value.spec.enableNetworkPolicy" class="row">
1856
+ <div class="col span-12">
1857
+ <Banner color="info" :label="t('cluster.rke2.enableNetworkPolicy.warning')" />
1858
+ </div>
1859
+ </div>
1860
+
1791
1861
  <div class="spacer" />
1792
1862
 
1793
1863
  <div v-if="serverArgs.disable" class="row">
@@ -2089,6 +2159,7 @@ export default {
2089
2159
  </Tab>
2090
2160
 
2091
2161
  <Tab
2162
+ v-if="haveArgInfo || agentArgs['protect-kernel-defaults']"
2092
2163
  name="advanced"
2093
2164
  label-key="cluster.tabs.advanced"
2094
2165
  :weight="-1"