@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,240 @@
1
+ <script>
2
+ import { PVC } from '@shell/config/types';
3
+ import ButtonDropdown from '@shell/components/ButtonDropdown';
4
+ import Mount from '@shell/edit/workload/storage/Mount';
5
+ import { _VIEW } from '@shell/config/query-params';
6
+ import ArrayListGrouped from '@shell/components/form/ArrayListGrouped';
7
+ import { randomStr } from '@shell/utils/string';
8
+
9
+ export default {
10
+ name: 'ContainerMountPaths',
11
+ components: {
12
+ ArrayListGrouped, ButtonDropdown, Mount
13
+ },
14
+
15
+ props: {
16
+ mode: {
17
+ type: String,
18
+ default: 'create',
19
+ },
20
+
21
+ // pod spec
22
+ value: {
23
+ type: Object,
24
+ default: () => {
25
+ return {};
26
+ },
27
+ },
28
+
29
+ container: {
30
+ type: Object,
31
+ default: () => {
32
+ return {};
33
+ },
34
+ },
35
+ },
36
+
37
+ async fetch() {
38
+ if ( this.$store.getters['cluster/schemaFor'](PVC) ) {
39
+ this.pvcs = await this.$store.dispatch('cluster/findAll', { type: PVC });
40
+ } else {
41
+ this.pvcs = [];
42
+ }
43
+ },
44
+
45
+ data() {
46
+ this.initializeStorage();
47
+
48
+ return {
49
+ containerVolumes: [],
50
+ pvcs: [],
51
+ storageVolumes: this.getStorageVolumes(),
52
+ selectedContainerVolumes: this.getSelectedContainerVolumes()
53
+ };
54
+ },
55
+
56
+ computed: {
57
+ isView() {
58
+ return this.mode === _VIEW;
59
+ },
60
+
61
+ availableVolumeOptions() {
62
+ const containerVolumes = this.container.volumeMounts.map(item => item.name);
63
+
64
+ return this.value.volumes.filter(vol => !containerVolumes.includes(vol.name)).map((item) => {
65
+ return {
66
+ label: `${ item.name } (${ this.headerFor(item) })`,
67
+ action: this.selectVolume,
68
+ value: item.name
69
+ };
70
+ });
71
+ },
72
+ },
73
+
74
+ watch: {
75
+ value(neu, old) {
76
+ this.selectedVolumes = this.getSelectedContainerVolumes();
77
+ },
78
+ storageVolumes(neu, old) {
79
+ // removeObjects(this.value.volumes, old);
80
+ // addObjects(this.value.volumes, neu);
81
+ const names = neu.reduce((all, each) => {
82
+ all.push(each.name);
83
+
84
+ return all;
85
+ }, []);
86
+
87
+ this.container.volumeMounts = this.container.volumeMounts.filter(mount => names.includes(mount.name));
88
+ },
89
+
90
+ selectedContainerVolumes(neu, old) {
91
+ // removeObjects(this.value.volumes, old);
92
+ // addObjects(this.value.volumes, neu);
93
+ const names = neu.map(item => item.name);
94
+
95
+ this.container.volumeMounts = this.container.volumeMounts.filter(mount => names.includes(mount.name));
96
+ }
97
+
98
+ },
99
+
100
+ methods: {
101
+ /**
102
+ * Initialize missing values for the container
103
+ */
104
+ initializeStorage() {
105
+ if (!this.container.volumeMounts) {
106
+ this.$set(this.container, 'volumeMounts', []);
107
+ }
108
+ if (!this.value.volumes) {
109
+ this.$set(this.value, 'volumes', []);
110
+ }
111
+ },
112
+
113
+ /**
114
+ * Get existing paired storage volumes
115
+ */
116
+ getStorageVolumes() {
117
+ // Extract volume mounts to map storage volumes
118
+ const { volumeMounts = [] } = this.container;
119
+ const names = volumeMounts.map(({ name }) => name);
120
+
121
+ // Extract storage volumes to allow mutation, if matches mount map
122
+ return this.value.volumes.filter(volume => names.includes(volume.name));
123
+ },
124
+
125
+ getSelectedContainerVolumes() {
126
+ // Extract volume mounts to map storage volumes
127
+ const { volumeMounts = [] } = this.container;
128
+ const names = volumeMounts.map(({ name }) => name);
129
+
130
+ // Extract storage volumes to allow mutation, if matches mount map
131
+ return this.value.volumes.filter(volume => names.includes(volume.name));
132
+ },
133
+
134
+ /**
135
+ * Remove all mounts for given storage volume
136
+ */
137
+ removeVolume(volume) {
138
+ const removeName = volume.row.value.name;
139
+
140
+ this.selectedContainerVolumes = this.selectedContainerVolumes.filter(({ name }) => name !== removeName);
141
+ },
142
+
143
+ selectVolume(event) {
144
+ const selectedVolume = this.value.volumes.find(vol => vol.name === event.value);
145
+
146
+ this.selectedContainerVolumes.push(selectedVolume);
147
+
148
+ const { name } = selectedVolume;
149
+
150
+ this.container.volumeMounts.push(name);
151
+ },
152
+
153
+ addVolume(type) {
154
+ const name = `vol-${ randomStr(5).toLowerCase() }`;
155
+
156
+ if (type === 'createPVC') {
157
+ this.storageVolumes.push({
158
+ _type: 'createPVC',
159
+ persistentVolumeClaim: {},
160
+ name,
161
+ });
162
+ } else if (type === 'csi') {
163
+ this.storageVolumes.push({
164
+ _type: type,
165
+ csi: { volumeAttributes: {} },
166
+ name,
167
+ });
168
+ } else {
169
+ this.storageVolumes.push({
170
+ _type: type,
171
+ [type]: {},
172
+ name,
173
+ });
174
+ }
175
+
176
+ this.container.volumeMounts.push({ name });
177
+ },
178
+
179
+ headerFor(value) {
180
+ const type = Object.keys(value).filter(
181
+ key => typeof value[key] === 'object'
182
+ )[0];
183
+
184
+ if (
185
+ this.$store.getters['i18n/exists'](`workload.storage.subtypes.${ type }`)
186
+ ) {
187
+ return this.t(`workload.storage.subtypes.${ type }`);
188
+ } else {
189
+ return type;
190
+ }
191
+ },
192
+
193
+ openPopover() {
194
+ const button = this.$refs.buttonDropdown;
195
+
196
+ try {
197
+ button.togglePopover();
198
+ } catch (e) {}
199
+ },
200
+ },
201
+ };
202
+ </script>
203
+
204
+ <template>
205
+ <div>
206
+ <!-- Storage Volumes -->
207
+ <ArrayListGrouped
208
+ :key="selectedContainerVolumes.length"
209
+ v-model="selectedContainerVolumes"
210
+ :mode="mode"
211
+ @remove="removeVolume"
212
+ >
213
+ <!-- Custom/default storage volume form -->
214
+ <template #default="props">
215
+ <h3>{{ props.row.value.name }} ({{ headerFor(props.row.value) }})</h3>
216
+ <Mount
217
+ :container="container"
218
+ :name="props.row.value.name"
219
+ :mode="mode"
220
+ />
221
+ </template>
222
+
223
+ <!-- Add Storage Volume -->
224
+ <template #add>
225
+ <ButtonDropdown
226
+ v-if="!isView"
227
+ id="add-volume"
228
+ :button-label="t('workload.storage.selectVolume')"
229
+ :dropdown-options="availableVolumeOptions"
230
+ size="sm"
231
+ @click-action="e=>selectVolume(e)"
232
+ >
233
+ <template #no-options>
234
+ {{ t('workload.storage.noVolumes') }}
235
+ </template>
236
+ </ButtonDropdown>
237
+ </template>
238
+ </ArrayListGrouped>
239
+ </div>
240
+ </template>
@@ -4,6 +4,7 @@ import { Checkbox } from '@components/Form/Checkbox';
4
4
  import { mapGetters } from 'vuex';
5
5
  import { removeObject } from '@shell/utils/array';
6
6
  export default {
7
+ name: 'Mount',
7
8
  components: { LabeledInput, Checkbox },
8
9
  props: {
9
10
  mode: {
@@ -1,9 +1,11 @@
1
1
  <script>
2
2
  import { LabeledInput } from '@components/Form/LabeledInput';
3
+ import { Checkbox } from '@components/Form/Checkbox';
4
+
3
5
  import { mapGetters } from 'vuex';
4
6
 
5
7
  export default {
6
- components: { LabeledInput },
8
+ components: { LabeledInput, Checkbox },
7
9
  props: {
8
10
  // volumeAttributes object
9
11
  value: {
@@ -24,6 +26,23 @@ export default {
24
26
 
25
27
  <template>
26
28
  <div>
29
+ <div class="row mb-10">
30
+ <div class="col span-6">
31
+ <LabeledInput
32
+ v-model="value.name"
33
+ :required="true"
34
+ :mode="mode"
35
+ :label="t('workload.storage.volumeName')"
36
+ />
37
+ </div>
38
+ <div class="col span-6">
39
+ <Checkbox
40
+ v-model="value.awsElasticBlockStore.readOnly"
41
+ :mode="mode"
42
+ :label="t('workload.storage.readOnly')"
43
+ />
44
+ </div>
45
+ </div>
27
46
  <div class="row mb-10">
28
47
  <div class="col span-6">
29
48
  <LabeledInput
@@ -1,10 +1,13 @@
1
1
  <script>
2
+ import { mapGetters } from 'vuex';
2
3
  import { LabeledInput } from '@components/Form/LabeledInput';
3
4
  import { RadioGroup } from '@components/Form/Radio';
4
- import { mapGetters } from 'vuex';
5
+ import { Checkbox } from '@components/Form/Checkbox';
5
6
 
6
7
  export default {
7
- components: { LabeledInput, RadioGroup },
8
+ components: {
9
+ LabeledInput, RadioGroup, Checkbox
10
+ },
8
11
  props: {
9
12
  // volumeAttributes object
10
13
  value: {
@@ -31,6 +34,23 @@ export default {
31
34
 
32
35
  <template>
33
36
  <div>
37
+ <div class="row mb-10">
38
+ <div class="col span-6">
39
+ <LabeledInput
40
+ v-model="value.name"
41
+ :required="true"
42
+ :mode="mode"
43
+ :label="t('workload.storage.volumeName')"
44
+ />
45
+ </div>
46
+ <div class="col span-6">
47
+ <Checkbox
48
+ v-model="value.azureDisk.readOnly"
49
+ :mode="mode"
50
+ :label="t('workload.storage.readOnly')"
51
+ />
52
+ </div>
53
+ </div>
34
54
  <div class="row mb-10">
35
55
  <div class="col span-6">
36
56
  <LabeledInput
@@ -1,9 +1,10 @@
1
1
  <script>
2
- import { LabeledInput } from '@components/Form/LabeledInput';
3
2
  import { mapGetters } from 'vuex';
3
+ import { Checkbox } from '@components/Form/Checkbox';
4
+ import { LabeledInput } from '@components/Form/LabeledInput';
4
5
 
5
6
  export default {
6
- components: { LabeledInput },
7
+ components: { LabeledInput, Checkbox },
7
8
 
8
9
  props: {
9
10
  value: {
@@ -25,6 +26,23 @@ export default {
25
26
 
26
27
  <template>
27
28
  <div>
29
+ <div class="row mb-10">
30
+ <div class="col span-6">
31
+ <LabeledInput
32
+ v-model="value.name"
33
+ :required="true"
34
+ :mode="mode"
35
+ :label="t('workload.storage.volumeName')"
36
+ />
37
+ </div>
38
+ <div class="col span-6">
39
+ <Checkbox
40
+ v-model="value.azureFile.readOnly"
41
+ :mode="mode"
42
+ :label="t('workload.storage.readOnly')"
43
+ />
44
+ </div>
45
+ </div>
28
46
  <div class="row mb-10">
29
47
  <div class="col span-6">
30
48
  <LabeledInput
@@ -1,9 +1,14 @@
1
1
  <script>
2
2
  import LabeledSelect from '@shell/components/form/LabeledSelect';
3
+ import { Checkbox } from '@components/Form/Checkbox';
4
+ import { LabeledInput } from '@components/Form/LabeledInput';
5
+
3
6
  import { mapGetters } from 'vuex';
4
7
 
5
8
  export default {
6
- components: { LabeledSelect },
9
+ components: {
10
+ LabeledSelect, Checkbox, LabeledInput
11
+ },
7
12
 
8
13
  props: {
9
14
  podSpec: {
@@ -45,6 +50,23 @@ export default {
45
50
  <template>
46
51
  <div>
47
52
  <div>
53
+ <div class="row mb-10">
54
+ <div class="col span-6">
55
+ <LabeledInput
56
+ v-model="value.name"
57
+ :required="true"
58
+ :mode="mode"
59
+ :label="t('workload.storage.volumeName')"
60
+ />
61
+ </div>
62
+ <div class="col span-6">
63
+ <Checkbox
64
+ v-model="value.csi.readOnly"
65
+ :mode="mode"
66
+ :label="t('workload.storage.readOnly')"
67
+ />
68
+ </div>
69
+ </div>
48
70
  <div class="row mb-10">
49
71
  <div class="col span-6">
50
72
  <LabeledSelect
@@ -1,9 +1,10 @@
1
1
  <script>
2
- import { LabeledInput } from '@components/Form/LabeledInput';
3
2
  import { mapGetters } from 'vuex';
3
+ import { LabeledInput } from '@components/Form/LabeledInput';
4
+ import { Checkbox } from '@components/Form/Checkbox';
4
5
 
5
6
  export default {
6
- components: { LabeledInput },
7
+ components: { LabeledInput, Checkbox },
7
8
 
8
9
  props: {
9
10
  value: {
@@ -25,6 +26,23 @@ export default {
25
26
 
26
27
  <template>
27
28
  <div>
29
+ <div class="row mb-10">
30
+ <div class="col span-6">
31
+ <LabeledInput
32
+ v-model="value.name"
33
+ :required="true"
34
+ :mode="mode"
35
+ :label="t('workload.storage.volumeName')"
36
+ />
37
+ </div>
38
+ <div class="col span-6">
39
+ <Checkbox
40
+ v-model="value.gcePersistentDisk.readOnly"
41
+ :mode="mode"
42
+ :label="t('workload.storage.readOnly')"
43
+ />
44
+ </div>
45
+ </div>
28
46
  <div class="row mb-10">
29
47
  <div class="col span-6">
30
48
  <LabeledInput
@@ -1,6 +1,5 @@
1
1
  <script>
2
2
  import { PVC } from '@shell/config/types';
3
- import { removeObjects, addObjects } from '@shell/utils/array';
4
3
  import ButtonDropdown from '@shell/components/ButtonDropdown';
5
4
  import Mount from '@shell/edit/workload/storage/Mount';
6
5
  import { _VIEW } from '@shell/config/query-params';
@@ -33,13 +32,6 @@ export default {
33
32
  default: null,
34
33
  },
35
34
 
36
- container: {
37
- type: Object,
38
- default: () => {
39
- return {};
40
- },
41
- },
42
-
43
35
  savePvcHookName: {
44
36
  type: String,
45
37
  required: true,
@@ -73,10 +65,7 @@ export default {
73
65
  data() {
74
66
  this.initializeStorage();
75
67
 
76
- return {
77
- pvcs: [],
78
- storageVolumes: this.getStorageVolumes(),
79
- };
68
+ return { pvcs: [] };
80
69
  },
81
70
 
82
71
  computed: {
@@ -94,7 +83,7 @@ export default {
94
83
  * Generated list of volumes
95
84
  */
96
85
  volumeTypeOptions() {
97
- const excludedFiles = ['index', 'Mount', 'PVC'];
86
+ const excludedFiles = ['index', 'Mount', 'PVC', 'ContainerMountPaths'];
98
87
  const defaultVolumeTypes = [
99
88
  'csi',
100
89
  'configMap',
@@ -125,78 +114,63 @@ export default {
125
114
  },
126
115
  },
127
116
 
128
- watch: {
129
- storageVolumes(neu, old) {
130
- removeObjects(this.value.volumes, old);
131
- addObjects(this.value.volumes, neu);
132
- const names = neu.reduce((all, each) => {
133
- all.push(each.name);
117
+ // watch: {
118
+ // storageVolumes(neu, old) {
119
+ // removeObjects(this.value.volumes, old);
120
+ // addObjects(this.value.volumes, neu);
121
+ // const names = neu.reduce((all, each) => {
122
+ // all.push(each.name);
134
123
 
135
- return all;
136
- }, []);
124
+ // return all;
125
+ // }, []);
137
126
 
138
- this.container.volumeMounts = this.container.volumeMounts.filter(mount => names.includes(mount.name));
139
- }
140
- },
127
+ // this.container.volumeMounts = this.container.volumeMounts.filter(mount => names.includes(mount.name));
128
+ // }
129
+ // },
141
130
 
142
131
  methods: {
143
132
  /**
144
133
  * Initialize missing values for the container
145
134
  */
146
135
  initializeStorage() {
147
- if (!this.container.volumeMounts) {
148
- this.$set(this.container, 'volumeMounts', []);
149
- }
150
136
  if (!this.value.volumes) {
151
137
  this.$set(this.value, 'volumes', []);
152
138
  }
153
139
  },
154
140
 
155
- /**
156
- * Get existing paired storage volumes
157
- */
158
- getStorageVolumes() {
159
- // Extract volume mounts to map storage volumes
160
- const { volumeMounts = [] } = this.container;
161
- const names = volumeMounts.map(({ name }) => name);
162
-
163
- // Extract storage volumes to allow mutation, if matches mount map
164
- return this.value.volumes.filter(volume => names.includes(volume.name));
165
- },
166
-
167
141
  /**
168
142
  * Remove all mounts for given storage volume
169
143
  */
170
144
  removeVolume(volume) {
171
145
  const removeName = volume.row.value.name;
172
146
 
173
- this.storageVolumes = this.storageVolumes.filter(({ name }) => name !== removeName);
147
+ this.value.volumes = this.value.volumes.filter(({ name }) => name !== removeName);
174
148
  },
175
149
 
176
150
  addVolume(type) {
177
151
  const name = `vol-${ randomStr(5).toLowerCase() }`;
178
152
 
179
153
  if (type === 'createPVC') {
180
- this.storageVolumes.push({
154
+ this.value.volumes.push({
181
155
  _type: 'createPVC',
182
156
  persistentVolumeClaim: {},
183
157
  name,
184
158
  });
185
159
  } else if (type === 'csi') {
186
- this.storageVolumes.push({
160
+ this.value.volumes.push({
187
161
  _type: type,
188
162
  csi: { volumeAttributes: {} },
189
163
  name,
190
164
  });
191
165
  } else {
192
- this.storageVolumes.push({
166
+ this.value.volumes.push({
193
167
  _type: type,
194
168
  [type]: {},
195
169
  name,
196
170
  });
197
171
  }
198
172
 
199
- this.container.volumeMounts.push({ name });
173
+ // this.container.volumeMounts.push({ name });
200
174
  },
201
175
 
202
176
  volumeType(vol) {
@@ -275,8 +249,8 @@ export default {
275
249
  <div>
276
250
  <!-- Storage Volumes -->
277
251
  <ArrayListGrouped
278
- :key="storageVolumes.length"
279
- v-model="storageVolumes"
252
+ :key="value.volumes.length"
253
+ v-model="value.volumes"
280
254
  :mode="mode"
281
255
  @remove="removeVolume"
282
256
  >
@@ -307,19 +281,19 @@ export default {
307
281
  </div>
308
282
  </div>
309
283
 
310
- <!-- Mount point list to be mapped to volume -->
284
+ <!-- Mount point list to be mapped to volume
311
285
  <Mount
312
286
  :container="container"
313
287
  :name="props.row.value.name"
314
288
  :mode="mode"
315
- />
289
+ /> -->
316
290
  </template>
317
291
 
318
292
  <!-- Add Storage Volume -->
319
293
  <template #add>
320
294
  <ButtonDropdown
321
295
  v-if="!isView"
322
- id="add-volume"
296
+ id="select-volume"
323
297
  :button-label="t('workload.storage.addVolume')"
324
298
  :dropdown-options="volumeTypeOptions"
325
299
  size="sm"
@@ -209,6 +209,7 @@ export default {
209
209
  :label="t('persistentVolumeClaim.capacity')"
210
210
  :increment="1024"
211
211
  :input-exponent="3"
212
+ :required="true"
212
213
  :output-modifier="true"
213
214
  />
214
215
  </div>
@@ -1,6 +1,6 @@
1
1
  <script>
2
- import { LabeledInput } from '@components/Form/LabeledInput';
3
2
  import { mapGetters } from 'vuex';
3
+ import { LabeledInput } from '@components/Form/LabeledInput';
4
4
 
5
5
  export default {
6
6
  components: { LabeledInput },
@@ -25,6 +25,16 @@ export default {
25
25
 
26
26
  <template>
27
27
  <div>
28
+ <div class="row mb-10">
29
+ <div class="col span-6">
30
+ <LabeledInput
31
+ v-model="value.name"
32
+ :required="true"
33
+ :mode="mode"
34
+ :label="t('workload.storage.volumeName')"
35
+ />
36
+ </div>
37
+ </div>
28
38
  <div class="row mb-10">
29
39
  <div class="col span-6">
30
40
  <LabeledInput