@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.
Files changed (154) hide show
  1. package/assets/translations/en-us.yaml +69 -29
  2. package/assets/translations/zh-hans.yaml +1 -0
  3. package/components/AlertTable.vue +17 -7
  4. package/components/AssignTo.vue +2 -0
  5. package/components/GrafanaDashboard.vue +6 -4
  6. package/components/PromptRemove.vue +1 -0
  7. package/components/Questions/index.vue +2 -2
  8. package/components/auth/RoleDetailEdit.vue +5 -4
  9. package/components/form/KeyValue.vue +1 -0
  10. package/components/form/Members/ClusterPermissionsEditor.vue +1 -1
  11. package/components/form/ProjectMemberEditor.vue +1 -1
  12. package/components/form/ResourceLabeledSelect.vue +11 -3
  13. package/components/form/Taints.vue +13 -7
  14. package/components/form/__tests__/Taints.test.ts +70 -0
  15. package/components/form/labeled-select-utils/labeled-select.utils.ts +1 -1
  16. package/components/nav/Header.vue +1 -1
  17. package/components/nav/TopLevelMenu.vue +1 -4
  18. package/config/pagination-table-headers.js +5 -4
  19. package/config/product/auth.js +1 -1
  20. package/config/roles.ts +34 -19
  21. package/config/router/navigation-guards/attempt-first-login.js +1 -1
  22. package/config/router/navigation-guards/authentication.js +1 -1
  23. package/config/router/navigation-guards/i18n.js +13 -0
  24. package/config/router/navigation-guards/index.js +3 -1
  25. package/config/router/navigation-guards/load-initial-settings.js +1 -1
  26. package/config/router/navigation-guards/runtime-extension-route.js +31 -0
  27. package/config/router/routes.js +10 -1
  28. package/config/uiplugins.js +130 -61
  29. package/core/plugin.ts +5 -0
  30. package/core/plugins.js +7 -1
  31. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +42 -0
  32. package/detail/provisioning.cattle.io.cluster.vue +4 -4
  33. package/dialog/DeactivateDriverDialog.vue +30 -11
  34. package/edit/auth/__tests__/oidc.test.ts +2 -2
  35. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +86 -13
  36. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +3 -134
  37. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +209 -0
  38. package/edit/provisioning.cattle.io.cluster/index.vue +8 -4
  39. package/edit/provisioning.cattle.io.cluster/rke2.vue +115 -17
  40. package/edit/provisioning.cattle.io.cluster/tabs/AddOnAdditionalManifest.vue +50 -0
  41. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +29 -64
  42. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +42 -3
  43. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +22 -86
  44. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +8 -2
  45. package/edit/provisioning.cattle.io.cluster/tabs/registries/__tests__/RegistryConfigs.test.ts +61 -0
  46. package/edit/token.vue +2 -1
  47. package/initialize/entry-helpers.js +4 -24
  48. package/list/management.cattle.io.feature.vue +4 -2
  49. package/middleware/authenticated.js +0 -19
  50. package/mixins/__tests__/chart.test.ts +4 -1
  51. package/mixins/auth-config.js +1 -1
  52. package/mixins/chart.js +30 -14
  53. package/models/__tests__/apps.deployment.test.ts +93 -0
  54. package/models/apps.deployment.js +18 -4
  55. package/models/driver.js +3 -2
  56. package/models/kontainerdriver.js +30 -13
  57. package/models/management.cattle.io.authconfig.js +2 -2
  58. package/models/management.cattle.io.cluster.js +2 -2
  59. package/models/management.cattle.io.user.js +3 -3
  60. package/models/nodedriver.js +35 -13
  61. package/models/provisioning.cattle.io.cluster.js +4 -0
  62. package/package.json +3 -2
  63. package/pages/404.vue +15 -0
  64. package/pages/auth/login.vue +4 -1
  65. package/pages/auth/setup.vue +4 -1
  66. package/pages/c/_cluster/apps/charts/install.vue +3 -2
  67. package/pages/c/_cluster/explorer/index.vue +5 -0
  68. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +0 -3
  69. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +1 -4
  70. package/pages/c/_cluster/manager/jwt.authentication/index.vue +10 -4
  71. package/pages/c/_cluster/settings/performance.vue +2 -2
  72. package/pages/c/_cluster/uiplugins/InstallDialog.vue +2 -1
  73. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +7 -10
  74. package/pages/c/_cluster/uiplugins/index.vue +24 -16
  75. package/pages/home.vue +1 -13
  76. package/plugins/dashboard-store/actions.js +1 -1
  77. package/plugins/dashboard-store/getters.js +1 -1
  78. package/plugins/steve/__tests__/getters.test.ts +5 -5
  79. package/plugins/steve/getters.js +6 -4
  80. package/plugins/steve/hybrid-class.js +1 -5
  81. package/promptRemove/pod.vue +15 -7
  82. package/scripts/extension/helm/charts/ui-plugin-server/Chart.yaml +1 -1
  83. package/scripts/publish-shell.sh +54 -55
  84. package/scripts/test-plugins-build.sh +45 -39
  85. package/shell/types/shell/index.d.ts +2 -0
  86. package/store/auth.js +1 -1
  87. package/store/index.js +1 -1
  88. package/store/type-map.js +4 -2
  89. package/types/store/pagination.types.ts +1 -1
  90. package/utils/__tests__/kontainer.test.ts +89 -1
  91. package/utils/auth.js +1 -1
  92. package/utils/cluster.js +9 -0
  93. package/utils/kontainer.ts +5 -1
  94. package/utils/settings.ts +3 -1
  95. package/utils/version.js +2 -1
  96. package/creators/app/app.package.json +0 -13
  97. package/creators/app/files/.eslintignore +0 -16
  98. package/creators/app/files/.eslintrc.js +0 -173
  99. package/creators/app/files/.gitignore +0 -70
  100. package/creators/app/files/.gitlab-ci.yml +0 -14
  101. package/creators/app/files/.vscode/settings.json +0 -21
  102. package/creators/app/files/babel.config.js +0 -1
  103. package/creators/app/files/tsconfig.json +0 -42
  104. package/creators/app/files/vue.config.js +0 -6
  105. package/creators/app/init +0 -120
  106. package/creators/app/package.json +0 -25
  107. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +0 -24
  108. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +0 -22
  109. package/creators/pkg/files/babel.config.js +0 -1
  110. package/creators/pkg/files/index.ts +0 -14
  111. package/creators/pkg/files/tsconfig.json +0 -53
  112. package/creators/pkg/files/vue.config.js +0 -1
  113. package/creators/pkg/init +0 -286
  114. package/creators/pkg/package.json +0 -19
  115. package/creators/pkg/pkg.package.json +0 -21
  116. package/creators/pkg/vue-shim.ts +0 -4
  117. package/creators/update/init +0 -56
  118. package/creators/update/package.json +0 -20
  119. package/creators/update/upgrade +0 -56
  120. package/rancher-components/components/Accordion/Accordion.test.ts +0 -45
  121. package/rancher-components/components/Accordion/Accordion.vue +0 -86
  122. package/rancher-components/components/Accordion/index.ts +0 -1
  123. package/rancher-components/components/BadgeState/BadgeState.test.ts +0 -12
  124. package/rancher-components/components/BadgeState/BadgeState.vue +0 -111
  125. package/rancher-components/components/BadgeState/index.ts +0 -1
  126. package/rancher-components/components/Banner/Banner.test.ts +0 -59
  127. package/rancher-components/components/Banner/Banner.vue +0 -244
  128. package/rancher-components/components/Banner/index.ts +0 -1
  129. package/rancher-components/components/Card/Card.test.ts +0 -37
  130. package/rancher-components/components/Card/Card.vue +0 -167
  131. package/rancher-components/components/Card/index.ts +0 -1
  132. package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +0 -68
  133. package/rancher-components/components/Form/Checkbox/Checkbox.vue +0 -421
  134. package/rancher-components/components/Form/Checkbox/index.ts +0 -1
  135. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +0 -40
  136. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +0 -402
  137. package/rancher-components/components/Form/LabeledInput/index.ts +0 -1
  138. package/rancher-components/components/Form/Radio/RadioButton.test.ts +0 -33
  139. package/rancher-components/components/Form/Radio/RadioButton.vue +0 -293
  140. package/rancher-components/components/Form/Radio/RadioGroup.test.ts +0 -30
  141. package/rancher-components/components/Form/Radio/RadioGroup.vue +0 -259
  142. package/rancher-components/components/Form/Radio/index.ts +0 -2
  143. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +0 -172
  144. package/rancher-components/components/Form/TextArea/index.ts +0 -1
  145. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +0 -94
  146. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +0 -152
  147. package/rancher-components/components/Form/ToggleSwitch/index.ts +0 -1
  148. package/rancher-components/components/Form/index.ts +0 -5
  149. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +0 -156
  150. package/rancher-components/components/LabeledTooltip/index.ts +0 -1
  151. package/rancher-components/components/StringList/StringList.test.ts +0 -754
  152. package/rancher-components/components/StringList/StringList.vue +0 -650
  153. package/rancher-components/components/StringList/index.ts +0 -1
  154. 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
- oidc: Configure an OIDC account
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: vSphere CPI Configuration
1190
- rancher-vsphere-csi: vSphere CSI Configuration
1191
- rke2-calico: Calico Configuration
1192
- rke2-calico-crd: Calico Configuration
1193
- rke2-canal: Canal Configuration
1194
- rke2-cilium: Cilium Configuration
1195
- rke2-coredns: CoreDNS Configuration
1196
- rke2-ingress-nginx: NGINX Ingress Configuration
1197
- rke2-kube-proxy: Kube Proxy Configuration
1198
- rke2-metrics-server: Metrics Server Configuration
1199
- rke2-multus: Multus Configuration
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
- addons: Add-On Config
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
- warning: You will no longer be able to edit the configuration of clusters using {name} driver. Resources in the provider will not be automatically removed.
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 ({ rancherVersion })."
4239
- incompatibleKubeVersion: "The latest version of this extension ({ version }) is not compatible with the current Kube version ({ kubeVersion })."
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 {version}"
4278
- requiresKubeVersion: "Requires Kube version {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
- oidc: Generic OIDC
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 incomaptible with Namespace/Project filtering and Server-side Pagination. Enabling this will disable them."
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 incomaptible with Namespace/Project filtering and Server-side Pagination. Enabling this will disable them."
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 incomaptible with Manual Refresh and Incremental Loading. Enabling this will disable them."
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 incomaptible with Manual Refresh and Incremental Loading. Enabling this will disable them."
7487
+ incompatibleDescription: "Server-side Pagination is incompatible with Manual Refresh and Incremental Loading. Enabling this will disable them."
7448
7488
  featureFlag: The&nbsp;<a href="{ffUrl}">Feature Flag</a>&nbsp;`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
@@ -1796,6 +1796,7 @@ cluster:
1796
1796
  oracleoke: Oracle OKE
1797
1797
  otc: Open Telekom Cloud
1798
1798
  other: 其他
1799
+ ovhcloudmks: OVHcloud MKS
1799
1800
  packet: Equinix Metal
1800
1801
  pinganyunecs: 平安云 ECS
1801
1802
  pnap: phoenixNAP
@@ -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 loadAlertManagerEvents() {
73
- const inStore = this.$store.getters['currentProduct'].inStore;
74
- const alertsEvents = await this.$store.dispatch(
75
- `${ inStore }/request`,
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 (alertsEvents.data) {
80
- this.allAlerts = alertsEvents.data;
89
+ if (alertEvents) {
90
+ this.allAlerts = alertEvents;
81
91
  }
82
92
  },
83
93
 
@@ -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
- const errorElements = graphWindow.document.getElementsByClassName('alert-error');
118
- const errorCornerElements = graphWindow.document.getElementsByClassName('panel-info-corner--error');
119
- const panelInFullScreenElements = graphWindow.document.getElementsByClassName('panel-in-fullscreen');
120
- const panelContainerElements = graphWindow.document.getElementsByClassName('panel-container');
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');
@@ -376,6 +376,7 @@ export default {
376
376
  :value="toRemove"
377
377
  :names="names"
378
378
  :type="type"
379
+ :done-location="doneLocation"
379
380
  @errors="e => error = e"
380
381
  @done="done"
381
382
  />
@@ -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[') ) { // This only really works for array[string|multiline], but close enough for now.
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[') ) { // Same, only works with map[string|multiline]
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 === 'globalScopedApiGroups' && this.value.type !== MANAGEMENT.GLOBAL_ROLE) {
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 === 'clusterScopedApiGroups' && (this.value.type === RBAC.ROLE || this.value.subtype === NAMESPACE)) {
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 = 'api.neuvector.com';
241
+ apiGroupValue = 'permission.neuvector.com';
241
242
  }
242
243
 
243
244
  options.push({
@@ -758,6 +758,7 @@ export default {
758
758
  :name="'col:' + c"
759
759
  :row="row"
760
760
  :queue-update="queueUpdate"
761
+ :i="i"
761
762
  />
762
763
  </div>
763
764
  <div
@@ -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.displayName === customPermissionsItem.label);
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.displayName === customPermissionsItem.label);
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
- ...this.$attrs,
136
+ ...allAttrs,
131
137
  ...this.paginatedResourceSettings?.labelSelectOptions || {}
132
138
  } : {
133
- ...this.$attrs,
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({ field: 'metadata.name', value: filter })] : [];
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 EFFECT_VALUES = {
7
- NO_SCHEDULE: 'NoSchedule',
8
- PREFER_NO_SCHEDULE: 'PreferNoSchedule',
9
- NO_EXECUTE: 'NoExecute',
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.values(EFFECT_VALUES).map((v) => ({ label: v, value: v })) };
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: EFFECT_VALUES.NO_SCHEDULE };
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
+ });
@@ -109,7 +109,7 @@ export async function labelSelectPaginationFunction<T>({
109
109
 
110
110
  return {
111
111
  page: resPage,
112
- pages: res.pages,
112
+ pages: res.pages || Math.ceil(res.count / (pageSize || Number.MAX_SAFE_INTEGER)),
113
113
  total: res.count
114
114
  };
115
115
  } catch (err) {
@@ -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.showNamespaceFilter || this.currentProduct.showWorkspaceSwitcher;
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
- // value: 'metadata.state.name', Use the state as defined by the resource rather than converted via the model.
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: [], // ['metadata.state.name'], // Pending API support
29
+ sort: false, // ['metadata.state.name'], // Pending API support
29
30
  search: false, // 'metadata.state.name', // Pending API support
30
31
  };
31
32
 
@@ -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 }/oidc`, 'auth/oidc');
177
+ componentForType(`${ MANAGEMENT.AUTH_CONFIG }/genericoidc`, 'auth/oidc');
178
178
 
179
179
  basicType([
180
180
  'config',