@rancher/shell 0.5.3 → 2.0.0

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 (581) 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 +2 -0
  7. package/assets/styles/themes/_csp.scss +2 -2
  8. package/assets/styles/themes/_dark.scss +8 -2
  9. package/assets/styles/themes/_light.scss +2 -1
  10. package/assets/styles/themes/_suse.scss +1 -1
  11. package/assets/styles/vendor/vue-select.scss +5 -0
  12. package/assets/translations/en-us.yaml +296 -58
  13. package/assets/translations/zh-hans.yaml +5 -27
  14. package/babel.config.js +1 -1
  15. package/chart/__tests__/S3.test.ts +9 -2
  16. package/chart/monitoring/grafana/index.vue +6 -2
  17. package/chart/monitoring/prometheus/index.vue +2 -2
  18. package/chart/rancher-backup/S3.vue +11 -9
  19. package/chart/rancher-backup/index.vue +15 -5
  20. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  21. package/cloud-credential/generic.vue +18 -9
  22. package/cloud-credential/harvester.vue +11 -3
  23. package/components/AppModal.vue +167 -0
  24. package/components/AssignTo.vue +7 -4
  25. package/components/AsyncButton.vue +18 -5
  26. package/components/BackLink.vue +4 -4
  27. package/components/BannerGraphic.vue +1 -0
  28. package/components/BrandImage.vue +47 -1
  29. package/components/Carousel.vue +14 -8
  30. package/components/Certificates.vue +8 -11
  31. package/components/ClusterBadge.vue +12 -3
  32. package/components/ClusterIconMenu.vue +44 -16
  33. package/components/ClusterProviderIcon.vue +14 -3
  34. package/components/CodeMirror.vue +73 -38
  35. package/components/CommunityLinks.vue +12 -8
  36. package/components/CreateDriver.vue +81 -0
  37. package/components/CruResource.vue +51 -27
  38. package/components/DetailTop.vue +2 -2
  39. package/components/Dialog.vue +6 -5
  40. package/components/DisableAuthProviderModal.vue +14 -8
  41. package/components/DraggableZone.vue +2 -2
  42. package/components/ExplorerMembers.vue +3 -3
  43. package/components/ExplorerProjectsNamespaces.vue +6 -6
  44. package/components/FixedBanner.vue +47 -36
  45. package/components/GlobalRoleBindings.vue +26 -0
  46. package/components/Import.vue +10 -6
  47. package/components/Inactivity.vue +1 -5
  48. package/components/KeyValueView.vue +14 -10
  49. package/components/MessageLink.vue +2 -2
  50. package/components/ModalWithCard.vue +5 -8
  51. package/components/MoveModal.vue +35 -33
  52. package/components/PodSecurityAdmission.vue +3 -3
  53. package/components/PromptChangePassword.vue +33 -33
  54. package/components/PromptModal.vue +11 -21
  55. package/components/PromptRemove.vue +11 -17
  56. package/components/PromptRestore.vue +18 -16
  57. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  58. package/components/Questions/__tests__/Float.test.ts +9 -19
  59. package/components/Questions/__tests__/Int.test.ts +9 -19
  60. package/components/Questions/__tests__/String.test.ts +9 -19
  61. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  62. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  63. package/components/Questions/index.vue +18 -2
  64. package/components/ResourceCancelModal.vue +34 -29
  65. package/components/ResourceDetail/Masthead.vue +23 -7
  66. package/components/ResourceDetail/index.vue +5 -0
  67. package/components/ResourceList/Masthead.vue +28 -10
  68. package/components/ResourceList/index.vue +65 -14
  69. package/components/ResourceTable.vue +73 -19
  70. package/components/ResourceYaml.vue +1 -0
  71. package/components/SelectIconGrid.vue +3 -3
  72. package/components/SideNav.vue +15 -37
  73. package/components/SingleClusterInfo.vue +4 -4
  74. package/components/SortableTable/THead.vue +26 -12
  75. package/components/SortableTable/filtering.js +9 -1
  76. package/components/SortableTable/grouping.js +8 -1
  77. package/components/SortableTable/index.vue +142 -42
  78. package/components/SortableTable/paging.js +36 -7
  79. package/components/SortableTable/selection.js +2 -1
  80. package/components/SortableTable/sorting.js +24 -7
  81. package/components/TabTitle.vue +84 -0
  82. package/components/Tabbed/index.vue +6 -1
  83. package/components/TableDataUserIcon.vue +47 -0
  84. package/components/TypeDescription.vue +1 -0
  85. package/components/Wizard.vue +1 -0
  86. package/components/__tests__/AppModal.test.ts +98 -0
  87. package/components/__tests__/AsyncButton.test.ts +1 -3
  88. package/components/__tests__/BackLink.test.ts +1 -1
  89. package/components/__tests__/ButtonGroup.test.ts +3 -6
  90. package/components/__tests__/Carousel.test.ts +43 -0
  91. package/components/__tests__/Certificates.test.ts +29 -0
  92. package/components/__tests__/{CodeMirror.spec.ts → CodeMirror.test.ts} +5 -17
  93. package/components/__tests__/CruResource.test.ts +10 -9
  94. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  95. package/components/__tests__/FixedBanner.test.ts +5 -20
  96. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  97. package/components/__tests__/TabTitle.test.ts +129 -0
  98. package/components/auth/AzureWarning.vue +2 -2
  99. package/components/auth/RoleDetailEdit.vue +10 -0
  100. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  101. package/components/auth/login/oidc.vue +7 -1
  102. package/components/fleet/FleetClusters.vue +9 -9
  103. package/components/fleet/FleetIntro.vue +11 -17
  104. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  105. package/components/fleet/FleetRepos.vue +1 -0
  106. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  107. package/components/form/ArrayList.vue +30 -19
  108. package/components/form/ArrayListSelect.vue +9 -4
  109. package/components/form/ClusterAppearance.vue +132 -0
  110. package/components/form/ColorInput.vue +1 -0
  111. package/components/form/Error.vue +3 -3
  112. package/components/form/Footer.vue +2 -2
  113. package/components/form/GitPicker.vue +83 -38
  114. package/components/form/KeyValue.vue +67 -48
  115. package/components/form/LabeledSelect.vue +143 -43
  116. package/components/form/Labels.vue +3 -1
  117. package/components/form/NameNsDescription.vue +26 -9
  118. package/components/form/ResourceLabeledSelect.vue +187 -0
  119. package/components/form/ResourceTabs/index.vue +31 -15
  120. package/components/form/SecretSelector.vue +93 -18
  121. package/components/form/Select.vue +1 -1
  122. package/components/form/SelectOrCreateAuthSecret.vue +135 -62
  123. package/components/form/SimpleSecretSelector.vue +88 -28
  124. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  125. package/components/form/__tests__/KeyValue.test.ts +121 -12
  126. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  127. package/components/form/__tests__/NameNsDescription.test.ts +25 -15
  128. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  129. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  130. package/components/formatter/AppSummaryGraph.vue +2 -2
  131. package/components/formatter/CloudCredPublicData.vue +30 -0
  132. package/components/formatter/ClusterLink.vue +2 -2
  133. package/components/formatter/FleetSummaryGraph.vue +2 -1
  134. package/components/formatter/ImagePercentageBar.vue +0 -4
  135. package/components/formatter/IngressTarget.vue +18 -7
  136. package/components/formatter/Link.vue +2 -2
  137. package/components/formatter/LinkDetail.vue +2 -2
  138. package/components/formatter/LinkDetailImage.vue +2 -2
  139. package/components/formatter/LinkName.vue +2 -2
  140. package/components/formatter/LiveDate.vue +16 -0
  141. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  142. package/components/formatter/SecretType.vue +2 -2
  143. package/components/formatter/VirtualServiceGateways.vue +2 -2
  144. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  145. package/components/nav/Group.vue +7 -5
  146. package/components/nav/Header.vue +82 -43
  147. package/components/nav/NamespaceFilter.vue +8 -1
  148. package/components/nav/TopLevelMenu.vue +336 -125
  149. package/components/nav/Type.vue +58 -102
  150. package/components/nav/__tests__/TopLevelMenu.test.ts +370 -9
  151. package/components/nav/__tests__/Type.test.ts +321 -126
  152. package/components/nuxt/nuxt-child.js +0 -5
  153. package/components/nuxt/nuxt-error.vue +1 -1
  154. package/components/nuxt/nuxt-link.client.js +13 -95
  155. package/components/templates/default.vue +3 -3
  156. package/components/templates/error.vue +6 -10
  157. package/components/templates/standalone.vue +0 -4
  158. package/components/templates/unauthenticated.vue +1 -2
  159. package/components/user.retention/user-retention-header.vue +34 -0
  160. package/composables/useCompactInput.test.ts +36 -0
  161. package/composables/useCompactInput.ts +2 -2
  162. package/composables/useI18n.ts +26 -0
  163. package/composables/useLabeledFormElement.test.ts +135 -0
  164. package/composables/useStore.ts +16 -0
  165. package/config/home-links.js +32 -1
  166. package/config/labels-annotations.js +2 -1
  167. package/config/middleware.js +0 -6
  168. package/config/pagination-table-headers.js +57 -0
  169. package/config/pod-security-admission.ts +1 -1
  170. package/config/private-label.js +1 -3
  171. package/config/product/auth.js +1 -0
  172. package/config/product/explorer.js +167 -46
  173. package/config/product/legacy.js +3 -95
  174. package/config/product/manager.js +44 -11
  175. package/config/query-params.js +1 -0
  176. package/config/roles.ts +23 -0
  177. package/config/router/index.js +23 -0
  178. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  179. package/config/router/navigation-guards/authentication.js +63 -0
  180. package/config/router/navigation-guards/index.js +15 -0
  181. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  182. package/config/router/routes.js +487 -0
  183. package/config/settings.ts +38 -2
  184. package/config/store.js +7 -3
  185. package/config/table-headers.js +46 -1
  186. package/config/types.js +36 -16
  187. package/config/uiplugins.js +10 -5
  188. package/core/plugin-helpers.js +1 -1
  189. package/core/plugin.ts +2 -1
  190. package/core/plugins.js +289 -282
  191. package/creators/app/files/.eslintignore +0 -2
  192. package/creators/app/files/.vscode/settings.json +0 -1
  193. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  194. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  195. package/creators/pkg/init +32 -0
  196. package/detail/__tests__/service.test.ts +62 -0
  197. package/detail/catalog.cattle.io.app.vue +1 -1
  198. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  199. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  200. package/detail/namespace.vue +2 -2
  201. package/detail/networking.k8s.io.ingress.vue +52 -19
  202. package/detail/node.vue +20 -43
  203. package/detail/pod.vue +1 -68
  204. package/detail/provisioning.cattle.io.cluster.vue +2 -1
  205. package/detail/service.vue +1 -1
  206. package/detail/workload/index.vue +2 -15
  207. package/dialog/AddCustomBadgeDialog.vue +318 -161
  208. package/dialog/DeactivateDriverDialog.vue +118 -0
  209. package/dialog/RollbackWorkloadDialog.vue +2 -2
  210. package/dialog/RotateCertificatesDialog.vue +0 -21
  211. package/directives/clean-html.js +15 -0
  212. package/directives/clean-tooltip.js +32 -0
  213. package/directives/focus.js +41 -0
  214. package/directives/int-number.js +21 -0
  215. package/directives/positive-int-number.js +19 -0
  216. package/directives/trim-whitespace.js +19 -0
  217. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  218. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  219. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  220. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  221. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  222. package/edit/__tests__/nodeDriver.test.ts +107 -0
  223. package/edit/__tests__/service.test.ts +1 -5
  224. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  225. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  226. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  227. package/edit/auth/__tests__/azuread.test.ts +241 -0
  228. package/edit/auth/__tests__/oidc.test.ts +137 -0
  229. package/edit/auth/azuread.vue +133 -31
  230. package/edit/auth/github.vue +5 -17
  231. package/edit/auth/googleoauth.vue +5 -18
  232. package/edit/auth/ldap/index.vue +5 -17
  233. package/edit/auth/oidc.vue +143 -42
  234. package/edit/auth/saml.vue +5 -14
  235. package/edit/catalog.cattle.io.clusterrepo.vue +175 -20
  236. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  237. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  238. package/edit/cloudcredential.vue +26 -4
  239. package/edit/configmap.vue +10 -4
  240. package/edit/fleet.cattle.io.gitrepo.vue +7 -4
  241. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  242. package/edit/kontainerDriver.vue +65 -0
  243. package/edit/logging-flow/Match.vue +10 -9
  244. package/edit/logging-flow/index.vue +4 -19
  245. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  246. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  247. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  248. package/edit/management.cattle.io.project.vue +2 -1
  249. package/edit/management.cattle.io.setting.vue +20 -0
  250. package/edit/management.cattle.io.user.vue +2 -1
  251. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  252. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  253. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +1 -0
  254. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +3 -0
  255. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +2 -0
  256. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  257. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  258. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  259. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  260. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  261. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  262. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +45 -6
  263. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/selectors.test.ts +1 -1
  264. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  265. package/edit/nodeDriver.vue +65 -0
  266. package/edit/persistentvolume/index.vue +2 -2
  267. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +18 -9
  268. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +165 -1
  269. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +1 -1
  270. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +0 -3
  271. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  272. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +70 -12
  273. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +5 -0
  274. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  275. package/edit/provisioning.cattle.io.cluster/index.vue +21 -15
  276. package/edit/provisioning.cattle.io.cluster/rke2.vue +185 -114
  277. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +67 -7
  278. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +19 -6
  279. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  280. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +7 -0
  281. package/edit/provisioning.cattle.io.cluster/tabs/etcd/S3Config.vue +1 -0
  282. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +1 -0
  283. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +3 -0
  284. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +1 -0
  285. package/edit/resources.cattle.io.backup.vue +139 -124
  286. package/edit/resources.cattle.io.restore.vue +146 -126
  287. package/edit/service.vue +1 -0
  288. package/edit/serviceaccount.vue +46 -4
  289. package/edit/workload/__tests__/Job.test.ts +1 -3
  290. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  291. package/edit/workload/mixins/workload.js +34 -1
  292. package/edit/workload/storage/emptyDir.vue +2 -2
  293. package/initialize/App.vue +75 -0
  294. package/initialize/app-extended.js +128 -0
  295. package/initialize/entry-helpers.js +549 -0
  296. package/initialize/entry.js +32 -0
  297. package/initialize/install-components.js +23 -0
  298. package/initialize/install-directives.js +59 -0
  299. package/initialize/install-plugins.js +123 -0
  300. package/list/__tests__/workload.test.ts +1 -1
  301. package/list/cis.cattle.io.clusterscan.vue +16 -10
  302. package/list/group.principal.vue +2 -2
  303. package/list/management.cattle.io.feature.vue +11 -7
  304. package/list/management.cattle.io.user.vue +36 -3
  305. package/list/networking.k8s.io.ingress.vue +36 -0
  306. package/list/node.vue +211 -73
  307. package/list/provisioning.cattle.io.cluster.vue +17 -4
  308. package/list/ui.cattle.io.navlink.vue +2 -2
  309. package/list/workload.vue +22 -0
  310. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  311. package/machine-config/__tests__/vmwarevsphere.test.ts +162 -59
  312. package/machine-config/amazonec2.vue +1 -1
  313. package/machine-config/azure.vue +38 -21
  314. package/machine-config/generic.vue +11 -15
  315. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  316. package/machine-config/vmwarevsphere.vue +20 -11
  317. package/middleware/authenticated.js +9 -361
  318. package/mixins/__tests__/chart.test.ts +48 -6
  319. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  320. package/mixins/auth-config.js +3 -2
  321. package/mixins/brand.js +75 -57
  322. package/mixins/chart.js +27 -13
  323. package/mixins/create-edit-view/index.js +2 -2
  324. package/mixins/fetch.client.js +42 -48
  325. package/mixins/labeled-form-element.ts +21 -1
  326. package/mixins/page-actions.js +7 -5
  327. package/mixins/resource-fetch-api-pagination.js +304 -0
  328. package/mixins/resource-fetch-namespaced.js +1 -1
  329. package/mixins/resource-fetch.js +46 -5
  330. package/models/__tests__/cluster.test.ts +44 -0
  331. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  332. package/models/__tests__/schema.tests.ts +24 -0
  333. package/models/__tests__/steve-schema.test.ts +73 -0
  334. package/models/__tests__/workload.test.ts +1 -1
  335. package/models/catalog.cattle.io.app.js +8 -0
  336. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  337. package/models/catalog.cattle.io.uiplugin.js +7 -8
  338. package/models/cis.cattle.io.clusterscan.js +29 -8
  339. package/models/cloudcredential.js +9 -1
  340. package/models/cluster/node.js +4 -0
  341. package/models/cluster/schema.js +6 -0
  342. package/models/cluster.js +33 -0
  343. package/models/driver.js +62 -0
  344. package/models/fleet.cattle.io.cluster.js +23 -11
  345. package/models/fleet.cattle.io.gitrepo.js +10 -0
  346. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  347. package/models/kontainerdriver.js +68 -0
  348. package/models/management/schema.js +6 -0
  349. package/models/management.cattle.io.authconfig.js +3 -2
  350. package/models/management.cattle.io.cluster.js +5 -4
  351. package/models/management.cattle.io.globalrole.js +2 -0
  352. package/models/management.cattle.io.user.js +67 -2
  353. package/models/monitoring.coreos.com.receiver.js +3 -1
  354. package/models/monitoring.coreos.com.route.js +1 -1
  355. package/models/networking.k8s.io.ingress.js +2 -1
  356. package/models/nodedriver.js +68 -0
  357. package/models/provisioning.cattle.io.cluster.js +34 -1
  358. package/models/schema.js +28 -7
  359. package/models/service.js +2 -0
  360. package/models/steve-schema.ts +254 -0
  361. package/models/workload.js +1 -0
  362. package/package.json +6 -5
  363. package/pages/about.vue +12 -5
  364. package/pages/account/index.vue +7 -2
  365. package/pages/auth/login.vue +106 -102
  366. package/pages/auth/logout.vue +2 -2
  367. package/pages/auth/setup.vue +57 -64
  368. package/pages/auth/verify.vue +17 -17
  369. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  370. package/pages/c/_cluster/apps/charts/index.vue +37 -13
  371. package/pages/c/_cluster/apps/charts/install.vue +4 -4
  372. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  373. package/pages/c/_cluster/auth/config/index.vue +15 -9
  374. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  375. package/pages/c/_cluster/auth/user.retention/index.vue +384 -0
  376. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  377. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  378. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  379. package/pages/c/_cluster/explorer/index.vue +231 -72
  380. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  381. package/pages/c/_cluster/explorer/tools/index.vue +12 -176
  382. package/pages/c/_cluster/fleet/index.vue +88 -93
  383. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  384. package/pages/c/_cluster/longhorn/index.vue +52 -17
  385. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  386. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  387. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  388. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +94 -0
  389. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  390. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  391. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +63 -0
  392. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  393. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  394. package/pages/c/_cluster/monitoring/index.vue +1 -17
  395. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  396. package/pages/c/_cluster/neuvector/index.vue +1 -0
  397. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  398. package/pages/c/_cluster/settings/banners.vue +86 -8
  399. package/pages/c/_cluster/settings/brand.vue +258 -36
  400. package/pages/c/_cluster/settings/index.vue +4 -4
  401. package/pages/c/_cluster/settings/links.vue +5 -3
  402. package/pages/c/_cluster/settings/performance.vue +71 -2
  403. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  404. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +10 -7
  405. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  406. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  407. package/pages/c/_cluster/uiplugins/InstallDialog.vue +53 -18
  408. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  409. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  410. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  411. package/pages/c/_cluster/uiplugins/index.vue +38 -52
  412. package/pages/diagnostic.vue +1 -0
  413. package/pages/fail-whale.vue +103 -41
  414. package/pages/home.vue +81 -24
  415. package/pages/prefs.vue +8 -3
  416. package/pages/support/index.vue +12 -2
  417. package/plugins/clean-html-directive.js +5 -12
  418. package/plugins/clean-tooltip-directive.js +6 -31
  419. package/plugins/codemirror.js +0 -9
  420. package/plugins/dashboard-store/__tests__/mutations.test.ts +296 -313
  421. package/plugins/dashboard-store/actions.js +140 -32
  422. package/plugins/dashboard-store/getters.js +86 -39
  423. package/plugins/dashboard-store/index.js +0 -99
  424. package/plugins/dashboard-store/mutations.js +150 -48
  425. package/plugins/dashboard-store/resource-class.js +14 -109
  426. package/plugins/directives.js +6 -39
  427. package/plugins/ember-cookie.js +13 -0
  428. package/plugins/global-formatters.js +26 -5
  429. package/plugins/i18n.js +90 -56
  430. package/plugins/int-number.js +6 -20
  431. package/plugins/plugin.js +3 -3
  432. package/plugins/positive-int-number.js +6 -17
  433. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +124 -31
  434. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  435. package/plugins/steve/__tests__/subscribe.spec.ts +109 -0
  436. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  437. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  438. package/plugins/steve/actions.js +0 -1
  439. package/plugins/steve/getters.js +183 -63
  440. package/plugins/steve/hybrid-class.js +5 -1
  441. package/plugins/steve/mutations.js +29 -5
  442. package/plugins/steve/norman-class.js +123 -2
  443. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  444. package/plugins/steve/schema.d.ts +22 -0
  445. package/plugins/steve/steve-pagination-utils.ts +368 -0
  446. package/plugins/steve/subscribe.js +37 -75
  447. package/plugins/trim-whitespace.js +6 -34
  448. package/plugins/vue-js-modal.js +1 -1
  449. package/public/index.html +1 -0
  450. package/rancher-components/Accordion/Accordion.vue +3 -2
  451. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  452. package/rancher-components/Banner/Banner.test.ts +1 -5
  453. package/rancher-components/Banner/Banner.vue +2 -2
  454. package/rancher-components/Card/Card.vue +4 -4
  455. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  456. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  457. package/rancher-components/Form/LabeledInput/LabeledInput.vue +66 -30
  458. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  459. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  460. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  461. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  462. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  463. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  464. package/rancher-components/StringList/StringList.vue +8 -8
  465. package/rancher-components/components/Accordion/Accordion.vue +3 -2
  466. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  467. package/rancher-components/components/Banner/Banner.test.ts +1 -5
  468. package/rancher-components/components/Banner/Banner.vue +2 -2
  469. package/rancher-components/components/Card/Card.vue +4 -4
  470. package/rancher-components/components/Form/Checkbox/Checkbox.vue +4 -3
  471. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  472. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +66 -30
  473. package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -3
  474. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  475. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  476. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  477. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  478. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  479. package/rancher-components/components/StringList/StringList.vue +8 -8
  480. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +27 -8
  481. package/scripts/clean +1 -1
  482. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  483. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  484. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  485. package/scripts/extension/helm/package/Dockerfile +1 -1
  486. package/scripts/extension/helm/scripts/patch +27 -0
  487. package/scripts/extension/publish +6 -6
  488. package/scripts/serve-pkgs +0 -2
  489. package/scripts/test-plugins-build.sh +6 -6
  490. package/scripts/vue-migrate.js +683 -0
  491. package/store/__tests__/catalog.test.ts +224 -0
  492. package/store/auth.js +23 -4
  493. package/store/aws.js +53 -6
  494. package/store/catalog.js +21 -5
  495. package/store/cru-resource.ts +26 -0
  496. package/store/customisation.js +35 -0
  497. package/store/features.js +6 -4
  498. package/store/index.js +132 -39
  499. package/store/plugins.js +8 -4
  500. package/store/type-map.js +143 -143
  501. package/store/type-map.utils.ts +226 -0
  502. package/tsconfig.json +0 -1
  503. package/tsconfig.paths.json +4 -1
  504. package/types/components/labeledSelect.ts +50 -0
  505. package/types/resources/settings.d.ts +32 -0
  506. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  507. package/types/shell/index.d.ts +996 -782
  508. package/types/store/dashboard-store.types.ts +42 -0
  509. package/types/store/pagination.types.ts +457 -0
  510. package/types/store/type-map.ts +30 -0
  511. package/types/store/vuex.d.ts +9 -0
  512. package/types/vue-shim.d.ts +51 -0
  513. package/utils/__tests__/cluster.test.ts +20 -18
  514. package/utils/__tests__/create-yaml.test.ts +359 -2
  515. package/utils/__tests__/kontainer.test.ts +92 -0
  516. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  517. package/utils/alertmanagerconfig.js +19 -0
  518. package/utils/array.ts +40 -1
  519. package/utils/async.ts +2 -0
  520. package/utils/auth.js +152 -4
  521. package/utils/axios.js +2 -2
  522. package/utils/banners.js +103 -0
  523. package/utils/cluster.js +1 -1
  524. package/utils/config.js +4 -0
  525. package/utils/create-yaml.js +54 -27
  526. package/utils/error.js +25 -0
  527. package/utils/formatter.js +5 -3
  528. package/utils/git.ts +1 -1
  529. package/utils/install-redirect.js +1 -1
  530. package/utils/kontainer.ts +186 -0
  531. package/utils/monitoring.js +2 -37
  532. package/utils/pagination-utils.ts +154 -0
  533. package/utils/pod-security-admission.ts +1 -1
  534. package/utils/router.js +86 -0
  535. package/utils/settings.ts +46 -0
  536. package/utils/socket.js +1 -0
  537. package/utils/time.js +1 -0
  538. package/utils/title.ts +3 -0
  539. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  540. package/utils/validators/formRules/__tests__/index.test.ts +21 -0
  541. package/utils/validators/formRules/index.ts +3 -0
  542. package/utils/validators/index.js +1 -0
  543. package/vue.config.js +376 -421
  544. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  545. package/chart/monitoring/steps/uninstall-v1.vue +0 -135
  546. package/components/EventsTable.vue +0 -67
  547. package/components/TabbedLinks/index.vue +0 -94
  548. package/components/nuxt/nuxt-link.server.js +0 -16
  549. package/components/nuxt/nuxt.js +0 -101
  550. package/config/router.js +0 -425
  551. package/initialize/App.js +0 -152
  552. package/initialize/client.js +0 -734
  553. package/initialize/index.js +0 -287
  554. package/middleware/i18n.js +0 -10
  555. package/middleware/unauthenticated.js +0 -22
  556. package/mixins/v1-workload-metrics.js +0 -43
  557. package/pages/c/_cluster/apps/index.vue +0 -15
  558. package/pages/c/_cluster/auth/index.vue +0 -17
  559. package/pages/c/_cluster/index.vue +0 -15
  560. package/pages/c/_cluster/legacy/index.vue +0 -22
  561. package/pages/c/_cluster/manager/index.vue +0 -22
  562. package/pages/c/_cluster/mcapps/index.vue +0 -21
  563. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  564. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  565. package/plugins/index.js +0 -11
  566. package/plugins/portal-vue.js +0 -4
  567. package/plugins/portal.js +0 -4
  568. package/plugins/resize.js +0 -5
  569. package/plugins/shortkey.js +0 -4
  570. package/plugins/tooltip.js +0 -4
  571. package/plugins/v-select.js +0 -4
  572. package/utils/group.js +0 -70
  573. package/utils/nuxt.js +0 -638
  574. package/utils/router.scrollBehavior.js +0 -78
  575. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  576. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  577. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  578. /package/plugins/steve/__tests__/{steve-class.spec.ts → steve-class.test.ts} +0 -0
  579. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  580. /package/rancher-components/components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  581. /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,24 @@
1
+ import { parseType } from '@shell/models/schema';
2
+
3
+ describe('class: schema:', () => {
4
+ describe('parseType', () => {
5
+ it.each([
6
+ ['array', undefined, ['array']],
7
+ ['map', undefined, ['map']],
8
+ ['io.cattle.provisioning.v1.Cluster.status', undefined, ['io.cattle.provisioning.v1.Cluster.status']],
9
+
10
+ ['array[string]', undefined, ['array', 'string']],
11
+ ['array', { subtype: 'string' }, ['array', 'string']],
12
+ ['map[string]', undefined, ['map', 'string']],
13
+ ['map', { subtype: 'string' }, ['map', 'string']],
14
+
15
+ ['array[io.cattle.provisioning.v1.Cluster.status]', undefined, ['array', 'io.cattle.provisioning.v1.Cluster.status']],
16
+ ['array', { subtype: 'io.cattle.provisioning.v1.Cluster.status' }, ['array', 'io.cattle.provisioning.v1.Cluster.status']],
17
+ ['map[io.cattle.provisioning.v1.Cluster.status]', undefined, ['map', 'io.cattle.provisioning.v1.Cluster.status']],
18
+ ['map', { subtype: 'io.cattle.provisioning.v1.Cluster.status' }, ['map', 'io.cattle.provisioning.v1.Cluster.status']],
19
+
20
+ ])('string: %p and field: %p ... should equal %p', (val, field, expected) => {
21
+ expect(parseType(val, field)).toStrictEqual(expected);
22
+ });
23
+ });
24
+ });
@@ -0,0 +1,73 @@
1
+ import SteveSchema from '@shell/models/steve-schema';
2
+ import { replace } from '@shell/plugins/dashboard-store/mutations';
3
+
4
+ describe('class SteveSchema', () => {
5
+ describe('schema diet', () => {
6
+ it('schema Definitions', async() => {
7
+ const store = 'cluster';
8
+ const schemaName = 'steveTest';
9
+
10
+ SteveSchema.reset(store);
11
+
12
+ const testSchema = {
13
+ id: schemaName,
14
+ metadata: { name: schemaName },
15
+ resourceFields: null,
16
+ links: { self: `/v1/schemas/${ schemaName }` }
17
+ };
18
+ const testSchemaDefinition = {
19
+ type: schemaName,
20
+ resourceFields: {
21
+ a: {},
22
+ b: {},
23
+ }
24
+ };
25
+ const testSecondarySchemaDefinitions = {
26
+ a: { type: 'a' },
27
+ b: { type: 'b' }
28
+ };
29
+
30
+ const schemaModel = new SteveSchema(testSchema, {
31
+ dispatch: jest.fn().mockImplementation((action, opts) => {
32
+ expect(action).toBe('request');
33
+ expect(opts.type).toBe('schemaDefinition');
34
+ expect(opts.url).toBe(`/v1/schemaDefinitions/${ schemaName }`);
35
+
36
+ return {
37
+ definitionType: schemaName,
38
+ definitions: {
39
+ [schemaName]: testSchemaDefinition,
40
+ ...testSecondarySchemaDefinitions,
41
+ }
42
+ };
43
+ }),
44
+ state: { config: { namespace: store } }
45
+ });
46
+
47
+ // We have no schema definition info, however we know that schema definitions should be fetched
48
+ expect(schemaModel.schemaDefinition).toBeNull();
49
+ expect(schemaModel.schemaDefinitions).toBeNull();
50
+ expect(schemaModel.requiresResourceFields).toBeTruthy();
51
+ expect(schemaModel.hasResourceFields).toBeFalsy();
52
+
53
+ // Fetch schema definition
54
+ await schemaModel.fetchResourceFields();
55
+
56
+ // We have schema definition info
57
+ expect(schemaModel.schemaDefinition).toStrictEqual(testSchemaDefinition);
58
+ expect(schemaModel.schemaDefinitions).toStrictEqual(testSecondarySchemaDefinitions);
59
+ expect(schemaModel.requiresResourceFields).toBeTruthy();
60
+ expect(schemaModel.hasResourceFields).toBeTruthy();
61
+
62
+ // Uhoh, there's been an update over socket. Socket process calls the `load` mutator which then calls `replace`.
63
+ // This wipes out ALL properties on our poor schema model and applies everything from the one we get over socket
64
+ replace(schemaModel, { ...testSchema });
65
+
66
+ // All schema definition info should still work (this matches above)
67
+ expect(schemaModel.schemaDefinition).toStrictEqual(testSchemaDefinition);
68
+ expect(schemaModel.schemaDefinitions).toStrictEqual(testSecondarySchemaDefinitions);
69
+ expect(schemaModel.requiresResourceFields).toBeTruthy();
70
+ expect(schemaModel.hasResourceFields).toBeTruthy();
71
+ });
72
+ });
73
+ });
@@ -26,7 +26,7 @@ describe('class: Workload', () => {
26
26
  }
27
27
  };
28
28
 
29
- customWorkload.metadata.name = 'abc';
29
+ (customWorkload.metadata as any).name = 'abc';
30
30
 
31
31
  it('should keep internal keys', () => {
32
32
  const workload = new Workload(customWorkload, {
@@ -39,6 +39,14 @@ export default class CatalogApp extends SteveModel {
39
39
  return out;
40
40
  }
41
41
 
42
+ get warnDeletionMessage() {
43
+ if (this.upgradeAvailable === false) {
44
+ return this.t('catalog.delete.warning.managed', { name: this.name });
45
+ }
46
+
47
+ return null;
48
+ }
49
+
42
50
  matchingChart(includeHidden) {
43
51
  const chart = this.spec?.chart;
44
52
 
@@ -44,6 +44,14 @@ export default class ClusterRepo extends SteveModel {
44
44
  return !!this.spec?.gitRepo;
45
45
  }
46
46
 
47
+ get isOciType() {
48
+ const hasExplicitOciUrl = this.spec.url?.split(':')[0] === 'oci';
49
+ // insecurePlainHttp is only valid for OCI URL's and allows insecure connections to registries without enforcing TLS checks
50
+ const hasInsecurePlainHttp = Object.prototype.hasOwnProperty.call(this.spec, ('insecurePlainHttp'));
51
+
52
+ return hasExplicitOciUrl || hasInsecurePlainHttp;
53
+ }
54
+
47
55
  get isRancherSource() {
48
56
  let parsed;
49
57
 
@@ -107,7 +115,7 @@ export default class ClusterRepo extends SteveModel {
107
115
  if ( this.spec.gitRepo ) {
108
116
  return 'git';
109
117
  } else if ( this.spec.url ) {
110
- return 'http';
118
+ return this.isOciType ? 'oci' : 'http';
111
119
  } else {
112
120
  return '?';
113
121
  }
@@ -1,6 +1,10 @@
1
1
  import SteveModel from '@shell/plugins/steve/steve-class';
2
2
 
3
- const CACHED_STATUS = 'cached';
3
+ const CACHE_STATE = Object.freeze({
4
+ CACHED: 'cached',
5
+ DISABLED: 'disabled',
6
+ PENDING: 'pending',
7
+ });
4
8
 
5
9
  export default class UIPlugin extends SteveModel {
6
10
  get name() {
@@ -15,13 +19,8 @@ export default class UIPlugin extends SteveModel {
15
19
  return this.spec?.plugin?.version;
16
20
  }
17
21
 
18
- get willBeCached() {
19
- return this.spec?.plugin?.noCache === false;
20
- }
21
-
22
- // Has the plugin been cached?
23
- get isCached() {
24
- return !this.willBeCached || (this.willBeCached && this.status?.cacheState === CACHED_STATUS);
22
+ get isInitialized() {
23
+ return this.status?.cacheState !== CACHE_STATE.PENDING;
25
24
  }
26
25
 
27
26
  get pluginMetadata() {