@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,121 @@
1
+ <script>
2
+ import { MANAGEMENT, NORMAN, VIRTUAL_TYPES } from '@shell/config/types';
3
+ import ResourceTable from '@shell/components/ResourceTable';
4
+ import Masthead from '@shell/components/ResourceList/Masthead';
5
+ import { AGE, ROLE, STATE, PRINCIPAL } from '@shell/config/table-headers';
6
+ import { canViewClusterPermissionsEditor } from '@shell/components/form/Members/ClusterPermissionsEditor.vue';
7
+ import Banner from '@components/Banner/Banner.vue';
8
+ import { mapGetters } from 'vuex';
9
+
10
+ /**
11
+ * Explorer members page.
12
+ * Route: /c/local/explorer/members
13
+ */
14
+ export default {
15
+ name: 'ExplorerMembers',
16
+
17
+ components: {
18
+ Banner,
19
+ Masthead,
20
+ ResourceTable
21
+ },
22
+
23
+ props: {
24
+ // Cluster tole template binding create route - defaults to the explorer route
25
+ createLocationOverride: {
26
+ type: Object,
27
+ default: () => {
28
+ return {
29
+ name: 'c-cluster-product-resource-create',
30
+ params: { resource: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING }
31
+ };
32
+ }
33
+ }
34
+ },
35
+
36
+ async fetch() {
37
+ const clusterRoleTemplateBindingSchema = this.$store.getters[
38
+ `rancher/schemaFor`
39
+ ](NORMAN.CLUSTER_ROLE_TEMPLATE_BINDING);
40
+
41
+ const hydration = [
42
+ clusterRoleTemplateBindingSchema ? this.$store.dispatch(
43
+ `rancher/findAll`,
44
+ { type: NORMAN.CLUSTER_ROLE_TEMPLATE_BINDING },
45
+ { root: true }
46
+ ) : [],
47
+ clusterRoleTemplateBindingSchema ? this.$store.dispatch(`management/findAll`, { type: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING }) : [],
48
+ this.$store.dispatch('rancher/findAll', { type: NORMAN.PRINCIPAL }),
49
+ this.$store.dispatch(`management/findAll`, { type: MANAGEMENT.USER }),
50
+ this.$store.dispatch(`management/findAll`, { type: MANAGEMENT.ROLE_TEMPLATE })
51
+ ];
52
+ const [clusterRoleTemplateBindings] = await Promise.all(hydration);
53
+ const steveBindings = await Promise.all(
54
+ clusterRoleTemplateBindings.map(b => b.steve)
55
+ );
56
+
57
+ this.$set(this, 'clusterRoleTemplateBindings', steveBindings);
58
+ },
59
+
60
+ data() {
61
+ return {
62
+ schema: this.$store.getters[`management/schemaFor`](
63
+ MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING
64
+ ),
65
+ headers: [STATE, PRINCIPAL, ROLE, AGE],
66
+ createLocation: {
67
+ ...this.createLocationOverride,
68
+ params: {
69
+ ...this.createLocationOverride.params,
70
+ cluster: this.$store.getters['currentCluster'].id
71
+ }
72
+ },
73
+ resource: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING,
74
+ clusterRoleTemplateBindings: [],
75
+ VIRTUAL_TYPES
76
+ };
77
+ },
78
+
79
+ computed: {
80
+ ...mapGetters(['currentCluster']),
81
+ filteredClusterRoleTemplateBindings() {
82
+ return this.clusterRoleTemplateBindings.filter(
83
+ b => b.clusterName === this.$store.getters['currentCluster'].id
84
+ );
85
+ },
86
+ canManageMembers() {
87
+ return canViewClusterPermissionsEditor(this.$store);
88
+ },
89
+ isLocal() {
90
+ return this.$store.getters['currentCluster'].isLocal;
91
+ }
92
+ }
93
+ };
94
+ </script>
95
+
96
+ <template>
97
+ <div>
98
+ <Masthead
99
+ :schema="schema"
100
+ :resource="resource"
101
+ :favorite-resource="VIRTUAL_TYPES.CLUSTER_MEMBERS"
102
+ :create-location="createLocation"
103
+ :create-button-label="t('members.createActionLabel')"
104
+ />
105
+ <Banner
106
+ v-if="isLocal"
107
+ color="error"
108
+ :label="t('members.localClusterWarning')"
109
+ />
110
+ <ResourceTable
111
+ :schema="schema"
112
+ :headers="headers"
113
+ :rows="filteredClusterRoleTemplateBindings"
114
+ :groupable="false"
115
+ :namespaced="false"
116
+ :loading="$fetchState.pending || !currentCluster"
117
+ sub-search="subSearch"
118
+ :sub-fields="['nameDisplay']"
119
+ />
120
+ </div>
121
+ </template>
@@ -0,0 +1,404 @@
1
+ <script>
2
+ import { mapGetters } from 'vuex';
3
+ import ResourceTable from '@shell/components/ResourceTable';
4
+ import { STATE, AGE, NAME } from '@shell/config/table-headers';
5
+ import { uniq } from '@shell/utils/array';
6
+ import { MANAGEMENT, NAMESPACE, VIRTUAL_TYPES } from '@shell/config/types';
7
+ import { PROJECT_ID } from '@shell/config/query-params';
8
+ import Masthead from '@shell/components/ResourceList/Masthead';
9
+ import { mapPref, GROUP_RESOURCES, ALL_NAMESPACES } from '@shell/store/prefs';
10
+ import MoveModal from '@shell/components/MoveModal';
11
+ import { defaultTableSortGenerationFn } from '@shell/components/ResourceTable.vue';
12
+ import { NAMESPACE_FILTER_ALL_ORPHANS } from '@shell/utils/namespace-filter';
13
+
14
+ export default {
15
+ name: 'ListProjectNamespace',
16
+ components: {
17
+ Masthead, MoveModal, ResourceTable
18
+ },
19
+
20
+ props: {
21
+ createProjectLocationOverride: {
22
+ type: Object,
23
+ default: () => null
24
+ },
25
+
26
+ createNamespaceLocationOverride: {
27
+ type: Object,
28
+ default: () => null
29
+ }
30
+ },
31
+
32
+ async fetch() {
33
+ const inStore = this.$store.getters['currentStore'](NAMESPACE);
34
+
35
+ this.schema = this.$store.getters[`${ inStore }/schemaFor`](NAMESPACE);
36
+ this.projectSchema = this.$store.getters[`management/schemaFor`](MANAGEMENT.PROJECT);
37
+
38
+ if ( !this.schema ) {
39
+ // clusterReady: When switching routes, it will cause clusterReady to change, causing itself to repeat rendering。
40
+ // this.$store.dispatch('loadingError', `Type ${ NAMESPACE } not found`);
41
+
42
+ return;
43
+ }
44
+
45
+ this.namespaces = await this.$store.dispatch(`${ inStore }/findAll`, { type: NAMESPACE });
46
+ this.projects = await this.$store.dispatch('management/findAll', { type: MANAGEMENT.PROJECT, opt: { force: true } });
47
+ },
48
+
49
+ data() {
50
+ return {
51
+ schema: null,
52
+ namespaces: [],
53
+ projects: [],
54
+ projectSchema: null,
55
+ MANAGEMENT,
56
+ VIRTUAL_TYPES,
57
+ defaultCreateProjectLocation: {
58
+ name: 'c-cluster-product-resource-create',
59
+ params: {
60
+ product: this.$store.getters['currentProduct'].name,
61
+ resource: MANAGEMENT.PROJECT
62
+ },
63
+ }
64
+ };
65
+ },
66
+
67
+ computed: {
68
+ ...mapGetters(['currentCluster', 'currentProduct']),
69
+ isNamespaceCreatable() {
70
+ return (this.schema?.collectionMethods || []).includes('POST');
71
+ },
72
+ headers() {
73
+ const project = {
74
+ name: 'project',
75
+ label: 'Project',
76
+ value: 'project.nameDisplay',
77
+ sort: ['projectNameSort', 'nameSort'],
78
+ };
79
+
80
+ return [
81
+ STATE,
82
+ NAME,
83
+ this.groupPreference === 'none' ? project : null,
84
+ AGE
85
+ ].filter(h => h);
86
+ },
87
+ projectIdsWithNamespaces() {
88
+ const ids = this.rows
89
+ .map(row => row.projectId)
90
+ .filter(id => id);
91
+
92
+ return uniq(ids);
93
+ },
94
+ clusterProjects() {
95
+ const clusterId = this.currentCluster.id;
96
+
97
+ // Get the list of projects from the store so that the list
98
+ // is updated if a new project is created or removed.
99
+ const projectsInAllClusters = this.$store.getters['management/all'](MANAGEMENT.PROJECT);
100
+
101
+ const clustersInProjects = projectsInAllClusters.filter(project => project.spec.clusterName === clusterId);
102
+
103
+ return clustersInProjects;
104
+ },
105
+ projectsWithoutNamespaces() {
106
+ return this.activeProjects.filter((project) => {
107
+ return !this.projectIdsWithNamespaces.find(item => project?.id?.endsWith(`/${ item }`));
108
+ });
109
+ },
110
+ // We're using this because we need to show projects as groups even if the project doesn't have any namespaces.
111
+ rowsWithFakeNamespaces() {
112
+ const fakeRows = this.projectsWithoutNamespaces.map((project) => {
113
+ return {
114
+ groupByLabel: `${ ('resourceTable.groupLabel.notInAProject') }-${ project.id }`,
115
+ isFake: true,
116
+ mainRowKey: project.id,
117
+ nameDisplay: project.spec?.displayName, // Enable filtering by the project name
118
+ project,
119
+ availableActions: []
120
+ };
121
+ });
122
+
123
+ if (this.showMockNotInProjectGroup) {
124
+ fakeRows.push( {
125
+ groupByLabel: this.t('resourceTable.groupLabel.notInAProject'), // Same as the groupByLabel for the namespace model
126
+ mainRowKey: 'fake-empty',
127
+ });
128
+ }
129
+
130
+ return [...this.rows, ...fakeRows];
131
+ },
132
+ createProjectLocation() {
133
+ return this.createProjectLocationOverride || this.defaultCreateProjectLocation;
134
+ },
135
+ groupPreference: mapPref(GROUP_RESOURCES),
136
+ activeNamespaceFilters() {
137
+ return this.$store.getters['activeNamespaceFilters'];
138
+ },
139
+ activeProjectFilters() {
140
+ const activeProjects = {};
141
+
142
+ for (const filter of this.activeNamespaceFilters) {
143
+ const [type, id] = filter.split('://', 2);
144
+
145
+ if (type === 'project') {
146
+ activeProjects[id] = true;
147
+ }
148
+ }
149
+
150
+ return activeProjects;
151
+ },
152
+ activeProjects() {
153
+ const namespaceFilters = this.$store.getters['activeNamespaceFilters'];
154
+
155
+ if (namespaceFilters.includes(NAMESPACE_FILTER_ALL_ORPHANS) && Object.keys(this.activeProjectFilters).length === 0) {
156
+ // If the user wants to only see namespaces that are not
157
+ // in a project, don't show any projects.
158
+ return [];
159
+ }
160
+
161
+ // If the user is not filtering by any projects or namespaces, return
162
+ // all projects in the cluster.
163
+ if (!this.userIsFilteringForSpecificNamespaceOrProject()) {
164
+ return this.clusterProjects;
165
+ }
166
+
167
+ // Filter out projects that are not selected in the top nav.
168
+ return this.clusterProjects.filter((projectData) => {
169
+ const projectId = projectData.id.split('/')[1];
170
+
171
+ return !!this.activeProjectFilters[projectId];
172
+ });
173
+ },
174
+ activeNamespaces() {
175
+ // Apply namespace filters from the top nav.
176
+ const activeNamespaces = this.$store.getters['namespaces']();
177
+
178
+ return this.namespaces.filter((namespaceData) => {
179
+ return !!activeNamespaces[namespaceData.metadata.name];
180
+ });
181
+ },
182
+ filteredRows() {
183
+ return this.groupPreference === 'none' ? this.rows : this.rowsWithFakeNamespaces;
184
+ },
185
+ rows() {
186
+ if (this.$store.getters['prefs/get'](ALL_NAMESPACES)) {
187
+ // If all namespaces options are turned on in the user preferences,
188
+ // return all namespaces including system namespaces and RBAC
189
+ // management namespaces.
190
+ return this.activeNamespaces;
191
+ }
192
+
193
+ return this.activeNamespaces.filter((namespace) => {
194
+ const isSettingSystemNamespace = this.$store.getters['systemNamespaces'].includes(namespace.metadata.name);
195
+ const systemNS = namespace.isSystem || namespace.isFleetManaged || isSettingSystemNamespace;
196
+
197
+ return this.currentProduct?.hideSystemResources ? !systemNS : true;
198
+ });
199
+ },
200
+
201
+ canSeeProjectlessNamespaces() {
202
+ return this.currentCluster.canUpdate;
203
+ },
204
+
205
+ showMockNotInProjectGroup() {
206
+ if (!this.canSeeProjectlessNamespaces) {
207
+ return false;
208
+ }
209
+
210
+ const someNamespacesAreNotInProject = !this.rows.some(row => !row.project);
211
+
212
+ // Hide the "Not in a Project" group if the user is filtering
213
+ // for specific namespaces or projects.
214
+ const usingSpecificFilter = this.userIsFilteringForSpecificNamespaceOrProject();
215
+
216
+ return !usingSpecificFilter && someNamespacesAreNotInProject;
217
+ },
218
+
219
+ notInProjectKey() {
220
+ return this.$store.getters['i18n/t']('resourceTable.groupLabel.notInAProject');
221
+ }
222
+ },
223
+ methods: {
224
+ userIsFilteringForSpecificNamespaceOrProject() {
225
+ const activeFilters = this.$store.getters['namespaceFilters'];
226
+
227
+ for (let i = 0; i < activeFilters.length; i++) {
228
+ const filter = activeFilters[i];
229
+ const filterType = filter.split('://')[0];
230
+
231
+ if (filterType === 'ns' || filterType === 'project') {
232
+ return true;
233
+ }
234
+ }
235
+
236
+ return false;
237
+ },
238
+ slotName(project) {
239
+ return `main-row:${ project.id }`;
240
+ },
241
+ createNamespaceLocation(group) {
242
+ const project = group.rows[0].project;
243
+
244
+ const location = this.createNamespaceLocationOverride ? { ...this.createNamespaceLocationOverride } : {
245
+ name: 'c-cluster-product-resource-create',
246
+ params: {
247
+ product: this.$store.getters['currentProduct'].name,
248
+ resource: NAMESPACE
249
+ },
250
+ };
251
+
252
+ location.query = { [PROJECT_ID]: project?.metadata.name };
253
+
254
+ return location;
255
+ },
256
+ showProjectAction(event, group) {
257
+ const project = group.rows[0].project;
258
+
259
+ this.$store.commit(`action-menu/show`, {
260
+ resources: [project],
261
+ elem: event.target
262
+ });
263
+ },
264
+ showProjectActionButton(group) {
265
+ const project = group.rows[0].project;
266
+
267
+ return !!project;
268
+ },
269
+ projectLabel(group) {
270
+ const row = group.rows[0];
271
+
272
+ if (row.isFake) {
273
+ return this.t('resourceTable.groupLabel.project', { name: row.project?.nameDisplay }, true);
274
+ }
275
+
276
+ return row.groupByLabel;
277
+ },
278
+
279
+ projectDescription(group) {
280
+ const project = group.rows[0].project;
281
+
282
+ return project?.description;
283
+ },
284
+
285
+ clearSelection() {
286
+ this.$refs.table.clearSelection();
287
+ },
288
+
289
+ sortGenerationFn() {
290
+ // The sort generation function creates a unique value and is used to create a key including sort details.
291
+ // The unique key determines if the list is redrawn or a cached version is shown.
292
+ // Because we ensure the 'not in a project' group is there via a row, and timing issues, the unqiue key doesn't change
293
+ // after a namespace is removed... so the list won't update... so we need to inject a string to ensure the key is fresh
294
+ const base = defaultTableSortGenerationFn(this.schema, this.$store);
295
+
296
+ return base + (this.showMockNotInProjectGroup ? '-mock' : '');
297
+ },
298
+
299
+ }
300
+ };
301
+ </script>
302
+
303
+ <template>
304
+ <div class="project-namespaces">
305
+ <Masthead
306
+ :schema="projectSchema"
307
+ :type-display="t('projectNamespaces.label')"
308
+ :resource="MANAGEMENT.PROJECT"
309
+ :favorite-resource="VIRTUAL_TYPES.PROJECT_NAMESPACES"
310
+ :create-location="createProjectLocation"
311
+ :create-button-label="t('projectNamespaces.createProject')"
312
+ />
313
+ <ResourceTable
314
+ ref="table"
315
+ class="table"
316
+ v-bind="$attrs"
317
+ :schema="schema"
318
+ :headers="headers"
319
+ :rows="filteredRows"
320
+ :groupable="true"
321
+ :sort-generation-fn="sortGenerationFn"
322
+ :loading="$fetchState.pending || !currentCluster"
323
+ group-tooltip="resourceTable.groupBy.project"
324
+ key-field="_key"
325
+ v-on="$listeners"
326
+ >
327
+ <template #group-by="group">
328
+ <div class="project-bar" :class="{'has-description': projectDescription(group.group)}">
329
+ <div v-trim-whitespace class="group-tab">
330
+ <div class="project-name" v-html="projectLabel(group.group)" />
331
+ <div v-if="projectDescription(group.group)" class="description text-muted text-small">
332
+ {{ projectDescription(group.group) }}
333
+ </div>
334
+ </div>
335
+ <div class="right">
336
+ <n-link
337
+ v-if="isNamespaceCreatable && (canSeeProjectlessNamespaces || group.group.key !== notInProjectKey)"
338
+ class="create-namespace btn btn-sm role-secondary mr-5"
339
+ :to="createNamespaceLocation(group.group)"
340
+ >
341
+ {{ t('projectNamespaces.createNamespace') }}
342
+ </n-link>
343
+ <button type="button" class="project-action btn btn-sm role-multi-action actions mr-10" :class="{invisible: !showProjectActionButton(group.group)}" @click="showProjectAction($event, group.group)">
344
+ <i class="icon icon-actions" />
345
+ </button>
346
+ </div>
347
+ </div>
348
+ </template>
349
+ <template #cell:project="{row}">
350
+ <span v-if="row.project">{{ row.project.nameDisplay }}</span>
351
+ <span v-else class="text-muted">&ndash;</span>
352
+ </template>
353
+ <template v-for="project in projectsWithoutNamespaces" v-slot:[slotName(project)]>
354
+ <tr :key="project.id" class="main-row">
355
+ <td class="empty text-center" colspan="5">
356
+ {{ t('projectNamespaces.noNamespaces') }}
357
+ </td>
358
+ </tr>
359
+ </template>
360
+ <template #main-row:fake-empty>
361
+ <tr class="main-row">
362
+ <td class="empty text-center" colspan="5">
363
+ {{ t('projectNamespaces.noProjectNoNamespaces') }}
364
+ </td>
365
+ </tr>
366
+ </template>
367
+ </ResourceTable>
368
+ <MoveModal @moving="clearSelection" />
369
+ </div>
370
+ </template>
371
+ <style lang="scss" scoped>
372
+ .project-namespaces {
373
+ & ::v-deep {
374
+ .project-name {
375
+ line-height: 30px;
376
+ }
377
+
378
+ .project-bar {
379
+ display: flex;
380
+ flex-direction: row;
381
+ justify-content: space-between;
382
+
383
+ &.has-description {
384
+ .right {
385
+ margin-top: 5px;
386
+ }
387
+ .group-tab {
388
+ &, &::after {
389
+ height: 50px;
390
+ }
391
+
392
+ &::after {
393
+ right: -20px;
394
+ }
395
+
396
+ .description {
397
+ margin-top: -20px;
398
+ }
399
+ }
400
+ }
401
+ }
402
+ }
403
+ }
404
+ </style>
@@ -33,7 +33,7 @@ export default {
33
33
  },
34
34
  data() {
35
35
  return {
36
- loading: false, error: false, interval: null, initialUrl: this.computeUrl()
36
+ loading: false, error: false, interval: null, initialUrl: this.computeUrl(), errorTimer: null
37
37
  };
38
38
  },
39
39
  computed: {
@@ -63,6 +63,17 @@ export default {
63
63
  injector.get('$route').updateParams(this.computeParams());
64
64
  injector.get('$route').reload();
65
65
  }
66
+ },
67
+
68
+ error(neu) {
69
+ if (neu) {
70
+ this.errorTimer = setInterval(() => {
71
+ this.reload();
72
+ }, 45000);
73
+ } else {
74
+ clearInterval(this.errorTimer);
75
+ this.errorTimer = null;
76
+ }
66
77
  }
67
78
  },
68
79
  mounted() {
@@ -73,6 +84,10 @@ export default {
73
84
  if (this.interval) {
74
85
  clearInterval(this.interval);
75
86
  }
87
+
88
+ if (this.errorTimer) {
89
+ clearInterval(this.errorTimer);
90
+ }
76
91
  },
77
92
  methods: {
78
93
  poll() {
@@ -150,7 +165,7 @@ export default {
150
165
  return params;
151
166
  },
152
167
  reload(ev) {
153
- ev.preventDefault();
168
+ ev && ev.preventDefault();
154
169
  this.$refs.frame.contentWindow.location.reload();
155
170
  this.poll();
156
171
  },
@@ -21,12 +21,16 @@ export default {
21
21
  type: String,
22
22
  default: null
23
23
  },
24
+ subtle: {
25
+ type: Boolean,
26
+ default: false,
27
+ }
24
28
  },
25
29
  };
26
30
  </script>
27
31
 
28
32
  <template>
29
- <div class="message-icon" :class="{'vertical': vertical}">
33
+ <div class="message-icon" :class="{'vertical': vertical, 'subtle': subtle}">
30
34
  <i class="icon" :class="{ [icon]: true, [iconState]: !!iconState}" />
31
35
  <div class="message">
32
36
  <slot name="message">
@@ -47,6 +51,10 @@ export default {
47
51
  width: 100%;
48
52
  }
49
53
 
54
+ .subtle {
55
+ opacity: 0.7;
56
+ }
57
+
50
58
  .message-icon {
51
59
  display: flex;
52
60
  align-items: center;