@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
@@ -0,0 +1,26 @@
1
+ import { escapeHtml } from '@shell/utils/string';
2
+ import SteveModel from '@shell/plugins/steve/steve-class';
3
+ import { CAPI } from '@shell/config/types';
4
+
5
+ export default class CapiMachineRoot extends SteveModel {
6
+ get cluster() {
7
+ if ( !this.spec.clusterName ) {
8
+ return null;
9
+ }
10
+
11
+ // This is used to get the cluster's human name
12
+ // Ideally we get this via the management cluster. To find it though we have to go via the provisioning cluster. So might as well just use that
13
+
14
+ const clusterId = `${ this.metadata.namespace }/${ this.spec.clusterName }`;
15
+
16
+ return this.$rootGetters['management/byId'](CAPI.RANCHER_CLUSTER, clusterId);
17
+ }
18
+
19
+ get clusterName() {
20
+ return this.cluster?.nameDisplay || this.spec.clusterName;
21
+ }
22
+
23
+ get groupByLabel() {
24
+ return this.$rootGetters['i18n/t']('resourceTable.groupLabel.cluster', { name: escapeHtml(this.clusterName) });
25
+ }
26
+ }
@@ -78,28 +78,32 @@ export default class CatalogApp extends SteveModel {
78
78
  return [];
79
79
  }
80
80
 
81
- // Filtering matches by verifying if the current version is in the matched chart's available versions, and that the home value matches as well
82
- const thisHome = chart?.metadata?.home;
83
- const bestMatches = matchingCharts.filter(({ versions }) => {
84
- // First checking if the latest version has the same home value
85
- if (thisHome === versions[0]?.home) {
86
- return true;
87
- }
81
+ if (!repoName || matchingCharts.length > 1) {
82
+ // Filtering matches by verifying if the current version is in the matched chart's available versions, and that the home value matches as well
83
+ const thisHome = chart?.metadata?.home;
84
+ const bestMatches = matchingCharts.filter(({ versions }) => {
85
+ // First checking if the latest version has the same home value
86
+ if (thisHome === versions[0]?.home) {
87
+ return true;
88
+ }
88
89
 
89
- for (let i = 1; i < versions.length; i++) {
90
- const { version, home } = versions[i];
90
+ for (let i = 1; i < versions.length; i++) {
91
+ const { version, home } = versions[i];
91
92
 
92
- // Finding the exact version, if the version is not there, then most likely it's not a match
93
- // if the exact version is found, then we can compare the home value
94
- if (version === this.currentVersion && (home === thisHome)) {
95
- return true;
93
+ // Finding the exact version, if the version is not there, then most likely it's not a match
94
+ // if the exact version is found, then we can compare the home value
95
+ if (version === this.currentVersion && (home === thisHome)) {
96
+ return true;
97
+ }
96
98
  }
97
- }
98
99
 
99
- return false;
100
- });
100
+ return false;
101
+ });
102
+
103
+ return bestMatches;
104
+ }
101
105
 
102
- return bestMatches;
106
+ return matchingCharts;
103
107
  }
104
108
 
105
109
  get currentVersion() {
@@ -41,26 +41,54 @@ export default class ClusterRepo extends SteveModel {
41
41
  });
42
42
 
43
43
  insertAt(out, 0, {
44
- action: 'refresh',
45
- label: this.t('action.refresh'),
46
- icon: 'icon icon-refresh',
47
- enabled: !!this.links.update,
48
- bulkable: true,
44
+ action: 'refresh',
45
+ label: this.t('action.refresh'),
46
+ icon: 'icon icon-refresh',
47
+ enabled: !!this.links.update,
48
+ bulkable: true,
49
+ bulkAction: 'refreshBulk',
49
50
  });
50
51
  }
51
52
 
52
53
  return out;
53
54
  }
54
55
 
55
- async refresh() {
56
- const now = (new Date()).toISOString().replace(/\.\d+Z$/, 'Z');
56
+ /**
57
+ * Refreshes the repository by updating its forceUpdate annotation and waiting for it to become active.
58
+ * @param {boolean} dispatchLoad - Whether to dispatch the catalog/load action after refreshing. Defaults to true.
59
+ */
60
+ async refresh(dispatchLoad = true) {
61
+ try {
62
+ const now = (new Date()).toISOString().replace(/\.\d+Z$/, 'Z');
57
63
 
58
- this.spec.forceUpdate = now;
59
- await this.save();
64
+ this.spec.forceUpdate = now;
65
+ await this.save();
66
+
67
+ await this.waitForState('active', 10000, 1000);
60
68
 
61
- await this.waitForState('active', 10000, 1000);
69
+ if (dispatchLoad) {
70
+ this.$dispatch('catalog/load', { force: true, repoKeys: [this._key] }, { root: true });
71
+ }
72
+ } catch (err) {
73
+ this.$dispatch('growl/fromError', {
74
+ title: this.t('catalog.repo.error.refresh', {}, 'Error refreshing repository'),
75
+ err,
76
+ }, { root: true });
77
+ }
78
+ }
62
79
 
63
- this.$dispatch('catalog/load', { force: true, reset: true }, { root: true });
80
+ /**
81
+ * Performs a bulk refresh on multiple repositories concurrently, bypassing individual
82
+ * catalog loads, and dispatches a single catalog/load for all repositories once they are active.
83
+ * @param {ClusterRepo[]} items - Array of repository instances to refresh.
84
+ */
85
+ async refreshBulk(items) {
86
+ await Promise.allSettled(items.map((item) => item.refresh(false)));
87
+
88
+ this.$dispatch('catalog/load', {
89
+ force: true,
90
+ repoKeys: items.map((item) => item._key)
91
+ }, { root: true });
64
92
  }
65
93
 
66
94
  async disableClusterRepo() {
package/models/chart.js CHANGED
@@ -5,8 +5,9 @@ import {
5
5
  import { BLANK_CLUSTER } from '@shell/store/store-types.js';
6
6
  import { SHOW_PRE_RELEASE } from '@shell/store/prefs';
7
7
  import { getLatestCompatibleVersion } from '@shell/utils/chart';
8
+ import { isMissingDate } from '@shell/utils/time';
8
9
  import SteveModel from '@shell/plugins/steve/steve-class';
9
- import { CATALOG, ZERO_TIME } from '@shell/config/types';
10
+ import { CATALOG } from '@shell/config/types';
10
11
  import { CATALOG as CATALOG_ANNOTATIONS } from '@shell/config/labels-annotations';
11
12
  import day from 'dayjs';
12
13
 
@@ -89,22 +90,33 @@ export default class Chart extends SteveModel {
89
90
  }
90
91
 
91
92
  /**
92
- * Determines if the chart is installed by checking if exactly one matching installed app is found.
93
+ * Determines if the chart is installed by checking if at least one matching installed app is found.
93
94
  *
94
95
  * @returns {boolean} `true` if the chart is currently installed.
95
96
  */
96
97
  get isInstalled() {
97
- return this.matchingInstalledApps.length === 1;
98
+ return this.matchingInstalledApps.length >= 1;
98
99
  }
99
100
 
100
101
  /**
101
- * Determines if the installed app has a single available upgrade.
102
+ * Determines if at least one installed instance has an available upgrade.
102
103
  * Requires the chart to be installed.
103
104
  *
104
- * @returns {boolean} `true` if the app is installed and has a single upgrade available.
105
+ * @returns {boolean} `true` if the app is installed and at least one instance has an upgrade available.
105
106
  */
106
107
  get upgradeable() {
107
- return this.isInstalled && this.matchingInstalledApps[0].upgradeAvailable === APP_UPGRADE_STATUS.SINGLE_UPGRADE;
108
+ return this.isInstalled && this.matchingInstalledApps.some(
109
+ (app) => app.upgradeAvailable === APP_UPGRADE_STATUS.SINGLE_UPGRADE
110
+ );
111
+ }
112
+
113
+ /**
114
+ * Returns the number of installed instances of this chart.
115
+ *
116
+ * @returns {number} The count of installed instances.
117
+ */
118
+ get installedCount() {
119
+ return this.matchingInstalledApps.length;
108
120
  }
109
121
 
110
122
  /**
@@ -140,25 +152,19 @@ export default class Chart extends SteveModel {
140
152
  const subHeaderItems = [];
141
153
 
142
154
  if (latestVersion) {
143
- const hasZeroTime = latestVersion.created === ZERO_TIME;
144
-
145
155
  subHeaderItems.push({
146
156
  icon: 'icon-version-alt',
147
157
  iconTooltip: { key: 'tableHeaders.version' },
148
158
  label: latestVersion.version
149
159
  });
150
160
 
151
- const lastUpdatedItem = {
152
- icon: 'icon-refresh-alt',
153
- iconTooltip: { key: 'tableHeaders.lastUpdated' },
154
- label: hasZeroTime ? this.t('generic.na') : day(latestVersion.created).format('MMM D, YYYY')
155
- };
156
-
157
- if (hasZeroTime) {
158
- lastUpdatedItem.labelTooltip = this.t('catalog.charts.appChartCard.subHeaderItem.missingVersionDate');
161
+ if (!isMissingDate(latestVersion.created)) {
162
+ subHeaderItems.push({
163
+ icon: 'icon-refresh-alt',
164
+ iconTooltip: { key: 'tableHeaders.lastUpdated' },
165
+ label: day(latestVersion.created).format('MMM D, YYYY')
166
+ });
159
167
  }
160
-
161
- subHeaderItems.push(lastUpdatedItem);
162
168
  }
163
169
 
164
170
  const footerItems = [
@@ -206,10 +212,18 @@ export default class Chart extends SteveModel {
206
212
  }
207
213
 
208
214
  if (this.isInstalled) {
215
+ const hasMultipleInstances = this.installedCount > 1;
209
216
  const installedVersion = this.matchingInstalledApps[0]?.spec?.chart?.metadata?.version;
210
217
 
218
+ // When multiple instances, don't show version in tooltip since each may have different versions
219
+ let tooltipText = hasMultipleInstances ? this.t('generic.installedMultiple') : this.t('generic.installed');
220
+
221
+ if (!hasMultipleInstances) {
222
+ tooltipText = `${ tooltipText } (${ installedVersion })`;
223
+ }
224
+
211
225
  statuses.push({
212
- icon: 'icon-confirmation-alt', color: 'success', tooltip: { text: `${ this.t('generic.installed') } (${ installedVersion })` }
226
+ icon: 'icon-confirmation-alt', color: 'success', tooltip: { text: tooltipText }
213
227
  });
214
228
  }
215
229
 
package/models/cluster.js CHANGED
@@ -69,6 +69,6 @@ export default class NormanCluster extends NormanModel {
69
69
  const id = this.provisioningClusterId;
70
70
 
71
71
  return id && !!this.$rootGetters['management/byId'](CAPI.RANCHER_CLUSTER, id);
72
- }, this.$rootGetters['i18n/t']('cluster.managementTimeout'), timeout, interval);
72
+ }, this.$rootGetters['i18n/t']('cluster.managementTimeout', { type: CAPI.RANCHER_CLUSTER, name: this.provisioningClusterId }), timeout, interval);
73
73
  }
74
74
  }
@@ -2,11 +2,10 @@ import { ADDRESSES, CAPI, NODE } from '@shell/config/types';
2
2
  import { CAPI as CAPI_LABELS, MACHINE_ROLES } from '@shell/config/labels-annotations';
3
3
  import { NAME as EXPLORER } from '@shell/config/product/explorer';
4
4
  import { listNodeRoles } from '@shell/models/cluster/node';
5
- import { escapeHtml } from '@shell/utils/string';
6
5
  import { insertAt, findBy } from '@shell/utils/array';
7
6
  import { get } from '@shell/utils/object';
8
7
  import { downloadUrl } from '@shell/utils/download';
9
- import SteveModel from '@shell/plugins/steve/steve-class';
8
+ import CapiMachineRoot from '@shell/models/base-cluster.x-k8s.io';
10
9
 
11
10
  /**
12
11
  * Prevent scaling down control plane or etcd machines to zero
@@ -53,7 +52,8 @@ export function notOnlyOfRole(current, all) {
53
52
 
54
53
  return false;
55
54
  }
56
- export default class CapiMachine extends SteveModel {
55
+
56
+ export default class CapiMachine extends CapiMachineRoot {
57
57
  get _availableActions() {
58
58
  const out = super._availableActions;
59
59
 
@@ -144,18 +144,6 @@ export default class CapiMachine extends SteveModel {
144
144
  return await this.$dispatch('find', { type: kind, id });
145
145
  }
146
146
 
147
- get cluster() {
148
- if ( !this.spec.clusterName ) {
149
- return null;
150
- }
151
-
152
- const clusterId = `${ this.metadata.namespace }/${ this.spec.clusterName }`;
153
-
154
- const cluster = this.$rootGetters['management/byId'](CAPI.RANCHER_CLUSTER, clusterId);
155
-
156
- return cluster;
157
- }
158
-
159
147
  get poolName() {
160
148
  return this.metadata?.labels?.[ CAPI_LABELS.DEPLOYMENT_NAME ] || '';
161
149
  }
@@ -182,7 +170,7 @@ export default class CapiMachine extends SteveModel {
182
170
  return {
183
171
  name: 'c-cluster-product-resource-id',
184
172
  params: {
185
- cluster: this.cluster.status.clusterName,
173
+ cluster,
186
174
  product: EXPLORER,
187
175
  resource: NODE,
188
176
  id: kubeId
@@ -193,12 +181,6 @@ export default class CapiMachine extends SteveModel {
193
181
  return kubeId;
194
182
  }
195
183
 
196
- get groupByLabel() {
197
- const name = this.cluster?.nameDisplay || this.spec.clusterName;
198
-
199
- return this.$rootGetters['i18n/t']('resourceTable.groupLabel.cluster', { name: escapeHtml(name) });
200
- }
201
-
202
184
  get labels() {
203
185
  return this.metadata?.labels || {};
204
186
  }
@@ -1,33 +1,15 @@
1
1
  import { CAPI } from '@shell/config/types';
2
2
  import { escapeHtml } from '@shell/utils/string';
3
3
  import { sortBy } from '@shell/utils/sort';
4
- import SteveModel from '@shell/plugins/steve/steve-class';
5
4
  import { exceptionToErrorsArray } from '@shell/utils/error';
6
5
  import { handleConflict } from '@shell/plugins/dashboard-store/normalize';
7
6
  import { CAPI as CAPI_ANNOTATIONS, MACHINE_ROLES } from '@shell/config/labels-annotations';
8
7
  import { notOnlyOfRole } from '@shell/models/cluster.x-k8s.io.machine';
9
8
  import { KIND } from '../config/elemental-types';
10
9
  import { KIND as HARVESTER_KIND } from '../config/harvester-manager-types';
10
+ import CapiMachineRoot from '@shell/models/base-cluster.x-k8s.io';
11
11
 
12
- export default class CapiMachineDeployment extends SteveModel {
13
- get cluster() {
14
- if ( !this.spec.clusterName ) {
15
- return null;
16
- }
17
-
18
- const clusterId = `${ this.metadata.namespace }/${ this.spec.clusterName }`;
19
-
20
- const cluster = this.$rootGetters['management/byId'](CAPI.RANCHER_CLUSTER, clusterId);
21
-
22
- return cluster;
23
- }
24
-
25
- get groupByLabel() {
26
- const name = this.cluster?.nameDisplay || this.spec.clusterName;
27
-
28
- return this.$rootGetters['i18n/t']('resourceTable.groupLabel.cluster', { name: escapeHtml(name) });
29
- }
30
-
12
+ export default class CapiMachineDeployment extends CapiMachineRoot {
31
13
  get groupByPoolLabel() {
32
14
  return `${ this.$rootGetters['i18n/t']('resourceTable.groupLabel.machinePool', { name: escapeHtml(this.nameDisplay) }) }`;
33
15
  }
@@ -1,23 +1,5 @@
1
- import { CAPI } from '@shell/config/types';
2
- import { escapeHtml } from '@shell/utils/string';
3
- import SteveModel from '@shell/plugins/steve/steve-class';
4
1
 
5
- export default class CapiMachineSet extends SteveModel {
6
- get cluster() {
7
- if ( !this.spec.clusterName ) {
8
- return null;
9
- }
2
+ import CapiMachineRoot from '@shell/models/base-cluster.x-k8s.io';
10
3
 
11
- const clusterId = `${ this.metadata.namespace }/${ this.spec.clusterName }`;
12
-
13
- const cluster = this.$rootGetters['management/byId'](CAPI.RANCHER_CLUSTER, clusterId);
14
-
15
- return cluster;
16
- }
17
-
18
- get groupByLabel() {
19
- const name = this.cluster?.nameDisplay || this.spec.clusterName;
20
-
21
- return this.$rootGetters['i18n/t']('resourceTable.groupLabel.cluster', { name: escapeHtml(name) });
22
- }
4
+ export default class CapiMachineSet extends CapiMachineRoot {
23
5
  }
@@ -65,8 +65,29 @@ export default class ClusterScan extends SteveModel {
65
65
  total: 1,
66
66
  };
67
67
 
68
+ const downloadReportXCCDF = {
69
+ action: 'downloadLatestReportXCCDF',
70
+ enabled: this.hasReport,
71
+ icon: 'icon icon-download',
72
+ label: t('compliance.downloadReportXCCDF'),
73
+ total: 1,
74
+ };
75
+
76
+ const downloadAllReportsXCCDF = {
77
+ action: 'downloadAllReportsXCCDF',
78
+ enabled: this.hasReport,
79
+ icon: 'icon icon-download',
80
+ label: t('compliance.downloadAllReportsXCCDF'),
81
+ total: 1,
82
+ };
83
+
68
84
  if (this.hasReports) {
69
85
  out.unshift({ divider: true });
86
+ if (this.spec?.scheduledScanConfig?.cronSchedule) {
87
+ out.unshift(downloadAllReportsXCCDF);
88
+ downloadReportXCCDF.label = t('compliance.downloadLatestReportXCCDF');
89
+ }
90
+ out.unshift(downloadReportXCCDF);
70
91
  if (this.spec?.scheduledScanConfig?.cronSchedule) {
71
92
  out.unshift(downloadAllReports);
72
93
  downloadReport.label = t('compliance.downloadLatestReport');
@@ -121,7 +142,7 @@ export default class ClusterScan extends SteveModel {
121
142
 
122
143
  downloadFile(`${ labelFor(report) }.csv`, csv, 'application/csv');
123
144
  } catch (err) {
124
- this.$dispatch('growl/fromError', { title: 'Error downloading file', err }, { root: true });
145
+ this.$dispatch('growl/fromError', { title: this.t('compliance.scan.errorDownload'), err }, { root: true });
125
146
  }
126
147
  }
127
148
 
@@ -143,7 +164,7 @@ export default class ClusterScan extends SteveModel {
143
164
 
144
165
  toZip[`${ labelFor(report) }.csv`] = csv;
145
166
  } catch (err) {
146
- this.$dispatch('growl/fromError', { title: 'Error downloading file', err }, { root: true });
167
+ this.$dispatch('growl/fromError', { title: this.t('compliance.scan.errorDownload'), err }, { root: true });
147
168
  }
148
169
  });
149
170
  if (!isEmpty(toZip)) {
@@ -153,6 +174,113 @@ export default class ClusterScan extends SteveModel {
153
174
  }
154
175
  }
155
176
 
177
+ async _resolveBenchmark() {
178
+ const profileName = this.status?.lastRunScanProfileName;
179
+
180
+ if (!profileName) {
181
+ return null;
182
+ }
183
+ const profile = await this.$dispatch('find', { type: COMPLIANCE.CLUSTER_SCAN_PROFILE, id: profileName });
184
+ const benchmarkId = profile?.spec?.benchmarkVersion;
185
+
186
+ if (!benchmarkId) {
187
+ return null;
188
+ }
189
+
190
+ return this.$dispatch('find', { type: COMPLIANCE.BENCHMARK, id: benchmarkId });
191
+ }
192
+
193
+ async downloadLatestReportXCCDF() {
194
+ const reports = await this.getReports() || [];
195
+ const report = sortBy(reports, 'metadata.creationTimestamp', true)[0];
196
+
197
+ try {
198
+ const benchmark = await this._resolveBenchmark();
199
+ const { generateXCCDFPerNode } = await import(/* webpackChunkName: "xccdf" */'@shell/utils/xccdf');
200
+
201
+ const parsed = report.parsedReport || {};
202
+ const common = {
203
+ report: parsed,
204
+ benchmarkVersion: parsed.version || benchmark?.spec?.benchmarkVersion || '',
205
+ metadata: benchmark?.spec?.benchmarkMetadata || {},
206
+ stigChecks: benchmark?.spec?.stigChecks || {},
207
+ };
208
+
209
+ const toZip = {};
210
+
211
+ if (!Object.entries(parsed.nodes || {}).length) {
212
+ this.$dispatch('growl/fromError', { title: this.t('compliance.scan.errorNoParsedNodes') }, { root: true });
213
+ } else {
214
+ Object.entries(parsed.nodes || {}).forEach(([role, hosts]) => {
215
+ (hosts || []).forEach((hostname) => {
216
+ const xml = generateXCCDFPerNode({
217
+ ...common, hostname, role,
218
+ });
219
+
220
+ toZip[`${ labelFor(report) }--${ hostname }.xml`] = xml;
221
+ });
222
+ });
223
+
224
+ if (!isEmpty(toZip)) {
225
+ const zip = await generateZip(toZip);
226
+
227
+ downloadFile(`${ labelFor(report) }-per-node.zip`, zip, 'application/zip');
228
+ }
229
+ }
230
+ } catch (err) {
231
+ this.$dispatch('growl/fromError', { title: this.t('compliance.scan.errorDownload'), err }, { root: true });
232
+ }
233
+ }
234
+
235
+ async downloadAllReportsXCCDF() {
236
+ const toZip = {};
237
+ const reports = await this.getReports() || [];
238
+
239
+ try {
240
+ const benchmark = await this._resolveBenchmark();
241
+ const { generateXCCDFPerNode } = await import(/* webpackChunkName: "xccdf" */'@shell/utils/xccdf');
242
+
243
+ const hasParsedNodes = reports.some((report) => Object.entries(report.parsedReport?.nodes || {}).length);
244
+
245
+ if (!hasParsedNodes) {
246
+ this.$dispatch('growl/fromError', { title: this.t('compliance.scan.errorNoParsedNodes') }, { root: true });
247
+ } else {
248
+ reports.forEach((report) => {
249
+ try {
250
+ const parsed = report.parsedReport || {};
251
+ const common = {
252
+ report: parsed,
253
+ benchmarkVersion: parsed.version || benchmark?.spec?.benchmarkVersion || '',
254
+ metadata: benchmark?.spec?.benchmarkMetadata || {},
255
+ stigChecks: benchmark?.spec?.stigChecks || {},
256
+ };
257
+ const folder = labelFor(report);
258
+
259
+ Object.entries(parsed.nodes || {}).forEach(([role, hosts]) => {
260
+ (hosts || []).forEach((hostname) => {
261
+ const xml = generateXCCDFPerNode({
262
+ ...common, hostname, role,
263
+ });
264
+
265
+ toZip[`${ folder }/${ hostname }.xml`] = xml;
266
+ });
267
+ });
268
+ } catch (err) {
269
+ this.$dispatch('growl/fromError', { title: this.t('compliance.scan.errorDownload'), err }, { root: true });
270
+ }
271
+ });
272
+
273
+ if (!isEmpty(toZip)) {
274
+ generateZip(toZip).then((zip) => {
275
+ downloadFile(`${ this.id }-reports-xccdf-per-node.zip`, zip, 'application/zip');
276
+ });
277
+ }
278
+ }
279
+ } catch (err) {
280
+ this.$dispatch('growl/fromError', { title: this.t('compliance.scan.errorDownload'), err }, { root: true });
281
+ }
282
+ }
283
+
156
284
  get scanProfileLink() {
157
285
  if (this.status?.lastRunScanProfileName) {
158
286
  return {
@@ -1,4 +1,4 @@
1
- import { CAPI, MANAGEMENT } from '@shell/config/types';
1
+ import { MANAGEMENT } from '@shell/config/types';
2
2
  import SteveModel from '@shell/plugins/steve/steve-class';
3
3
  import { Location } from 'vue-router';
4
4
 
@@ -49,16 +49,13 @@ export default class Kubeconfig extends SteveModel {
49
49
  */
50
50
  get referencedClusters(): ReferencedCluster[] {
51
51
  const clusterIds = this.spec?.clusters || [];
52
- const provClusters = this.$rootGetters['management/all'](CAPI.RANCHER_CLUSTER) || [];
53
- const mgmtClusters = this.$rootGetters['management/all'](MANAGEMENT.CLUSTER) || [];
54
52
 
55
53
  return clusterIds.map((id: string) => {
56
- const provCluster = provClusters.find((c: any) => c.mgmt?.id === id || c.status?.clusterName === id);
57
- const mgmtCluster = mgmtClusters.find((c: any) => c.id === id);
58
- const cluster = provCluster || mgmtCluster;
54
+ const mgmtCluster = this.$rootGetters['management/byId'](MANAGEMENT.CLUSTER, id);
55
+ const provCluster = mgmtCluster?.provCluster;
59
56
 
60
57
  return {
61
- label: cluster?.nameDisplay || this.t('"ext.cattle.io.kubeconfig".deleted', { name: id }),
58
+ label: mgmtCluster?.nameDisplay || this.t('"ext.cattle.io.kubeconfig".deleted', { name: id }),
62
59
  location: provCluster?.detailLocation || mgmtCluster?.detailLocation || null
63
60
  };
64
61
  });
@@ -7,6 +7,7 @@ import { addObject, addObjects, findBy } from '@shell/utils/array';
7
7
  import SteveModel from '@shell/plugins/steve/steve-class';
8
8
  import { mapStateToEnum, primaryDisplayStatusFromCount, STATES_ENUM } from '@shell/plugins/dashboard-store/resource-class';
9
9
  import FleetUtils from '@shell/utils/fleet';
10
+ import { HARVESTER_CONTAINER } from '@shell/store/features';
10
11
 
11
12
  function normalizeStateCounts(data) {
12
13
  if (isEmpty(data)) {
@@ -105,7 +106,7 @@ export default class FleetApplication extends SteveModel {
105
106
 
106
107
  for (const tgt of this.spec.targets) {
107
108
  if (tgt.clusterName) {
108
- const cluster = findBy(clusters, 'metadata.name', tgt.clusterName);
109
+ const cluster = findBy(clusters, 'metadata.name', tgt.clusterName) || findBy(clusters, 'nameDisplay', tgt.clusterName);
109
110
 
110
111
  if (cluster) {
111
112
  addObject(out, cluster);
@@ -138,7 +139,8 @@ export default class FleetApplication extends SteveModel {
138
139
  }
139
140
 
140
141
  get targetInfo() {
141
- const mode = FleetUtils.Application.getTargetMode(this.spec.targets || [], this.metadata.namespace);
142
+ const areHarvesterHostsVisible = this.$rootGetters['features/get'](HARVESTER_CONTAINER);
143
+ const mode = FleetUtils.Application.getTargetMode(this.spec.targets || [], this.metadata.namespace, areHarvesterHostsVisible);
142
144
 
143
145
  return {
144
146
  mode,
@@ -47,7 +47,7 @@ export default class FleetBundle extends SteveModel {
47
47
 
48
48
  for (const tgt of this.spec.targets) {
49
49
  if (tgt.clusterName) {
50
- const cluster = findBy(clusters, 'metadata.name', tgt.clusterName);
50
+ const cluster = findBy(clusters, 'metadata.name', tgt.clusterName) || findBy(clusters, 'nameDisplay', tgt.clusterName);
51
51
 
52
52
  if (cluster) {
53
53
  addObject(out, cluster);
@@ -5,6 +5,13 @@ export default class KontainerDriver extends Driver {
5
5
  return 'c-cluster-manager-driver-kontainerdriver';
6
6
  }
7
7
 
8
+ get parentLocationOverride() {
9
+ return {
10
+ name: 'c-cluster-manager-driver-kontainerdriver',
11
+ params: { cluster: this.$rootGetters['clusterId'] }
12
+ };
13
+ }
14
+
8
15
  get _availableActions() {
9
16
  const out = [
10
17
  {
@@ -54,6 +61,10 @@ export default class KontainerDriver extends Driver {
54
61
  return out;
55
62
  }
56
63
 
64
+ get isEmber() {
65
+ return !this.builtIn && !this.builtin;
66
+ }
67
+
57
68
  deactivate(resources = [this]) {
58
69
  this.$dispatch('promptModal', {
59
70
  componentProps: { drivers: resources, driverType: 'kontainerDrivers' },
@@ -21,7 +21,11 @@ export const configType = {
21
21
  cognito: 'oidc',
22
22
  };
23
23
 
24
- const imageOverrides = { keycloakoidc: 'keycloak', genericoidc: 'openid' };
24
+ const imageOverrides = {
25
+ azuread: 'entraid',
26
+ keycloakoidc: 'keycloak',
27
+ genericoidc: 'openid',
28
+ };
25
29
 
26
30
  export default class AuthConfig extends SteveModel {
27
31
  get _availableActions() {