@rancher/shell 3.0.12-rc.1 → 3.0.12-rc.3

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 (376) hide show
  1. package/apis/impl/apis.ts +6 -0
  2. package/apis/index.ts +26 -0
  3. package/apis/intf/resources-api/cluster-api.ts +18 -0
  4. package/apis/intf/resources-api/mgmt-api.ts +15 -0
  5. package/apis/intf/resources-api/resource-base.ts +107 -0
  6. package/apis/intf/resources-api/resource-constants.ts +147 -0
  7. package/apis/intf/resources-api/resources-api.ts +143 -0
  8. package/apis/intf/resources.ts +49 -0
  9. package/apis/intf/{modal.ts → shell-api/modal.ts} +21 -26
  10. package/apis/intf/shell-api/proxy.ts +216 -0
  11. package/apis/intf/{slide-in.ts → shell-api/slide-in.ts} +4 -3
  12. package/apis/intf/{system.ts → shell-api/system.ts} +4 -1
  13. package/apis/intf/shell.ts +12 -6
  14. package/apis/resources/__tests__/resources-api-class.test.ts +550 -0
  15. package/apis/resources/index.ts +22 -0
  16. package/apis/resources/resources-api-class.ts +187 -0
  17. package/apis/shell/__tests__/proxy.test.ts +369 -0
  18. package/apis/shell/index.ts +8 -1
  19. package/apis/shell/modal.ts +4 -1
  20. package/apis/shell/notifications.ts +9 -6
  21. package/apis/shell/proxy.ts +256 -0
  22. package/apis/shell/slide-in.ts +4 -1
  23. package/apis/vue-shim.d.ts +2 -1
  24. package/assets/data/aws-regions.json +4 -0
  25. package/assets/fonts/lato/LatoLatin-Black.woff +0 -0
  26. package/assets/fonts/lato/LatoLatin-Black.woff2 +0 -0
  27. package/assets/fonts/lato/LatoLatin-BlackItalic.woff +0 -0
  28. package/assets/fonts/lato/LatoLatin-BlackItalic.woff2 +0 -0
  29. package/assets/fonts/lato/LatoLatin-Bold.woff +0 -0
  30. package/assets/fonts/lato/LatoLatin-Bold.woff2 +0 -0
  31. package/assets/fonts/lato/LatoLatin-BoldItalic.woff +0 -0
  32. package/assets/fonts/lato/LatoLatin-BoldItalic.woff2 +0 -0
  33. package/assets/fonts/lato/LatoLatin-Heavy.woff +0 -0
  34. package/assets/fonts/lato/LatoLatin-Heavy.woff2 +0 -0
  35. package/assets/fonts/lato/LatoLatin-HeavyItalic.woff +0 -0
  36. package/assets/fonts/lato/LatoLatin-HeavyItalic.woff2 +0 -0
  37. package/assets/fonts/lato/LatoLatin-Italic.woff +0 -0
  38. package/assets/fonts/lato/LatoLatin-Italic.woff2 +0 -0
  39. package/assets/fonts/lato/LatoLatin-Light.woff +0 -0
  40. package/assets/fonts/lato/LatoLatin-Light.woff2 +0 -0
  41. package/assets/fonts/lato/LatoLatin-LightItalic.woff +0 -0
  42. package/assets/fonts/lato/LatoLatin-LightItalic.woff2 +0 -0
  43. package/assets/fonts/lato/LatoLatin-Medium.woff +0 -0
  44. package/assets/fonts/lato/LatoLatin-Medium.woff2 +0 -0
  45. package/assets/fonts/lato/LatoLatin-MediumItalic.woff +0 -0
  46. package/assets/fonts/lato/LatoLatin-MediumItalic.woff2 +0 -0
  47. package/assets/fonts/lato/LatoLatin-Regular.woff +0 -0
  48. package/assets/fonts/lato/LatoLatin-Regular.woff2 +0 -0
  49. package/assets/fonts/lato/LatoLatin-Semibold.woff +0 -0
  50. package/assets/fonts/lato/LatoLatin-Semibold.woff2 +0 -0
  51. package/assets/fonts/lato/LatoLatin-SemiboldItalic.woff +0 -0
  52. package/assets/fonts/lato/LatoLatin-SemiboldItalic.woff2 +0 -0
  53. package/assets/images/providers/entraid-black.svg +4 -0
  54. package/assets/images/providers/entraid.svg +9 -0
  55. package/assets/images/vendor/entraid.svg +9 -0
  56. package/assets/styles/app.scss +0 -1
  57. package/assets/styles/base/_variables.scss +2 -0
  58. package/assets/styles/fonts/_fontstack.scss +132 -8
  59. package/assets/translations/en-us.yaml +41 -22
  60. package/assets/translations/zh-hans.yaml +4 -8
  61. package/chart/__tests__/S3.test.ts +10 -3
  62. package/chart/monitoring/index.vue +10 -1
  63. package/components/ActionDropdownShell.vue +2 -1
  64. package/components/CountBox.vue +20 -0
  65. package/components/CreateDriver.vue +0 -12
  66. package/components/CruResourceFooter.vue +9 -5
  67. package/components/DetailText.vue +12 -3
  68. package/components/ExplorerProjectsNamespaces.vue +1 -1
  69. package/components/InstallHelmCharts.vue +2 -2
  70. package/components/LandingPagePreference.vue +14 -5
  71. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +15 -1
  72. package/components/Resource/Detail/Metadata/index.vue +6 -0
  73. package/components/Resource/Detail/ResourcePopover/index.vue +12 -1
  74. package/components/Resource/Detail/SpacedRow.vue +3 -1
  75. package/components/Resource/Detail/TitleBar/index.vue +10 -11
  76. package/components/ResourceList/Masthead.vue +12 -8
  77. package/components/SelectIconGrid.vue +5 -10
  78. package/components/SingleClusterInfo.vue +1 -0
  79. package/components/SortableTable/__tests__/sorting.test.ts +126 -0
  80. package/components/SortableTable/index.vue +6 -9
  81. package/components/SortableTable/selection.js +23 -5
  82. package/components/SortableTable/sorting.js +6 -3
  83. package/components/Wizard.vue +14 -13
  84. package/components/__tests__/CountBox.test.ts +72 -0
  85. package/components/__tests__/DetailText.test.ts +113 -0
  86. package/components/fleet/FleetBundles.vue +100 -12
  87. package/components/fleet/FleetClusterTargets/index.vue +54 -15
  88. package/components/fleet/__tests__/FleetClusterTargets.test.ts +149 -115
  89. package/components/fleet/__tests__/FleetClusters.test.ts +12 -12
  90. package/components/form/InputWithSelect.vue +18 -10
  91. package/components/form/KeyValue.vue +17 -1
  92. package/components/form/LabeledSelect.vue +101 -26
  93. package/components/form/NameNsDescription.vue +11 -0
  94. package/components/form/Security.vue +6 -2
  95. package/components/form/Select.vue +73 -56
  96. package/components/form/ServiceNameSelect.vue +13 -11
  97. package/components/form/WorkloadPorts.vue +2 -7
  98. package/components/form/__tests__/KeyValue.test.ts +66 -0
  99. package/components/form/__tests__/NodeScheduling.test.ts +9 -0
  100. package/components/form/__tests__/Security.test.ts +76 -0
  101. package/components/form/labeled-select-utils/useLabeledSelectPagination.ts +138 -0
  102. package/components/formatter/Autoscaler.vue +4 -4
  103. package/components/formatter/ClusterKubeVersion.vue +27 -0
  104. package/components/formatter/ClusterLink.vue +1 -7
  105. package/components/formatter/ClusterProvider.vue +6 -10
  106. package/components/formatter/FleetSummaryGraph.vue +0 -3
  107. package/components/formatter/MachineSummaryGraph.vue +1 -1
  108. package/components/formatter/PodsUsage.vue +2 -2
  109. package/components/formatter/__tests__/Autoscaler.test.ts +19 -22
  110. package/components/formatter/__tests__/FleetSummaryGraph.test.ts +216 -0
  111. package/components/formatter/__tests__/PodsUsage.test.ts +6 -10
  112. package/components/nav/Group.vue +7 -6
  113. package/components/nav/Header.vue +24 -3
  114. package/components/nav/NamespaceFilter.vue +2 -2
  115. package/components/nav/NotificationCenter/Notification.vue +4 -1
  116. package/components/nav/NotificationCenter/NotificationHeader.vue +20 -8
  117. package/components/nav/NotificationCenter/__tests__/NotificationHeader.test.ts +80 -0
  118. package/components/nav/TopLevelMenu.helper.ts +15 -3
  119. package/components/nav/TopLevelMenu.vue +16 -5
  120. package/components/nav/Type.vue +8 -7
  121. package/components/nav/WindowManager/index.vue +2 -1
  122. package/components/nav/WorkspaceSwitcher.vue +13 -0
  123. package/components/nav/__tests__/Group.test.ts +67 -0
  124. package/components/nav/__tests__/Header.test.ts +235 -0
  125. package/components/nav/__tests__/TopLevelMenu.test.ts +145 -21
  126. package/components/nav/__tests__/Type.test.ts +20 -3
  127. package/components/templates/default.vue +34 -4
  128. package/components/templates/home.vue +30 -25
  129. package/components/templates/plain.vue +31 -26
  130. package/components/templates/standalone.vue +17 -0
  131. package/composables/useFormValidation.ts +93 -0
  132. package/composables/useLabeledFormElement.ts +10 -2
  133. package/composables/useLabeledSelect.ts +60 -0
  134. package/composables/useUserRetentionValidation.ts +1 -49
  135. package/composables/useVeeValidateField.test.ts +159 -0
  136. package/composables/useVeeValidateField.ts +67 -0
  137. package/config/cookies.js +0 -1
  138. package/config/labels-annotations.js +1 -0
  139. package/config/pagination-table-headers.js +18 -1
  140. package/config/product/manager.js +82 -21
  141. package/config/query-params.js +1 -0
  142. package/config/router/routes.js +6 -8
  143. package/config/table-headers.js +20 -1
  144. package/config/types.js +2 -1
  145. package/core/__tests__/plugin-products.test.ts +1505 -30
  146. package/core/plugin-products-base.ts +137 -20
  147. package/core/plugin-products-helpers.ts +5 -4
  148. package/core/plugin-products.ts +4 -0
  149. package/core/plugin-types.ts +129 -4
  150. package/core/plugin.ts +15 -7
  151. package/core/productDebugger.js +9 -4
  152. package/core/types-provisioning.ts +43 -30
  153. package/core/types.ts +58 -19
  154. package/detail/__tests__/management.cattle.io.fleetworkspace.test.ts +128 -0
  155. package/detail/__tests__/pod.test.ts +41 -0
  156. package/detail/harvesterhci.io.management.cluster.vue +6 -2
  157. package/detail/management.cattle.io.fleetworkspace.vue +49 -0
  158. package/detail/pod.vue +1 -1
  159. package/detail/provisioning.cattle.io.cluster.vue +4 -10
  160. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +9 -0
  161. package/edit/__tests__/kontainerDriver.test.ts +0 -13
  162. package/edit/__tests__/nodeDriver.test.ts +5 -11
  163. package/edit/__tests__/resources.cattle.io.restore.test.ts +9 -0
  164. package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/General.test.ts.snap +6 -0
  165. package/edit/auth/__tests__/azuread.test.ts +217 -34
  166. package/edit/auth/__tests__/oidc.test.ts +54 -0
  167. package/edit/auth/azuread.vue +123 -15
  168. package/edit/auth/oidc.vue +10 -2
  169. package/edit/kontainerDriver.vue +1 -2
  170. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +13 -4
  171. package/edit/networking.k8s.io.ingress/RulePath.vue +8 -4
  172. package/edit/networking.k8s.io.ingress/index.vue +75 -20
  173. package/edit/nodeDriver.vue +0 -2
  174. package/edit/provisioning.cattle.io.cluster/AgentEnv.vue +1 -0
  175. package/edit/provisioning.cattle.io.cluster/__tests__/AgentEnv.test.ts +25 -0
  176. package/edit/provisioning.cattle.io.cluster/__tests__/MachinePool.test.ts +104 -0
  177. package/edit/provisioning.cattle.io.cluster/index.vue +81 -106
  178. package/edit/provisioning.cattle.io.cluster/rke2.vue +8 -4
  179. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +11 -0
  180. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +37 -4
  181. package/edit/provisioning.cattle.io.cluster/tabs/registries/__tests__/RegistryConfigs.test.ts +132 -7
  182. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +2 -1
  183. package/edit/secret/__tests__/ssh.test.ts +5 -6
  184. package/edit/secret/basic.vue +31 -0
  185. package/edit/secret/index.vue +68 -17
  186. package/edit/secret/registry.vue +38 -0
  187. package/edit/secret/ssh.vue +29 -0
  188. package/edit/secret/tls.vue +30 -0
  189. package/edit/service.vue +4 -4
  190. package/edit/workload/Upgrading.vue +3 -3
  191. package/edit/workload/__tests__/Upgrading.test.ts +6 -9
  192. package/edit/workload/mixins/workload.js +2 -1
  193. package/initialize/App.vue +29 -2
  194. package/initialize/install-plugins.js +0 -2
  195. package/list/__tests__/management.cattle.io.feature.test.ts +105 -0
  196. package/list/catalog.cattle.io.app.vue +25 -5
  197. package/list/fleet.cattle.io.bundle.vue +7 -104
  198. package/list/fleet.cattle.io.clusterregistrationtoken.vue +20 -0
  199. package/list/management.cattle.io.feature.vue +1 -1
  200. package/list/management.cattle.io.fleetworkspace.vue +8 -0
  201. package/list/provisioning.cattle.io.cluster.vue +262 -180
  202. package/list/utils/management.cattle.io.cluster.utils.ts +128 -0
  203. package/machine-config/amazonec2.vue +1 -0
  204. package/mixins/__tests__/chart.test.ts +112 -0
  205. package/mixins/brand.js +2 -1
  206. package/mixins/chart.js +50 -15
  207. package/mixins/resource-fetch-api-pagination.js +41 -5
  208. package/models/__tests__/catalog.cattle.io.app.test.ts +15 -1
  209. package/models/__tests__/catalog.cattle.io.clusterrepo.test.ts +84 -0
  210. package/models/__tests__/chart.test.ts +99 -6
  211. package/models/__tests__/ext.cattle.io.kubeconfig.test.ts +67 -67
  212. package/models/__tests__/management.cattle.io.cluster.test.ts +1 -1
  213. package/models/__tests__/management.cattle.io.feature.test.ts +131 -0
  214. package/models/__tests__/management.cattle.io.node.ts +6 -5
  215. package/models/__tests__/management.cattle.io.nodepool.ts +5 -4
  216. package/models/__tests__/monitoring.coreos.com.alertmanagerconfig.test.ts +98 -0
  217. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +32 -11
  218. package/models/base-cluster.x-k8s.io.js +26 -0
  219. package/models/catalog.cattle.io.app.js +21 -17
  220. package/models/catalog.cattle.io.clusterrepo.js +39 -11
  221. package/models/chart.js +33 -19
  222. package/models/cluster.js +1 -1
  223. package/models/cluster.x-k8s.io.machine.js +4 -22
  224. package/models/cluster.x-k8s.io.machinedeployment.js +2 -20
  225. package/models/cluster.x-k8s.io.machineset.js +2 -20
  226. package/models/compliance.cattle.io.clusterscan.js +130 -2
  227. package/models/ext.cattle.io.kubeconfig.ts +4 -7
  228. package/models/fleet-application.js +4 -2
  229. package/models/fleet.cattle.io.bundle.js +1 -1
  230. package/models/kontainerdriver.js +11 -0
  231. package/models/management.cattle.io.authconfig.js +5 -1
  232. package/models/management.cattle.io.cluster.js +402 -78
  233. package/models/management.cattle.io.feature.js +3 -3
  234. package/models/management.cattle.io.kontainerdriver.js +1 -26
  235. package/models/management.cattle.io.node.js +6 -4
  236. package/models/management.cattle.io.nodepool.js +1 -1
  237. package/models/monitoring.coreos.com.alertmanagerconfig.js +31 -17
  238. package/models/networking.k8s.io.ingress.js +12 -4
  239. package/models/nodedriver.js +7 -0
  240. package/models/provisioning.cattle.io.cluster.js +47 -330
  241. package/models/rke.cattle.io.etcdsnapshot.js +1 -2
  242. package/package.json +20 -37
  243. package/pages/__tests__/readme.test.ts +49 -0
  244. package/pages/auth/setup.vue +2 -3
  245. package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +265 -0
  246. package/pages/c/_cluster/apps/charts/__tests__/index.test.ts +55 -0
  247. package/pages/c/_cluster/apps/charts/__tests__/install.test.ts +53 -0
  248. package/pages/c/_cluster/apps/charts/chart.vue +275 -39
  249. package/pages/c/_cluster/apps/charts/index.vue +2 -2
  250. package/pages/c/_cluster/apps/charts/install.vue +18 -10
  251. package/pages/c/_cluster/auth/user.retention/index.vue +55 -22
  252. package/pages/c/_cluster/explorer/__tests__/index.test.ts +23 -25
  253. package/pages/c/_cluster/explorer/index.vue +5 -49
  254. package/pages/c/_cluster/istio/__tests__/istio.index.test.ts +194 -0
  255. package/pages/c/_cluster/istio/index.vue +21 -6
  256. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +5 -7
  257. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +40 -2
  258. package/pages/c/_cluster/uiplugins/__tests__/PluginInfoPanel.test.ts +61 -0
  259. package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +735 -13
  260. package/pages/c/_cluster/uiplugins/index.vue +226 -222
  261. package/pages/diagnostic.vue +13 -17
  262. package/pages/fail-whale.vue +18 -0
  263. package/pages/home.vue +77 -260
  264. package/pages/readme.vue +88 -0
  265. package/plugins/dashboard-store/__tests__/resource-class.test.ts +88 -0
  266. package/plugins/dashboard-store/actions.js +40 -18
  267. package/plugins/dashboard-store/resource-class.js +5 -2
  268. package/plugins/steve/__tests__/subscribe.spec.ts +6 -3
  269. package/plugins/steve/steve-pagination-utils.ts +11 -3
  270. package/plugins/steve/subscribe.js +35 -5
  271. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +211 -1
  272. package/rancher-components/Form/LabeledInput/LabeledInput.vue +37 -4
  273. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +1 -1
  274. package/rancher-components/RcButton/RcButton.test.ts +37 -1
  275. package/rancher-components/RcButton/RcButton.vue +38 -8
  276. package/rancher-components/RcDropdown/RcDropdownTrigger.vue +10 -8
  277. package/scripts/test-plugins-build.sh +5 -2
  278. package/server/server-middleware.js +2 -2
  279. package/static/humans.txt +1 -0
  280. package/static/robots.txt +34 -0
  281. package/static/welcome-cow.svg +18 -0
  282. package/store/__tests__/catalog.test.ts +276 -12
  283. package/store/__tests__/type-map.test.ts +556 -1
  284. package/store/action-menu.js +8 -3
  285. package/store/auth.js +1 -4
  286. package/store/aws.js +27 -16
  287. package/store/catalog.js +87 -11
  288. package/store/digitalocean.js +20 -38
  289. package/store/index.js +2 -0
  290. package/store/linode.js +25 -40
  291. package/store/pnap.js +1 -0
  292. package/store/type-map.js +111 -29
  293. package/tsconfig.paths.json +8 -8
  294. package/types/kube/kube-api.ts +14 -1
  295. package/types/rancher/steve.api.ts +12 -12
  296. package/types/resources/settings.d.ts +2 -1
  297. package/types/shell/index.d.ts +128 -24
  298. package/types/store/dashboard-store.types.ts +108 -11
  299. package/types/store/pagination.types.ts +6 -3
  300. package/utils/__tests__/alertmanagerconfig.test.ts +117 -0
  301. package/utils/__tests__/async.test.ts +87 -0
  302. package/utils/__tests__/aws.test.ts +140 -0
  303. package/utils/__tests__/banners.test.ts +176 -0
  304. package/utils/__tests__/chart.test.ts +64 -1
  305. package/utils/__tests__/color.test.ts +226 -0
  306. package/utils/__tests__/duration.test.ts +140 -0
  307. package/utils/__tests__/fleet.test.ts +340 -0
  308. package/utils/__tests__/git.test.ts +270 -0
  309. package/utils/__tests__/inactivity.test.ts +316 -0
  310. package/utils/__tests__/ingress.test.ts +553 -0
  311. package/utils/__tests__/kube.test.ts +68 -0
  312. package/utils/__tests__/namespace-filter.test.ts +109 -0
  313. package/utils/__tests__/object.test.ts +77 -0
  314. package/utils/__tests__/pagination-utils.test.ts +361 -0
  315. package/utils/__tests__/parse-externalid.test.ts +137 -0
  316. package/utils/__tests__/perf-setting.utils.test.ts +98 -0
  317. package/utils/__tests__/poller-sequential.test.ts +177 -0
  318. package/utils/__tests__/poller.test.ts +170 -0
  319. package/utils/__tests__/promise.test.ts +346 -0
  320. package/utils/__tests__/settings.test.ts +140 -0
  321. package/utils/__tests__/sort-utils.test.ts +301 -0
  322. package/utils/__tests__/string-utils.test.ts +798 -0
  323. package/utils/__tests__/string.test.ts +23 -1
  324. package/utils/__tests__/style.test.ts +154 -0
  325. package/utils/__tests__/svg-filter.test.ts +184 -0
  326. package/utils/__tests__/time.test.ts +14 -1
  327. package/utils/__tests__/units.test.ts +417 -0
  328. package/utils/__tests__/url.test.ts +246 -0
  329. package/utils/__tests__/versions.test.ts +128 -0
  330. package/utils/__tests__/xccdf.test.ts +391 -0
  331. package/utils/chart.js +36 -0
  332. package/utils/fleet.ts +13 -3
  333. package/utils/gatekeeper/__tests__/util.test.ts +174 -0
  334. package/utils/gc/__tests__/gc-interval.test.ts +119 -0
  335. package/utils/gc/__tests__/gc-root-store.test.ts +225 -0
  336. package/utils/gc/__tests__/gc-route-changed.test.ts +96 -0
  337. package/utils/gc/__tests__/gc.test.ts +487 -0
  338. package/utils/ingress.ts +9 -1
  339. package/utils/object.js +33 -2
  340. package/utils/pagination-utils.ts +2 -1
  341. package/utils/string.js +25 -2
  342. package/utils/time.ts +5 -0
  343. package/utils/uiplugins.ts +5 -5
  344. package/utils/validators/__tests__/cluster-name.test.ts +110 -0
  345. package/utils/validators/__tests__/cron-schedule.test.ts +79 -0
  346. package/utils/validators/__tests__/index.test.ts +481 -0
  347. package/utils/validators/__tests__/kubernetes-name.test.ts +163 -0
  348. package/utils/validators/__tests__/misc-validators.test.ts +246 -0
  349. package/utils/validators/__tests__/pod-affinity.test.ts +382 -0
  350. package/utils/validators/__tests__/prometheusrule.test.ts +211 -0
  351. package/utils/validators/__tests__/role-template.test.ts +149 -0
  352. package/utils/validators/__tests__/service.test.ts +283 -0
  353. package/utils/validators/__tests__/setting.test.js +32 -0
  354. package/utils/validators/formRules/__tests__/index.test.ts +50 -0
  355. package/utils/validators/formRules/index.ts +5 -5
  356. package/utils/validators/machine-pool.ts +1 -1
  357. package/utils/validators/setting.js +18 -3
  358. package/utils/xccdf.ts +418 -0
  359. package/vue.config.js +0 -9
  360. package/assets/fonts/lato/lato-v17-latin-700.woff +0 -0
  361. package/assets/fonts/lato/lato-v17-latin-700.woff2 +0 -0
  362. package/assets/fonts/lato/lato-v17-latin-regular.woff +0 -0
  363. package/assets/fonts/lato/lato-v17-latin-regular.woff2 +0 -0
  364. package/assets/images/providers/azuread-black.svg +0 -22
  365. package/assets/images/providers/azuread.svg +0 -25
  366. package/assets/images/vendor/azuread.svg +0 -18
  367. package/assets/styles/fonts/_dots.scss +0 -18
  368. package/components/EmberPage.vue +0 -622
  369. package/components/EmberPageView.vue +0 -39
  370. package/components/form/labeled-select-utils/labeled-select-pagination.ts +0 -116
  371. package/mixins/labeled-form-element.ts +0 -225
  372. package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -28
  373. package/pages/c/_cluster/manager/pages/_page.vue +0 -22
  374. package/pages/c/_cluster/mcapps/pages/_page.vue +0 -22
  375. package/plugins/ember-cookie.js +0 -17
  376. package/utils/ember-page.js +0 -30
@@ -130,14 +130,11 @@ export default {
130
130
  const version = this.provisioningCluster?.kubernetesVersion;
131
131
 
132
132
  if (this.provisioningCluster?.isRke2) {
133
+ // This is a candidate for using the prov cluster provisioner (or now the mgmt cluster provisioner directly)
133
134
  const machineSelectorConfig = this.provisioningCluster?.spec?.rkeConfig?.machineSelectorConfig || {};
134
135
  const agentConfig = (machineSelectorConfig[0] || {}).config;
135
136
 
136
137
  cloudProvider = agentConfig?.['cloud-provider-name'];
137
- } else if (this.provisioningCluster?.isRke1) {
138
- const currentCluster = this.$store.getters['currentCluster'];
139
-
140
- cloudProvider = currentCluster?.spec?.rancherKubernetesEngineConfig?.cloudProvider?.name;
141
138
  }
142
139
 
143
140
  return cloudProvider === HARVESTER &&
@@ -145,9 +142,7 @@ export default {
145
142
  },
146
143
 
147
144
  provisioningCluster() {
148
- const out = this.$store.getters['management/all'](CAPI.RANCHER_CLUSTER).find((c) => c?.status?.clusterName === this.currentCluster.metadata.name);
149
-
150
- return out;
145
+ return this.$store.getters['management/byId'](CAPI.RANCHER_CLUSTER, this.currentCluster.provClusterId);
151
146
  },
152
147
  },
153
148
 
@@ -177,6 +177,72 @@ describe('component: KeyValue', () => {
177
177
  expect(firstValueInput.element.value).toBe('testvalue1');
178
178
  });
179
179
 
180
+ describe('valueConcealed', () => {
181
+ it('should not render actual secret values in the DOM when valueConcealed is true', () => {
182
+ const secretValue = 'super-secret-api-key-12345';
183
+ const wrapper = mount(KeyValue, {
184
+ props: {
185
+ value: { mySecret: secretValue },
186
+ mode: 'view',
187
+ valueConcealed: true,
188
+ },
189
+
190
+ global: {
191
+ mocks: { $store: { getters: { 'i18n/t': jest.fn() } } },
192
+ stubs: { CodeMirror: true },
193
+ },
194
+ });
195
+
196
+ const concealedEl = wrapper.find('[data-testid="concealed-value"]');
197
+
198
+ expect(concealedEl.exists()).toBe(true);
199
+ expect(wrapper.html()).not.toContain(secretValue);
200
+ });
201
+
202
+ it('should render a TextAreaAutoGrow with the real value when valueConcealed is false', () => {
203
+ const secretValue = 'visible-value';
204
+ const wrapper = mount(KeyValue, {
205
+ props: {
206
+ value: { myKey: secretValue },
207
+ mode: 'view',
208
+ valueConcealed: false,
209
+ },
210
+
211
+ global: {
212
+ mocks: { $store: { getters: { 'i18n/t': jest.fn() } } },
213
+ stubs: { CodeMirror: true },
214
+ },
215
+ });
216
+
217
+ const concealedEl = wrapper.find('[data-testid="concealed-value"]');
218
+
219
+ expect(concealedEl.exists()).toBe(false);
220
+
221
+ const multilineEl = wrapper.find('[data-testid="value-multiline"]');
222
+
223
+ expect(multilineEl.exists()).toBe(true);
224
+ });
225
+
226
+ it('should have user-select none on the concealed placeholder to prevent text selection', () => {
227
+ const wrapper = mount(KeyValue, {
228
+ props: {
229
+ value: { mySecret: 'secret' },
230
+ mode: 'view',
231
+ valueConcealed: true,
232
+ },
233
+
234
+ global: {
235
+ mocks: { $store: { getters: { 'i18n/t': jest.fn() } } },
236
+ stubs: { CodeMirror: true },
237
+ },
238
+ });
239
+
240
+ const concealedEl = wrapper.find('[data-testid="concealed-value"]');
241
+
242
+ expect(concealedEl.classes()).toContain('concealed-value');
243
+ });
244
+ });
245
+
180
246
  it('a11y: adding ARIA props should correctly fill out the appropriate fields on the component', async() => {
181
247
  const value = [{ key: 'testkey1', value: 'testvalue1' }];
182
248
 
@@ -1,9 +1,18 @@
1
1
  import { mount } from '@vue/test-utils';
2
2
  import NodeScheduling from '@shell/components/form/NodeScheduling.vue';
3
3
  import { _CREATE, _EDIT, _VIEW } from '@shell/config/query-params';
4
+ import { createStore } from 'vuex';
4
5
 
5
6
  const requiredSetup = () => {
6
7
  return {
8
+ provide: {
9
+ store: createStore({
10
+ getters: {
11
+ currentStore: () => 'cluster',
12
+ 'cluster/paginationEnabled': () => () => false,
13
+ },
14
+ }),
15
+ },
7
16
  global: {
8
17
  mocks: {
9
18
  $fetchState: { pending: false },
@@ -79,6 +79,42 @@ describe('component: Security', () => {
79
79
  expect(wrapper.emitted('update:value')).toHaveLength(1);
80
80
  });
81
81
 
82
+ // Regression: clearing runAsUser must drop the key from the emitted object.
83
+ // Otherwise the spec is sent with `runAsUser: ""` and the API rejects with
84
+ // "cannot unmarshal string ... of type int64". See issue #9601.
85
+ it('should omit runAsUser from the emitted value when the input is cleared', async() => {
86
+ const wrapper = mount(Security, {
87
+ props: {
88
+ mode: _EDIT, formType: FORM_TYPES.CONTAINER, value: { runAsUser: 33 }
89
+ }
90
+ });
91
+ const input = wrapper.find('[data-testid="input-security-runAsUser"]').find('input');
92
+
93
+ await input.setValue('');
94
+
95
+ const events = wrapper.emitted('update:value') ?? [];
96
+ const last = events[events.length - 1][0] as Record<string, unknown>;
97
+
98
+ expect(Object.prototype.hasOwnProperty.call(last, 'runAsUser')).toBe(false);
99
+ });
100
+
101
+ it('should omit runAsUser from the emitted value when it is undefined', async() => {
102
+ const wrapper = mount(Security, {
103
+ props: {
104
+ mode: _EDIT, formType: FORM_TYPES.CONTAINER, value: {}
105
+ }
106
+ });
107
+
108
+ const checkbox = wrapper.find('[data-testid="input-security-runasNonRoot"]').find('label');
109
+
110
+ await checkbox.trigger('click');
111
+
112
+ const events = wrapper.emitted('update:value') ?? [];
113
+ const last = events[events.length - 1][0] as Record<string, unknown>;
114
+
115
+ expect(Object.prototype.hasOwnProperty.call(last, 'runAsUser')).toBe(false);
116
+ });
117
+
82
118
  it.each([
83
119
  'privileged',
84
120
  'allowPrivilegeEscalation',
@@ -139,5 +175,45 @@ describe('component: Security', () => {
139
175
 
140
176
  expect(wrapper.emitted('update:value')).toHaveLength(1);
141
177
  });
178
+
179
+ it.each([
180
+ 'runAsUser',
181
+ 'fsGroup',
182
+ ])('should omit %p from the emitted value when it is undefined', async(field) => {
183
+ const wrapper = mount(Security, {
184
+ props: {
185
+ mode: _EDIT, formType: FORM_TYPES.POD, value: {}
186
+ }
187
+ });
188
+
189
+ const checkbox = wrapper.find('[data-testid="input-security-runasNonRoot"]').find('label');
190
+
191
+ await checkbox.trigger('click');
192
+
193
+ const events = wrapper.emitted('update:value') ?? [];
194
+ const last = events[events.length - 1][0] as Record<string, unknown>;
195
+
196
+ expect(Object.prototype.hasOwnProperty.call(last, field)).toBe(false);
197
+ });
198
+
199
+ // Regression for #9601 — see equivalent container-level test above.
200
+ it.each([
201
+ ['runAsUser', { runAsUser: 33 }],
202
+ ['fsGroup', { fsGroup: 100 }],
203
+ ])('should omit %p from the emitted value when the input is cleared', async(field, initial) => {
204
+ const wrapper = mount(Security, {
205
+ props: {
206
+ mode: _EDIT, formType: FORM_TYPES.POD, value: initial
207
+ }
208
+ });
209
+ const input = wrapper.find(`[data-testid="input-security-${ field }"]`).find('input');
210
+
211
+ await input.setValue('');
212
+
213
+ const events = wrapper.emitted('update:value') ?? [];
214
+ const last = events[events.length - 1][0] as Record<string, unknown>;
215
+
216
+ expect(Object.prototype.hasOwnProperty.call(last, field)).toBe(false);
217
+ });
142
218
  });
143
219
  });
@@ -0,0 +1,138 @@
1
+ /**
2
+ * composable to provide pagination support to LabeledSelect
3
+ */
4
+ import {
5
+ ref, computed, onMounted, ComputedRef, Ref, PropType
6
+ } from 'vue';
7
+ import { useStore } from 'vuex';
8
+ import { debounce } from 'lodash';
9
+ import { LabelSelectPaginateFn, LABEL_SELECT_NOT_OPTION_KINDS, LABEL_SELECT_KINDS } from '@shell/types/components/labeledSelect';
10
+
11
+ interface LabeledSelectPaginationProps {
12
+ paginate?: LabelSelectPaginateFn | null;
13
+ inStore?: string;
14
+ resourceType?: string | null;
15
+ options?: Array<any>;
16
+ }
17
+
18
+ interface UseLabeledSelectPagination {
19
+ canPaginate: ComputedRef<boolean>;
20
+ canLoadMore: ComputedRef<boolean>;
21
+ optionCounts: ComputedRef<string>;
22
+ _options: ComputedRef<any[]>;
23
+ pages: Ref<number>;
24
+ totalResults: Ref<number>;
25
+ paginating: Ref<boolean>;
26
+ loadMore: () => void;
27
+ setPaginationFilter: (filter: string) => void;
28
+ }
29
+
30
+ export const labeledSelectPaginationProps = {
31
+ paginate: {
32
+ default: null,
33
+ type: Function as PropType<LabelSelectPaginateFn>,
34
+ },
35
+
36
+ inStore: {
37
+ type: String,
38
+ default: 'cluster',
39
+ },
40
+
41
+ /**
42
+ * Resource to show
43
+ */
44
+ resourceType: {
45
+ type: String,
46
+ default: null,
47
+ },
48
+ };
49
+
50
+ export const useLabeledSelectPagination = (props: LabeledSelectPaginationProps): UseLabeledSelectPagination => {
51
+ const store = useStore();
52
+
53
+ // Internal
54
+ const currentPage = ref(1);
55
+ const search = ref('');
56
+ const pageSize = ref(10);
57
+ const pages = ref(0);
58
+
59
+ // External
60
+ const page = ref<any[]>([]);
61
+ const totalResults = ref(0);
62
+ const paginating = ref(false);
63
+
64
+ const canPaginate = computed(() => {
65
+ return !!props.paginate && !!props.resourceType && store.getters[`${ props.inStore }/paginationEnabled`](props.resourceType);
66
+ });
67
+
68
+ const _options = computed(() => canPaginate.value ? page.value : (props.options || []));
69
+
70
+ const canLoadMore = computed(() => pages.value > currentPage.value);
71
+
72
+ const optionsInPage = computed(() => {
73
+ // Number of genuine options (not groups, dividers, etc)
74
+ return canPaginate.value ? _options.value.filter((o: any) => {
75
+ return o.kind !== LABEL_SELECT_KINDS.NONE && !LABEL_SELECT_NOT_OPTION_KINDS.includes(o.kind);
76
+ }).length : 0;
77
+ });
78
+
79
+ const optionCounts = computed(() => {
80
+ if (!canPaginate.value || optionsInPage.value === totalResults.value) {
81
+ return '';
82
+ }
83
+
84
+ return store.getters['i18n/t']('labelSelect.pagination.counts', {
85
+ count: optionsInPage.value,
86
+ totalCount: totalResults.value
87
+ });
88
+ });
89
+
90
+ const requestPagination = async(resetPage = false) => {
91
+ paginating.value = true;
92
+
93
+ const { page: p, pages: pg, total } = await (props.paginate as LabelSelectPaginateFn)({
94
+ resetPage,
95
+ pageContent: page.value || [],
96
+ page: currentPage.value,
97
+ filter: search.value,
98
+ pageSize: pageSize.value,
99
+ });
100
+
101
+ page.value = p;
102
+ pages.value = pg || 0;
103
+ totalResults.value = total || 0;
104
+ paginating.value = false;
105
+ };
106
+
107
+ const debouncedRequestPagination = debounce(requestPagination, 700);
108
+
109
+ const setPaginationFilter = (filter: string) => {
110
+ paginating.value = true; // Do this before debounce
111
+ currentPage.value = 1;
112
+ search.value = filter;
113
+ debouncedRequestPagination(true);
114
+ };
115
+
116
+ const loadMore = () => {
117
+ currentPage.value++;
118
+ requestPagination();
119
+ };
120
+
121
+ onMounted(async() => {
122
+ if (canPaginate.value) {
123
+ await requestPagination();
124
+ }
125
+ });
126
+
127
+ return {
128
+ canPaginate,
129
+ canLoadMore,
130
+ optionCounts,
131
+ _options,
132
+ pages,
133
+ totalResults,
134
+ paginating,
135
+ loadMore,
136
+ setPaginationFilter,
137
+ };
138
+ };
@@ -21,8 +21,8 @@ const store = useStore();
21
21
  const i18n = useI18n(store);
22
22
 
23
23
  const checked = computed(() => props.value === true || props.value === 'true');
24
- const actionIcon = computed(() => props.row.isAutoscalerPaused ? 'icon-play' : 'icon-pause');
25
- const actionText = computed(() => props.row.isAutoscalerPaused ? i18n.t('autoscaler.card.resume') : i18n.t('autoscaler.card.pause'));
24
+ const actionIcon = computed(() => props.row.provCluster.isAutoscalerPaused ? 'icon-play' : 'icon-pause');
25
+ const actionText = computed(() => props.row.provCluster.isAutoscalerPaused ? i18n.t('autoscaler.card.resume') : i18n.t('autoscaler.card.pause'));
26
26
  const stopPropagation = (event: Event) => {
27
27
  // This is to prevent click events from getting to the table row which ends up selecting the row
28
28
  event.stopPropagation();
@@ -45,7 +45,7 @@ const stopPropagation = (event: Event) => {
45
45
  #heading-action="{close}"
46
46
  >
47
47
  <RcButton
48
- v-if="row.canPauseResumeAutoscaler"
48
+ v-if="row.provCluster.canPauseResumeAutoscaler"
49
49
  variant="secondary"
50
50
  size="small"
51
51
  class="action"
@@ -56,7 +56,7 @@ const stopPropagation = (event: Event) => {
56
56
  </RcButton>
57
57
  </template>
58
58
  <template #card-body>
59
- <AutoscalerCard :value="props.row" />
59
+ <AutoscalerCard :value="props.row.provCluster" />
60
60
  </template>
61
61
  </PopoverCard>
62
62
  </span>
@@ -0,0 +1,27 @@
1
+ <script>
2
+
3
+ export default {
4
+ name: 'ClusterKubeVersion',
5
+
6
+ props: {
7
+ row: {
8
+ type: Object,
9
+ default: null,
10
+ },
11
+ },
12
+ };
13
+ </script>
14
+
15
+ <template>
16
+ <div>
17
+ <span>
18
+ {{ row.kubernetesVersion }}
19
+ </span>
20
+ <div
21
+ v-clean-tooltip="{content: row.architecture.tooltip, placement: 'left'}"
22
+ class="text-muted"
23
+ >
24
+ {{ row.architecture.label }}
25
+ </div>
26
+ </div>
27
+ </template>
@@ -31,7 +31,7 @@ export default {
31
31
  return this.getCustomDetailLink(this.row);
32
32
  }
33
33
 
34
- return this.row?.detailLocation;
34
+ return this.row?.provCluster?.detailLocation;
35
35
  },
36
36
 
37
37
  statusErrorConditions() {
@@ -77,12 +77,6 @@ export default {
77
77
  class="conditions-alert-icon icon-alert icon"
78
78
  data-testid="unavailable-machines-alert-icon"
79
79
  />
80
- <i
81
- v-if="row.isRke1"
82
- v-clean-tooltip="t('cluster.rke1Unsupported')"
83
- class="rke1-unsupported-icon icon-warning icon"
84
- data-testid="rke1-unsupported-icon"
85
- />
86
80
  <i
87
81
  v-if="row.hasError && statusErrorConditions.length > 0"
88
82
  v-clean-tooltip="{ content: `<div>${formattedConditions}</div>`, html: true }"
@@ -12,26 +12,22 @@ export default {
12
12
  <template>
13
13
  <div>
14
14
  <template v-if="row.machineProvider">
15
- <span v-if="row.isHarvester && row.mgmt && row.mgmt.isReady && !row.hasError">
15
+ <span v-if="row.isHarvester && row.isReady && !row.hasError">
16
16
  <a
17
- v-if="row.mgmt.isReady && !row.hasError"
18
17
  role="button"
19
18
  @click="row.goToHarvesterCluster()"
20
19
  >
21
20
  {{ row.machineProviderDisplay }}
22
21
  </a>
23
22
  </span>
24
- <span v-else>
23
+ <span v-else-if="row.machineProviderDisplay">
25
24
  {{ row.machineProviderDisplay }}
26
25
  </span>
27
26
  </template>
28
- <template v-else-if="row.isImported">
29
- {{ t('cluster.provider.imported') }}
30
- </template>
31
- <template v-else-if="row.isCustom">
32
- {{ t('cluster.provider.custom') }}
33
- </template>
34
- <div class="text-muted">
27
+ <div
28
+ v-if="row.machineProviderDisplay !== row.provisionerDisplay"
29
+ class="text-muted"
30
+ >
35
31
  {{ row.provisionerDisplay }}
36
32
  </div>
37
33
  </div>
@@ -26,9 +26,6 @@ export default {
26
26
  if (this.clusterId) {
27
27
  return this.row.statusResourceCountsForCluster(this.clusterId);
28
28
  }
29
- if (this.row.statusResourceCountsForCluster) {
30
- return this.row.statusResourceCountsForCluster;
31
- }
32
29
 
33
30
  return this.row.status?.resourceCounts || {};
34
31
  },
@@ -18,7 +18,7 @@ export default {
18
18
  computed: {
19
19
  ready() {
20
20
  // Ensure we never show more ready machines than desired
21
- // If w can address in backedn, we could revert this in the future
21
+ // If we can address in backend, we could revert this in the future
22
22
  const ready = this.row?.ready || 0;
23
23
  const desired = this.row?.desired || 0;
24
24
 
@@ -9,8 +9,8 @@ export default {
9
9
  },
10
10
  computed: {
11
11
  podsUsage() {
12
- const usedPods = this.row?.mgmt?.status?.requested?.pods;
13
- const totalPods = this.row?.mgmt?.status?.allocatable?.pods;
12
+ const usedPods = this.row?.status?.requested?.pods;
13
+ const totalPods = this.row?.status?.allocatable?.pods;
14
14
 
15
15
  if (!this.row?.isReady || !totalPods) {
16
16
  return '—';
@@ -30,6 +30,10 @@ describe('component: formatter/Autoscaler.vue', () => {
30
30
  stubs: {
31
31
  PopoverCard: PopoverCardStub,
32
32
  RcButton: { template: '<button><slot /></button>' },
33
+ // RcButton: {
34
+ // template: '<button><i v-if="icon" :class="icon" /><i v-if="leftIcon" :class="leftIcon" /><slot /></button>',
35
+ // props: ['icon', 'leftIcon']
36
+ // },
33
37
  AutoscalerCard: {
34
38
  name: 'AutoscalerCard',
35
39
  props: ['value'],
@@ -88,30 +92,26 @@ describe('component: formatter/Autoscaler.vue', () => {
88
92
  });
89
93
 
90
94
  it('should render AutoscalerCard with correct row data', () => {
91
- const rowData = { id: 'test-row' };
92
- const wrapper = createWrapper({ value: true, row: rowData });
95
+ const provCluster = { id: 'test-row' };
96
+ const wrapper = createWrapper({ value: true, row: { provCluster } });
93
97
  const card = wrapper.findComponent({ name: 'AutoscalerCard' });
94
98
 
95
99
  expect(card.exists()).toBe(true);
96
- expect(card.props('value')).toStrictEqual(rowData);
100
+ expect(card.props('value')).toStrictEqual(provCluster);
97
101
  });
98
102
  });
99
103
 
100
104
  describe('heading action button', () => {
101
105
  it('should NOT render if canExplore is false', () => {
102
- const rowData = { canExplore: false };
103
- const wrapper = createWrapper({ value: true, row: rowData });
106
+ const provCluster = { canExplore: false };
107
+ const wrapper = createWrapper({ value: true, row: { provCluster } });
104
108
 
105
109
  expect(wrapper.find('button').exists()).toBe(false);
106
110
  });
107
111
 
108
112
  it('should render "Pause" button if autoscaler is running', () => {
109
- const rowData = {
110
- canExplore: true, isAutoscalerPaused: false, canPauseResumeAutoscaler: true
111
- };
112
- const wrapper = createWrapper({
113
- value: true, row: rowData, canPauseResumeAutoscaler: true
114
- });
113
+ const provCluster = { isAutoscalerPaused: false, canPauseResumeAutoscaler: true };
114
+ const wrapper = createWrapper({ value: true, row: { canExplore: true, provCluster } });
115
115
  const button = wrapper.find('button');
116
116
 
117
117
  expect(button.exists()).toBe(true);
@@ -120,10 +120,8 @@ describe('component: formatter/Autoscaler.vue', () => {
120
120
  });
121
121
 
122
122
  it('should render "Resume" button if autoscaler is paused', () => {
123
- const rowData = {
124
- canExplore: true, isAutoscalerPaused: true, canPauseResumeAutoscaler: true
125
- };
126
- const wrapper = createWrapper({ value: true, row: rowData });
123
+ const provCluster = { isAutoscalerPaused: true, canPauseResumeAutoscaler: true };
124
+ const wrapper = createWrapper({ value: true, row: { canExplore: true, provCluster } });
127
125
  const button = wrapper.find('button');
128
126
 
129
127
  expect(button.exists()).toBe(true);
@@ -132,20 +130,19 @@ describe('component: formatter/Autoscaler.vue', () => {
132
130
  });
133
131
 
134
132
  it('should hide "Resume" button if canPauseResumeAutoscaler is false', () => {
135
- const rowData = {
136
- canExplore: true, isAutoscalerPaused: true, canPauseResumeAutoscaler: false
137
- };
138
- const wrapper = createWrapper({ value: true, row: rowData });
133
+ const provCluster = { isAutoscalerPaused: true, canPauseResumeAutoscaler: false };
134
+ const wrapper = createWrapper({ value: true, row: { canExplore: true, provCluster } });
139
135
  const button = wrapper.find('button');
140
136
 
141
137
  expect(button.exists()).toBe(false);
142
138
  });
143
139
 
144
140
  it('should call toggleAutoscalerRunner and close on click', async() => {
145
- const rowData = {
146
- canExplore: true, toggleAutoscalerRunner: mockToggleRunner, canPauseResumeAutoscaler: true
141
+ const provCluster = { canPauseResumeAutoscaler: true };
142
+ const mgmtCluster = {
143
+ toggleAutoscalerRunner: mockToggleRunner, canExplore: true, provCluster
147
144
  };
148
- const wrapper = createWrapper({ value: true, row: rowData });
145
+ const wrapper = createWrapper({ value: true, row: mgmtCluster });
149
146
 
150
147
  wrapper.find('button').trigger('click');
151
148