@rancher/shell 2.0.0 → 2.0.2-rc.1
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/translations/en-us.yaml +69 -29
- package/assets/translations/zh-hans.yaml +1 -0
- package/components/AlertTable.vue +17 -7
- package/components/AssignTo.vue +2 -0
- package/components/GrafanaDashboard.vue +6 -4
- package/components/PromptRemove.vue +1 -0
- package/components/Questions/index.vue +2 -2
- package/components/auth/RoleDetailEdit.vue +5 -4
- package/components/form/KeyValue.vue +1 -0
- package/components/form/Members/ClusterPermissionsEditor.vue +1 -1
- package/components/form/ProjectMemberEditor.vue +1 -1
- package/components/form/ResourceLabeledSelect.vue +11 -3
- package/components/form/Taints.vue +13 -7
- package/components/form/__tests__/Taints.test.ts +70 -0
- package/components/form/labeled-select-utils/labeled-select.utils.ts +1 -1
- package/components/nav/Header.vue +1 -1
- package/components/nav/TopLevelMenu.vue +1 -4
- package/config/pagination-table-headers.js +5 -4
- package/config/product/auth.js +1 -1
- package/config/roles.ts +34 -19
- package/config/router/navigation-guards/attempt-first-login.js +1 -1
- package/config/router/navigation-guards/authentication.js +1 -1
- package/config/router/navigation-guards/i18n.js +13 -0
- package/config/router/navigation-guards/index.js +3 -1
- package/config/router/navigation-guards/load-initial-settings.js +1 -1
- package/config/router/navigation-guards/runtime-extension-route.js +31 -0
- package/config/router/routes.js +10 -1
- package/config/uiplugins.js +130 -61
- package/core/plugin.ts +5 -0
- package/core/plugins.js +7 -1
- package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +42 -0
- package/detail/provisioning.cattle.io.cluster.vue +4 -4
- package/dialog/DeactivateDriverDialog.vue +30 -11
- package/edit/auth/__tests__/oidc.test.ts +2 -2
- package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +86 -13
- package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +3 -134
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +209 -0
- package/edit/provisioning.cattle.io.cluster/index.vue +8 -4
- package/edit/provisioning.cattle.io.cluster/rke2.vue +115 -17
- package/edit/provisioning.cattle.io.cluster/tabs/AddOnAdditionalManifest.vue +50 -0
- package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +29 -64
- package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +42 -3
- package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +22 -86
- package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +8 -2
- package/edit/provisioning.cattle.io.cluster/tabs/registries/__tests__/RegistryConfigs.test.ts +61 -0
- package/edit/token.vue +2 -1
- package/initialize/entry-helpers.js +4 -24
- package/list/management.cattle.io.feature.vue +4 -2
- package/middleware/authenticated.js +0 -19
- package/mixins/__tests__/chart.test.ts +4 -1
- package/mixins/auth-config.js +1 -1
- package/mixins/chart.js +30 -14
- package/models/__tests__/apps.deployment.test.ts +93 -0
- package/models/apps.deployment.js +18 -4
- package/models/driver.js +3 -2
- package/models/kontainerdriver.js +30 -13
- package/models/management.cattle.io.authconfig.js +2 -2
- package/models/management.cattle.io.cluster.js +2 -2
- package/models/management.cattle.io.user.js +3 -3
- package/models/nodedriver.js +35 -13
- package/models/provisioning.cattle.io.cluster.js +4 -0
- package/package.json +3 -2
- package/pages/404.vue +15 -0
- package/pages/auth/login.vue +4 -1
- package/pages/auth/setup.vue +4 -1
- package/pages/c/_cluster/apps/charts/install.vue +3 -2
- package/pages/c/_cluster/explorer/index.vue +5 -0
- package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +0 -3
- package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +1 -4
- package/pages/c/_cluster/manager/jwt.authentication/index.vue +10 -4
- package/pages/c/_cluster/settings/performance.vue +2 -2
- package/pages/c/_cluster/uiplugins/InstallDialog.vue +2 -1
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +7 -10
- package/pages/c/_cluster/uiplugins/index.vue +24 -16
- package/pages/home.vue +1 -13
- package/plugins/dashboard-store/actions.js +1 -1
- package/plugins/dashboard-store/getters.js +1 -1
- package/plugins/steve/__tests__/getters.test.ts +5 -5
- package/plugins/steve/getters.js +6 -4
- package/plugins/steve/hybrid-class.js +1 -5
- package/promptRemove/pod.vue +15 -7
- package/scripts/extension/helm/charts/ui-plugin-server/Chart.yaml +1 -1
- package/scripts/publish-shell.sh +54 -55
- package/scripts/test-plugins-build.sh +45 -39
- package/shell/types/shell/index.d.ts +2 -0
- package/store/auth.js +1 -1
- package/store/index.js +1 -1
- package/store/type-map.js +4 -2
- package/types/store/pagination.types.ts +1 -1
- package/utils/__tests__/kontainer.test.ts +89 -1
- package/utils/auth.js +1 -1
- package/utils/cluster.js +9 -0
- package/utils/kontainer.ts +5 -1
- package/utils/settings.ts +3 -1
- package/utils/version.js +2 -1
- package/creators/app/app.package.json +0 -13
- package/creators/app/files/.eslintignore +0 -16
- package/creators/app/files/.eslintrc.js +0 -173
- package/creators/app/files/.gitignore +0 -70
- package/creators/app/files/.gitlab-ci.yml +0 -14
- package/creators/app/files/.vscode/settings.json +0 -21
- package/creators/app/files/babel.config.js +0 -1
- package/creators/app/files/tsconfig.json +0 -42
- package/creators/app/files/vue.config.js +0 -6
- package/creators/app/init +0 -120
- package/creators/app/package.json +0 -25
- package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +0 -24
- package/creators/pkg/files/.github/workflows/build-extension-charts.yml +0 -22
- package/creators/pkg/files/babel.config.js +0 -1
- package/creators/pkg/files/index.ts +0 -14
- package/creators/pkg/files/tsconfig.json +0 -53
- package/creators/pkg/files/vue.config.js +0 -1
- package/creators/pkg/init +0 -286
- package/creators/pkg/package.json +0 -19
- package/creators/pkg/pkg.package.json +0 -21
- package/creators/pkg/vue-shim.ts +0 -4
- package/creators/update/init +0 -56
- package/creators/update/package.json +0 -20
- package/creators/update/upgrade +0 -56
- package/rancher-components/components/Accordion/Accordion.test.ts +0 -45
- package/rancher-components/components/Accordion/Accordion.vue +0 -86
- package/rancher-components/components/Accordion/index.ts +0 -1
- package/rancher-components/components/BadgeState/BadgeState.test.ts +0 -12
- package/rancher-components/components/BadgeState/BadgeState.vue +0 -111
- package/rancher-components/components/BadgeState/index.ts +0 -1
- package/rancher-components/components/Banner/Banner.test.ts +0 -59
- package/rancher-components/components/Banner/Banner.vue +0 -244
- package/rancher-components/components/Banner/index.ts +0 -1
- package/rancher-components/components/Card/Card.test.ts +0 -37
- package/rancher-components/components/Card/Card.vue +0 -167
- package/rancher-components/components/Card/index.ts +0 -1
- package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +0 -68
- package/rancher-components/components/Form/Checkbox/Checkbox.vue +0 -421
- package/rancher-components/components/Form/Checkbox/index.ts +0 -1
- package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +0 -40
- package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +0 -402
- package/rancher-components/components/Form/LabeledInput/index.ts +0 -1
- package/rancher-components/components/Form/Radio/RadioButton.test.ts +0 -33
- package/rancher-components/components/Form/Radio/RadioButton.vue +0 -293
- package/rancher-components/components/Form/Radio/RadioGroup.test.ts +0 -30
- package/rancher-components/components/Form/Radio/RadioGroup.vue +0 -259
- package/rancher-components/components/Form/Radio/index.ts +0 -2
- package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +0 -172
- package/rancher-components/components/Form/TextArea/index.ts +0 -1
- package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +0 -94
- package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +0 -152
- package/rancher-components/components/Form/ToggleSwitch/index.ts +0 -1
- package/rancher-components/components/Form/index.ts +0 -5
- package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +0 -156
- package/rancher-components/components/LabeledTooltip/index.ts +0 -1
- package/rancher-components/components/StringList/StringList.test.ts +0 -754
- package/rancher-components/components/StringList/StringList.vue +0 -650
- package/rancher-components/components/StringList/index.ts +0 -1
- package/types/shell/index.d.ts +0 -4585
|
@@ -572,7 +572,7 @@ authConfig:
|
|
|
572
572
|
title: Are you sure? This update is irreversible.
|
|
573
573
|
body: '<p><b>You may need to make some additional changes</b>. Please ensure the Azure AD app has the Directory.Read.All <b>Application</b> permission added to Microsoft Graph.<br> If any endpoints were customized while configuring Azure AD authentication in Rancher, they will not be automatically updated. </p>'
|
|
574
574
|
oidc:
|
|
575
|
-
|
|
575
|
+
genericoidc: Configure an OIDC account
|
|
576
576
|
keycloakoidc: Configure a Keycloak OIDC account
|
|
577
577
|
rancherUrl: Rancher URL
|
|
578
578
|
clientId: Client ID
|
|
@@ -1186,17 +1186,39 @@ cluster:
|
|
|
1186
1186
|
banner: "Service Account access with JWT authentication can be configured after cluster creation from <br>
|
|
1187
1187
|
<code>Cluster Management > Advanced > JWT Authentication</code>"
|
|
1188
1188
|
addonChart:
|
|
1189
|
-
rancher-vsphere-cpi:
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
rke2-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
rke2-
|
|
1199
|
-
|
|
1189
|
+
rancher-vsphere-cpi:
|
|
1190
|
+
label: vSphere CPI
|
|
1191
|
+
configuration: vSphere CPI Configuration
|
|
1192
|
+
rancher-vsphere-csi:
|
|
1193
|
+
label: vSphere CSI
|
|
1194
|
+
configuration: vSphere CSI Configuration
|
|
1195
|
+
rke2-calico:
|
|
1196
|
+
label: Calico
|
|
1197
|
+
configuration: Calico Configuration
|
|
1198
|
+
rke2-calico-crd:
|
|
1199
|
+
label: Calico
|
|
1200
|
+
configuration: Calico Configuration
|
|
1201
|
+
rke2-canal:
|
|
1202
|
+
label: Canal
|
|
1203
|
+
configuration: Canal Configuration
|
|
1204
|
+
rke2-cilium:
|
|
1205
|
+
label: Cilium
|
|
1206
|
+
configuration: Cilium Configuration
|
|
1207
|
+
rke2-coredns:
|
|
1208
|
+
label: CoreDNS
|
|
1209
|
+
configuration: CoreDNS Configuration
|
|
1210
|
+
rke2-ingress-nginx:
|
|
1211
|
+
label: NGINX
|
|
1212
|
+
configuration: NGINX Ingress Configuration
|
|
1213
|
+
rke2-kube-proxy:
|
|
1214
|
+
label: Kube Proxy
|
|
1215
|
+
configuration: Kube Proxy Configuration
|
|
1216
|
+
rke2-metrics-server:
|
|
1217
|
+
label: Metrics Server
|
|
1218
|
+
configuration: Metrics Server Configuration
|
|
1219
|
+
rke2-multus:
|
|
1220
|
+
label: Multus
|
|
1221
|
+
configuration: Multus Configuration
|
|
1200
1222
|
agentEnvVars:
|
|
1201
1223
|
label: Agent Environment
|
|
1202
1224
|
detail: Add additional environment variables to the agent container. This is most commonly useful for configuring a HTTP proxy.
|
|
@@ -1443,10 +1465,6 @@ cluster:
|
|
|
1443
1465
|
placeholder: A unique name for the cluster
|
|
1444
1466
|
directoryConfig:
|
|
1445
1467
|
title: Data directory configuration
|
|
1446
|
-
checkboxText: Use the same path for System-agent, Provisioning and K8s Distro data directories configuration
|
|
1447
|
-
common:
|
|
1448
|
-
label: Data directory configuration path
|
|
1449
|
-
tooltip: Data directory configuration for System-agent, Provisioning and K8s Distro
|
|
1450
1468
|
systemAgent:
|
|
1451
1469
|
label: System-agent directory path
|
|
1452
1470
|
tooltip: Data directory for the system-agent connection info and plans
|
|
@@ -1782,7 +1800,9 @@ cluster:
|
|
|
1782
1800
|
rke2-k3-reprovisioning: 'Making changes to cluster configuration may result in nodes reprovisioning. For more information see the <a href="{docsBase}/how-to-guides/new-user-guides/launch-kubernetes-with-rancher/rke1-vs-rke2-differences#cluster-api" target="_blank" rel="noopener nofollow">documentation</a>.'
|
|
1783
1801
|
desiredNodeGroupWarning: There are 0 nodes available to run the cluster agent. The cluster will not become active until at least one node is available.
|
|
1784
1802
|
haveArgInfo: Configuration information is not available for the selected Kubernetes version. The options available on this screen will be limited; you may want to use the YAML editor.
|
|
1785
|
-
cloudProviderAddConfig: 'On Kubernetes 1.27 or greater, the Amazon Cloud Provider requires additional configuration. See <a href="https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/kubernetes-clusters-in-rancher-setup/set-up-cloud-providers/amazon" target="_blank" rel="noopener noreferrer nofollow">the documentation</a> for more information.'
|
|
1803
|
+
cloudProviderAddConfig: 'On Kubernetes 1.27 or greater, the <b>Amazon</b> Cloud Provider requires additional configuration. See <a href="https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/kubernetes-clusters-in-rancher-setup/set-up-cloud-providers/amazon" target="_blank" rel="noopener noreferrer nofollow">the documentation</a> for more information.'
|
|
1804
|
+
cloudProviderUnsupportedAzure: 'On Kubernetes 1.30 or greater, the <b>Azure</b> Cloud Provider has been removed. See <a href="https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/kubernetes-clusters-in-rancher-setup/set-up-cloud-providers/azure" target="_blank" rel="noopener noreferrer nofollow">the documentation</a> for more information.'
|
|
1805
|
+
cloudProviderMigrateAzure: 'On Kubernetes 1.30 or greater, the <b>Azure</b> Cloud Provider has been removed. To upgrade Kubernetes, the cluster should be migrated to External provider first.<br> See <a href="https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/kubernetes-clusters-in-rancher-setup/set-up-cloud-providers/azure" target="_blank" rel="noopener noreferrer nofollow">the documentation</a> for more information.'
|
|
1786
1806
|
machinePoolError: |-
|
|
1787
1807
|
{count, plural,
|
|
1788
1808
|
=1 { {pool_name}: The provided value for {fields} was not found in the list of expected values. This can happen with clusters provisioned outside of Rancher or when options for the provider have changed. }
|
|
@@ -1920,6 +1940,7 @@ cluster:
|
|
|
1920
1940
|
oracleoke: Oracle OKE
|
|
1921
1941
|
otc: Open Telekom Cloud
|
|
1922
1942
|
other: Other
|
|
1943
|
+
ovhcloudmks: OVHcloud MKS
|
|
1923
1944
|
packet: Equinix Metal
|
|
1924
1945
|
pinganyunecs: Pinganyun ECS
|
|
1925
1946
|
pnap: phoenixNAP
|
|
@@ -2082,7 +2103,7 @@ cluster:
|
|
|
2082
2103
|
s3: s3
|
|
2083
2104
|
tabs:
|
|
2084
2105
|
ace: Authorized Endpoint
|
|
2085
|
-
|
|
2106
|
+
addOnAdditionalManifest: Additional Manifest
|
|
2086
2107
|
advanced: Advanced
|
|
2087
2108
|
agentEnv: Agent Environment Vars
|
|
2088
2109
|
basic: Basics
|
|
@@ -2225,7 +2246,22 @@ drivers:
|
|
|
2225
2246
|
refresh: Refresh Kubernetes Metadata
|
|
2226
2247
|
deactivate:
|
|
2227
2248
|
title: Are you sure?
|
|
2228
|
-
|
|
2249
|
+
andOthers: |-
|
|
2250
|
+
{count, plural,
|
|
2251
|
+
=0 {}
|
|
2252
|
+
=1 { and <b>one other </b>}
|
|
2253
|
+
other { and <b>{count} other </b>}
|
|
2254
|
+
}
|
|
2255
|
+
warningDrivers: |-
|
|
2256
|
+
{count, plural,
|
|
2257
|
+
=1 { You will no longer be able to edit the configuration of clusters using {names} driver.}
|
|
2258
|
+
other { You will no longer be able to edit the configuration of clusters using {names} drivers.}
|
|
2259
|
+
}
|
|
2260
|
+
warning: |-
|
|
2261
|
+
{count, plural,
|
|
2262
|
+
=1 { {warningDrivers} Resources in the corresponding provider will not be automatically removed.}
|
|
2263
|
+
other { {warningDrivers} Resources in the corresponding providers will not be automatically removed.}
|
|
2264
|
+
}
|
|
2229
2265
|
|
|
2230
2266
|
detailText:
|
|
2231
2267
|
collapse: Hide
|
|
@@ -4235,8 +4271,10 @@ inactivity:
|
|
|
4235
4271
|
|
|
4236
4272
|
# Rancher Extensions
|
|
4237
4273
|
plugins:
|
|
4238
|
-
incompatibleRancherVersion: "The latest version of this extension ({ version }) is not compatible with the current Rancher version ({
|
|
4239
|
-
incompatibleKubeVersion: "The latest version of this extension ({ version }) is not compatible with the current Kube version ({
|
|
4274
|
+
incompatibleRancherVersion: "The latest version of this extension ({ version }) is not compatible with the current Rancher version ({ required })."
|
|
4275
|
+
incompatibleKubeVersion: "The latest version of this extension ({ version }) is not compatible with the current Kube version ({ required })."
|
|
4276
|
+
incompatibleUiExtensionsApiVersion: "The latest version of this extension ({ version }) is not compatible with the current Extensions API version ({ required })."
|
|
4277
|
+
incompatibleHost: 'The latest version of this extension ({ version }) has a host of "{ required }" which is not compatible with this application "{ mainHost }".'
|
|
4240
4278
|
currentInstalledVersionBlockedByKubeVersion: "This version is not compatible with the current Kubernetes version ({ kubeVersion } Vs { kubeVersionToCheck })."
|
|
4241
4279
|
labels:
|
|
4242
4280
|
builtin: Built-in
|
|
@@ -4274,8 +4312,10 @@ plugins:
|
|
|
4274
4312
|
detail: Detail
|
|
4275
4313
|
versions: Versions
|
|
4276
4314
|
versionError: Could not load version information
|
|
4277
|
-
requiresRancherVersion: "Requires Rancher {
|
|
4278
|
-
requiresKubeVersion: "Requires Kube version {
|
|
4315
|
+
requiresRancherVersion: "Requires Rancher {required}"
|
|
4316
|
+
requiresKubeVersion: "Requires Kube version {required}"
|
|
4317
|
+
requiresExtensionApiVersion: "Requires Extensions API version {required}"
|
|
4318
|
+
requiresHost: 'Requires a host that matches "{required}"'
|
|
4279
4319
|
empty:
|
|
4280
4320
|
all: Extensions are neither installed nor available
|
|
4281
4321
|
available: No Extensions available
|
|
@@ -6582,7 +6622,7 @@ model:
|
|
|
6582
6622
|
okta: Okta
|
|
6583
6623
|
freeipa: FreeIPA
|
|
6584
6624
|
googleoauth: Google
|
|
6585
|
-
|
|
6625
|
+
genericoidc: Generic OIDC
|
|
6586
6626
|
keycloakoidc: Keycloak
|
|
6587
6627
|
|
|
6588
6628
|
cluster:
|
|
@@ -7387,7 +7427,7 @@ performance:
|
|
|
7387
7427
|
When enabled, resources will appear more quickly, but it may take slightly longer to load the entire set of resources. This setting only applies to resources that come from the Kubernetes API
|
|
7388
7428
|
checkboxLabel: Enable incremental loading
|
|
7389
7429
|
inputLabel: Resource Threshold
|
|
7390
|
-
incompatibleDescription: "Incremental Loading is
|
|
7430
|
+
incompatibleDescription: "Incremental Loading is incompatible with Namespace/Project filtering and Server-side Pagination. Enabling this will disable them."
|
|
7391
7431
|
manualRefresh:
|
|
7392
7432
|
label: Manual Refresh
|
|
7393
7433
|
setting: You can configure a threshold above which manual refresh will be enabled.
|
|
@@ -7396,7 +7436,7 @@ performance:
|
|
|
7396
7436
|
When enabled, list data will not auto-update but instead the user must manually trigger a list-view refresh. This setting only applies to resources that come from the Kubernetes API
|
|
7397
7437
|
checkboxLabel: Enable manual refresh of data for lists
|
|
7398
7438
|
inputLabel: Resource Threshold
|
|
7399
|
-
incompatibleDescription: "Manual Refresh is
|
|
7439
|
+
incompatibleDescription: "Manual Refresh is incompatible with Namespace/Project filtering and Server-side Pagination. Enabling this will disable them."
|
|
7400
7440
|
websocketNotification:
|
|
7401
7441
|
label: Websocket Notifications
|
|
7402
7442
|
description: |-
|
|
@@ -7427,7 +7467,7 @@ performance:
|
|
|
7427
7467
|
label: Require Namespace / Project Filtering
|
|
7428
7468
|
description: Require the user to select namespaces and/or projects. This restricts the number of resources fetched when viewing lists and should help the responsiveness of the UI in systems with a lot of resources.
|
|
7429
7469
|
checkboxLabel: Enable Required Namespace / Project Filtering
|
|
7430
|
-
incompatibleDescription: "Required Namespace / Project Filtering is
|
|
7470
|
+
incompatibleDescription: "Required Namespace / Project Filtering is incompatible with Manual Refresh and Incremental Loading. Enabling this will disable them."
|
|
7431
7471
|
advancedWorker:
|
|
7432
7472
|
label: Websocket Web Worker
|
|
7433
7473
|
description: Updates to resources pushed to the UI come via WebSocket and are handled in the UI thread. Enable this option to handle cluster WebSocket updates in a Web Worker in a separate thread. This should help the responsiveness of the UI in systems where resources change often.
|
|
@@ -7444,7 +7484,7 @@ performance:
|
|
|
7444
7484
|
description: By default Lists will fetch all resources and paginate in the browser (create the page given sorting and filtering settings). Change this setting to enable pagination server-side. This should help the responsiveness of the UI in systems with a lot of resources.
|
|
7445
7485
|
checkboxLabel: Enable Server-side Pagination
|
|
7446
7486
|
applicable: "This applies to the following resource types"
|
|
7447
|
-
incompatibleDescription: "Server-side Pagination is
|
|
7487
|
+
incompatibleDescription: "Server-side Pagination is incompatible with Manual Refresh and Incremental Loading. Enabling this will disable them."
|
|
7448
7488
|
featureFlag: The <a href="{ffUrl}">Feature Flag</a> `ui-sql-cache` must be enabled to use this feature
|
|
7449
7489
|
resources:
|
|
7450
7490
|
generic: most resources in the cluster's 'More Resources' section
|
|
@@ -7774,4 +7814,4 @@ gitPicker:
|
|
|
7774
7814
|
|
|
7775
7815
|
networkAttachmentDefinition:
|
|
7776
7816
|
tabs:
|
|
7777
|
-
config: Config
|
|
7817
|
+
config: Config
|
|
@@ -49,6 +49,7 @@ export default {
|
|
|
49
49
|
];
|
|
50
50
|
|
|
51
51
|
return {
|
|
52
|
+
inStore: this.$store.getters['currentProduct'].inStore,
|
|
52
53
|
alertManagerPoller: new Poller(
|
|
53
54
|
this.loadAlertManagerEvents,
|
|
54
55
|
ALERTMANAGER_POLL_RATE_MS,
|
|
@@ -69,15 +70,24 @@ export default {
|
|
|
69
70
|
},
|
|
70
71
|
|
|
71
72
|
methods: {
|
|
72
|
-
async
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
{ url: `/k8s/clusters/${ this.currentCluster.id }/api/v1/namespaces/${ this.monitoringNamespace }/services/http:${ this.alertServiceEndpoint }:9093/proxy/api/v1/alerts` }
|
|
73
|
+
async fetchAlertManagerEvents(version) {
|
|
74
|
+
return await this.$store.dispatch(
|
|
75
|
+
`${ this.inStore }/request`,
|
|
76
|
+
{ url: `/k8s/clusters/${ this.currentCluster.id }/api/v1/namespaces/${ this.monitoringNamespace }/services/http:${ this.alertServiceEndpoint }:9093/proxy/api/${ version }/alerts` }
|
|
77
77
|
);
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
async loadAlertManagerEvents() {
|
|
81
|
+
let alertEvents;
|
|
82
|
+
|
|
83
|
+
try {
|
|
84
|
+
alertEvents = await this.fetchAlertManagerEvents('v2');
|
|
85
|
+
} catch (err) {
|
|
86
|
+
alertEvents = await this.fetchAlertManagerEvents('v1').then((res) => res?.data);
|
|
87
|
+
}
|
|
78
88
|
|
|
79
|
-
if (
|
|
80
|
-
this.allAlerts =
|
|
89
|
+
if (alertEvents) {
|
|
90
|
+
this.allAlerts = alertEvents;
|
|
81
91
|
}
|
|
82
92
|
},
|
|
83
93
|
|
package/components/AssignTo.vue
CHANGED
|
@@ -4,6 +4,7 @@ import { FLEET, NORMAN } from '@shell/config/types';
|
|
|
4
4
|
import LabeledSelect from '@shell/components/form/LabeledSelect';
|
|
5
5
|
import KeyValue from '@shell/components/form/KeyValue';
|
|
6
6
|
import AsyncButton from '@shell/components/AsyncButton';
|
|
7
|
+
import AppModal from '@shell/components/AppModal.vue';
|
|
7
8
|
import { Card } from '@components/Card';
|
|
8
9
|
import { Banner } from '@components/Banner';
|
|
9
10
|
import { exceptionToErrorsArray } from '@shell/utils/error';
|
|
@@ -16,6 +17,7 @@ export default {
|
|
|
16
17
|
KeyValue,
|
|
17
18
|
AsyncButton,
|
|
18
19
|
Banner,
|
|
20
|
+
AppModal
|
|
19
21
|
},
|
|
20
22
|
|
|
21
23
|
data() {
|
|
@@ -114,10 +114,12 @@ export default {
|
|
|
114
114
|
this.interval = setInterval(() => {
|
|
115
115
|
try {
|
|
116
116
|
const graphWindow = this.$refs.frame?.contentWindow;
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const
|
|
120
|
-
const
|
|
117
|
+
|
|
118
|
+
// Note. getElementsByClassName won't work, following a grafana bump class names are now unique - for example css-2qng6u-panel-container
|
|
119
|
+
const errorElements = graphWindow.document.querySelectorAll('[class$="alert-error');
|
|
120
|
+
const errorCornerElements = graphWindow.document.querySelectorAll('[class$="panel-info-corner--error');
|
|
121
|
+
const panelInFullScreenElements = graphWindow.document.querySelectorAll('[class$="panel-in-fullscreen');
|
|
122
|
+
const panelContainerElements = graphWindow.document.querySelectorAll('[class$="panel-container');
|
|
121
123
|
const error = errorElements.length > 0 || errorCornerElements.length > 0;
|
|
122
124
|
const loaded = panelInFullScreenElements.length > 0 || panelContainerElements.length > 0;
|
|
123
125
|
const errorMessageElms = graphWindow.document.getElementsByTagName('pre');
|
|
@@ -45,9 +45,9 @@ export function componentForQuestion(q) {
|
|
|
45
45
|
|
|
46
46
|
if ( knownTypes[type] ) {
|
|
47
47
|
return type;
|
|
48
|
-
} else if ( type.startsWith('array
|
|
48
|
+
} else if ( type.startsWith('array') ) { // This only really works for array[string|multiline], but close enough for now.
|
|
49
49
|
return ArrayType;
|
|
50
|
-
} else if ( type.startsWith('map
|
|
50
|
+
} else if ( type.startsWith('map') ) { // Same, only works with map[string|multiline]
|
|
51
51
|
return MapType;
|
|
52
52
|
} else if ( type.startsWith('reference[') ) { // Same, only works with map[string|multiline]
|
|
53
53
|
return ReferenceType;
|
|
@@ -14,7 +14,7 @@ import Tabbed from '@shell/components/Tabbed';
|
|
|
14
14
|
import { ucFirst } from '@shell/utils/string';
|
|
15
15
|
import SortableTable from '@shell/components/SortableTable';
|
|
16
16
|
import { _CLONE, _DETAIL } from '@shell/config/query-params';
|
|
17
|
-
import { SCOPED_RESOURCES } from '@shell/config/roles';
|
|
17
|
+
import { SCOPED_RESOURCES, SCOPED_RESOURCE_GROUPS } from '@shell/config/roles';
|
|
18
18
|
import { Banner } from '@components/Banner';
|
|
19
19
|
|
|
20
20
|
import { SUBTYPE_MAPPING, VERBS } from '@shell/models/management.cattle.io.roletemplate';
|
|
@@ -195,16 +195,17 @@ export default {
|
|
|
195
195
|
const scopes = Object.keys(this.scopedResources);
|
|
196
196
|
|
|
197
197
|
scopes.forEach((scope) => {
|
|
198
|
-
if (scope ===
|
|
198
|
+
if (scope === SCOPED_RESOURCE_GROUPS.GLOBAL && this.value.type !== MANAGEMENT.GLOBAL_ROLE) {
|
|
199
199
|
// If we are not in the global role creation form,
|
|
200
200
|
// skip adding the global-scoped resources.
|
|
201
201
|
return;
|
|
202
202
|
}
|
|
203
|
-
if (scope ===
|
|
203
|
+
if (scope === SCOPED_RESOURCE_GROUPS.CLUSTER && (this.value.type === RBAC.ROLE || this.value.subtype === NAMESPACE)) {
|
|
204
204
|
// If we are in a project/namespace role creation form,
|
|
205
205
|
// additionally skip adding the cluster-scoped resources.
|
|
206
206
|
return;
|
|
207
207
|
}
|
|
208
|
+
|
|
208
209
|
const apiGroupsInScope = this.scopedResources[scope];
|
|
209
210
|
|
|
210
211
|
const apiGroupNames = Object.keys(apiGroupsInScope);
|
|
@@ -237,7 +238,7 @@ export default {
|
|
|
237
238
|
const labelForNamespaceScoped = this.t('rbac.roletemplate.tabs.grantResources.neuvector.labelNamespaceScoped');
|
|
238
239
|
|
|
239
240
|
apiGroupLabel = scope.includes('cluster') ? labelForClusterScoped : labelForNamespaceScoped;
|
|
240
|
-
apiGroupValue = '
|
|
241
|
+
apiGroupValue = 'permission.neuvector.com';
|
|
241
242
|
}
|
|
242
243
|
|
|
243
244
|
options.push({
|
|
@@ -177,7 +177,7 @@ export default {
|
|
|
177
177
|
},
|
|
178
178
|
customPermissionsUpdate() {
|
|
179
179
|
return this.customPermissions.reduce((acc, customPermissionsItem) => {
|
|
180
|
-
const lockedExist = this.roleTemplates.find((roleTemplateItem) => roleTemplateItem.
|
|
180
|
+
const lockedExist = this.roleTemplates.find((roleTemplateItem) => roleTemplateItem.id === customPermissionsItem.key);
|
|
181
181
|
|
|
182
182
|
if (lockedExist.locked) {
|
|
183
183
|
customPermissionsItem['locked'] = true;
|
|
@@ -192,7 +192,7 @@ export default {
|
|
|
192
192
|
},
|
|
193
193
|
customPermissionsUpdate() {
|
|
194
194
|
return this.customPermissions.reduce((acc, customPermissionsItem) => {
|
|
195
|
-
const lockedExist = this.roleTemplates.find((roleTemplateItem) => roleTemplateItem.
|
|
195
|
+
const lockedExist = this.roleTemplates.find((roleTemplateItem) => roleTemplateItem.id === customPermissionsItem.key);
|
|
196
196
|
|
|
197
197
|
if (lockedExist.locked) {
|
|
198
198
|
customPermissionsItem['locked'] = true;
|
|
@@ -126,11 +126,17 @@ export default defineComponent({
|
|
|
126
126
|
|
|
127
127
|
computed: {
|
|
128
128
|
labelSelectAttributes() {
|
|
129
|
+
// This component is a wrapper for LabelSelect, so pass through everything
|
|
130
|
+
const allAttrs = {
|
|
131
|
+
...this.$attrs, // Attributes (other than props)
|
|
132
|
+
...this.$props, // Attributes that are props
|
|
133
|
+
};
|
|
134
|
+
|
|
129
135
|
return this.paginate ? {
|
|
130
|
-
...
|
|
136
|
+
...allAttrs,
|
|
131
137
|
...this.paginatedResourceSettings?.labelSelectOptions || {}
|
|
132
138
|
} : {
|
|
133
|
-
...
|
|
139
|
+
...allAttrs,
|
|
134
140
|
...this.allResourcesSettings?.labelSelectOptions || {}
|
|
135
141
|
};
|
|
136
142
|
},
|
|
@@ -156,7 +162,9 @@ export default defineComponent({
|
|
|
156
162
|
}
|
|
157
163
|
|
|
158
164
|
const { filter } = opts;
|
|
159
|
-
const filters = !!filter ? [PaginationParamFilter.createSingleField({
|
|
165
|
+
const filters = !!filter ? [PaginationParamFilter.createSingleField({
|
|
166
|
+
field: 'metadata.name', value: filter, exact: false
|
|
167
|
+
})] : [];
|
|
160
168
|
const defaultOptions: LabelSelectPaginationFunctionOptions = {
|
|
161
169
|
opts,
|
|
162
170
|
filters,
|
|
@@ -3,10 +3,10 @@ import KeyValue from '@shell/components/form/KeyValue';
|
|
|
3
3
|
import { _VIEW } from '@shell/config/query-params';
|
|
4
4
|
import Select from '@shell/components/form/Select';
|
|
5
5
|
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
const DEFAULT_EFFECT_VALUES = {
|
|
7
|
+
NoSchedule: 'NoSchedule',
|
|
8
|
+
PreferNoSchedule: 'PreferNoSchedule',
|
|
9
|
+
NoExecute: 'NoExecute',
|
|
10
10
|
};
|
|
11
11
|
|
|
12
12
|
export default {
|
|
@@ -24,11 +24,15 @@ export default {
|
|
|
24
24
|
disabled: {
|
|
25
25
|
default: false,
|
|
26
26
|
type: Boolean
|
|
27
|
+
},
|
|
28
|
+
effectValues: {
|
|
29
|
+
type: Object,
|
|
30
|
+
default: () => DEFAULT_EFFECT_VALUES
|
|
27
31
|
}
|
|
28
32
|
},
|
|
29
33
|
|
|
30
34
|
data() {
|
|
31
|
-
return { effectOptions: Object.
|
|
35
|
+
return { effectOptions: Object.keys(this.effectValues).map((k) => ({ label: this.effectValues[k], value: k })) };
|
|
32
36
|
},
|
|
33
37
|
|
|
34
38
|
computed: {
|
|
@@ -43,7 +47,7 @@ export default {
|
|
|
43
47
|
},
|
|
44
48
|
|
|
45
49
|
defaultAddData() {
|
|
46
|
-
return { effect:
|
|
50
|
+
return { effect: this.effectOptions[0].value };
|
|
47
51
|
}
|
|
48
52
|
}
|
|
49
53
|
};
|
|
@@ -53,6 +57,7 @@ export default {
|
|
|
53
57
|
<div class="taints">
|
|
54
58
|
<KeyValue
|
|
55
59
|
v-model="localValue"
|
|
60
|
+
data-testid="taints-keyvalue"
|
|
56
61
|
:title="t('tableHeaders.taints')"
|
|
57
62
|
:mode="mode"
|
|
58
63
|
:as-map="false"
|
|
@@ -69,9 +74,10 @@ export default {
|
|
|
69
74
|
{{ t('tableHeaders.effect') }}
|
|
70
75
|
</template>
|
|
71
76
|
|
|
72
|
-
<template #col:effect="{row, queueUpdate}">
|
|
77
|
+
<template #col:effect="{row, queueUpdate, i}">
|
|
73
78
|
<Select
|
|
74
79
|
v-model="row.effect"
|
|
80
|
+
:data-testid="`taints-effect-row-${i}`"
|
|
75
81
|
:options="effectOptions"
|
|
76
82
|
:disabled="disabled"
|
|
77
83
|
class="compact-select"
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { mount } from '@vue/test-utils';
|
|
2
|
+
import Taints from '@shell/components/form/Taints.vue';
|
|
3
|
+
|
|
4
|
+
describe('component: Taints', () => {
|
|
5
|
+
it('should accept custom effect values', async() => {
|
|
6
|
+
const customEffects = { FOO_EFFECT: 'foo', BAR_EFFECT: 'bar' };
|
|
7
|
+
|
|
8
|
+
const wrapper = mount(Taints, {
|
|
9
|
+
propsData: {
|
|
10
|
+
value: [{ effect: 'FOO_EFFECT', value: 'abc' }],
|
|
11
|
+
effectValues: customEffects
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
const firstEffectInput = wrapper.find('[data-testid="taints-effect-row-0"]');
|
|
16
|
+
|
|
17
|
+
expect(firstEffectInput.exists()).toBe(true);
|
|
18
|
+
|
|
19
|
+
expect(firstEffectInput.props().value).toBe('FOO_EFFECT');
|
|
20
|
+
expect(firstEffectInput.props().options).toStrictEqual([{ value: 'FOO_EFFECT', label: 'foo' }, { value: 'BAR_EFFECT', label: 'bar' }]);
|
|
21
|
+
|
|
22
|
+
const taintKV = wrapper.find('[data-testid="taints-keyvalue"]');
|
|
23
|
+
|
|
24
|
+
taintKV.vm.add();
|
|
25
|
+
await wrapper.vm.$nextTick();
|
|
26
|
+
|
|
27
|
+
const secondEffectInput = wrapper.find('[data-testid="taints-effect-row-1"]');
|
|
28
|
+
|
|
29
|
+
expect(secondEffectInput.exists()).toBe(true);
|
|
30
|
+
|
|
31
|
+
expect(secondEffectInput.props().value).toStrictEqual('FOO_EFFECT');
|
|
32
|
+
expect(wrapper.vm.defaultAddData).toStrictEqual({ effect: 'FOO_EFFECT' });
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('should use default effect values of NoSchedule, PreferNoSchedule, and PreferNoExecute', async() => {
|
|
36
|
+
const expectedEffectOptions = [
|
|
37
|
+
{ label: 'NoSchedule', value: 'NoSchedule' },
|
|
38
|
+
{ label: 'PreferNoSchedule', value: 'PreferNoSchedule' },
|
|
39
|
+
|
|
40
|
+
{ label: 'NoExecute', value: 'NoExecute' },
|
|
41
|
+
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
const wrapper = mount(Taints, { propsData: { value: [{ effect: '', value: 'abc' }] } });
|
|
45
|
+
|
|
46
|
+
const firstEffectInput = wrapper.find('[data-testid="taints-effect-row-0"]');
|
|
47
|
+
|
|
48
|
+
expect(firstEffectInput.exists()).toBe(true);
|
|
49
|
+
|
|
50
|
+
expect(firstEffectInput.props().value).toBe('');
|
|
51
|
+
expect(firstEffectInput.props().options).toStrictEqual(expectedEffectOptions);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('should set the effect value to NoSchedule by default', async() => {
|
|
55
|
+
const wrapper = mount(Taints, { propsData: { value: [] } });
|
|
56
|
+
|
|
57
|
+
const taintKV = wrapper.find('[data-testid="taints-keyvalue"]');
|
|
58
|
+
|
|
59
|
+
taintKV.vm.add();
|
|
60
|
+
await wrapper.vm.$nextTick();
|
|
61
|
+
|
|
62
|
+
const effectInput = wrapper.find('[data-testid="taints-effect-row-0"]');
|
|
63
|
+
|
|
64
|
+
expect(effectInput.exists()).toBe(true);
|
|
65
|
+
|
|
66
|
+
expect(effectInput.props().value).toStrictEqual('NoSchedule');
|
|
67
|
+
|
|
68
|
+
expect(wrapper.vm.defaultAddData).toStrictEqual({ effect: 'NoSchedule' });
|
|
69
|
+
});
|
|
70
|
+
});
|
|
@@ -133,7 +133,7 @@ export default {
|
|
|
133
133
|
// Don't show if the header is in 'simple' mode
|
|
134
134
|
const notSimple = !this.simple;
|
|
135
135
|
// One of these must be enabled, otherwise t here's no component to show
|
|
136
|
-
const validFilterSettings = this.currentProduct
|
|
136
|
+
const validFilterSettings = this.currentProduct?.showNamespaceFilter || this.currentProduct?.showWorkspaceSwitcher;
|
|
137
137
|
|
|
138
138
|
return validClusterOrProduct && notSimple && validFilterSettings;
|
|
139
139
|
},
|
|
@@ -1090,7 +1090,7 @@ export default {
|
|
|
1090
1090
|
}
|
|
1091
1091
|
}
|
|
1092
1092
|
|
|
1093
|
-
> i {
|
|
1093
|
+
> i, > img {
|
|
1094
1094
|
display: block;
|
|
1095
1095
|
width: 42px;
|
|
1096
1096
|
font-size: $icon-size;
|
|
@@ -1102,9 +1102,6 @@ export default {
|
|
|
1102
1102
|
margin-right: 16px;
|
|
1103
1103
|
fill: var(--link);
|
|
1104
1104
|
}
|
|
1105
|
-
img {
|
|
1106
|
-
margin-right: 16px;
|
|
1107
|
-
}
|
|
1108
1105
|
|
|
1109
1106
|
&.router-link-active, &.active-menu-link {
|
|
1110
1107
|
background: var(--primary-hover-bg);
|
|
@@ -17,15 +17,16 @@ export const STEVE_ID_COL = {
|
|
|
17
17
|
name: 'steve-id',
|
|
18
18
|
labelKey: 'tableHeaders.id',
|
|
19
19
|
value: 'id',
|
|
20
|
-
sort: ['id'],
|
|
21
|
-
search: 'id',
|
|
20
|
+
sort: false, // sort: ['id'], // Pending API support
|
|
21
|
+
search: false, // search: 'id', // Pending API support
|
|
22
22
|
};
|
|
23
23
|
|
|
24
24
|
export const STEVE_STATE_COL = {
|
|
25
25
|
...STATE,
|
|
26
|
-
//
|
|
26
|
+
// Note, we're show the 'state' as per model, not the 'metadata.state.name' that's available in the model to remotely sort/filter
|
|
27
|
+
// Need to investigate whether we should 'dumb down' the state we show to the native one (tracked via https://github.com/rancher/dashboard/issues/8527)
|
|
27
28
|
// This means we'll show something different to what we sort and filter on.
|
|
28
|
-
sort:
|
|
29
|
+
sort: false, // ['metadata.state.name'], // Pending API support
|
|
29
30
|
search: false, // 'metadata.state.name', // Pending API support
|
|
30
31
|
};
|
|
31
32
|
|
package/config/product/auth.js
CHANGED
|
@@ -174,7 +174,7 @@ export function init(store) {
|
|
|
174
174
|
componentForType(`${ MANAGEMENT.AUTH_CONFIG }/googleoauth`, 'auth/googleoauth');
|
|
175
175
|
componentForType(`${ MANAGEMENT.AUTH_CONFIG }/azuread`, 'auth/azuread');
|
|
176
176
|
componentForType(`${ MANAGEMENT.AUTH_CONFIG }/keycloakoidc`, 'auth/oidc');
|
|
177
|
-
componentForType(`${ MANAGEMENT.AUTH_CONFIG }/
|
|
177
|
+
componentForType(`${ MANAGEMENT.AUTH_CONFIG }/genericoidc`, 'auth/oidc');
|
|
178
178
|
|
|
179
179
|
basicType([
|
|
180
180
|
'config',
|