@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
@@ -7,10 +7,15 @@
7
7
  *
8
8
  * <rc-button variant="primary" @click="doAction">Perform an Action</rc-button>
9
9
  */
10
- import { computed, ref } from 'vue';
10
+ import { computed, ref, resolveComponent } from 'vue';
11
+ import type { RouteLocationRaw } from 'vue-router';
11
12
  import {
12
- ButtonVariantProps, ButtonSizeProps, ButtonVariantNewProps, ButtonSizeNewProps, ButtonSize,
13
- IconProps
13
+ ButtonVariantProps,
14
+ ButtonSizeProps,
15
+ ButtonVariantNewProps,
16
+ ButtonSizeNewProps,
17
+ ButtonSize,
18
+ IconProps,
14
19
  } from './types';
15
20
  import RcIcon from '@components/RcIcon/RcIcon.vue';
16
21
 
@@ -33,7 +38,22 @@ const buttonSizesNew: { size: ButtonSize, className: string }[] = [
33
38
  { size: 'large', className: 'btn-large' },
34
39
  ];
35
40
 
36
- const props = withDefaults(defineProps<ButtonVariantProps & ButtonSizeProps & ButtonVariantNewProps & ButtonSizeNewProps & IconProps>(), { size: 'medium' });
41
+ const props = withDefaults(
42
+ defineProps<
43
+ ButtonVariantProps &
44
+ ButtonSizeProps &
45
+ ButtonVariantNewProps &
46
+ ButtonSizeNewProps &
47
+ IconProps & { to?: RouteLocationRaw }
48
+ >(),
49
+ {
50
+ size: 'medium',
51
+ to: undefined,
52
+ }
53
+ );
54
+
55
+ const tag = computed(() => (props.to ? resolveComponent('RouterLink') : 'button'));
56
+ const role = computed(() => (props.to ? 'link' : 'button'));
37
57
 
38
58
  const activeVariantClassName = computed(() => {
39
59
  if (props.variant === 'multiAction' || props.multiAction) {
@@ -94,9 +114,11 @@ defineExpose({ focus });
94
114
  </script>
95
115
 
96
116
  <template>
97
- <button
117
+ <component
118
+ :is="tag"
98
119
  ref="RcFocusTarget"
99
- role="button"
120
+ :role="role"
121
+ :to="to"
100
122
  :class="{ ...buttonClass }"
101
123
  >
102
124
  <slot
@@ -124,15 +146,23 @@ defineExpose({ focus });
124
146
  size="inherit"
125
147
  />
126
148
  </slot>
127
- </button>
149
+ </component>
128
150
  </template>
129
151
 
130
152
  <style lang="scss" scoped>
131
- button {
153
+ .rc-button {
132
154
  display: inline-flex;
133
155
  align-items: center;
134
156
  justify-content: center;
135
157
 
158
+ // Override global .btn > .icon:not(:only-child) { margin-right: 6px } from _button.scss.
159
+ // RcButton uses flex gap for spacing instead. The :not(:only-child) clause matches the global
160
+ // selector so we win on specificity regardless of stylesheet load order; :deep() is needed to
161
+ // target slotted content.
162
+ & > :deep(.icon:not(:only-child)) {
163
+ margin-right: 0;
164
+ }
165
+
136
166
  // Much of the styling in here came from _button.scss. Because we're making changes from role to variant and we don't want to impact existing use cases we're pulling in some of these styles. We should in the long run deprecate that file.
137
167
  // Variant styles
138
168
  &.variant-primary {
@@ -35,18 +35,20 @@ defineExpose({ focus });
35
35
  @keydown.enter.space="handleKeydown"
36
36
  @click="showMenu(true)"
37
37
  >
38
- <template #before>
39
- <slot name="before">
40
- <!-- Empty Content -->
41
- </slot>
38
+ <template
39
+ v-if="$slots.before"
40
+ #before
41
+ >
42
+ <slot name="before" />
42
43
  </template>
43
44
  <slot name="default">
44
45
  <!--Empty slot content-->
45
46
  </slot>
46
- <template #after>
47
- <slot name="after">
48
- <!-- Empty Content -->
49
- </slot>
47
+ <template
48
+ v-if="$slots.after"
49
+ #after
50
+ >
51
+ <slot name="after" />
50
52
  </template>
51
53
  </RcButton>
52
54
  </template>
@@ -236,10 +236,13 @@ function clone_repo_test_extension_build() {
236
236
  # Here we just add the extension that we want to include as a check (all our official extensions should be included here)
237
237
  # Don't forget to add the unit tests exception to clone_repo_test_extension_build function if a new extension has those
238
238
  # TODO: ISSUE #16858 - Reenable the tests as packages migrate to node version 24
239
- # clone_repo_test_extension_build "rancher" "kubewarden-ui" "kubewarden"
239
+ clone_repo_test_extension_build "rancher" "kubewarden-ui" "kubewarden"
240
240
  # clone_repo_test_extension_build "rancher" "elemental-ui" "elemental"
241
241
  clone_repo_test_extension_build "neuvector" "manager-ext" "neuvector-ui-ext"
242
242
  # clone_repo_test_extension_build "StackVista" "rancher-extension-stackstate" "observability"
243
- # clone_repo_test_extension_build "harvester" "harvester-ui-extension" "harvester"
243
+ clone_repo_test_extension_build "harvester" "harvester-ui-extension" "harvester"
244
+ clone_repo_test_extension_build "rancher" "ali-ui" "ali"
245
+ clone_repo_test_extension_build "rancher" "virtual-clusters-ui" "virtual-clusters"
246
+ # clone_repo_test_extension_build "rancher" "rancher-ai-ui" "rancher-ai-ui"
244
247
 
245
248
  echo "All done"
@@ -1,6 +1,6 @@
1
1
  module.exports = function(req, res, next) {
2
- // We do this redirect so that /verify-auth can work with both standalone and
3
- // while dashboard is nested under ember.
2
+ // We do this redirect so that /verify-auth can work with both standalone
3
+ // and hosted configurations.
4
4
  if (req.url.includes('/verify-auth') || req.url.includes('/verify-auth-azure')) {
5
5
  res.writeHead(301, { Location: req.url.replace(/verify-auth(-azure)?/, 'auth/verify') });
6
6
  res.end();
@@ -0,0 +1 @@
1
+ This product was created by the inspirational people at Rancher by SUSE.
@@ -0,0 +1,34 @@
1
+ # ::::::::::::::::::::::::::::::;;;;;;;:::::::::::::::::::;:::::::::::::::::::
2
+ # ::::::::::::::::::::::;+xxxxxxxxxxxxxxxxxxxx+;:::::::::+xxx+::::::::::::::::
3
+ # :::::::::::::::::;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;::::+xxxxxxx+::::::::::::
4
+ # ::::::::::::::+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;+xxxxxxxxxxx+::::::::
5
+ # :::::::::::+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;::;++;:::::
6
+ # :::::::::+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+::::::;+;::::
7
+ # :::::::;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx::::;++:++::::
8
+ # ::::::+xxxxxxxxxx++xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+::::;:;xx::::
9
+ # :::::+xxxxxx+;:::::::::;;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+;;;+xxx;:::
10
+ # ::::;xxxxx+:::::::::::::::;+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+;;+xxxxxxxx;:::
11
+ # ::::xxxxx;::::;+xxxxxx++::::;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx++++++++;::::
12
+ # ::::xxxx+::::;xxx+;;;+xxx;::::xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+;;::::::
13
+ # ::::xxxx+::::+xx;:::::;+xx;::::xxxxxxxxxxxxxxxxxxxxxxx;:::;;;;;;;:::::::::::
14
+ # ::::xxxxx;:::+xx+::::::;xxx;::::xxxxxx;:::::::;;+xxxxx;:::::::::::::::::::::
15
+ # ::::;xxxx+;:::;++::::::;xxx;::::;xxxxx+;:::::::::;+xxxx;::::::::::::::::::::
16
+ # :::::+xxxx+;::::::::::;xxxx;:::::;+xxxxxx+;:::::::;+xxxxx+;:::::::::::::::::
17
+ # ::::::;xxxxx++;;:::;;+xxxx;:::::::::::::::::::::::::::::::::::::::::::::::::
18
+ # :::::::;+xxxxxxxxxxxxxxxx;::::::::::::::::::::::::::::::::::::::::::::::::::
19
+ # :::::::::;++xxxxxxxxxx++::::::::::::::::::::::::::::::::::::::::::::::::::::
20
+ # ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
21
+ # ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
22
+ # ::::::::;;;;;::::::::::;;:::::::::;;:::::::::;;;;;::::::::::::;;;;;;;;;:::::
23
+ # :::::+X&&$$$$&$+::::::x&$+:::::::X&X;:::::;X$&$$$$&$x;::::::x&&$$$$$$$$x::::
24
+ # ::::x&$X;::::x$&X:::::x&$+:::::::X&X;::::+$&$;::::+$$X;::::;&$;:::::::::::::
25
+ # :::;$&X;::::::::::::::x&$+:::::::X&X;::::X&$;::::::::::::::+&$::::::::::::::
26
+ # ::::x&&$X;;:::::::::::x&$+:::::::X&X;::::+$&&X+;:::::::::::+&$;:::::::::::::
27
+ # :::::;X$&&&&&&$;::::::x&$+:::::::X&X;::::::x$&&&&&&$+::::::+&&&&&&&&&&+:::::
28
+ # :::::::::::;x$&&$:::::x&$+:::::::X&X;::::::::::::+$&&$+::::+&$::::::::::::::
29
+ # :::::;::::::::X$&;::::+$$x:::::::$&X;:::::;::::::::x$$+::::+&$::::::::::::::
30
+ # :::;$&$X;:::;X$&$:::::;X&$X;:::x$&$+::::;X&$X;:::;x$&$+::::;&$x;;;;;;;;:::::
31
+ # :::::+X&&&&&&&X;::::::::+X$&&&&&$x;:::::::;X$&&&&&&$+:::::::;$&&&&&&&&&x::::
32
+ # :::::::::;;;::::::::::::::::;;:::::::::::::::::;;::::::::::::::::::::::::::;
33
+ User-Agent: *
34
+ Disallow: /
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4
+ viewBox="0 0 305.3 143.2" style="enable-background:new 0 0 305.3 143.2;" xml:space="preserve">
5
+ <style type="text/css">
6
+ .st0{fill:#0876A9;}
7
+ </style>
8
+ <g>
9
+ <path class="st0" d="M305.2,31.5l-3.3-19.9C300.8,5.2,298.3,0,296.4,0c-2,0-3.6,5.3-3.6,11.8v5.2c0,6.5-5.3,11.8-11.8,11.8h-5.2
10
+ c-0.4,0-0.7,0-1.1,0V43c0.4,0,0.7,0,1.1,0h19.5C301.8,43.1,306.2,37.8,305.2,31.5"/>
11
+ <path class="st0" d="M258.3,14.6h-31.7c-0.3,0-0.5,0-0.8,0h-32.5c-0.4,0-0.8,0-1.1,0.1v-3c0-6.5-1.6-11.8-3.6-11.8
12
+ s-4.5,5.2-5.5,11.6l-3.3,19.9c-1.1,6.4,3.4,11.6,9.8,11.6h19.5c2,0,3.9-0.3,5.6-0.9c-0.6,3.3-3.5,5.9-7,5.9h-27.4
13
+ c-4.4,0-7.8-4-7.1-8.4L176,23c0.7-4.4-2.6-8.4-7.1-8.4H32.5c-2.9,0-5.4,1.7-6.5,4.2L0.3,58c-0.4,0.7-0.4,1.5,0.1,2.1l5,5.9
14
+ c0.6,0.7,1.7,0.8,2.5,0.2l17.5-13.8v83.6c0,4,3.2,7.2,7.2,7.2h38.7c4,0,7.2-3.2,7.2-7.2V107c0-4,3.2-7.2,7.2-7.2h96.7
15
+ c4,0,7.2,3.2,7.2,7.2v29.1c0,4,3.2,7.2,7.2,7.2h38.7c4,0,7.2-3.2,7.2-7.2v-31.3h-20.6c-6.5,0-11.8-5.3-11.8-11.8V72.9
16
+ c0-3.8,1.9-7.2,4.7-9.4v24c0,6.5,5.3,11.8,11.8,11.8h31.7c6.5,0,11.8-5.3,11.8-11.8V26.4C270.1,19.9,264.8,14.6,258.3,14.6"/>
17
+ </g>
18
+ </svg>
@@ -1,30 +1,54 @@
1
1
  import { CATALOG } from '@shell/config/types';
2
+ import { CATALOG as CATALOG_ANNOTATIONS } from '@shell/config/labels-annotations';
2
3
  import {
3
- state, getters, actions, mutations, filterAndArrangeCharts
4
+ state, getters, actions, mutations, filterAndArrangeCharts, isRancherRepo, compatibleVersionsFor, getPermittedOSs
4
5
  } from '../catalog';
5
6
  import { createStore } from 'vuex';
6
7
 
7
8
  const clusterRepo = { _key: 'testClusterRepo' };
8
- const repoChartName = 'abc';
9
+ const repoChartName = 'regular-chart';
9
10
  const repoChart = {
10
11
  name: repoChartName,
11
12
  type: 'namespaced',
12
13
  version: 1,
13
14
  metadata: { name: repoChartName }
14
15
  };
15
- const repoCharts = [repoChart];
16
+ const deprecatedByFieldChartName = 'deprecated-by-field-chart';
17
+ const deprecatedByFieldChart = {
18
+ name: deprecatedByFieldChartName,
19
+ type: 'namespaced',
20
+ version: 1,
21
+ deprecated: true,
22
+ metadata: { name: deprecatedByFieldChartName }
23
+ };
24
+ const deprecatedByAnnotationChartName = 'deprecated-by-annotation-chart';
25
+ const deprecatedByAnnotationChart = {
26
+ name: deprecatedByAnnotationChartName,
27
+ type: 'namespaced',
28
+ version: 1,
29
+ annotations: { [CATALOG_ANNOTATIONS.DEPRECATED]: 'true' },
30
+ metadata: { name: deprecatedByAnnotationChartName }
31
+ };
16
32
  const repo = {
17
33
  metadata: { name: 'testRepo' },
18
34
  _key: 'testRepo',
19
35
  links: { index: 'fetchindex' },
20
36
  canLoad: true,
21
- followLink: () => ({ entries: { [repoChartName]: repoCharts } })
37
+ followLink: () => ({
38
+ entries: {
39
+ [repoChartName]: [repoChart],
40
+ [deprecatedByFieldChartName]: [deprecatedByFieldChart],
41
+ [deprecatedByAnnotationChartName]: [deprecatedByAnnotationChart]
42
+ }
43
+ })
22
44
  };
23
45
 
24
46
  const catalogStoreName = 'catalog';
25
47
  const clusterStore = 'cluster';
26
48
 
27
49
  const expectedChartKey = `namespace/${ repo._key }/${ repoChartName }`;
50
+ const expectedDeprecatedByFieldChartKey = `namespace/${ repo._key }/${ deprecatedByFieldChartName }`;
51
+ const expectedDeprecatedByAnnotationChartKey = `namespace/${ repo._key }/${ deprecatedByAnnotationChartName }`;
28
52
  const initialVersionInfo = { junk: true };
29
53
  const initialRawChartName = 'cde';
30
54
  const initialRawChart = {
@@ -160,10 +184,20 @@ describe('catalog', () => {
160
184
  expect(rawCharts[expectedChartKey]).toBeDefined();
161
185
  expect(rawCharts[expectedChartKey].id).toBe(expectedChartKey);
162
186
  expect(rawCharts[expectedChartKey].versions[0].version).toBe(repoChart.version);
163
- expect(charts[0]).toBeDefined();
164
- expect(charts[0].id).toBe(initialRawChart.id);
165
- expect(charts[1]).toBeDefined();
166
- expect(charts[1].id).toBe(expectedChartKey);
187
+
188
+ expect(rawCharts[expectedDeprecatedByFieldChartKey]).toBeDefined();
189
+ expect(rawCharts[expectedDeprecatedByFieldChartKey].id).toBe(expectedDeprecatedByFieldChartKey);
190
+ expect(rawCharts[expectedDeprecatedByFieldChartKey].deprecated).toBe(true);
191
+
192
+ expect(rawCharts[expectedDeprecatedByAnnotationChartKey]).toBeDefined();
193
+ expect(rawCharts[expectedDeprecatedByAnnotationChartKey].id).toBe(expectedDeprecatedByAnnotationChartKey);
194
+ expect(rawCharts[expectedDeprecatedByAnnotationChartKey].deprecated).toBe(true);
195
+
196
+ expect(charts).toHaveLength(4);
197
+ expect(charts.find((c: any) => c.id === initialRawChart.id)).toBeDefined();
198
+ expect(charts.find((c: any) => c.id === expectedChartKey)).toBeDefined();
199
+ expect(charts.find((c: any) => c.id === expectedDeprecatedByFieldChartKey)).toBeDefined();
200
+ expect(charts.find((c: any) => c.id === expectedDeprecatedByAnnotationChartKey)).toBeDefined();
167
201
 
168
202
  // Version info should be unchanged
169
203
  expect(store.state[catalogStoreName].versionInfos).toStrictEqual(initialVersionInfo);
@@ -197,14 +231,130 @@ describe('catalog', () => {
197
231
  expect(rawCharts[expectedChartKey].id).toBe(expectedChartKey);
198
232
  expect(rawCharts[expectedChartKey].versions[0].version).toBe(repoChart.version);
199
233
 
200
- expect(charts).toHaveLength(1);
201
- expect(charts[0]).toBeDefined();
202
- expect(charts[0].id).toBe(expectedChartKey);
203
- expect(charts[0].versions[0].version).toBe(repoChart.version);
234
+ expect(rawCharts[expectedDeprecatedByFieldChartKey]).toBeDefined();
235
+ expect(rawCharts[expectedDeprecatedByFieldChartKey].id).toBe(expectedDeprecatedByFieldChartKey);
236
+ expect(rawCharts[expectedDeprecatedByFieldChartKey].deprecated).toBe(true);
237
+
238
+ expect(rawCharts[expectedDeprecatedByAnnotationChartKey]).toBeDefined();
239
+ expect(rawCharts[expectedDeprecatedByAnnotationChartKey].id).toBe(expectedDeprecatedByAnnotationChartKey);
240
+ expect(rawCharts[expectedDeprecatedByAnnotationChartKey].deprecated).toBe(true);
241
+
242
+ expect(charts).toHaveLength(3);
243
+ expect(charts.find((c: any) => c.id === expectedChartKey)).toBeDefined();
244
+ expect(charts.find((c: any) => c.id === expectedDeprecatedByFieldChartKey)).toBeDefined();
245
+ expect(charts.find((c: any) => c.id === expectedDeprecatedByAnnotationChartKey)).toBeDefined();
204
246
 
205
247
  // Version info should be changed (it's now empty given reset)
206
248
  expect(store.state[catalogStoreName].versionInfos).toStrictEqual({ });
207
249
  });
250
+
251
+ it('repoKeys provided', async() => {
252
+ const store = createStore(constructStore());
253
+
254
+ // Validate initial state of store
255
+ expect(store.getters[`${ catalogStoreName }/rawCharts`]).toStrictEqual(initialRawCharts);
256
+ expect(store.getters[`${ catalogStoreName }/charts`]).toStrictEqual([]);
257
+
258
+ // Make the request targeting specific repo (we provide repo._key)
259
+ await store.dispatch(`${ catalogStoreName }/load`, {
260
+ force: true,
261
+ repoKeys: [repo._key]
262
+ });
263
+
264
+ const rawCharts = store.getters[`${ catalogStoreName }/rawCharts`];
265
+ const charts = store.getters[`${ catalogStoreName }/charts`];
266
+
267
+ // We expect the old chart belonging to this repo to be wiped out
268
+ // and replaced entirely by the newly fetched chart.
269
+ expect(rawCharts[initialRawChart.id]).not.toBeDefined();
270
+ expect(rawCharts[expectedChartKey]).toBeDefined();
271
+ expect(rawCharts[expectedChartKey].id).toBe(expectedChartKey);
272
+ expect(rawCharts[expectedChartKey].versions[0].version).toBe(repoChart.version);
273
+
274
+ expect(rawCharts[expectedDeprecatedByFieldChartKey]).toBeDefined();
275
+ expect(rawCharts[expectedDeprecatedByFieldChartKey].id).toBe(expectedDeprecatedByFieldChartKey);
276
+ expect(rawCharts[expectedDeprecatedByFieldChartKey].deprecated).toBe(true);
277
+
278
+ expect(rawCharts[expectedDeprecatedByAnnotationChartKey]).toBeDefined();
279
+ expect(rawCharts[expectedDeprecatedByAnnotationChartKey].id).toBe(expectedDeprecatedByAnnotationChartKey);
280
+ expect(rawCharts[expectedDeprecatedByAnnotationChartKey].deprecated).toBe(true);
281
+
282
+ expect(charts).toHaveLength(3);
283
+ expect(charts.find((c: any) => c.id === expectedChartKey)).toBeDefined();
284
+ expect(charts.find((c: any) => c.id === expectedDeprecatedByFieldChartKey)).toBeDefined();
285
+ expect(charts.find((c: any) => c.id === expectedDeprecatedByAnnotationChartKey)).toBeDefined();
286
+ });
287
+
288
+ it('repoKeys provided, ignoring unrelated charts and versions', async() => {
289
+ // We will manually inject an unrelated chart to prove it isn't wiped out
290
+ const store = createStore(constructStore());
291
+ const unrelatedChart = {
292
+ id: `namespace/unrelatedRepo/unrelatedChart`,
293
+ repoKey: 'unrelatedRepo',
294
+ type: 'namespaced',
295
+ name: 'unrelatedChart',
296
+ version: 1,
297
+ metadata: { name: 'unrelatedChart' }
298
+ };
299
+
300
+ const targetedVersionKey = `namespace/testRepo/myChart/1.0.0`;
301
+ const unrelatedVersionKey = `namespace/unrelatedRepo/unrelatedChart/1.0.0`;
302
+
303
+ store.state[catalogStoreName].charts = {
304
+ ...initialRawCharts,
305
+ [unrelatedChart.id]: unrelatedChart
306
+ };
307
+
308
+ store.state[catalogStoreName].versionInfos = {
309
+ [targetedVersionKey]: { data: 'old-data' },
310
+ [unrelatedVersionKey]: { data: 'keep-me' }
311
+ };
312
+
313
+ // Make the request targeting specific repo
314
+ await store.dispatch(`${ catalogStoreName }/load`, {
315
+ force: true,
316
+ repoKeys: [repo._key]
317
+ });
318
+
319
+ const rawCharts = store.getters[`${ catalogStoreName }/rawCharts`];
320
+ const versionInfos = store.state[catalogStoreName].versionInfos;
321
+
322
+ // The unrelated chart should NOT be wiped
323
+ expect(rawCharts[unrelatedChart.id]).toBeDefined();
324
+ expect(rawCharts[unrelatedChart.id].repoKey).toBe('unrelatedRepo');
325
+
326
+ // The old initialRawChart (with repoKey: repo._key) SHOULD be wiped and replaced
327
+ expect(rawCharts[initialRawChart.id]).not.toBeDefined();
328
+ expect(rawCharts[expectedChartKey]).toBeDefined();
329
+
330
+ expect(rawCharts[expectedDeprecatedByFieldChartKey]).toBeDefined();
331
+ expect(rawCharts[expectedDeprecatedByAnnotationChartKey]).toBeDefined();
332
+
333
+ // The targeted version info SHOULD be wiped
334
+ expect(versionInfos[targetedVersionKey]).not.toBeDefined();
335
+ // The unrelated version info should NOT be wiped
336
+ expect(versionInfos[unrelatedVersionKey]).toBeDefined();
337
+ expect(versionInfos[unrelatedVersionKey].data).toBe('keep-me');
338
+ });
339
+ });
340
+
341
+ describe('refresh', () => {
342
+ it('calls refresh(false) on all repos and then dispatches a reset load', async() => {
343
+ const mockRepo1 = { refresh: jest.fn().mockResolvedValue(true) };
344
+ const mockRepo2 = { refresh: jest.fn().mockResolvedValue(true) };
345
+
346
+ const getters = { repos: [mockRepo1, mockRepo2] };
347
+ const dispatch = jest.fn().mockResolvedValue(true);
348
+ const commit = jest.fn();
349
+
350
+ await actions.refresh({
351
+ getters, commit, dispatch
352
+ });
353
+
354
+ expect(mockRepo1.refresh).toHaveBeenCalledWith(false);
355
+ expect(mockRepo2.refresh).toHaveBeenCalledWith(false);
356
+ expect(dispatch).toHaveBeenCalledWith('load', { force: true, reset: true });
357
+ });
208
358
  });
209
359
 
210
360
  describe('filterAndArrangeCharts', () => {
@@ -359,4 +509,118 @@ describe('catalog', () => {
359
509
  });
360
510
  });
361
511
  });
512
+
513
+ describe('isRancherRepo', () => {
514
+ it('should return true if chart.isRancherRepo is true', () => {
515
+ const chart = { isRancherRepo: true } as any;
516
+
517
+ expect(isRancherRepo(null, chart)).toBe(true);
518
+ });
519
+
520
+ it('should return true if repo.isRancherSource is true', () => {
521
+ const repo = { isRancherSource: true } as any;
522
+
523
+ expect(isRancherRepo(repo, null)).toBe(true);
524
+ });
525
+
526
+ it('should return false if repo is not a rancher source', () => {
527
+ const repo = { isRancherSource: false } as any;
528
+
529
+ expect(isRancherRepo(repo, null)).toBe(false);
530
+ });
531
+ });
532
+
533
+ describe('compatibleVersionsFor', () => {
534
+ it('should allow versions if no OS constraint is provided', () => {
535
+ const chart = { versions: [{ version: '1.0.0' }] } as any;
536
+ const versions = compatibleVersionsFor(chart, undefined);
537
+
538
+ expect(versions).toHaveLength(1);
539
+ });
540
+
541
+ it('should allow windows nodes if permitted-os includes windows', () => {
542
+ const chart = {
543
+ versions: [{
544
+ version: '1.0.0',
545
+ annotations: { 'catalog.cattle.io/permits-os': 'linux,windows' }
546
+ }]
547
+ } as any;
548
+ const versions = compatibleVersionsFor(chart, 'windows');
549
+
550
+ expect(versions).toHaveLength(1);
551
+ });
552
+
553
+ it('should block windows nodes if permitted-os does not include windows', () => {
554
+ const chart = {
555
+ versions: [{
556
+ version: '1.0.0',
557
+ annotations: { 'catalog.cattle.io/permits-os': 'linux' }
558
+ }]
559
+ } as any;
560
+ const versions = compatibleVersionsFor(chart, 'windows');
561
+
562
+ expect(versions).toHaveLength(0);
563
+ });
564
+
565
+ it('should fallback to LINUX for rancher repos and block windows nodes', () => {
566
+ const chart = { isRancherRepo: true, versions: [{ version: '1.0.0' }] } as any;
567
+ const versions = compatibleVersionsFor(chart, 'windows');
568
+
569
+ expect(versions).toHaveLength(0);
570
+ });
571
+
572
+ it('should not fallback to LINUX for non-rancher repos and allow windows nodes', () => {
573
+ const chart = { isRancherRepo: false, versions: [{ version: '1.0.0' }] } as any;
574
+ const versions = compatibleVersionsFor(chart, 'windows');
575
+
576
+ expect(versions).toHaveLength(1);
577
+ });
578
+ });
579
+
580
+ describe('getPermittedOSs', () => {
581
+ it('should return explicitly permitted OSs when the annotation is present on a Rancher repo', () => {
582
+ const annotations = { [CATALOG_ANNOTATIONS.PERMITTED_OS]: 'linux,windows' };
583
+ const result = getPermittedOSs(annotations, true);
584
+
585
+ expect(result).toHaveLength(2);
586
+ expect(result).toContain('linux');
587
+ expect(result).toContain('windows');
588
+ });
589
+
590
+ it('should return explicitly permitted OSs when the annotation is present on a non-Rancher repo', () => {
591
+ const annotations = { [CATALOG_ANNOTATIONS.PERMITTED_OS]: 'linux' };
592
+ const result = getPermittedOSs(annotations, false);
593
+
594
+ expect(result).toHaveLength(1);
595
+ expect(result).toContain('linux');
596
+ });
597
+
598
+ it('should fallback to linux if the annotation is missing on a Rancher repo', () => {
599
+ const annotations = {};
600
+ const result = getPermittedOSs(annotations, true);
601
+
602
+ expect(result).toHaveLength(1);
603
+ expect(result).toContain('linux');
604
+ });
605
+
606
+ it('should return an empty array (no restrictions) if the annotation is missing on a non-Rancher repo', () => {
607
+ const annotations = {};
608
+ const result = getPermittedOSs(annotations, false);
609
+
610
+ expect(result).toHaveLength(0);
611
+ });
612
+
613
+ it('should handle undefined annotations safely for Rancher repos', () => {
614
+ const result = getPermittedOSs(undefined, true);
615
+
616
+ expect(result).toHaveLength(1);
617
+ expect(result).toContain('linux');
618
+ });
619
+
620
+ it('should handle undefined annotations safely for non-Rancher repos', () => {
621
+ const result = getPermittedOSs(undefined, false);
622
+
623
+ expect(result).toHaveLength(0);
624
+ });
625
+ });
362
626
  });