@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
@@ -1,16 +1,13 @@
1
1
  import { findBy, insertAt } from '@shell/utils/array';
2
- import {
3
- TARGET_WORKLOADS, TIMESTAMP, UI_MANAGED, HCI as HCI_LABELS_ANNOTATIONS, CATTLE_PUBLIC_ENDPOINTS
4
- } from '@shell/config/labels-annotations';
2
+ import { TIMESTAMP, CATTLE_PUBLIC_ENDPOINTS } from '@shell/config/labels-annotations';
5
3
  import { WORKLOAD_TYPES, SERVICE, POD } from '@shell/config/types';
6
- import { clone, get, set } from '@shell/utils/object';
4
+ import { get, set } from '@shell/utils/object';
7
5
  import day from 'dayjs';
8
- import SteveModel from '@shell/plugins/steve/steve-class';
9
- import { shortenedImage } from '@shell/utils/string';
10
6
  import { convertSelectorObj, matching, matches } from '@shell/utils/selector';
11
7
  import { SEPARATOR } from '@shell/components/DetailTop';
8
+ import WorkloadService from '@shell/models/workload.service';
12
9
 
13
- export default class Workload extends SteveModel {
10
+ export default class Workload extends WorkloadService {
14
11
  // remove clone as yaml/edit as yaml until API supported
15
12
  get _availableActions() {
16
13
  let out = super._availableActions;
@@ -221,7 +218,7 @@ export default class Workload extends SteveModel {
221
218
  path: 'metadata.name',
222
219
  required: true,
223
220
  translationKey: 'generic.name',
224
- type: 'dnsLabel',
221
+ type: 'subDomain',
225
222
  },
226
223
  {
227
224
  nullable: false,
@@ -279,30 +276,6 @@ export default class Workload extends SteveModel {
279
276
  return out;
280
277
  }
281
278
 
282
- get containers() {
283
- if (this.type === WORKLOAD_TYPES.CRON_JOB) {
284
- // cronjob pod template is nested slightly different than other types
285
- const { spec: { jobTemplate: { spec: { template: { spec: { containers } } } } } } = this;
286
-
287
- return containers;
288
- }
289
- const { spec:{ template:{ spec:{ containers } } } } = this;
290
-
291
- return containers;
292
- }
293
-
294
- get initContainers() {
295
- if (this.type === WORKLOAD_TYPES.CRON_JOB) {
296
- // cronjob pod template is nested slightly different than other types
297
- const { spec: { jobTemplate: { spec: { template: { spec: { initContainers } } } } } } = this;
298
-
299
- return initContainers;
300
- }
301
- const { spec:{ template:{ spec:{ initContainers } } } } = this;
302
-
303
- return initContainers;
304
- }
305
-
306
279
  get endpoint() {
307
280
  return this?.metadata?.annotations[CATTLE_PUBLIC_ENDPOINTS];
308
281
  }
@@ -432,7 +405,7 @@ export default class Workload extends SteveModel {
432
405
  case WORKLOAD_TYPES.CRON_JOB:
433
406
  out.push(detailItem.endpoint);
434
407
  break;
435
- case WORKLOAD_TYPES.POD:
408
+ case POD:
436
409
  out.push(detailItem.ready);
437
410
  break;
438
411
  default: break;
@@ -441,46 +414,6 @@ export default class Workload extends SteveModel {
441
414
  return out;
442
415
  }
443
416
 
444
- async getServicesOwned(force = false) {
445
- const normanTypes = {
446
- [WORKLOAD_TYPES.REPLICA_SET]: 'replicaSet',
447
- [WORKLOAD_TYPES.DEPLOYMENT]: 'deployment',
448
- [WORKLOAD_TYPES.STATEFUL_SET]: 'statefulSet',
449
- [WORKLOAD_TYPES.DAEMON_SET]: 'daemonSet'
450
- };
451
- const selectorKey = Object.keys(this.workloadSelector)[0];
452
-
453
- const normanSelectorValue =
454
- `${ normanTypes[this._type ? this._type : this.type] }-${
455
- this.metadata.namespace
456
- }-${ this.metadata.name }`;
457
-
458
- const steveSelectorValue = this.workloadSelector[selectorKey];
459
- const allSvc = await this.$dispatch('cluster/findAll', { type: SERVICE, opt: { force } }, { root: true });
460
-
461
- return (allSvc || []).filter(svc => (svc.spec?.selector || {})[selectorKey] === steveSelectorValue || (svc.spec?.selector || {})[selectorKey] === normanSelectorValue );
462
- }
463
-
464
- get imageNames() {
465
- let containers;
466
- const images = [];
467
-
468
- if (this.type === WORKLOAD_TYPES.CRON_JOB) {
469
- containers = get(this, 'spec.jobTemplate.spec.template.spec.containers');
470
- } else {
471
- containers = get(this, 'spec.template.spec.containers');
472
- }
473
- if (containers) {
474
- containers.forEach((container) => {
475
- if (!images.includes(container.image)) {
476
- images.push(container.image);
477
- }
478
- });
479
- }
480
-
481
- return images.map(shortenedImage);
482
- }
483
-
484
417
  redeploy() {
485
418
  const now = (new Date()).toISOString().replace(/\.\d+Z$/, 'Z');
486
419
 
@@ -496,14 +429,6 @@ export default class Workload extends SteveModel {
496
429
  this.save();
497
430
  }
498
431
 
499
- get workloadSelector() {
500
- return {
501
- 'workload.user.cattle.io/workloadselector': `${ this._type ? this._type : this.type }-${
502
- this.metadata.namespace
503
- }-${ this.metadata.name }`
504
- };
505
- }
506
-
507
432
  // match existing container ports with services created for this workload
508
433
  async getPortsWithServiceType() {
509
434
  const ports = [];
@@ -574,170 +499,6 @@ export default class Workload extends SteveModel {
574
499
  return ports;
575
500
  }
576
501
 
577
- // create clusterip, nodeport, loadbalancer services from container port spec
578
- async servicesFromContainerPorts(mode, ports) {
579
- const ownerRef = {
580
- apiVersion: this.apiVersion,
581
- controller: true,
582
- kind: this.kind,
583
- name: this.metadata.name,
584
- uid: this.metadata.uid
585
- };
586
-
587
- const annotations = { [TARGET_WORKLOADS]: JSON.stringify([`${ this.metadata.namespace }/${ this.metadata.name }`]), [UI_MANAGED]: 'true' };
588
-
589
- let clusterIP = {
590
- type: SERVICE,
591
- spec: {
592
- ports: [],
593
- selector: this.workloadSelector,
594
- type: 'ClusterIP'
595
- },
596
- metadata: {
597
- name: this.metadata.name,
598
- namespace: this.metadata.namespace,
599
- annotations,
600
- ownerReferences: [ownerRef]
601
- },
602
- };
603
-
604
- let nodePort = {
605
- type: SERVICE,
606
- spec: {
607
- ports: [],
608
- selector: this.workloadSelector,
609
- type: 'NodePort'
610
- },
611
- metadata: {
612
- name: `${ this.metadata.name }-nodeport`,
613
- namespace: this.metadata.namespace,
614
- annotations,
615
- ownerReferences: [ownerRef]
616
- },
617
- };
618
-
619
- let loadBalancer = {
620
- type: SERVICE,
621
- spec: {
622
- ports: [],
623
- selector: this.workloadSelector,
624
- type: 'LoadBalancer',
625
- externalTrafficPolicy: 'Cluster'
626
- },
627
- metadata: {
628
- name: `${ this.metadata.name }-loadbalancer`,
629
- namespace: this.metadata.namespace,
630
- annotations,
631
- ownerReferences: [ownerRef]
632
- },
633
- };
634
-
635
- const existing = await this.getServicesOwned(this.isFromNorman);
636
-
637
- if (existing && existing.length) {
638
- existing.forEach((service) => {
639
- switch (service.spec.type) {
640
- case 'ClusterIP':
641
- clusterIP = service;
642
- clusterIP.spec.ports = [];
643
- break;
644
- case 'NodePort':
645
- nodePort = service;
646
- nodePort.spec.ports = [];
647
- break;
648
- case 'LoadBalancer':
649
- loadBalancer = service;
650
- loadBalancer.spec.ports = [];
651
- break;
652
- default:
653
- break;
654
- }
655
- });
656
- }
657
- ports.forEach((port) => {
658
- const portSpec = {
659
- name: port.name, protocol: port.protocol, port: port.containerPort, targetPort: port.containerPort
660
- };
661
-
662
- if (port._serviceType !== '') {
663
- clusterIP.spec.ports.push(portSpec);
664
- switch (port._serviceType) {
665
- case 'NodePort': {
666
- const npPort = clone(portSpec);
667
-
668
- if (port._listeningPort) {
669
- npPort.nodePort = port._listeningPort;
670
- }
671
- nodePort.spec.ports.push(npPort);
672
- break; }
673
- case 'LoadBalancer': {
674
- const lbPort = clone(portSpec);
675
-
676
- if (port._listeningPort) {
677
- lbPort.port = port._listeningPort;
678
- }
679
- loadBalancer.spec.ports.push(lbPort);
680
- break; }
681
- default:
682
- break;
683
- }
684
- }
685
- });
686
-
687
- const toSave = [];
688
- const toRemove = [];
689
- let clusterIPProxy;
690
-
691
- if (clusterIP.spec.ports.length > 0) {
692
- if (clusterIP.id) {
693
- clusterIPProxy = clusterIP;
694
- } else {
695
- clusterIPProxy = await this.$dispatch(`cluster/create`, clusterIP, { root: true });
696
- }
697
- toSave.push(clusterIPProxy);
698
- } else if (clusterIP.id) {
699
- toRemove.push(clusterIP);
700
- }
701
-
702
- if (nodePort.spec.ports.length > 0) {
703
- let nodePortProxy;
704
-
705
- // if id is defined it's a preexisting service
706
- if (nodePort.id) {
707
- nodePortProxy = nodePort;
708
- } else {
709
- nodePortProxy = await this.$dispatch(`cluster/create`, nodePort, { root: true });
710
- }
711
- toSave.push(nodePortProxy);
712
- // if id defined but no ports, the service already exists but should be removed (user has removed all container ports mapping to it)
713
- } else if (nodePort.id) {
714
- toRemove.push(nodePort);
715
- }
716
-
717
- if (loadBalancer.spec.ports.length > 0) {
718
- let loadBalancerProxy;
719
-
720
- if (loadBalancer.id) {
721
- loadBalancerProxy = loadBalancer;
722
- } else {
723
- loadBalancer = clone(loadBalancer);
724
-
725
- const portsWithIpam = ports.filter(p => p._ipam) || [];
726
-
727
- if (portsWithIpam.length > 0) {
728
- loadBalancer.metadata.annotations[HCI_LABELS_ANNOTATIONS.CLOUD_PROVIDER_IPAM] = portsWithIpam[0]._ipam;
729
- }
730
-
731
- loadBalancerProxy = await this.$dispatch(`cluster/create`, loadBalancer, { root: true });
732
- }
733
- toSave.push(loadBalancerProxy);
734
- } else if (loadBalancer.id) {
735
- toRemove.push(loadBalancer);
736
- }
737
-
738
- return { toSave, toRemove };
739
- }
740
-
741
502
  get showAsWorkload() {
742
503
  const types = Object.values(WORKLOAD_TYPES);
743
504
 
@@ -851,8 +612,10 @@ export default class Workload extends SteveModel {
851
612
 
852
613
  async matchingPods() {
853
614
  const all = await this.$dispatch('findAll', { type: POD });
615
+ const allInNamespace = all.filter(pod => pod.metadata.namespace === this.metadata.namespace);
616
+
854
617
  const selector = convertSelectorObj(this.spec.selector);
855
618
 
856
- return matching(all, selector);
619
+ return matching(allInNamespace, selector);
857
620
  }
858
621
  }
@@ -0,0 +1,314 @@
1
+
2
+ import { findBy } from '@shell/utils/array';
3
+ import { TARGET_WORKLOADS, UI_MANAGED, HCI as HCI_LABELS_ANNOTATIONS } from '@shell/config/labels-annotations';
4
+ import { WORKLOAD_TYPES, SERVICE } from '@shell/config/types';
5
+ import { clone, get } from '@shell/utils/object';
6
+ import SteveModel from '@shell/plugins/steve/steve-class';
7
+ import { shortenedImage } from '@shell/utils/string';
8
+
9
+ export default class WorkloadService extends SteveModel {
10
+ async getPortsWithServiceType() {
11
+ const ports = [];
12
+
13
+ this.containers.forEach(container => ports.push(...(container.ports || [])));
14
+ (this.initContainers || []).forEach(container => ports.push(...(container.ports || [])));
15
+
16
+ // Only get services owned if we can access the service resource
17
+ const canAccessServices = this.$getters['schemaFor'](SERVICE);
18
+ const services = canAccessServices ? await this.getServicesOwned() : [];
19
+ const clusterIPServicePorts = [];
20
+ const loadBalancerServicePorts = [];
21
+ const nodePortServicePorts = [];
22
+
23
+ if (services.length) {
24
+ services.forEach((svc) => {
25
+ switch (svc.spec.type) {
26
+ case 'ClusterIP':
27
+ clusterIPServicePorts.push(...(svc?.spec?.ports || []));
28
+ break;
29
+ case 'LoadBalancer':
30
+ loadBalancerServicePorts.push(...(svc?.spec?.ports || []));
31
+ break;
32
+ case 'NodePort':
33
+ nodePortServicePorts.push(...(svc?.spec?.ports || []));
34
+ break;
35
+ default:
36
+ break;
37
+ }
38
+ });
39
+ }
40
+ ports.forEach((port) => {
41
+ const name = port.name ? port.name : `${ port.containerPort }${ port.protocol.toLowerCase() }${ port.hostPort || port._listeningPort || '' }`;
42
+
43
+ port.name = name;
44
+
45
+ if (port._serviceType && port._serviceType !== '') {
46
+ return;
47
+ }
48
+
49
+ if (loadBalancerServicePorts.length) {
50
+ const portSpec = findBy(loadBalancerServicePorts, 'name', name);
51
+
52
+ if (portSpec) {
53
+ port._listeningPort = portSpec.port;
54
+
55
+ port._serviceType = 'LoadBalancer';
56
+
57
+ return;
58
+ }
59
+ } if (nodePortServicePorts.length) {
60
+ const portSpec = findBy(nodePortServicePorts, 'name', name);
61
+
62
+ if (portSpec) {
63
+ port._listeningPort = portSpec.nodePort;
64
+
65
+ port._serviceType = 'NodePort';
66
+
67
+ return;
68
+ }
69
+ } if (clusterIPServicePorts.length) {
70
+ if (findBy(clusterIPServicePorts, 'name', name)) {
71
+ port._serviceType = 'ClusterIP';
72
+ }
73
+ }
74
+ });
75
+
76
+ return ports;
77
+ }
78
+
79
+ async getServicesOwned(force = false) {
80
+ const normanTypes = {
81
+ [WORKLOAD_TYPES.REPLICA_SET]: 'replicaSet',
82
+ [WORKLOAD_TYPES.DEPLOYMENT]: 'deployment',
83
+ [WORKLOAD_TYPES.STATEFUL_SET]: 'statefulSet',
84
+ [WORKLOAD_TYPES.DAEMON_SET]: 'daemonSet',
85
+ };
86
+ const selectorKey = Object.keys(this.workloadSelector)[0];
87
+
88
+ const normanSelectorValue =
89
+ `${ normanTypes[this._type ? this._type : this.type] }-${
90
+ this.metadata.namespace
91
+ }-${ this.metadata.name }`;
92
+
93
+ const steveSelectorValue = this.workloadSelector[selectorKey];
94
+ const allSvc = await this.$dispatch('cluster/findAll', { type: SERVICE, opt: { force } }, { root: true });
95
+
96
+ return (allSvc || []).filter(svc => (svc.spec?.selector || {})[selectorKey] === steveSelectorValue || (svc.spec?.selector || {})[selectorKey] === normanSelectorValue );
97
+ }
98
+
99
+ get imageNames() {
100
+ let containers;
101
+ const images = [];
102
+
103
+ if (this.type === WORKLOAD_TYPES.CRON_JOB) {
104
+ containers = get(this, 'spec.jobTemplate.spec.template.spec.containers');
105
+ } else {
106
+ containers = get(this, 'spec.template.spec.containers');
107
+ }
108
+ if (containers) {
109
+ containers.forEach((container) => {
110
+ if (!images.includes(container.image)) {
111
+ images.push(container.image);
112
+ }
113
+ });
114
+ }
115
+
116
+ return images.map(shortenedImage);
117
+ }
118
+
119
+ get containers() {
120
+ if (this.type === WORKLOAD_TYPES.CRON_JOB) {
121
+ // cronjob pod template is nested slightly different than other types
122
+ const { spec: { jobTemplate: { spec: { template: { spec: { containers } } } } } } = this;
123
+
124
+ return containers;
125
+ }
126
+ const { spec:{ template:{ spec:{ containers } } } } = this;
127
+
128
+ return containers;
129
+ }
130
+
131
+ get initContainers() {
132
+ if (this.type === WORKLOAD_TYPES.CRON_JOB) {
133
+ // cronjob pod template is nested slightly different than other types
134
+ const { spec: { jobTemplate: { spec: { template: { spec: { initContainers } } } } } } = this;
135
+
136
+ return initContainers;
137
+ }
138
+ const { spec:{ template:{ spec:{ initContainers } } } } = this;
139
+
140
+ return initContainers;
141
+ }
142
+
143
+ get workloadSelector() {
144
+ return {
145
+ 'workload.user.cattle.io/workloadselector': `${ this._type ? this._type : this.type }-${
146
+ this.metadata.namespace
147
+ }-${ this.metadata.name }`
148
+ };
149
+ }
150
+
151
+ // create clusterip, nodeport, loadbalancer services from container port spec
152
+ async servicesFromContainerPorts(mode, ports) {
153
+ const ownerRef = {
154
+ apiVersion: this.apiVersion,
155
+ controller: true,
156
+ kind: this.kind,
157
+ name: this.metadata.name,
158
+ uid: this.metadata.uid
159
+ };
160
+
161
+ const annotations = { [TARGET_WORKLOADS]: JSON.stringify([`${ this.metadata.namespace }/${ this.metadata.name }`]), [UI_MANAGED]: 'true' };
162
+
163
+ let clusterIP = {
164
+ type: SERVICE,
165
+ spec: {
166
+ ports: [],
167
+ selector: this.workloadSelector,
168
+ type: 'ClusterIP'
169
+ },
170
+ metadata: {
171
+ name: this.metadata.name,
172
+ namespace: this.metadata.namespace,
173
+ annotations,
174
+ ownerReferences: [ownerRef]
175
+ },
176
+ };
177
+
178
+ let nodePort = {
179
+ type: SERVICE,
180
+ spec: {
181
+ ports: [],
182
+ selector: this.workloadSelector,
183
+ type: 'NodePort'
184
+ },
185
+ metadata: {
186
+ name: `${ this.metadata.name }-nodeport`,
187
+ namespace: this.metadata.namespace,
188
+ annotations,
189
+ ownerReferences: [ownerRef]
190
+ },
191
+ };
192
+
193
+ let loadBalancer = {
194
+ type: SERVICE,
195
+ spec: {
196
+ ports: [],
197
+ selector: this.workloadSelector,
198
+ type: 'LoadBalancer',
199
+ externalTrafficPolicy: 'Cluster'
200
+ },
201
+ metadata: {
202
+ name: `${ this.metadata.name }-loadbalancer`,
203
+ namespace: this.metadata.namespace,
204
+ annotations,
205
+ ownerReferences: [ownerRef]
206
+ },
207
+ };
208
+
209
+ const existing = await this.getServicesOwned(this.isFromNorman);
210
+
211
+ if (existing && existing.length) {
212
+ existing.forEach((service) => {
213
+ switch (service.spec.type) {
214
+ case 'ClusterIP':
215
+ clusterIP = service;
216
+ clusterIP.spec.ports = [];
217
+ break;
218
+ case 'NodePort':
219
+ nodePort = service;
220
+ nodePort.spec.ports = [];
221
+ break;
222
+ case 'LoadBalancer':
223
+ loadBalancer = service;
224
+ loadBalancer.spec.ports = [];
225
+ break;
226
+ default:
227
+ break;
228
+ }
229
+ });
230
+ }
231
+ ports.forEach((port) => {
232
+ const portSpec = {
233
+ name: port.name, protocol: port.protocol, port: port.containerPort, targetPort: port.containerPort
234
+ };
235
+
236
+ if (port._serviceType !== '') {
237
+ clusterIP.spec.ports.push(portSpec);
238
+ switch (port._serviceType) {
239
+ case 'NodePort': {
240
+ const npPort = clone(portSpec);
241
+
242
+ if (port._listeningPort) {
243
+ npPort.nodePort = port._listeningPort;
244
+ }
245
+ nodePort.spec.ports.push(npPort);
246
+ break; }
247
+ case 'LoadBalancer': {
248
+ const lbPort = clone(portSpec);
249
+
250
+ if (port._listeningPort) {
251
+ lbPort.port = port._listeningPort;
252
+ }
253
+ loadBalancer.spec.ports.push(lbPort);
254
+ break; }
255
+ default:
256
+ break;
257
+ }
258
+ }
259
+ });
260
+
261
+ const toSave = [];
262
+ const toRemove = [];
263
+ let clusterIPProxy;
264
+
265
+ if (clusterIP.spec.ports.length > 0) {
266
+ if (clusterIP.id) {
267
+ clusterIPProxy = clusterIP;
268
+ } else {
269
+ clusterIPProxy = await this.$dispatch(`cluster/create`, clusterIP, { root: true });
270
+ }
271
+ toSave.push(clusterIPProxy);
272
+ } else if (clusterIP.id) {
273
+ toRemove.push(clusterIP);
274
+ }
275
+
276
+ if (nodePort.spec.ports.length > 0) {
277
+ let nodePortProxy;
278
+
279
+ // if id is defined it's a preexisting service
280
+ if (nodePort.id) {
281
+ nodePortProxy = nodePort;
282
+ } else {
283
+ nodePortProxy = await this.$dispatch(`cluster/create`, nodePort, { root: true });
284
+ }
285
+ toSave.push(nodePortProxy);
286
+ // if id defined but no ports, the service already exists but should be removed (user has removed all container ports mapping to it)
287
+ } else if (nodePort.id) {
288
+ toRemove.push(nodePort);
289
+ }
290
+
291
+ if (loadBalancer.spec.ports.length > 0) {
292
+ let loadBalancerProxy;
293
+
294
+ if (loadBalancer.id) {
295
+ loadBalancerProxy = loadBalancer;
296
+ } else {
297
+ loadBalancer = clone(loadBalancer);
298
+
299
+ const portsWithIpam = ports.filter(p => p._ipam) || [];
300
+
301
+ if (portsWithIpam.length > 0) {
302
+ loadBalancer.metadata.annotations[HCI_LABELS_ANNOTATIONS.CLOUD_PROVIDER_IPAM] = portsWithIpam[0]._ipam;
303
+ }
304
+
305
+ loadBalancerProxy = await this.$dispatch(`cluster/create`, loadBalancer, { root: true });
306
+ }
307
+ toSave.push(loadBalancerProxy);
308
+ } else if (loadBalancer.id) {
309
+ toRemove.push(loadBalancer);
310
+ }
311
+
312
+ return { toSave, toRemove };
313
+ }
314
+ }