@rancher/shell 3.0.12-rc.2 → 3.0.12-rc.4

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 (473) 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/styles/base/_variables.scss +2 -0
  54. package/assets/styles/fonts/_fontstack.scss +132 -8
  55. package/assets/styles/global/_layout.scss +4 -0
  56. package/assets/translations/en-us.yaml +165 -45
  57. package/assets/translations/zh-hans.yaml +1 -7
  58. package/chart/monitoring/ClusterSelector.vue +0 -21
  59. package/chart/monitoring/index.vue +10 -1
  60. package/chart/monitoring/prometheus/index.vue +6 -3
  61. package/components/ActionDropdownShell.vue +2 -1
  62. package/components/CruResource.vue +161 -14
  63. package/components/CruResourceFooter.vue +9 -5
  64. package/components/ExplorerMembers.vue +8 -4
  65. package/components/ExplorerProjectsNamespaces.vue +11 -7
  66. package/components/GrowlManager.vue +4 -0
  67. package/components/InstallHelmCharts.vue +2 -2
  68. package/components/LandingPagePreference.vue +14 -5
  69. package/components/MgmtNodeList.vue +184 -0
  70. package/components/Resource/Detail/Card/StateCard/__tests__/composables.test.ts +90 -1
  71. package/components/Resource/Detail/Card/StateCard/composables.ts +57 -87
  72. package/components/Resource/Detail/Card/StatusCard/__tests__/StatusCard.test.ts +61 -0
  73. package/components/Resource/Detail/Card/StatusCard/index.vue +61 -15
  74. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +17 -1
  75. package/components/Resource/Detail/Metadata/KeyValue.vue +5 -2
  76. package/components/Resource/Detail/Metadata/KeyValueRow.vue +2 -6
  77. package/components/Resource/Detail/Metadata/index.vue +6 -0
  78. package/components/Resource/Detail/ResourcePopover/index.vue +12 -1
  79. package/components/Resource/Detail/SpacedRow.vue +3 -1
  80. package/components/Resource/Detail/TitleBar/index.vue +10 -11
  81. package/components/ResourceDetail/index.vue +1 -1
  82. package/components/ResourceList/Masthead.vue +19 -9
  83. package/components/ResourceList/index.vue +82 -1
  84. package/components/RichTranslation.vue +5 -2
  85. package/components/SelectIconGrid.vue +0 -10
  86. package/components/Setting.vue +1 -0
  87. package/components/SingleClusterInfo.vue +1 -0
  88. package/components/SortableTable/__tests__/sorting.test.ts +126 -0
  89. package/components/SortableTable/index.vue +6 -9
  90. package/components/SortableTable/selection.js +23 -5
  91. package/components/SortableTable/sorting.js +6 -3
  92. package/components/SubtleLink.vue +31 -6
  93. package/components/Tabbed/Tab.vue +29 -3
  94. package/components/Tabbed/index.vue +25 -3
  95. package/components/TableOfContents/TableOfContents.vue +109 -0
  96. package/components/TableOfContents/composables.ts +258 -0
  97. package/components/Window/ContainerShell.vue +21 -11
  98. package/components/Window/__tests__/ContainerShell.test.ts +107 -37
  99. package/components/Wizard.vue +23 -17
  100. package/components/fleet/AppCoChartGrid.vue +401 -0
  101. package/components/fleet/AppCoEmptyState.vue +127 -0
  102. package/components/fleet/AppCoPageHeader.vue +119 -0
  103. package/components/fleet/AppCoVersionSelect.vue +70 -0
  104. package/components/fleet/FleetBundles.vue +100 -12
  105. package/components/fleet/FleetClusterTargets/ClusterSelectionFields.vue +217 -0
  106. package/components/fleet/FleetClusterTargets/TargetsList.vue +123 -35
  107. package/components/fleet/FleetClusterTargets/index.vue +226 -161
  108. package/components/fleet/FleetIntro.vue +7 -3
  109. package/components/fleet/FleetNoWorkspaces.vue +7 -3
  110. package/components/fleet/FleetSecretSelector.vue +5 -3
  111. package/components/fleet/FleetValuesFrom.vue +8 -2
  112. package/components/fleet/GitRepoTargetTab.vue +0 -2
  113. package/components/fleet/HelmOpAdvancedTab.vue +19 -53
  114. package/components/fleet/HelmOpAppCoConfigTab.vue +593 -0
  115. package/components/fleet/HelmOpAppCoResourcesSection.vue +162 -0
  116. package/components/fleet/HelmOpResourcesSection.vue +82 -0
  117. package/components/fleet/HelmOpTargetOptionsSection.vue +89 -0
  118. package/components/fleet/HelmOpTargetTab.vue +64 -60
  119. package/components/fleet/HelmOpValuesTab.vue +129 -105
  120. package/components/fleet/__tests__/AppCoEmptyState.test.ts +71 -0
  121. package/components/fleet/__tests__/AppCoVersionSelect.test.ts +36 -0
  122. package/components/fleet/__tests__/ClusterSelectionFields.test.ts +62 -0
  123. package/components/fleet/__tests__/FleetClusterTargets.test.ts +402 -115
  124. package/components/fleet/__tests__/FleetClusters.test.ts +12 -12
  125. package/components/fleet/__tests__/FleetSecretSelector.test.ts +16 -0
  126. package/components/fleet/__tests__/FleetValuesFrom.test.ts +44 -0
  127. package/components/fleet/__tests__/HelmOpAppCoConfigTab.test.ts +59 -0
  128. package/components/fleet/__tests__/HelmOpAppCoResourcesSection.test.ts +62 -0
  129. package/components/fleet/__tests__/HelmOpResourcesSection.test.ts +43 -0
  130. package/components/fleet/__tests__/HelmOpTargetOptionsSection.test.ts +34 -0
  131. package/components/fleet/__tests__/HelmOpValuesTab.test.ts +39 -0
  132. package/components/fleet/__tests__/__snapshots__/AppCoEmptyState.test.ts.snap +97 -0
  133. package/components/fleet/__tests__/__snapshots__/AppCoVersionSelect.test.ts.snap +30 -0
  134. package/components/fleet/__tests__/__snapshots__/ClusterSelectionFields.test.ts.snap +209 -0
  135. package/components/fleet/__tests__/__snapshots__/HelmOpTargetOptionsSection.test.ts.snap +140 -0
  136. package/components/fleet/dashboard/Empty.vue +8 -4
  137. package/components/fleet/dashboard/ResourceCard.vue +28 -0
  138. package/components/fleet/dashboard/ResourceDetails.vue +28 -0
  139. package/components/fleet/dashboard/__tests__/ResourceCard.test.ts +87 -0
  140. package/components/form/ArrayList.vue +61 -4
  141. package/components/form/KeyValue.vue +23 -2
  142. package/components/form/LabeledSelect.vue +59 -4
  143. package/components/form/Labels.vue +22 -3
  144. package/components/form/NameNsDescription.vue +24 -5
  145. package/components/form/ResourceTabs/index.vue +1 -0
  146. package/components/form/Security.vue +6 -2
  147. package/components/form/WorkloadPorts.vue +2 -7
  148. package/components/form/__tests__/NameNsDescription.test.ts +75 -0
  149. package/components/form/__tests__/Security.test.ts +76 -0
  150. package/components/formatter/Autoscaler.vue +4 -4
  151. package/components/formatter/ClusterKubeVersion.vue +27 -0
  152. package/components/formatter/ClusterLink.vue +1 -7
  153. package/components/formatter/ClusterProvider.vue +6 -10
  154. package/components/formatter/FleetSummaryGraph.vue +0 -3
  155. package/components/formatter/InternalExternalIP.vue +10 -4
  156. package/components/formatter/MachineSummaryGraph.vue +1 -1
  157. package/components/formatter/PodsUsage.vue +2 -2
  158. package/components/formatter/ServiceTargets.vue +26 -7
  159. package/components/formatter/__tests__/Autoscaler.test.ts +19 -22
  160. package/components/formatter/__tests__/FleetSummaryGraph.test.ts +216 -0
  161. package/components/formatter/__tests__/InternalExternalIP.test.ts +132 -0
  162. package/components/formatter/__tests__/PodsUsage.test.ts +6 -10
  163. package/components/formatter/__tests__/ServiceTargets.test.ts +412 -0
  164. package/components/nav/Header.vue +4 -0
  165. package/components/nav/NamespaceFilter.vue +2 -2
  166. package/components/nav/TopLevelMenu.helper.ts +15 -3
  167. package/components/nav/TopLevelMenu.vue +22 -6
  168. package/components/nav/__tests__/Header.test.ts +15 -0
  169. package/components/nav/__tests__/TopLevelMenu.test.ts +263 -21
  170. package/components/templates/default.vue +9 -4
  171. package/components/templates/home.vue +23 -0
  172. package/components/templates/plain.vue +23 -0
  173. package/components/templates/standalone.vue +17 -0
  174. package/composables/useFormValidation.ts +93 -0
  175. package/composables/useHelmOpResources.test.ts +56 -0
  176. package/composables/useHelmOpResources.ts +32 -0
  177. package/composables/useStateColor.test.ts +325 -0
  178. package/composables/useStateColor.ts +128 -0
  179. package/composables/useVeeValidateField.test.ts +159 -0
  180. package/composables/useVeeValidateField.ts +67 -0
  181. package/config/home-links.js +1 -1
  182. package/config/labels-annotations.js +1 -0
  183. package/config/pagination-table-headers.js +18 -1
  184. package/config/product/explorer.js +17 -4
  185. package/config/product/manager.js +84 -21
  186. package/config/router/index.js +16 -0
  187. package/config/router/navigation-guards/__tests__/authentication.test.ts +130 -0
  188. package/config/router/navigation-guards/authentication.js +10 -4
  189. package/config/router/routes.js +26 -6
  190. package/config/settings.ts +0 -2
  191. package/config/table-headers.js +23 -5
  192. package/config/types.js +11 -1
  193. package/core/__tests__/plugin-products.test.ts +904 -20
  194. package/core/plugin-products-base.ts +110 -10
  195. package/core/plugin-products.ts +4 -0
  196. package/core/plugin-types.ts +194 -31
  197. package/core/plugin.ts +18 -7
  198. package/core/productDebugger.js +9 -4
  199. package/core/types-provisioning.ts +77 -31
  200. package/core/types.ts +72 -22
  201. package/detail/__tests__/pod.test.ts +41 -0
  202. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +114 -0
  203. package/detail/__tests__/workload.test.ts +3 -152
  204. package/detail/catalog.cattle.io.clusterrepo.vue +1 -1
  205. package/detail/harvesterhci.io.management.cluster.vue +6 -2
  206. package/detail/pod.vue +1 -1
  207. package/detail/provisioning.cattle.io.cluster.vue +34 -14
  208. package/detail/workload/index.vue +12 -55
  209. package/edit/__tests__/catalog.cattle.io.clusterrepo.test.ts +248 -0
  210. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +105 -0
  211. package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/General.test.ts.snap +6 -0
  212. package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/index.test.ts.snap +1 -0
  213. package/edit/auth/__tests__/azuread.test.ts +247 -39
  214. package/edit/auth/__tests__/github.test.ts +234 -0
  215. package/edit/auth/__tests__/oidc.test.ts +26 -6
  216. package/edit/auth/__tests__/saml.test.ts +196 -0
  217. package/edit/auth/azuread.vue +197 -56
  218. package/edit/auth/github.vue +72 -13
  219. package/edit/auth/ldap/__tests__/index.test.ts +206 -0
  220. package/edit/auth/ldap/config.vue +8 -0
  221. package/edit/auth/ldap/index.vue +75 -1
  222. package/edit/auth/oidc.vue +119 -73
  223. package/edit/auth/saml.vue +76 -12
  224. package/edit/catalog.cattle.io.clusterrepo.vue +140 -32
  225. package/edit/fleet.cattle.io.helmop.vue +491 -136
  226. package/edit/management.cattle.io.user.vue +5 -2
  227. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +13 -4
  228. package/edit/networking.k8s.io.ingress/RulePath.vue +8 -4
  229. package/edit/networking.k8s.io.ingress/index.vue +75 -20
  230. package/edit/provisioning.cattle.io.cluster/__tests__/MachinePool.test.ts +104 -0
  231. package/edit/provisioning.cattle.io.cluster/index.vue +11 -7
  232. package/edit/provisioning.cattle.io.cluster/rke2.vue +92 -14
  233. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +22 -0
  234. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +37 -4
  235. package/edit/provisioning.cattle.io.cluster/tabs/registries/__tests__/RegistryConfigs.test.ts +132 -7
  236. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +2 -1
  237. package/edit/secret/__tests__/ssh.test.ts +5 -6
  238. package/edit/secret/basic.vue +31 -0
  239. package/edit/secret/index.vue +68 -17
  240. package/edit/secret/registry.vue +38 -0
  241. package/edit/secret/ssh.vue +29 -0
  242. package/edit/secret/tls.vue +30 -0
  243. package/edit/service.vue +4 -4
  244. package/edit/workload/Upgrading.vue +3 -3
  245. package/edit/workload/__tests__/Upgrading.test.ts +6 -9
  246. package/edit/workload/mixins/workload.js +2 -1
  247. package/list/fleet.cattle.io.bundle.vue +7 -104
  248. package/list/fleet.cattle.io.clusterregistrationtoken.vue +20 -0
  249. package/list/group.principal.vue +5 -4
  250. package/list/harvesterhci.io.management.cluster.vue +8 -9
  251. package/list/management.cattle.io.user.vue +12 -9
  252. package/list/provisioning.cattle.io.cluster.vue +268 -180
  253. package/list/utils/management.cattle.io.cluster.utils.ts +128 -0
  254. package/mixins/__tests__/auth-config.test.ts +90 -0
  255. package/mixins/__tests__/chart.test.ts +206 -0
  256. package/mixins/__tests__/resource-fetch-api-pagination.test.ts +48 -0
  257. package/mixins/auth-config.js +7 -0
  258. package/mixins/brand.js +2 -1
  259. package/mixins/chart.js +22 -9
  260. package/mixins/child-hook.js +12 -6
  261. package/mixins/create-edit-view/impl.js +5 -3
  262. package/mixins/resource-fetch-api-pagination.js +62 -6
  263. package/models/__tests__/catalog.cattle.io.clusterrepo.test.ts +57 -0
  264. package/models/__tests__/compliance.cattle.io.clusterscan.test.ts +144 -0
  265. package/models/__tests__/ext.cattle.io.kubeconfig.test.ts +67 -67
  266. package/models/__tests__/fleet-application.test.ts +175 -0
  267. package/models/__tests__/fleet.cattle.io.bundle.test.ts +169 -0
  268. package/models/__tests__/fleet.cattle.io.helmop.test.ts +84 -0
  269. package/models/__tests__/management.cattle.io.cluster.test.ts +1 -1
  270. package/models/__tests__/management.cattle.io.node.ts +28 -5
  271. package/models/__tests__/management.cattle.io.nodepool.ts +5 -4
  272. package/models/__tests__/namespace.test.ts +36 -0
  273. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +81 -11
  274. package/models/__tests__/workload.test.ts +401 -26
  275. package/models/base-cluster.x-k8s.io.js +26 -0
  276. package/models/catalog.cattle.io.clusterrepo.js +28 -4
  277. package/models/cluster.js +1 -1
  278. package/models/cluster.x-k8s.io.machine.js +4 -22
  279. package/models/cluster.x-k8s.io.machinedeployment.js +2 -20
  280. package/models/cluster.x-k8s.io.machineset.js +2 -20
  281. package/models/compliance.cattle.io.clusterscan.js +165 -2
  282. package/models/ext.cattle.io.kubeconfig.ts +4 -7
  283. package/models/fleet-application.js +7 -1
  284. package/models/fleet.cattle.io.helmop.js +20 -1
  285. package/models/management.cattle.io.cluster.js +434 -41
  286. package/models/management.cattle.io.node.js +50 -7
  287. package/models/management.cattle.io.nodepool.js +1 -1
  288. package/models/namespace.js +1 -1
  289. package/models/networking.k8s.io.ingress.js +12 -4
  290. package/models/pod.js +33 -1
  291. package/models/provisioning.cattle.io.cluster.js +51 -334
  292. package/models/rke.cattle.io.etcdsnapshot.js +1 -2
  293. package/models/workload.js +108 -13
  294. package/models/workload.service.js +5 -0
  295. package/package.json +22 -39
  296. package/pages/__tests__/readme.test.ts +49 -0
  297. package/pages/about.vue +5 -6
  298. package/pages/auth/login.vue +0 -35
  299. package/pages/auth/setup.vue +13 -3
  300. package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +2 -2
  301. package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +10 -1
  302. package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +76 -0
  303. package/pages/c/_cluster/apps/charts/__tests__/index.test.ts +93 -0
  304. package/pages/c/_cluster/apps/charts/chart.vue +62 -9
  305. package/pages/c/_cluster/apps/charts/index.vue +48 -10
  306. package/pages/c/_cluster/apps/charts/install.vue +122 -113
  307. package/pages/c/_cluster/auth/roles/index.vue +5 -4
  308. package/pages/c/_cluster/explorer/__tests__/index.test.ts +23 -25
  309. package/pages/c/_cluster/explorer/index.vue +5 -49
  310. package/pages/c/_cluster/explorer/workload-dashboard/ByNamespaceSection.vue +31 -0
  311. package/pages/c/_cluster/explorer/workload-dashboard/ByStateSection.vue +138 -0
  312. package/pages/c/_cluster/explorer/workload-dashboard/ByTypeSection.vue +30 -0
  313. package/pages/c/_cluster/explorer/workload-dashboard/WorkloadCard.vue +155 -0
  314. package/pages/c/_cluster/explorer/workload-dashboard/WorkloadNamespaceCard.vue +142 -0
  315. package/pages/c/_cluster/explorer/workload-dashboard/WorkloadTypeCard.vue +159 -0
  316. package/pages/c/_cluster/explorer/workload-dashboard/__tests__/composable.test.ts +561 -0
  317. package/pages/c/_cluster/explorer/workload-dashboard/composable.ts +440 -0
  318. package/pages/c/_cluster/explorer/workload-dashboard/index.vue +187 -0
  319. package/pages/c/_cluster/explorer/workload-dashboard/types.ts +80 -0
  320. package/pages/c/_cluster/fleet/application/create.vue +187 -136
  321. package/pages/c/_cluster/fleet/application/index.vue +5 -3
  322. package/pages/c/_cluster/fleet/application/suse-app-collection/ChartDetailBody.vue +338 -0
  323. package/pages/c/_cluster/fleet/application/suse-app-collection/ChartDetailHeader.vue +121 -0
  324. package/pages/c/_cluster/fleet/application/suse-app-collection/chart.vue +369 -0
  325. package/pages/c/_cluster/fleet/application/suse-app-collection/charts.vue +248 -0
  326. package/pages/c/_cluster/fleet/application/suse-app-collection/credentials.vue +310 -0
  327. package/pages/c/_cluster/fleet/index.vue +2 -2
  328. package/pages/c/_cluster/istio/__tests__/istio.index.test.ts +194 -0
  329. package/pages/c/_cluster/istio/index.vue +21 -6
  330. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +1 -0
  331. package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +815 -2
  332. package/pages/c/_cluster/uiplugins/index.vue +218 -197
  333. package/pages/diagnostic.vue +13 -17
  334. package/pages/fail-whale.vue +30 -7
  335. package/pages/home.vue +93 -306
  336. package/pages/readme.vue +88 -0
  337. package/plugins/clean-html.d.ts +9 -0
  338. package/plugins/dashboard-store/__tests__/resource-class.test.ts +181 -0
  339. package/plugins/dashboard-store/actions.js +40 -18
  340. package/plugins/dashboard-store/resource-class.js +67 -9
  341. package/plugins/steve/__tests__/actions.test.ts +212 -0
  342. package/plugins/steve/__tests__/subscribe.spec.ts +6 -3
  343. package/plugins/steve/actions.js +96 -0
  344. package/plugins/steve/steve-pagination-utils.ts +12 -4
  345. package/plugins/steve/subscribe.js +35 -5
  346. package/rancher-components/Accordion/Accordion.vue +53 -9
  347. package/rancher-components/Form/Checkbox/Checkbox.vue +14 -0
  348. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +10 -4
  349. package/rancher-components/Form/LabeledInput/LabeledInput.vue +7 -52
  350. package/rancher-components/Form/Radio/RadioButton.vue +17 -1
  351. package/rancher-components/Form/Radio/RadioGroup.vue +10 -0
  352. package/rancher-components/Pill/RcTag/RcTag.vue +3 -2
  353. package/rancher-components/RcButton/RcButton.test.ts +140 -1
  354. package/rancher-components/RcButton/RcButton.vue +126 -17
  355. package/rancher-components/RcButton/types.ts +3 -0
  356. package/rancher-components/RcDropdown/RcDropdownTrigger.vue +10 -8
  357. package/rancher-components/RcItemCard/RcItemCard.test.ts +18 -0
  358. package/rancher-components/RcItemCard/RcItemCard.vue +2 -2
  359. package/rancher-components/RcSection/RcSection.vue +28 -3
  360. package/scripts/extension/helm/package/Dockerfile +1 -1
  361. package/scripts/test-plugins-build.sh +2 -1
  362. package/store/__tests__/catalog.test.ts +115 -1
  363. package/store/__tests__/notifications.test.ts +434 -0
  364. package/store/__tests__/type-map.test.ts +556 -1
  365. package/store/action-menu.js +8 -3
  366. package/store/auth.js +1 -1
  367. package/store/aws.js +27 -16
  368. package/store/catalog.js +84 -3
  369. package/store/digitalocean.js +20 -38
  370. package/store/index.js +2 -0
  371. package/store/linode.js +25 -40
  372. package/store/plugins.js +7 -4
  373. package/store/pnap.js +1 -0
  374. package/store/type-map.js +111 -29
  375. package/tsconfig.paths.json +8 -8
  376. package/types/components/buttonGroup.ts +5 -0
  377. package/types/kube/kube-api.ts +14 -1
  378. package/types/rancher/steve.api.ts +12 -12
  379. package/types/resources/settings.d.ts +2 -1
  380. package/types/shell/index.d.ts +206 -72
  381. package/types/store/dashboard-store.types.ts +108 -11
  382. package/types/store/pagination.types.ts +6 -3
  383. package/utils/__tests__/alertmanagerconfig.test.ts +117 -0
  384. package/utils/__tests__/async.test.ts +87 -0
  385. package/utils/__tests__/auth.test.ts +273 -0
  386. package/utils/__tests__/aws.test.ts +140 -0
  387. package/utils/__tests__/banners.test.ts +176 -0
  388. package/utils/__tests__/chart.test.ts +64 -1
  389. package/utils/__tests__/color.test.ts +226 -0
  390. package/utils/__tests__/computed.test.ts +193 -0
  391. package/utils/__tests__/cspAdaptor.test.ts +163 -0
  392. package/utils/__tests__/dom.test.ts +81 -0
  393. package/utils/__tests__/duration.test.ts +176 -0
  394. package/utils/__tests__/dynamic-importer.test.ts +102 -0
  395. package/utils/__tests__/fleet-appco.test.ts +312 -0
  396. package/utils/__tests__/fleet.test.ts +340 -0
  397. package/utils/__tests__/ingress.test.ts +553 -0
  398. package/utils/__tests__/kube.test.ts +68 -0
  399. package/utils/__tests__/monitoring.test.ts +130 -0
  400. package/utils/__tests__/namespace-filter.test.ts +109 -0
  401. package/utils/__tests__/object.test.ts +22 -0
  402. package/utils/__tests__/pagination-utils.test.ts +361 -0
  403. package/utils/__tests__/parse-externalid.test.ts +137 -0
  404. package/utils/__tests__/perf-setting.utils.test.ts +98 -0
  405. package/utils/__tests__/platform.test.ts +91 -0
  406. package/utils/__tests__/poller-sequential.test.ts +177 -0
  407. package/utils/__tests__/poller.test.ts +170 -0
  408. package/utils/__tests__/position.test.ts +237 -0
  409. package/utils/__tests__/promise.test.ts +346 -0
  410. package/utils/__tests__/provider.test.ts +51 -1
  411. package/utils/__tests__/queue.test.ts +232 -0
  412. package/utils/__tests__/release-notes.test.ts +221 -0
  413. package/utils/__tests__/router.test.js +254 -1
  414. package/utils/__tests__/select.test.ts +208 -0
  415. package/utils/__tests__/settings.test.ts +140 -0
  416. package/utils/__tests__/sort-utils.test.ts +301 -0
  417. package/utils/__tests__/string-utils.test.ts +798 -0
  418. package/utils/__tests__/string.test.ts +23 -1
  419. package/utils/__tests__/style.test.ts +154 -0
  420. package/utils/__tests__/svg-filter.test.ts +184 -0
  421. package/utils/__tests__/time.test.ts +265 -1
  422. package/utils/__tests__/title.test.ts +47 -0
  423. package/utils/__tests__/units.test.ts +417 -0
  424. package/utils/__tests__/versions.test.ts +128 -0
  425. package/utils/__tests__/width.test.ts +53 -0
  426. package/utils/__tests__/window.test.ts +158 -0
  427. package/utils/__tests__/xccdf.test.ts +511 -0
  428. package/utils/chart.js +36 -0
  429. package/utils/crypto/__tests__/browserHashUtils.test.ts +98 -0
  430. package/utils/crypto/__tests__/index.test.ts +144 -0
  431. package/utils/duration.ts +104 -0
  432. package/utils/dynamic-content/__tests__/notification-handler.test.ts +196 -0
  433. package/utils/dynamic-content/info.ts +2 -1
  434. package/utils/error.js +13 -0
  435. package/utils/fleet-appco.ts +323 -0
  436. package/utils/fleet.ts +13 -3
  437. package/utils/gatekeeper/__tests__/util.test.ts +174 -0
  438. package/utils/gc/__tests__/gc-interval.test.ts +119 -0
  439. package/utils/gc/__tests__/gc-root-store.test.ts +225 -0
  440. package/utils/gc/__tests__/gc-route-changed.test.ts +96 -0
  441. package/utils/gc/__tests__/gc.test.ts +487 -0
  442. package/utils/ingress.ts +9 -1
  443. package/utils/object.js +22 -2
  444. package/utils/pagination-utils.ts +2 -1
  445. package/utils/provider.ts +12 -0
  446. package/utils/string.js +25 -2
  447. package/utils/uiplugins.ts +5 -5
  448. package/utils/validators/__tests__/cluster-name.test.ts +110 -0
  449. package/utils/validators/__tests__/container-images.test.ts +104 -0
  450. package/utils/validators/__tests__/cron-schedule.test.ts +79 -0
  451. package/utils/validators/__tests__/flow-output.test.ts +91 -0
  452. package/utils/validators/__tests__/index.test.ts +481 -0
  453. package/utils/validators/__tests__/kubernetes-name.test.ts +163 -0
  454. package/utils/validators/__tests__/logging-outputs.test.ts +58 -0
  455. package/utils/validators/__tests__/misc-validators.test.ts +246 -0
  456. package/utils/validators/__tests__/monitoring-route.test.ts +119 -0
  457. package/utils/validators/__tests__/pod-affinity.test.ts +382 -0
  458. package/utils/validators/__tests__/prometheusrule.test.ts +211 -0
  459. package/utils/validators/__tests__/role-template.test.ts +149 -0
  460. package/utils/validators/__tests__/service.test.ts +283 -0
  461. package/utils/validators/__tests__/setting.test.js +32 -0
  462. package/utils/validators/formRules/__tests__/index.test.ts +50 -0
  463. package/utils/validators/formRules/index.ts +5 -5
  464. package/utils/validators/machine-pool.ts +1 -1
  465. package/utils/validators/setting.js +18 -3
  466. package/utils/xccdf.ts +415 -0
  467. package/vue.config.js +1 -1
  468. package/assets/fonts/lato/lato-v17-latin-700.woff +0 -0
  469. package/assets/fonts/lato/lato-v17-latin-700.woff2 +0 -0
  470. package/assets/fonts/lato/lato-v17-latin-regular.woff +0 -0
  471. package/assets/fonts/lato/lato-v17-latin-regular.woff2 +0 -0
  472. package/pages/support/index.vue +0 -264
  473. package/utils/duration.js +0 -43
@@ -41,7 +41,11 @@ export type ClusterDetailTabs = {
41
41
  /**
42
42
  * Kube conditions of the provisioning.cattle.io.cluster instance
43
43
  */
44
- conditions: boolean
44
+ conditions: boolean,
45
+ /**
46
+ * RKE2 autoscaler
47
+ */
48
+ autoscaler: boolean
45
49
  };
46
50
 
47
51
  /**
@@ -86,6 +90,48 @@ export interface ClusterProvisionerContext {
86
90
  isView: boolean
87
91
  }
88
92
 
93
+ /**
94
+ * Existing tabs to show or hide in the cluster's detail view
95
+ */
96
+ export interface ClusterProvisionerDetailTabs {
97
+ /**
98
+ * CAPI machine pool tab
99
+ */
100
+ machines: boolean,
101
+ /**
102
+ * Mgmt node pool tab
103
+ */
104
+ nodes?: boolean,
105
+ /**
106
+ * RKE2 provisioning logs
107
+ */
108
+ logs: boolean,
109
+ /**
110
+ * RKE2 registration commands
111
+ */
112
+ registration: boolean,
113
+ /**
114
+ * RKE2 snapshots
115
+ */
116
+ snapshots: boolean,
117
+ /**
118
+ * Kube resources related to the instance of provisioning.cattle.io.cluster
119
+ */
120
+ related: boolean,
121
+ /**
122
+ * Kube events associated with the instance of provisioning.cattle.io.cluster
123
+ */
124
+ events: boolean,
125
+ /**
126
+ * Kube conditions of the provisioning.cattle.io.cluster instance
127
+ */
128
+ conditions: boolean,
129
+ /**
130
+ * RKE2 autoscaler
131
+ */
132
+ autoscaler?: boolean,
133
+ }
134
+
89
135
  /**
90
136
  * Interface that a custom Cluster Provisioner should implement
91
137
  *
@@ -180,36 +226,7 @@ export interface IClusterProvisioner {
180
226
  *
181
227
  * `plugin.addTab(TabLocation.RESOURCE_DETAIL... ` can be used to add additional tabs to the same view
182
228
  */
183
- detailTabs: {
184
- /**
185
- * RKE2 machine pool tabs
186
- */
187
- machines: boolean,
188
- /**
189
- * RKE2 provisioning logs
190
- */
191
- logs: boolean,
192
- /**
193
- * RKE2 registration commands
194
- */
195
- registration: boolean,
196
- /**
197
- * RKE2 snapshots
198
- */
199
- snapshots: boolean,
200
- /**
201
- * Kube resources related to the instance of provisioning.cattle.io.cluster
202
- */
203
- related: boolean,
204
- /**
205
- * Kube events associated with the instance of provisioning.cattle.io.cluster
206
- */
207
- events: boolean,
208
- /**
209
- * Kube conditions of the provisioning.cattle.io.cluster instance
210
- */
211
- conditions: boolean
212
- };
229
+ detailTabs: ClusterProvisionerDetailTabs;
213
230
 
214
231
  /* --------------------------------------------------------------------------------------
215
232
  * Getters / Functions for Managing Machine Configs
@@ -225,6 +242,16 @@ export interface IClusterProvisioner {
225
242
  */
226
243
  machineConfigSchema?: { [key: string]: any };
227
244
 
245
+ /**
246
+ * Schema for infrastructure cluster object. For example infrastructure.cluster.x-k8s.io.awscluster
247
+ *
248
+ * The `id` should be in the format of `infrastructure.cluster.x-k8s.io.${ provider id }cluster`
249
+ *
250
+ * The `attributes: { kind: <value> }` should match the last part of the id
251
+ * The `attributes: { group: <value> }` should match the remaining parts of the id
252
+ */
253
+ infrastructureClusterSchema?: { [key: string]: any };
254
+
228
255
  /**
229
256
  * Override the default method to create a machine config object that will be inserted into a new machine pool
230
257
  *
@@ -257,6 +284,16 @@ export interface IClusterProvisioner {
257
284
  */
258
285
  saveMachinePoolConfigs?(pools: any[], cluster: any): Promise<any>
259
286
 
287
+ /**
288
+ * Optional custom UI section for infrastructure-cluster-specific configuration.
289
+ */
290
+ extensionInfrastructureSection?: any
291
+
292
+ /**
293
+ * Indicates the provisioner manages upstream CAPI infrastructure resources directly.
294
+ */
295
+ isUpstreamCAPIProvider?: boolean
296
+
260
297
  /* --------------------------------------------------------------------------------------
261
298
  * Optionally override parts of the cluster save process with
262
299
  * - hooks that run before or after the cluster resource is saved
@@ -276,6 +313,15 @@ export interface IClusterProvisioner {
276
313
  */
277
314
  registerSaveHooks?(registerBeforeHook: RegisterClusterSaveHook, registerAfterHook: RegisterClusterSaveHook, cluster: any): void;
278
315
 
316
+ /**
317
+ * Register hooks that run during `initSpecs` while initializing the cluster form.
318
+ *
319
+ * @param registerInitHook
320
+ * Call `registerInitHook` with a function. The function will be executed during form initialization.
321
+ * @param cluster The cluster (`provisioning.cattle.io.cluster`)
322
+ */
323
+ registerInitHooks?(registerInitHook: RegisterClusterSaveHook, cluster: any): void;
324
+
279
325
  /**
280
326
  * Optionally override the save of the cluster resource itself
281
327
  *
package/core/types.ts CHANGED
@@ -4,8 +4,9 @@ import type { ExtensionManager } from '@shell/types/extension-manager';
4
4
  import { PaginationSettingsStores } from '@shell/types/resources/settings';
5
5
  import type {
6
6
  ProductMetadata, ProductSinglePage,
7
- StandardProductName, RouteRecordRawWithParams, ProductChildGroup,
8
- ProductChildPage, ProductChild
7
+ StandardProductName, RouteRecordRawWithParams, ProductChild,
8
+ ProductChildGroup,
9
+ ProductChildPage
9
10
  } from './plugin-types';
10
11
 
11
12
  // Cluster Provisioning types
@@ -290,6 +291,11 @@ export interface ProductOptions {
290
291
  */
291
292
  to?: PluginRouteRecordRaw;
292
293
 
294
+ /**
295
+ * Whether the product can be removed by users (default: false — products are built-in/not removable unless explicitly set to true)
296
+ */
297
+ removable?: boolean;
298
+
293
299
  /**
294
300
  * Alternative to the icon property. Uses require
295
301
  */
@@ -300,6 +306,11 @@ export interface ProductOptions {
300
306
  */
301
307
  name?: string;
302
308
 
309
+ /**
310
+ * controls whether a workspace switcher dropdown appears in the header (instead of the namespace filter) if set to true
311
+ */
312
+ showWorkspaceSwitcher?: boolean;
313
+
303
314
  /**
304
315
  *
305
316
  */
@@ -316,8 +327,6 @@ export interface ProductOptions {
316
327
  * Leaving these here for completeness but I don't think these should be advertised as useable to plugin creators.
317
328
  */
318
329
  // ifHaveVerb: string | RegExp;
319
- // removable: string;
320
- // showWorkspaceSwitcher: boolean;
321
330
  // supportRoute: string;
322
331
  // typeStoreMap: string;
323
332
  }
@@ -552,7 +561,7 @@ export interface DSLReturnType {
552
561
  * @param headers {@link HeaderOptions[]}
553
562
  * @returns {@link void}
554
563
  */
555
- headers: (type: string, headers: HeaderOptions[]) => void;
564
+ headers: (type: string, headers?: HeaderOptions[], paginationHeaders?: PaginationHeaderOptions[]) => void;
556
565
 
557
566
  /**
558
567
  * Create and register a new product
@@ -562,12 +571,30 @@ export interface DSLReturnType {
562
571
  product: (options: ProductOptions) => void;
563
572
 
564
573
  /**
565
- * Create and label a group. The group will show up in navigation
566
- * @param groupNane Name of the group
567
- * @param label Label in navigation
574
+ /**
575
+ * Remap group display names in the side-menu navigation.
576
+ *
577
+ * Each entry matches a group's internal ID (via string or regex) and replaces its display label
578
+ * with a new name. This only changes how the group is labelled in the UI — it does not move
579
+ * resources between groups.
580
+ *
581
+ * @param match String, string for a regex or a regex object to match against group names
582
+ * @param replace Replacement string or function for the display name
583
+ * @param weight Priority for applying this mapping (higher numbers applied first, default 5)
584
+ * @param continueOnMatch If true, continue matching other rules after this one matches
585
+ * @returns {@link void}
586
+ */
587
+ mapGroup: (match: string | RegExp, replace: string | Function, weight?: number, continueOnMatch?: boolean) => void;
588
+
589
+ /**
590
+ * Remap a type ID to a display name
591
+ * @param match String, string for a regex or a regex object to match against type IDs
592
+ * @param replace Replacement string or function for the display name
593
+ * @param weight Priority for applying this mapping (higher numbers applied first, default 5)
594
+ * @param continueOnMatch If true, continue matching other rules after this one matches
568
595
  * @returns {@link void}
569
596
  */
570
- mapGroup: (groupName: string, label: string) => void;
597
+ mapType: (match: string | RegExp, replace: string | Function, weight?: number, continueOnMatch?: boolean) => void;
571
598
 
572
599
  /**
573
600
  * Create and configure a myriad of options for a type
@@ -595,18 +622,36 @@ export interface DSLReturnType {
595
622
  weightType: (input: string, weight: number, forBasic: boolean) => void;
596
623
 
597
624
  /**
598
- * Leaving these here for completeness but I don't think these should be advertised as useable to plugin creators.
625
+ * Never show the specified type in the navigation
626
+ * @param regexOrString String, string for a regex or a regex object to match against type names
627
+ * @returns {@link void}
599
628
  */
600
- // componentForType: (type: string, replacementType: string)
601
- // groupBy: (type: string, field: string)
602
- // hideBulkActions: (type: string, field)
603
- // ignoreGroup: (regexOrString)
604
- // ignoreType: (regexOrString)
605
- //
606
- // mapType: (match, replace)
607
- // moveType: (match, group)
608
- // setGroupDefaultType: (input, defaultType)
609
- // spoofedType: (obj)
629
+ ignoreType: (regexOrString: string | RegExp) => void;
630
+
631
+ /**
632
+ * Never show the specified group or any types in it
633
+ * @param regexOrString String, string for a regex or a regex object to match against group names
634
+ * @param fn Conditional function that accepts getters and returns true if the group should be ignored
635
+ * @returns {@link void}
636
+ */
637
+ ignoreGroup: (regexOrString: string | RegExp, fn?: (getters: any) => boolean) => void;
638
+
639
+ /**
640
+ * Move a resource type into a different navigation group
641
+ * @param match String or regex to match against resource type names
642
+ * @param group Target group name to move the matched types into
643
+ * @param weight Ordering weight for the mapping (default: 5)
644
+ * @returns {@link void}
645
+ */
646
+ moveType: (match: string | RegExp, group: string, weight?: number) => void;
647
+
648
+ /**
649
+ * Control visibility of bulk actions (e.g. delete) in the list view toolbar for a specific resource type
650
+ * @param type The resource type to configure
651
+ * @param hide Whether to hide bulk actions. Set to `true` to hide them
652
+ * @returns {@link void}
653
+ */
654
+ hideBulkActions: (type: string, hide: boolean) => void;
610
655
 
611
656
  labelGroup: (group: string, label: string | undefined, labelKey?: string) => void;
612
657
 
@@ -657,14 +702,19 @@ export interface IExtension {
657
702
  * @internal - DO NOT USE - Internal API only
658
703
  */
659
704
  _registerTopLevelProduct(): void;
705
+ /**
706
+ *
707
+ * @internal - DO NOT USE - Internal API only
708
+ */
709
+ _setStartRouteWithProduct(value: boolean): void;
660
710
 
661
711
  /**
662
712
  * Add a product to the sidebar, with children and a side menu for navigation for internal pages
663
713
  * @param name
664
714
  * @param config
665
715
  */
666
- addProduct(product: ProductMetadata, config: ProductChildGroup[]): void;
667
716
  addProduct(product: ProductMetadata, config: ProductChildPage[]): void;
717
+ addProduct(product: ProductMetadata, config: ProductChildGroup[]): void;
668
718
  addProduct(product: ProductMetadata, config: ProductChild[]): void;
669
719
 
670
720
  /**
@@ -694,8 +744,8 @@ export interface IExtension {
694
744
  * @param product Product to be extended
695
745
  * @param config Product extension configuration
696
746
  */
697
- extendProduct(product: StandardProductName | string, config: ProductChildGroup[]): void;
698
747
  extendProduct(product: StandardProductName | string, config: ProductChildPage[]): void;
748
+ extendProduct(product: StandardProductName | string, config: ProductChildGroup[]): void;
699
749
  extendProduct(product: StandardProductName | string, config: ProductChild[]): void;
700
750
 
701
751
  /**
@@ -0,0 +1,41 @@
1
+ import podDetail from '@shell/detail/pod.vue';
2
+
3
+ const { containers } = podDetail.computed;
4
+
5
+ describe('view: pod', () => {
6
+ it('should not use 2x icon sizing in init container column', () => {
7
+ const initContainer = { name: 'init', image: 'init:latest' };
8
+ const appContainer = { name: 'app', image: 'app:latest' };
9
+
10
+ const rows = containers.call({
11
+ allContainers: [appContainer, initContainer],
12
+ allStatuses: [{
13
+ name: 'app',
14
+ ready: true,
15
+ state: {},
16
+ lastState: {}
17
+ }, {
18
+ name: 'init',
19
+ ready: false,
20
+ state: {},
21
+ lastState: {}
22
+ }],
23
+ dateTimeFormat: () => '',
24
+ t: () => '',
25
+ value: {
26
+ containerActions: [],
27
+ containerIsInit: (container: { name: string }) => container.name === 'init',
28
+ containerStateColor: () => 'text-success',
29
+ containerStateDisplay: () => 'running',
30
+ openLogs: jest.fn(),
31
+ openShell: jest.fn(),
32
+ },
33
+ });
34
+
35
+ const initRow = rows.find((row: { name: string }) => row.name === 'init');
36
+ const appRow = rows.find((row: { name: string }) => row.name === 'app');
37
+
38
+ expect(initRow.initIcon).toBe('icon-checkmark text-success ml-5');
39
+ expect(appRow.initIcon).toBe('icon-minus text-muted ml-5');
40
+ });
41
+ });
@@ -127,4 +127,118 @@ describe('view: provisioning.cattle.io.cluster', () => {
127
127
  expect(wrapper.vm.showRegistration).toStrictEqual(false);
128
128
  });
129
129
  });
130
+
131
+ describe('fakeMachines', () => {
132
+ const clusterName = 'my-cluster';
133
+ const poolName = 'pool1';
134
+ const namespace = 'fleet-default';
135
+ const poolFullName = `${ clusterName }-${ poolName }`;
136
+
137
+ const wrongTemplate = { metadata: { name: `${ poolFullName }-aaaa1111`, namespace } };
138
+ const correctTemplate = { metadata: { name: `${ poolFullName }-bbbb2222`, namespace } };
139
+
140
+ const baseValue = {
141
+ name: clusterName,
142
+ nameDisplay: clusterName,
143
+ namespace,
144
+ machines: [],
145
+ spec: {
146
+ rkeConfig: {
147
+ machinePools: [
148
+ {
149
+ name: poolName,
150
+ machineConfigRef: { name: `nc-${ poolFullName }-xyz`, kind: 'Amazonec2Config' },
151
+ },
152
+ ],
153
+ },
154
+ },
155
+ };
156
+
157
+ it('uses MachineDeployment infrastructureRef to select the correct template for an empty pool', async() => {
158
+ const machineDeployment = {
159
+ metadata: { name: poolFullName, namespace },
160
+ spec: { template: { spec: { infrastructureRef: { name: correctTemplate.metadata.name } } } },
161
+ };
162
+
163
+ const wrapper = shallowMount(ProvisioningCattleIoCluster, {
164
+ props: { value: baseValue },
165
+ global: { mocks },
166
+ });
167
+
168
+ await wrapper.setData({
169
+ allMachineDeployments: [machineDeployment],
170
+ machineTemplates: [wrongTemplate, correctTemplate],
171
+ });
172
+
173
+ const [fakeMachine] = wrapper.vm.fakeMachines;
174
+
175
+ expect(fakeMachine.pool._template).toStrictEqual(correctTemplate);
176
+ });
177
+
178
+ it('returns the first prefix-matching template when no MachineDeployment exists for the pool', async() => {
179
+ const wrapper = shallowMount(ProvisioningCattleIoCluster, {
180
+ props: { value: baseValue },
181
+ global: { mocks },
182
+ });
183
+
184
+ await wrapper.setData({
185
+ allMachineDeployments: [],
186
+ machineTemplates: [wrongTemplate, correctTemplate],
187
+ });
188
+
189
+ const [fakeMachine] = wrapper.vm.fakeMachines;
190
+
191
+ expect(fakeMachine.pool._template).toStrictEqual(wrongTemplate);
192
+ });
193
+
194
+ it('returns undefined template when MachineDeployment infrastructureRef does not match any template', async() => {
195
+ const machineDeployment = {
196
+ metadata: { name: poolFullName, namespace },
197
+ spec: { template: { spec: { infrastructureRef: { name: `${ poolFullName }-nonexistent` } } } },
198
+ };
199
+
200
+ const wrapper = shallowMount(ProvisioningCattleIoCluster, {
201
+ props: { value: baseValue },
202
+ global: { mocks },
203
+ });
204
+
205
+ await wrapper.setData({
206
+ allMachineDeployments: [machineDeployment],
207
+ machineTemplates: [wrongTemplate, correctTemplate],
208
+ });
209
+
210
+ const [fakeMachine] = wrapper.vm.fakeMachines;
211
+
212
+ expect(fakeMachine.pool._template).toBeUndefined();
213
+ });
214
+
215
+ it('does not include a pool in fakeMachines when it has active machines', async() => {
216
+ const valueWithMachines = {
217
+ ...baseValue,
218
+ machines: [
219
+ {
220
+ metadata: {
221
+ labels: {
222
+ 'cluster.x-k8s.io/cluster-name': clusterName,
223
+ 'rke.cattle.io/rke-machine-pool-name': poolName,
224
+ },
225
+ },
226
+ spec: { infrastructureRef: { apiGroup: 'rke-machine.cattle.io', name: `${ poolFullName }-bbbb2222` } },
227
+ },
228
+ ],
229
+ };
230
+
231
+ const wrapper = shallowMount(ProvisioningCattleIoCluster, {
232
+ props: { value: valueWithMachines },
233
+ global: { mocks },
234
+ });
235
+
236
+ await wrapper.setData({
237
+ allMachineDeployments: [],
238
+ machineTemplates: [wrongTemplate, correctTemplate],
239
+ });
240
+
241
+ expect(wrapper.vm.fakeMachines).toHaveLength(0);
242
+ });
243
+ });
130
244
  });
@@ -1,156 +1,7 @@
1
1
  import Workload from '@shell/detail/workload/index.vue';
2
2
 
3
- const { findMatchingIngresses } = Workload.methods;
4
-
5
- describe('findMatchingIngresses', () => {
6
- it('should do nothing if ingress schema is not present', () => {
7
- const mockThis = {
8
- ingressSchema: undefined,
9
- matchingIngresses: [],
10
- };
11
-
12
- findMatchingIngresses.call(mockThis);
13
- expect(mockThis.matchingIngresses).toStrictEqual([]);
14
- });
15
-
16
- it('should not find any ingresses if there are none', () => {
17
- const mockThis = {
18
- ingressSchema: true,
19
- allIngresses: [],
20
- matchingIngresses: [],
21
- value: { metadata: { namespace: 'test' }, relatedServices: [] }
22
- };
23
-
24
- findMatchingIngresses.call(mockThis);
25
- expect(mockThis.matchingIngresses).toStrictEqual([]);
26
- });
27
-
28
- it('should find matching ingresses', () => {
29
- const mockThis = {
30
- ingressSchema: true,
31
- allIngresses: [
32
- { // matching
33
- metadata: { namespace: 'test' },
34
- spec: { rules: [{ http: { paths: [{ backend: { service: { name: 'service1' } } }] } }] }
35
- }
36
- ],
37
- matchingIngresses: [],
38
- value: { metadata: { namespace: 'test' }, relatedServices: [{ metadata: { name: 'service1' } }] }
39
- };
40
-
41
- findMatchingIngresses.call(mockThis);
42
- expect(mockThis.matchingIngresses).toHaveLength(1);
43
- expect(mockThis.matchingIngresses[0]).toStrictEqual(mockThis.allIngresses[0]);
44
- });
45
-
46
- it('should not match ingresses from other namespaces', () => {
47
- const mockThis = {
48
- ingressSchema: true,
49
- allIngresses: [
50
- { // not matching
51
- metadata: { namespace: 'other' },
52
- spec: { rules: [{ http: { paths: [{ backend: { service: { name: 'service1' } } }] } }] }
53
- }
54
- ],
55
- matchingIngresses: [],
56
- value: { metadata: { namespace: 'test' }, relatedServices: [{ metadata: { name: 'service1' } }] }
57
- };
58
-
59
- findMatchingIngresses.call(mockThis);
60
- expect(mockThis.matchingIngresses).toHaveLength(0);
61
- });
62
-
63
- it('should not match ingresses pointing to other services', () => {
64
- const mockThis = {
65
- ingressSchema: true,
66
- allIngresses: [
67
- { // not matching
68
- metadata: { namespace: 'test' },
69
- spec: { rules: [{ http: { paths: [{ backend: { service: { name: 'service2' } } }] } }] }
70
- }
71
- ],
72
- matchingIngresses: [],
73
- value: { metadata: { namespace: 'test' }, relatedServices: [{ metadata: { name: 'service1' } }] }
74
- };
75
-
76
- findMatchingIngresses.call(mockThis);
77
- expect(mockThis.matchingIngresses).toHaveLength(0);
78
- });
79
-
80
- it('should handle ingresses with no rules', () => {
81
- const mockThis = {
82
- ingressSchema: true,
83
- allIngresses: [
84
- {
85
- metadata: { namespace: 'test' },
86
- spec: { }
87
- }
88
- ],
89
- matchingIngresses: [],
90
- value: { metadata: { namespace: 'test' }, relatedServices: [{ metadata: { name: 'service1' } }] }
91
- };
92
-
93
- findMatchingIngresses.call(mockThis);
94
- expect(mockThis.matchingIngresses).toHaveLength(0);
95
- });
96
-
97
- it('should handle ingress rules with no paths', () => {
98
- const mockThis = {
99
- ingressSchema: true,
100
- allIngresses: [
101
- {
102
- metadata: { namespace: 'test' },
103
- spec: { rules: [{ http: {} }] }
104
- }
105
- ],
106
- matchingIngresses: [],
107
- value: { metadata: { namespace: 'test' }, relatedServices: [{ metadata: { name: 'service1' } }] }
108
- };
109
-
110
- findMatchingIngresses.call(mockThis);
111
- expect(mockThis.matchingIngresses).toHaveLength(0);
112
- });
113
-
114
- it('should handle ingress paths with no backend service', () => {
115
- const mockThis = {
116
- ingressSchema: true,
117
- allIngresses: [
118
- {
119
- metadata: { namespace: 'test' },
120
- spec: { rules: [{ http: { paths: [{ backend: {} }] } }] }
121
- }
122
- ],
123
- matchingIngresses: [],
124
- value: { metadata: { namespace: 'test' }, relatedServices: [{ metadata: { name: 'service1' } }] }
125
- };
126
-
127
- findMatchingIngresses.call(mockThis);
128
- expect(mockThis.matchingIngresses).toHaveLength(0);
129
- });
130
-
131
- it('should find one of many ingresses', () => {
132
- const mockThis = {
133
- ingressSchema: true,
134
- allIngresses: [
135
- { // not matching
136
- metadata: { namespace: 'other' },
137
- spec: { rules: [{ http: { paths: [{ backend: { service: { name: 'service1' } } }] } }] }
138
- },
139
- { // matching
140
- metadata: { namespace: 'test' },
141
- spec: { rules: [{ http: { paths: [{ backend: { service: { name: 'service1' } } }] } }] }
142
- },
143
- { // not matching
144
- metadata: { namespace: 'test' },
145
- spec: { rules: [{ http: { paths: [{ backend: { service: { name: 'service2' } } }] } }] }
146
- }
147
- ],
148
- matchingIngresses: [],
149
- value: { metadata: { namespace: 'test' }, relatedServices: [{ metadata: { name: 'service1' } }] }
150
- };
151
-
152
- findMatchingIngresses.call(mockThis);
153
- expect(mockThis.matchingIngresses).toHaveLength(1);
154
- expect(mockThis.matchingIngresses[0]).toStrictEqual(mockThis.allIngresses[1]);
3
+ describe('workload detail page', () => {
4
+ it('should not have findMatchingIngresses method (logic moved to workload model)', () => {
5
+ expect(Workload.methods?.findMatchingIngresses).toBeUndefined();
155
6
  });
156
7
  });
@@ -29,7 +29,7 @@ export default {
29
29
  class="span-3"
30
30
  >
31
31
  <h3>{{ t('tableHeaders.commit') }}</h3>
32
- <span>{{ value.status.commit }}</span>
32
+ <span>{{ value.status?.commit }}</span>
33
33
  </div>
34
34
  </div>
35
35
  </template>
@@ -5,6 +5,12 @@ import CopyCode from '@shell/components/CopyCode';
5
5
  import Tab from '@shell/components/Tabbed/Tab';
6
6
  import { allHash } from '@shell/utils/promise';
7
7
 
8
+ // Couple of things wrong here
9
+ // 1. It should be in pkg/harvester-manager extension
10
+ // 2. It's not used when the harvester-ui extension is loaded
11
+ // - extension has it's own detail/harvesterhci.io.management.cluster.vue which supersedes this
12
+ // - unless harvester standalone uses it, it should not exist in the harvester-ui extension
13
+
8
14
  export default {
9
15
  emits: ['input'],
10
16
 
@@ -31,8 +37,6 @@ export default {
31
37
 
32
38
  const res = await allHash(hash);
33
39
 
34
- this.allNodes = res.allNodes || [];
35
- this.allNodePools = res.allNodePools || [];
36
40
  this.clusterToken = res.clusterToken;
37
41
  },
38
42
 
package/detail/pod.vue CHANGED
@@ -106,7 +106,7 @@ export default {
106
106
  availableActions: this.value.containerActions,
107
107
  stateObj: status, // Required if there's a description
108
108
  stateDescription: descriptions.join(' | '), // Required to display the description
109
- initIcon: this.value.containerIsInit(container) ? 'icon-checkmark icon-2x text-success ml-5' : 'icon-minus icon-2x text-muted ml-5',
109
+ initIcon: this.value.containerIsInit(container) ? 'icon-checkmark text-success ml-5' : 'icon-minus text-muted ml-5',
110
110
 
111
111
  // Call openShell here so that opening the shell
112
112
  // at the container level still has 'this' in scope.