@rancher/shell 0.1.1 → 0.1.3

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 (294) hide show
  1. package/assets/translations/en-us.yaml +33 -769
  2. package/assets/translations/zh-hans.yaml +153 -781
  3. package/components/ActionMenu.vue +3 -3
  4. package/components/CodeMirror.vue +6 -8
  5. package/components/CommunityLinks.vue +1 -1
  6. package/components/ContainerResourceLimit.vue +14 -0
  7. package/components/ExplorerMembers.vue +123 -0
  8. package/components/ExplorerProjectsNamespaces.vue +405 -0
  9. package/components/GrafanaDashboard.vue +17 -2
  10. package/components/LocaleSelector.vue +81 -0
  11. package/components/PromptModal.vue +2 -3
  12. package/components/ResourceList/index.vue +1 -1
  13. package/components/ResourceTable.vue +3 -6
  14. package/components/SingleClusterInfo.vue +1 -1
  15. package/components/SortableTable/index.vue +23 -20
  16. package/components/SortableTable/selection.js +1 -0
  17. package/components/auth/AzureWarning.vue +5 -1
  18. package/components/auth/Principal.vue +1 -1
  19. package/components/auth/RoleDetailEdit.vue +32 -12
  20. package/components/fleet/FleetRepos.vue +0 -2
  21. package/components/form/NameNsDescription.vue +4 -6
  22. package/components/form/NodeScheduling.vue +1 -1
  23. package/components/form/ResourceTabs/index.vue +27 -18
  24. package/components/form/WorkloadPorts.vue +1 -1
  25. package/components/formatter/ClusterLink.vue +13 -0
  26. package/components/formatter/PodImages.vue +11 -1
  27. package/components/formatter/RKETemplateName.vue +37 -0
  28. package/components/formatter/WorkloadHealthScale.vue +1 -1
  29. package/components/nav/Header.vue +9 -9
  30. package/components/nav/NamespaceFilter.vue +7 -4
  31. package/components/nav/TopLevelMenu.vue +6 -43
  32. package/components/nav/WindowManager/ContainerLogs.vue +1 -1
  33. package/config/product/harvester-manager.js +64 -2
  34. package/config/product/manager.js +9 -0
  35. package/config/settings.js +17 -71
  36. package/config/table-headers.js +0 -1
  37. package/config/types.js +8 -26
  38. package/core/plugin-routes.ts +34 -22
  39. package/core/plugin.ts +15 -3
  40. package/core/plugins-loader.js +2 -0
  41. package/core/plugins.js +79 -36
  42. package/core/types.ts +7 -1
  43. package/creators/app/tsconfig.json +6 -1
  44. package/creators/pkg/init +3 -0
  45. package/creators/pkg/tsconfig.json +7 -2
  46. package/detail/provisioning.cattle.io.cluster.vue +23 -0
  47. package/detail/workload/index.vue +11 -5
  48. package/{components/dialog → dialog}/AddClusterMemberDialog.vue +0 -0
  49. package/{components/dialog → dialog}/AddCustomBadgeDialog.vue +0 -0
  50. package/{components/dialog → dialog}/AddProjectMemberDialog.vue +0 -0
  51. package/{components/dialog → dialog}/AddonConfigConfirmationDialog.vue +0 -0
  52. package/{components/dialog → dialog}/DrainNode.vue +0 -0
  53. package/{components/dialog → dialog}/ForceMachineRemoveDialog.vue +0 -0
  54. package/{components/dialog → dialog}/GenericPrompt.vue +0 -0
  55. package/{components/dialog → dialog}/RollbackWorkloadDialog.vue +0 -0
  56. package/{components/dialog → dialog}/RotateCertificatesDialog.vue +0 -0
  57. package/{components/dialog → dialog}/RotateEncryptionKeyDialog.vue +0 -0
  58. package/{components/dialog → dialog}/SaveAsRKETemplateDialog.vue +0 -0
  59. package/{components/dialog → dialog}/ScaleMachineDownDialog.vue +0 -0
  60. package/edit/auth/azuread.vue +20 -1
  61. package/edit/cloudcredential.vue +7 -1
  62. package/edit/management.cattle.io.project.vue +2 -2
  63. package/edit/namespace.vue +17 -10
  64. package/edit/networking.k8s.io.ingress/index.vue +2 -1
  65. package/edit/persistentvolumeclaim.vue +33 -2
  66. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +1 -1
  67. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +34 -6
  68. package/edit/provisioning.cattle.io.cluster/index.vue +1 -1
  69. package/edit/provisioning.cattle.io.cluster/rke2.vue +21 -6
  70. package/edit/service.vue +1 -1
  71. package/edit/workload/index.vue +363 -15
  72. package/edit/workload/mixins/workload.js +62 -7
  73. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -0
  74. package/layouts/default.vue +52 -27
  75. package/layouts/error.vue +5 -1
  76. package/layouts/home.vue +6 -2
  77. package/list/harvesterhci.io.management.cluster.vue +74 -33
  78. package/list/namespace.vue +3 -5
  79. package/list/provisioning.cattle.io.cluster.vue +6 -0
  80. package/machine-config/amazonec2.vue +2 -0
  81. package/machine-config/harvester.vue +96 -49
  82. package/middleware/authenticated.js +56 -52
  83. package/mixins/brand.js +3 -4
  84. package/mixins/create-edit-view/impl.js +0 -8
  85. package/mixins/form-validation.js +1 -1
  86. package/mixins/resource-fetch.js +3 -1
  87. package/models/chart.js +1 -1
  88. package/models/cluster/node.js +12 -1
  89. package/models/fleet.cattle.io.bundle.js +26 -19
  90. package/models/harvesterhci.io.management.cluster.js +194 -5
  91. package/models/management.cattle.io.cluster.js +1 -1
  92. package/models/management.cattle.io.clusterroletemplatebinding.js +9 -0
  93. package/models/management.cattle.io.globalrole.js +0 -19
  94. package/models/management.cattle.io.project.js +23 -2
  95. package/models/management.cattle.io.roletemplate.js +2 -21
  96. package/models/namespace.js +19 -3
  97. package/models/pod.js +19 -2
  98. package/models/provisioning.cattle.io.cluster.js +71 -0
  99. package/models/service.js +5 -1
  100. package/models/workload.js +4 -243
  101. package/models/workload.service.js +314 -0
  102. package/nuxt.config.js +14 -12
  103. package/package.json +3 -3
  104. package/pages/auth/login.vue +11 -2
  105. package/pages/auth/setup.vue +1 -1
  106. package/pages/c/_cluster/_product/members/index.vue +3 -93
  107. package/pages/c/_cluster/_product/projectsnamespaces.vue +6 -403
  108. package/pages/c/_cluster/apps/charts/install.vue +0 -6
  109. package/pages/c/_cluster/settings/performance.vue +19 -16
  110. package/pages/fail-whale.vue +1 -10
  111. package/pages/index.vue +18 -4
  112. package/pages/plugins.vue +2 -2
  113. package/pages/prefs.vue +8 -6
  114. package/pkg/auto-import.js +44 -7
  115. package/pkg/dynamic-plugin-loader.js +28 -0
  116. package/pkg/import.js +2 -2
  117. package/pkg/model-loader-require.lib.js +3 -0
  118. package/pkg/vue.config.js +9 -6
  119. package/plugins/console.js +10 -5
  120. package/plugins/dashboard-store/actions.js +8 -3
  121. package/plugins/dashboard-store/getters.js +7 -2
  122. package/plugins/dashboard-store/model-loader-require.js +12 -0
  123. package/plugins/dashboard-store/model-loader.js +4 -1
  124. package/plugins/dashboard-store/resource-class.js +10 -3
  125. package/plugins/steve/actions.js +1 -1
  126. package/plugins/steve/index.js +6 -4
  127. package/plugins/steve/steve-description-class.js +32 -0
  128. package/plugins/steve/subscribe.js +34 -23
  129. package/rancher-components/Banner/Banner.vue +2 -2
  130. package/rancher-components/Form/Checkbox/Checkbox.test.ts +77 -0
  131. package/rancher-components/Form/Checkbox/Checkbox.vue +12 -2
  132. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +0 -2
  133. package/rancher-components/Form/LabeledInput/LabeledInput.vue +2 -0
  134. package/rancher-components/Form/Radio/RadioButton.vue +14 -1
  135. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.test.ts +107 -0
  136. package/{components/form → rancher-components/Form/ToggleSwitch}/ToggleSwitch.vue +18 -8
  137. package/rancher-components/Form/ToggleSwitch/index.ts +1 -0
  138. package/rancher-components/Form/index.ts +1 -0
  139. package/scripts/build-pkg.sh +48 -2
  140. package/scripts/drone-build-pkg.sh +31 -0
  141. package/scripts/publish-shell.sh +10 -11
  142. package/scripts/serve-pkgs +17 -10
  143. package/scripts/test-plugins-build.sh +18 -1
  144. package/store/catalog.js +3 -1
  145. package/store/i18n.js +16 -11
  146. package/store/index.js +4 -181
  147. package/store/prefs.js +30 -2
  148. package/store/type-map.js +16 -29
  149. package/types/{index.d.ts → rancher/index.d.ts} +0 -0
  150. package/utils/cluster.js +1 -1
  151. package/utils/custom-validators.js +1 -12
  152. package/utils/dynamic-importer.js +1 -1
  153. package/utils/validators/setting.js +0 -35
  154. package/components/FilterLabel.vue +0 -254
  155. package/components/HarvesterUpgradeProgressBarList.vue +0 -109
  156. package/components/VMConsoleBar.vue +0 -87
  157. package/components/dialog/harvester/AddHotplugModal.vue +0 -159
  158. package/components/dialog/harvester/BackupModal.vue +0 -117
  159. package/components/dialog/harvester/CloneTemplate.vue +0 -125
  160. package/components/dialog/harvester/EjectCDROMDialog.vue +0 -157
  161. package/components/dialog/harvester/ExportImageDialog.vue +0 -152
  162. package/components/dialog/harvester/MaintenanceDialog.vue +0 -94
  163. package/components/dialog/harvester/MigrationDialog.vue +0 -154
  164. package/components/dialog/harvester/RestoreDialog.vue +0 -153
  165. package/components/dialog/harvester/SupportBundle.vue +0 -217
  166. package/components/dialog/harvester/UnplugVolume.vue +0 -108
  167. package/components/form/SerialConsole/index.vue +0 -267
  168. package/components/formatter/AttachVMWithName.vue +0 -46
  169. package/components/formatter/CloudInitType.vue +0 -27
  170. package/components/formatter/HarvesterBackupTargetValidation.vue +0 -43
  171. package/components/formatter/HarvesterCPUUsed.vue +0 -122
  172. package/components/formatter/HarvesterDiskState.vue +0 -66
  173. package/components/formatter/HarvesterHostName.vue +0 -66
  174. package/components/formatter/HarvesterIpAddress.vue +0 -90
  175. package/components/formatter/HarvesterMemoryUsed.vue +0 -140
  176. package/components/formatter/HarvesterMigrationState.vue +0 -85
  177. package/components/formatter/HarvesterNodeName.vue +0 -49
  178. package/components/formatter/HarvesterStorageUsed.vue +0 -194
  179. package/components/formatter/HarvesterVmState.vue +0 -123
  180. package/components/nav/HarvesterUpgrade.vue +0 -232
  181. package/components/novnc/NovncConsole.vue +0 -93
  182. package/components/novnc/NovncConsoleItem.vue +0 -89
  183. package/components/novnc/NovncConsoleWrapper.vue +0 -243
  184. package/config/harvester-map.js +0 -44
  185. package/config/harvester-table-headers.js +0 -27
  186. package/config/product/harvester.js +0 -305
  187. package/detail/harvesterhci.io.host/HarvesterHostBasic.vue +0 -364
  188. package/detail/harvesterhci.io.host/HarvesterHostDisk.vue +0 -200
  189. package/detail/harvesterhci.io.host/HarvesterHostNetwork.vue +0 -89
  190. package/detail/harvesterhci.io.host/VirtualMachineInstance.vue +0 -134
  191. package/detail/harvesterhci.io.host/index.vue +0 -243
  192. package/detail/harvesterhci.io.virtualmachinebackup/index.vue +0 -221
  193. package/detail/harvesterhci.io.virtualmachineimage.vue +0 -118
  194. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineBasics.vue +0 -279
  195. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineEvents.vue +0 -75
  196. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineKeypairs.vue +0 -114
  197. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineMigration.vue +0 -79
  198. package/detail/kubevirt.io.virtualmachine/index.vue +0 -213
  199. package/edit/harvesterhci.io.cloudtemplate.vue +0 -123
  200. package/edit/harvesterhci.io.host/HarvesterDisk.vue +0 -262
  201. package/edit/harvesterhci.io.host/index.vue +0 -533
  202. package/edit/harvesterhci.io.keypair.vue +0 -112
  203. package/edit/harvesterhci.io.managedchart/index.vue +0 -25
  204. package/edit/harvesterhci.io.managedchart/rancher-monitoring.vue +0 -172
  205. package/edit/harvesterhci.io.networkattachmentdefinition.vue +0 -210
  206. package/edit/harvesterhci.io.setting/additional-ca.vue +0 -36
  207. package/edit/harvesterhci.io.setting/backup-target.vue +0 -182
  208. package/edit/harvesterhci.io.setting/http-proxy.vue +0 -79
  209. package/edit/harvesterhci.io.setting/index.vue +0 -201
  210. package/edit/harvesterhci.io.setting/overcommit-config.vue +0 -94
  211. package/edit/harvesterhci.io.setting/ssl-certificates.vue +0 -117
  212. package/edit/harvesterhci.io.setting/ssl-parameters.vue +0 -161
  213. package/edit/harvesterhci.io.setting/support-bundle-image.vue +0 -134
  214. package/edit/harvesterhci.io.setting/support-bundle-namespaces.vue +0 -73
  215. package/edit/harvesterhci.io.setting/vip-pools.vue +0 -244
  216. package/edit/harvesterhci.io.setting/vm-force-reset-policy.vue +0 -81
  217. package/edit/harvesterhci.io.virtualmachinebackup.vue +0 -256
  218. package/edit/harvesterhci.io.virtualmachineimage.vue +0 -364
  219. package/edit/harvesterhci.io.virtualmachinetemplateversion.vue +0 -340
  220. package/edit/harvesterhci.io.volume.vue +0 -195
  221. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/AccessCredentialsUsers.vue +0 -190
  222. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/index.vue +0 -212
  223. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/basicAuth.vue +0 -94
  224. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/sshkey.vue +0 -85
  225. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/DataTemplate.vue +0 -153
  226. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/index.vue +0 -279
  227. package/edit/kubevirt.io.virtualmachine/VirtualMachineCpuMemory.vue +0 -113
  228. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/__tests__/HarvesterEditNetwork.test.ts +0 -41
  229. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue +0 -281
  230. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/index.vue +0 -142
  231. package/edit/kubevirt.io.virtualmachine/VirtualMachineReserved.vue +0 -54
  232. package/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue +0 -256
  233. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +0 -391
  234. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditContainer.test.ts +0 -40
  235. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditExisting.test.ts +0 -102
  236. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVMImage.test.ts +0 -117
  237. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVolume.test.ts +0 -74
  238. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/container.vue +0 -132
  239. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue +0 -303
  240. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/vmImage.vue +0 -285
  241. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue +0 -188
  242. package/edit/kubevirt.io.virtualmachine/index.vue +0 -642
  243. package/edit/network.harvesterhci.io.clusternetwork/index.vue +0 -19
  244. package/edit/network.harvesterhci.io.clusternetwork/vlan.vue +0 -134
  245. package/edit/workload/types/Deployment.vue +0 -377
  246. package/edit/workload/types/Generic.vue +0 -295
  247. package/list/harvesterhci.io.cloudtemplate.vue +0 -78
  248. package/list/harvesterhci.io.dashboard/HarvesterUpgrade.vue +0 -211
  249. package/list/harvesterhci.io.dashboard/UpgradeInfo.vue +0 -40
  250. package/list/harvesterhci.io.dashboard/index.vue +0 -752
  251. package/list/harvesterhci.io.host/index.vue +0 -186
  252. package/list/harvesterhci.io.networkattachmentdefinition.vue +0 -167
  253. package/list/harvesterhci.io.setting.vue +0 -241
  254. package/list/harvesterhci.io.virtualmachinebackup.vue +0 -172
  255. package/list/harvesterhci.io.virtualmachineimage.vue +0 -80
  256. package/list/harvesterhci.io.virtualmachinetemplateversion.vue +0 -173
  257. package/list/harvesterhci.io.volume.vue +0 -122
  258. package/list/kubevirt.io.virtualmachine.vue +0 -193
  259. package/mixins/harvester-vm/impl.js +0 -267
  260. package/mixins/harvester-vm/index.js +0 -1357
  261. package/models/harvester/configmap.js +0 -32
  262. package/models/harvester/harvesterhci.io.blockdevice.js +0 -55
  263. package/models/harvester/harvesterhci.io.keypair.js +0 -12
  264. package/models/harvester/harvesterhci.io.setting.js +0 -127
  265. package/models/harvester/harvesterhci.io.supportbundle.js +0 -35
  266. package/models/harvester/harvesterhci.io.upgrade.js +0 -226
  267. package/models/harvester/harvesterhci.io.virtualmachinebackup.js +0 -116
  268. package/models/harvester/harvesterhci.io.virtualmachineimage.js +0 -255
  269. package/models/harvester/harvesterhci.io.virtualmachinerestore.js +0 -43
  270. package/models/harvester/harvesterhci.io.virtualmachinetemplate.js +0 -69
  271. package/models/harvester/harvesterhci.io.virtualmachinetemplateversion.js +0 -227
  272. package/models/harvester/k8s.cni.cncf.io.networkattachmentdefinition.js +0 -32
  273. package/models/harvester/kubevirt.io.virtualmachine.js +0 -850
  274. package/models/harvester/kubevirt.io.virtualmachineinstance.js +0 -142
  275. package/models/harvester/management.cattle.io.managedchart.js +0 -191
  276. package/models/harvester/management.cattle.io.setting.js +0 -40
  277. package/models/harvester/network.harvesterhci.io.clusternetwork.js +0 -100
  278. package/models/harvester/network.harvesterhci.io.nodenetwork.js +0 -34
  279. package/models/harvester/node.js +0 -255
  280. package/models/harvester/persistentvolumeclaim.js +0 -166
  281. package/models/harvester/pod.js +0 -185
  282. package/pages/c/_cluster/harvester/airgapupgrade/index.vue +0 -309
  283. package/pages/c/_cluster/harvester/console/_uid/serial.vue +0 -51
  284. package/pages/c/_cluster/harvester/console/_uid/vnc.vue +0 -52
  285. package/pages/c/_cluster/harvester/index.vue +0 -24
  286. package/pages/c/_cluster/harvester/support/index.vue +0 -154
  287. package/pkg/model-loader.lib.js +0 -3
  288. package/plugins/lookup.js +0 -50
  289. package/promptRemove/kubevirt.io.virtualmachine.vue +0 -164
  290. package/store/harvester-common.js +0 -126
  291. package/utils/validators/vm-datavolumes.js +0 -38
  292. package/utils/validators/vm-image.js +0 -32
  293. package/utils/validators/vm.js +0 -221
  294. package/yarn-error.log +0 -196
@@ -1,255 +0,0 @@
1
- import Vue from 'vue';
2
- import { HCI } from '@shell/config/types';
3
- import {
4
- DESCRIPTION,
5
- ANNOTATIONS_TO_IGNORE_REGEX,
6
- HCI as HCI_ANNOTATIONS
7
- } from '@shell/config/labels-annotations';
8
- import { get, clone } from '@shell/utils/object';
9
- import { formatSi } from '@shell/utils/units';
10
- import { ucFirst } from '@shell/utils/string';
11
- import { stateDisplay, colorForState } from '@shell/plugins/dashboard-store/resource-class';
12
- import SteveModel from '@shell/plugins/steve/steve-class';
13
- import { _CLONE } from '@shell/config/query-params';
14
-
15
- export function isReady() {
16
- function getStatusConditionOfType(type, defaultValue = []) {
17
- const conditions = Array.isArray(get(this, 'status.conditions')) ? this.status.conditions : defaultValue;
18
-
19
- return conditions.find( cond => cond.type === type);
20
- }
21
-
22
- const initialized = getStatusConditionOfType.call(this, 'Initialized');
23
- const imported = getStatusConditionOfType.call(this, 'Imported');
24
- const isCompleted = this.status?.progress === 100;
25
-
26
- if ([initialized?.status, imported?.status].includes('False')) {
27
- return false;
28
- } else {
29
- return isCompleted && true;
30
- }
31
- }
32
- export default class HciVmImage extends SteveModel {
33
- get availableActions() {
34
- let out = super._availableActions;
35
- const toFilter = ['goToEditYaml'];
36
-
37
- out = out.filter( A => !toFilter.includes(A.action));
38
-
39
- const schema = this.$getters['schemaFor'](HCI.VM);
40
- let canCreateVM = true;
41
-
42
- if ( schema && !schema?.collectionMethods.find(x => ['post'].includes(x.toLowerCase())) ) {
43
- canCreateVM = false;
44
- }
45
-
46
- return [
47
- {
48
- action: 'createFromImage',
49
- enabled: canCreateVM,
50
- icon: 'icon icon-fw icon-spinner',
51
- label: this.t('harvester.action.createVM'),
52
- disabled: !this.isReady,
53
- },
54
- ...out
55
- ];
56
- }
57
-
58
- applyDefaults(resources = this, realMode) {
59
- if (realMode !== _CLONE) {
60
- Vue.set(this.metadata, 'labels', { [HCI_ANNOTATIONS.OS_TYPE]: '', [HCI_ANNOTATIONS.IMAGE_SUFFIX]: '' });
61
- }
62
- }
63
-
64
- createFromImage() {
65
- const router = this.currentRouter();
66
-
67
- router.push({
68
- name: `c-cluster-product-resource-create`,
69
- params: { resource: HCI.VM },
70
- query: { image: this.id }
71
- });
72
- }
73
-
74
- cleanForNew() {
75
- this.$dispatch(`cleanForNew`, this);
76
-
77
- delete this.spec.displayName;
78
- }
79
-
80
- get nameDisplay() {
81
- return this.spec?.displayName;
82
- }
83
-
84
- get isOSImage() {
85
- return this?.metadata?.annotations?.[HCI_ANNOTATIONS.OS_UPGRADE_IMAGE] === 'True';
86
- }
87
-
88
- get isReady() {
89
- return isReady.call(this);
90
- }
91
-
92
- get stateDisplay() {
93
- const initialized = this.getStatusConditionOfType('Initialized');
94
- const imported = this.getStatusConditionOfType('Imported');
95
-
96
- if (imported?.status === 'Unknown') {
97
- if (this.spec.sourceType === 'download') {
98
- return 'Downloading';
99
- } else if (this.spec.sourceType === 'upload') {
100
- return 'Uploading';
101
- } else {
102
- return 'Exporting';
103
- }
104
- }
105
-
106
- if (initialized?.message || imported?.message) {
107
- return 'Failed';
108
- }
109
-
110
- return stateDisplay(this.metadata.state.name);
111
- }
112
-
113
- get imageMessage() {
114
- const conditions = this?.status?.conditions || [];
115
- const initialized = conditions.find( cond => cond.type === 'Initialized');
116
- const imported = conditions.find( cond => cond.type === 'Imported');
117
- const message = initialized?.message || imported?.message;
118
-
119
- return ucFirst(message);
120
- }
121
-
122
- get stateBackground() {
123
- return colorForState(this.stateDisplay).replace('text-', 'bg-');
124
- }
125
-
126
- get imageSource() {
127
- return get(this, `spec.sourceType`) || 'download';
128
- }
129
-
130
- get progress() {
131
- return this?.status?.progress || 0;
132
- }
133
-
134
- get annotationsToIgnoreRegexes() {
135
- return [DESCRIPTION].concat(ANNOTATIONS_TO_IGNORE_REGEX);
136
- }
137
-
138
- get downSize() {
139
- const size = this.status?.size;
140
-
141
- if (!size) {
142
- return '-';
143
- }
144
-
145
- return formatSi(size, {
146
- increment: 1024,
147
- maxPrecision: 2,
148
- suffix: 'B',
149
- firstSuffix: 'B',
150
- });
151
- }
152
-
153
- getStatusConditionOfType(type, defaultValue = []) {
154
- const conditions = Array.isArray(get(this, 'status.conditions')) ? this.status.conditions : defaultValue;
155
-
156
- return conditions.find( cond => cond.type === type);
157
- }
158
-
159
- get stateObj() {
160
- const state = clone(this.metadata?.state);
161
- const initialized = this.getStatusConditionOfType('Initialized');
162
- const imported = this.getStatusConditionOfType('Imported');
163
-
164
- if ([initialized?.status, imported?.status].includes('False')) {
165
- state.error = true;
166
- }
167
-
168
- return state;
169
- }
170
-
171
- get stateDescription() {
172
- return this.imageMessage;
173
- }
174
-
175
- get displayName() {
176
- return this.spec?.displayName;
177
- }
178
-
179
- get uploadImage() {
180
- return async(file) => {
181
- const formData = new FormData();
182
-
183
- formData.append('chunk', file);
184
-
185
- try {
186
- this.$ctx.commit('harvester-common/uploadStart', this.metadata.name, { root: true });
187
-
188
- await this.doAction('upload', formData, {
189
- headers: {
190
- 'Content-Type': 'multipart/form-data',
191
- 'File-Size': file.size,
192
- },
193
- params: { size: file.size },
194
- });
195
- } catch (err) {
196
- this.$ctx.commit('harvester-common/uploadEnd', this.metadata.name, { root: true });
197
-
198
- return Promise.reject(err);
199
- }
200
-
201
- this.$ctx.commit('harvester-common/uploadEnd', this.metadata.name, { root: true });
202
- };
203
- }
204
-
205
- get imageSuffix() {
206
- return this.metadata?.labels?.[HCI_ANNOTATIONS.IMAGE_SUFFIX];
207
- }
208
-
209
- get imageOSType() {
210
- return this.metadata?.labels?.[HCI_ANNOTATIONS.OS_TYPE];
211
- }
212
-
213
- get customValidationRules() {
214
- const out = [];
215
-
216
- if (this.imageSource === 'download') {
217
- const urlFormat = {
218
- nullable: false,
219
- path: 'spec.url',
220
- validators: ['imageUrl'],
221
- };
222
-
223
- const urlRequired = {
224
- nullable: false,
225
- path: 'spec.url',
226
- required: true,
227
- translationKey: 'harvester.image.url'
228
- };
229
-
230
- out.push(urlFormat, urlRequired);
231
- }
232
-
233
- if (this.imageSource === 'upload') {
234
- const fileRequired = {
235
- nullable: false,
236
- path: 'metadata.annotations',
237
- validators: ['fileRequired'],
238
- };
239
-
240
- out.push(fileRequired);
241
- }
242
-
243
- return [
244
- {
245
- nullable: false,
246
- path: 'spec.displayName',
247
- required: true,
248
- minLength: 1,
249
- maxLength: 63,
250
- translationKey: 'generic.name',
251
- },
252
- ...out
253
- ];
254
- }
255
- }
@@ -1,43 +0,0 @@
1
- import SteveModel from '@shell/plugins/steve/steve-class';
2
-
3
- export default class HciVmRestore extends SteveModel {
4
- get isComplete() {
5
- return this?.status?.complete || false;
6
- }
7
-
8
- get pvcNames() {
9
- const restores = this?.status?.restores || [];
10
- const out = restores.map( O => O?.persistentVolumeClaimSpec?.name);
11
-
12
- return out;
13
- }
14
-
15
- get customValidationRules() {
16
- const isNew = this.spec?.newVM;
17
-
18
- const rules = [{
19
- nullable: false,
20
- path: 'spec.target.name',
21
- required: true,
22
- minLength: 1,
23
- maxLength: 63,
24
- translationKey: 'harvester.fields.virtualName',
25
- }, {
26
- nullable: false,
27
- path: 'spec.virtualMachineBackupName',
28
- required: true,
29
- translationKey: 'harvester.backup.restore.backup',
30
- }];
31
-
32
- if (!isNew) {
33
- rules.push({
34
- path: 'spec.deletionPolicy',
35
- required: true,
36
- type: 'string',
37
- translationKey: 'harvester.backup.restore.deletePreviousVolumes',
38
- });
39
- }
40
-
41
- return rules;
42
- }
43
- }
@@ -1,69 +0,0 @@
1
- import { HCI } from '@shell/config/types';
2
- import { MODE, _CREATE } from '@shell/config/query-params';
3
- import SteveModel from '@shell/plugins/steve/steve-class';
4
-
5
- export default class HciVmTemplate extends SteveModel {
6
- get availableActions() {
7
- const toFilter = ['goToEdit', 'cloneYaml', 'goToClone', 'goToEditYaml', 'download'];
8
-
9
- const out = super._availableActions.filter((action) => {
10
- if (action.altAction === 'remove') {
11
- action.bulkable = false;
12
- }
13
-
14
- if (!toFilter.includes(action.action)) {
15
- return action;
16
- }
17
- });
18
-
19
- const schema = this.$getters['schemaFor'](HCI.VM);
20
- let canCreateVM = true;
21
-
22
- if ( schema && !schema?.collectionMethods.find(x => ['post'].includes(x.toLowerCase())) ) {
23
- canCreateVM = false;
24
- }
25
-
26
- return [
27
- {
28
- action: 'createFromTemplate',
29
- enabled: canCreateVM,
30
- icon: 'icon icon-spinner',
31
- label: this.t('harvester.action.createVM'),
32
- },
33
- {
34
- action: 'addVersion',
35
- enabled: this.canCreate,
36
- icon: 'icon icon-fw icon-circle-plus',
37
- label: this.t('harvester.action.addTemplateVersion'),
38
- },
39
- ...out
40
- ];
41
- }
42
-
43
- createFromTemplate() {
44
- const router = this.currentRouter();
45
-
46
- router.push({
47
- name: `c-cluster-product-resource-create`,
48
- params: { resource: HCI.VM },
49
- query: { templateId: this.id, versionId: this.spec.defaultVersionId }
50
- });
51
- }
52
-
53
- addVersion(moreQuery = {}) {
54
- const router = this.currentRouter();
55
-
56
- router.push({
57
- name: `c-cluster-product-resource-create`,
58
- params: { resource: HCI.VM_VERSION },
59
- query: {
60
- [MODE]: _CREATE,
61
- templateId: this.id
62
- }
63
- });
64
- }
65
-
66
- get defaultVersion() {
67
- return this.status?.defaultVersion;
68
- }
69
- }
@@ -1,227 +0,0 @@
1
- import Vue from 'vue';
2
- import find from 'lodash/find';
3
- import { HCI } from '@shell/config/types';
4
- import {
5
- AS, MODE, _VIEW, _CONFIG, _UNFLAG, _EDIT
6
- } from '@shell/config/query-params';
7
- import { HCI as HCI_ANNOTATIONS } from '@shell/config/labels-annotations';
8
- import SteveModel from '@shell/plugins/steve/steve-class';
9
-
10
- export default class HciVmTemplateVersion extends SteveModel {
11
- get availableActions() {
12
- let out = super._availableActions;
13
- const toFilter = ['goToClone', 'cloneYaml', 'goToViewConfig', 'goToEditYaml', 'goToViewYaml'];
14
-
15
- out = out.filter((action) => {
16
- if (!toFilter.includes(action.action)) {
17
- return action;
18
- }
19
- });
20
-
21
- const schema = this.$getters['schemaFor'](HCI.VM);
22
- let canCreateVM = true;
23
-
24
- if ( schema && !schema?.collectionMethods.find(x => ['post'].includes(x.toLowerCase())) ) {
25
- canCreateVM = false;
26
- }
27
-
28
- return [
29
- {
30
- action: 'launchFromTemplate',
31
- icon: 'icon icon-spinner',
32
- enabled: canCreateVM,
33
- label: this.t('harvester.action.launchFormTemplate'),
34
- },
35
- {
36
- action: 'cloneTemplate',
37
- enabled: this.currentTemplate?.canCreate,
38
- icon: 'icon icon-fw icon-edit',
39
- label: this.t('harvester.action.modifyTemplate'),
40
- },
41
- {
42
- action: 'setDefaultVersion',
43
- enabled: this.currentTemplate?.canCreate,
44
- icon: 'icon icon-fw icon-checkmark',
45
- label: this.t('harvester.action.setDefaultVersion'),
46
- },
47
- {
48
- action: 'goToViewConfig',
49
- label: this.t('action.view'),
50
- icon: 'icon icon-edit',
51
- },
52
- ...out
53
- ];
54
- }
55
-
56
- applyDefaults() {
57
- const spec = {
58
- vm: {
59
- metadata: { annotations: { [HCI_ANNOTATIONS.VOLUME_CLAIM_TEMPLATE]: '[]' } },
60
- spec: {
61
- runStrategy: 'RerunOnFailure',
62
- template: {
63
- metadata: { annotations: {} },
64
- spec: {
65
- domain: {
66
- machine: { type: '' },
67
- cpu: {
68
- cores: null,
69
- sockets: 1,
70
- threads: 1
71
- },
72
- devices: {
73
- inputs: [{
74
- bus: 'usb',
75
- name: 'tablet',
76
- type: 'tablet'
77
- }],
78
- interfaces: [{
79
- masquerade: {},
80
- model: 'virtio',
81
- name: 'default'
82
- }],
83
- disks: [],
84
- },
85
- resources: {
86
- limits: {
87
- memory: null,
88
- cpu: ''
89
- }
90
- },
91
- features: { acpi: { enabled: true } },
92
- },
93
- evictionStrategy: 'LiveMigrate',
94
- hostname: '',
95
- networks: [{
96
- name: 'default',
97
- pod: {}
98
- }],
99
- volumes: []
100
- }
101
- }
102
- }
103
- }
104
- };
105
-
106
- Vue.set(this, 'spec', spec);
107
- }
108
-
109
- get canDelete() {
110
- return this.hasLink('remove') && this.$rootGetters['type-map/optionsFor'](this.type).isRemovable && !this.isDefaultVersion;
111
- }
112
-
113
- get template() {
114
- return this.$rootGetters['harvester/all'](HCI.VM_TEMPLATE).find((T) => {
115
- return T.id === this.spec.templateId;
116
- });
117
- }
118
-
119
- get version() {
120
- return this?.status?.version;
121
- }
122
-
123
- get templates() {
124
- return this.$rootGetters['harvester/all'](HCI.VM_TEMPLATE);
125
- }
126
-
127
- get machineType() {
128
- return this.vm?.spec?.template?.spec?.domain?.machine?.type || '';
129
- }
130
-
131
- get templateId() {
132
- return this.spec.templateId;
133
- }
134
-
135
- launchFromTemplate() {
136
- const templateResource = this.currentTemplate;
137
- const templateId = templateResource.id;
138
- const launchVersion = this.id;
139
- const router = this.currentRouter();
140
-
141
- router.push({
142
- name: `c-cluster-product-resource-create`,
143
- params: { resource: HCI.VM },
144
- query: { templateId, versionId: launchVersion }
145
- });
146
- }
147
-
148
- cloneTemplate(moreQuery = {}) {
149
- const location = this.detailLocation;
150
-
151
- location.query = {
152
- ...location.query,
153
- [MODE]: _EDIT,
154
- [AS]: _UNFLAG,
155
- ...moreQuery
156
- };
157
-
158
- this.currentRouter().push(location);
159
- }
160
-
161
- goToViewConfig(moreQuery = {}) {
162
- const location = this.detailLocation;
163
-
164
- location.query = {
165
- ...location.query,
166
- [MODE]: _VIEW,
167
- [AS]: _CONFIG,
168
- templateId: this.templateId,
169
- ...moreQuery
170
- };
171
-
172
- this.currentRouter().push(location);
173
- }
174
-
175
- get currentTemplate() {
176
- return find(this.templates, T => T.id === this.templateId);
177
- }
178
-
179
- async setDefaultVersion(moreQuery = {}) {
180
- const templateResource = this.currentTemplate;
181
-
182
- templateResource.spec.defaultVersionId = this.id;
183
- await templateResource.save();
184
- }
185
-
186
- get defaultVersion() {
187
- const templates = this.$rootGetters['harvester/all'](HCI.VM_TEMPLATE);
188
- const template = templates.find(T => this.templateId === T.id);
189
-
190
- return template?.status?.defaultVersion;
191
- }
192
-
193
- get isDefaultVersion() {
194
- return this.defaultVersion === this?.status?.version;
195
- }
196
-
197
- get customValidationRules() {
198
- const rules = [
199
- // {
200
- // nullable: false,
201
- // path: 'spec.vm.spec.template.spec.domain.cpu.cores',
202
- // min: 1,
203
- // max: 100,
204
- // required: true,
205
- // translationKey: 'harvester.fields.cpu',
206
- // },
207
- // {
208
- // nullable: false,
209
- // path: 'spec.vm.spec.template.spec.domain.resources.requests.memory',
210
- // required: false,
211
- // translationKey: 'harvester.fields.memory',
212
- // },
213
- // {
214
- // nullable: false,
215
- // path: 'spec.vm.spec.template.spec',
216
- // validators: ['vmNetworks'],
217
- // },
218
- // {
219
- // nullable: false,
220
- // path: 'spec.vm.spec',
221
- // validators: ['vmDisks:isVMTemplate'],
222
- // },
223
- ];
224
-
225
- return rules;
226
- }
227
- }
@@ -1,32 +0,0 @@
1
- import { clone } from '@shell/utils/object';
2
- import { HCI } from '@shell/config/types';
3
- import NetworkAttachmentDef from '@shell/models/k8s.cni.cncf.io.networkattachmentdefinition';
4
-
5
- export default class HarvesterNetworkAttachmentDef extends NetworkAttachmentDef {
6
- get detailLocation() {
7
- const detailLocation = clone(this._detailLocation);
8
-
9
- detailLocation.params.resource = HCI.NETWORK_ATTACHMENT;
10
-
11
- return detailLocation;
12
- }
13
-
14
- get doneOverride() {
15
- const detailLocation = clone(this._detailLocation);
16
-
17
- delete detailLocation.params.namespace;
18
- delete detailLocation.params.id;
19
- detailLocation.params.resource = HCI.NETWORK_ATTACHMENT;
20
- detailLocation.name = 'c-cluster-product-resource';
21
-
22
- return detailLocation;
23
- }
24
-
25
- get parentNameOverride() {
26
- return this.$rootGetters['i18n/t'](`typeLabel."${ HCI.NETWORK_ATTACHMENT }"`, { count: 1 })?.trim();
27
- }
28
-
29
- get parentLocationOverride() {
30
- return this.doneOverride;
31
- }
32
- }