@rancher/shell 1.2.3 → 2.0.1

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 (699) hide show
  1. package/assets/data/aws-regions.json +9 -0
  2. package/assets/images/vendor/openid.svg +18 -0
  3. package/assets/styles/app.scss +1 -2
  4. package/assets/styles/fonts/_icons.scss +3 -3
  5. package/assets/styles/global/_columns.scss +1 -1
  6. package/assets/styles/global/_labeled-input.scss +1 -0
  7. package/assets/styles/global/_layout.scss +99 -0
  8. package/assets/styles/themes/_csp.scss +2 -2
  9. package/assets/styles/themes/_dark.scss +8 -2
  10. package/assets/styles/themes/_light.scss +2 -1
  11. package/assets/styles/themes/_suse.scss +1 -1
  12. package/assets/styles/vendor/vue-select.scss +5 -0
  13. package/assets/translations/en-us.yaml +315 -64
  14. package/assets/translations/zh-hans.yaml +7 -31
  15. package/babel.config.js +8 -2
  16. package/chart/__tests__/S3.test.ts +9 -2
  17. package/chart/gatekeeper.vue +2 -11
  18. package/chart/istio.vue +1 -10
  19. package/chart/logging/index.vue +2 -11
  20. package/chart/monitoring/alerting/index.vue +7 -21
  21. package/chart/monitoring/grafana/index.vue +61 -2
  22. package/chart/monitoring/index.vue +52 -26
  23. package/chart/monitoring/prometheus/index.vue +39 -45
  24. package/chart/rancher-backup/S3.vue +11 -9
  25. package/chart/rancher-backup/index.vue +18 -15
  26. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  27. package/cloud-credential/azure.vue +4 -17
  28. package/cloud-credential/generic.vue +18 -9
  29. package/cloud-credential/harvester.vue +11 -3
  30. package/components/AlertTable.vue +17 -7
  31. package/components/AppModal.vue +167 -0
  32. package/components/AssignTo.vue +7 -4
  33. package/components/AsyncButton.vue +27 -5
  34. package/components/BackLink.vue +4 -4
  35. package/components/BannerGraphic.vue +1 -0
  36. package/components/BrandImage.vue +47 -1
  37. package/components/Carousel.vue +15 -8
  38. package/components/Certificates.vue +161 -0
  39. package/components/ClusterBadge.vue +12 -3
  40. package/components/ClusterIconMenu.vue +55 -12
  41. package/components/ClusterProviderIcon.vue +14 -3
  42. package/components/CodeMirror.vue +111 -17
  43. package/components/CommunityLinks.vue +12 -8
  44. package/components/CopyCode.vue +6 -2
  45. package/components/CopyToClipboard.vue +2 -1
  46. package/components/CopyToClipboardText.vue +14 -9
  47. package/components/CreateDriver.vue +81 -0
  48. package/components/CruResource.vue +52 -27
  49. package/components/DetailTop.vue +2 -2
  50. package/components/Dialog.vue +6 -5
  51. package/components/DisableAuthProviderModal.vue +14 -8
  52. package/components/DraggableZone.vue +2 -2
  53. package/components/EtcdInfoBanner.vue +5 -5
  54. package/components/ExplorerMembers.vue +3 -3
  55. package/components/ExplorerProjectsNamespaces.vue +31 -7
  56. package/components/FixedBanner.vue +48 -36
  57. package/components/GlobalRoleBindings.vue +26 -0
  58. package/components/GrafanaDashboard.vue +6 -4
  59. package/components/IconOrSvg.vue +1 -1
  60. package/components/Import.vue +10 -6
  61. package/components/Inactivity.vue +1 -5
  62. package/components/KeyValueView.vue +14 -10
  63. package/components/Markdown.vue +16 -12
  64. package/components/MessageLink.vue +2 -2
  65. package/components/ModalWithCard.vue +5 -8
  66. package/components/MoveModal.vue +35 -33
  67. package/components/PodSecurityAdmission.vue +3 -3
  68. package/components/PromptChangePassword.vue +33 -33
  69. package/components/PromptModal.vue +11 -21
  70. package/components/PromptRemove.vue +12 -17
  71. package/components/PromptRestore.vue +18 -16
  72. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  73. package/components/Questions/__tests__/Float.test.ts +9 -19
  74. package/components/Questions/__tests__/Int.test.ts +9 -19
  75. package/components/Questions/__tests__/String.test.ts +9 -19
  76. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  77. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  78. package/components/Questions/index.vue +19 -3
  79. package/components/ResourceCancelModal.vue +34 -29
  80. package/components/ResourceDetail/Masthead.vue +48 -16
  81. package/components/ResourceDetail/index.vue +6 -4
  82. package/components/ResourceList/Masthead.vue +10 -9
  83. package/components/ResourceList/index.vue +65 -14
  84. package/components/ResourceTable.vue +87 -21
  85. package/components/ResourceYaml.vue +35 -5
  86. package/components/SelectIconGrid.vue +3 -3
  87. package/components/SideNav.vue +50 -94
  88. package/components/SingleClusterInfo.vue +4 -4
  89. package/components/SortableTable/THead.vue +33 -21
  90. package/components/SortableTable/filtering.js +9 -1
  91. package/components/SortableTable/grouping.js +8 -1
  92. package/components/SortableTable/index.vue +143 -44
  93. package/components/SortableTable/paging.js +36 -7
  94. package/components/SortableTable/selection.js +2 -1
  95. package/components/SortableTable/sorting.js +24 -7
  96. package/components/StatusTable.vue +5 -1
  97. package/components/Tabbed/index.vue +18 -1
  98. package/components/TableDataUserIcon.vue +47 -0
  99. package/components/TypeDescription.vue +1 -0
  100. package/components/Wizard.vue +1 -0
  101. package/components/YamlEditor.vue +1 -0
  102. package/components/__tests__/AppModal.test.ts +98 -0
  103. package/components/__tests__/AsyncButton.test.ts +1 -3
  104. package/components/__tests__/BackLink.test.ts +1 -1
  105. package/components/__tests__/ButtonGroup.test.ts +3 -6
  106. package/components/__tests__/Carousel.test.ts +43 -0
  107. package/components/__tests__/Certificates.test.ts +29 -0
  108. package/components/__tests__/CodeMirror.test.ts +87 -0
  109. package/components/__tests__/CopyCode.test.ts +5 -4
  110. package/components/__tests__/CruResource.test.ts +10 -9
  111. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  112. package/components/__tests__/FixedBanner.test.ts +5 -20
  113. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  114. package/components/__tests__/TabTitle.test.ts +129 -0
  115. package/components/auth/AzureWarning.vue +2 -2
  116. package/components/auth/RoleDetailEdit.vue +10 -0
  117. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  118. package/components/auth/login/oidc.vue +7 -1
  119. package/components/fleet/FleetBundles.vue +5 -11
  120. package/components/fleet/FleetClusters.vue +9 -9
  121. package/components/fleet/FleetIntro.vue +11 -17
  122. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  123. package/components/fleet/FleetRepos.vue +63 -27
  124. package/components/fleet/FleetResources.vue +6 -1
  125. package/components/fleet/FleetStatus.vue +3 -3
  126. package/components/fleet/FleetSummary.vue +35 -30
  127. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  128. package/components/fleet/__tests__/FleetSummary.test.ts +316 -0
  129. package/components/form/ArrayList.vue +22 -18
  130. package/components/form/ArrayListSelect.vue +5 -0
  131. package/components/form/BannerSettings.vue +3 -0
  132. package/components/form/ClusterAppearance.vue +132 -0
  133. package/components/form/ColorInput.vue +1 -0
  134. package/components/form/Error.vue +3 -3
  135. package/components/form/FileSelector.vue +1 -0
  136. package/components/form/Footer.vue +2 -2
  137. package/components/form/GitPicker.vue +83 -38
  138. package/components/form/KeyValue.vue +70 -48
  139. package/components/form/LabeledSelect.vue +145 -41
  140. package/components/form/Labels.vue +3 -1
  141. package/components/form/NameNsDescription.vue +26 -9
  142. package/components/form/Password.vue +3 -1
  143. package/components/form/ResourceLabeledSelect.vue +187 -0
  144. package/components/form/ResourceTabs/index.vue +31 -15
  145. package/components/form/SecretSelector.vue +93 -18
  146. package/components/form/SelectOrCreateAuthSecret.vue +132 -59
  147. package/components/form/SimpleSecretSelector.vue +88 -28
  148. package/components/form/Taints.vue +13 -7
  149. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  150. package/components/form/__tests__/KeyValue.test.ts +120 -11
  151. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  152. package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +25 -15
  153. package/components/form/__tests__/Taints.test.ts +70 -0
  154. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  155. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  156. package/components/formatter/AppSummaryGraph.vue +2 -2
  157. package/components/formatter/Checked.vue +11 -3
  158. package/components/formatter/CloudCredPublicData.vue +30 -0
  159. package/components/formatter/ClusterLink.vue +2 -2
  160. package/components/formatter/ClusterProvider.vue +1 -18
  161. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  162. package/components/formatter/FleetSummaryGraph.vue +25 -12
  163. package/components/formatter/ImagePercentageBar.vue +0 -4
  164. package/components/formatter/IngressTarget.vue +18 -7
  165. package/components/formatter/Link.vue +2 -2
  166. package/components/formatter/LinkDetail.vue +2 -2
  167. package/components/formatter/LinkDetailImage.vue +2 -2
  168. package/components/formatter/LinkName.vue +2 -2
  169. package/components/formatter/LiveDuration.vue +1 -1
  170. package/components/formatter/PercentageBar.vue +1 -1
  171. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  172. package/components/formatter/SecretType.vue +2 -2
  173. package/components/formatter/VirtualServiceGateways.vue +2 -2
  174. package/components/formatter/WorkloadDetailEndpoints.vue +12 -22
  175. package/components/formatter/__tests__/Checked.test.ts +19 -0
  176. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  177. package/components/formatter/__tests__/WorkloadDetailEndpoints.test.ts +81 -0
  178. package/components/nav/Group.vue +9 -7
  179. package/components/nav/Header.vue +85 -46
  180. package/components/nav/Jump.vue +19 -9
  181. package/components/nav/NamespaceFilter.vue +8 -1
  182. package/components/nav/TopLevelMenu.vue +392 -136
  183. package/components/nav/Type.vue +71 -106
  184. package/components/nav/WindowManager/ContainerLogs.vue +120 -19
  185. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  186. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  187. package/components/nav/WindowManager/index.vue +11 -10
  188. package/components/nav/__tests__/TopLevelMenu.test.ts +400 -6
  189. package/components/nav/__tests__/Type.test.ts +322 -97
  190. package/components/nuxt/nuxt-child.js +9 -78
  191. package/components/nuxt/nuxt-error.vue +1 -1
  192. package/components/nuxt/nuxt-link.client.js +13 -95
  193. package/{layouts → components/templates}/blank.vue +1 -1
  194. package/{layouts → components/templates}/default.vue +11 -101
  195. package/{layouts → components/templates}/error.vue +13 -26
  196. package/{layouts → components/templates}/home.vue +4 -1
  197. package/{layouts → components/templates}/plain.vue +4 -1
  198. package/{layouts → components/templates}/standalone.vue +1 -5
  199. package/{layouts → components/templates}/unauthenticated.vue +2 -3
  200. package/composables/useCompactInput.test.ts +36 -0
  201. package/composables/useCompactInput.ts +20 -0
  202. package/composables/useLabeledFormElement.test.ts +135 -0
  203. package/composables/useLabeledFormElement.ts +138 -0
  204. package/config/harvester-manager-types.js +2 -0
  205. package/config/home-links.js +2 -1
  206. package/config/labels-annotations.js +2 -1
  207. package/config/middleware.js +0 -6
  208. package/config/pagination-table-headers.js +57 -0
  209. package/config/pod-security-admission.ts +1 -1
  210. package/config/private-label.js +21 -1
  211. package/config/product/auth.js +1 -0
  212. package/config/product/explorer.js +166 -45
  213. package/config/product/fleet.js +6 -1
  214. package/config/product/legacy.js +2 -11
  215. package/config/product/manager.js +51 -25
  216. package/config/query-params.js +2 -0
  217. package/config/roles.ts +23 -0
  218. package/config/router/index.js +23 -0
  219. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  220. package/config/router/navigation-guards/authentication.js +63 -0
  221. package/config/router/navigation-guards/i18n.js +13 -0
  222. package/config/router/navigation-guards/index.js +16 -0
  223. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  224. package/config/router/routes.js +487 -0
  225. package/config/settings.ts +31 -2
  226. package/config/store.js +8 -4
  227. package/config/system-namespaces.js +3 -0
  228. package/config/table-headers.js +66 -1
  229. package/config/types.js +35 -20
  230. package/config/uiplugins.js +10 -5
  231. package/core/plugin-helpers.js +4 -6
  232. package/core/plugin-routes.ts +56 -114
  233. package/core/plugin.ts +18 -11
  234. package/core/plugins-loader.js +7 -9
  235. package/core/plugins.js +289 -285
  236. package/core/types-provisioning.ts +7 -0
  237. package/creators/app/app.package.json +2 -1
  238. package/creators/app/files/.eslintignore +0 -2
  239. package/creators/app/files/.gitlab-ci.yml +14 -0
  240. package/creators/app/files/.vscode/settings.json +0 -1
  241. package/creators/app/init +19 -0
  242. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  243. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  244. package/creators/pkg/init +32 -0
  245. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +119 -0
  246. package/detail/__tests__/service.test.ts +62 -0
  247. package/detail/catalog.cattle.io.app.vue +1 -1
  248. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  249. package/detail/fleet.cattle.io.bundle.vue +1 -1
  250. package/detail/fleet.cattle.io.cluster.vue +11 -1
  251. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  252. package/detail/namespace.vue +2 -2
  253. package/detail/networking.k8s.io.ingress.vue +52 -19
  254. package/detail/node.vue +22 -3
  255. package/detail/provisioning.cattle.io.cluster.vue +31 -13
  256. package/detail/service.vue +1 -1
  257. package/detail/workload/index.vue +1 -0
  258. package/dialog/AddCustomBadgeDialog.vue +318 -161
  259. package/dialog/DeactivateDriverDialog.vue +137 -0
  260. package/dialog/RollbackWorkloadDialog.vue +2 -2
  261. package/dialog/RotateCertificatesDialog.vue +0 -21
  262. package/dialog/ScaleMachineDownDialog.vue +34 -17
  263. package/directives/clean-html.js +15 -0
  264. package/directives/clean-tooltip.js +32 -0
  265. package/directives/focus.js +41 -0
  266. package/directives/int-number.js +21 -0
  267. package/directives/positive-int-number.js +19 -0
  268. package/directives/trim-whitespace.js +19 -0
  269. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  270. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  271. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  272. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  273. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  274. package/edit/__tests__/nodeDriver.test.ts +107 -0
  275. package/edit/__tests__/service.test.ts +85 -0
  276. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  277. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  278. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  279. package/edit/auth/__tests__/azuread.test.ts +241 -0
  280. package/edit/auth/__tests__/oidc.test.ts +137 -0
  281. package/edit/auth/azuread.vue +133 -31
  282. package/edit/auth/github.vue +5 -17
  283. package/edit/auth/googleoauth.vue +6 -23
  284. package/edit/auth/ldap/index.vue +5 -17
  285. package/edit/auth/oidc.vue +143 -42
  286. package/edit/auth/saml.vue +5 -14
  287. package/edit/catalog.cattle.io.clusterrepo.vue +177 -9
  288. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  289. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  290. package/edit/cloudcredential.vue +28 -4
  291. package/edit/configmap.vue +10 -4
  292. package/edit/fleet.cattle.io.gitrepo.vue +3 -1
  293. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  294. package/edit/kontainerDriver.vue +65 -0
  295. package/edit/logging-flow/Match.vue +10 -9
  296. package/edit/logging-flow/index.vue +4 -19
  297. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  298. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  299. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  300. package/edit/management.cattle.io.project.vue +3 -53
  301. package/edit/management.cattle.io.setting.vue +52 -2
  302. package/edit/management.cattle.io.user.vue +2 -1
  303. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  304. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  305. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +1 -1
  306. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +2 -2
  307. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +1 -1
  308. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +15 -3
  309. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +4 -1
  310. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  311. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  312. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  313. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  314. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  315. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  316. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +46 -7
  317. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +1 -1
  318. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  319. package/edit/nodeDriver.vue +65 -0
  320. package/edit/persistentvolume/index.vue +2 -2
  321. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +33 -16
  322. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +276 -0
  323. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  324. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +3 -0
  325. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  326. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  327. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  328. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +77 -13
  329. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +391 -0
  330. package/edit/provisioning.cattle.io.cluster/import.vue +4 -4
  331. package/edit/provisioning.cattle.io.cluster/index.vue +126 -51
  332. package/edit/provisioning.cattle.io.cluster/rke2.vue +325 -791
  333. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  334. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +217 -0
  335. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +123 -129
  336. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  337. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  338. package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +1 -0
  339. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  340. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +190 -0
  341. package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +3 -0
  342. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +148 -0
  343. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  344. package/edit/resources.cattle.io.backup.vue +139 -124
  345. package/edit/resources.cattle.io.restore.vue +146 -126
  346. package/edit/service.vue +13 -0
  347. package/edit/serviceaccount.vue +46 -4
  348. package/edit/token.vue +3 -1
  349. package/edit/workload/Upgrading.vue +3 -2
  350. package/edit/workload/__tests__/Job.test.ts +1 -3
  351. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  352. package/edit/workload/index.vue +2 -1
  353. package/edit/workload/mixins/workload.js +35 -2
  354. package/edit/workload/storage/emptyDir.vue +2 -2
  355. package/initialize/App.vue +75 -0
  356. package/initialize/app-extended.js +128 -0
  357. package/initialize/entry-helpers.js +546 -0
  358. package/initialize/entry.js +32 -0
  359. package/initialize/install-components.js +23 -0
  360. package/initialize/install-directives.js +59 -0
  361. package/initialize/install-plugins.js +123 -0
  362. package/list/__tests__/workload.test.ts +1 -1
  363. package/list/catalog.cattle.io.app.vue +1 -0
  364. package/list/cis.cattle.io.clusterscan.vue +16 -10
  365. package/list/group.principal.vue +2 -2
  366. package/list/management.cattle.io.feature.vue +16 -16
  367. package/list/management.cattle.io.setting.vue +1 -0
  368. package/list/management.cattle.io.user.vue +13 -4
  369. package/list/networking.k8s.io.ingress.vue +36 -0
  370. package/list/node.vue +212 -73
  371. package/list/provisioning.cattle.io.cluster.vue +17 -4
  372. package/list/ui.cattle.io.navlink.vue +2 -2
  373. package/list/workload.vue +22 -0
  374. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  375. package/machine-config/__tests__/vmwarevsphere.test.ts +1 -3
  376. package/machine-config/amazonec2.vue +1 -1
  377. package/machine-config/azure.vue +2 -1
  378. package/machine-config/generic.vue +11 -15
  379. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  380. package/machine-config/vmwarevsphere.vue +31 -27
  381. package/middleware/authenticated.js +23 -399
  382. package/mixins/__tests__/chart.test.ts +48 -6
  383. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  384. package/mixins/auth-config.js +5 -9
  385. package/mixins/brand.js +102 -96
  386. package/mixins/chart.js +27 -13
  387. package/mixins/create-edit-view/index.js +2 -2
  388. package/mixins/fetch.client.js +42 -48
  389. package/mixins/labeled-form-element.ts +27 -2
  390. package/mixins/page-actions.js +7 -5
  391. package/mixins/resource-fetch-api-pagination.js +304 -0
  392. package/mixins/resource-fetch-namespaced.js +1 -1
  393. package/mixins/resource-fetch.js +46 -5
  394. package/models/__tests__/cluster.test.ts +44 -0
  395. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  396. package/models/__tests__/management.cattle.io.cluster.test.ts +23 -0
  397. package/models/__tests__/management.cattle.io.node.ts +85 -0
  398. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  399. package/models/__tests__/namespace.test.ts +49 -9
  400. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +241 -0
  401. package/models/__tests__/schema.tests.ts +24 -0
  402. package/models/__tests__/secret.test.ts +37 -0
  403. package/models/__tests__/steve-schema.test.ts +73 -0
  404. package/models/__tests__/storage.k8s.io.storageclass.test.ts +22 -0
  405. package/models/__tests__/workload.test.ts +91 -0
  406. package/models/catalog.cattle.io.app.js +8 -0
  407. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  408. package/models/catalog.cattle.io.uiplugin.js +7 -8
  409. package/models/cis.cattle.io.clusterscan.js +29 -8
  410. package/models/cloudcredential.js +9 -1
  411. package/models/cluster/node.js +8 -4
  412. package/models/cluster/schema.js +6 -0
  413. package/models/cluster.js +33 -0
  414. package/models/cluster.x-k8s.io.machine.js +1 -1
  415. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  416. package/models/driver.js +63 -0
  417. package/models/fleet.cattle.io.cluster.js +27 -11
  418. package/models/fleet.cattle.io.gitrepo.js +66 -13
  419. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  420. package/models/kontainerdriver.js +85 -0
  421. package/models/management/schema.js +6 -0
  422. package/models/management.cattle.io.authconfig.js +3 -2
  423. package/models/management.cattle.io.cluster.js +16 -7
  424. package/models/management.cattle.io.globalrole.js +2 -0
  425. package/models/management.cattle.io.kontainerdriver.js +1 -0
  426. package/models/management.cattle.io.node.js +18 -14
  427. package/models/management.cattle.io.nodepool.js +17 -0
  428. package/models/management.cattle.io.project.js +0 -36
  429. package/models/management.cattle.io.setting.js +11 -7
  430. package/models/management.cattle.io.user.js +2 -2
  431. package/models/monitoring.coreos.com.receiver.js +3 -1
  432. package/models/monitoring.coreos.com.route.js +1 -1
  433. package/models/namespace.js +1 -1
  434. package/models/networking.k8s.io.ingress.js +2 -1
  435. package/models/nodedriver.js +85 -0
  436. package/models/pod.js +20 -0
  437. package/models/provisioning.cattle.io.cluster.js +125 -10
  438. package/models/schema.js +28 -7
  439. package/models/secret.js +126 -18
  440. package/models/service.js +2 -0
  441. package/models/steve-schema.ts +254 -0
  442. package/models/storage.k8s.io.storageclass.js +1 -1
  443. package/models/workload.js +17 -0
  444. package/models/workload.service.js +18 -0
  445. package/package.json +18 -14
  446. package/pages/about.vue +12 -6
  447. package/pages/account/create-key.vue +0 -1
  448. package/pages/account/index.vue +7 -3
  449. package/pages/auth/login.vue +106 -103
  450. package/pages/auth/logout.vue +2 -4
  451. package/pages/auth/setup.vue +92 -66
  452. package/pages/auth/verify.vue +30 -24
  453. package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +2 -17
  454. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  455. package/pages/c/_cluster/apps/charts/index.vue +99 -69
  456. package/pages/c/_cluster/apps/charts/install.helpers.js +2 -13
  457. package/pages/c/_cluster/apps/charts/install.vue +12 -11
  458. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  459. package/pages/c/_cluster/auth/config/index.vue +15 -9
  460. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  461. package/pages/c/_cluster/ecm/index.vue +0 -2
  462. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  463. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  464. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  465. package/pages/c/_cluster/explorer/index.vue +253 -91
  466. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  467. package/pages/c/_cluster/explorer/tools/index.vue +10 -6
  468. package/pages/c/_cluster/fleet/index.vue +89 -94
  469. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  470. package/pages/c/_cluster/longhorn/index.vue +52 -17
  471. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  472. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  473. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  474. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +91 -0
  475. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  476. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  477. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +60 -0
  478. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  479. package/pages/c/_cluster/manager/pages/_page.vue +4 -5
  480. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  481. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  482. package/pages/c/_cluster/neuvector/index.vue +1 -0
  483. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  484. package/pages/c/_cluster/settings/banners.vue +86 -10
  485. package/pages/c/_cluster/settings/brand.vue +261 -38
  486. package/pages/c/_cluster/settings/index.vue +4 -6
  487. package/pages/c/_cluster/settings/links.vue +3 -2
  488. package/pages/c/_cluster/settings/performance.vue +71 -3
  489. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  490. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +12 -8
  491. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  492. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  493. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  494. package/pages/c/_cluster/uiplugins/InstallDialog.vue +55 -19
  495. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  496. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  497. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  498. package/pages/c/_cluster/uiplugins/index.vue +38 -54
  499. package/pages/diagnostic.vue +2 -2
  500. package/pages/fail-whale.vue +103 -42
  501. package/pages/home.vue +81 -24
  502. package/pages/prefs.vue +8 -4
  503. package/pages/support/index.vue +14 -10
  504. package/pkg/auto-import.js +1 -1
  505. package/plugins/axios.js +0 -36
  506. package/plugins/back-button.js +3 -5
  507. package/plugins/clean-html-directive.js +5 -30
  508. package/plugins/clean-html.js +53 -0
  509. package/plugins/clean-tooltip-directive.js +6 -31
  510. package/plugins/codemirror-loader.js +1 -1
  511. package/plugins/codemirror.js +41 -9
  512. package/plugins/dashboard-store/__tests__/mutations.test.ts +389 -0
  513. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  514. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  515. package/plugins/dashboard-store/actions.js +132 -25
  516. package/plugins/dashboard-store/classify.js +1 -18
  517. package/plugins/dashboard-store/getters.js +154 -44
  518. package/plugins/dashboard-store/index.js +0 -111
  519. package/plugins/dashboard-store/mutations.js +150 -52
  520. package/plugins/dashboard-store/resource-class.js +77 -127
  521. package/plugins/directives.js +6 -39
  522. package/plugins/ember-cookie.js +13 -0
  523. package/plugins/global-formatters.js +26 -5
  524. package/plugins/i18n.js +89 -55
  525. package/plugins/int-number.js +6 -20
  526. package/plugins/plugin.js +3 -3
  527. package/plugins/positive-int-number.js +6 -17
  528. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +81 -10
  529. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  530. package/plugins/steve/__tests__/resource-utils.test.ts +159 -0
  531. package/plugins/steve/__tests__/steve-class.test.ts +59 -0
  532. package/plugins/steve/__tests__/subscribe.spec.ts +4 -1
  533. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  534. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  535. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  536. package/plugins/steve/actions.js +3 -38
  537. package/plugins/steve/getters.js +164 -61
  538. package/plugins/steve/hybrid-class.js +5 -1
  539. package/plugins/steve/mutations.js +24 -3
  540. package/plugins/steve/norman-class.js +142 -2
  541. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  542. package/plugins/steve/resource-utils.ts +38 -0
  543. package/plugins/steve/schema.d.ts +22 -0
  544. package/plugins/steve/steve-class.js +22 -0
  545. package/plugins/steve/steve-pagination-utils.ts +368 -0
  546. package/plugins/steve/subscribe.js +17 -76
  547. package/plugins/trim-whitespace.js +6 -34
  548. package/plugins/vue-js-modal.js +1 -1
  549. package/promptRemove/pod.vue +15 -7
  550. package/public/index.html +1 -0
  551. package/rancher-components/Accordion/Accordion.test.ts +45 -0
  552. package/rancher-components/Accordion/Accordion.vue +86 -0
  553. package/rancher-components/Accordion/index.ts +1 -0
  554. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  555. package/rancher-components/Banner/Banner.test.ts +1 -5
  556. package/rancher-components/Banner/Banner.vue +2 -2
  557. package/rancher-components/Card/Card.vue +4 -4
  558. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  559. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  560. package/rancher-components/Form/LabeledInput/LabeledInput.vue +57 -24
  561. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  562. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  563. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  564. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  565. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  566. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  567. package/rancher-components/StringList/StringList.test.ts +270 -0
  568. package/rancher-components/StringList/StringList.vue +65 -26
  569. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +69 -0
  570. package/scripts/clean +1 -1
  571. package/scripts/extension/bundle +19 -7
  572. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  573. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  574. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  575. package/scripts/extension/helm/package/Dockerfile +1 -1
  576. package/scripts/extension/helm/scripts/package +11 -3
  577. package/scripts/extension/helm/scripts/patch +27 -0
  578. package/scripts/extension/parse-tag-name +4 -4
  579. package/scripts/extension/publish +25 -14
  580. package/scripts/publish-shell.sh +11 -1
  581. package/scripts/serve-pkgs +0 -2
  582. package/scripts/test-plugins-build.sh +87 -11
  583. package/scripts/vue-migrate.js +683 -0
  584. package/server/har-file.js +183 -0
  585. package/store/__tests__/catalog.test.ts +224 -0
  586. package/store/__tests__/type-map.test.ts +1122 -0
  587. package/store/auth.js +23 -4
  588. package/store/aws.js +53 -6
  589. package/store/catalog.js +22 -6
  590. package/store/cru-resource.ts +26 -0
  591. package/store/customisation.js +35 -0
  592. package/store/features.js +7 -4
  593. package/store/i18n.js +11 -0
  594. package/store/index.js +140 -49
  595. package/store/plugins.js +8 -4
  596. package/store/prefs.js +33 -38
  597. package/store/type-map.js +288 -213
  598. package/store/type-map.utils.ts +226 -0
  599. package/tsconfig.json +34 -9
  600. package/tsconfig.paths.json +21 -0
  601. package/types/components/labeledSelect.ts +50 -0
  602. package/types/resources/settings.d.ts +32 -0
  603. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  604. package/types/shell/index.d.ts +1045 -770
  605. package/types/store/dashboard-store.types.ts +42 -0
  606. package/types/store/pagination.types.ts +457 -0
  607. package/types/store/type-map.ts +30 -0
  608. package/types/store/vuex.d.ts +9 -0
  609. package/types/vue-shim.d.ts +51 -0
  610. package/utils/__tests__/cluster.test.ts +20 -18
  611. package/utils/__tests__/create-yaml.test.ts +359 -2
  612. package/utils/__tests__/kontainer.test.ts +180 -0
  613. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  614. package/utils/alertmanagerconfig.js +19 -0
  615. package/utils/array.ts +40 -1
  616. package/utils/async.ts +2 -0
  617. package/utils/auth.js +152 -4
  618. package/utils/axios.js +2 -21
  619. package/utils/azure.js +24 -0
  620. package/utils/banners.js +103 -0
  621. package/utils/clipboard.js +5 -0
  622. package/utils/cluster.js +1 -1
  623. package/utils/config.js +4 -0
  624. package/utils/create-yaml.js +59 -28
  625. package/utils/custom-validators.js +0 -2
  626. package/utils/error.js +41 -1
  627. package/utils/formatter.js +5 -3
  628. package/utils/git.ts +1 -1
  629. package/utils/install-redirect.js +1 -1
  630. package/utils/kontainer.ts +190 -0
  631. package/utils/object.js +24 -0
  632. package/utils/pagination-utils.ts +154 -0
  633. package/utils/pod-security-admission.ts +1 -1
  634. package/utils/router.js +86 -0
  635. package/utils/settings.ts +46 -0
  636. package/utils/time.js +2 -1
  637. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  638. package/utils/url.ts +1 -1
  639. package/utils/validators/formRules/__tests__/index.test.ts +70 -4
  640. package/utils/validators/formRules/index.ts +15 -9
  641. package/utils/validators/index.js +1 -0
  642. package/utils/validators/setting.js +6 -10
  643. package/utils/version.js +2 -1
  644. package/vue.config.js +377 -401
  645. package/.DS_Store +0 -0
  646. package/assets/images/providers/aks-black.svg +0 -28
  647. package/assets/images/providers/aks.svg +0 -31
  648. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  649. package/components/ChartPsp.vue +0 -76
  650. package/components/EventsTable.vue +0 -67
  651. package/components/TabbedLinks/index.vue +0 -94
  652. package/components/__tests__/ChartPsp.test.ts +0 -75
  653. package/components/formatter/__tests__/ClusterProvider.test.ts +0 -28
  654. package/components/nuxt/nuxt-link.server.js +0 -16
  655. package/components/nuxt/nuxt.js +0 -101
  656. package/config/router.js +0 -408
  657. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -237
  658. package/initialize/App.js +0 -198
  659. package/initialize/client.js +0 -875
  660. package/initialize/index.js +0 -364
  661. package/initialize/layouts.ts +0 -26
  662. package/middleware/i18n.js +0 -10
  663. package/middleware/unauthenticated.js +0 -22
  664. package/mixins/fetch.server.js +0 -73
  665. package/pages/c/_cluster/apps/index.vue +0 -17
  666. package/pages/c/_cluster/auth/index.vue +0 -19
  667. package/pages/c/_cluster/index.vue +0 -17
  668. package/pages/c/_cluster/legacy/index.vue +0 -22
  669. package/pages/c/_cluster/manager/index.vue +0 -22
  670. package/pages/c/_cluster/mcapps/index.vue +0 -21
  671. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  672. package/pages/c/index.vue +0 -9
  673. package/pages/rio/mesh.vue +0 -508
  674. package/plugins/dashboard-store/__tests__/mutations.spec.ts +0 -406
  675. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  676. package/plugins/portal-vue.js +0 -4
  677. package/plugins/portal.js +0 -4
  678. package/plugins/resize.js +0 -5
  679. package/plugins/shortkey.js +0 -4
  680. package/plugins/tooltip.js +0 -4
  681. package/plugins/transitions.js +0 -4
  682. package/plugins/v-select.js +0 -4
  683. package/plugins/vue-clipboard2.js +0 -4
  684. package/tsconfig.default.json +0 -46
  685. package/utils/group.js +0 -70
  686. package/utils/nuxt.js +0 -659
  687. package/utils/router.scrollBehavior.js +0 -80
  688. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  689. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  690. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  691. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  692. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  693. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  694. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  695. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  696. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
  697. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  698. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  699. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
@@ -0,0 +1,304 @@
1
+ import { NAMESPACE_FILTER_NAMESPACED_YES, NAMESPACE_FILTER_NAMESPACED_NO, NAMESPACE_FILTER_ALL } from '@shell/utils/namespace-filter';
2
+ import { NAMESPACE } from '@shell/config/types';
3
+ import { ALL_NAMESPACES } from '@shell/store/prefs';
4
+ import { mapGetters } from 'vuex';
5
+ import { ResourceListComponentName } from '../components/ResourceList/resource-list.config';
6
+ import paginationUtils from '@shell/utils/pagination-utils';
7
+ import debounce from 'lodash/debounce';
8
+ import { PaginationParamFilter, PaginationFilterField, PaginationArgs } from '@shell/types/store/pagination.types';
9
+ import stevePaginationUtils from '@shell/plugins/steve/steve-pagination-utils';
10
+
11
+ /**
12
+ * Companion mixin used with `resource-fetch` for `ResourceList` to determine if the user needs to filter the list by a single namespace
13
+ */
14
+ export default {
15
+
16
+ data() {
17
+ return {
18
+ forceUpdateLiveAndDelayed: 0,
19
+ /**
20
+ * This of type `OptPagination`
21
+ */
22
+ pPagination: null,
23
+ // Avoid scenarios where namespace is updated just before other pagination changes come in
24
+ debouncedSetPagination: debounce(this.setPagination, 50),
25
+
26
+ /**
27
+ * Apply these additional filters given the ns / project header selection
28
+ */
29
+ requestFilters: {
30
+ filters: [],
31
+ projectsOrNamespaces: [],
32
+ },
33
+ };
34
+ },
35
+
36
+ methods: {
37
+ /**
38
+ * @param {PaginationArgs} pagination
39
+ */
40
+ setPagination(pagination) {
41
+ if (pagination) {
42
+ this.pPagination = pagination;
43
+ }
44
+ },
45
+
46
+ paginationChanged(event) {
47
+ const searchFilters = event.filter.searchQuery ? event.filter.searchFields.map((field) => new PaginationFilterField({
48
+ field,
49
+ value: event.filter.searchQuery,
50
+ exact: false,
51
+ })) : [];
52
+
53
+ const pagination = new PaginationArgs({
54
+ page: event.page,
55
+ pageSize: event.perPage,
56
+ sort: event.sort?.map((field) => ({
57
+ field,
58
+ asc: !event.descending
59
+ })),
60
+ projectsOrNamespaces: this.requestFilters.projectsOrNamespaces,
61
+ filters: [
62
+ new PaginationParamFilter({ fields: searchFilters }),
63
+ ...this.requestFilters.filters, // Apply the additional filters. these aren't from the user but from ns filtering
64
+ ]
65
+ });
66
+
67
+ this.debouncedSetPagination(pagination);
68
+ },
69
+
70
+ namespaceFilterChanged(neu) {
71
+ if (!this.canPaginate || !this.schema?.attributes?.namespaced) {
72
+ return;
73
+ }
74
+
75
+ const {
76
+ projectsOrNamespaces,
77
+ filters
78
+ } = stevePaginationUtils.createParamsFromNsFilter({
79
+ allNamespaces: this.$store.getters[`${ this.currentProduct?.inStore }/all`](NAMESPACE),
80
+ selection: neu,
81
+ isAllNamespaces: this.isAllNamespaces,
82
+ isLocalCluster: this.$store.getters['currentCluster'].isLocal,
83
+ showDynamicRancherNamespaces: this.showDynamicRancherNamespaces,
84
+ productHidesSystemNamespaces: this.productHidesSystemNamespaces,
85
+ });
86
+
87
+ this.requestFilters.filters = filters;
88
+ this.requestFilters.projectsOrNamespaces = projectsOrNamespaces;
89
+
90
+ // Kick off a change
91
+ if (this.pPagination) {
92
+ this.debouncedSetPagination({ ...this.pPagination });
93
+ }
94
+ },
95
+
96
+ /**
97
+ * @param {PaginationArgs} neu
98
+ * @param {PaginationArgs} old
99
+ */
100
+ paginationEqual(neu, old) {
101
+ if (!neu.page) {
102
+ // Not valid, count as not equal
103
+ return false;
104
+ }
105
+
106
+ if (paginationUtils.paginationEqual(neu, old)) {
107
+ return true;
108
+ }
109
+
110
+ return false;
111
+ }
112
+ },
113
+
114
+ computed: {
115
+ ...mapGetters(['currentProduct', 'isAllNamespaces']),
116
+
117
+ /**
118
+ * Why is this a specific getter and not not in mapGetters?
119
+ *
120
+ * Adding it to mapGetters means the kubewarden unit tests fail as they don't mock it....
121
+ */
122
+ namespaceFilters() {
123
+ return this.$store.getters['namespaceFilters'];
124
+ },
125
+
126
+ /**
127
+ * Does the user need to update the filter to supply valid options?
128
+ */
129
+ paginationNsFilterRequired() {
130
+ return this.canPaginate && !this.__validPaginationNsFilter;
131
+ },
132
+
133
+ /**
134
+ * Check if the Project/Namespace filter from the header contains a valid ns / project filter
135
+ */
136
+ __validPaginationNsFilter() {
137
+ return paginationUtils.validateNsProjectFilters(this.namespaceFilters);
138
+ },
139
+
140
+ /**
141
+ * ResourceList imports resource-fetch --> this mixin
142
+ * When there is no custom list this is fine (ResourceList with mixins --> ResourceTable)
143
+ * When there is a custom list there are two instances of this mixin (ResourceList with mixins --> CustomList with mixins --> ResourceTable)
144
+ * - In this scenario, reduce churn by exiting earlier if mixin is from parent ResourceList and leave work for CustomList mixins
145
+ */
146
+ isResourceList() {
147
+ return !!this.hasListComponent;
148
+ },
149
+
150
+ /**
151
+ * Is Pagination supported and has the table supplied pagination settings from the table?
152
+ */
153
+ pagination() {
154
+ if (this.isResourceList) {
155
+ return;
156
+ }
157
+
158
+ return this.canPaginate ? this.pPagination : '';
159
+ },
160
+
161
+ /**
162
+ * Should this list be paginated via API?
163
+ */
164
+ canPaginate() {
165
+ if (this.isResourceList) {
166
+ return;
167
+ }
168
+
169
+ return this.resource && this.$store.getters[`${ this.currentProduct?.inStore }/paginationEnabled`]?.(this.resource.id || this.resource);
170
+ },
171
+
172
+ paginationResult() {
173
+ if (this.isResourceList || !this.canPaginate) {
174
+ return;
175
+ }
176
+
177
+ return this.havePaginated?.result;
178
+ },
179
+
180
+ havePaginated() {
181
+ if (this.isResourceList) {
182
+ return;
183
+ }
184
+
185
+ return this.$store.getters[`${ this.currentProduct?.inStore }/havePage`](this.resource);
186
+ },
187
+
188
+ /**
189
+ * Links to ns.isSystem and covers things like ns with system annotation, hardcoded list, etc
190
+ */
191
+ productHidesSystemNamespaces() {
192
+ return this.currentProduct?.hideSystemResources;
193
+ },
194
+
195
+ /**
196
+ * Links to ns.isObscure and covers things like `c-`, `user-`, etc (see OBSCURE_NAMESPACE_PREFIX)
197
+ */
198
+ showDynamicRancherNamespaces() {
199
+ return this.$store.getters['prefs/get'](ALL_NAMESPACES);
200
+ }
201
+ },
202
+
203
+ watch: {
204
+ /**
205
+ * Monitor the rows to ensure deleting the last entry in a server-side paginated page doesn't
206
+ * result in an empty page
207
+ */
208
+ rows(neu) {
209
+ if (!this.canPaginate || !this.pagination || this.isResourceList) {
210
+ return;
211
+ }
212
+
213
+ if (this.pagination.page > 1 && neu.length === 0) {
214
+ this.setPagination({
215
+ ...this.pagination,
216
+ page: this.pagination.page - 1
217
+ });
218
+ }
219
+ },
220
+
221
+ namespaceFilters: {
222
+ immediate: true,
223
+ async handler(neu, old) {
224
+ if (!this.canPaginate || !this.schema?.attributes?.namespaced) {
225
+ return;
226
+ }
227
+
228
+ if (this.isResourceList) {
229
+ return;
230
+ }
231
+
232
+ // Transitioning from no ns filters to no ns filters should be avoided
233
+ const neuEmpty = !neu || neu.length === 0 || neu[0] === NAMESPACE_FILTER_ALL;
234
+ const oldEmpty = !old || old.length === 0 || old[0] === NAMESPACE_FILTER_ALL;
235
+
236
+ if (neuEmpty && oldEmpty) {
237
+ const allButHidingSystemResources = this.isAllNamespaces && (!this.showDynamicRancherNamespaces || this.productHidesSystemNamespaces);
238
+
239
+ // If we're showing all... and not hiding system or obscure ns then don't go through filter process
240
+ if (!allButHidingSystemResources) {
241
+ return;
242
+ }
243
+ }
244
+
245
+ // Transitioning to a ns filter that doesn't affect the list should be avoided
246
+ if (neu.length === 1) {
247
+ if ([NAMESPACE_FILTER_NAMESPACED_YES, NAMESPACE_FILTER_NAMESPACED_NO].includes(neu[0])) {
248
+ return;
249
+ }
250
+ }
251
+
252
+ this.namespaceFilterChanged(neu);
253
+ }
254
+ },
255
+
256
+ /**
257
+ * When a pagination is required and the user changes page / sort / filter, kick off a new set of API requests
258
+ *
259
+ * @param {StorePaginationResult} neu
260
+ * @param {StorePaginationResult} old
261
+ */
262
+ async pagination(neu, old) {
263
+ if (!this.canPaginate) {
264
+ return;
265
+ }
266
+
267
+ // ResourceList has two modes
268
+ // 1) ResourceList component handles API request to fetch resources
269
+ // 2) Custom list component handles API request to fetch resources
270
+ //
271
+ // This covers case 2, so ignore case 1
272
+ if (this.isResourceList) {
273
+ return;
274
+ }
275
+
276
+ if (neu && this.$options.name !== ResourceListComponentName && !!this.$fetch && !this.paginationEqual(neu, old)) {
277
+ await this.$fetch(false);
278
+ // Ensure any live/delayed columns get updated
279
+ this.forceUpdateLiveAndDelayed = new Date().getTime();
280
+ }
281
+ },
282
+
283
+ /**
284
+ * If the pagination result has changed fetch secondary resources
285
+ *
286
+ * Lists should implement fetchPageSecondaryResources to fetch them
287
+ *
288
+ * @param {StorePaginationResult} neu
289
+ * @param {StorePaginationResult} old
290
+ */
291
+ async paginationResult(neu, old) {
292
+ if (!this.fetchPageSecondaryResources || !neu ) { // || neu.timestamp === old?.timestamp
293
+ return;
294
+ }
295
+
296
+ if (neu.timestamp === old?.timestamp) {
297
+ // This occurs when the user returns to the page... and pagination hasn't actually changed
298
+ return;
299
+ }
300
+
301
+ await this.fetchPageSecondaryResources();
302
+ }
303
+ },
304
+ };
@@ -1,7 +1,7 @@
1
1
  import { NAMESPACE_FILTER_NS_PREFIX, NAMESPACE_FILTER_P_PREFIX } from '@shell/utils/namespace-filter';
2
2
  import { mapGetters } from 'vuex';
3
3
  import { ResourceListComponentName } from '../components/ResourceList/resource-list.config';
4
- import pAndNFiltering from '@shell/utils/projectAndNamespaceFiltering.utils';
4
+ import pAndNFiltering from '@shell/plugins/steve/projectAndNamespaceFiltering.utils';
5
5
 
6
6
  /**
7
7
  * Companion mixin used with `resource-fetch` for `ResourceList` to determine if the user needs to filter the list by a single namespace
@@ -1,14 +1,19 @@
1
+ import Vue from 'vue';
1
2
  import { mapGetters } from 'vuex';
2
3
  import { COUNT, MANAGEMENT } from '@shell/config/types';
3
4
  import { SETTING, DEFAULT_PERF_SETTING } from '@shell/config/settings';
4
5
  import ResourceFetchNamespaced from '@shell/mixins/resource-fetch-namespaced';
6
+ import ResourceFetchApiPagination from '@shell/mixins/resource-fetch-api-pagination';
5
7
 
6
8
  // Number of pages to fetch when loading incrementally
7
9
  const PAGES = 4;
8
10
 
9
11
  export default {
10
12
 
11
- mixins: [ResourceFetchNamespaced],
13
+ mixins: [
14
+ ResourceFetchNamespaced,
15
+ ResourceFetchApiPagination
16
+ ],
12
17
 
13
18
  data() {
14
19
  // fetching the settings related to manual refresh from global settings
@@ -38,8 +43,10 @@ export default {
38
43
  // incremental loading vars
39
44
  incremental: false,
40
45
  fetchedResourceType: [],
46
+ paginating: null,
41
47
  };
42
48
  },
49
+
43
50
  beforeDestroy() {
44
51
  // make sure this only runs once, for the initialized instance
45
52
  if (this.init) {
@@ -64,17 +71,26 @@ export default {
64
71
  }
65
72
  },
66
73
  loading() {
74
+ if (this.canPaginate) {
75
+ return this.paginating;
76
+ }
77
+
67
78
  return this.rows.length ? false : this.$fetchState.pending;
68
79
  },
69
80
  },
81
+
70
82
  watch: {
71
- refreshFlag(neu) {
83
+ async refreshFlag(neu) {
72
84
  // this is where the data assignment will trigger the update of the list view...
73
85
  if (this.init && neu) {
74
- this.$fetch();
86
+ await this.$fetch();
87
+ if (this.canPaginate && this.fetchPageSecondaryResources) {
88
+ this.fetchPageSecondaryResources(true);
89
+ }
75
90
  }
76
91
  }
77
92
  },
93
+
78
94
  methods: {
79
95
  // this defines all the flags needed for the mechanism
80
96
  // to work. They should be defined based on the main list view
@@ -109,6 +125,31 @@ export default {
109
125
  });
110
126
  }
111
127
 
128
+ const schema = this.$store.getters[`${ currStore }/schemaFor`](type);
129
+
130
+ if (this.canPaginate) {
131
+ if (!this.pagination) {
132
+ // This is the initial fetchType made when resource lists are created...
133
+ // when pagination is enabled we want to wait for the correct set of initial pagination settings to make the call
134
+ return;
135
+ }
136
+ const opt = {
137
+ hasManualRefresh: this.hasManualRefresh,
138
+ pagination: { ...this.pagination },
139
+ force: this.paginating !== null // Fix for manual refresh (before ripped out).
140
+ };
141
+
142
+ Vue.set(this, 'paginating', true);
143
+
144
+ const that = this;
145
+
146
+ return this.$store.dispatch(`${ currStore }/findPage`, {
147
+ type,
148
+ opt
149
+ })
150
+ .finally(() => Vue.set(that, 'paginating', false));
151
+ }
152
+
112
153
  let incremental = 0;
113
154
 
114
155
  if (this.incremental) {
@@ -124,8 +165,6 @@ export default {
124
165
  hasManualRefresh: this.hasManualRefresh
125
166
  };
126
167
 
127
- const schema = this.$store.getters[`${ currStore }/schemaFor`](type);
128
-
129
168
  if (schema?.attributes?.namespaced) { // Is this specific resource namespaced (could be primary or secondary resource)?
130
169
  opt.namespaced = this.namespaceFilter; // namespaceFilter will only be populated if applicable for primary resource
131
170
  }
@@ -181,6 +220,8 @@ export default {
181
220
  if (manualDataRefreshEnabled && resourceCount >= manualDataRefreshThreshold) {
182
221
  watch = false;
183
222
  isTooManyItemsToAutoUpdate = true;
223
+ } else if (this.canPaginate) {
224
+ isTooManyItemsToAutoUpdate = true;
184
225
  }
185
226
 
186
227
  // incremental loading check
@@ -0,0 +1,44 @@
1
+ import NormanCluster from '@shell/models/cluster';
2
+
3
+ describe('class NormanCluster', () => {
4
+ const t = jest.fn(() => 'abc');
5
+ const ctx = { rootGetters: { 'i18n/t': t }, dispatch: jest.fn() };
6
+
7
+ it('should return empty arrays of system labels and system annotations if cluster labels and annotations are undefined', () => {
8
+ const cluster = new NormanCluster({}, ctx);
9
+
10
+ expect(cluster.systemLabels).toStrictEqual([]);
11
+ expect(cluster.systemAnnotations).toStrictEqual([]);
12
+ });
13
+
14
+ it('should list all the cluster\'s annotation keys that contain coreos.com, cattle.io, k3s.io, kubernetes.io, or k3s.io', () => {
15
+ const testAnnotations = ['cattle.io/test', 'coreos.com', 'test.cattle.io/something', 'kubernetes.io/test'];
16
+ const cluster = new NormanCluster({
17
+ annotations: {
18
+ 'cattle.io/test': 'abc',
19
+ 'coreos.com': 'abc',
20
+ 'k3s.io/test': 'abc',
21
+ 'test.cattle.io/something': 'abc',
22
+ 'kubernetes.io/test': 'abc',
23
+ 'other-label': 'abc'
24
+ }
25
+ }, ctx);
26
+
27
+ expect(testAnnotations.find((annotation) => !cluster.systemAnnotations.includes(annotation))).toBeUndefined();
28
+ });
29
+
30
+ it('should list all the cluster\'s label keys that contain io.cattle.lifecycle, kubernetes.io, cattle.io, or k3s.io', () => {
31
+ const testLabels = ['cattle.io/test', 'test.io.cattle.lifecycle', 'test.kubernetes.io/test', 'k3s.io/test'];
32
+ const cluster = new NormanCluster({
33
+ labels: {
34
+ 'cattle.io/test': 'abc',
35
+ 'test.io.cattle.lifecycle': 'abc',
36
+ 'k3s.io/test': 'abc',
37
+ 'test.kubernetes.io/test': 'abc',
38
+ 'other-label': 'abc'
39
+ }
40
+ }, ctx);
41
+
42
+ expect(testLabels.find((label) => !cluster.systemLabels.includes(label))).toBeUndefined();
43
+ });
44
+ });
@@ -0,0 +1,36 @@
1
+ import FleetCluster from '@shell/models/fleet.cattle.io.cluster';
2
+
3
+ describe('class FleetCluster', () => {
4
+ it('should provide bundleInfo if correct data is present', () => {
5
+ const fleetCluster = new FleetCluster({
6
+ metadata: {},
7
+ spec: {},
8
+ status: { display: { readyBundles: '0/1' } },
9
+ });
10
+
11
+ expect(fleetCluster.bundleInfo.ready).toBe(0);
12
+ expect(fleetCluster.bundleInfo.total).toBe(1);
13
+ expect(Object.getOwnPropertyNames(fleetCluster.bundleInfo)).not.toContain('noValidData');
14
+ });
15
+ describe('should provide bundleInfo with error', () => {
16
+ it.each([
17
+ [''],
18
+ ['/'],
19
+ ['1/'],
20
+ ['/1'],
21
+ ['1/1/2'],
22
+ ['a/1'],
23
+ ['a/b'],
24
+ ['any-string'],
25
+ ['any-string1/string2']
26
+ ])('with multiple scenarios of wrongful "readyBundles" data', (readyBundles) => {
27
+ const fleetCluster = new FleetCluster({
28
+ metadata: {},
29
+ spec: {},
30
+ status: { display: { readyBundles } },
31
+ });
32
+
33
+ expect(Object.getOwnPropertyNames(fleetCluster.bundleInfo)).toContain('noValidData');
34
+ });
35
+ });
36
+ });
@@ -0,0 +1,23 @@
1
+ import MgmtCluster from '@shell/models/management.cattle.io.cluster';
2
+
3
+ jest.mock('@shell/utils/clipboard', () => {
4
+ return { copyTextToClipboard: jest.fn(() => Promise.resolve({})) };
5
+ });
6
+
7
+ describe('class MgmtCluster', () => {
8
+ describe('provisioner', () => {
9
+ const testCases = [
10
+ [{ provider: 'rke', driver: 'imported' }, 'rke'],
11
+ [{ provider: 'k3s', driver: 'K3S' }, 'k3s'],
12
+ [{ provider: 'aks', driver: 'AKS' }, 'aks'],
13
+ [{}, 'imported'],
14
+ ];
15
+
16
+ it.each(testCases)('should return provisioner value properly based on the props data', (clusterData: Object, expected: String) => {
17
+ const cluster = new MgmtCluster({ status: clusterData });
18
+
19
+ expect(cluster.provisioner).toBe(expected);
20
+ }
21
+ );
22
+ });
23
+ });
@@ -93,4 +93,89 @@ describe('class MgmtNode', () => {
93
93
  resetMocks();
94
94
  });
95
95
  });
96
+
97
+ describe('canScaleDown', () => {
98
+ const mgmtClusterId = 'test';
99
+ const nodeId = 'test/id';
100
+ const specs = {
101
+ worker: {
102
+ worker: true, etcd: false, controlPlane: false
103
+ },
104
+ etcd: {
105
+ worker: false, etcd: true, controlPlane: false
106
+ },
107
+ controlPlane: {
108
+ worker: false, etcd: false, controlPlane: true
109
+ },
110
+ etcdAndControlPlane: {
111
+ worker: false, etcd: true, controlPlane: true
112
+ },
113
+ all: {
114
+ worker: true, etcd: true, controlPlane: true
115
+ }
116
+ };
117
+
118
+ const workerNode = {
119
+ id: '01',
120
+ isWorker: true,
121
+ isControlPlane: false,
122
+ isEtcd: false
123
+ };
124
+ const etcdNode = {
125
+ id: '02',
126
+ isWorker: false,
127
+ isControlPlane: false,
128
+ isEtcd: true
129
+ };
130
+ const controlPlaneNode = {
131
+ id: '03',
132
+ isWorker: false,
133
+ isControlPlane: true,
134
+ isEtcd: false
135
+ };
136
+ const etcdAndControlPlaneNode = {
137
+ id: '03',
138
+ isWorker: false,
139
+ isControlPlane: true,
140
+ isEtcd: true
141
+ };
142
+ const allNode = {
143
+ id: '04',
144
+ isWorker: true,
145
+ isControlPlane: true,
146
+ isEtcd: true
147
+ };
148
+
149
+ const baseCtx = {
150
+ rootGetters: {
151
+ 'rancher/byId': () => ({ actions: { scaledown: 'scaledown' } }),
152
+ 'i18n/t': t
153
+ }
154
+ };
155
+
156
+ it.each([
157
+ [{ spec: specs.worker, nodes: [workerNode] }, true],
158
+ [{ spec: specs.etcd, nodes: [etcdNode, etcdNode, controlPlaneNode] }, true],
159
+ [{ spec: specs.etcdAndControlPlane, nodes: [etcdAndControlPlaneNode, etcdAndControlPlaneNode] }, true],
160
+ [{ spec: specs.etcdAndControlPlane, nodes: [etcdAndControlPlaneNode] }, false],
161
+ [{ spec: specs.all, nodes: [allNode] }, false],
162
+ [{ spec: specs.all, nodes: [allNode, allNode] }, true],
163
+ ])('should return canScaleDown properly', (data, expected) => {
164
+ const { spec, nodes } = data;
165
+ const mgmtNode = new MgmtNode({
166
+ spec,
167
+ id: nodeId
168
+ }, {
169
+ ...baseCtx,
170
+ getters: {
171
+ all: () => [{
172
+ mgmtClusterId,
173
+ nodes
174
+ }]
175
+ }
176
+ });
177
+
178
+ expect(mgmtNode.canScaleDown).toStrictEqual(expected);
179
+ });
180
+ });
96
181
  });
@@ -0,0 +1,83 @@
1
+ import MgmtNodePool from '@shell/models/management.cattle.io.nodepool';
2
+
3
+ describe('class MgmtNodePool', () => {
4
+ describe('canScaleDownPool', () => {
5
+ const mgmtClusterId = 'test';
6
+ const nodeId = 'test/id';
7
+ const specs = {
8
+ worker: {
9
+ worker: true, etcd: false, controlPlane: false
10
+ },
11
+ etcd: {
12
+ worker: false, etcd: true, controlPlane: false
13
+ },
14
+ controlPlane: {
15
+ worker: false, etcd: false, controlPlane: true
16
+ },
17
+ etcdAndControlPlane: {
18
+ worker: false, etcd: true, controlPlane: true
19
+ },
20
+ all: {
21
+ worker: true, etcd: true, controlPlane: true
22
+ }
23
+ };
24
+
25
+ const workerNode = {
26
+ id: '01',
27
+ isWorker: true,
28
+ isControlPlane: false,
29
+ isEtcd: false
30
+ };
31
+ const etcdNode = {
32
+ id: '02',
33
+ isWorker: false,
34
+ isControlPlane: false,
35
+ isEtcd: true
36
+ };
37
+ const controlPlaneNode = {
38
+ id: '03',
39
+ isWorker: false,
40
+ isControlPlane: true,
41
+ isEtcd: false
42
+ };
43
+ const etcdAndControlPlaneNode = {
44
+ id: '03',
45
+ isWorker: false,
46
+ isControlPlane: true,
47
+ isEtcd: true
48
+ };
49
+ const allNode = {
50
+ id: '04',
51
+ isWorker: true,
52
+ isControlPlane: true,
53
+ isEtcd: true
54
+ };
55
+
56
+ const baseCtx = { rootGetters: { 'rancher/byId': () => ({ actions: { scaledown: 'scaledown' } }) } };
57
+
58
+ it.each([
59
+ [{ spec: specs.worker, nodes: [workerNode] }, true],
60
+ [{ spec: specs.etcd, nodes: [etcdNode, etcdNode, controlPlaneNode] }, true],
61
+ [{ spec: specs.etcdAndControlPlane, nodes: [etcdAndControlPlaneNode, etcdAndControlPlaneNode] }, true],
62
+ [{ spec: specs.etcdAndControlPlane, nodes: [etcdAndControlPlaneNode] }, false],
63
+ [{ spec: specs.all, nodes: [allNode] }, false],
64
+ [{ spec: specs.all, nodes: [allNode, allNode] }, true],
65
+ ])('should return canScaleDownPool properly', (data, expected) => {
66
+ const { spec, nodes } = data;
67
+ const mgmtNode = new MgmtNodePool({
68
+ spec,
69
+ id: nodeId
70
+ }, {
71
+ ...baseCtx,
72
+ getters: {
73
+ all: () => [{
74
+ mgmtClusterId,
75
+ nodes
76
+ }]
77
+ }
78
+ });
79
+
80
+ expect(mgmtNode.canScaleDownPool()).toStrictEqual(expected);
81
+ });
82
+ });
83
+ });