@rancher/shell 3.0.7 → 3.0.8-rc.10

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 (375) hide show
  1. package/assets/brand/suse/banner.svg +1 -0
  2. package/assets/brand/suse/dark/banner.svg +1 -0
  3. package/assets/brand/suse/dark/login-landscape.svg +1 -0
  4. package/assets/brand/suse/dark/rancher-logo.svg +1 -1
  5. package/assets/brand/suse/favicon.png +0 -0
  6. package/assets/brand/suse/login-landscape.svg +1 -0
  7. package/assets/brand/suse/metadata.json +11 -1
  8. package/assets/brand/suse/rancher-logo.svg +1 -1
  9. package/assets/fonts/suse/suse-v2-latin-300.woff +0 -0
  10. package/assets/fonts/suse/suse-v2-latin-300.woff2 +0 -0
  11. package/assets/fonts/suse/suse-v2-latin-600.woff +0 -0
  12. package/assets/fonts/suse/suse-v2-latin-600.woff2 +0 -0
  13. package/assets/fonts/suse/suse-v2-latin-700.woff +0 -0
  14. package/assets/fonts/suse/suse-v2-latin-700.woff2 +0 -0
  15. package/assets/fonts/suse/suse-v2-latin-800.woff +0 -0
  16. package/assets/fonts/suse/suse-v2-latin-800.woff2 +0 -0
  17. package/assets/fonts/suse/suse-v2-latin-regular.woff +0 -0
  18. package/assets/fonts/suse/suse-v2-latin-regular.woff2 +0 -0
  19. package/assets/images/content/README.md +5 -0
  20. package/assets/images/content/cloud-native.svg +84 -0
  21. package/assets/images/content/dark/cloud-native.svg +21 -0
  22. package/assets/images/content/dark/shield.svg +59 -0
  23. package/assets/images/content/dark/suse.svg +10 -0
  24. package/assets/images/content/shield.svg +59 -0
  25. package/assets/images/content/suse.svg +10 -0
  26. package/assets/images/vendor/githubapp.svg +13 -0
  27. package/assets/styles/base/_typography.scss +2 -1
  28. package/assets/styles/fonts/_fontstack.scss +53 -1
  29. package/assets/styles/global/_cards.scss +0 -3
  30. package/assets/styles/global/_layout.scss +21 -35
  31. package/assets/styles/themes/_dark.scss +1 -1
  32. package/assets/styles/themes/_light.scss +1 -1
  33. package/assets/styles/themes/_modern.scss +16 -8
  34. package/assets/styles/themes/_suse.scss +116 -24
  35. package/assets/translations/en-us.yaml +185 -21
  36. package/assets/translations/zh-hans.yaml +0 -4
  37. package/components/AutoscalerCard.vue +113 -0
  38. package/components/AutoscalerTab.vue +94 -0
  39. package/components/BackLink.vue +8 -0
  40. package/components/BannerGraphic.vue +36 -21
  41. package/components/BrandImage.vue +17 -6
  42. package/components/ClusterIconMenu.vue +1 -1
  43. package/components/ClusterProviderIcon.vue +1 -1
  44. package/components/Cron/CronExpressionEditor.vue +1 -1
  45. package/components/Cron/CronExpressionEditorModal.vue +1 -1
  46. package/components/Drawer/Chrome.vue +2 -6
  47. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +4 -9
  48. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +3 -8
  49. package/components/Drawer/ResourceDetailDrawer/composables.ts +3 -4
  50. package/components/Drawer/ResourceDetailDrawer/index.vue +4 -9
  51. package/components/Drawer/ResourceDetailDrawer/types.ts +17 -0
  52. package/components/Drawer/types.ts +3 -0
  53. package/components/DynamicContent/DynamicContentBanner.vue +102 -0
  54. package/components/DynamicContent/DynamicContentCloseButton.vue +42 -0
  55. package/components/DynamicContent/DynamicContentIcon.vue +132 -0
  56. package/components/DynamicContent/DynamicContentPanel.vue +112 -0
  57. package/components/DynamicContent/content.ts +78 -0
  58. package/components/EmberPage.vue +1 -1
  59. package/components/IconOrSvg.vue +2 -2
  60. package/components/Inactivity.vue +222 -106
  61. package/components/InstallHelmCharts.vue +2 -2
  62. package/components/PaginatedResourceTable.vue +2 -6
  63. package/components/PopoverCard.vue +192 -0
  64. package/components/Questions/__tests__/index.test.ts +159 -0
  65. package/components/Resource/Detail/CopyToClipboard.vue +4 -1
  66. package/components/Resource/Detail/FetchLoader/composables.ts +18 -4
  67. package/components/Resource/Detail/Metadata/Annotations/index.vue +2 -2
  68. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +1 -1
  69. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +4 -0
  70. package/components/Resource/Detail/Metadata/KeyValueRow.vue +1 -1
  71. package/components/Resource/Detail/Metadata/Labels/index.vue +2 -2
  72. package/components/Resource/Detail/Metadata/composables.ts +9 -9
  73. package/components/Resource/Detail/Metadata/index.vue +3 -3
  74. package/components/Resource/Detail/ResourcePopover/ResourcePopoverCard.vue +2 -19
  75. package/components/Resource/Detail/ResourcePopover/__tests__/ResourcePopoverCard.test.ts +0 -29
  76. package/components/Resource/Detail/ResourcePopover/__tests__/index.test.ts +132 -150
  77. package/components/Resource/Detail/ResourcePopover/index.vue +54 -159
  78. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +0 -2
  79. package/components/Resource/Detail/TitleBar/composables.ts +2 -1
  80. package/components/Resource/Detail/TitleBar/index.vue +10 -6
  81. package/components/Resource/Detail/composables.ts +12 -0
  82. package/components/ResourceDetail/Masthead/latest.vue +29 -0
  83. package/components/ResourceDetail/index.vue +5 -2
  84. package/components/ResourceList/Masthead.vue +1 -1
  85. package/components/SortableTable/index.vue +18 -2
  86. package/components/Tabbed/__tests__/index.test.ts +86 -0
  87. package/components/{nav/WindowManager → Window}/ContainerLogs.vue +1 -1
  88. package/components/{nav/WindowManager → Window}/ContainerLogsActions.vue +1 -0
  89. package/components/{nav/WindowManager → Window}/__tests__/ContainerLogs.test.ts +1 -1
  90. package/components/{nav/WindowManager → Window}/__tests__/ContainerShell.test.ts +2 -2
  91. package/components/__tests__/AutoscalerCard.test.ts +154 -0
  92. package/components/__tests__/AutoscalerTab.test.ts +125 -0
  93. package/components/__tests__/PopoverCard.test.ts +204 -0
  94. package/components/auth/SelectPrincipal.vue +24 -6
  95. package/components/auth/__tests__/SelectPrincipal.test.ts +119 -0
  96. package/components/fleet/FleetConfigMapSelector.vue +117 -0
  97. package/components/fleet/FleetSecretSelector.vue +127 -0
  98. package/components/fleet/__tests__/FleetConfigMapSelector.test.ts +125 -0
  99. package/components/fleet/__tests__/FleetSecretSelector.test.ts +82 -0
  100. package/components/form/FileImageSelector.vue +13 -4
  101. package/components/form/FileSelector.vue +11 -2
  102. package/components/form/ResourceLabeledSelect.vue +1 -0
  103. package/components/form/__tests__/ResourceLabeledSelect.test.ts +90 -0
  104. package/components/formatter/Autoscaler.vue +97 -0
  105. package/components/formatter/InternalExternalIP.vue +198 -24
  106. package/components/formatter/__tests__/Autoscaler.test.ts +156 -0
  107. package/components/formatter/__tests__/InternalExternalIP.test.ts +133 -0
  108. package/components/google/util/__tests__/formatter.test.ts +47 -0
  109. package/components/google/util/formatter.ts +5 -2
  110. package/components/nav/Group.vue +12 -3
  111. package/components/nav/Header.vue +37 -16
  112. package/components/nav/NamespaceFilter.vue +13 -1
  113. package/components/nav/NotificationCenter/index.vue +2 -1
  114. package/components/nav/TopLevelMenu.helper.ts +16 -6
  115. package/components/nav/TopLevelMenu.vue +4 -2
  116. package/components/{DraggableZone.vue → nav/WindowManager/PinArea.vue} +47 -80
  117. package/components/nav/WindowManager/composables/useComponentsMount.ts +70 -0
  118. package/components/nav/WindowManager/composables/useDimensionsHandler.ts +105 -0
  119. package/components/nav/WindowManager/composables/useDragHandler.ts +99 -0
  120. package/components/nav/WindowManager/composables/usePanelHandler.ts +72 -0
  121. package/components/nav/WindowManager/composables/usePanelsHandler.ts +14 -0
  122. package/components/nav/WindowManager/composables/useResizeHandler.ts +167 -0
  123. package/components/nav/WindowManager/composables/useTabsHandler.ts +51 -0
  124. package/components/nav/WindowManager/constants.ts +23 -0
  125. package/components/nav/WindowManager/index.vue +61 -575
  126. package/components/nav/WindowManager/panels/HorizontalPanel.vue +265 -0
  127. package/components/nav/WindowManager/panels/TabBodyContainer.vue +39 -0
  128. package/components/nav/WindowManager/panels/VerticalPanel.vue +308 -0
  129. package/components/templates/default.vue +4 -40
  130. package/components/templates/home.vue +31 -5
  131. package/components/templates/plain.vue +30 -4
  132. package/components/templates/standalone.vue +1 -1
  133. package/composables/useI18n.ts +10 -1
  134. package/composables/useInterval.ts +15 -0
  135. package/config/__test__/uiplugins.test.ts +309 -0
  136. package/config/labels-annotations.js +9 -1
  137. package/config/product/auth.js +1 -0
  138. package/config/product/explorer.js +3 -1
  139. package/config/product/manager.js +20 -9
  140. package/config/query-params.js +1 -0
  141. package/config/router/routes.js +10 -2
  142. package/config/settings.ts +10 -2
  143. package/config/store.js +4 -2
  144. package/config/table-headers.js +8 -0
  145. package/config/types.js +11 -0
  146. package/config/uiplugins.js +46 -2
  147. package/config/version.js +1 -1
  148. package/core/__test__/extension-manager-impl.test.js +236 -0
  149. package/core/extension-manager-impl.js +23 -6
  150. package/core/plugin-helpers.ts +2 -0
  151. package/core/types-provisioning.ts +4 -1
  152. package/detail/pod.vue +1 -0
  153. package/detail/provisioning.cattle.io.cluster.vue +13 -1
  154. package/dialog/AddonConfigConfirmationDialog.vue +45 -1
  155. package/dialog/DeveloperLoadExtensionDialog.vue +12 -3
  156. package/dialog/RollbackWorkloadDialog.vue +2 -5
  157. package/directives/ui-context.ts +103 -0
  158. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +52 -11
  159. package/edit/auth/AuthProviderWarningBanners.vue +14 -1
  160. package/edit/auth/__tests__/oidc.test.ts +26 -0
  161. package/edit/auth/github-app-steps.vue +97 -0
  162. package/edit/auth/github-steps.vue +75 -0
  163. package/edit/auth/github.vue +99 -65
  164. package/edit/auth/oidc.vue +5 -1
  165. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -0
  166. package/edit/cloudcredential.vue +1 -1
  167. package/edit/configmap.vue +1 -0
  168. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  169. package/edit/fleet.cattle.io.gitrepo.vue +0 -10
  170. package/edit/fleet.cattle.io.helmop.vue +51 -2
  171. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  172. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  173. package/edit/logging-flow/index.vue +1 -0
  174. package/edit/logging.banzaicloud.io.output/index.vue +1 -0
  175. package/edit/management.cattle.io.fleetworkspace.vue +1 -1
  176. package/edit/management.cattle.io.project.vue +1 -0
  177. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +4 -1
  178. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +2 -1
  179. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  180. package/edit/monitoring.coreos.com.receiver/index.vue +2 -1
  181. package/edit/monitoring.coreos.com.route.vue +1 -1
  182. package/edit/namespace.vue +1 -0
  183. package/edit/networking.istio.io.destinationrule/index.vue +1 -0
  184. package/edit/networking.k8s.io.ingress/index.vue +1 -0
  185. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +15 -5
  186. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +1 -0
  187. package/edit/networking.k8s.io.networkpolicy/index.vue +1 -0
  188. package/edit/node.vue +1 -0
  189. package/edit/persistentvolume/index.vue +27 -22
  190. package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +13 -14
  191. package/edit/persistentvolume/plugins/azureDisk.vue +49 -48
  192. package/edit/persistentvolume/plugins/azureFile.vue +15 -14
  193. package/edit/persistentvolume/plugins/cephfs.vue +15 -14
  194. package/edit/persistentvolume/plugins/cinder.vue +15 -14
  195. package/edit/persistentvolume/plugins/csi.vue +18 -16
  196. package/edit/persistentvolume/plugins/fc.vue +13 -14
  197. package/edit/persistentvolume/plugins/flexVolume.vue +15 -14
  198. package/edit/persistentvolume/plugins/flocker.vue +1 -3
  199. package/edit/persistentvolume/plugins/gcePersistentDisk.vue +13 -14
  200. package/edit/persistentvolume/plugins/glusterfs.vue +15 -14
  201. package/edit/persistentvolume/plugins/hostPath.vue +40 -39
  202. package/edit/persistentvolume/plugins/iscsi.vue +13 -14
  203. package/edit/persistentvolume/plugins/local.vue +1 -3
  204. package/edit/persistentvolume/plugins/longhorn.vue +23 -22
  205. package/edit/persistentvolume/plugins/nfs.vue +15 -14
  206. package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -14
  207. package/edit/persistentvolume/plugins/portworxVolume.vue +15 -14
  208. package/edit/persistentvolume/plugins/quobyte.vue +15 -14
  209. package/edit/persistentvolume/plugins/rbd.vue +15 -14
  210. package/edit/persistentvolume/plugins/scaleIO.vue +15 -14
  211. package/edit/persistentvolume/plugins/storageos.vue +15 -14
  212. package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -3
  213. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +32 -5
  214. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +35 -0
  215. package/edit/provisioning.cattle.io.cluster/__tests__/Networking.test.ts +155 -0
  216. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +11 -9
  217. package/edit/provisioning.cattle.io.cluster/index.vue +25 -15
  218. package/edit/provisioning.cattle.io.cluster/rke2.vue +98 -17
  219. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +28 -2
  220. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +107 -5
  221. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +92 -4
  222. package/edit/secret/index.vue +1 -1
  223. package/edit/service.vue +9 -4
  224. package/edit/serviceaccount.vue +1 -0
  225. package/edit/storage.k8s.io.storageclass/index.vue +1 -0
  226. package/edit/workload/index.vue +2 -1
  227. package/edit/workload/mixins/workload.js +1 -1
  228. package/initialize/App.vue +4 -4
  229. package/initialize/install-directives.js +2 -0
  230. package/initialize/install-plugins.js +19 -2
  231. package/list/projectsecret.vue +1 -1
  232. package/list/provisioning.cattle.io.cluster.vue +15 -2
  233. package/machine-config/amazonec2.vue +42 -135
  234. package/machine-config/azure.vue +1 -1
  235. package/machine-config/components/EC2Networking.vue +490 -0
  236. package/machine-config/components/__tests__/EC2Networking.test.ts +148 -0
  237. package/machine-config/components/__tests__/utils/vpcSubnetMockData.js +294 -0
  238. package/machine-config/digitalocean.vue +11 -0
  239. package/machine-config/google.vue +1 -1
  240. package/mixins/__tests__/brand.spec.ts +2 -2
  241. package/mixins/__tests__/chart.test.ts +21 -0
  242. package/mixins/brand.js +1 -7
  243. package/mixins/chart.js +8 -2
  244. package/mixins/create-edit-view/index.js +5 -0
  245. package/models/__tests__/chart.test.ts +49 -12
  246. package/models/__tests__/compliance.cattle.io.clusterscanprofile.spec.js +30 -0
  247. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +112 -5
  248. package/models/catalog.cattle.io.app.js +1 -1
  249. package/models/chart.js +28 -14
  250. package/models/cluster/node.js +13 -6
  251. package/models/cluster.x-k8s.io.machine.js +10 -20
  252. package/models/cluster.x-k8s.io.machinedeployment.js +5 -1
  253. package/models/compliance.cattle.io.clusterscanprofile.js +1 -1
  254. package/models/management.cattle.io.authconfig.js +1 -0
  255. package/models/management.cattle.io.cluster.js +21 -3
  256. package/models/management.cattle.io.kontainerdriver.js +1 -0
  257. package/models/provisioning.cattle.io.cluster.js +249 -33
  258. package/package.json +6 -5
  259. package/pages/auth/login.vue +43 -4
  260. package/pages/auth/verify.vue +1 -1
  261. package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +3 -2
  262. package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +135 -0
  263. package/pages/c/_cluster/apps/charts/chart.vue +35 -17
  264. package/pages/c/_cluster/apps/charts/index.vue +11 -13
  265. package/pages/c/_cluster/apps/charts/install.vue +1 -1
  266. package/pages/c/_cluster/explorer/EventsTable.vue +89 -3
  267. package/pages/c/_cluster/explorer/index.vue +8 -6
  268. package/pages/c/_cluster/explorer/tools/index.vue +3 -3
  269. package/pages/c/_cluster/manager/hostedprovider/index.vue +220 -0
  270. package/pages/c/_cluster/settings/brand.vue +1 -1
  271. package/pages/c/_cluster/settings/performance.vue +12 -25
  272. package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +7 -0
  273. package/pages/c/_cluster/uiplugins/catalogs.vue +147 -0
  274. package/pages/c/_cluster/uiplugins/index.vue +126 -184
  275. package/pages/home.vue +327 -16
  276. package/pkg/dynamic-importer.lib.js +4 -0
  277. package/plugins/axios.js +2 -1
  278. package/plugins/dashboard-client-init.js +3 -0
  279. package/plugins/dashboard-store/actions.js +1 -1
  280. package/plugins/dashboard-store/getters.js +18 -1
  281. package/plugins/dashboard-store/resource-class.js +21 -6
  282. package/plugins/dynamic-content.js +13 -0
  283. package/plugins/i18n.js +8 -0
  284. package/plugins/steve/__tests__/steve-pagination-utils.test.ts +333 -0
  285. package/plugins/steve/steve-pagination-utils.ts +41 -22
  286. package/plugins/steve/subscribe.js +17 -9
  287. package/plugins/subscribe-events.ts +4 -2
  288. package/rancher-components/Form/Checkbox/Checkbox.vue +1 -1
  289. package/rancher-components/Pill/RcStatusBadge/RcStatusBadge.vue +6 -34
  290. package/rancher-components/Pill/RcStatusBadge/index.ts +0 -1
  291. package/rancher-components/Pill/RcStatusBadge/types.ts +1 -1
  292. package/rancher-components/Pill/RcStatusIndicator/RcStatusIndicator.vue +5 -28
  293. package/rancher-components/Pill/RcStatusIndicator/types.ts +2 -1
  294. package/rancher-components/Pill/types.ts +0 -1
  295. package/rancher-components/RcDropdown/RcDropdownItem.vue +1 -0
  296. package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +5 -1
  297. package/rancher-components/RcIcon/RcIcon.test.ts +51 -0
  298. package/rancher-components/RcIcon/RcIcon.vue +46 -0
  299. package/rancher-components/RcIcon/index.ts +1 -0
  300. package/rancher-components/RcIcon/types.ts +160 -0
  301. package/rancher-components/utils/status.test.ts +67 -0
  302. package/rancher-components/utils/status.ts +77 -0
  303. package/scripts/extension/publish +1 -1
  304. package/scripts/typegen.sh +1 -0
  305. package/store/action-menu.js +8 -0
  306. package/store/auth.js +11 -6
  307. package/store/aws.js +8 -6
  308. package/store/catalog.js +6 -0
  309. package/store/features.js +2 -0
  310. package/store/index.js +45 -20
  311. package/store/notifications.ts +51 -4
  312. package/store/plugins.js +7 -3
  313. package/store/prefs.js +12 -6
  314. package/store/type-map.js +3 -3
  315. package/store/ui-context.ts +86 -0
  316. package/store/wm.ts +244 -0
  317. package/types/kube/kube-api.ts +2 -1
  318. package/types/notifications/index.ts +27 -3
  319. package/types/rancher/index.d.ts +1 -0
  320. package/types/resources/settings.d.ts +29 -7
  321. package/types/shell/index.d.ts +138 -4
  322. package/types/store/__tests__/pagination.types.spec.ts +137 -0
  323. package/types/store/pagination.types.ts +157 -9
  324. package/types/store/subscribe-events.types.ts +8 -1
  325. package/types/store/subscribe.types.ts +1 -0
  326. package/types/window-manager.ts +24 -0
  327. package/utils/__tests__/cluster.test.ts +379 -1
  328. package/utils/__tests__/object.test.ts +19 -0
  329. package/utils/__tests__/provider.test.ts +98 -0
  330. package/utils/__tests__/selector-typed.test.ts +263 -0
  331. package/utils/__tests__/version.test.ts +19 -1
  332. package/utils/autoscaler-utils.ts +7 -0
  333. package/utils/back-off.ts +3 -3
  334. package/utils/brand.ts +29 -0
  335. package/utils/chart.js +18 -0
  336. package/utils/cluster.js +157 -3
  337. package/utils/color.js +1 -1
  338. package/utils/dynamic-content/__tests__/announcement.test.ts +498 -0
  339. package/utils/dynamic-content/__tests__/config.test.ts +187 -0
  340. package/utils/dynamic-content/__tests__/index.test.ts +390 -0
  341. package/utils/dynamic-content/__tests__/info.test.ts +275 -0
  342. package/utils/dynamic-content/__tests__/new-release.test.ts +216 -0
  343. package/utils/dynamic-content/__tests__/support-notice.test.ts +262 -0
  344. package/utils/dynamic-content/__tests__/util.test.ts +235 -0
  345. package/utils/dynamic-content/announcement.ts +142 -0
  346. package/utils/dynamic-content/config.ts +55 -0
  347. package/utils/dynamic-content/example.json +40 -0
  348. package/utils/dynamic-content/index.ts +277 -0
  349. package/utils/dynamic-content/info.ts +261 -0
  350. package/utils/dynamic-content/new-release.ts +126 -0
  351. package/utils/dynamic-content/notification-handler.ts +48 -0
  352. package/utils/dynamic-content/support-notice.ts +169 -0
  353. package/utils/dynamic-content/types.d.ts +153 -0
  354. package/utils/dynamic-content/util.ts +122 -0
  355. package/utils/dynamic-importer.js +2 -2
  356. package/utils/favicon.js +4 -4
  357. package/utils/inactivity.ts +104 -0
  358. package/utils/object.js +20 -2
  359. package/utils/pagination-utils.ts +19 -4
  360. package/utils/pagination-wrapper.ts +12 -8
  361. package/utils/provider.ts +14 -0
  362. package/utils/release-notes.ts +1 -1
  363. package/utils/scroll.js +7 -0
  364. package/utils/selector-typed.ts +6 -2
  365. package/utils/settings.ts +15 -0
  366. package/utils/validators/machine-pool.ts +13 -3
  367. package/utils/version.js +15 -0
  368. package/assets/images/icons/document.svg +0 -3
  369. package/plugins/nuxt-client-init.js +0 -3
  370. package/store/wm.js +0 -95
  371. /package/components/{nav/WindowManager → Window}/ChartReadme.vue +0 -0
  372. /package/components/{nav/WindowManager → Window}/ContainerShell.vue +0 -0
  373. /package/components/{nav/WindowManager → Window}/KubectlShell.vue +0 -0
  374. /package/components/{nav/WindowManager → Window}/MachineSsh.vue +0 -0
  375. /package/components/{nav/WindowManager → Window}/Window.vue +0 -0
@@ -1,24 +1,28 @@
1
1
  import ProvCluster from '@shell/models/provisioning.cattle.io.cluster';
2
-
2
+ jest.mock('@shell/utils/provider', () => ({
3
+ isHostedProvider: jest.fn().mockImplementation((context, provider) => {
4
+ return ['GKE', 'EKS', 'AKS'].includes(provider);
5
+ })
6
+ }));
3
7
  describe('class ProvCluster', () => {
4
8
  const gkeClusterWithPrivateEndpoint = {
5
9
  clusterName: 'test',
6
10
  provisioner: 'GKE',
7
- spec: { rkeConfig: {} },
11
+ spec: { },
8
12
  mgmt: { spec: { gkeConfig: { privateClusterConfig: { enablePrivateEndpoint: true } } } }
9
13
  };
10
14
 
11
15
  const eksClusterWithPrivateEndpoint = {
12
16
  clusterName: 'test',
13
17
  provisioner: 'EKS',
14
- spec: { rkeConfig: {} },
18
+ spec: { },
15
19
  mgmt: { spec: { eksConfig: { privateAccess: true } } }
16
20
  };
17
21
 
18
22
  const aksClusterWithPrivateEndpoint = {
19
23
  clusterName: 'test',
20
24
  provisioner: 'AKS',
21
- spec: { rkeConfig: {} },
25
+ spec: { },
22
26
  mgmt: { spec: { aksConfig: { privateCluster: true } } }
23
27
  };
24
28
 
@@ -44,12 +48,115 @@ describe('class ProvCluster', () => {
44
48
  clusterData.provisioner
45
49
  );
46
50
 
47
- expect(cluster.isRke2).toBe(expected);
51
+ expect(cluster.isRke2).toBe(false);
48
52
  expect(cluster.isHostedKubernetesProvider).toBe(expected);
49
53
  expect(cluster.isPrivateHostedProvider).toBe(expected);
50
54
  resetMocks();
51
55
  });
52
56
  });
57
+ describe('isImported', () => {
58
+ const testCases = [
59
+ {
60
+ description: 'should return false for a local cluster',
61
+ clusterData: { isLocal: true },
62
+ expected: false
63
+ },
64
+ {
65
+ description: 'should return true for an imported k3s cluster',
66
+ clusterData: {
67
+ isLocal: false,
68
+ mgmt: { status: { provider: 'k3s', driver: 'k3s' } }
69
+ },
70
+ expected: true
71
+ },
72
+ {
73
+ description: 'should return false for a provisioned k3s cluster',
74
+ clusterData: {
75
+ isLocal: false,
76
+ mgmt: { status: { provider: 'k3s', driver: 'imported' } }
77
+ },
78
+ expected: false
79
+ },
80
+ {
81
+ description: 'should return true for an imported rke2 cluster',
82
+ clusterData: {
83
+ isLocal: false,
84
+ mgmt: { status: { provider: 'rke2', driver: 'rke2' } }
85
+ },
86
+ expected: true
87
+ },
88
+ {
89
+ description: 'should return false for a provisioned rke2 cluster',
90
+ clusterData: {
91
+ isLocal: false,
92
+ mgmt: { status: { provider: 'rke2', driver: 'imported' } }
93
+ },
94
+ expected: false
95
+ },
96
+ {
97
+ description: 'should return true for an imported hosted cluster',
98
+ clusterData: {
99
+ isLocal: false,
100
+ isHostedKubernetesProvider: true,
101
+ providerConfig: { imported: true }
102
+ },
103
+ expected: true
104
+ },
105
+ {
106
+ description: 'should return false for a provisioned hosted cluster',
107
+ clusterData: {
108
+ isLocal: false,
109
+ isHostedKubernetesProvider: true,
110
+ providerConfig: { imported: false }
111
+ },
112
+ expected: false
113
+ },
114
+ {
115
+ description: 'should return true for a generic imported cluster',
116
+ clusterData: {
117
+ isLocal: false,
118
+ provisioner: 'imported'
119
+ },
120
+ expected: true
121
+ },
122
+ {
123
+ description: 'should return false for a generic provisioned cluster',
124
+ clusterData: {
125
+ isLocal: false,
126
+ provisioner: 'rke2'
127
+ },
128
+ expected: false
129
+ }
130
+ ];
131
+ const resetMocks = () => {
132
+ // Clear all mock function calls:
133
+ jest.clearAllMocks();
134
+ };
135
+
136
+ it.each(testCases)('$description', ({ clusterData, expected }) => {
137
+ const cluster = new ProvCluster({});
138
+
139
+ // Mock getters
140
+ jest.spyOn(cluster, 'mgmt', 'get').mockReturnValue(
141
+ clusterData.mgmt
142
+ );
143
+ if (clusterData.isLocal !== undefined) {
144
+ jest.spyOn(cluster, 'isLocal', 'get').mockReturnValue(clusterData.isLocal);
145
+ }
146
+ if (clusterData.isHostedKubernetesProvider !== undefined) {
147
+ jest.spyOn(cluster, 'isHostedKubernetesProvider', 'get').mockReturnValue(clusterData.isHostedKubernetesProvider);
148
+ }
149
+ if (clusterData.providerConfig !== undefined) {
150
+ jest.spyOn(cluster, 'providerConfig', 'get').mockReturnValue(clusterData.providerConfig);
151
+ }
152
+ if (clusterData.provisioner !== undefined) {
153
+ jest.spyOn(cluster, 'provisioner', 'get').mockReturnValue(clusterData.provisioner);
154
+ }
155
+
156
+ expect(cluster.isImported).toBe(expected);
157
+ resetMocks();
158
+ });
159
+ });
53
160
 
54
161
  describe('hasError', () => {
55
162
  const conditionsWithoutError = [
@@ -323,7 +323,7 @@ export default class CatalogApp extends SteveModel {
323
323
 
324
324
  get relatedResourcesToRemove() {
325
325
  return async() => {
326
- const crd = this.spec.chart.metadata.annotations[CATALOG_ANNOTATIONS.AUTO_INSTALL].replace('=match', '');
326
+ const crd = this.spec?.chart?.metadata?.annotations?.[CATALOG_ANNOTATIONS.AUTO_INSTALL]?.replace('=match', '');
327
327
 
328
328
  return await this.$dispatch('find', {
329
329
  type: CATALOG.APP,
package/models/chart.js CHANGED
@@ -1,8 +1,10 @@
1
- import { compatibleVersionsFor, APP_UPGRADE_STATUS } from '@shell/store/catalog';
1
+ import { APP_UPGRADE_STATUS } from '@shell/store/catalog';
2
2
  import {
3
3
  REPO_TYPE, REPO, CHART, VERSION, _FLAGGED, HIDE_SIDE_NAV, CATEGORY, TAG, DEPRECATED as DEPRECATED_QUERY
4
4
  } from '@shell/config/query-params';
5
5
  import { BLANK_CLUSTER } from '@shell/store/store-types.js';
6
+ import { SHOW_PRE_RELEASE } from '@shell/store/prefs';
7
+ import { getLatestCompatibleVersion } from '@shell/utils/chart';
6
8
  import SteveModel from '@shell/plugins/steve/steve-class';
7
9
  import { CATALOG, ZERO_TIME } from '@shell/config/types';
8
10
  import { CATALOG as CATALOG_ANNOTATIONS } from '@shell/config/labels-annotations';
@@ -10,17 +12,7 @@ import day from 'dayjs';
10
12
 
11
13
  export default class Chart extends SteveModel {
12
14
  queryParams(from, hideSideNav) {
13
- let version;
14
- const chartVersions = this.versions;
15
- const currentCluster = this.$rootGetters['currentCluster'];
16
- const workerOSs = currentCluster?.workerOSs;
17
- const compatibleVersions = compatibleVersionsFor(this, workerOSs);
18
-
19
- if (compatibleVersions.length) {
20
- version = compatibleVersions[0].version;
21
- } else {
22
- version = chartVersions[0].version;
23
- }
15
+ const version = this.latestCompatibleVersion.version;
24
16
 
25
17
  const out = {
26
18
  [REPO_TYPE]: this.repoType,
@@ -115,6 +107,26 @@ export default class Chart extends SteveModel {
115
107
  return this.isInstalled && this.matchingInstalledApps[0].upgradeAvailable === APP_UPGRADE_STATUS.SINGLE_UPGRADE;
116
108
  }
117
109
 
110
+ /**
111
+ * Retrieves the latest chart version that is compatible with the current cluster's OS and user's pre-release preference.
112
+ * It caches the result for efficiency.
113
+ *
114
+ * @returns {Object} The latest compatible chart version object.
115
+ */
116
+ get latestCompatibleVersion() {
117
+ if (this._latestCompatibleVersion) {
118
+ return this._latestCompatibleVersion;
119
+ }
120
+
121
+ const currentCluster = this.$rootGetters['currentCluster'];
122
+ const workerOSs = currentCluster?.workerOSs;
123
+ const showPrerelease = this.$rootGetters['prefs/get'](SHOW_PRE_RELEASE);
124
+
125
+ this._latestCompatibleVersion = getLatestCompatibleVersion(this, workerOSs, showPrerelease);
126
+
127
+ return this._latestCompatibleVersion;
128
+ }
129
+
118
130
  /**
119
131
  * Builds structured metadata for display in RcItemCard.vue:
120
132
  * - Sub-header (version and last updated)
@@ -125,7 +137,7 @@ export default class Chart extends SteveModel {
125
137
  */
126
138
  get cardContent() {
127
139
  if (!this._cardContent) {
128
- const latestVersion = this.versions?.[0] || {};
140
+ const latestVersion = this.latestCompatibleVersion;
129
141
  const subHeaderItems = [];
130
142
 
131
143
  if (latestVersion) {
@@ -195,8 +207,10 @@ export default class Chart extends SteveModel {
195
207
  }
196
208
 
197
209
  if (this.isInstalled) {
210
+ const installedVersion = this.matchingInstalledApps[0]?.spec?.chart?.metadata?.version;
211
+
198
212
  statuses.push({
199
- icon: 'icon-confirmation-alt', color: 'success', tooltip: { key: 'generic.installed' }
213
+ icon: 'icon-confirmation-alt', color: 'success', tooltip: { text: `${ this.t('generic.installed') } (${ installedVersion })` }
200
214
  });
201
215
  }
202
216
 
@@ -4,7 +4,6 @@ import {
4
4
  CAPI, MANAGEMENT, METRIC, NORMAN, POD
5
5
  } from '@shell/config/types';
6
6
  import { parseSi } from '@shell/utils/units';
7
- import findLast from 'lodash/findLast';
8
7
 
9
8
  import SteveModel from '@shell/plugins/steve/steve-class';
10
9
  import { LOCAL } from '@shell/config/query-params';
@@ -96,15 +95,23 @@ export default class ClusterNode extends SteveModel {
96
95
  return this.status?.addresses || [];
97
96
  }
98
97
 
99
- get internalIp() {
100
- return findLast(this.addresses, (address) => address.type === 'InternalIP')?.address;
98
+ get internalIps() {
99
+ return this.addresses.filter((address) => address.type === 'InternalIP').map((address) => address.address);
101
100
  }
102
101
 
103
- get externalIp() {
102
+ get externalIps() {
104
103
  const annotationAddress = this.metadata.annotations[RKE.EXTERNAL_IP];
105
- const statusAddress = findLast(this.addresses, (address) => address.type === 'ExternalIP')?.address;
104
+ const statusAddresses = this.addresses.filter((address) => address.type === 'ExternalIP').map((address) => address.address);
105
+
106
+ return statusAddresses.concat(annotationAddress || []);
107
+ }
106
108
 
107
- return statusAddress || annotationAddress;
109
+ get internalIp() {
110
+ return this.internalIps[0];
111
+ }
112
+
113
+ get externalIp() {
114
+ return this.externalIps[0];
108
115
  }
109
116
 
110
117
  get labels() {
@@ -244,29 +244,19 @@ export default class CapiMachine extends SteveModel {
244
244
  return this.status?.phase === 'Running';
245
245
  }
246
246
 
247
- get internalIp() {
248
- // This shows in the IP address column for RKE2 nodes in the
249
- // list of nodes in the cluster detail page of Cluster Management.
250
- const internal = this.status?.addresses?.find(({ type }) => {
251
- return type === ADDRESSES.INTERNAL_IP;
252
- })?.address;
253
-
254
- if (internal) {
255
- return internal;
256
- }
257
-
258
- return this.t('generic.none');
247
+ get internalIps() {
248
+ return this.status?.addresses?.filter(({ type }) => type === ADDRESSES.INTERNAL_IP).map((addr) => addr.address) || [];
259
249
  }
260
250
 
261
- get externalIp() {
262
- const external = this.status?.addresses?.find(({ type }) => {
263
- return type === ADDRESSES.EXTERNAL_IP;
264
- })?.address;
251
+ get externalIps() {
252
+ return this.status?.addresses?.filter(({ type }) => type === ADDRESSES.EXTERNAL_IP).map((addr) => addr.address) || [];
253
+ }
265
254
 
266
- if (external) {
267
- return external;
268
- }
255
+ get internalIp() {
256
+ return this.internalIps[0];
257
+ }
269
258
 
270
- return this.t('generic.none');
259
+ get externalIp() {
260
+ return this.externalIps[0];
271
261
  }
272
262
  }
@@ -4,7 +4,7 @@ import { sortBy } from '@shell/utils/sort';
4
4
  import SteveModel from '@shell/plugins/steve/steve-class';
5
5
  import { exceptionToErrorsArray } from '@shell/utils/error';
6
6
  import { handleConflict } from '@shell/plugins/dashboard-store/normalize';
7
- import { MACHINE_ROLES } from '@shell/config/labels-annotations';
7
+ import { CAPI as CAPI_ANNOTATIONS, MACHINE_ROLES } from '@shell/config/labels-annotations';
8
8
  import { notOnlyOfRole } from '@shell/models/cluster.x-k8s.io.machine';
9
9
  import { KIND } from '../config/elemental-types';
10
10
  import { KIND as HARVESTER_KIND } from '../config/harvester-manager-types';
@@ -173,6 +173,10 @@ export default class CapiMachineDeployment extends SteveModel {
173
173
  }, 1000);
174
174
  }
175
175
 
176
+ get isAutoscalerEnabled() {
177
+ return this.annotations?.[CAPI_ANNOTATIONS.AUTOSCALER_MACHINE_POOL_MIN_SIZE] || this.annotations?.[CAPI_ANNOTATIONS.AUTOSCALER_MACHINE_POOL_MAX_SIZE];
178
+ }
179
+
176
180
  // prevent scaling pool to 0 if it would scale down the only etcd or control plane node
177
181
  canScaleDownPool() {
178
182
  if (!this.canUpdate || this.inClusterSpec?.quantity === 0 || this.infrastructureRefKind === KIND.MACHINE_INV_SELECTOR_TEMPLATES) {
@@ -11,7 +11,7 @@ export default class ComplianceProfile extends SteveModel {
11
11
  get numberTestsSkipped() {
12
12
  const { skipTests = [] } = this.spec;
13
13
 
14
- return skipTests.length;
14
+ return skipTests?.length || 0;
15
15
  }
16
16
 
17
17
  get benchmarkVersionLink() {
@@ -14,6 +14,7 @@ export const configType = {
14
14
  googleoauth: 'oauth',
15
15
  local: '',
16
16
  github: 'oauth',
17
+ githubapp: 'oauth',
17
18
  keycloakoidc: 'oidc',
18
19
  genericoidc: 'oidc',
19
20
  cognito: 'oidc',
@@ -15,6 +15,7 @@ import { LINUX, WINDOWS } from '@shell/store/catalog';
15
15
  import { KONTAINER_TO_DRIVER } from './management.cattle.io.kontainerdriver';
16
16
  import { PINNED_CLUSTERS } from '@shell/store/prefs';
17
17
  import { copyTextToClipboard } from '@shell/utils/clipboard';
18
+ import { isHostedProvider } from '@shell/utils/provider';
18
19
 
19
20
  const DEFAULT_BADGE_COLOR = '#707070';
20
21
 
@@ -171,9 +172,20 @@ export default class MgmtCluster extends SteveModel {
171
172
  return this.isCondition('Ready');
172
173
  }
173
174
 
175
+ get config() {
176
+ if (!this.spec?.[`${ this.provisioner }Config`]) {
177
+ const allKeys = Object.keys(this.spec);
178
+ const configKey = allKeys.find( (k) => k.endsWith('Config'));
179
+
180
+ return this.spec[configKey];
181
+ }
182
+
183
+ return this.spec?.[`${ this.provisioner }Config`];
184
+ }
185
+
174
186
  get kubernetesVersionRaw() {
175
187
  const fromStatus = this.status?.version?.gitVersion;
176
- const fromSpec = this.spec?.[`${ this.provisioner }Config`]?.kubernetesVersion;
188
+ const fromSpec = this.config?.kubernetesVersion;
177
189
 
178
190
  return fromStatus || fromSpec;
179
191
  }
@@ -239,9 +251,15 @@ export default class MgmtCluster extends SteveModel {
239
251
  }
240
252
 
241
253
  get isHostedKubernetesProvider() {
242
- const providers = ['AKS', 'EKS', 'GKE'];
254
+ const context = {
255
+ dispatch: this.$dispatch,
256
+ getters: this.$getters,
257
+ axios: this.$axios,
258
+ $extension: this.$plugin,
259
+ t: (...args) => this.t.apply(this, args),
260
+ };
243
261
 
244
- return providers.includes(this.provisioner);
262
+ return isHostedProvider(context, this.provisioner);
245
263
  }
246
264
 
247
265
  get providerLogo() {
@@ -41,6 +41,7 @@ export const DRIVER_TO_IMPORT = {
41
41
  googlegke: 'gke',
42
42
  amazoneks: 'eks',
43
43
  azureaks: 'aks',
44
+ alibaba: 'alibabacloud'
44
45
  };
45
46
 
46
47
  export default class KontainerDriver extends HybridModel {