@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.
Files changed (149) hide show
  1. package/assets/styles/base/_variables.scss +1 -0
  2. package/assets/styles/themes/_dark.scss +1 -0
  3. package/assets/styles/themes/_light.scss +6 -5
  4. package/assets/translations/en-us.yaml +44 -17
  5. package/assets/translations/zh-hans.yaml +2 -2
  6. package/components/ClusterIconMenu.vue +143 -0
  7. package/components/CruResource.vue +7 -1
  8. package/components/ExplorerProjectsNamespaces.vue +11 -1
  9. package/components/FixedBanner.vue +17 -1
  10. package/components/Loading.vue +1 -1
  11. package/components/Markdown.vue +1 -1
  12. package/components/Questions/__tests__/Yaml.test.ts +3 -2
  13. package/components/SideNav.vue +1 -1
  14. package/components/SortableTable/index.vue +3 -2
  15. package/components/auth/RoleDetailEdit.vue +15 -2
  16. package/components/auth/login/saml.vue +12 -1
  17. package/components/form/LabeledSelect.vue +12 -5
  18. package/components/form/Members/ClusterPermissionsEditor.vue +1 -1
  19. package/components/form/Members/MembershipEditor.vue +6 -1
  20. package/components/form/SelectOrCreateAuthSecret.vue +7 -0
  21. package/components/form/__tests__/KeyValue.test.ts +6 -3
  22. package/components/form/__tests__/LabeledSelect.test.ts +18 -0
  23. package/components/formatter/PodsUsage.vue +11 -36
  24. package/components/formatter/PrincipalGroupBindings.vue +8 -5
  25. package/components/formatter/__tests__/PodsUsage.test.ts +36 -19
  26. package/components/nav/Group.vue +62 -34
  27. package/components/nav/Header.vue +13 -6
  28. package/components/nav/Pinned.vue +47 -0
  29. package/components/nav/TopLevelMenu.vue +673 -325
  30. package/components/nav/Type.vue +88 -8
  31. package/config/home-links.js +1 -1
  32. package/config/product/istio.js +15 -5
  33. package/config/router.js +3 -9
  34. package/config/table-headers.js +5 -6
  35. package/config/uiplugins.js +1 -0
  36. package/core/plugin-helpers.js +3 -0
  37. package/core/types.ts +6 -1
  38. package/creators/app/files/.vscode/settings.json +0 -1
  39. package/creators/pkg/init +2 -2
  40. package/detail/__tests__/autoscaling.horizontalpodautoscaler.test.ts +118 -0
  41. package/detail/autoscaling.horizontalpodautoscaler/index.vue +4 -4
  42. package/detail/provisioning.cattle.io.cluster.vue +7 -5
  43. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +58 -0
  44. package/edit/__tests__/namespace.test.ts +5 -3
  45. package/edit/fleet.cattle.io.gitrepo.vue +43 -15
  46. package/edit/logging.banzaicloud.io.output/index.vue +7 -0
  47. package/edit/management.cattle.io.clusterroletemplatebinding.vue +3 -11
  48. package/edit/namespace.vue +8 -4
  49. package/edit/provisioning.cattle.io.cluster/Basics.vue +662 -0
  50. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +9 -8
  51. package/edit/provisioning.cattle.io.cluster/DrainOptions.vue +13 -8
  52. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +11 -2
  53. package/edit/provisioning.cattle.io.cluster/MemberRoles.vue +40 -0
  54. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +237 -0
  55. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.tests.ts +71 -23
  56. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +52 -0
  57. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +65 -142
  58. package/edit/provisioning.cattle.io.cluster/rke2.vue +253 -582
  59. package/edit/workload/storage/ContainerMountPaths.vue +7 -5
  60. package/edit/workload/storage/__tests__/Storage.test.ts +2 -2
  61. package/edit/workload/storage/persistentVolumeClaim/__tests__/persistentvolumeclaim.test.ts +36 -0
  62. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +15 -7
  63. package/initialize/App.js +2 -0
  64. package/initialize/client.js +63 -51
  65. package/initialize/index.js +7 -5
  66. package/layouts/default.vue +10 -2
  67. package/layouts/home.vue +6 -2
  68. package/layouts/plain.vue +9 -2
  69. package/list/fleet.cattle.io.cluster.vue +2 -2
  70. package/list/management.cattle.io.feature.vue +1 -1
  71. package/machine-config/amazonec2.vue +1 -0
  72. package/machine-config/vmwarevsphere.vue +48 -7
  73. package/mixins/brand.js +0 -8
  74. package/mixins/child-hook.js +2 -2
  75. package/mixins/create-edit-view/impl.js +3 -3
  76. package/mixins/fetch.client.js +3 -3
  77. package/models/__tests__/management.cattle.io.node.ts +96 -0
  78. package/models/__tests__/node.ts +74 -0
  79. package/models/cluster/node.js +6 -5
  80. package/models/cluster.x-k8s.io.machinedeployment.js +2 -2
  81. package/models/management.cattle.io.cluster.js +22 -1
  82. package/models/management.cattle.io.clusterroletemplatebinding.js +3 -3
  83. package/models/management.cattle.io.globalrole.js +17 -2
  84. package/models/management.cattle.io.node.js +6 -4
  85. package/models/management.cattle.io.projectroletemplatebinding.js +3 -3
  86. package/models/management.cattle.io.roletemplate.js +17 -2
  87. package/package.json +2 -6
  88. package/pages/__tests__/prefs.test.ts +1 -1
  89. package/pages/about.vue +2 -0
  90. package/pages/auth/setup.vue +5 -4
  91. package/pages/c/_cluster/explorer/ConfigBadge.vue +1 -0
  92. package/pages/c/_cluster/monitoring/index.vue +8 -3
  93. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +9 -66
  94. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +182 -0
  95. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +15 -32
  96. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +8 -46
  97. package/pages/c/_cluster/uiplugins/index.vue +64 -64
  98. package/pages/diagnostic.vue +0 -39
  99. package/pages/home.vue +1 -1
  100. package/pages/prefs.vue +3 -13
  101. package/plugins/dashboard-store/normalize.js +4 -4
  102. package/plugins/dashboard-store/resource-class.js +1 -1
  103. package/plugins/int-number.js +5 -2
  104. package/plugins/positive-int-number.js +19 -0
  105. package/plugins/steve/__tests__/getters.spec.ts +15 -0
  106. package/plugins/steve/getters.js +22 -10
  107. package/public/index.html +4 -2
  108. package/rancher-components/BadgeState/BadgeState.vue +5 -1
  109. package/rancher-components/Banner/Banner.test.ts +51 -1
  110. package/rancher-components/Banner/Banner.vue +134 -53
  111. package/rancher-components/Card/Card.test.ts +37 -0
  112. package/rancher-components/Card/Card.vue +24 -7
  113. package/rancher-components/Form/Checkbox/Checkbox.test.ts +20 -29
  114. package/rancher-components/Form/Checkbox/Checkbox.vue +45 -20
  115. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +2 -8
  116. package/rancher-components/Form/LabeledInput/LabeledInput.vue +22 -10
  117. package/rancher-components/Form/Radio/RadioButton.test.ts +31 -0
  118. package/rancher-components/Form/Radio/RadioButton.vue +30 -13
  119. package/rancher-components/Form/Radio/RadioGroup.vue +26 -7
  120. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +7 -6
  121. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.test.ts +25 -38
  122. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +23 -11
  123. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +19 -5
  124. package/rancher-components/StringList/StringList.test.ts +453 -49
  125. package/rancher-components/StringList/StringList.vue +92 -58
  126. package/scripts/extension/parse-tag-name +0 -0
  127. package/store/index.js +4 -0
  128. package/store/prefs.js +4 -4
  129. package/store/type-map.js +2 -16
  130. package/types/shell/index.d.ts +26 -14
  131. package/utils/__tests__/cluster.test.ts +55 -0
  132. package/utils/__tests__/object.test.ts +21 -2
  133. package/utils/__tests__/sort.test.ts +61 -0
  134. package/utils/cluster.js +47 -1
  135. package/utils/object.js +12 -5
  136. package/utils/string.js +12 -0
  137. package/utils/validators/formRules/__tests__/index.test.ts +13 -1
  138. package/utils/validators/formRules/index.ts +4 -0
  139. package/utils/validators/role-template.js +9 -1
  140. package/utils/version.js +1 -1
  141. package/vue.config.js +1 -4
  142. package/yarn-error.log +200 -0
  143. package/content/docs/en-us/getting-started.md +0 -224
  144. package/content/docs/en-us/whats-new.md +0 -29
  145. package/content/docs/zh-hans/getting-started.md +0 -224
  146. package/content/docs/zh-hans/whats-new.md +0 -28
  147. package/pages/docs/_doc.vue +0 -345
  148. package/pages/docs/toc.js +0 -27
  149. package/plugins/console.js +0 -34
@@ -2,6 +2,7 @@ $header-font: 'Poppins', sans-serif;
2
2
  $body-font: 'Lato', arial, helvetica, sans-serif;
3
3
  $mono-font: 'Roboto Mono', monospace;
4
4
 
5
+ $app-bar-collapsed-width: 70px;
5
6
  $max-width: 1440px !default;
6
7
  $min-width: 75% !default;
7
8
  $input-height: 61px;
@@ -65,6 +65,7 @@
65
65
  --nav-border : #{$medium};
66
66
  --nav-hover : var(--primary);
67
67
  --nav-expander-hover : var(--primary-banner-bg);
68
+ --nav-icon-badge-bg : #{$dark};
68
69
 
69
70
  --disabled-bg : #{darken($disabled, 10%)};
70
71
  --disabled-text : #{$secondary};
@@ -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 : 230px;
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-resource-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.'
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 recommended removing the Node Affinity rule that prevents the <b>agent</b> from running on Windows nodes as this is not a supported configuration."
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 attemping 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.'
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 in this screen will be limited, you may want to use the YAML editor.
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, use Pod Security Admission instead.
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
- deleteEmptyDir: "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."
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 th ecluster will be lost.
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
- cacheState:
4123
- name: cacheState
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
- custom: "Are you sure that you want to uninstall this Extension Image? This will also remove any Extensions provided by this image."
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-resource-system</code>命名空间中具有<code>encryption-provider-config.yaml</code>密钥的任何密文。<br/>此文件的内容是还原此备份所必需的,Rancher Backup 不会存储这些内容。'
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: v1.25 版开始,Kubernetes 已经取消了对 Pod 安全策略 (PSP) 的支持。如果你的集群通过集群 YAML 中的 “kube-apiserver-arg.enable-admission-plugins” 启用了 PodSecurityPolicy 准入控制器,你必须在继续升级之前<i>手动</i>删除它。此外,集群中存在的任何 PSP 将不再可用或强制执行。是否继续操作?
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(BEFORE_SAVE_HOOKS);
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 v-if="showBanner">
146
+ <div
147
+ v-if="showBanner"
148
+ :id="id"
149
+ >
134
150
  <div
135
151
  v-if="!showAsDialog"
136
152
  class="banner"
@@ -75,7 +75,7 @@ export default {
75
75
  }
76
76
 
77
77
  &-content-mode {
78
- left: var(--nav-width);
78
+ left: calc(var(--nav-width));
79
79
  top: var(--header-height);
80
80
  }
81
81
  }
@@ -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: true,
6
- Tabbed: true,
5
+ Tab: true,
6
+ Tabbed: true,
7
+ CodeMirror: true
7
8
  };
8
9
  const defaultGetters = {
9
10
  currentStore: () => 'current_store',
@@ -552,7 +552,7 @@ export default {
552
552
  ::v-deep h6 {
553
553
  margin: 0;
554
554
  letter-spacing: normal;
555
- line-height: initial;
555
+ line-height: 15px;
556
556
 
557
557
  A { padding-left: 0; }
558
558
  }
@@ -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.find((a) => a.action === this.actionOfInterest.action);
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="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"