@rancher/shell 0.3.0 → 0.3.2

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 (342) hide show
  1. package/assets/styles/global/_button.scss +5 -1
  2. package/assets/styles/global/_columns.scss +4 -0
  3. package/assets/styles/global/_gauges.scss +1 -1
  4. package/assets/styles/global/_layout.scss +5 -2
  5. package/assets/styles/global/_select.scss +1 -4
  6. package/assets/styles/themes/_dark.scss +5 -4
  7. package/assets/styles/themes/_light.scss +4 -3
  8. package/assets/styles/themes/_suse.scss +1 -1
  9. package/assets/styles/vendor/vue-select.scss +4 -3
  10. package/assets/translations/en-us.yaml +673 -73
  11. package/assets/translations/zh-hans.yaml +720 -207
  12. package/chart/monitoring/steps/uninstall-v1.vue +2 -2
  13. package/cloud-credential/azure.vue +23 -0
  14. package/cloud-credential/harvester.vue +25 -62
  15. package/cloud-credential/pnap.vue +80 -0
  16. package/components/.DS_Store +0 -0
  17. package/components/ActionMenu.vue +28 -7
  18. package/components/AdvancedSection.vue +9 -2
  19. package/components/Alert.vue +2 -2
  20. package/components/ButtonDropdown.vue +0 -2
  21. package/components/ButtonGroup.vue +1 -0
  22. package/components/CollapsibleCard.vue +0 -1
  23. package/components/CruResource.vue +41 -4
  24. package/components/DetailTop.vue +72 -4
  25. package/components/DisableAuthProviderModal.vue +106 -0
  26. package/{rancher-components/components/Utils/DraggableZone → components}/DraggableZone.vue +0 -0
  27. package/components/ExplorerMembers.vue +253 -30
  28. package/components/ExplorerProjectsNamespaces.vue +77 -33
  29. package/components/ExtensionPanel.vue +42 -0
  30. package/components/GrowlManager.vue +3 -3
  31. package/components/IconOrSvg.vue +178 -0
  32. package/components/LogItem.vue +69 -0
  33. package/components/PodSecurityAdmission.vue +302 -0
  34. package/components/PromptModal.vue +1 -0
  35. package/components/ResourceDetail/Masthead.vue +69 -4
  36. package/components/ResourceDetail/index.vue +12 -5
  37. package/components/ResourceList/Masthead.vue +11 -1
  38. package/components/ResourceList/ResourceLoadingIndicator.vue +12 -2
  39. package/components/ResourceList/index.vue +66 -12
  40. package/components/ResourceList/resource-list.config.js +7 -0
  41. package/components/ResourceTable.vue +33 -6
  42. package/components/SimpleBox.vue +1 -1
  43. package/components/SortableTable/THead.vue +21 -14
  44. package/components/SortableTable/filtering.js +1 -1
  45. package/components/SortableTable/index.vue +21 -10
  46. package/components/SortableTable/selection.js +15 -3
  47. package/components/Tabbed/Tab.vue +1 -1
  48. package/components/Tabbed/index.vue +20 -15
  49. package/components/__tests__/.DS_Store +0 -0
  50. package/components/__tests__/AsyncButton.test.ts +140 -0
  51. package/components/__tests__/BackLink.test.ts +33 -0
  52. package/components/__tests__/ButtonGroup.test.ts +124 -0
  53. package/components/__tests__/ClusterBadge.test.ts +32 -0
  54. package/components/__tests__/CollapsibleCard.test.ts +64 -0
  55. package/components/__tests__/ConsumptionGauge.test.ts +88 -0
  56. package/components/__tests__/CruResource.test.ts +3 -2
  57. package/components/__tests__/FixedBanner.test.ts +129 -0
  58. package/components/__tests__/GrowlManager.test.ts +147 -0
  59. package/components/__tests__/NamespaceFilter.test.ts +33 -25
  60. package/components/__tests__/PercentageBar.test.ts +32 -0
  61. package/components/__tests__/PodSecurityAdmission.test.ts +398 -0
  62. package/components/auth/AuthBanner.vue +20 -10
  63. package/components/auth/RoleDetailEdit.vue +26 -17
  64. package/components/auth/SelectPrincipal.vue +36 -5
  65. package/components/form/ArrayList.vue +3 -35
  66. package/components/form/ArrayListGrouped.vue +13 -4
  67. package/components/form/ArrayListSelect.vue +5 -5
  68. package/components/form/Error.vue +8 -0
  69. package/components/form/KeyValue.vue +39 -7
  70. package/components/form/LabeledSelect.vue +5 -2
  71. package/components/form/Labels.vue +46 -16
  72. package/components/form/Members/ClusterPermissionsEditor.vue +17 -17
  73. package/components/form/Members/MembershipEditor.vue +12 -12
  74. package/components/form/NameNsDescription.vue +1 -1
  75. package/components/form/NodeScheduling.vue +1 -1
  76. package/components/form/Probe.vue +3 -3
  77. package/components/form/ResourceQuota/Project.vue +6 -6
  78. package/components/form/ResourceTabs/index.vue +24 -6
  79. package/components/form/Security.vue +7 -6
  80. package/components/form/Select.vue +3 -2
  81. package/components/form/SelectOrCreateAuthSecret.vue +22 -29
  82. package/components/form/ServicePorts.vue +8 -0
  83. package/components/form/WorkloadPorts.vue +7 -1
  84. package/components/form/__tests__/ArrayList.test.ts +74 -0
  85. package/components/form/__tests__/ArrayListGrouped.test.ts +6 -4
  86. package/components/formatter/Checked.vue +1 -1
  87. package/components/formatter/ClusterLink.vue +5 -0
  88. package/components/formatter/IconIsDefault.vue +2 -2
  89. package/components/formatter/InternalExternalIP.vue +11 -8
  90. package/components/formatter/LiveDuration.vue +78 -0
  91. package/components/formatter/WorkloadHealthScale.vue +5 -3
  92. package/components/nav/Header.vue +74 -7
  93. package/components/nav/NamespaceFilter.vue +146 -63
  94. package/components/nav/TopLevelMenu.vue +22 -19
  95. package/components/nav/WindowManager/ContainerLogs.vue +83 -126
  96. package/components/nav/WindowManager/ContainerShell.vue +9 -7
  97. package/components/nav/WindowManager/Window.vue +2 -0
  98. package/components/nav/WindowManager/index.vue +10 -0
  99. package/config/elemental-types.js +9 -0
  100. package/config/features.js +2 -0
  101. package/config/home-links.js +4 -1
  102. package/config/pod-security-admission.ts +82 -0
  103. package/config/product/apps.js +1 -1
  104. package/config/product/auth.js +6 -5
  105. package/config/product/backup.js +1 -1
  106. package/config/product/explorer.js +6 -6
  107. package/config/product/fleet.js +1 -1
  108. package/config/product/manager.js +6 -2
  109. package/config/query-params.js +1 -0
  110. package/config/secret.js +0 -1
  111. package/config/settings.ts +26 -9
  112. package/config/table-headers.js +22 -11
  113. package/config/types.js +4 -1
  114. package/config/uiplugins.js +3 -3
  115. package/content/docs/zh-hans/getting-started.md +113 -137
  116. package/content/docs/zh-hans/whats-new.md +8 -46
  117. package/core/plugin-helpers.js +171 -0
  118. package/core/plugin.ts +61 -1
  119. package/core/plugins.js +33 -0
  120. package/core/types.ts +128 -2
  121. package/creators/pkg/package-lock.json +37 -0
  122. package/creators/pkg/package.json +1 -1
  123. package/detail/catalog.cattle.io.app.vue +1 -1
  124. package/detail/pod.vue +1 -1
  125. package/detail/provisioning.cattle.io.cluster.vue +35 -9
  126. package/detail/service.vue +2 -9
  127. package/detail/workload/index.vue +0 -1
  128. package/dialog/AddClusterMemberDialog.vue +22 -28
  129. package/dialog/AddProjectMemberDialog.vue +53 -9
  130. package/dialog/DiagnosticTimingsDialog.vue +8 -7
  131. package/dialog/DrainNode.vue +44 -48
  132. package/dialog/ForceMachineRemoveDialog.vue +5 -7
  133. package/dialog/GenericPrompt.vue +15 -20
  134. package/dialog/RollbackWorkloadDialog.vue +15 -46
  135. package/dialog/RotateCertificatesDialog.vue +5 -7
  136. package/dialog/RotateEncryptionKeyDialog.vue +5 -9
  137. package/dialog/SaveAsRKETemplateDialog.vue +5 -13
  138. package/dialog/ScaleMachineDownDialog.vue +1 -1
  139. package/dialog/ScalePoolDownDialog.vue +121 -0
  140. package/edit/__tests__/management.cattle.io.setting.test.ts +3 -3
  141. package/edit/auth/azuread.vue +16 -16
  142. package/edit/auth/github.vue +8 -0
  143. package/edit/auth/googleoauth.vue +10 -1
  144. package/edit/auth/ldap/index.vue +10 -0
  145. package/edit/auth/oidc.vue +10 -0
  146. package/edit/auth/saml.vue +10 -0
  147. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
  148. package/edit/catalog.cattle.io.clusterrepo.vue +3 -0
  149. package/edit/cloudcredential.vue +3 -7
  150. package/edit/logging-flow/Match.vue +39 -8
  151. package/edit/logging-flow/index.vue +27 -4
  152. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +107 -0
  153. package/edit/management.cattle.io.project.vue +8 -1
  154. package/edit/management.cattle.io.setting.vue +5 -2
  155. package/edit/management.cattle.io.user.vue +7 -1
  156. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +36 -8
  157. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +2 -2
  158. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +14 -6
  159. package/edit/namespace.vue +18 -4
  160. package/edit/networking.k8s.io.ingress/Certificate.vue +1 -0
  161. package/edit/networking.k8s.io.ingress/IngressClass.vue +8 -6
  162. package/edit/networking.k8s.io.ingress/RulePath.vue +12 -6
  163. package/edit/networking.k8s.io.ingress/index.vue +8 -6
  164. package/edit/persistentvolume/index.vue +30 -27
  165. package/edit/persistentvolume/plugins/cephfs.vue +29 -29
  166. package/edit/persistentvolume/plugins/csi.vue +102 -62
  167. package/edit/persistentvolume/plugins/fc.vue +19 -19
  168. package/edit/persistentvolume/plugins/iscsi.vue +45 -45
  169. package/edit/persistentvolume/plugins/rbd.vue +39 -39
  170. package/edit/persistentvolumeclaim.vue +78 -75
  171. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +11 -7
  172. package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +10 -1
  173. package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +87 -27
  174. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +3 -6
  175. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +96 -0
  176. package/edit/provisioning.cattle.io.cluster/import.vue +1 -1
  177. package/edit/provisioning.cattle.io.cluster/index.vue +29 -6
  178. package/edit/provisioning.cattle.io.cluster/rke2.vue +445 -154
  179. package/edit/secret/index.vue +3 -7
  180. package/edit/service.vue +3 -1
  181. package/edit/storage.k8s.io.storageclass/index.vue +100 -16
  182. package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +114 -0
  183. package/edit/workload/__tests__/index.test.ts +98 -0
  184. package/edit/workload/index.vue +58 -8
  185. package/edit/workload/mixins/workload.js +107 -70
  186. package/edit/workload/storage/ContainerMountPaths.vue +0 -10
  187. package/edit/workload/storage/emptyDir.vue +88 -0
  188. package/edit/workload/storage/ephemeralVolume/index.vue +1 -1
  189. package/edit/workload/storage/index.vue +8 -0
  190. package/edit/workload/storage/persistentVolumeClaim/index.vue +1 -1
  191. package/layouts/default.vue +57 -44
  192. package/list/__tests__/workload.test.ts +5 -2
  193. package/list/catalog.cattle.io.app.vue +1 -0
  194. package/list/cis.cattle.io.clusterscan.vue +1 -0
  195. package/list/fleet.cattle.io.bundle.vue +5 -6
  196. package/list/fleet.cattle.io.cluster.vue +6 -3
  197. package/list/fleet.cattle.io.clusterregistrationtoken.vue +5 -6
  198. package/list/fleet.cattle.io.gitrepo.vue +4 -9
  199. package/list/helm.cattle.io.projecthelmchart.vue +1 -5
  200. package/list/logging.banzaicloud.io.clusterflow.vue +4 -1
  201. package/list/logging.banzaicloud.io.flow.vue +6 -5
  202. package/list/management.cattle.io.cluster.vue +1 -0
  203. package/list/management.cattle.io.feature.vue +3 -4
  204. package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +47 -0
  205. package/list/management.cattle.io.setting.vue +2 -2
  206. package/list/management.cattle.io.user.vue +4 -10
  207. package/list/monitoring.coreos.com.alertmanagerconfig.vue +2 -7
  208. package/list/node.vue +8 -5
  209. package/list/persistentvolume.vue +3 -3
  210. package/list/persistentvolumeclaim.vue +3 -4
  211. package/list/provisioning.cattle.io.cluster.vue +18 -19
  212. package/list/service.vue +6 -14
  213. package/list/workload.vue +43 -38
  214. package/machine-config/azure.vue +429 -60
  215. package/machine-config/pnap.vue +288 -0
  216. package/mixins/auth-config.js +1 -3
  217. package/mixins/browser-tab-visibility.js +8 -14
  218. package/mixins/chart.js +1 -1
  219. package/mixins/create-edit-view/impl.js +4 -0
  220. package/mixins/create-edit-view/index.js +4 -2
  221. package/mixins/resource-fetch-namespaced.js +98 -0
  222. package/mixins/resource-fetch.js +79 -45
  223. package/mixins/resource-manager.js +1 -23
  224. package/models/apps.controllerrevision.js +7 -0
  225. package/models/apps.daemonset.js +18 -0
  226. package/models/apps.deployment.js +44 -0
  227. package/models/apps.replicaset.js +7 -0
  228. package/models/apps.statefulset.js +18 -0
  229. package/models/batch.job.js +7 -14
  230. package/models/cluster/node.js +10 -2
  231. package/models/cluster.x-k8s.io.machine.js +26 -4
  232. package/models/cluster.x-k8s.io.machinedeployment.js +12 -2
  233. package/models/event.js +7 -0
  234. package/models/logging.banzaicloud.io.flow.js +4 -0
  235. package/models/management.cattle.io.cluster.js +1 -1
  236. package/models/management.cattle.io.clusterroletemplatebinding.js +1 -1
  237. package/models/management.cattle.io.globalrole.js +2 -2
  238. package/models/management.cattle.io.node.js +37 -2
  239. package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.ts +4 -0
  240. package/models/management.cattle.io.project.js +30 -11
  241. package/models/management.cattle.io.setting.js +1 -1
  242. package/models/management.cattle.io.user.js +37 -1
  243. package/models/namespace.js +42 -5
  244. package/models/persistentvolume.js +14 -2
  245. package/models/pod.js +15 -0
  246. package/models/projectroletemplatebinding.js +7 -0
  247. package/models/provisioning.cattle.io.cluster.js +61 -10
  248. package/models/rke-machine.cattle.io.pnapmachinetemplate.js +15 -0
  249. package/models/service.js +14 -13
  250. package/models/storage.k8s.io.storageclass.js +33 -18
  251. package/models/workload.js +38 -7
  252. package/nuxt.config.js +27 -17
  253. package/package.json +7 -7
  254. package/pages/about.vue +14 -2
  255. package/pages/c/_cluster/apps/charts/index.vue +21 -3
  256. package/pages/c/_cluster/apps/charts/install.vue +59 -22
  257. package/pages/c/_cluster/auth/config/_id.vue +6 -0
  258. package/pages/c/_cluster/auth/config/index.vue +8 -6
  259. package/pages/c/_cluster/auth/group.principal/assign-edit.vue +1 -1
  260. package/pages/c/_cluster/auth/roles/index.vue +1 -1
  261. package/pages/c/_cluster/explorer/index.vue +51 -6
  262. package/pages/c/_cluster/longhorn/index.vue +1 -1
  263. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +15 -4
  264. package/pages/c/_cluster/monitoring/index.vue +1 -1
  265. package/pages/c/_cluster/neuvector/index.vue +1 -1
  266. package/pages/c/_cluster/settings/performance.vue +48 -2
  267. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +2 -0
  268. package/pages/c/_cluster/uiplugins/InstallDialog.vue +3 -0
  269. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +42 -2
  270. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +2 -0
  271. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +1 -0
  272. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +2 -0
  273. package/pages/c/_cluster/uiplugins/index.vue +42 -3
  274. package/pages/diagnostic.vue +5 -4
  275. package/pages/home.vue +105 -30
  276. package/pages/prefs.vue +23 -12
  277. package/pages/rio/mesh.vue +1 -1
  278. package/pkg/dynamic-importer.lib.js +8 -0
  279. package/pkg/vue.config.js +4 -0
  280. package/plugins/dashboard-store/__tests__/mutations.spec.js +406 -0
  281. package/plugins/dashboard-store/actions.js +32 -25
  282. package/plugins/dashboard-store/getters.js +50 -33
  283. package/plugins/dashboard-store/mutations.js +134 -28
  284. package/plugins/dashboard-store/resource-class.js +37 -42
  285. package/plugins/steve/actions.js +30 -0
  286. package/plugins/steve/caches/resourceCache.js +60 -0
  287. package/plugins/steve/getters.js +44 -1
  288. package/plugins/steve/mutations.js +97 -36
  289. package/plugins/steve/resourceWatcher.js +277 -0
  290. package/plugins/steve/schema.utils.js +25 -0
  291. package/plugins/steve/subscribe.js +288 -115
  292. package/plugins/steve/worker/index.js +17 -0
  293. package/plugins/steve/worker/web-worker.advanced.js +302 -0
  294. package/plugins/steve/{web-worker.steve-sub-worker.js → worker/web-worker.basic.js} +3 -44
  295. package/rancher-components/Card/Card.vue +3 -3
  296. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +1 -0
  297. package/rancher-components/StringList/StringList.test.ts +45 -420
  298. package/rancher-components/StringList/StringList.vue +1 -10
  299. package/rancher-components/components/Banner/Banner.test.ts +44 -0
  300. package/rancher-components/components/Banner/Banner.vue +130 -61
  301. package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +13 -22
  302. package/rancher-components/components/Form/Checkbox/Checkbox.vue +8 -6
  303. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +9 -9
  304. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +0 -1
  305. package/rancher-components/components/StringList/StringList.test.ts +7 -7
  306. package/rancher-components/components/StringList/StringList.vue +21 -15
  307. package/scripts/test-plugins-build.sh +8 -0
  308. package/static/loading-indicator.html +1 -1
  309. package/store/action-menu.js +4 -3
  310. package/store/index.js +54 -3
  311. package/store/plugins.js +0 -17
  312. package/store/pnap.js +128 -0
  313. package/store/prefs.js +4 -2
  314. package/store/type-map.js +81 -13
  315. package/types/pod-security-admission.ts +36 -0
  316. package/types/shell/index.d.ts +497 -396
  317. package/utils/__tests__/object.test.ts +17 -1
  318. package/utils/__tests__/pod-security-admission.test.ts +61 -0
  319. package/utils/async.ts +36 -0
  320. package/utils/color.js +45 -0
  321. package/utils/crypto/browserHashUtils.js +18 -0
  322. package/utils/dynamic-importer.js +8 -0
  323. package/utils/install-redirect.js +1 -1
  324. package/utils/object.js +24 -0
  325. package/utils/pod-security-admission.ts +39 -0
  326. package/utils/socket.js +61 -24
  327. package/utils/string.js +2 -0
  328. package/utils/svg-filter.js +301 -0
  329. package/utils/time.js +49 -0
  330. package/utils/validators/cidr.js +4 -0
  331. package/utils/validators/formRules/__tests__/index.test.ts +23 -3
  332. package/utils/validators/formRules/index.ts +14 -0
  333. package/config/product/harvester-manager.js +0 -162
  334. package/edit/harvesterhci.io.management.cluster.vue +0 -153
  335. package/list/harvesterhci.io.management.cluster.vue +0 -241
  336. package/machine-config/harvester.vue +0 -693
  337. package/models/harvesterhci.io.management.cluster.js +0 -228
  338. package/pages/c/_cluster/harvesterManager/index.vue +0 -24
  339. package/rancher-components/Card/Card.test.ts +0 -39
  340. package/rancher-components/Utils/DraggableZone/DraggableZone.vue +0 -181
  341. package/rancher-components/Utils/DraggableZone/index.ts +0 -1
  342. package/rancher-components/components/Utils/DraggableZone/index.ts +0 -1
@@ -3,17 +3,16 @@ import { saveAs } from 'file-saver';
3
3
  import AnsiUp from 'ansi_up';
4
4
  import { addParams } from '@shell/utils/url';
5
5
  import { base64Decode } from '@shell/utils/crypto';
6
- import {
7
- LOGS_RANGE, LOGS_TIME, LOGS_WRAP, DATE_FORMAT, TIME_FORMAT
8
- } from '@shell/store/prefs';
6
+ import { LOGS_RANGE, LOGS_TIME, LOGS_WRAP } from '@shell/store/prefs';
9
7
  import LabeledSelect from '@shell/components/form/LabeledSelect';
10
8
  import { Checkbox } from '@components/Form/Checkbox';
11
9
  import AsyncButton from '@shell/components/AsyncButton';
12
10
  import Select from '@shell/components/form/Select';
13
- import day from 'dayjs';
11
+ import VirtualList from 'vue-virtual-scroll-list';
12
+ import LogItem from '@shell/components/LogItem';
14
13
 
15
- import { escapeHtml, escapeRegex } from '@shell/utils/string';
16
- import { HARVESTER_NAME as VIRTUAL } from '@shell/config/product/harvester-manager';
14
+ import { escapeRegex } from '@shell/utils/string';
15
+ import { HARVESTER_NAME as VIRTUAL } from '@shell/config/features';
17
16
 
18
17
  import Socket, {
19
18
  EVENT_CONNECTED,
@@ -29,7 +28,12 @@ const ansiup = new AnsiUp();
29
28
 
30
29
  export default {
31
30
  components: {
32
- Window, Select, LabeledSelect, Checkbox, AsyncButton
31
+ Window,
32
+ Select,
33
+ LabeledSelect,
34
+ Checkbox,
35
+ AsyncButton,
36
+ VirtualList,
33
37
  },
34
38
 
35
39
  props: {
@@ -82,6 +86,7 @@ export default {
82
86
  backlog: [],
83
87
  lines: [],
84
88
  now: new Date(),
89
+ logItem: LogItem
85
90
  };
86
91
  },
87
92
 
@@ -207,13 +212,6 @@ export default {
207
212
  }
208
213
 
209
214
  return out;
210
- },
211
-
212
- timeFormatStr() {
213
- const dateFormat = escapeHtml( this.$store.getters['prefs/get'](DATE_FORMAT));
214
- const timeFormat = escapeHtml( this.$store.getters['prefs/get'](TIME_FORMAT));
215
-
216
- return `${ dateFormat } ${ timeFormat }`;
217
215
  }
218
216
  },
219
217
 
@@ -221,17 +219,15 @@ export default {
221
219
  container() {
222
220
  this.connect();
223
221
  },
222
+
224
223
  },
225
224
 
226
225
  beforeDestroy() {
227
- this.$refs.body.removeEventListener('scroll', this.boundUpdateFollowing);
228
226
  this.cleanup();
229
227
  },
230
228
 
231
229
  async mounted() {
232
230
  await this.connect();
233
- this.boundUpdateFollowing = this.updateFollowing.bind(this);
234
- this.$refs.body.addEventListener('scroll', this.boundUpdateFollowing);
235
231
  this.boundFlush = this.flush.bind(this);
236
232
  this.timerFlush = setInterval(this.boundFlush, 100);
237
233
  },
@@ -244,7 +240,7 @@ export default {
244
240
  this.lines = [];
245
241
  }
246
242
 
247
- const params = {
243
+ let params = {
248
244
  previous: this.previous,
249
245
  follow: true,
250
246
  timestamps: true,
@@ -255,36 +251,9 @@ export default {
255
251
  params.container = this.container;
256
252
  }
257
253
 
258
- const range = `${ this.range }`.trim().toLowerCase();
259
- const match = range.match(/^(\d+)?\s*(.*?)s?$/);
254
+ const rangeParams = this.parseRange(this.range);
260
255
 
261
- if ( match ) {
262
- const count = parseInt(match[1], 10) || 1;
263
- const unit = match[2];
264
-
265
- switch ( unit ) {
266
- case 'all':
267
- // Do nothing
268
- break;
269
- case 'line':
270
- params.tailLines = count;
271
- break;
272
- case 'second':
273
- params.sinceSeconds = count;
274
- break;
275
- case 'minute':
276
- params.sinceSeconds = count * 60;
277
- break;
278
- case 'hour':
279
- params.sinceSeconds = count * 60 * 60;
280
- break;
281
- case 'day':
282
- params.sinceSeconds = count * 60 * 60 * 24;
283
- break;
284
- }
285
- } else {
286
- params.tailLines = 100;
287
- }
256
+ params = { ...params, ...rangeParams };
288
257
 
289
258
  let url = this.url || `${ this.pod.links.view }/log`;
290
259
 
@@ -322,12 +291,16 @@ export default {
322
291
  }
323
292
  }
324
293
 
325
- this.backlog.push({
294
+ const parsedLine = {
326
295
  id: lastId++,
327
296
  msg: ansiup.ansi_to_html(msg),
328
297
  rawMsg: msg,
329
298
  time,
330
- });
299
+ };
300
+
301
+ Object.freeze(parsedLine);
302
+
303
+ this.backlog.push(parsedLine);
331
304
  });
332
305
 
333
306
  this.socket.connect();
@@ -337,6 +310,11 @@ export default {
337
310
  if ( this.backlog.length ) {
338
311
  this.lines.push(...this.backlog);
339
312
  this.backlog = [];
313
+ const maxLines = this.parseRange(this.range)?.tailLines;
314
+
315
+ if (maxLines && this.lines.length > maxLines) {
316
+ this.lines = this.lines.slice(-maxLines);
317
+ }
340
318
  }
341
319
 
342
320
  if ( this.isFollowing ) {
@@ -347,14 +325,17 @@ export default {
347
325
  },
348
326
 
349
327
  updateFollowing() {
350
- const el = this.$refs.body;
328
+ const virtualList = this.$refs.virtualList;
351
329
 
352
- this.isFollowing = el.scrollTop + el.clientHeight + 2 >= el.scrollHeight;
330
+ if (virtualList) {
331
+ this.isFollowing = virtualList.getScrollSize() - virtualList.getClientSize() === virtualList.getOffset();
332
+ }
353
333
  },
354
334
 
355
335
  parseRange(range) {
356
- range = `${ range }`.toLowerCase();
357
- const match = range.match(/^(\d+)?\s*(.*)s?$/);
336
+ range = `${ range }`.trim().toLowerCase();
337
+ const match = range.match(/^(\d+)?\s*(.*?)s?$/);
338
+
358
339
  const out = {};
359
340
 
360
341
  if ( match ) {
@@ -363,7 +344,6 @@ export default {
363
344
 
364
345
  switch ( unit ) {
365
346
  case 'all':
366
- out.tailLines = -1;
367
347
  break;
368
348
  case 'line':
369
349
  out.tailLines = count;
@@ -419,9 +399,11 @@ export default {
419
399
  },
420
400
 
421
401
  follow() {
422
- const el = this.$refs.body;
402
+ const virtualList = this.$refs.virtualList;
423
403
 
424
- el.scrollTop = el.scrollHeight;
404
+ if (virtualList) {
405
+ virtualList.$el.scrollTop = virtualList.getScrollSize();
406
+ }
425
407
  },
426
408
 
427
409
  toggleWrap(on) {
@@ -446,20 +428,11 @@ export default {
446
428
  this.connect();
447
429
  },
448
430
 
449
- format(time) {
450
- if ( !time ) {
451
- return '';
452
- }
453
-
454
- return day(time).format(this.timeFormatStr);
455
- },
456
-
457
431
  cleanup() {
458
432
  if ( this.socket ) {
459
433
  this.socket.disconnect();
460
434
  this.socket = null;
461
435
  }
462
-
463
436
  clearInterval(this.timerFlush);
464
437
  },
465
438
  },
@@ -490,7 +463,7 @@ export default {
490
463
  />
491
464
  </template>
492
465
  </Select>
493
- <div class="log-action ml-5">
466
+ <div class="log-action log-action-group ml-5">
494
467
  <button
495
468
  class="btn bg-primary wm-btn"
496
469
  :disabled="isFollowing"
@@ -530,7 +503,7 @@ export default {
530
503
  </div>
531
504
  </div>
532
505
 
533
- <div class="log-action ml-5">
506
+ <div class="log-action log-action-group ml-5">
534
507
  <v-popover
535
508
  trigger="click"
536
509
  placement="top"
@@ -570,7 +543,7 @@ export default {
570
543
  </v-popover>
571
544
  </div>
572
545
 
573
- <div class="log-action ml-5">
546
+ <div class="log-action log-action-group ml-5">
574
547
  <input
575
548
  v-model="search"
576
549
  class="input-sm"
@@ -592,44 +565,25 @@ export default {
592
565
  ref="body"
593
566
  :class="{'logs-container': true, 'open': isOpen, 'closed': !isOpen, 'show-times': timestamps && filtered.length, 'wrap-lines': wrap}"
594
567
  >
595
- <table
596
- class="fixed"
597
- cellpadding="0"
598
- cellspacing="0"
599
- >
600
- <tbody class="logs-body">
601
- <template v-if="filtered.length">
602
- <tr
603
- v-for="line in filtered"
604
- :key="line.id"
605
- >
606
- <td
607
- :key="line.id + '-time'"
608
- class="time"
609
- v-html="format(line.time)"
610
- />
611
- <td
612
- :key="line.id + '-msg'"
613
- class="msg"
614
- v-html="line.msg"
615
- />
616
- </tr>
617
- </template>
618
- <tr v-else-if="search">
619
- <td
620
- v-t="'wm.containerLogs.noMatch'"
621
- colspan="2"
622
- class="msg text-muted"
623
- />
624
- </tr>
625
- <tr
626
- v-else
627
- v-t="'wm.containerLogs.noData'"
628
- colspan="2"
629
- class="msg text-muted"
630
- />
631
- </tbody>
632
- </table>
568
+ <VirtualList
569
+ v-show="filtered.length"
570
+ ref="virtualList"
571
+ data-key="id"
572
+ :data-sources="filtered"
573
+ :data-component="logItem"
574
+ direction="vertical"
575
+ class="virtual-list"
576
+ :keeps="200"
577
+ @scroll="updateFollowing"
578
+ />
579
+ <template v-if="!filtered.length">
580
+ <div v-if="search">
581
+ <span class="msg text-muted">{{ t('wm.containerLogs.noMatch') }}</span>
582
+ </div>
583
+ <div v-else>
584
+ <span class="msg text-muted">{{ t('wm.containerLogs.noData') }}</span>
585
+ </div>
586
+ </template>
633
587
  </div>
634
588
  </template>
635
589
  </Window>
@@ -649,7 +603,7 @@ export default {
649
603
  }
650
604
  }
651
605
 
652
- .logs-container {
606
+ .logs-container{
653
607
  height: 100%;
654
608
  overflow: auto;
655
609
  padding: 5px;
@@ -661,31 +615,15 @@ export default {
661
615
  opacity: 0.25;
662
616
  }
663
617
 
664
- .time {
665
- white-space: nowrap;
666
- display: none;
667
- width: 0;
668
- padding-right: 15px;
669
- user-select: none;
618
+ &.wrap-lines ::v-deep .msg {
619
+ white-space: pre-wrap;
670
620
  }
671
621
 
672
- &.show-times .time {
622
+ &.show-times ::v-deep .time {
673
623
  display: initial;
674
624
  width: auto;
675
625
  }
676
626
 
677
- .msg {
678
- white-space: pre;
679
-
680
- .highlight {
681
- color: var(--logs-highlight);
682
- background-color: var(--logs-highlight-bg);
683
- }
684
- }
685
-
686
- &.wrap-lines .msg {
687
- white-space: pre-wrap;
688
- }
689
627
  }
690
628
 
691
629
  .containerPicker {
@@ -693,6 +631,7 @@ export default {
693
631
  display: inline-block;
694
632
  min-width: 200px;
695
633
  height: 30px;
634
+ min-height: 30px;
696
635
  width: initial;
697
636
  }
698
637
  }
@@ -716,10 +655,23 @@ export default {
716
655
  }
717
656
  }
718
657
 
658
+ .log-action-group {
659
+ display: flex;
660
+ gap: 3px;
661
+
662
+ .input-sm {
663
+ min-width: 180px;
664
+ }
665
+ }
666
+
719
667
  .log-previous {
720
668
  align-items: center;
721
669
  display: flex;
670
+ min-width: 175px;
722
671
  height: 30px;
672
+ text-overflow : ellipsis;
673
+ overflow : hidden;
674
+ white-space : nowrap;
723
675
  }
724
676
 
725
677
  .status {
@@ -736,6 +688,11 @@ export default {
736
688
  }
737
689
  }
738
690
 
691
+ .virtual-list {
692
+ overflow-y: auto;
693
+ height:100%;
694
+ }
695
+
739
696
  @media only screen and (max-width: 1060px) {
740
697
  .wm-button-bar {
741
698
  .wm-btn {
@@ -82,9 +82,10 @@ export default {
82
82
  computed: {
83
83
  xtermConfig() {
84
84
  return {
85
- cursorBlink: true,
86
- useStyle: true,
87
- fontSize: 12,
85
+ allowProposedApi: true,
86
+ cursorBlink: true,
87
+ useStyle: true,
88
+ fontSize: 12,
88
89
  };
89
90
  },
90
91
 
@@ -157,10 +158,10 @@ export default {
157
158
 
158
159
  const terminal = new xterm.Terminal({
159
160
  theme: {
160
- background: docStyle.getPropertyValue('--terminal-bg').trim(),
161
- cursor: docStyle.getPropertyValue('--terminal-cursor').trim(),
162
- selection: docStyle.getPropertyValue('--terminal-selection').trim(),
163
- foreground: docStyle.getPropertyValue('--terminal-text').trim(),
161
+ background: docStyle.getPropertyValue('--terminal-bg').trim(),
162
+ foreground: docStyle.getPropertyValue('--terminal-text').trim(),
163
+ cursor: docStyle.getPropertyValue('--terminal-cursor').trim(),
164
+ selectionBackground: docStyle.getPropertyValue('--terminal-selection').trim(),
164
165
  },
165
166
  ...this.xtermConfig,
166
167
  });
@@ -440,6 +441,7 @@ export default {
440
441
  display: inline-block;
441
442
  min-width: 200px;
442
443
  height: 30px;
444
+ min-height: 30px;
443
445
  width: initial;
444
446
  }
445
447
  }
@@ -93,6 +93,8 @@ export default {
93
93
  vertical-align: middle;
94
94
  // line-height: $title-height - 4px;
95
95
  padding: 10px;
96
+ overflow-x: auto;
97
+ overflow-y: hidden;
96
98
  }
97
99
 
98
100
  .body {
@@ -295,6 +295,10 @@ export default {
295
295
  }
296
296
 
297
297
  return this.component[tab.component];
298
+ },
299
+
300
+ emitDraggable(event) {
301
+ this.$emit('draggable', event);
298
302
  }
299
303
  }
300
304
  };
@@ -312,6 +316,8 @@ export default {
312
316
  :class="{
313
317
  'resizer-left': userPin == 'left',
314
318
  }"
319
+ @mousedown="emitDraggable(true)"
320
+ @mouseup="emitDraggable(false)"
315
321
  >
316
322
  <div
317
323
  v-if="userPin == 'right'"
@@ -362,6 +368,10 @@ export default {
362
368
  :key="tab.id"
363
369
  class="body"
364
370
  :class="{'active': tab.id === active}"
371
+ draggable="false"
372
+ @dragstart.prevent.stop
373
+ @dragend.prevent.stop
374
+ @mouseover="emitDraggable(false)"
365
375
  >
366
376
  <component
367
377
  :is="componentFor(tab)"
@@ -0,0 +1,9 @@
1
+ export const ELEMENTAL_PRODUCT_NAME = 'elemental';
2
+ export const ELEMENTAL_CLUSTER_PROVIDER = 'machineinventoryselectortemplate';
3
+
4
+ export const ELEMENTAL_SCHEMA_IDS = {
5
+ MACHINE_INVENTORIES: 'elemental.cattle.io.machineinventory',
6
+ MACHINE_INV_SELECTOR_TEMPLATES: 'elemental.cattle.io.machineinventoryselectortemplate',
7
+ };
8
+
9
+ export const KIND = { MACHINE_INV_SELECTOR_TEMPLATES: 'MachineInventorySelectorTemplate' };
@@ -1,3 +1,5 @@
1
1
  export const ONE_WAY = [
2
2
  'token-hashing', 'multi-cluster-management'
3
3
  ];
4
+
5
+ export const HARVESTER_NAME = 'harvester';
@@ -48,7 +48,10 @@ export async function fetchLinks(store, hasSupport, isSupportPage, t) {
48
48
  try {
49
49
  const uiLinksSetting = await store.dispatch('management/find', { type: MANAGEMENT.SETTING, id: SETTING.UI_CUSTOM_LINKS });
50
50
 
51
- uiLinks = JSON.parse(uiLinksSetting.value);
51
+ // Don't try and parse empty string
52
+ if (uiLinksSetting.value) {
53
+ uiLinks = JSON.parse(uiLinksSetting.value);
54
+ }
52
55
  } catch (e) {
53
56
  console.warn('Could not parse custom link settings', e); // eslint-disable-line no-console
54
57
  }
@@ -0,0 +1,82 @@
1
+ import { PSADimension, PSALevel, PSAMode } from '@shell/types/pod-security-admission';
2
+
3
+ /**
4
+ * All the PSA labels are created with this prefix, so we can use this to identify them
5
+ */
6
+ export const PSALabelPrefix = 'pod-security.kubernetes.io/';
7
+
8
+ /**
9
+ * Default modes of restrictions used for PSA
10
+ */
11
+ export const PSAModes: PSAMode[] = ['enforce', 'audit', 'warn'];
12
+
13
+ /**
14
+ * Levels of restrictions for the PSA
15
+ */
16
+ export const PSALevels: PSALevel[] = ['privileged', 'baseline', 'restricted'];
17
+
18
+ /**
19
+ * Used for restrictions in templates
20
+ */
21
+ export const PSADimensions: PSADimension[] = ['usernames', 'runtimeClasses', 'namespaces'];
22
+
23
+ /**
24
+ * For the UI, we prefer use this value as default one
25
+ */
26
+ export const PSADefaultLevel = PSALevels[0];
27
+
28
+ /**
29
+ * Default values for PSA should always be this one
30
+ */
31
+ export const PSADefaultVersion = 'latest';
32
+
33
+ /**
34
+ * PSA labels for namespaces.
35
+ * MODE must be one of `enforce`, `audit`, or `warn`.
36
+ * LEVEL must be one of `privileged`, `baseline`, or `restricted`.
37
+ * pod-security.kubernetes.io/<MODE>: <LEVEL>
38
+ *
39
+ * Optional: per-mode version label that can be used to pin the policy to the
40
+ * version that shipped with a given Kubernetes minor version (for example v1.25).
41
+ *
42
+ * https://kubernetes.io/docs/concepts/security/pod-security-admission/#pod-security-admission-labels-for-namespaces
43
+ */
44
+ export const PSALabelsNamespaceMode = PSAModes.reduce((acc, mode) => [
45
+ ...acc,
46
+ `${ PSALabelPrefix }${ mode }`,
47
+ ], [] as string[]);
48
+
49
+ /**
50
+ * PSA labels for namespaces.
51
+ * MODE must be one of `enforce`, `audit`, or `warn`.
52
+ * VERSION must be a valid Kubernetes minor version, or `latest`.
53
+ * pod-security.kubernetes.io/<MODE>-version: <VERSION>
54
+ *
55
+ * https://kubernetes.io/docs/concepts/security/pod-security-admission/#pod-security-admission-labels-for-namespaces
56
+ */
57
+ export const PSALabelsNamespaceVersion = PSAModes.reduce((acc, mode) => [
58
+ ...acc,
59
+ `${ PSALabelPrefix }${ mode }-version`
60
+ ], [] as string[]);
61
+
62
+ /**
63
+ * PSA labels for namespaces.
64
+ * MODE must be one of `enforce`, `audit`, or `warn`.
65
+ * LEVEL must be one of `privileged`, `baseline`, or `restricted`.
66
+ * pod-security.kubernetes.io/<MODE>: <LEVEL>
67
+ *
68
+ * Optional: per-mode version label that can be used to pin the policy to the
69
+ * version that shipped with a given Kubernetes minor version (for example v1.25).
70
+ *
71
+ * MODE must be one of `enforce`, `audit`, or `warn`.
72
+ * VERSION must be a valid Kubernetes minor version, or `latest`.
73
+ * pod-security.kubernetes.io/<MODE>-version: <VERSION>
74
+ *
75
+ * https://kubernetes.io/docs/concepts/security/pod-security-admission/#pod-security-admission-labels-for-namespaces
76
+ */
77
+ export const PSALabelsNamespaces: string[] = [...PSALabelsNamespaceMode, ...PSALabelsNamespaceVersion];
78
+
79
+ /**
80
+ * Generated table of icons with or hardcoded generated PSA labels
81
+ */
82
+ export const PSAIconsDisplay: Record<string, string> = Object.assign({}, ...PSALabelsNamespaces.map(psa => ({ [psa]: 'icon-pod_security' })));
@@ -32,7 +32,7 @@ export function init(store) {
32
32
  });
33
33
 
34
34
  virtualType({
35
- label: 'Charts',
35
+ labelKey: 'catalog.charts.header',
36
36
  icon: 'compass',
37
37
  namespaced: false,
38
38
  name: 'charts',
@@ -47,10 +47,10 @@ export function init(store) {
47
47
  });
48
48
 
49
49
  virtualType({
50
- label: store.getters['type-map/labelFor']({ id: MANAGEMENT.USER }, 2),
50
+ labelKey: 'typeLabel."management.cattle.io.user"',
51
51
  name: USERS_VIRTUAL_TYPE,
52
52
  namespaced: false,
53
- weight: 102,
53
+ weight: 103,
54
54
  icon: 'user',
55
55
  route: {
56
56
  name: 'c-cluster-product-resource',
@@ -64,8 +64,9 @@ export function init(store) {
64
64
  configureType(MANAGEMENT.USER, { showListMasthead: false });
65
65
 
66
66
  spoofedType({
67
- label: store.getters['type-map/labelFor']({ id: NORMAN.SPOOFED.GROUP_PRINCIPAL }, 2),
67
+ labelKey: 'typeLabel."group.principal"',
68
68
  type: NORMAN.SPOOFED.GROUP_PRINCIPAL,
69
+ weight: 101,
69
70
  ifHaveType: MANAGEMENT.GLOBAL_ROLE_BINDING,
70
71
  collectionMethods: [],
71
72
  schemas: [
@@ -142,11 +143,11 @@ export function init(store) {
142
143
  weightType(NORMAN.SPOOFED.GROUP_PRINCIPAL, 101, true);
143
144
 
144
145
  virtualType({
145
- label: store.getters['i18n/t']('rbac.roletemplate.label'),
146
+ labelKey: 'rbac.roletemplate.label',
146
147
  icon: 'user',
147
148
  namespaced: false,
148
149
  name: ROLES_VIRTUAL_TYPE,
149
- weight: 101,
150
+ weight: 102,
150
151
  route: { name: 'c-cluster-auth-roles' },
151
152
  // There are two resource types shown on this page, MANAGEMENT.GLOBAL_ROLE and MANAGEMENT.ROLE_TEMPLATE
152
153
  // If there user can't see ROLE_TEMPLATE, they definitely can't see GLOBAL_ROLE
@@ -43,7 +43,7 @@ export function init(store) {
43
43
  formatter: 'Date'
44
44
  },
45
45
  {
46
- name: 'nextBackup',
46
+ name: 'lastBackup',
47
47
  labelKey: 'backupRestoreOperator.lastBackup',
48
48
  value: 'status.lastSnapshotTs',
49
49
  formatter: 'Date'