@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.
- package/assets/styles/global/_button.scss +5 -1
- package/assets/styles/global/_columns.scss +4 -0
- package/assets/styles/global/_gauges.scss +1 -1
- package/assets/styles/global/_layout.scss +5 -2
- package/assets/styles/global/_select.scss +1 -4
- package/assets/styles/themes/_dark.scss +5 -4
- package/assets/styles/themes/_light.scss +4 -3
- package/assets/styles/themes/_suse.scss +1 -1
- package/assets/styles/vendor/vue-select.scss +4 -3
- package/assets/translations/en-us.yaml +673 -73
- package/assets/translations/zh-hans.yaml +720 -207
- package/chart/monitoring/steps/uninstall-v1.vue +2 -2
- package/cloud-credential/azure.vue +23 -0
- package/cloud-credential/harvester.vue +25 -62
- package/cloud-credential/pnap.vue +80 -0
- package/components/.DS_Store +0 -0
- package/components/ActionMenu.vue +28 -7
- package/components/AdvancedSection.vue +9 -2
- package/components/Alert.vue +2 -2
- package/components/ButtonDropdown.vue +0 -2
- package/components/ButtonGroup.vue +1 -0
- package/components/CollapsibleCard.vue +0 -1
- package/components/CruResource.vue +41 -4
- package/components/DetailTop.vue +72 -4
- package/components/DisableAuthProviderModal.vue +106 -0
- package/{rancher-components/components/Utils/DraggableZone → components}/DraggableZone.vue +0 -0
- package/components/ExplorerMembers.vue +253 -30
- package/components/ExplorerProjectsNamespaces.vue +77 -33
- package/components/ExtensionPanel.vue +42 -0
- package/components/GrowlManager.vue +3 -3
- package/components/IconOrSvg.vue +178 -0
- package/components/LogItem.vue +69 -0
- package/components/PodSecurityAdmission.vue +302 -0
- package/components/PromptModal.vue +1 -0
- package/components/ResourceDetail/Masthead.vue +69 -4
- package/components/ResourceDetail/index.vue +12 -5
- package/components/ResourceList/Masthead.vue +11 -1
- package/components/ResourceList/ResourceLoadingIndicator.vue +12 -2
- package/components/ResourceList/index.vue +66 -12
- package/components/ResourceList/resource-list.config.js +7 -0
- package/components/ResourceTable.vue +33 -6
- package/components/SimpleBox.vue +1 -1
- package/components/SortableTable/THead.vue +21 -14
- package/components/SortableTable/filtering.js +1 -1
- package/components/SortableTable/index.vue +21 -10
- package/components/SortableTable/selection.js +15 -3
- package/components/Tabbed/Tab.vue +1 -1
- package/components/Tabbed/index.vue +20 -15
- package/components/__tests__/.DS_Store +0 -0
- package/components/__tests__/AsyncButton.test.ts +140 -0
- package/components/__tests__/BackLink.test.ts +33 -0
- package/components/__tests__/ButtonGroup.test.ts +124 -0
- package/components/__tests__/ClusterBadge.test.ts +32 -0
- package/components/__tests__/CollapsibleCard.test.ts +64 -0
- package/components/__tests__/ConsumptionGauge.test.ts +88 -0
- package/components/__tests__/CruResource.test.ts +3 -2
- package/components/__tests__/FixedBanner.test.ts +129 -0
- package/components/__tests__/GrowlManager.test.ts +147 -0
- package/components/__tests__/NamespaceFilter.test.ts +33 -25
- package/components/__tests__/PercentageBar.test.ts +32 -0
- package/components/__tests__/PodSecurityAdmission.test.ts +398 -0
- package/components/auth/AuthBanner.vue +20 -10
- package/components/auth/RoleDetailEdit.vue +26 -17
- package/components/auth/SelectPrincipal.vue +36 -5
- package/components/form/ArrayList.vue +3 -35
- package/components/form/ArrayListGrouped.vue +13 -4
- package/components/form/ArrayListSelect.vue +5 -5
- package/components/form/Error.vue +8 -0
- package/components/form/KeyValue.vue +39 -7
- package/components/form/LabeledSelect.vue +5 -2
- package/components/form/Labels.vue +46 -16
- package/components/form/Members/ClusterPermissionsEditor.vue +17 -17
- package/components/form/Members/MembershipEditor.vue +12 -12
- package/components/form/NameNsDescription.vue +1 -1
- package/components/form/NodeScheduling.vue +1 -1
- package/components/form/Probe.vue +3 -3
- package/components/form/ResourceQuota/Project.vue +6 -6
- package/components/form/ResourceTabs/index.vue +24 -6
- package/components/form/Security.vue +7 -6
- package/components/form/Select.vue +3 -2
- package/components/form/SelectOrCreateAuthSecret.vue +22 -29
- package/components/form/ServicePorts.vue +8 -0
- package/components/form/WorkloadPorts.vue +7 -1
- package/components/form/__tests__/ArrayList.test.ts +74 -0
- package/components/form/__tests__/ArrayListGrouped.test.ts +6 -4
- package/components/formatter/Checked.vue +1 -1
- package/components/formatter/ClusterLink.vue +5 -0
- package/components/formatter/IconIsDefault.vue +2 -2
- package/components/formatter/InternalExternalIP.vue +11 -8
- package/components/formatter/LiveDuration.vue +78 -0
- package/components/formatter/WorkloadHealthScale.vue +5 -3
- package/components/nav/Header.vue +74 -7
- package/components/nav/NamespaceFilter.vue +146 -63
- package/components/nav/TopLevelMenu.vue +22 -19
- package/components/nav/WindowManager/ContainerLogs.vue +83 -126
- package/components/nav/WindowManager/ContainerShell.vue +9 -7
- package/components/nav/WindowManager/Window.vue +2 -0
- package/components/nav/WindowManager/index.vue +10 -0
- package/config/elemental-types.js +9 -0
- package/config/features.js +2 -0
- package/config/home-links.js +4 -1
- package/config/pod-security-admission.ts +82 -0
- package/config/product/apps.js +1 -1
- package/config/product/auth.js +6 -5
- package/config/product/backup.js +1 -1
- package/config/product/explorer.js +6 -6
- package/config/product/fleet.js +1 -1
- package/config/product/manager.js +6 -2
- package/config/query-params.js +1 -0
- package/config/secret.js +0 -1
- package/config/settings.ts +26 -9
- package/config/table-headers.js +22 -11
- package/config/types.js +4 -1
- package/config/uiplugins.js +3 -3
- package/content/docs/zh-hans/getting-started.md +113 -137
- package/content/docs/zh-hans/whats-new.md +8 -46
- package/core/plugin-helpers.js +171 -0
- package/core/plugin.ts +61 -1
- package/core/plugins.js +33 -0
- package/core/types.ts +128 -2
- package/creators/pkg/package-lock.json +37 -0
- package/creators/pkg/package.json +1 -1
- package/detail/catalog.cattle.io.app.vue +1 -1
- package/detail/pod.vue +1 -1
- package/detail/provisioning.cattle.io.cluster.vue +35 -9
- package/detail/service.vue +2 -9
- package/detail/workload/index.vue +0 -1
- package/dialog/AddClusterMemberDialog.vue +22 -28
- package/dialog/AddProjectMemberDialog.vue +53 -9
- package/dialog/DiagnosticTimingsDialog.vue +8 -7
- package/dialog/DrainNode.vue +44 -48
- package/dialog/ForceMachineRemoveDialog.vue +5 -7
- package/dialog/GenericPrompt.vue +15 -20
- package/dialog/RollbackWorkloadDialog.vue +15 -46
- package/dialog/RotateCertificatesDialog.vue +5 -7
- package/dialog/RotateEncryptionKeyDialog.vue +5 -9
- package/dialog/SaveAsRKETemplateDialog.vue +5 -13
- package/dialog/ScaleMachineDownDialog.vue +1 -1
- package/dialog/ScalePoolDownDialog.vue +121 -0
- package/edit/__tests__/management.cattle.io.setting.test.ts +3 -3
- package/edit/auth/azuread.vue +16 -16
- package/edit/auth/github.vue +8 -0
- package/edit/auth/googleoauth.vue +10 -1
- package/edit/auth/ldap/index.vue +10 -0
- package/edit/auth/oidc.vue +10 -0
- package/edit/auth/saml.vue +10 -0
- package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
- package/edit/catalog.cattle.io.clusterrepo.vue +3 -0
- package/edit/cloudcredential.vue +3 -7
- package/edit/logging-flow/Match.vue +39 -8
- package/edit/logging-flow/index.vue +27 -4
- package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +107 -0
- package/edit/management.cattle.io.project.vue +8 -1
- package/edit/management.cattle.io.setting.vue +5 -2
- package/edit/management.cattle.io.user.vue +7 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +36 -8
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +2 -2
- package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +14 -6
- package/edit/namespace.vue +18 -4
- package/edit/networking.k8s.io.ingress/Certificate.vue +1 -0
- package/edit/networking.k8s.io.ingress/IngressClass.vue +8 -6
- package/edit/networking.k8s.io.ingress/RulePath.vue +12 -6
- package/edit/networking.k8s.io.ingress/index.vue +8 -6
- package/edit/persistentvolume/index.vue +30 -27
- package/edit/persistentvolume/plugins/cephfs.vue +29 -29
- package/edit/persistentvolume/plugins/csi.vue +102 -62
- package/edit/persistentvolume/plugins/fc.vue +19 -19
- package/edit/persistentvolume/plugins/iscsi.vue +45 -45
- package/edit/persistentvolume/plugins/rbd.vue +39 -39
- package/edit/persistentvolumeclaim.vue +78 -75
- package/edit/provisioning.cattle.io.cluster/MachinePool.vue +11 -7
- package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +10 -1
- package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +87 -27
- package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +3 -6
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +96 -0
- package/edit/provisioning.cattle.io.cluster/import.vue +1 -1
- package/edit/provisioning.cattle.io.cluster/index.vue +29 -6
- package/edit/provisioning.cattle.io.cluster/rke2.vue +445 -154
- package/edit/secret/index.vue +3 -7
- package/edit/service.vue +3 -1
- package/edit/storage.k8s.io.storageclass/index.vue +100 -16
- package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +114 -0
- package/edit/workload/__tests__/index.test.ts +98 -0
- package/edit/workload/index.vue +58 -8
- package/edit/workload/mixins/workload.js +107 -70
- package/edit/workload/storage/ContainerMountPaths.vue +0 -10
- package/edit/workload/storage/emptyDir.vue +88 -0
- package/edit/workload/storage/ephemeralVolume/index.vue +1 -1
- package/edit/workload/storage/index.vue +8 -0
- package/edit/workload/storage/persistentVolumeClaim/index.vue +1 -1
- package/layouts/default.vue +57 -44
- package/list/__tests__/workload.test.ts +5 -2
- package/list/catalog.cattle.io.app.vue +1 -0
- package/list/cis.cattle.io.clusterscan.vue +1 -0
- package/list/fleet.cattle.io.bundle.vue +5 -6
- package/list/fleet.cattle.io.cluster.vue +6 -3
- package/list/fleet.cattle.io.clusterregistrationtoken.vue +5 -6
- package/list/fleet.cattle.io.gitrepo.vue +4 -9
- package/list/helm.cattle.io.projecthelmchart.vue +1 -5
- package/list/logging.banzaicloud.io.clusterflow.vue +4 -1
- package/list/logging.banzaicloud.io.flow.vue +6 -5
- package/list/management.cattle.io.cluster.vue +1 -0
- package/list/management.cattle.io.feature.vue +3 -4
- package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +47 -0
- package/list/management.cattle.io.setting.vue +2 -2
- package/list/management.cattle.io.user.vue +4 -10
- package/list/monitoring.coreos.com.alertmanagerconfig.vue +2 -7
- package/list/node.vue +8 -5
- package/list/persistentvolume.vue +3 -3
- package/list/persistentvolumeclaim.vue +3 -4
- package/list/provisioning.cattle.io.cluster.vue +18 -19
- package/list/service.vue +6 -14
- package/list/workload.vue +43 -38
- package/machine-config/azure.vue +429 -60
- package/machine-config/pnap.vue +288 -0
- package/mixins/auth-config.js +1 -3
- package/mixins/browser-tab-visibility.js +8 -14
- package/mixins/chart.js +1 -1
- package/mixins/create-edit-view/impl.js +4 -0
- package/mixins/create-edit-view/index.js +4 -2
- package/mixins/resource-fetch-namespaced.js +98 -0
- package/mixins/resource-fetch.js +79 -45
- package/mixins/resource-manager.js +1 -23
- package/models/apps.controllerrevision.js +7 -0
- package/models/apps.daemonset.js +18 -0
- package/models/apps.deployment.js +44 -0
- package/models/apps.replicaset.js +7 -0
- package/models/apps.statefulset.js +18 -0
- package/models/batch.job.js +7 -14
- package/models/cluster/node.js +10 -2
- package/models/cluster.x-k8s.io.machine.js +26 -4
- package/models/cluster.x-k8s.io.machinedeployment.js +12 -2
- package/models/event.js +7 -0
- package/models/logging.banzaicloud.io.flow.js +4 -0
- package/models/management.cattle.io.cluster.js +1 -1
- package/models/management.cattle.io.clusterroletemplatebinding.js +1 -1
- package/models/management.cattle.io.globalrole.js +2 -2
- package/models/management.cattle.io.node.js +37 -2
- package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.ts +4 -0
- package/models/management.cattle.io.project.js +30 -11
- package/models/management.cattle.io.setting.js +1 -1
- package/models/management.cattle.io.user.js +37 -1
- package/models/namespace.js +42 -5
- package/models/persistentvolume.js +14 -2
- package/models/pod.js +15 -0
- package/models/projectroletemplatebinding.js +7 -0
- package/models/provisioning.cattle.io.cluster.js +61 -10
- package/models/rke-machine.cattle.io.pnapmachinetemplate.js +15 -0
- package/models/service.js +14 -13
- package/models/storage.k8s.io.storageclass.js +33 -18
- package/models/workload.js +38 -7
- package/nuxt.config.js +27 -17
- package/package.json +7 -7
- package/pages/about.vue +14 -2
- package/pages/c/_cluster/apps/charts/index.vue +21 -3
- package/pages/c/_cluster/apps/charts/install.vue +59 -22
- package/pages/c/_cluster/auth/config/_id.vue +6 -0
- package/pages/c/_cluster/auth/config/index.vue +8 -6
- package/pages/c/_cluster/auth/group.principal/assign-edit.vue +1 -1
- package/pages/c/_cluster/auth/roles/index.vue +1 -1
- package/pages/c/_cluster/explorer/index.vue +51 -6
- package/pages/c/_cluster/longhorn/index.vue +1 -1
- package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +15 -4
- package/pages/c/_cluster/monitoring/index.vue +1 -1
- package/pages/c/_cluster/neuvector/index.vue +1 -1
- package/pages/c/_cluster/settings/performance.vue +48 -2
- package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +2 -0
- package/pages/c/_cluster/uiplugins/InstallDialog.vue +3 -0
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +42 -2
- package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +2 -0
- package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +1 -0
- package/pages/c/_cluster/uiplugins/UninstallDialog.vue +2 -0
- package/pages/c/_cluster/uiplugins/index.vue +42 -3
- package/pages/diagnostic.vue +5 -4
- package/pages/home.vue +105 -30
- package/pages/prefs.vue +23 -12
- package/pages/rio/mesh.vue +1 -1
- package/pkg/dynamic-importer.lib.js +8 -0
- package/pkg/vue.config.js +4 -0
- package/plugins/dashboard-store/__tests__/mutations.spec.js +406 -0
- package/plugins/dashboard-store/actions.js +32 -25
- package/plugins/dashboard-store/getters.js +50 -33
- package/plugins/dashboard-store/mutations.js +134 -28
- package/plugins/dashboard-store/resource-class.js +37 -42
- package/plugins/steve/actions.js +30 -0
- package/plugins/steve/caches/resourceCache.js +60 -0
- package/plugins/steve/getters.js +44 -1
- package/plugins/steve/mutations.js +97 -36
- package/plugins/steve/resourceWatcher.js +277 -0
- package/plugins/steve/schema.utils.js +25 -0
- package/plugins/steve/subscribe.js +288 -115
- package/plugins/steve/worker/index.js +17 -0
- package/plugins/steve/worker/web-worker.advanced.js +302 -0
- package/plugins/steve/{web-worker.steve-sub-worker.js → worker/web-worker.basic.js} +3 -44
- package/rancher-components/Card/Card.vue +3 -3
- package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +1 -0
- package/rancher-components/StringList/StringList.test.ts +45 -420
- package/rancher-components/StringList/StringList.vue +1 -10
- package/rancher-components/components/Banner/Banner.test.ts +44 -0
- package/rancher-components/components/Banner/Banner.vue +130 -61
- package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +13 -22
- package/rancher-components/components/Form/Checkbox/Checkbox.vue +8 -6
- package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +9 -9
- package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +0 -1
- package/rancher-components/components/StringList/StringList.test.ts +7 -7
- package/rancher-components/components/StringList/StringList.vue +21 -15
- package/scripts/test-plugins-build.sh +8 -0
- package/static/loading-indicator.html +1 -1
- package/store/action-menu.js +4 -3
- package/store/index.js +54 -3
- package/store/plugins.js +0 -17
- package/store/pnap.js +128 -0
- package/store/prefs.js +4 -2
- package/store/type-map.js +81 -13
- package/types/pod-security-admission.ts +36 -0
- package/types/shell/index.d.ts +497 -396
- package/utils/__tests__/object.test.ts +17 -1
- package/utils/__tests__/pod-security-admission.test.ts +61 -0
- package/utils/async.ts +36 -0
- package/utils/color.js +45 -0
- package/utils/crypto/browserHashUtils.js +18 -0
- package/utils/dynamic-importer.js +8 -0
- package/utils/install-redirect.js +1 -1
- package/utils/object.js +24 -0
- package/utils/pod-security-admission.ts +39 -0
- package/utils/socket.js +61 -24
- package/utils/string.js +2 -0
- package/utils/svg-filter.js +301 -0
- package/utils/time.js +49 -0
- package/utils/validators/cidr.js +4 -0
- package/utils/validators/formRules/__tests__/index.test.ts +23 -3
- package/utils/validators/formRules/index.ts +14 -0
- package/config/product/harvester-manager.js +0 -162
- package/edit/harvesterhci.io.management.cluster.vue +0 -153
- package/list/harvesterhci.io.management.cluster.vue +0 -241
- package/machine-config/harvester.vue +0 -693
- package/models/harvesterhci.io.management.cluster.js +0 -228
- package/pages/c/_cluster/harvesterManager/index.vue +0 -24
- package/rancher-components/Card/Card.test.ts +0 -39
- package/rancher-components/Utils/DraggableZone/DraggableZone.vue +0 -181
- package/rancher-components/Utils/DraggableZone/index.ts +0 -1
- 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
|
|
11
|
+
import VirtualList from 'vue-virtual-scroll-list';
|
|
12
|
+
import LogItem from '@shell/components/LogItem';
|
|
14
13
|
|
|
15
|
-
import {
|
|
16
|
-
import { HARVESTER_NAME as VIRTUAL } from '@shell/config/
|
|
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,
|
|
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
|
-
|
|
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
|
|
259
|
-
const match = range.match(/^(\d+)?\s*(.*?)s?$/);
|
|
254
|
+
const rangeParams = this.parseRange(this.range);
|
|
260
255
|
|
|
261
|
-
|
|
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
|
-
|
|
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
|
|
328
|
+
const virtualList = this.$refs.virtualList;
|
|
351
329
|
|
|
352
|
-
|
|
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*(
|
|
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
|
|
402
|
+
const virtualList = this.$refs.virtualList;
|
|
423
403
|
|
|
424
|
-
|
|
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
|
-
<
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
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
|
-
.
|
|
665
|
-
white-space:
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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:
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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
|
}
|
|
@@ -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' };
|
package/config/features.js
CHANGED
package/config/home-links.js
CHANGED
|
@@ -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
|
-
|
|
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' })));
|
package/config/product/apps.js
CHANGED
package/config/product/auth.js
CHANGED
|
@@ -47,10 +47,10 @@ export function init(store) {
|
|
|
47
47
|
});
|
|
48
48
|
|
|
49
49
|
virtualType({
|
|
50
|
-
|
|
50
|
+
labelKey: 'typeLabel."management.cattle.io.user"',
|
|
51
51
|
name: USERS_VIRTUAL_TYPE,
|
|
52
52
|
namespaced: false,
|
|
53
|
-
weight:
|
|
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
|
-
|
|
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
|
-
|
|
146
|
+
labelKey: 'rbac.roletemplate.label',
|
|
146
147
|
icon: 'user',
|
|
147
148
|
namespaced: false,
|
|
148
149
|
name: ROLES_VIRTUAL_TYPE,
|
|
149
|
-
weight:
|
|
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
|