@rancher/shell 0.1.2 → 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 (258) hide show
  1. package/assets/translations/en-us.yaml +27 -769
  2. package/assets/translations/zh-hans.yaml +8 -769
  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 +18 -11
  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/WorkloadPorts.vue +1 -1
  24. package/components/formatter/WorkloadHealthScale.vue +1 -1
  25. package/components/nav/Header.vue +9 -9
  26. package/components/nav/NamespaceFilter.vue +7 -4
  27. package/components/nav/TopLevelMenu.vue +6 -43
  28. package/components/nav/WindowManager/ContainerLogs.vue +1 -1
  29. package/config/product/harvester-manager.js +64 -2
  30. package/config/product/manager.js +9 -0
  31. package/config/settings.js +17 -71
  32. package/config/table-headers.js +0 -1
  33. package/config/types.js +5 -25
  34. package/core/plugin-routes.ts +34 -22
  35. package/core/plugin.ts +15 -3
  36. package/core/plugins-loader.js +2 -0
  37. package/core/plugins.js +79 -36
  38. package/core/types.ts +7 -1
  39. package/detail/provisioning.cattle.io.cluster.vue +13 -0
  40. package/detail/workload/index.vue +11 -5
  41. package/{components/dialog → dialog}/AddClusterMemberDialog.vue +0 -0
  42. package/{components/dialog → dialog}/AddCustomBadgeDialog.vue +0 -0
  43. package/{components/dialog → dialog}/AddProjectMemberDialog.vue +0 -0
  44. package/{components/dialog → dialog}/AddonConfigConfirmationDialog.vue +0 -0
  45. package/{components/dialog → dialog}/DrainNode.vue +0 -0
  46. package/{components/dialog → dialog}/ForceMachineRemoveDialog.vue +0 -0
  47. package/{components/dialog → dialog}/GenericPrompt.vue +0 -0
  48. package/{components/dialog → dialog}/RollbackWorkloadDialog.vue +0 -0
  49. package/{components/dialog → dialog}/RotateCertificatesDialog.vue +0 -0
  50. package/{components/dialog → dialog}/RotateEncryptionKeyDialog.vue +0 -0
  51. package/{components/dialog → dialog}/SaveAsRKETemplateDialog.vue +0 -0
  52. package/{components/dialog → dialog}/ScaleMachineDownDialog.vue +0 -0
  53. package/edit/auth/azuread.vue +20 -1
  54. package/edit/management.cattle.io.project.vue +2 -2
  55. package/edit/namespace.vue +17 -10
  56. package/edit/persistentvolumeclaim.vue +1 -0
  57. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +1 -1
  58. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +33 -5
  59. package/edit/service.vue +1 -1
  60. package/edit/workload/index.vue +363 -15
  61. package/edit/workload/mixins/workload.js +62 -7
  62. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -0
  63. package/layouts/default.vue +52 -27
  64. package/layouts/error.vue +5 -1
  65. package/layouts/home.vue +6 -2
  66. package/list/harvesterhci.io.management.cluster.vue +74 -33
  67. package/list/namespace.vue +3 -5
  68. package/machine-config/amazonec2.vue +2 -0
  69. package/machine-config/harvester.vue +96 -49
  70. package/middleware/authenticated.js +56 -52
  71. package/mixins/form-validation.js +1 -1
  72. package/mixins/resource-fetch.js +3 -1
  73. package/models/fleet.cattle.io.bundle.js +26 -19
  74. package/models/harvesterhci.io.management.cluster.js +194 -5
  75. package/models/management.cattle.io.cluster.js +1 -1
  76. package/models/management.cattle.io.clusterroletemplatebinding.js +9 -0
  77. package/models/management.cattle.io.project.js +23 -2
  78. package/models/namespace.js +19 -3
  79. package/models/pod.js +19 -2
  80. package/models/provisioning.cattle.io.cluster.js +4 -0
  81. package/models/workload.js +4 -243
  82. package/models/workload.service.js +314 -0
  83. package/nuxt.config.js +11 -9
  84. package/package.json +3 -3
  85. package/pages/auth/login.vue +11 -2
  86. package/pages/auth/setup.vue +1 -1
  87. package/pages/c/_cluster/_product/members/index.vue +3 -93
  88. package/pages/c/_cluster/_product/projectsnamespaces.vue +6 -403
  89. package/pages/c/_cluster/settings/performance.vue +19 -16
  90. package/pages/fail-whale.vue +1 -10
  91. package/pages/index.vue +18 -4
  92. package/pages/plugins.vue +2 -2
  93. package/pages/prefs.vue +8 -6
  94. package/pkg/auto-import.js +44 -7
  95. package/pkg/dynamic-plugin-loader.js +28 -0
  96. package/pkg/import.js +2 -2
  97. package/pkg/model-loader-require.lib.js +3 -0
  98. package/pkg/vue.config.js +9 -6
  99. package/plugins/dashboard-store/model-loader-require.js +12 -0
  100. package/plugins/dashboard-store/model-loader.js +4 -1
  101. package/plugins/dashboard-store/resource-class.js +10 -3
  102. package/plugins/steve/actions.js +1 -1
  103. package/plugins/steve/index.js +6 -4
  104. package/plugins/steve/subscribe.js +34 -23
  105. package/rancher-components/Form/Checkbox/Checkbox.test.ts +77 -0
  106. package/rancher-components/Form/Checkbox/Checkbox.vue +12 -2
  107. package/scripts/build-pkg.sh +48 -2
  108. package/scripts/drone-build-pkg.sh +31 -0
  109. package/scripts/publish-shell.sh +10 -11
  110. package/scripts/serve-pkgs +17 -10
  111. package/store/catalog.js +3 -1
  112. package/store/i18n.js +16 -11
  113. package/store/index.js +4 -181
  114. package/store/prefs.js +30 -2
  115. package/store/type-map.js +16 -29
  116. package/utils/cluster.js +1 -1
  117. package/utils/custom-validators.js +1 -12
  118. package/utils/dynamic-importer.js +1 -1
  119. package/utils/validators/setting.js +0 -35
  120. package/components/FilterLabel.vue +0 -254
  121. package/components/HarvesterUpgradeProgressBarList.vue +0 -109
  122. package/components/VMConsoleBar.vue +0 -87
  123. package/components/dialog/harvester/AddHotplugModal.vue +0 -159
  124. package/components/dialog/harvester/BackupModal.vue +0 -117
  125. package/components/dialog/harvester/CloneTemplate.vue +0 -125
  126. package/components/dialog/harvester/EjectCDROMDialog.vue +0 -157
  127. package/components/dialog/harvester/ExportImageDialog.vue +0 -152
  128. package/components/dialog/harvester/MaintenanceDialog.vue +0 -94
  129. package/components/dialog/harvester/MigrationDialog.vue +0 -154
  130. package/components/dialog/harvester/RestoreDialog.vue +0 -153
  131. package/components/dialog/harvester/SupportBundle.vue +0 -217
  132. package/components/dialog/harvester/UnplugVolume.vue +0 -108
  133. package/components/form/SerialConsole/index.vue +0 -267
  134. package/components/formatter/AttachVMWithName.vue +0 -46
  135. package/components/formatter/CloudInitType.vue +0 -27
  136. package/components/formatter/HarvesterBackupTargetValidation.vue +0 -43
  137. package/components/formatter/HarvesterCPUUsed.vue +0 -122
  138. package/components/formatter/HarvesterDiskState.vue +0 -66
  139. package/components/formatter/HarvesterHostName.vue +0 -66
  140. package/components/formatter/HarvesterIpAddress.vue +0 -90
  141. package/components/formatter/HarvesterMemoryUsed.vue +0 -140
  142. package/components/formatter/HarvesterMigrationState.vue +0 -85
  143. package/components/formatter/HarvesterNodeName.vue +0 -49
  144. package/components/formatter/HarvesterStorageUsed.vue +0 -194
  145. package/components/formatter/HarvesterVmState.vue +0 -123
  146. package/components/nav/HarvesterUpgrade.vue +0 -232
  147. package/components/novnc/NovncConsole.vue +0 -93
  148. package/components/novnc/NovncConsoleItem.vue +0 -89
  149. package/components/novnc/NovncConsoleWrapper.vue +0 -243
  150. package/config/harvester-map.js +0 -44
  151. package/config/harvester-table-headers.js +0 -27
  152. package/config/product/harvester.js +0 -305
  153. package/detail/harvesterhci.io.host/HarvesterHostBasic.vue +0 -364
  154. package/detail/harvesterhci.io.host/HarvesterHostDisk.vue +0 -200
  155. package/detail/harvesterhci.io.host/HarvesterHostNetwork.vue +0 -89
  156. package/detail/harvesterhci.io.host/VirtualMachineInstance.vue +0 -134
  157. package/detail/harvesterhci.io.host/index.vue +0 -243
  158. package/detail/harvesterhci.io.virtualmachinebackup/index.vue +0 -221
  159. package/detail/harvesterhci.io.virtualmachineimage.vue +0 -118
  160. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineBasics.vue +0 -279
  161. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineEvents.vue +0 -75
  162. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineKeypairs.vue +0 -114
  163. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineMigration.vue +0 -79
  164. package/detail/kubevirt.io.virtualmachine/index.vue +0 -213
  165. package/edit/harvesterhci.io.cloudtemplate.vue +0 -123
  166. package/edit/harvesterhci.io.host/HarvesterDisk.vue +0 -262
  167. package/edit/harvesterhci.io.host/index.vue +0 -533
  168. package/edit/harvesterhci.io.keypair.vue +0 -112
  169. package/edit/harvesterhci.io.managedchart/index.vue +0 -25
  170. package/edit/harvesterhci.io.managedchart/rancher-monitoring.vue +0 -172
  171. package/edit/harvesterhci.io.networkattachmentdefinition.vue +0 -210
  172. package/edit/harvesterhci.io.setting/additional-ca.vue +0 -36
  173. package/edit/harvesterhci.io.setting/backup-target.vue +0 -182
  174. package/edit/harvesterhci.io.setting/http-proxy.vue +0 -79
  175. package/edit/harvesterhci.io.setting/index.vue +0 -201
  176. package/edit/harvesterhci.io.setting/overcommit-config.vue +0 -94
  177. package/edit/harvesterhci.io.setting/ssl-certificates.vue +0 -117
  178. package/edit/harvesterhci.io.setting/ssl-parameters.vue +0 -161
  179. package/edit/harvesterhci.io.setting/support-bundle-image.vue +0 -134
  180. package/edit/harvesterhci.io.setting/support-bundle-namespaces.vue +0 -73
  181. package/edit/harvesterhci.io.setting/vip-pools.vue +0 -244
  182. package/edit/harvesterhci.io.setting/vm-force-reset-policy.vue +0 -81
  183. package/edit/harvesterhci.io.virtualmachinebackup.vue +0 -256
  184. package/edit/harvesterhci.io.virtualmachineimage.vue +0 -364
  185. package/edit/harvesterhci.io.virtualmachinetemplateversion.vue +0 -340
  186. package/edit/harvesterhci.io.volume.vue +0 -195
  187. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/AccessCredentialsUsers.vue +0 -190
  188. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/index.vue +0 -212
  189. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/basicAuth.vue +0 -94
  190. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/sshkey.vue +0 -85
  191. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/DataTemplate.vue +0 -153
  192. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/index.vue +0 -279
  193. package/edit/kubevirt.io.virtualmachine/VirtualMachineCpuMemory.vue +0 -113
  194. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/__tests__/HarvesterEditNetwork.test.ts +0 -41
  195. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue +0 -281
  196. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/index.vue +0 -142
  197. package/edit/kubevirt.io.virtualmachine/VirtualMachineReserved.vue +0 -54
  198. package/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue +0 -256
  199. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +0 -391
  200. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditContainer.test.ts +0 -40
  201. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditExisting.test.ts +0 -102
  202. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVMImage.test.ts +0 -117
  203. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVolume.test.ts +0 -74
  204. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/container.vue +0 -132
  205. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue +0 -303
  206. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/vmImage.vue +0 -285
  207. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue +0 -188
  208. package/edit/kubevirt.io.virtualmachine/index.vue +0 -642
  209. package/edit/network.harvesterhci.io.clusternetwork/index.vue +0 -19
  210. package/edit/network.harvesterhci.io.clusternetwork/vlan.vue +0 -134
  211. package/edit/workload/types/Deployment.vue +0 -377
  212. package/edit/workload/types/Generic.vue +0 -295
  213. package/list/harvesterhci.io.cloudtemplate.vue +0 -78
  214. package/list/harvesterhci.io.dashboard/HarvesterUpgrade.vue +0 -211
  215. package/list/harvesterhci.io.dashboard/UpgradeInfo.vue +0 -40
  216. package/list/harvesterhci.io.dashboard/index.vue +0 -752
  217. package/list/harvesterhci.io.host/index.vue +0 -186
  218. package/list/harvesterhci.io.networkattachmentdefinition.vue +0 -167
  219. package/list/harvesterhci.io.setting.vue +0 -241
  220. package/list/harvesterhci.io.virtualmachinebackup.vue +0 -172
  221. package/list/harvesterhci.io.virtualmachineimage.vue +0 -80
  222. package/list/harvesterhci.io.virtualmachinetemplateversion.vue +0 -173
  223. package/list/harvesterhci.io.volume.vue +0 -122
  224. package/list/kubevirt.io.virtualmachine.vue +0 -193
  225. package/mixins/harvester-vm/impl.js +0 -267
  226. package/mixins/harvester-vm/index.js +0 -1357
  227. package/models/harvester/configmap.js +0 -32
  228. package/models/harvester/harvesterhci.io.blockdevice.js +0 -55
  229. package/models/harvester/harvesterhci.io.keypair.js +0 -12
  230. package/models/harvester/harvesterhci.io.setting.js +0 -127
  231. package/models/harvester/harvesterhci.io.supportbundle.js +0 -35
  232. package/models/harvester/harvesterhci.io.upgrade.js +0 -226
  233. package/models/harvester/harvesterhci.io.virtualmachinebackup.js +0 -116
  234. package/models/harvester/harvesterhci.io.virtualmachineimage.js +0 -255
  235. package/models/harvester/harvesterhci.io.virtualmachinerestore.js +0 -43
  236. package/models/harvester/harvesterhci.io.virtualmachinetemplate.js +0 -69
  237. package/models/harvester/harvesterhci.io.virtualmachinetemplateversion.js +0 -227
  238. package/models/harvester/k8s.cni.cncf.io.networkattachmentdefinition.js +0 -32
  239. package/models/harvester/kubevirt.io.virtualmachine.js +0 -850
  240. package/models/harvester/kubevirt.io.virtualmachineinstance.js +0 -142
  241. package/models/harvester/management.cattle.io.managedchart.js +0 -191
  242. package/models/harvester/management.cattle.io.setting.js +0 -40
  243. package/models/harvester/network.harvesterhci.io.clusternetwork.js +0 -100
  244. package/models/harvester/network.harvesterhci.io.nodenetwork.js +0 -34
  245. package/models/harvester/node.js +0 -255
  246. package/models/harvester/persistentvolumeclaim.js +0 -166
  247. package/models/harvester/pod.js +0 -185
  248. package/pages/c/_cluster/harvester/airgapupgrade/index.vue +0 -309
  249. package/pages/c/_cluster/harvester/console/_uid/serial.vue +0 -51
  250. package/pages/c/_cluster/harvester/console/_uid/vnc.vue +0 -52
  251. package/pages/c/_cluster/harvester/index.vue +0 -24
  252. package/pages/c/_cluster/harvester/support/index.vue +0 -154
  253. package/pkg/model-loader.lib.js +0 -3
  254. package/promptRemove/kubevirt.io.virtualmachine.vue +0 -164
  255. package/store/harvester-common.js +0 -126
  256. package/utils/validators/vm-datavolumes.js +0 -38
  257. package/utils/validators/vm-image.js +0 -32
  258. package/utils/validators/vm.js +0 -221
@@ -1,752 +0,0 @@
1
- <script>
2
- import dayjs from 'dayjs';
3
- import minMax from 'dayjs/plugin/minMax';
4
- import utc from 'dayjs/plugin/utc';
5
- import { mapGetters } from 'vuex';
6
- import Loading from '@shell/components/Loading';
7
- import SortableTable from '@shell/components/SortableTable';
8
- import { allHash } from '@shell/utils/promise';
9
- import {
10
- parseSi, formatSi, exponentNeeded, UNITS, createMemoryValues
11
- } from '@shell/utils/units';
12
- import { REASON } from '@shell/config/table-headers';
13
- import {
14
- EVENT, METRIC, NODE, HCI, SERVICE, PVC, LONGHORN, POD, COUNT, NETWORK_ATTACHMENT
15
- } from '@shell/config/types';
16
- import ResourceSummary, { resourceCounts, colorToCountName } from '@shell/components/ResourceSummary';
17
- import { colorForState } from '@shell/plugins/dashboard-store/resource-class';
18
- import HardwareResourceGauge from '@shell/components/HardwareResourceGauge';
19
- import Tabbed from '@shell/components/Tabbed';
20
- import Tab from '@shell/components/Tabbed/Tab';
21
- import DashboardMetrics from '@shell/components/DashboardMetrics';
22
- import metricPoller from '@shell/mixins/metric-poller';
23
- import { allDashboardsExist } from '@shell/utils/grafana';
24
- import { isEmpty } from '@shell/utils/object';
25
- import HarvesterUpgrade from './HarvesterUpgrade';
26
-
27
- dayjs.extend(utc);
28
- dayjs.extend(minMax);
29
-
30
- const PARSE_RULES = {
31
- memory: {
32
- format: {
33
- addSuffix: true,
34
- firstSuffix: 'B',
35
- increment: 1024,
36
- maxExponent: 99,
37
- maxPrecision: 2,
38
- minExponent: 0,
39
- startingExponent: 0,
40
- suffix: 'iB',
41
- }
42
- }
43
- };
44
-
45
- const RESOURCES = [{
46
- type: NODE,
47
- spoofed: {
48
- location: {
49
- name: 'c-cluster-product-resource',
50
- params: { resource: HCI.HOST }
51
- },
52
- name: 'Host',
53
- }
54
- },
55
- { type: HCI.VM },
56
- {
57
- type: NETWORK_ATTACHMENT,
58
- spoofed: {
59
- location: {
60
- name: 'c-cluster-product-resource',
61
- params: { resource: HCI.NETWORK_ATTACHMENT }
62
- },
63
- name: 'Network',
64
- }
65
- },
66
- { type: HCI.IMAGE },
67
- {
68
- type: PVC,
69
- spoofed: {
70
- location: {
71
- name: 'c-cluster-product-resource',
72
- params: { resource: HCI.VOLUME }
73
- },
74
- name: 'Volume',
75
- filterNamespace: ['cattle-monitoring-system']
76
- }
77
- }];
78
-
79
- const CLUSTER_METRICS_DETAIL_URL = '/api/v1/namespaces/cattle-monitoring-system/services/http:rancher-monitoring-grafana:80/proxy/d/rancher-cluster-nodes-1/rancher-cluster-nodes?orgId=1';
80
- const CLUSTER_METRICS_SUMMARY_URL = '/api/v1/namespaces/cattle-monitoring-system/services/http:rancher-monitoring-grafana:80/proxy/d/rancher-cluster-1/rancher-cluster?orgId=1';
81
- const VM_DASHBOARD_METRICS_URL = '/api/v1/namespaces/cattle-monitoring-system/services/http:rancher-monitoring-grafana:80/proxy/d/harvester-vm-dashboard-1/vm-dashboard?orgId=1';
82
-
83
- export default {
84
- mixins: [metricPoller],
85
- components: {
86
- Loading,
87
- HardwareResourceGauge,
88
- SortableTable,
89
- HarvesterUpgrade,
90
- ResourceSummary,
91
- Tabbed,
92
- Tab,
93
- DashboardMetrics,
94
- },
95
-
96
- async fetch() {
97
- const inStore = this.$store.getters['currentProduct'].inStore;
98
-
99
- const hash = {
100
- vms: this.fetchClusterResources(HCI.VM),
101
- nodes: this.fetchClusterResources(NODE),
102
- events: this.fetchClusterResources(EVENT),
103
- metricNodes: this.fetchClusterResources(METRIC.NODE),
104
- settings: this.fetchClusterResources(HCI.SETTING),
105
- services: this.fetchClusterResources(SERVICE),
106
- metric: this.fetchClusterResources(METRIC.NODE),
107
- longhornNode: this.fetchClusterResources(LONGHORN.NODES) || [],
108
- _pods: this.$store.dispatch('harvester/findAll', { type: POD }),
109
- };
110
-
111
- (this.accessibleResources || []).map((a) => {
112
- hash[a.type] = this.$store.dispatch(`${ inStore }/findAll`, { type: a.type });
113
-
114
- return null;
115
- });
116
-
117
- const res = await allHash(hash);
118
-
119
- for ( const k in res ) {
120
- this[k] = res[k];
121
- }
122
-
123
- this.showClusterMetrics = await allDashboardsExist(this.$store, this.currentCluster.id, [CLUSTER_METRICS_DETAIL_URL, CLUSTER_METRICS_SUMMARY_URL], 'harvester');
124
- this.showVmMetrics = await allDashboardsExist(this.$store, this.currentCluster.id, [VM_DASHBOARD_METRICS_URL], 'harvester');
125
- },
126
-
127
- data() {
128
- const reason = {
129
- ...REASON,
130
- ...{ canBeVariable: true },
131
- width: 100
132
- };
133
-
134
- const eventHeaders = [
135
- reason,
136
- {
137
- name: 'resource',
138
- label: 'Resource',
139
- labelKey: 'clusterIndexPage.sections.events.resource.label',
140
- value: 'displayInvolvedObject',
141
- sort: ['involvedObject.kind', 'involvedObject.name'],
142
- canBeVariable: true,
143
- },
144
- {
145
- align: 'right',
146
- name: 'date',
147
- label: 'Date',
148
- labelKey: 'clusterIndexPage.sections.events.date.label',
149
- value: 'lastTimestamp',
150
- sort: 'lastTimestamp:desc',
151
- formatter: 'LiveDate',
152
- formatterOpts: { addSuffix: true },
153
- width: 125,
154
- defaultSort: true,
155
- },
156
- ];
157
-
158
- return {
159
- eventHeaders,
160
- constraints: [],
161
- events: [],
162
- nodeMetrics: [],
163
- nodes: [],
164
- metricNodes: [],
165
- vms: [],
166
- VM_DASHBOARD_METRICS_URL,
167
- CLUSTER_METRICS_SUMMARY_URL,
168
- CLUSTER_METRICS_DETAIL_URL,
169
- showClusterMetrics: false,
170
- showVmMetrics: false,
171
- };
172
- },
173
-
174
- computed: {
175
- ...mapGetters(['currentCluster']),
176
-
177
- accessibleResources() {
178
- const inStore = this.$store.getters['currentProduct'].inStore;
179
-
180
- return RESOURCES.filter(resource => this.$store.getters[`${ inStore }/schemaFor`](resource.type));
181
- },
182
-
183
- totalCountGaugeInput() {
184
- const out = {};
185
-
186
- this.accessibleResources.forEach((resource) => {
187
- const counts = resourceCounts(this.$store, resource.type);
188
-
189
- out[resource.type] = { resource: resource.type };
190
-
191
- Object.entries(counts).forEach((entry) => {
192
- out[resource.type][entry[0]] = entry[1];
193
- });
194
-
195
- if (resource.spoofed) {
196
- if (resource.spoofed?.filterNamespace && Array.isArray(resource.spoofed.filterNamespace)) {
197
- const clusterCounts = this.$store.getters['harvester/all'](COUNT)[0].counts;
198
- const statistics = clusterCounts[resource.type] || {};
199
-
200
- for (let i = 0; i < resource.spoofed.filterNamespace.length; i++) {
201
- const nsStatistics = statistics?.namespaces?.[resource.spoofed.filterNamespace[i]] || {};
202
-
203
- if (nsStatistics.count) {
204
- out[resource.type]['useful'] -= nsStatistics.count;
205
- out[resource.type]['total'] -= nsStatistics.count;
206
- }
207
- Object.entries(nsStatistics?.states || {}).forEach((entry) => {
208
- const color = colorForState(entry[0]);
209
- const count = entry[1];
210
- const countName = colorToCountName(color);
211
-
212
- out[resource.type]['useful'] -= count;
213
- out[resource.type][countName] += count;
214
- });
215
- }
216
- }
217
-
218
- out[resource.type] = {
219
- ...out[resource.type],
220
- ...resource.spoofed,
221
- isSpoofed: true
222
- };
223
-
224
- if (out[resource.type].total > 1) {
225
- out[resource.type].name = `${ out[resource.type].name }s`;
226
- }
227
- }
228
- });
229
-
230
- return out;
231
- },
232
-
233
- currentVersion() {
234
- const inStore = this.$store.getters['currentProduct'].inStore;
235
- const settings = this.$store.getters[`${ inStore }/all`](HCI.SETTING);
236
- const setting = settings.find( S => S.id === 'server-version');
237
-
238
- return setting?.value || setting?.default;
239
- },
240
-
241
- firstNodeCreationTimestamp() {
242
- const inStore = this.$store.getters['currentProduct'].inStore;
243
- const days = this.$store.getters[`${ inStore }/all`](NODE).map( (N) => {
244
- return dayjs(N.metadata.creationTimestamp);
245
- });
246
-
247
- if (!days.length) {
248
- return dayjs().utc().format();
249
- }
250
-
251
- return dayjs.min(days).utc().format();
252
- },
253
-
254
- cpusTotal() {
255
- let out = 0;
256
-
257
- this.metricNodes.forEach((node) => {
258
- out += node.cpuCapacity;
259
- });
260
-
261
- return out;
262
- },
263
-
264
- cpusUsageTotal() {
265
- let out = 0;
266
-
267
- this.metricNodes.forEach((node) => {
268
- out += node.cpuUsage;
269
- });
270
-
271
- return out;
272
- },
273
-
274
- memoryTotal() {
275
- let out = 0;
276
-
277
- this.metricNodes.forEach((node) => {
278
- out += node.memoryCapacity;
279
- });
280
-
281
- return out;
282
- },
283
-
284
- memoryUsageTotal() {
285
- let out = 0;
286
-
287
- this.metricNodes.forEach((node) => {
288
- out += node.memoryUsage;
289
- });
290
-
291
- return out;
292
- },
293
-
294
- storageUsage() {
295
- let out = 0;
296
-
297
- (this.longhornNode || []).forEach((node) => {
298
- const diskStatus = node?.status?.diskStatus || {};
299
-
300
- Object.values(diskStatus).map((disk) => {
301
- if (disk?.conditions?.Schedulable?.status === 'True' && disk?.storageAvailable && disk?.storageMaximum) {
302
- out += (disk.storageMaximum - disk.storageAvailable);
303
- }
304
- });
305
- });
306
-
307
- return out;
308
- },
309
-
310
- storageReservedTotal() {
311
- let out = 0;
312
-
313
- (this.longhornNode || []).forEach((node) => {
314
- const disks = node?.spec?.disks || {};
315
-
316
- Object.values(disks).map((disk) => {
317
- if (disk.allowScheduling) {
318
- out += disk.storageReserved;
319
- }
320
- });
321
- });
322
-
323
- return out;
324
- },
325
-
326
- storageTotal() {
327
- let out = 0;
328
-
329
- (this.longhornNode || []).forEach((node) => {
330
- const diskStatus = node?.status?.diskStatus || {};
331
-
332
- Object.values(diskStatus).map((disk) => {
333
- if (disk?.storageMaximum) {
334
- out += disk.storageMaximum;
335
- }
336
- });
337
- });
338
-
339
- return out;
340
- },
341
-
342
- storageUsed() {
343
- return this.createMemoryValues(this.storageTotal, this.storageUsage);
344
- },
345
-
346
- storageReserved() {
347
- return this.createMemoryValues(this.storageTotal, this.storageReservedTotal);
348
- },
349
-
350
- vmEvents() {
351
- return this.events.filter( E => ['VirtualMachineInstance', 'VirtualMachine'].includes(E.involvedObject.kind));
352
- },
353
-
354
- volumeEvents() {
355
- return this.events.filter( E => ['PersistentVolumeClaim'].includes(E.involvedObject.kind));
356
- },
357
-
358
- hostEvents() {
359
- return this.events.filter( E => ['Node'].includes(E.involvedObject.kind));
360
- },
361
-
362
- imageEvents() {
363
- return this.events.filter( E => ['VirtualMachineImage'].includes(E.involvedObject.kind));
364
- },
365
-
366
- hasMetricsTabs() {
367
- return this.showClusterMetrics || this.showVmMetrics;
368
- },
369
-
370
- pods() {
371
- const inStore = this.$store.getters['currentProduct'].inStore;
372
- const pods = this.$store.getters[`${ inStore }/all`](POD) || [];
373
-
374
- return pods.filter(p => p?.metadata?.name !== 'removing');
375
- },
376
-
377
- cpuReserved() {
378
- const useful = this.nodes.reduce((total, node) => {
379
- return total + node.cpuReserved;
380
- }, 0);
381
-
382
- return {
383
- total: this.cpusTotal,
384
- useful,
385
- };
386
- },
387
-
388
- ramReserved() {
389
- const useful = this.nodes.reduce((total, node) => {
390
- return total + node.memoryReserved;
391
- }, 0);
392
-
393
- return createMemoryValues(this.memoryTotal, useful);
394
- },
395
-
396
- availableNodes() {
397
- return (this.metricNodes || []).map(node => node.id);
398
- },
399
-
400
- metricAggregations() {
401
- const nodes = this.nodes;
402
- const someNonWorkerRoles = this.nodes.some(node => node.hasARole && !node.isWorker);
403
- const metrics = this.nodeMetrics.filter((nodeMetrics) => {
404
- const node = nodes.find(nd => nd.id === nodeMetrics.id);
405
-
406
- return node && (!someNonWorkerRoles || node.isWorker);
407
- });
408
- const initialAggregation = {
409
- cpu: 0,
410
- memory: 0
411
- };
412
-
413
- if (isEmpty(metrics)) {
414
- return null;
415
- }
416
-
417
- return metrics.reduce((agg, metric) => {
418
- agg.cpu += parseSi(metric.usage.cpu);
419
- agg.memory += parseSi(metric.usage.memory);
420
-
421
- return agg;
422
- }, initialAggregation);
423
- },
424
-
425
- cpuUsed() {
426
- return {
427
- total: this.cpusTotal,
428
- useful: this.metricAggregations?.cpu,
429
- };
430
- },
431
-
432
- ramUsed() {
433
- return createMemoryValues(this.memoryTotal, this.metricAggregations?.memory);
434
- },
435
-
436
- hasMetricNodeSchema() {
437
- const inStore = this.$store.getters['currentProduct'].inStore;
438
-
439
- return !!this.$store.getters[`${ inStore }/schemaFor`](METRIC.NODE);
440
- },
441
- },
442
-
443
- methods: {
444
- createMemoryValues(total, useful) {
445
- const parsedTotal = parseSi((total || '0').toString());
446
- const parsedUseful = parseSi((useful || '0').toString());
447
- const format = this.createMemoryFormat(parsedTotal);
448
- const formattedTotal = formatSi(parsedTotal, format);
449
- let formattedUseful = formatSi(parsedUseful, {
450
- ...format,
451
- addSuffix: false,
452
- });
453
-
454
- if (!Number.parseFloat(formattedUseful) > 0) {
455
- formattedUseful = formatSi(parsedUseful, {
456
- ...format,
457
- canRoundToZero: false,
458
- });
459
- }
460
-
461
- return {
462
- total: Number(parsedTotal),
463
- useful: Number(parsedUseful),
464
- formattedTotal,
465
- formattedUseful,
466
- units: this.createMemoryUnits(parsedTotal),
467
- };
468
- },
469
-
470
- createMemoryFormat(n) {
471
- const exponent = exponentNeeded(n, PARSE_RULES.memory.format.increment);
472
-
473
- return {
474
- ...PARSE_RULES.memory.format,
475
- maxExponent: exponent,
476
- minExponent: exponent,
477
- };
478
- },
479
-
480
- createMemoryUnits(n) {
481
- const exponent = exponentNeeded(n, PARSE_RULES.memory.format.increment);
482
-
483
- return `${ UNITS[exponent] }${ PARSE_RULES.memory.format.suffix }`;
484
- },
485
-
486
- async fetchClusterResources(type, opt = {}, store) {
487
- const inStore = store || this.$store.getters['currentProduct'].inStore;
488
-
489
- const schema = this.$store.getters[`${ inStore }/schemaFor`](type);
490
-
491
- if (schema) {
492
- try {
493
- const resources = await this.$store.dispatch(`${ inStore }/findAll`, { type, opt });
494
-
495
- return resources;
496
- } catch (err) {
497
- console.error(`Failed fetching cluster resource ${ type } with error:`, err); // eslint-disable-line no-console
498
-
499
- return [];
500
- }
501
- }
502
-
503
- return [];
504
- },
505
-
506
- async loadMetrics() {
507
- this.nodeMetrics = await this.fetchClusterResources(METRIC.NODE, { force: true } );
508
- },
509
- }
510
- };
511
- </script>
512
-
513
- <template>
514
- <Loading v-if="$fetchState.pending" />
515
- <section v-else>
516
- <HarvesterUpgrade />
517
-
518
- <div
519
- class="cluster-dashboard-glance"
520
- >
521
- <div>
522
- <label>
523
- {{ t('harvester.dashboard.version') }}:
524
- </label>
525
- <span>
526
- <span v-tooltip="{content: currentVersion}">
527
- {{ currentVersion }}
528
- </span>
529
- </span>
530
- </div>
531
- <div>
532
- <label>
533
- {{ t('glance.created') }}:
534
- </label>
535
- <span>
536
- <LiveDate
537
- :value="firstNodeCreationTimestamp"
538
- :add-suffix="true"
539
- :show-tooltip="true"
540
- />
541
- </span>
542
- </div>
543
- </div>
544
-
545
- <div class="resource-gauges">
546
- <ResourceSummary
547
- v-for="resource in totalCountGaugeInput"
548
- :key="resource.resource"
549
- :spoofed-counts="resource.isSpoofed ? resource : null"
550
- :resource="resource.resource"
551
- />
552
- </div>
553
-
554
- <template v-if="nodes.length && hasMetricNodeSchema">
555
- <h3 class="mt-40">
556
- {{ t('clusterIndexPage.sections.capacity.label') }}
557
- </h3>
558
- <div
559
- class="hardware-resource-gauges"
560
- :class="{
561
- live: !storageTotal,
562
- }"
563
- >
564
- <HardwareResourceGauge
565
- :name="t('harvester.dashboard.hardwareResourceGauge.cpu')"
566
- :reserved="cpuReserved"
567
- :used="cpuUsed"
568
- />
569
- <HardwareResourceGauge
570
- :name="t('harvester.dashboard.hardwareResourceGauge.memory')"
571
- :reserved="ramReserved"
572
- :used="ramUsed"
573
- />
574
- <HardwareResourceGauge
575
- v-if="storageTotal"
576
- :name="t('harvester.dashboard.hardwareResourceGauge.storage')"
577
- :used="storageUsed"
578
- :reserved="storageReserved"
579
- />
580
- </div>
581
- </template>
582
-
583
- <Tabbed
584
- v-if="hasMetricsTabs"
585
- class="mt-30"
586
- >
587
- <Tab
588
- v-if="showClusterMetrics"
589
- name="cluster-metrics"
590
- :label="t('clusterIndexPage.sections.clusterMetrics.label')"
591
- :weight="99"
592
- >
593
- <template #default="props">
594
- <DashboardMetrics
595
- v-if="props.active"
596
- :detail-url="CLUSTER_METRICS_DETAIL_URL"
597
- :summary-url="CLUSTER_METRICS_SUMMARY_URL"
598
- graph-height="825px"
599
- />
600
- </template>
601
- </Tab>
602
- <Tab
603
- v-if="showVmMetrics"
604
- name="vm-metric"
605
- :label="t('harvester.dashboard.sections.vmMetrics.label')"
606
- :weight="98"
607
- >
608
- <template #default="props">
609
- <DashboardMetrics
610
- v-if="props.active"
611
- :detail-url="VM_DASHBOARD_METRICS_URL"
612
- graph-height="825px"
613
- :has-summary-and-detail="false"
614
- />
615
- </template>
616
- </Tab>
617
- </Tabbed>
618
-
619
- <div class="mb-40 mt-40">
620
- <h3>
621
- {{ t('clusterIndexPage.sections.events.label') }}
622
- </h3>
623
- <Tabbed class="mt-20">
624
- <Tab
625
- name="host"
626
- label="Hosts"
627
- :weight="98"
628
- >
629
- <SortableTable
630
- :rows="hostEvents"
631
- :headers="eventHeaders"
632
- key-field="id"
633
- :search="false"
634
- :table-actions="false"
635
- :row-actions="false"
636
- :paging="true"
637
- :rows-per-page="10"
638
- default-sort-by="date"
639
- >
640
- <template #cell:resource="{row, value}">
641
- <div class="text-info">
642
- {{ value }}
643
- </div>
644
- <div v-if="row.message">
645
- {{ row.displayMessage }}
646
- </div>
647
- </template>
648
- </SortableTable>
649
- </Tab>
650
- <Tab
651
- name="vm"
652
- label="VMs"
653
- :weight="99"
654
- >
655
- <SortableTable
656
- :rows="vmEvents"
657
- :headers="eventHeaders"
658
- key-field="id"
659
- :search="false"
660
- :table-actions="false"
661
- :row-actions="false"
662
- :paging="true"
663
- :rows-per-page="10"
664
- default-sort-by="date"
665
- >
666
- <template #cell:resource="{row, value}">
667
- <div class="text-info">
668
- {{ value }}
669
- </div>
670
- <div v-if="row.message">
671
- {{ row.displayMessage }}
672
- </div>
673
- </template>
674
- </SortableTable>
675
- </Tab>
676
- <Tab
677
- name="volume"
678
- label="Volumes"
679
- :weight="97"
680
- >
681
- <SortableTable
682
- :rows="volumeEvents"
683
- :headers="eventHeaders"
684
- key-field="id"
685
- :search="false"
686
- :table-actions="false"
687
- :row-actions="false"
688
- :paging="true"
689
- :rows-per-page="10"
690
- default-sort-by="date"
691
- >
692
- <template #cell:resource="{row, value}">
693
- <div class="text-info">
694
- {{ value }}
695
- </div>
696
- <div v-if="row.message">
697
- {{ row.displayMessage }}
698
- </div>
699
- </template>
700
- </SortableTable>
701
- </Tab>
702
- <Tab
703
- name="image"
704
- label="Images"
705
- :weight="96"
706
- >
707
- <SortableTable
708
- :rows="imageEvents"
709
- :headers="eventHeaders"
710
- key-field="id"
711
- :search="false"
712
- :table-actions="false"
713
- :row-actions="false"
714
- :paging="true"
715
- :rows-per-page="10"
716
- default-sort-by="date"
717
- >
718
- <template #cell:resource="{row, value}">
719
- <div class="text-info">
720
- {{ value }}
721
- </div>
722
- <div v-if="row.message">
723
- {{ row.displayMessage }}
724
- </div>
725
- </template>
726
- </SortableTable>
727
- </Tab>
728
- </Tabbed>
729
- </div>
730
- </section>
731
- </template>
732
-
733
- <style lang="scss" scoped>
734
- .cluster-dashboard-glance {
735
- border-top: 1px solid var(--border);
736
- border-bottom: 1px solid var(--border);
737
- padding: 20px 0px;
738
- display: flex;
739
-
740
- &>*{
741
- margin-right: 40px;
742
-
743
- & SPAN {
744
- font-weight: bold
745
- }
746
- }
747
- }
748
-
749
- .events {
750
- margin-top: 30px;
751
- }
752
- </style>