@rancher/shell 3.0.0 → 3.0.1-rc.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/brand/harvester/favicon.png +0 -0
- package/assets/brand/harvester/metadata.json +3 -0
- package/assets/images/pl/harvester.svg +1 -0
- package/assets/translations/en-us.yaml +26 -8
- package/assets/translations/zh-hans.yaml +1 -1
- package/components/BrandImage.vue +5 -1
- package/components/CopyToClipboardText.vue +2 -0
- package/components/CruResourceFooter.vue +1 -0
- package/components/DetailTop.vue +1 -1
- package/components/ExplorerMembers.vue +5 -1
- package/components/ExplorerProjectsNamespaces.vue +39 -15
- package/components/HardwareResourceGauge.vue +12 -2
- package/components/InputOrDisplay.vue +6 -2
- package/components/LandingPagePreference.vue +2 -2
- package/components/MessageLink.vue +1 -1
- package/components/ResourceDetail/Masthead.vue +22 -1
- package/components/ResourceDetail/index.vue +2 -8
- package/components/ResourceTable.vue +14 -6
- package/components/ResourceYaml.vue +1 -1
- package/components/SideNav.vue +6 -4
- package/components/TableDataUserIcon.vue +1 -1
- package/components/fleet/FleetRepos.vue +0 -7
- package/components/form/ArrayList.vue +5 -1
- package/components/form/ArrayListSelect.vue +5 -1
- package/components/form/KeyValue.vue +1 -1
- package/components/form/LabeledSelect.vue +26 -6
- package/components/form/Password.vue +7 -1
- package/components/form/UnitInput.vue +10 -1
- package/components/form/__tests__/UnitInput.test.ts +1 -0
- package/components/formatter/ClusterProvider.vue +3 -3
- package/components/formatter/ImagePercentageBar.vue +1 -1
- package/components/formatter/Si.vue +5 -1
- package/components/formatter/Translate.vue +1 -1
- package/components/nav/Header.vue +29 -5
- package/components/nav/NamespaceFilter.vue +5 -8
- package/components/nav/TopLevelMenu.vue +16 -14
- package/config/labels-annotations.js +2 -0
- package/config/table-headers.js +15 -0
- package/config/types.js +3 -0
- package/detail/fleet.cattle.io.bundle.vue +5 -68
- package/detail/fleet.cattle.io.gitrepo.vue +2 -1
- package/directives/clean-tooltip.js +4 -4
- package/edit/constraints.gatekeeper.sh.constraint/index.vue +5 -2
- package/edit/logging-flow/Match.vue +75 -42
- package/edit/logging-flow/index.vue +89 -10
- package/edit/logging.banzaicloud.io.output/index.vue +2 -2
- package/edit/management.cattle.io.project.vue +2 -2
- package/edit/namespace.vue +1 -1
- package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +17 -7
- package/edit/provisioning.cattle.io.cluster/index.vue +2 -1
- package/edit/provisioning.cattle.io.cluster/rke2.vue +1 -3
- package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +20 -6
- package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryMirrors.vue +1 -1
- package/list/harvesterhci.io.management.cluster.vue +244 -0
- package/list/namespace.vue +16 -4
- package/models/__tests__/management.cattle.io.cluster.test.ts +45 -3
- package/models/__tests__/provisioning.cattle.io.cluster.test.ts +0 -86
- package/models/fleet.cattle.io.bundle.js +3 -1
- package/models/fleet.cattle.io.gitrepo.js +46 -48
- package/models/k8s.cni.cncf.io.networkattachmentdefinition.js +88 -0
- package/models/management.cattle.io.cluster.js +26 -5
- package/models/management.cattle.io.setting.js +25 -0
- package/models/provisioning.cattle.io.cluster.js +5 -14
- package/models/storage.k8s.io.storageclass.js +15 -4
- package/package.json +8 -6
- package/pages/auth/login.vue +8 -2
- package/pages/auth/setup.vue +1 -1
- package/pages/c/_cluster/fleet/index.vue +2 -4
- package/pages/c/_cluster/settings/brand.vue +4 -1
- package/pages/prefs.vue +22 -10
- package/plugins/dashboard-store/resource-class.js +11 -3
- package/plugins/steve/steve-pagination-utils.ts +1 -1
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +7 -2
- package/scripts/extension/parse-tag-name +19 -12
- package/scripts/publish-shell.sh +10 -2
- package/scripts/test-plugins-build.sh +8 -9
- package/scripts/typegen.sh +2 -0
- package/store/features.js +1 -0
- package/store/i18n.js +5 -1
- package/store/prefs.js +8 -0
- package/types/resources/fleet.d.ts +40 -0
- package/types/shell/index.d.ts +524 -396
- package/utils/auth.js +1 -1
- package/utils/create-yaml.js +1 -1
- package/utils/favicon.js +2 -0
- package/utils/fleet.ts +159 -0
- package/utils/gc/gc.ts +1 -1
- package/utils/v-sphere.ts +31 -0
- package/utils/validators/cron-schedule.js +1 -1
- package/utils/validators/formRules/index.ts +1 -1
- package/utils/version.js +1 -1
- package/vue.config.js +2 -2
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 194.25619 159.08912"><defs><style>.cls-1{fill:#00a383;}.cls-2{fill:#fff;}</style></defs><rect class="cls-1" width="194.25619" height="159.08912" rx="20.56068"/><path class="cls-2" d="M180.4487,81.46673a4.97417,4.97417,0,0,0,.25287-.81463c.01635-.07209.0296-.14435.04284-.21759a4.98972,4.98972,0,0,0,0-1.78c-.01324-.07324-.02649-.14551-.04284-.21759a4.97458,4.97458,0,0,0-.25287-.81464c-.01587-.03815-.03748-.07269-.05432-.11035a4.9932,4.9932,0,0,0-.23017-.46741l-19.7666-34.2373a4.96949,4.96949,0,0,0-.28741-.42926c-.02527-.03491-.04535-.07251-.07154-.10681a4.97881,4.97881,0,0,0-.57611-.62305c-.05584-.05176-.11346-.10089-.17206-.15033a5.00763,5.00763,0,0,0-.71991-.51843l-.00305-.0022-.00274-.00122a5.00234,5.00234,0,0,0-.80945-.36469c-.07269-.02624-.14459-.05175-.2179-.0744a4.97937,4.97937,0,0,0-.82483-.18683c-.04693-.0061-.0935-.00457-.14044-.00927a4.98006,4.98006,0,0,0-.50464-.03351H116.53335a4.96842,4.96842,0,0,0-.504.03345c-.0476.00482-.09478.00329-.14233.00946a4.97566,4.97566,0,0,0-.82226.18627c-.07447.023-.14753.049-.22138.07563a5.00058,5.00058,0,0,0-.80719.36383l-.00281.00128-.00305.0022a5.00874,5.00874,0,0,0-.71991.51843c-.05859.04944-.11615.09845-.172.15027a4.97536,4.97536,0,0,0-.57635.62335c-.026.034-.04584.07123-.07086.10584a4.98409,4.98409,0,0,0-.2879.43L93.88046,74.54449H79.278l13.99317-24.2373h6.4956a5,5,0,0,0,0-10H90.38443a5.0003,5.0003,0,0,0-4.33008,2.5L67.73111,74.54449h-14.602l13.99316-24.2373h6.49561a5,5,0,0,0,0-10H64.2355a5.00031,5.00031,0,0,0-4.33008,2.5L41.58218,74.54449H26.9797l13.99359-24.2373H47.4689a5,5,0,0,0,0-10H38.08658a5.00029,5.00029,0,0,0-4.33008,2.5L13.98941,77.04449a4.98206,4.98206,0,0,0-.22925.46594c-.01715.0384-.03912.07349-.05536.11243a4.974,4.974,0,0,0-.25183.81128c-.01691.07422-.03058.1485-.04413.22388a4.99817,4.99817,0,0,0-.089.88305l-.00036.00342.00036.00342a4.99828,4.99828,0,0,0,.089.88306c.01355.07538.02722.14966.04413.22387a4.97371,4.97371,0,0,0,.25183.81128c.01624.03894.03821.074.05536.11243a4.98084,4.98084,0,0,0,.22925.46594L33.7565,116.28131a5.00031,5.00031,0,0,0,4.33008,2.5H47.4689a5,5,0,1,0,0-10H40.97329L26.97976,84.54449H41.58218l18.32324,31.73682a5.00033,5.00033,0,0,0,4.33008,2.5h9.38233a5,5,0,0,0,0-10H67.12222L53.12912,84.54449h14.602l18.32324,31.73682a5.00032,5.00032,0,0,0,4.33008,2.5h9.38232a5,5,0,0,0,0-10h-6.4956L79.278,84.54449H93.88052l18.32276,31.73682a4.97193,4.97193,0,0,0,.28759.42944c.02521.03479.04517.07233.07135.10657a4.98039,4.98039,0,0,0,.57605.62311c.05591.05188.11371.10095.17237.15051a5.00138,5.00138,0,0,0,.71966.51825l.00305.0022c.02063.0119.04254.01953.0633.03112a4.99593,4.99593,0,0,0,.52386.25788c.15222.06329.30756.11084.46283.15808.051.0155.09961.037.15119.0509a4.96725,4.96725,0,0,0,1.29394.17292l.01508-.001h39.51379l.01508.001a4.96725,4.96725,0,0,0,1.29394-.17292c.05158-.01391.10016-.0354.15119-.0509.15527-.04724.3106-.09479.46282-.15808a4.99511,4.99511,0,0,0,.52387-.25788c.02075-.01159.04266-.01922.06329-.03112l.00312-.0022a5.00713,5.00713,0,0,0,.71856-.51733c.05939-.05011.11774-.09986.17432-.15229a4.97862,4.97862,0,0,0,.57458-.6214c.027-.03546.04773-.07415.0738-.11023a4.98327,4.98327,0,0,0,.2857-.42663l19.7666-34.23682a4.99182,4.99182,0,0,0,.23017-.4674C180.41122,81.53943,180.43283,81.50488,180.4487,81.46673Zm-24.38111,22.31452L150.2941,93.78094l5.33294-9.23645h11.54688ZM105.42776,84.54449h11.54706l5.33289,9.23633-5.77417,10.00061ZM116.5336,55.307l5.77411,10.00031-5.33295,9.23718H105.4277Zm14.43432,33.47382-5.333-9.23633,5.333-9.2373h10.666l5.333,9.2373-5.333,9.23633Zm10.666-28.47363H130.9678l-5.77392-10h22.2135ZM130.96786,98.78082h10.666l5.77362,10.00049H125.19375ZM155.6271,74.54449l-5.333-9.2373,5.77343-10L167.174,74.54449Z"/></svg>
|
|
@@ -26,6 +26,7 @@ generic:
|
|
|
26
26
|
id: ID
|
|
27
27
|
ignored: Ignored
|
|
28
28
|
invalidCron: Invalid cron schedule
|
|
29
|
+
inProgress: In Progress
|
|
29
30
|
imagePullPolicy:
|
|
30
31
|
always: Always
|
|
31
32
|
ifNotPresent: IfNotPresent
|
|
@@ -111,6 +112,7 @@ generic:
|
|
|
111
112
|
=1 {Matches 1 of {total, number}: "{sample}"}
|
|
112
113
|
other {Matches {matched, number} of {total, number}, including "{sample}"}
|
|
113
114
|
}
|
|
115
|
+
basic: Basic
|
|
114
116
|
|
|
115
117
|
locale:
|
|
116
118
|
en-us: English
|
|
@@ -816,7 +818,7 @@ backupRestoreOperator:
|
|
|
816
818
|
encryption: Encryption
|
|
817
819
|
encryptionConfigName:
|
|
818
820
|
backuptip: 'Any secret in the <code>{ns}</code> namespace that has an <code>encryption-provider-config.yaml</code> key. <br/>The contents of this file are necessary to perform a restore from this backup, and are not stored by Rancher Backup.'
|
|
819
|
-
label: Encryption
|
|
821
|
+
label: Encryption Configuration Secret
|
|
820
822
|
options:
|
|
821
823
|
none: Store the contents of the backup unencrypted
|
|
822
824
|
secret: 'Encrypt backups using an <a target="_blank" rel="noopener noreferrer nofollow" href="https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/#understanding-the-encryption-at-rest-configuration">Encryption Config Secret</a> (Recommended)'
|
|
@@ -1240,7 +1242,7 @@ cluster:
|
|
|
1240
1242
|
label: Google
|
|
1241
1243
|
rancher-vsphere:
|
|
1242
1244
|
label: vSphere
|
|
1243
|
-
note: '<b>Important:</b> Configure the vSphere Cloud Provider and Storage Provider options in the Add-on
|
|
1245
|
+
note: '<b>Important:</b> Configure the vSphere Cloud Provider and Storage Provider options in the Add-on Configuration tab.'
|
|
1244
1246
|
harvester:
|
|
1245
1247
|
label: Harvester
|
|
1246
1248
|
copyConfig: Copy KubeConfig to Clipboard
|
|
@@ -1473,6 +1475,7 @@ cluster:
|
|
|
1473
1475
|
placeholder: A unique name for the cluster
|
|
1474
1476
|
directoryConfig:
|
|
1475
1477
|
title: Data directory configuration
|
|
1478
|
+
banner: Data directory configuration can not be changed once the cluster has been created
|
|
1476
1479
|
radioInput:
|
|
1477
1480
|
defaultLabel: Use default data directory configuration
|
|
1478
1481
|
commonLabel: Use a common base directory for data directory configuration (sub-directories will be used for the system-agent, provisioning and distro paths)
|
|
@@ -1967,7 +1970,7 @@ cluster:
|
|
|
1967
1970
|
pinganyunecs: Pinganyun ECS
|
|
1968
1971
|
pnap: phoenixNAP
|
|
1969
1972
|
rackspace: RackSpace
|
|
1970
|
-
rancherkubernetesengine:
|
|
1973
|
+
rancherkubernetesengine: RKE1
|
|
1971
1974
|
rke2: RKE2
|
|
1972
1975
|
rke: RKE1
|
|
1973
1976
|
rkeWindows: Windows (RKE1 only)
|
|
@@ -2126,6 +2129,7 @@ cluster:
|
|
|
2126
2129
|
tabs:
|
|
2127
2130
|
ace: Authorized Endpoint
|
|
2128
2131
|
addOnAdditionalManifest: Additional Manifest
|
|
2132
|
+
addons: Add-on Configuration
|
|
2129
2133
|
advanced: Advanced
|
|
2130
2134
|
agentEnv: Agent Environment Vars
|
|
2131
2135
|
basic: Basics
|
|
@@ -2159,6 +2163,7 @@ clusterIndexPage:
|
|
|
2159
2163
|
ram: Memory
|
|
2160
2164
|
used: Used
|
|
2161
2165
|
reserved: Reserved
|
|
2166
|
+
allocated: Allocated
|
|
2162
2167
|
units:
|
|
2163
2168
|
cores: |-
|
|
2164
2169
|
{count, plural,
|
|
@@ -2982,6 +2987,10 @@ labelSelect:
|
|
|
2982
2987
|
pagination:
|
|
2983
2988
|
counts: '{count} / {totalCount} items'
|
|
2984
2989
|
more: Load More...
|
|
2990
|
+
labeledSelect:
|
|
2991
|
+
startTyping: Start typing to define an item
|
|
2992
|
+
pressEnter: Press enter to add "{input}"
|
|
2993
|
+
|
|
2985
2994
|
landing:
|
|
2986
2995
|
clusters:
|
|
2987
2996
|
title: Clusters
|
|
@@ -3229,6 +3238,9 @@ logging:
|
|
|
3229
3238
|
certificate: Connection
|
|
3230
3239
|
labels: Labels
|
|
3231
3240
|
configuration: Configuration
|
|
3241
|
+
tips:
|
|
3242
|
+
singleProvider: This output is configured with multiple providers. We currently only support a single provider per output. You can view or edit the YAML.
|
|
3243
|
+
multipleProviders: This output is configured with providers we do not support yet. You can view or edit the YAML.
|
|
3232
3244
|
outputProviders:
|
|
3233
3245
|
elasticsearch: Elasticsearch
|
|
3234
3246
|
opensearch: OpenSearch
|
|
@@ -3714,6 +3726,9 @@ namespace:
|
|
|
3714
3726
|
selectNamespace: Select Namespace
|
|
3715
3727
|
createNamespace: Create a new Namespace
|
|
3716
3728
|
selectOrCreate: Select or Create a Namespace
|
|
3729
|
+
snapshots:
|
|
3730
|
+
label: Snapshots
|
|
3731
|
+
totalSnapshotSize: Total Snapshot Size
|
|
3717
3732
|
resourceStates:
|
|
3718
3733
|
success: 'Active'
|
|
3719
3734
|
info: 'Transitioning'
|
|
@@ -4016,6 +4031,7 @@ persistentVolume:
|
|
|
4016
4031
|
file-csi-azure-com: Azure File (CSI)
|
|
4017
4032
|
driver-longhorn-io: Longhorn (CSI)
|
|
4018
4033
|
driver-harvesterhci-io: Harvester (CSI)
|
|
4034
|
+
lvm-driver-harvesterhci-io: LVM
|
|
4019
4035
|
nfs-csi-k8s-io: NFS (CSI)
|
|
4020
4036
|
ebs-csi-aws-com: AWS Elastic Block Store (CSI)
|
|
4021
4037
|
rbd-csi-ceph-com: Ceph RBD (CSI)
|
|
@@ -4862,10 +4878,6 @@ rbac:
|
|
|
4862
4878
|
admin:
|
|
4863
4879
|
label: Administrator
|
|
4864
4880
|
description: Administrators have full control over the entire installation and all resources in all clusters.
|
|
4865
|
-
restricted-admin:
|
|
4866
|
-
label: Restricted Administrator
|
|
4867
|
-
description: Restricted Admins have full control over all resources in all downstream clusters but no access to the local cluster.
|
|
4868
|
-
deprecation: 'Warning: The Restricted Administrator role has been deprecated as of Rancher 2.8.0 and will be removed in a future release - Check out the <a href="{releaseNotesUrl}" target="_blank" rel="noopener noreferrer nofollow">Release Notes</a>'
|
|
4869
4881
|
user:
|
|
4870
4882
|
label: Standard User
|
|
4871
4883
|
description: Standard Users can create new clusters and manage clusters and projects they have been granted access to.
|
|
@@ -4995,6 +5007,7 @@ resourceTable:
|
|
|
4995
5007
|
node: Group by Node
|
|
4996
5008
|
role: Group by Role
|
|
4997
5009
|
cluster: Group by Cluster
|
|
5010
|
+
device: Group by Device
|
|
4998
5011
|
groupLabel:
|
|
4999
5012
|
cluster: "<span>Cluster:</span> {name}"
|
|
5000
5013
|
notInACluster: Not in a Cluster
|
|
@@ -5790,6 +5803,7 @@ tableHeaders:
|
|
|
5790
5803
|
resourcesReady: Resources Ready
|
|
5791
5804
|
restarts: Restarts
|
|
5792
5805
|
restart: Restart Required
|
|
5806
|
+
restore: Restore
|
|
5793
5807
|
role: Role
|
|
5794
5808
|
roles: Roles
|
|
5795
5809
|
routes: Routes
|
|
@@ -5825,6 +5839,7 @@ tableHeaders:
|
|
|
5825
5839
|
targetKind: Target Type
|
|
5826
5840
|
targetPort: Target
|
|
5827
5841
|
template: Template
|
|
5842
|
+
totalSnapshotQuota: Total Snapshot Quota
|
|
5828
5843
|
type: Type
|
|
5829
5844
|
updated: Updated
|
|
5830
5845
|
up-to-date: Up To Date
|
|
@@ -7301,6 +7316,7 @@ action:
|
|
|
7301
7316
|
viewYaml: View YAML
|
|
7302
7317
|
activate: Activate
|
|
7303
7318
|
deactivate: Deactivate
|
|
7319
|
+
editQuota: Edit Quota
|
|
7304
7320
|
show: Show
|
|
7305
7321
|
hide: Hide
|
|
7306
7322
|
copy: Copy
|
|
@@ -7779,7 +7795,9 @@ auth:
|
|
|
7779
7795
|
label: Auth Provider
|
|
7780
7796
|
vncConsole:
|
|
7781
7797
|
error:
|
|
7782
|
-
message: Web VNC console
|
|
7798
|
+
message: Web VNC console is disconnected
|
|
7799
|
+
reconnecting:
|
|
7800
|
+
message: Web VNC console reconnection attempt
|
|
7783
7801
|
|
|
7784
7802
|
gitPicker:
|
|
7785
7803
|
github:
|
|
@@ -12,6 +12,10 @@ export default {
|
|
|
12
12
|
dark: {
|
|
13
13
|
type: Boolean,
|
|
14
14
|
default: false
|
|
15
|
+
},
|
|
16
|
+
supportCustomLogo: {
|
|
17
|
+
type: Boolean,
|
|
18
|
+
default: false
|
|
15
19
|
}
|
|
16
20
|
},
|
|
17
21
|
data() {
|
|
@@ -75,7 +79,7 @@ export default {
|
|
|
75
79
|
},
|
|
76
80
|
|
|
77
81
|
pathToBrandedImage() {
|
|
78
|
-
if (this.fileName === 'rancher-logo.svg') {
|
|
82
|
+
if (this.fileName === 'rancher-logo.svg' || this.supportCustomLogo) {
|
|
79
83
|
if (this.theme === 'dark' && this.uiLogoDark) {
|
|
80
84
|
return this.uiLogoDark;
|
|
81
85
|
}
|
|
@@ -46,6 +46,7 @@ export default {
|
|
|
46
46
|
|
|
47
47
|
<template>
|
|
48
48
|
<a
|
|
49
|
+
v-if="text"
|
|
49
50
|
class="copy-to-clipboard-text"
|
|
50
51
|
:class="{ 'copied': copied, 'plain': plain}"
|
|
51
52
|
href="#"
|
|
@@ -59,6 +60,7 @@ export default {
|
|
|
59
60
|
</template>
|
|
60
61
|
<style lang="scss" scoped>
|
|
61
62
|
.copy-to-clipboard-text {
|
|
63
|
+
white-space: nowrap;
|
|
62
64
|
&.plain {
|
|
63
65
|
color: var(--body-text);
|
|
64
66
|
|
package/components/DetailTop.vue
CHANGED
|
@@ -11,6 +11,7 @@ import SortableTable from '@shell/components/SortableTable';
|
|
|
11
11
|
import { mapGetters } from 'vuex';
|
|
12
12
|
import { canViewProjectMembershipEditor } from '@shell/components/form/Members/ProjectMembershipEditor.vue';
|
|
13
13
|
import { allHash } from '@shell/utils/promise';
|
|
14
|
+
import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* Explorer members page.
|
|
@@ -227,6 +228,9 @@ export default {
|
|
|
227
228
|
canEditClusterMembers() {
|
|
228
229
|
return this.normanClusterRTBSchema?.collectionMethods.find((x) => x.toLowerCase() === 'post');
|
|
229
230
|
},
|
|
231
|
+
isHarvester() {
|
|
232
|
+
return this.$store.getters['currentProduct'].inStore === HARVESTER;
|
|
233
|
+
},
|
|
230
234
|
},
|
|
231
235
|
methods: {
|
|
232
236
|
getMgmtProjectId(group) {
|
|
@@ -324,7 +328,7 @@ export default {
|
|
|
324
328
|
/>
|
|
325
329
|
</Tab>
|
|
326
330
|
<Tab
|
|
327
|
-
v-if="canManageProjectMembers"
|
|
331
|
+
v-if="canManageProjectMembers && !isHarvester"
|
|
328
332
|
name="project-membership"
|
|
329
333
|
:label="t('members.projectMembership')"
|
|
330
334
|
>
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
<script>
|
|
2
2
|
import { mapGetters } from 'vuex';
|
|
3
3
|
import ResourceTable, { defaultTableSortGenerationFn } from '@shell/components/ResourceTable';
|
|
4
|
-
import { STATE, AGE, NAME } from '@shell/config/table-headers';
|
|
4
|
+
import { STATE, AGE, NAME, NS_SNAPSHOT_QUOTA } from '@shell/config/table-headers';
|
|
5
5
|
import { uniq } from '@shell/utils/array';
|
|
6
|
-
import { MANAGEMENT, NAMESPACE, VIRTUAL_TYPES } from '@shell/config/types';
|
|
6
|
+
import { MANAGEMENT, NAMESPACE, VIRTUAL_TYPES, HCI } from '@shell/config/types';
|
|
7
7
|
import { PROJECT_ID, FLAT_VIEW } from '@shell/config/query-params';
|
|
8
8
|
import { PanelLocation, ExtensionPoint } from '@shell/core/types';
|
|
9
9
|
import ExtensionPanel from '@shell/components/ExtensionPanel';
|
|
10
10
|
import Masthead from '@shell/components/ResourceList/Masthead';
|
|
11
|
-
import { mapPref, GROUP_RESOURCES, ALL_NAMESPACES } from '@shell/store/prefs';
|
|
11
|
+
import { mapPref, GROUP_RESOURCES, ALL_NAMESPACES, DEV } from '@shell/store/prefs';
|
|
12
12
|
import MoveModal from '@shell/components/MoveModal';
|
|
13
13
|
import ButtonMultiAction from '@shell/components/ButtonMultiAction.vue';
|
|
14
14
|
|
|
15
15
|
import { NAMESPACE_FILTER_ALL_ORPHANS } from '@shell/utils/namespace-filter';
|
|
16
16
|
import ResourceFetch from '@shell/mixins/resource-fetch';
|
|
17
17
|
import DOMPurify from 'dompurify';
|
|
18
|
+
import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
|
|
18
19
|
|
|
19
20
|
export default {
|
|
20
21
|
name: 'ListProjectNamespace',
|
|
@@ -42,6 +43,7 @@ export default {
|
|
|
42
43
|
async fetch() {
|
|
43
44
|
const inStore = this.$store.getters['currentStore'](NAMESPACE);
|
|
44
45
|
|
|
46
|
+
this.harvesterResourceQuotaSchema = this.$store.getters[`${ inStore }/schemaFor`](HCI.RESOURCE_QUOTA);
|
|
45
47
|
this.schema = this.$store.getters[`${ inStore }/schemaFor`](NAMESPACE);
|
|
46
48
|
this.projectSchema = this.$store.getters[`management/schemaFor`](MANAGEMENT.PROJECT);
|
|
47
49
|
|
|
@@ -60,6 +62,7 @@ export default {
|
|
|
60
62
|
return {
|
|
61
63
|
loadResources: [NAMESPACE],
|
|
62
64
|
loadIndeterminate: true,
|
|
65
|
+
harvesterResourceQuotaSchema: null,
|
|
63
66
|
schema: null,
|
|
64
67
|
projects: [],
|
|
65
68
|
projectSchema: null,
|
|
@@ -93,20 +96,33 @@ export default {
|
|
|
93
96
|
isNamespaceCreatable() {
|
|
94
97
|
return (this.schema?.collectionMethods || []).includes('POST');
|
|
95
98
|
},
|
|
99
|
+
isHarvester() {
|
|
100
|
+
return this.$store.getters['currentProduct'].inStore === HARVESTER;
|
|
101
|
+
},
|
|
96
102
|
headers() {
|
|
97
|
-
const
|
|
98
|
-
name: 'project',
|
|
99
|
-
label: this.t('tableHeaders.project'),
|
|
100
|
-
value: 'project.nameDisplay',
|
|
101
|
-
sort: ['projectNameSort', 'nameSort'],
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
return [
|
|
103
|
+
const headers = [
|
|
105
104
|
STATE,
|
|
106
105
|
NAME,
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
106
|
+
];
|
|
107
|
+
|
|
108
|
+
if (this.groupPreference === 'none') {
|
|
109
|
+
const projectHeader = {
|
|
110
|
+
name: 'project',
|
|
111
|
+
label: this.t('tableHeaders.project'),
|
|
112
|
+
value: 'project.nameDisplay',
|
|
113
|
+
sort: ['projectNameSort', 'nameSort'],
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
headers.push(projectHeader);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (this.isHarvester && this.harvesterResourceQuotaSchema) {
|
|
120
|
+
headers.push(NS_SNAPSHOT_QUOTA);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
headers.push(AGE);
|
|
124
|
+
|
|
125
|
+
return headers;
|
|
110
126
|
},
|
|
111
127
|
projectIdsWithNamespaces() {
|
|
112
128
|
const ids = this.rows
|
|
@@ -211,7 +227,15 @@ export default {
|
|
|
211
227
|
return this.groupPreference === 'none' ? this.rows : this.rowsWithFakeNamespaces;
|
|
212
228
|
},
|
|
213
229
|
rows() {
|
|
214
|
-
|
|
230
|
+
let isDev;
|
|
231
|
+
|
|
232
|
+
try {
|
|
233
|
+
isDev = this.$store.getters['prefs/get'](ALL_NAMESPACES);
|
|
234
|
+
} catch {
|
|
235
|
+
isDev = this.$store.getters['prefs/get'](DEV);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (isDev) {
|
|
215
239
|
// If all namespaces options are turned on in the user preferences,
|
|
216
240
|
// return all namespaces including system namespaces and RBAC
|
|
217
241
|
// management namespaces.
|
|
@@ -20,9 +20,19 @@ export default {
|
|
|
20
20
|
default: null
|
|
21
21
|
},
|
|
22
22
|
|
|
23
|
+
usedTitle: {
|
|
24
|
+
type: String,
|
|
25
|
+
default: null
|
|
26
|
+
},
|
|
27
|
+
|
|
23
28
|
reserved: {
|
|
24
29
|
type: Object,
|
|
25
30
|
default: null
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
reservedTitle: {
|
|
34
|
+
type: String,
|
|
35
|
+
default: null
|
|
26
36
|
}
|
|
27
37
|
},
|
|
28
38
|
computed: {
|
|
@@ -78,7 +88,7 @@ export default {
|
|
|
78
88
|
>
|
|
79
89
|
<template #title>
|
|
80
90
|
<span>
|
|
81
|
-
{{ t('clusterIndexPage.hardwareResourceGauge.reserved') }}
|
|
91
|
+
{{ reservedTitle ?? t('clusterIndexPage.hardwareResourceGauge.reserved') }}
|
|
82
92
|
<span class="values text-muted">
|
|
83
93
|
<span v-if="reserved.formattedUseful">
|
|
84
94
|
{{ reserved.formattedUseful }}
|
|
@@ -112,7 +122,7 @@ export default {
|
|
|
112
122
|
>
|
|
113
123
|
<template #title>
|
|
114
124
|
<span>
|
|
115
|
-
{{ t('clusterIndexPage.hardwareResourceGauge.used') }}
|
|
125
|
+
{{ usedTitle ?? t('clusterIndexPage.hardwareResourceGauge.used') }}
|
|
116
126
|
<span class="values text-muted">
|
|
117
127
|
<span v-if="used.formattedUseful">
|
|
118
128
|
{{ used.formattedUseful }}
|
|
@@ -39,10 +39,14 @@ export default {
|
|
|
39
39
|
class="label"
|
|
40
40
|
>
|
|
41
41
|
<div class="text-label">
|
|
42
|
-
|
|
42
|
+
<slot name="name">
|
|
43
|
+
{{ name }}
|
|
44
|
+
</slot>
|
|
43
45
|
</div>
|
|
44
46
|
<div class="value">
|
|
45
|
-
|
|
47
|
+
<slot name="value">
|
|
48
|
+
{{ displayValue }}
|
|
49
|
+
</slot>
|
|
46
50
|
</div>
|
|
47
51
|
</div>
|
|
48
52
|
<slot v-else />
|
|
@@ -113,14 +113,14 @@ export default {
|
|
|
113
113
|
:options="routeRadioOptions"
|
|
114
114
|
@update:value="updateLoginRoute"
|
|
115
115
|
>
|
|
116
|
-
<template #2="{option
|
|
116
|
+
<template #2="{option}">
|
|
117
117
|
<div class="custom-page">
|
|
118
118
|
<RadioButton
|
|
119
119
|
:label="option.label"
|
|
120
120
|
:val="false"
|
|
121
121
|
:value="afterLoginRoute=== 'home' || afterLoginRoute === 'last-visited'"
|
|
122
|
+
:v-bind="$attrs"
|
|
122
123
|
@update:value="afterLoginRoute = false"
|
|
123
|
-
v-on="listeners"
|
|
124
124
|
/>
|
|
125
125
|
<Select
|
|
126
126
|
v-model:value="routeFromDropdown"
|
|
@@ -101,6 +101,10 @@ export default {
|
|
|
101
101
|
},
|
|
102
102
|
|
|
103
103
|
computed: {
|
|
104
|
+
dev() {
|
|
105
|
+
return this.$store.getters['prefs/dev'];
|
|
106
|
+
},
|
|
107
|
+
|
|
104
108
|
schema() {
|
|
105
109
|
const inStore = this.storeOverride || this.$store.getters['currentStore'](this.resource);
|
|
106
110
|
|
|
@@ -383,6 +387,10 @@ export default {
|
|
|
383
387
|
hideNamespaceLocation() {
|
|
384
388
|
return this.$store.getters['currentProduct'].hideNamespaceLocation || this.value.namespaceLocation === null;
|
|
385
389
|
},
|
|
390
|
+
|
|
391
|
+
resourceExternalLink() {
|
|
392
|
+
return this.value.resourceExternalLink;
|
|
393
|
+
},
|
|
386
394
|
},
|
|
387
395
|
|
|
388
396
|
methods: {
|
|
@@ -462,6 +470,16 @@ export default {
|
|
|
462
470
|
class="icon icon-sm icon-istio"
|
|
463
471
|
/>
|
|
464
472
|
</span>
|
|
473
|
+
<a
|
|
474
|
+
v-if="dev && !!resourceExternalLink"
|
|
475
|
+
v-clean-tooltip="t(resourceExternalLink.tipsKey || 'generic.resourceExternalLinkTips')"
|
|
476
|
+
class="resource-external"
|
|
477
|
+
rel="nofollow noopener noreferrer"
|
|
478
|
+
target="_blank"
|
|
479
|
+
:href="resourceExternalLink.url"
|
|
480
|
+
>
|
|
481
|
+
<i class="icon icon-external-link" />
|
|
482
|
+
</a>
|
|
465
483
|
</h1>
|
|
466
484
|
</div>
|
|
467
485
|
<div
|
|
@@ -521,7 +539,7 @@ export default {
|
|
|
521
539
|
<button
|
|
522
540
|
v-if="isView"
|
|
523
541
|
ref="actions"
|
|
524
|
-
data-testid="
|
|
542
|
+
data-testid="masthead-action-menu"
|
|
525
543
|
aria-haspopup="true"
|
|
526
544
|
type="button"
|
|
527
545
|
class="btn role-multi-action actions"
|
|
@@ -642,4 +660,7 @@ export default {
|
|
|
642
660
|
justify-content: flex-end;
|
|
643
661
|
}
|
|
644
662
|
|
|
663
|
+
.resource-external {
|
|
664
|
+
font-size: 18px;
|
|
665
|
+
}
|
|
645
666
|
</style>
|
|
@@ -68,11 +68,6 @@ export default {
|
|
|
68
68
|
default: null,
|
|
69
69
|
},
|
|
70
70
|
|
|
71
|
-
flexContent: {
|
|
72
|
-
type: Boolean,
|
|
73
|
-
default: false,
|
|
74
|
-
},
|
|
75
|
-
|
|
76
71
|
/**
|
|
77
72
|
* Inherited global identifier prefix for tests
|
|
78
73
|
* Define a term based on the parent component to avoid conflicts on multiple components
|
|
@@ -173,7 +168,8 @@ export default {
|
|
|
173
168
|
},
|
|
174
169
|
bundle: {
|
|
175
170
|
inStoreType: 'management',
|
|
176
|
-
type: FLEET.BUNDLE
|
|
171
|
+
type: FLEET.BUNDLE,
|
|
172
|
+
opt: { excludeFields: ['metadata.managedFields', 'spec.resources'] },
|
|
177
173
|
},
|
|
178
174
|
|
|
179
175
|
bundleDeployment: {
|
|
@@ -418,7 +414,6 @@ export default {
|
|
|
418
414
|
:offer-preview="offerPreview"
|
|
419
415
|
:done-route="doneRoute"
|
|
420
416
|
:done-override="value.doneOverride"
|
|
421
|
-
:class="{'flex-content': flexContent}"
|
|
422
417
|
@update:value="$emit('input', $event)"
|
|
423
418
|
/>
|
|
424
419
|
|
|
@@ -434,7 +429,6 @@ export default {
|
|
|
434
429
|
:initial-value="initialModel"
|
|
435
430
|
:live-value="liveModel"
|
|
436
431
|
:real-mode="realMode"
|
|
437
|
-
:class="{'flex-content': flexContent}"
|
|
438
432
|
@update:value="$emit('input', $event)"
|
|
439
433
|
@set-subtype="setSubtype"
|
|
440
434
|
/>
|
|
@@ -143,7 +143,6 @@ export default {
|
|
|
143
143
|
type: Function,
|
|
144
144
|
default: null
|
|
145
145
|
},
|
|
146
|
-
|
|
147
146
|
ignoreFilter: {
|
|
148
147
|
type: Boolean,
|
|
149
148
|
default: false
|
|
@@ -183,7 +182,12 @@ export default {
|
|
|
183
182
|
externalPaginationResult: {
|
|
184
183
|
type: Object,
|
|
185
184
|
default: null
|
|
186
|
-
}
|
|
185
|
+
},
|
|
186
|
+
|
|
187
|
+
rowsPerPage: {
|
|
188
|
+
type: Number,
|
|
189
|
+
default: null, // Default comes from the user preference
|
|
190
|
+
},
|
|
187
191
|
},
|
|
188
192
|
|
|
189
193
|
mounted() {
|
|
@@ -457,13 +461,16 @@ export default {
|
|
|
457
461
|
tooltipKey: 'resourceTable.groupBy.none',
|
|
458
462
|
icon: 'icon-list-flat',
|
|
459
463
|
value: 'none',
|
|
460
|
-
}
|
|
461
|
-
|
|
464
|
+
}
|
|
465
|
+
];
|
|
466
|
+
|
|
467
|
+
if (!this.options?.hiddenNamespaceGroupButton) {
|
|
468
|
+
standard.push( {
|
|
462
469
|
tooltipKey: this.groupTooltip,
|
|
463
470
|
icon: 'icon-folder',
|
|
464
471
|
value: 'namespace',
|
|
465
|
-
}
|
|
466
|
-
|
|
472
|
+
});
|
|
473
|
+
}
|
|
467
474
|
|
|
468
475
|
// SUPPLEMENT (instead of REPLACE) defaults with listGroups (given listGroupsWillOverride is false)
|
|
469
476
|
if (!!this.options?.listGroups?.length) {
|
|
@@ -571,6 +578,7 @@ export default {
|
|
|
571
578
|
:paging="true"
|
|
572
579
|
:paging-params="parsedPagingParams"
|
|
573
580
|
:paging-label="pagingLabel"
|
|
581
|
+
:rows-per-page="rowsPerPage"
|
|
574
582
|
:row-actions="rowActions"
|
|
575
583
|
:table-actions="_showBulkActions"
|
|
576
584
|
:overflow-x="overflowX"
|
package/components/SideNav.vue
CHANGED
|
@@ -111,8 +111,10 @@ export default {
|
|
|
111
111
|
|
|
112
112
|
computed: {
|
|
113
113
|
...mapState(['managementReady', 'clusterReady']),
|
|
114
|
-
...mapGetters(['productId', 'clusterId', 'currentProduct', 'rootProduct', 'isSingleProduct', 'namespaceMode', 'isExplorer', 'isVirtualCluster']),
|
|
115
|
-
...mapGetters({
|
|
114
|
+
...mapGetters(['isStandaloneHarvester', 'productId', 'clusterId', 'currentProduct', 'rootProduct', 'isSingleProduct', 'namespaceMode', 'isExplorer', 'isVirtualCluster']),
|
|
115
|
+
...mapGetters({
|
|
116
|
+
locale: 'i18n/selectedLocaleLabel', availableLocales: 'i18n/availableLocales', hasMultipleLocales: 'i18n/hasMultipleLocales'
|
|
117
|
+
}),
|
|
116
118
|
...mapGetters('type-map', ['activeProducts']),
|
|
117
119
|
|
|
118
120
|
favoriteTypes: mapPref(FAVORITE_TYPES),
|
|
@@ -437,7 +439,7 @@ export default {
|
|
|
437
439
|
</span>
|
|
438
440
|
|
|
439
441
|
<!-- locale selector -->
|
|
440
|
-
<span v-if="isSingleProduct">
|
|
442
|
+
<span v-if="isSingleProduct && hasMultipleLocales && !isStandaloneHarvester">
|
|
441
443
|
<v-dropdown
|
|
442
444
|
popperClass="localeSelector"
|
|
443
445
|
placement="top"
|
|
@@ -482,7 +484,7 @@ export default {
|
|
|
482
484
|
<template v-else>
|
|
483
485
|
<span
|
|
484
486
|
v-if="isVirtualCluster && isExplorer"
|
|
485
|
-
v-tooltip="{content: harvesterVersion, placement: 'top'}"
|
|
487
|
+
v-clean-tooltip="{content: harvesterVersion, placement: 'top'}"
|
|
486
488
|
class="clip text-muted ml-5"
|
|
487
489
|
>
|
|
488
490
|
(Harvester-{{ harvesterVersion }})
|
|
@@ -16,7 +16,6 @@ import {
|
|
|
16
16
|
FLEET_REPO_PER_CLUSTER_STATE
|
|
17
17
|
|
|
18
18
|
} from '@shell/config/table-headers';
|
|
19
|
-
import { FLEET } from '@shell/config/labels-annotations';
|
|
20
19
|
import { STATES_ENUM } from '@shell/plugins/dashboard-store/resource-class';
|
|
21
20
|
|
|
22
21
|
// i18n-ignore repoDisplay
|
|
@@ -118,12 +117,6 @@ export default {
|
|
|
118
117
|
parseTargetMode(row) {
|
|
119
118
|
return row.targetInfo?.mode === 'clusterGroup' ? this.t('fleet.gitRepo.warningTooltip.clusterGroup') : this.t('fleet.gitRepo.warningTooltip.cluster');
|
|
120
119
|
},
|
|
121
|
-
|
|
122
|
-
clusterViewResourceStatus(row) {
|
|
123
|
-
return row.clusterResourceStatus.find((c) => {
|
|
124
|
-
return c.metadata?.labels[FLEET.CLUSTER_NAME] === this.clusterId;
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
120
|
},
|
|
128
121
|
};
|
|
129
122
|
</script>
|