@rancher/shell 0.3.23 → 0.3.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/styles/base/_variables.scss +1 -0
- package/assets/styles/themes/_dark.scss +1 -0
- package/assets/styles/themes/_light.scss +6 -5
- package/assets/translations/en-us.yaml +44 -17
- package/assets/translations/zh-hans.yaml +2 -2
- package/components/ClusterIconMenu.vue +143 -0
- package/components/CruResource.vue +7 -1
- package/components/ExplorerProjectsNamespaces.vue +11 -1
- package/components/FixedBanner.vue +17 -1
- package/components/Loading.vue +1 -1
- package/components/Markdown.vue +1 -1
- package/components/Questions/__tests__/Yaml.test.ts +3 -2
- package/components/SideNav.vue +1 -1
- package/components/SortableTable/index.vue +3 -2
- package/components/auth/RoleDetailEdit.vue +15 -2
- package/components/auth/login/saml.vue +12 -1
- package/components/form/LabeledSelect.vue +12 -5
- package/components/form/Members/ClusterPermissionsEditor.vue +1 -1
- package/components/form/Members/MembershipEditor.vue +6 -1
- package/components/form/SelectOrCreateAuthSecret.vue +7 -0
- package/components/form/__tests__/KeyValue.test.ts +6 -3
- package/components/form/__tests__/LabeledSelect.test.ts +18 -0
- package/components/formatter/PodsUsage.vue +11 -36
- package/components/formatter/PrincipalGroupBindings.vue +8 -5
- package/components/formatter/__tests__/PodsUsage.test.ts +36 -19
- package/components/nav/Group.vue +62 -34
- package/components/nav/Header.vue +13 -6
- package/components/nav/Pinned.vue +47 -0
- package/components/nav/TopLevelMenu.vue +673 -325
- package/components/nav/Type.vue +88 -8
- package/config/home-links.js +1 -1
- package/config/product/istio.js +15 -5
- package/config/router.js +3 -9
- package/config/table-headers.js +5 -6
- package/config/uiplugins.js +1 -0
- package/core/plugin-helpers.js +3 -0
- package/core/types.ts +6 -1
- package/creators/app/files/.vscode/settings.json +0 -1
- package/creators/pkg/init +2 -2
- package/detail/__tests__/autoscaling.horizontalpodautoscaler.test.ts +118 -0
- package/detail/autoscaling.horizontalpodautoscaler/index.vue +4 -4
- package/detail/provisioning.cattle.io.cluster.vue +7 -5
- package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +58 -0
- package/edit/__tests__/namespace.test.ts +5 -3
- package/edit/fleet.cattle.io.gitrepo.vue +43 -15
- package/edit/logging.banzaicloud.io.output/index.vue +7 -0
- package/edit/management.cattle.io.clusterroletemplatebinding.vue +3 -11
- package/edit/namespace.vue +8 -4
- package/edit/provisioning.cattle.io.cluster/Basics.vue +662 -0
- package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +9 -8
- package/edit/provisioning.cattle.io.cluster/DrainOptions.vue +13 -8
- package/edit/provisioning.cattle.io.cluster/MachinePool.vue +11 -2
- package/edit/provisioning.cattle.io.cluster/MemberRoles.vue +40 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +237 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.tests.ts +71 -23
- package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +52 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +65 -142
- package/edit/provisioning.cattle.io.cluster/rke2.vue +253 -582
- package/edit/workload/storage/ContainerMountPaths.vue +7 -5
- package/edit/workload/storage/__tests__/Storage.test.ts +2 -2
- package/edit/workload/storage/persistentVolumeClaim/__tests__/persistentvolumeclaim.test.ts +36 -0
- package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +15 -7
- package/initialize/App.js +2 -0
- package/initialize/client.js +63 -51
- package/initialize/index.js +7 -5
- package/layouts/default.vue +10 -2
- package/layouts/home.vue +6 -2
- package/layouts/plain.vue +9 -2
- package/list/fleet.cattle.io.cluster.vue +2 -2
- package/list/management.cattle.io.feature.vue +1 -1
- package/machine-config/amazonec2.vue +1 -0
- package/machine-config/vmwarevsphere.vue +48 -7
- package/mixins/brand.js +0 -8
- package/mixins/child-hook.js +2 -2
- package/mixins/create-edit-view/impl.js +3 -3
- package/mixins/fetch.client.js +3 -3
- package/models/__tests__/management.cattle.io.node.ts +96 -0
- package/models/__tests__/node.ts +74 -0
- package/models/cluster/node.js +6 -5
- package/models/cluster.x-k8s.io.machinedeployment.js +2 -2
- package/models/management.cattle.io.cluster.js +22 -1
- package/models/management.cattle.io.clusterroletemplatebinding.js +3 -3
- package/models/management.cattle.io.globalrole.js +17 -2
- package/models/management.cattle.io.node.js +6 -4
- package/models/management.cattle.io.projectroletemplatebinding.js +3 -3
- package/models/management.cattle.io.roletemplate.js +17 -2
- package/package.json +2 -6
- package/pages/__tests__/prefs.test.ts +1 -1
- package/pages/about.vue +2 -0
- package/pages/auth/setup.vue +5 -4
- package/pages/c/_cluster/explorer/ConfigBadge.vue +1 -0
- package/pages/c/_cluster/monitoring/index.vue +8 -3
- package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +9 -66
- package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +182 -0
- package/pages/c/_cluster/uiplugins/CatalogList/index.vue +15 -32
- package/pages/c/_cluster/uiplugins/UninstallDialog.vue +8 -46
- package/pages/c/_cluster/uiplugins/index.vue +64 -64
- package/pages/diagnostic.vue +0 -39
- package/pages/home.vue +1 -1
- package/pages/prefs.vue +3 -13
- package/plugins/dashboard-store/normalize.js +4 -4
- package/plugins/dashboard-store/resource-class.js +1 -1
- package/plugins/int-number.js +5 -2
- package/plugins/positive-int-number.js +19 -0
- package/plugins/steve/__tests__/getters.spec.ts +15 -0
- package/plugins/steve/getters.js +22 -10
- package/public/index.html +4 -2
- package/rancher-components/BadgeState/BadgeState.vue +5 -1
- package/rancher-components/Banner/Banner.test.ts +51 -1
- package/rancher-components/Banner/Banner.vue +134 -53
- package/rancher-components/Card/Card.test.ts +37 -0
- package/rancher-components/Card/Card.vue +24 -7
- package/rancher-components/Form/Checkbox/Checkbox.test.ts +20 -29
- package/rancher-components/Form/Checkbox/Checkbox.vue +45 -20
- package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +2 -8
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +22 -10
- package/rancher-components/Form/Radio/RadioButton.test.ts +31 -0
- package/rancher-components/Form/Radio/RadioButton.vue +30 -13
- package/rancher-components/Form/Radio/RadioGroup.vue +26 -7
- package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +7 -6
- package/rancher-components/Form/ToggleSwitch/ToggleSwitch.test.ts +25 -38
- package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +23 -11
- package/rancher-components/LabeledTooltip/LabeledTooltip.vue +19 -5
- package/rancher-components/StringList/StringList.test.ts +453 -49
- package/rancher-components/StringList/StringList.vue +92 -58
- package/scripts/extension/parse-tag-name +0 -0
- package/store/index.js +4 -0
- package/store/prefs.js +4 -4
- package/store/type-map.js +2 -16
- package/types/shell/index.d.ts +26 -14
- package/utils/__tests__/cluster.test.ts +55 -0
- package/utils/__tests__/object.test.ts +21 -2
- package/utils/__tests__/sort.test.ts +61 -0
- package/utils/cluster.js +47 -1
- package/utils/object.js +12 -5
- package/utils/string.js +12 -0
- package/utils/validators/formRules/__tests__/index.test.ts +13 -1
- package/utils/validators/formRules/index.ts +4 -0
- package/utils/validators/role-template.js +9 -1
- package/utils/version.js +1 -1
- package/vue.config.js +1 -4
- package/yarn-error.log +200 -0
- package/content/docs/en-us/getting-started.md +0 -224
- package/content/docs/en-us/whats-new.md +0 -29
- package/content/docs/zh-hans/getting-started.md +0 -224
- package/content/docs/zh-hans/whats-new.md +0 -28
- package/pages/docs/_doc.vue +0 -345
- package/pages/docs/toc.js +0 -27
- package/plugins/console.js +0 -34
|
@@ -11,7 +11,7 @@ $dark : #B6B6C2;
|
|
|
11
11
|
//light border and buttons
|
|
12
12
|
$medium : #DCDEE7;
|
|
13
13
|
|
|
14
|
-
//light inputs
|
|
14
|
+
//light inputs
|
|
15
15
|
$light : #EEEFF4;
|
|
16
16
|
|
|
17
17
|
//light sidebar and box
|
|
@@ -84,9 +84,9 @@ BODY, .theme-light {
|
|
|
84
84
|
--link-border : #{$link};
|
|
85
85
|
--link-banner-bg : #{rgba($link, 0.15)};
|
|
86
86
|
--link-light-bg : #{rgba($link, 0.05)};
|
|
87
|
-
|
|
88
87
|
|
|
89
|
-
|
|
88
|
+
|
|
89
|
+
|
|
90
90
|
.text-link {
|
|
91
91
|
color: var(--link) !important;
|
|
92
92
|
}
|
|
@@ -301,7 +301,7 @@ BODY, .theme-light {
|
|
|
301
301
|
background: var(--error-active-bg);
|
|
302
302
|
}
|
|
303
303
|
}
|
|
304
|
-
|
|
304
|
+
|
|
305
305
|
|
|
306
306
|
--body-bg : #{$lightest};
|
|
307
307
|
--body-text : #{$darkest};
|
|
@@ -320,13 +320,14 @@ BODY, .theme-light {
|
|
|
320
320
|
--header-height : 55px;
|
|
321
321
|
--header-border : #{$medium};
|
|
322
322
|
--header-border-size : 1px;
|
|
323
|
-
--nav-width :
|
|
323
|
+
--nav-width : 250px;
|
|
324
324
|
--nav-bg : #{$lightest};
|
|
325
325
|
--nav-active : #{$light};
|
|
326
326
|
--nav-hover : #{$medium};
|
|
327
327
|
--nav-expander-hover : #{darken($medium, 10%)};
|
|
328
328
|
--nav-border : #{$medium};
|
|
329
329
|
--nav-border-size : 1px;
|
|
330
|
+
--nav-icon-badge-bg : #{$lightest};
|
|
330
331
|
|
|
331
332
|
--footer-bg : transparent;
|
|
332
333
|
--footer-height : 0px;
|
|
@@ -139,6 +139,8 @@ nav:
|
|
|
139
139
|
rotateEncryptionKeys: Rotate Encryption Keys
|
|
140
140
|
saveAsRKETemplate: Save as RKE Template
|
|
141
141
|
takeSnapshot: Take Snapshot
|
|
142
|
+
seeAllClusters: See all clusters
|
|
143
|
+
seeAllClustersCollapsed: See all
|
|
142
144
|
group:
|
|
143
145
|
cluster: Cluster
|
|
144
146
|
inUse: More Resources
|
|
@@ -185,6 +187,7 @@ nav:
|
|
|
185
187
|
search:
|
|
186
188
|
placeholder: Type to search clusters
|
|
187
189
|
noResults: No matching clusters
|
|
190
|
+
clusters: clusters
|
|
188
191
|
resourceSearch:
|
|
189
192
|
label: Resource Search
|
|
190
193
|
toolTip: Resource Search {key}
|
|
@@ -757,7 +760,7 @@ backupRestoreOperator:
|
|
|
757
760
|
warning: 'This {type} does not have its reclaim policy set to "Retain". Your backups may be lost if the volume is changed or becomes unbound.'
|
|
758
761
|
encryption: Encryption
|
|
759
762
|
encryptionConfigName:
|
|
760
|
-
backuptip: 'Any secret in the <code>cattle-
|
|
763
|
+
backuptip: 'Any secret in the <code>cattle-resources-system</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.'
|
|
761
764
|
label: Encryption Config Secret
|
|
762
765
|
options:
|
|
763
766
|
none: Store the contents of the backup unencrypted
|
|
@@ -1134,6 +1137,7 @@ cluster:
|
|
|
1134
1137
|
nodeRole:
|
|
1135
1138
|
label: Node Role
|
|
1136
1139
|
detail: Choose what roles the node will have in the cluster. The cluster needs to have at least one node with each role.
|
|
1140
|
+
warning: The cluster needs to have at least one node with each role to be usable.
|
|
1137
1141
|
advanced:
|
|
1138
1142
|
label: Advanced
|
|
1139
1143
|
detail: Additional control over how the node will be registered. These values will often need to be different for each node registered.
|
|
@@ -1637,7 +1641,7 @@ cluster:
|
|
|
1637
1641
|
advanced: These are advanced configuration options. Generally, they should be left as-is.
|
|
1638
1642
|
tolerations: Additional Pod Tolerations will be added to the default Tolerations applied by Rancher.
|
|
1639
1643
|
limits: Pod Requests and Limits do not have a default configuration.
|
|
1640
|
-
windowsCompatibility: "We do not
|
|
1644
|
+
windowsCompatibility: "We do not recommend removing the Node Affinity rule that prevents the <b>agent</b> from running on Windows nodes as this is not a supported configuration."
|
|
1641
1645
|
affinity:
|
|
1642
1646
|
default: Use default affinity rules defined by Rancher
|
|
1643
1647
|
custom: Use custom affinity rules
|
|
@@ -1647,7 +1651,7 @@ cluster:
|
|
|
1647
1651
|
machineSelector:
|
|
1648
1652
|
label: Add Machine Selector
|
|
1649
1653
|
listLabel: Add Argument
|
|
1650
|
-
bannerLabel: 'Note: The last selector that matches wins and only args from it will be used. Args from other matches above will not combined together or merged.'
|
|
1654
|
+
bannerLabel: 'Note: The last selector that matches wins, and only args from it will be used. Args from other matches above will not be combined together or merged.'
|
|
1651
1655
|
title: 'For machines with labels matching:'
|
|
1652
1656
|
subTitle: 'Use the Kubelet args:'
|
|
1653
1657
|
titleAlt: |-
|
|
@@ -1661,14 +1665,19 @@ cluster:
|
|
|
1661
1665
|
agentArgs:
|
|
1662
1666
|
label: Raise error if kernel parameters are different than the expected kubelet defaults
|
|
1663
1667
|
banner:
|
|
1664
|
-
warning: 'This cluster contains a machineSelectorConfig which this form does not fully support; use the YAML editor to manage the full configuration.'
|
|
1665
|
-
os: 'You are
|
|
1668
|
+
warning: 'This cluster contains a machineSelectorConfig, which this form does not fully support; use the YAML editor to manage the full configuration.'
|
|
1669
|
+
os: 'You are attempting to add a {newOS} worker node to a cluster with one or more {existingOS} worker nodes: some installed apps may need to be upgraded or removed.'
|
|
1666
1670
|
rke2-k3-reprovisioning: 'Making changes to cluster configuration may result in nodes reprovisioning. For more information see the <a target="blank" href="{docsBase}/cluster-provisioning/rke-clusters/behavior-differences-between-rke1-and-rke2/" target="_blank" rel="noopener nofollow">documentation</a>.'
|
|
1667
1671
|
desiredNodeGroupWarning: There are 0 nodes available to run the cluster agent. The cluster will not become active until at least one node is available.
|
|
1668
1672
|
invalidPsps: You have one or more PodSecurityPolicy resource(s) in this cluster. Pod Security Policies are not available in Kubernetes v1.25 and will be automatically removed.
|
|
1669
|
-
haveArgInfo: Configuration information is not available for the selected Kubernetes version. The options available
|
|
1673
|
+
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.
|
|
1670
1674
|
deprecatedPsp: Pod Security Policies are deprecated as of Kubernetes v1.21, and have been removed in Kubernetes v1.25.
|
|
1671
|
-
removedPsp: Pod Security Policies have been removed in Kubernetes v1.25
|
|
1675
|
+
removedPsp: Pod Security Policies have been removed in Kubernetes v1.25. Use Pod Security Admission instead.
|
|
1676
|
+
machinePoolError: |-
|
|
1677
|
+
{count, plural,
|
|
1678
|
+
=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. }
|
|
1679
|
+
other { {pool_name}: The provided values for {fields} were 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. }
|
|
1680
|
+
}
|
|
1672
1681
|
rkeTemplateUpgrade: Template revision {name} available for upgrade
|
|
1673
1682
|
|
|
1674
1683
|
availabilityWarnings:
|
|
@@ -1749,6 +1758,7 @@ cluster:
|
|
|
1749
1758
|
searchPlaceholder: Start typing to search
|
|
1750
1759
|
noResults: No results found
|
|
1751
1760
|
privateRegistry:
|
|
1761
|
+
header: Registry for Rancher System Container Images
|
|
1752
1762
|
label: Enable cluster scoped container registry for Rancher system container images
|
|
1753
1763
|
description: "If enabled, Rancher will pull container images from this registry during cluster provisioning. By default, Rancher will also use this registry when installing Rancher's official Helm chart apps. If the cluster scoped registry is disabled, system images are pulled from the System Default Registry in the global settings."
|
|
1754
1764
|
docsLinkRke2: "For help configuring private registry mirrors, see the RKE2 <a href=\"https://docs.rke2.io/install/containerd_registry_configuration/\" target=\"_blank\">documentation.</a>"
|
|
@@ -1830,7 +1840,7 @@ cluster:
|
|
|
1830
1840
|
modal:
|
|
1831
1841
|
pspChange:
|
|
1832
1842
|
title: Pod Security Policy deprecation
|
|
1833
|
-
body: Kubernetes has removed support for Pod Security Policies (PSPs) starting with version 1.25. If your cluster has PodSecurityPolicy admission controller enabled via "kube-apiserver-arg.enable-admission-plugins" in Cluster YAML, it has to be <i>manually</i> removed before proceeding with the upgrade. Additionally, any PSPs that may be present in the cluster will no longer be available/enforced. Do you want to proceed
|
|
1843
|
+
body: <p>Kubernetes has removed support for Pod Security Policies (PSPs) starting with version 1.25. If your cluster has PodSecurityPolicy admission controller enabled via "kube-apiserver-arg.enable-admission-plugins" in Cluster YAML, it has to be <i>manually</i> removed before proceeding with the upgrade. Additionally, any PSPs that may be present in the cluster will no longer be available/enforced. Do you want to proceed?</p>
|
|
1834
1844
|
snapshots:
|
|
1835
1845
|
suffix: Snapshots per node
|
|
1836
1846
|
systemService:
|
|
@@ -1846,6 +1856,7 @@ cluster:
|
|
|
1846
1856
|
header: Cloud Provider Config
|
|
1847
1857
|
defaultValue:
|
|
1848
1858
|
label: Default - RKE2 Embedded
|
|
1859
|
+
unsupported: The current Cloud Provider is not supported by this version of Kubernetes. The Cloud Provider has been changed to External. Please use the Cloud Provider Config to supply an out-of-tree configuration as needed.
|
|
1849
1860
|
security:
|
|
1850
1861
|
header: Security
|
|
1851
1862
|
cis:
|
|
@@ -1860,6 +1871,8 @@ cluster:
|
|
|
1860
1871
|
option:
|
|
1861
1872
|
none: (None)
|
|
1862
1873
|
default: Default - RKE2 Embedded
|
|
1874
|
+
secretEncryption:
|
|
1875
|
+
label: Encrypt Secrets
|
|
1863
1876
|
cisProfile:
|
|
1864
1877
|
option: (None)
|
|
1865
1878
|
enableNetworkPolicy:
|
|
@@ -1868,6 +1881,7 @@ cluster:
|
|
|
1868
1881
|
workNode:
|
|
1869
1882
|
label: Worker Nodes
|
|
1870
1883
|
controlPlaneConcurrency:
|
|
1884
|
+
header: Control Plane
|
|
1871
1885
|
label: Control Plane Concurrency
|
|
1872
1886
|
toolTip: "This can be either a fixed number of nodes (e.g. 1) at a time or a percentage (e.g. 10%)"
|
|
1873
1887
|
workerConcurrency:
|
|
@@ -1875,8 +1889,20 @@ cluster:
|
|
|
1875
1889
|
toolTip: "This can be either a fixed number of nodes (e.g. 1) at a time or a percentage (e.g. 10%)"
|
|
1876
1890
|
drain:
|
|
1877
1891
|
label: Drain Nodes
|
|
1878
|
-
toolTip: Draining preemptively removes the pods on each node so there are no running workloads on the nodes being upgraded. Upgrading without draining is faster and causes less shuffling around, but pods may still be restarted depending on the upgrade being performed.
|
|
1879
|
-
|
|
1892
|
+
toolTip: Draining preemptively removes the pods on each node so there are no running workloads on the nodes being upgraded. Upgrading without draining is faster and causes less shuffling around, but pods may still be restarted depending on the upgrade being performed.
|
|
1893
|
+
deleteEmptyDir:
|
|
1894
|
+
warning: "By default, pods using emptyDir volumes will be deleted on upgrade. Operations reliant on emptyDir volumes persisting through the pod's lifecycle may be impacted."
|
|
1895
|
+
label: Delete pods using emptyDir volumes
|
|
1896
|
+
tooltip: emptyDir volumes are often used for ephemeral data, but the data will be permanently deleted. Draining will fail if this is not set and there are pods using emptyDir.
|
|
1897
|
+
force:
|
|
1898
|
+
label: Delete standalone pods
|
|
1899
|
+
tooltip: Delete standalone pods which are not managed by a Workload controller (Deployment, Job, etc). Draining will fail if this is not set and there are standalone pods.
|
|
1900
|
+
gracePeriod:
|
|
1901
|
+
checkboxLabel: Override pod termination grace periods
|
|
1902
|
+
inputLabel: Grace Period
|
|
1903
|
+
timeout:
|
|
1904
|
+
checkboxLabel: Timeout after
|
|
1905
|
+
inputLabel: Drain Timeout
|
|
1880
1906
|
truncateHostnames: Truncate hostnames to 15 characters for NetBIOS compatibility.
|
|
1881
1907
|
address:
|
|
1882
1908
|
tooltip: Cluster networking values cannot be changed after the cluster is created.
|
|
@@ -2162,7 +2188,7 @@ fleet:
|
|
|
2162
2188
|
keepResources: Always Keep Resources
|
|
2163
2189
|
keepResourcesBanner: When enabled above, resources will be kept when deleting a GitRepo or Bundle - only Helm release secrets will be deleted.
|
|
2164
2190
|
correctDrift: Enable Self-Healing
|
|
2165
|
-
correctDriftBanner: When enabled, Fleet will ensure that the cluster resources are kept in sync with the git repository. All resource changes made on
|
|
2191
|
+
correctDriftBanner: When enabled, Fleet will ensure that the cluster resources are kept in sync with the git repository. All resource changes made on the cluster will be lost.
|
|
2166
2192
|
add:
|
|
2167
2193
|
steps:
|
|
2168
2194
|
repoInfo:
|
|
@@ -2214,6 +2240,7 @@ fleet:
|
|
|
2214
2240
|
workspace:
|
|
2215
2241
|
label: Workspace
|
|
2216
2242
|
addWorkspace: Create a workspace
|
|
2243
|
+
helmRepoURLRegex: Helm Repos (URL Regex)
|
|
2217
2244
|
clusterGroup:
|
|
2218
2245
|
selector:
|
|
2219
2246
|
label: Cluster Selectors
|
|
@@ -4090,14 +4117,14 @@ plugins:
|
|
|
4090
4117
|
subtitle: Catalogs
|
|
4091
4118
|
imageLoad:
|
|
4092
4119
|
load: Import Extension Catalog
|
|
4093
|
-
prompt: An Extension Catalog contains extension assets bundled into an image, importing will take the image and host a Helm repository to act as a catalog for custom built Extensions.
|
|
4120
|
+
prompt: An Extension Catalog contains extension assets bundled into an image, importing will take the image and host a Helm repository to act as a catalog for custom built Extensions.
|
|
4094
4121
|
fields:
|
|
4095
4122
|
image:
|
|
4096
4123
|
label: Catalog Image Reference
|
|
4097
4124
|
placeholder: "e.g. hub.docker.io/example-org/my-image:latest"
|
|
4098
4125
|
secrets:
|
|
4099
4126
|
banner: "If the registry that hosts the Catalog Image requires Pull Secrets, they must be created in the following namespace:<pre>cattle-ui-plugin-system</pre>"
|
|
4100
|
-
banner: This will create an Deployment, Service, and Helm repository to serve the extension charts.
|
|
4127
|
+
banner: This will create an Deployment, Service, and Helm repository to serve the extension charts.
|
|
4101
4128
|
imageVersion:
|
|
4102
4129
|
title: Image Version Not Found
|
|
4103
4130
|
message: Unable to determine image version from {image}, defaulting to latest
|
|
@@ -4119,9 +4146,8 @@ plugins:
|
|
|
4119
4146
|
image:
|
|
4120
4147
|
name: images
|
|
4121
4148
|
label: Deployment Image
|
|
4122
|
-
|
|
4123
|
-
|
|
4124
|
-
label: Cache State
|
|
4149
|
+
repository:
|
|
4150
|
+
label: Repository Name
|
|
4125
4151
|
tabs:
|
|
4126
4152
|
all: All
|
|
4127
4153
|
available: Available
|
|
@@ -4148,7 +4174,7 @@ plugins:
|
|
|
4148
4174
|
label: Uninstall
|
|
4149
4175
|
title: "Uninstall Extension: {name}"
|
|
4150
4176
|
prompt: "Are you sure that you want to uninstall this Extension?"
|
|
4151
|
-
|
|
4177
|
+
catalog: "Are you sure that you want to uninstall this Extension Catalog Image? This will also remove any Extensions provided by this image."
|
|
4152
4178
|
upgradeAvailable: A newer version of this Extension is available
|
|
4153
4179
|
reload: Extensions changed - reload required
|
|
4154
4180
|
safeMode:
|
|
@@ -5699,6 +5725,7 @@ validation:
|
|
|
5699
5725
|
missingResource: You must specify a Resource for each resource grant
|
|
5700
5726
|
missingApiGroup: You must specify an API Group for each resource grant
|
|
5701
5727
|
missingOneResource: You must specify at least one Resource, Non-Resource URL or API Group for each resource grant
|
|
5728
|
+
noResourceAndNonResource: Each rule may contain Resources or Non-Resource URLs but not both
|
|
5702
5729
|
service:
|
|
5703
5730
|
externalName:
|
|
5704
5731
|
none: External Name is required on an ExternalName Service.
|
|
@@ -758,7 +758,7 @@ backupRestoreOperator:
|
|
|
758
758
|
warning: '此 {type} 没有将其回收策略设置为 "保留"。如果卷被更改或未绑定,你的备份可能会丢失。'
|
|
759
759
|
encryption: 加密
|
|
760
760
|
encryptionConfigName:
|
|
761
|
-
backuptip: '<code>cattle-
|
|
761
|
+
backuptip: '<code>cattle-resources-system</code>命名空间中具有<code>encryption-provider-config.yaml</code>密钥的任何密文。<br/>此文件的内容是还原此备份所必需的,Rancher Backup 不会存储这些内容。'
|
|
762
762
|
label: 加密配置密文
|
|
763
763
|
options:
|
|
764
764
|
none: 存储未加密的备份内容。
|
|
@@ -1838,7 +1838,7 @@ cluster:
|
|
|
1838
1838
|
modal:
|
|
1839
1839
|
pspChange:
|
|
1840
1840
|
title: 弃用 Pod 安全策略
|
|
1841
|
-
body:
|
|
1841
|
+
body: <p>从 v1.25 版开始,Kubernetes 已经取消了对 Pod 安全策略 (PSP) 的支持。如果你的集群通过集群 YAML 中的 “kube-apiserver-arg.enable-admission-plugins” 启用了 PodSecurityPolicy 准入控制器,你必须在继续升级之前<i>手动</i>删除它。此外,集群中存在的任何 PSP 将不再可用或强制执行。是否继续操作?</p>
|
|
1842
1842
|
snapshots:
|
|
1843
1843
|
suffix: 每个节点的快照
|
|
1844
1844
|
systemService:
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import { abbreviateClusterName } from '@shell/utils/cluster';
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
props: {
|
|
6
|
+
cluster: {
|
|
7
|
+
type: Object,
|
|
8
|
+
required: true,
|
|
9
|
+
},
|
|
10
|
+
},
|
|
11
|
+
computed: {
|
|
12
|
+
isEnabled() {
|
|
13
|
+
return !!this.cluster?.ready;
|
|
14
|
+
},
|
|
15
|
+
showLocalIcon() {
|
|
16
|
+
return this.cluster.isLocal && !this.cluster.isHarvester && !this.cluster.badge?.iconText;
|
|
17
|
+
},
|
|
18
|
+
badgeLogoBorderBottom() {
|
|
19
|
+
const color = this.cluster.badge?.color;
|
|
20
|
+
|
|
21
|
+
return color ? `4px solid ${ color }` : '';
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
methods: {
|
|
25
|
+
smallIdentifier(input) {
|
|
26
|
+
if (this.cluster.badge?.iconText) {
|
|
27
|
+
return this.cluster.badge?.iconText;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (this.cluster.isLocal && !this.cluster.badge?.iconText) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return abbreviateClusterName(input);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
</script>
|
|
39
|
+
|
|
40
|
+
<template>
|
|
41
|
+
<div
|
|
42
|
+
v-if="cluster"
|
|
43
|
+
class="cluster-icon-menu"
|
|
44
|
+
>
|
|
45
|
+
<div
|
|
46
|
+
class="cluster-badge-logo"
|
|
47
|
+
:class="{ 'disabled': !isEnabled }"
|
|
48
|
+
:style="{ borderBottom: badgeLogoBorderBottom }"
|
|
49
|
+
>
|
|
50
|
+
<span
|
|
51
|
+
class="cluster-badge-logo-text"
|
|
52
|
+
>
|
|
53
|
+
{{ smallIdentifier(cluster.label) }}
|
|
54
|
+
</span>
|
|
55
|
+
<svg
|
|
56
|
+
v-if="showLocalIcon"
|
|
57
|
+
class="cluster-local-logo"
|
|
58
|
+
version="1.1"
|
|
59
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
60
|
+
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
61
|
+
x="0px"
|
|
62
|
+
y="0px"
|
|
63
|
+
viewBox="0 0 100 100"
|
|
64
|
+
style="enable-background:new 0 0 100 100;"
|
|
65
|
+
xml:space="preserve"
|
|
66
|
+
>
|
|
67
|
+
<g>
|
|
68
|
+
<g>
|
|
69
|
+
<path
|
|
70
|
+
class="rancher-icon-fill"
|
|
71
|
+
d="M26.0862026,44.4953918H8.6165142c-5.5818157,0-9.3979139-4.6252708-8.4802637-10.1311035l2.858391-17.210701
|
|
72
|
+
C3.912292,11.6477556,6.1382647,7.1128125,7.8419709,7.1128125s3.1788611,4.5368752,3.1788611,10.1186218v4.4837742
|
|
73
|
+
c0,5.5817471,4.4044495,9.5409164,9.9862652,9.5409164h5.0791054V44.4953918z"
|
|
74
|
+
/>
|
|
75
|
+
</g>
|
|
76
|
+
<path
|
|
77
|
+
class="rancher-icon-fill"
|
|
78
|
+
d="M63.0214729,92.8871841H37.0862045c-6.0751343,0-11.0000019-4.9248657-11.0000019-11V30.3864384
|
|
79
|
+
c0-6.0751324,4.9248676-11,11.0000019-11h25.9352684c6.0751305,0,11.0000038,4.9248676,11.0000038,11v51.5007477
|
|
80
|
+
C74.0214767,87.9623184,69.0966034,92.8871841,63.0214729,92.8871841z"
|
|
81
|
+
/>
|
|
82
|
+
<g>
|
|
83
|
+
<path
|
|
84
|
+
class="rancher-icon-fill"
|
|
85
|
+
d="M73.9137955,44.4953918h17.4696884c5.5818176,0,9.3979187-4.6252708,8.4802628-10.1311035
|
|
86
|
+
l-2.8583908-17.210701c-0.9176483-5.5058317-3.1436234-10.0407753-4.8473282-10.0407753
|
|
87
|
+
s-3.1788635,4.5368752-3.1788635,10.1186218v4.4837742c0,5.5817471-4.4044418,9.5409164-9.9862595,9.5409164h-5.0791092
|
|
88
|
+
V44.4953918z"
|
|
89
|
+
/>
|
|
90
|
+
</g>
|
|
91
|
+
</g>
|
|
92
|
+
</svg>
|
|
93
|
+
</div>
|
|
94
|
+
<i
|
|
95
|
+
v-if="cluster.pinned"
|
|
96
|
+
class="icon icon-pin cluster-pin-icon"
|
|
97
|
+
/>
|
|
98
|
+
</div>
|
|
99
|
+
</template>
|
|
100
|
+
|
|
101
|
+
<style lang="scss" scoped>
|
|
102
|
+
|
|
103
|
+
.cluster-icon-menu {
|
|
104
|
+
position: relative;
|
|
105
|
+
align-items: center;
|
|
106
|
+
display: flex;
|
|
107
|
+
height: 28px;
|
|
108
|
+
justify-content: center;
|
|
109
|
+
width: 42px;
|
|
110
|
+
}
|
|
111
|
+
.cluster-pin-icon {
|
|
112
|
+
position: absolute;
|
|
113
|
+
top: -6px;
|
|
114
|
+
right: -4px;
|
|
115
|
+
font-size: 12px;
|
|
116
|
+
transform: scaleX(-1);
|
|
117
|
+
color: var(--body-text);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.cluster-local-logo {
|
|
121
|
+
width: 20px;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.cluster-badge-logo {
|
|
125
|
+
width: 42px;
|
|
126
|
+
height: 28px;
|
|
127
|
+
display: flex;
|
|
128
|
+
align-items: center;
|
|
129
|
+
justify-content: center;
|
|
130
|
+
color: var(--default-active-text);
|
|
131
|
+
font-weight: bold;
|
|
132
|
+
background: var(--nav-icon-badge-bg);
|
|
133
|
+
border: 1px solid var(--default-border);
|
|
134
|
+
border-radius: 5px;
|
|
135
|
+
font-size: 12px;
|
|
136
|
+
text-transform: uppercase;
|
|
137
|
+
|
|
138
|
+
&.disabled {
|
|
139
|
+
filter: grayscale(1);
|
|
140
|
+
color: var(--muted);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
</style>
|
|
@@ -17,6 +17,8 @@ import {
|
|
|
17
17
|
import { BEFORE_SAVE_HOOKS } from '@shell/mixins/child-hook';
|
|
18
18
|
import Wizard from '@shell/components/Wizard';
|
|
19
19
|
|
|
20
|
+
export const CONTEXT_HOOK_EDIT_YAML = 'show-preview-yaml';
|
|
21
|
+
|
|
20
22
|
export default {
|
|
21
23
|
|
|
22
24
|
name: 'CruResource',
|
|
@@ -110,6 +112,7 @@ export default {
|
|
|
110
112
|
type: Function,
|
|
111
113
|
default: null,
|
|
112
114
|
},
|
|
115
|
+
|
|
113
116
|
steps: {
|
|
114
117
|
type: Array,
|
|
115
118
|
default: () => []
|
|
@@ -324,7 +327,10 @@ export default {
|
|
|
324
327
|
|
|
325
328
|
async showPreviewYaml() {
|
|
326
329
|
if ( this.applyHooks ) {
|
|
327
|
-
await this.applyHooks(
|
|
330
|
+
await this.applyHooks(
|
|
331
|
+
BEFORE_SAVE_HOOKS,
|
|
332
|
+
CONTEXT_HOOK_EDIT_YAML,
|
|
333
|
+
);
|
|
328
334
|
}
|
|
329
335
|
|
|
330
336
|
const resourceYaml = this.createResourceYaml(this.yamlModifiers);
|
|
@@ -5,6 +5,8 @@ import { STATE, AGE, NAME } from '@shell/config/table-headers';
|
|
|
5
5
|
import { uniq } from '@shell/utils/array';
|
|
6
6
|
import { MANAGEMENT, NAMESPACE, VIRTUAL_TYPES } from '@shell/config/types';
|
|
7
7
|
import { PROJECT_ID, FLAT_VIEW } from '@shell/config/query-params';
|
|
8
|
+
import { PanelLocation, ExtensionPoint } from '@shell/core/types';
|
|
9
|
+
import ExtensionPanel from '@shell/components/ExtensionPanel';
|
|
8
10
|
import Masthead from '@shell/components/ResourceList/Masthead';
|
|
9
11
|
import { mapPref, GROUP_RESOURCES, ALL_NAMESPACES } from '@shell/store/prefs';
|
|
10
12
|
import MoveModal from '@shell/components/MoveModal';
|
|
@@ -16,7 +18,7 @@ import DOMPurify from 'dompurify';
|
|
|
16
18
|
export default {
|
|
17
19
|
name: 'ListProjectNamespace',
|
|
18
20
|
components: {
|
|
19
|
-
Masthead, MoveModal, ResourceTable
|
|
21
|
+
ExtensionPanel, Masthead, MoveModal, ResourceTable
|
|
20
22
|
},
|
|
21
23
|
mixins: [ResourceFetch],
|
|
22
24
|
|
|
@@ -56,6 +58,8 @@ export default {
|
|
|
56
58
|
schema: null,
|
|
57
59
|
projects: [],
|
|
58
60
|
projectSchema: null,
|
|
61
|
+
extensionType: ExtensionPoint.PANEL,
|
|
62
|
+
extensionLocation: PanelLocation.RESOURCE_LIST,
|
|
59
63
|
MANAGEMENT,
|
|
60
64
|
VIRTUAL_TYPES,
|
|
61
65
|
defaultCreateProjectLocation: {
|
|
@@ -379,6 +383,12 @@ export default {
|
|
|
379
383
|
</n-link>
|
|
380
384
|
</template>
|
|
381
385
|
</Masthead>
|
|
386
|
+
<!-- Extensions area -->
|
|
387
|
+
<ExtensionPanel
|
|
388
|
+
:resource="{}"
|
|
389
|
+
:type="extensionType"
|
|
390
|
+
:location="extensionLocation"
|
|
391
|
+
/>
|
|
382
392
|
<ResourceTable
|
|
383
393
|
ref="table"
|
|
384
394
|
class="table"
|
|
@@ -93,6 +93,19 @@ export default {
|
|
|
93
93
|
},
|
|
94
94
|
showAsDialog() {
|
|
95
95
|
return this.consent && !!this.banner.button;
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
// ID to place on the Banner DIV
|
|
99
|
+
id() {
|
|
100
|
+
if (this.header) {
|
|
101
|
+
return 'banner-header';
|
|
102
|
+
} else if (this.consent) {
|
|
103
|
+
return 'banner-consent';
|
|
104
|
+
} else if (this.footer) {
|
|
105
|
+
return 'banner-footer';
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return 'banner';
|
|
96
109
|
}
|
|
97
110
|
},
|
|
98
111
|
|
|
@@ -130,7 +143,10 @@ export default {
|
|
|
130
143
|
</script>
|
|
131
144
|
|
|
132
145
|
<template>
|
|
133
|
-
<div
|
|
146
|
+
<div
|
|
147
|
+
v-if="showBanner"
|
|
148
|
+
:id="id"
|
|
149
|
+
>
|
|
134
150
|
<div
|
|
135
151
|
v-if="!showAsDialog"
|
|
136
152
|
class="banner"
|
package/components/Loading.vue
CHANGED
package/components/Markdown.vue
CHANGED
|
@@ -39,7 +39,7 @@ export default {
|
|
|
39
39
|
const renderer = new marked.Renderer();
|
|
40
40
|
const linkRenderer = renderer.link;
|
|
41
41
|
|
|
42
|
-
const base = this.$router.resolve(this.$route).href.replace(/#.*$/, '');
|
|
42
|
+
const base = this.$router ? this.$router.resolve(this.$route).href.replace(/#.*$/, '') : '';
|
|
43
43
|
|
|
44
44
|
renderer.link = function(href, title, text) {
|
|
45
45
|
let external = true;
|
|
@@ -2,8 +2,9 @@ import Questions from '@shell/components/Questions';
|
|
|
2
2
|
import { mount } from '@vue/test-utils';
|
|
3
3
|
import { _EDIT } from '@shell/config/query-params';
|
|
4
4
|
const defaultStubs = {
|
|
5
|
-
Tab:
|
|
6
|
-
Tabbed:
|
|
5
|
+
Tab: true,
|
|
6
|
+
Tabbed: true,
|
|
7
|
+
CodeMirror: true
|
|
7
8
|
};
|
|
8
9
|
const defaultGetters = {
|
|
9
10
|
currentStore: () => 'current_store',
|
package/components/SideNav.vue
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script>
|
|
2
2
|
import { mapGetters } from 'vuex';
|
|
3
3
|
import day from 'dayjs';
|
|
4
|
+
import isEmpty from 'lodash/isEmpty';
|
|
4
5
|
import { dasherize, ucFirst } from '@shell/utils/string';
|
|
5
6
|
import { get, clone } from '@shell/utils/object';
|
|
6
7
|
import { removeObject } from '@shell/utils/array';
|
|
@@ -801,11 +802,11 @@ export default {
|
|
|
801
802
|
|
|
802
803
|
// Can the action of interest be applied to the specified resource?
|
|
803
804
|
canRunBulkActionOfInterest(resource) {
|
|
804
|
-
if (!this.actionOfInterest) {
|
|
805
|
+
if ( !this.actionOfInterest || isEmpty(resource?.availableActions) ) {
|
|
805
806
|
return false;
|
|
806
807
|
}
|
|
807
808
|
|
|
808
|
-
const matchingResourceAction = resource.availableActions
|
|
809
|
+
const matchingResourceAction = resource.availableActions?.find((a) => a.action === this.actionOfInterest.action);
|
|
809
810
|
|
|
810
811
|
return matchingResourceAction?.enabled;
|
|
811
812
|
},
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
import { MANAGEMENT, RBAC } from '@shell/config/types';
|
|
3
3
|
import CruResource from '@shell/components/CruResource';
|
|
4
4
|
import CreateEditView from '@shell/mixins/create-edit-view';
|
|
5
|
+
import FormValidation from '@shell/mixins/form-validation';
|
|
6
|
+
import Error from '@shell/components/form/Error';
|
|
5
7
|
import { RadioGroup } from '@components/Form/Radio';
|
|
6
8
|
import Select from '@shell/components/form/Select';
|
|
7
9
|
import ArrayList from '@shell/components/form/ArrayList';
|
|
@@ -58,9 +60,10 @@ export default {
|
|
|
58
60
|
Tabbed,
|
|
59
61
|
SortableTable,
|
|
60
62
|
Loading,
|
|
63
|
+
Error
|
|
61
64
|
},
|
|
62
65
|
|
|
63
|
-
mixins: [CreateEditView],
|
|
66
|
+
mixins: [CreateEditView, FormValidation],
|
|
64
67
|
|
|
65
68
|
async fetch() {
|
|
66
69
|
// We don't want to get all schemas from the cluster because there are
|
|
@@ -109,6 +112,9 @@ export default {
|
|
|
109
112
|
scopedResources: SCOPED_RESOURCES,
|
|
110
113
|
defaultValue: false,
|
|
111
114
|
selectFocused: null,
|
|
115
|
+
fvFormRuleSets: [
|
|
116
|
+
{ path: 'displayName', rules: ['required'] }
|
|
117
|
+
],
|
|
112
118
|
};
|
|
113
119
|
},
|
|
114
120
|
|
|
@@ -524,7 +530,8 @@ export default {
|
|
|
524
530
|
:can-yaml="!isCreate"
|
|
525
531
|
:mode="mode"
|
|
526
532
|
:resource="value"
|
|
527
|
-
:errors="
|
|
533
|
+
:errors="fvUnreportedValidationErrors"
|
|
534
|
+
:validation-passed="fvFormIsValid"
|
|
528
535
|
:cancel-event="true"
|
|
529
536
|
@error="e=>errors = e"
|
|
530
537
|
@finish="save"
|
|
@@ -568,6 +575,7 @@ export default {
|
|
|
568
575
|
name-key="displayName"
|
|
569
576
|
description-key="description"
|
|
570
577
|
label="Name"
|
|
578
|
+
:rules="{ name: fvGetAndReportPathRules('displayName') }"
|
|
571
579
|
/>
|
|
572
580
|
<div
|
|
573
581
|
v-if="isRancherType"
|
|
@@ -606,6 +614,11 @@ export default {
|
|
|
606
614
|
:label="t('rbac.roletemplate.tabs.grantResources.label')"
|
|
607
615
|
:weight="1"
|
|
608
616
|
>
|
|
617
|
+
<Error
|
|
618
|
+
:value="value.rules"
|
|
619
|
+
:rules="fvGetAndReportPathRules('rules')"
|
|
620
|
+
as-banner
|
|
621
|
+
/>
|
|
609
622
|
<ArrayList
|
|
610
623
|
v-model="value.rules"
|
|
611
624
|
label="Resources"
|