@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
@@ -1,14 +1,14 @@
1
1
  import https from 'https';
2
2
  import { addParam, parse as parseUrl, stringify as unParseUrl } from '@shell/utils/url';
3
3
  import { handleSpoofedRequest, loadSchemas } from '@shell/plugins/dashboard-store/actions';
4
- import { set } from '@shell/utils/object';
4
+ import { dropKeys, set } from '@shell/utils/object';
5
5
  import { deferred } from '@shell/utils/promise';
6
6
  import { streamJson, streamingSupported } from '@shell/utils/stream';
7
7
  import isObject from 'lodash/isObject';
8
8
  import { classify } from '@shell/plugins/dashboard-store/classify';
9
9
  import { NAMESPACE } from '@shell/config/types';
10
- import jsyaml from 'js-yaml';
11
10
  import { handleKubeApiHeaderWarnings } from '@shell/plugins/steve/header-warnings';
11
+ import { steveCleanForDownload } from '@shell/plugins/steve/resource-utils';
12
12
 
13
13
  export default {
14
14
 
@@ -19,7 +19,6 @@ export default {
19
19
 
20
20
  async request({ state, dispatch, rootGetters }, pOpt ) {
21
21
  const opt = pOpt.opt || pOpt;
22
-
23
22
  const spoofedRes = await handleSpoofedRequest(rootGetters, 'cluster', opt);
24
23
 
25
24
  if (spoofedRes) {
@@ -330,31 +329,7 @@ export default {
330
329
 
331
330
  // remove fields added by steve before showing/downloading yamls
332
331
  cleanForDownload(ctx, yaml) {
333
- if (!yaml) {
334
- return;
335
- }
336
- const rootKeys = [
337
- 'id',
338
- 'links',
339
- 'type',
340
- 'actions'
341
- ];
342
- const metadataKeys = [
343
- 'fields',
344
- 'relationships',
345
- 'state',
346
- ];
347
- const conditionKeys = [
348
- 'error',
349
- 'transitioning',
350
- ];
351
- const obj = jsyaml.load(yaml);
352
-
353
- dropKeys(obj, rootKeys);
354
- dropKeys(obj?.metadata, metadataKeys);
355
- (obj?.status?.conditions || []).forEach((condition) => dropKeys(condition, conditionKeys));
356
-
357
- return jsyaml.dump(obj);
332
+ return steveCleanForDownload(yaml);
358
333
  }
359
334
  };
360
335
 
@@ -398,16 +373,6 @@ function dropUnderscores(obj) {
398
373
  }
399
374
  }
400
375
 
401
- function dropKeys(obj, keys) {
402
- if ( !obj ) {
403
- return;
404
- }
405
-
406
- for ( const k of keys ) {
407
- delete obj[k];
408
- }
409
- }
410
-
411
376
  function dropCattleKeys(obj) {
412
377
  if ( !obj ) {
413
378
  return;
@@ -8,8 +8,16 @@ import HybridModel, { cleanHybridResources } from './hybrid-class';
8
8
  import NormanModel from './norman-class';
9
9
  import { urlFor } from '@shell/plugins/dashboard-store/getters';
10
10
  import { normalizeType } from '@shell/plugins/dashboard-store/normalize';
11
- import pAndNFiltering from '@shell/utils/projectAndNamespaceFiltering.utils';
11
+ import pAndNFiltering from '@shell/plugins/steve/projectAndNamespaceFiltering.utils';
12
+ import stevePaginationUtils from '@shell/plugins/steve/steve-pagination-utils';
12
13
  import { parse } from '@shell/utils/url';
14
+ import { splitObjectPath } from '@shell/utils/string';
15
+ import { parseType } from '@shell/models/schema';
16
+ import {
17
+ STEVE_AGE_COL,
18
+ STEVE_ID_COL, STEVE_LIST_GROUPS, STEVE_NAMESPACE_COL, STEVE_STATE_COL
19
+ } from '@shell/config/pagination-table-headers';
20
+ import { createHeaders } from '@shell/store/type-map.utils';
13
21
 
14
22
  export const STEVE_MODEL_TYPES = {
15
23
  NORMAN: 'norman',
@@ -24,54 +32,88 @@ const GC_IGNORE_TYPES = {
24
32
  [UI.NAV_LINK]: true,
25
33
  };
26
34
 
35
+ // Include calls to /v1 AND /k8s/clusters/<cluster id>/v1
36
+ const steveRegEx = new RegExp('(/v1)|(\/k8s\/clusters\/[a-z0-9-]+\/v1)');
37
+
27
38
  export default {
28
- urlOptions: () => (url, opt) => {
39
+ urlOptions: () => (url, opt, schema) => {
29
40
  opt = opt || {};
30
41
  const parsedUrl = parse(url);
31
- const isSteve = parsedUrl.path.startsWith('/v1');
42
+ const isSteve = steveRegEx.test(parsedUrl.path);
32
43
 
33
- // labelSelector
34
- if ( opt.labelSelector ) {
35
- url += `${ url.includes('?') ? '&' : '?' }labelSelector=${ opt.labelSelector }`;
36
- }
37
- // End: labelSelector
44
+ const stevePagination = stevePaginationUtils.createParamsForPagination(schema, opt);
45
+
46
+ if (stevePagination) {
47
+ url += `${ (url.includes('?') ? '&' : '?') + stevePagination }`;
48
+ } else {
49
+ // labelSelector
50
+ if ( opt.labelSelector ) {
51
+ url += `${ url.includes('?') ? '&' : '?' }labelSelector=${ opt.labelSelector }`;
52
+ }
53
+ // End: labelSelector
38
54
 
39
- // Filter
40
- if ( opt.filter ) {
41
- url += `${ (url.includes('?') ? '&' : '?') }`;
42
- const keys = Object.keys(opt.filter);
55
+ // Filter
56
+ if ( opt.filter ) {
57
+ url += `${ (url.includes('?') ? '&' : '?') }`;
58
+ const keys = Object.keys(opt.filter);
43
59
 
44
- keys.forEach((key) => {
45
- let vals = opt.filter[key];
60
+ keys.forEach((key) => {
61
+ let vals = opt.filter[key];
46
62
 
47
- if ( !isArray(vals) ) {
48
- vals = [vals];
49
- }
63
+ if ( !isArray(vals) ) {
64
+ vals = [vals];
65
+ }
50
66
 
51
- // Steve's filter options now support more complex filtering not yet implemented here #9341
52
- if (isSteve) {
53
- url += `${ (url.includes('filter=') ? '&' : 'filter=') }`;
54
- }
67
+ // Steve's filter options now support more complex filtering not yet implemented here #9341
68
+ if (isSteve) {
69
+ url += `${ (url.includes('filter=') ? '&' : 'filter=') }`;
70
+ }
55
71
 
56
- const filterStrings = vals.map((val) => {
57
- return `${ encodeURI(key) }=${ encodeURI(val) }`;
72
+ const filterStrings = vals.map((val) => {
73
+ return `${ encodeURI(key) }=${ encodeURI(val) }`;
74
+ });
75
+ const urlEnding = url.charAt(url.length - 1);
76
+ const nextStringConnector = ['&', '?', '='].includes(urlEnding) ? '' : '&';
77
+
78
+ url += `${ nextStringConnector }${ filterStrings.join('&') }`;
58
79
  });
59
- const urlEnding = url.charAt(url.length - 1);
60
- const nextStringConnector = ['&', '?', '='].includes(urlEnding) ? '' : '&';
80
+ }
61
81
 
62
- url += `${ nextStringConnector }${ filterStrings.join('&') }`;
63
- });
64
- }
82
+ // `opt.namespaced` is either
83
+ // - a string representing a single namespace - add restriction to the url
84
+ // - an array of namespaces or projects - add restriction as a param
85
+ const namespaceProjectFilter = pAndNFiltering.checkAndCreateParam(opt);
65
86
 
66
- // `opt.namespaced` is either
67
- // - a string representing a single namespace - add restriction to the url
68
- // - an array of namespaces or projects - add restriction as a param
69
- const namespaceProjectFilter = pAndNFiltering.checkAndCreateParam(opt);
87
+ if (namespaceProjectFilter) {
88
+ url += `${ (url.includes('?') ? '&' : '?') + namespaceProjectFilter }`;
89
+ }
90
+ // End: Filter
70
91
 
71
- if (namespaceProjectFilter) {
72
- url += `${ (url.includes('?') ? '&' : '?') + namespaceProjectFilter }`;
92
+ // Limit
93
+ const limit = opt.limit;
94
+
95
+ if ( limit ) {
96
+ url += `${ url.includes('?') ? '&' : '?' }limit=${ limit }`;
97
+ }
98
+ // End: Limit
99
+
100
+ // Sort
101
+ // Steve's sort options supports multi-column sorting and column specific sort orders, not implemented yet #9341
102
+ const sortBy = opt.sortBy;
103
+ const orderBy = opt.sortOrder;
104
+
105
+ if ( sortBy ) {
106
+ if (isSteve) {
107
+ url += `${ url.includes('?') ? '&' : '?' }sort=${ (orderBy === 'desc' ? '-' : '') + encodeURI(sortBy) }`;
108
+ } else {
109
+ url += `${ url.includes('?') ? '&' : '?' }sort=${ encodeURI(sortBy) }`;
110
+ if ( orderBy ) {
111
+ url += `${ url.includes('?') ? '&' : '?' }order=${ encodeURI(orderBy) }`;
112
+ }
113
+ }
114
+ }
115
+ // End: Sort
73
116
  }
74
- // End: Filter
75
117
 
76
118
  // Exclude
77
119
  // excludeFields should be an array of strings representing the paths of the fields to exclude
@@ -88,32 +130,6 @@ export default {
88
130
  }
89
131
  // End: Exclude
90
132
 
91
- // Limit
92
- const limit = opt.limit;
93
-
94
- if ( limit ) {
95
- url += `${ url.includes('?') ? '&' : '?' }limit=${ limit }`;
96
- }
97
- // End: Limit
98
-
99
- // Sort
100
- // Steve's sort options supports multi-column sorting and column specific sort orders, not implemented yet #9341
101
- const sortBy = opt.sortBy;
102
- const orderBy = opt.sortOrder;
103
-
104
- if ( sortBy ) {
105
- if (isSteve) {
106
- url += `${ url.includes('?') ? '&' : '?' }sort=${ (orderBy === 'desc' ? '-' : '') + encodeURI(sortBy) }`;
107
- } else {
108
- url += `${ url.includes('?') ? '&' : '?' }sort=${ encodeURI(sortBy) }`;
109
- if ( orderBy ) {
110
- url += `${ url.includes('?') ? '&' : '?' }order=${ encodeURI(orderBy) }`;
111
- }
112
- }
113
- }
114
-
115
- // End: Sort
116
-
117
133
  return url;
118
134
  },
119
135
 
@@ -234,4 +250,91 @@ export default {
234
250
  return cache.generation;
235
251
  },
236
252
 
253
+ /**
254
+ * Checks the norman or steve schema resourceFields for the given path
255
+ */
256
+ pathExistsInSchema: (state, getters) => (type, path) => {
257
+ const schema = getters.schemaFor(type);
258
+
259
+ if (schema.requiresResourceFields && !schema.hasResourceFields) {
260
+ console.warn(`pathExistsInSchema requires schema ${ schema.id } to have resources fields via schema definition but none were found. has the schema 'fetchResourceFields' been called?`); // eslint-disable-line no-console
261
+
262
+ return false;
263
+ }
264
+
265
+ const schemaDefinitions = schema.requiresResourceFields ? schema.schemaDefinitions : null;
266
+ const parts = splitObjectPath(path);
267
+ let schemaOrSchemaDefinition = schema;
268
+
269
+ // Iterate down the parts (properties) until there are no parts left (success) or the path cannot be found (failure)
270
+ while ( parts.length ) {
271
+ const key = parts.shift();
272
+
273
+ const field = schemaOrSchemaDefinition.resourceFields?.[key];
274
+
275
+ type = field?.type;
276
+
277
+ if ( !type ) {
278
+ return false;
279
+ }
280
+
281
+ if ( parts.length ) {
282
+ type = parseType(type, field).pop(); // Get the main part of array[map[something]] => something
283
+
284
+ schemaOrSchemaDefinition = schemaDefinitions ? schemaDefinitions?.[type] : getters.schemaFor(type);
285
+
286
+ if ( !schema ) {
287
+ return false;
288
+ }
289
+ }
290
+ }
291
+
292
+ return true;
293
+ },
294
+
295
+ /*
296
+ * Override the vanilla type-map headersFor. This allows custom columns
297
+ */
298
+ headersFor: (state, getters, rootState, rootGetters) => ({
299
+ getters: typeMapGetters,
300
+ state: typeMapState,
301
+ }, { schema, pagination }) => {
302
+ if (!pagination ) {
303
+ return;
304
+ }
305
+
306
+ return createHeaders({
307
+ state: typeMapState, getters: typeMapGetters, rootGetters
308
+ }, {
309
+ headers: typeMapState.paginationHeaders,
310
+ typeOptions: typeMapGetters['optionsFor'](schema, true),
311
+ schema,
312
+ columns: {
313
+ state: STEVE_STATE_COL,
314
+ namespace: STEVE_NAMESPACE_COL,
315
+ age: STEVE_AGE_COL,
316
+ id: STEVE_ID_COL
317
+ }
318
+ });
319
+ },
320
+
321
+ /**
322
+ * Override the vanilla type-map optionsFor. This allows custom list values
323
+ */
324
+ optionsFor: () => (ctx, { schema, pagination, opts }) => {
325
+ if (pagination) {
326
+ // As headers are hardcoded each list should have specific default sort option
327
+ // This avoids the sortable table adding both name and id (which when combined with group would result in 3 sort args, which isn't supported)
328
+ const steveOpts = { listMandatorySort: [] };
329
+
330
+ if (!opts.listGroupsWillOverride && schema.attributes.namespaced) {
331
+ // There's no pre-configured settings... and we're paginating... so use pagination specific groups
332
+ steveOpts.listGroups = STEVE_LIST_GROUPS;
333
+ steveOpts.listGroupsWillOverride = true;
334
+ }
335
+
336
+ return steveOpts;
337
+ }
338
+ },
339
+
237
340
  };
@@ -1,4 +1,4 @@
1
- import { ANNOTATIONS_TO_IGNORE_REGEX, LABELS_TO_IGNORE_REGEX } from '@shell/config/labels-annotations';
1
+ import { ANNOTATIONS_TO_IGNORE_REGEX, LABELS_TO_IGNORE_REGEX, DESCRIPTION } from '@shell/config/labels-annotations';
2
2
  import omitBy from 'lodash/omitBy';
3
3
  import pickBy from 'lodash/pickBy';
4
4
  import Vue from 'vue';
@@ -100,4 +100,8 @@ export default class HybridModel extends Resource {
100
100
  get state() {
101
101
  return this.stateObj?.name || 'unknown';
102
102
  }
103
+
104
+ get description() {
105
+ return this.metadata?.annotations?.[DESCRIPTION] || this.spec?.description || this._description;
106
+ }
103
107
  }
@@ -7,11 +7,13 @@ import {
7
7
  load,
8
8
  remove,
9
9
  batchChanges,
10
- replace
10
+ replace,
11
+ loadAdd
11
12
  } from '@shell/plugins/dashboard-store/mutations';
12
13
  import { perfLoadAll } from '@shell/plugins/steve/performanceTesting';
13
14
  import Vue from 'vue';
14
15
  import { classify } from '@shell/plugins/dashboard-store/classify';
16
+ import SteveSchema from '@shell/models/steve-schema';
15
17
 
16
18
  function registerNamespace(state, namespace) {
17
19
  let cache = state.podsByNamespace[namespace];
@@ -121,7 +123,8 @@ export default {
121
123
  ctx,
122
124
  skipHaveAll,
123
125
  namespace,
124
- revision
126
+ revision,
127
+ pagination
125
128
  }) {
126
129
  // Performance testing in dev and when env var is set
127
130
  if (process.env.dev && !!process.env.perfTest) {
@@ -129,7 +132,7 @@ export default {
129
132
  }
130
133
 
131
134
  const proxies = loadAll(state, {
132
- type, data, ctx, skipHaveAll, namespace, revision
135
+ type, data, ctx, skipHaveAll, namespace, revision, pagination
133
136
  });
134
137
 
135
138
  // If we loaded a set of pods, then update the podsByNamespace cache
@@ -159,13 +162,21 @@ export default {
159
162
  },
160
163
 
161
164
  reset(state) {
165
+ // Reset generic store things.... then steve specific things
166
+
162
167
  resetStore(state, this.commit);
168
+
163
169
  this.commit(`${ state.config.namespace }/resetSubscriptions`);
164
170
 
165
171
  // Clear the podsByNamespace cache
166
172
  state.podsByNamespace = {};
173
+
174
+ SteveSchema.reset(state.config.namespace);
167
175
  },
168
176
 
177
+ /**
178
+ * Load multiple different types of resources
179
+ */
169
180
  loadMulti(state, { data, ctx }) {
170
181
  for (const entry of data) {
171
182
  const resource = load(state, { data: entry, ctx });
@@ -179,6 +190,16 @@ export default {
179
190
  }
180
191
  },
181
192
 
193
+ loadAdd(state, { type, data: allLatest, ctx }) {
194
+ loadAdd(state, {
195
+ type, data: allLatest, ctx
196
+ });
197
+
198
+ if (allLatest.length && allLatest[0].type === POD) {
199
+ updatePodsByNamespaceCache(state, ctx, allLatest, false);
200
+ }
201
+ },
202
+
182
203
  remove(state, obj) {
183
204
  remove(state, obj, this.getters);
184
205
 
@@ -1,8 +1,34 @@
1
1
  import { ANNOTATIONS_TO_IGNORE_REGEX, LABELS_TO_IGNORE_REGEX } from '@shell/config/labels-annotations';
2
2
  import pickBy from 'lodash/pickBy';
3
3
  import Vue from 'vue';
4
- import { matchesSomeRegex } from '@shell/utils/string';
5
- import Resource from '@shell/plugins/dashboard-store/resource-class';
4
+ import { findBy } from '@shell/utils/array';
5
+ import { matchesSomeRegex, coerceStringTypeToScalarType } from '@shell/utils/string';
6
+ import Resource, { DNS_LIKE_TYPES } from '@shell/plugins/dashboard-store/resource-class';
7
+ import { get } from '@shell/utils/object';
8
+ import {
9
+ displayKeyFor,
10
+ validateBoolean,
11
+ validateChars,
12
+ validateDnsLikeTypes,
13
+ validateLength,
14
+ } from '@shell/utils/validators';
15
+ import { normalizeType } from '@shell/plugins/dashboard-store/normalize';
16
+ import isString from 'lodash/isString';
17
+ import uniq from 'lodash/uniq';
18
+
19
+ import isEmpty from 'lodash/isEmpty';
20
+
21
+ const STRING_LIKE_TYPES = [
22
+ 'string',
23
+ 'date',
24
+ 'blob',
25
+ 'enum',
26
+ 'multiline',
27
+ 'masked',
28
+ 'password',
29
+ 'dnsLabel',
30
+ 'hostname',
31
+ ];
6
32
 
7
33
  export default class NormanModel extends Resource {
8
34
  setLabels(val) {
@@ -56,4 +82,118 @@ export default class NormanModel extends Resource {
56
82
  Vue.set(this, key, { ...spec[key] });
57
83
  });
58
84
  }
85
+
86
+ isCondition(condition, withStatus = 'True') {
87
+ if ( !this.conditions ) {
88
+ return false;
89
+ }
90
+
91
+ const entry = findBy((this.conditions || []), 'type', condition);
92
+
93
+ if ( !entry ) {
94
+ return false;
95
+ }
96
+
97
+ if ( !withStatus ) {
98
+ return true;
99
+ }
100
+
101
+ return (entry.status || '').toLowerCase() === `${ withStatus }`.toLowerCase();
102
+ }
103
+
104
+ /**
105
+ * Check this instance is valid against
106
+ * - the schema's resource fields
107
+ * - also calls super.validationErrors
108
+ */
109
+ validationErrors(data = this, opt = { ignoreFields: undefined }) {
110
+ const errors = [];
111
+ const {
112
+ type: originalType,
113
+ schema
114
+ } = data;
115
+ const type = normalizeType(originalType);
116
+
117
+ if ( !originalType ) {
118
+ // eslint-disable-next-line
119
+ console.warn(this.t('validation.noType'), data);
120
+
121
+ return errors;
122
+ }
123
+
124
+ if ( !schema ) {
125
+ // eslint-disable-next-line
126
+ // console.warn(this.t('validation.noSchema'), originalType, data);
127
+
128
+ return errors;
129
+ }
130
+
131
+ const fields = schema.resourceFields || {};
132
+ const keys = Object.keys(fields);
133
+ let field, key, val, displayKey;
134
+
135
+ for ( let i = 0 ; i < keys.length ; i++ ) {
136
+ const fieldErrors = [];
137
+
138
+ key = keys[i];
139
+ field = fields[key];
140
+ val = get(data, key);
141
+ displayKey = displayKeyFor(type, key, this.$rootGetters);
142
+
143
+ const fieldType = field?.type ? normalizeType(field.type) : null;
144
+ const valIsString = isString(val);
145
+
146
+ if ( opt.ignoreFields && opt.ignoreFields.includes(key) ) {
147
+ continue;
148
+ }
149
+
150
+ if ( val === undefined ) {
151
+ val = null;
152
+ }
153
+
154
+ if (valIsString) {
155
+ if (fieldType) {
156
+ Vue.set(data, key, coerceStringTypeToScalarType(val, fieldType));
157
+ }
158
+
159
+ // Empty strings on nullable string fields -> null
160
+ if ( field.nullable && val.length === 0 && STRING_LIKE_TYPES.includes(fieldType)) {
161
+ val = null;
162
+
163
+ Vue.set(data, key, val);
164
+ }
165
+ }
166
+ if (fieldType === 'boolean') {
167
+ validateBoolean(val, field, displayKey, this.$rootGetters, fieldErrors);
168
+ } else {
169
+ validateLength(val, field, displayKey, this.$rootGetters, fieldErrors);
170
+ validateChars(val, field, displayKey, this.$rootGetters, fieldErrors);
171
+ }
172
+
173
+ if (fieldErrors.length > 0) {
174
+ fieldErrors.push(this.t('validation.required', { key: displayKey }));
175
+ errors.push(...fieldErrors);
176
+ continue;
177
+ }
178
+
179
+ // IDs claim to be these but are lies...
180
+ if ( key !== 'id' && !isEmpty(val) && DNS_LIKE_TYPES.includes(fieldType) ) {
181
+ // DNS types should be lowercase
182
+ const tolower = (val || '').toLowerCase();
183
+
184
+ if ( tolower !== val ) {
185
+ val = tolower;
186
+
187
+ Vue.set(data, key, val);
188
+ }
189
+
190
+ fieldErrors.push(...validateDnsLikeTypes(val, fieldType, displayKey, this.$rootGetters, fieldErrors));
191
+ }
192
+ errors.push(...fieldErrors);
193
+ }
194
+
195
+ const rootErrors = super.validationErrors(this, opt);
196
+
197
+ return uniq([...errors, ...rootErrors]);
198
+ }
59
199
  }
@@ -1,7 +1,6 @@
1
1
  import { NAMESPACE_FILTER_NS_FULL_PREFIX, NAMESPACE_FILTER_P_FULL_PREFIX } from '@shell/utils/namespace-filter';
2
2
  import { getPerformanceSetting } from '@shell/utils/settings';
3
-
4
- type Opt = { [key: string]: any, namespaced?: string[]}
3
+ import { ActionFindAllArgs } from '@shell/types/store/dashboard-store.types';
5
4
 
6
5
  class ProjectAndNamespaceFiltering {
7
6
  static param = 'projectsornamespaces'
@@ -9,7 +8,7 @@ class ProjectAndNamespaceFiltering {
9
8
  /**
10
9
  * Does the request `opt` definition require resources are fetched from a specific set namespaces/projects?
11
10
  */
12
- isApplicable(opt: Opt): boolean {
11
+ isApplicable(opt: ActionFindAllArgs): boolean {
13
12
  return Array.isArray(opt.namespaced);
14
13
  }
15
14
 
@@ -37,7 +36,7 @@ class ProjectAndNamespaceFiltering {
37
36
  /**
38
37
  * Check if `opt` requires resources from specific ns/projects, if so return the required query param (x=y)
39
38
  */
40
- checkAndCreateParam(opt: Opt): string {
39
+ checkAndCreateParam(opt: ActionFindAllArgs): string {
41
40
  if (!this.isApplicable(opt)) {
42
41
  return '';
43
42
  }
@@ -45,17 +44,36 @@ class ProjectAndNamespaceFiltering {
45
44
  return this.createParam(opt.namespaced);
46
45
  }
47
46
 
48
- private createParam(namespaceFilter: string[] | undefined): string {
47
+ public createParam(namespaceFilter: string[] | undefined): string {
49
48
  if (!namespaceFilter || !namespaceFilter.length) {
50
49
  return '';
51
50
  }
52
51
 
53
- const projectsOrNamespaces = namespaceFilter
54
- .map((f) => f.replace(NAMESPACE_FILTER_NS_FULL_PREFIX, '')
55
- .replace(NAMESPACE_FILTER_P_FULL_PREFIX, ''))
56
- .join(',');
52
+ const namespaces = namespaceFilter.reduce((res, n) => {
53
+ const name = n
54
+ .replace(NAMESPACE_FILTER_NS_FULL_PREFIX, '')
55
+ .replace(NAMESPACE_FILTER_P_FULL_PREFIX, '');
56
+
57
+ if (name.startsWith('-')) {
58
+ res.exclude.push(n.substring(1, n.length));
59
+ } else {
60
+ res.include.push(name);
61
+ }
62
+
63
+ return res;
64
+ }, { include: [] as string[], exclude: [] as string[] });
65
+
66
+ let res = '';
67
+
68
+ if (namespaces.include.length) {
69
+ res = `${ ProjectAndNamespaceFiltering.param }=${ namespaces.include.join(',') }`;
70
+ }
71
+
72
+ if (namespaces.exclude.length) {
73
+ res = `${ ProjectAndNamespaceFiltering.param }!=${ namespaces.exclude.join(',') }`;
74
+ }
57
75
 
58
- return `${ ProjectAndNamespaceFiltering.param }=${ projectsOrNamespaces }`;
76
+ return res;
59
77
  }
60
78
  }
61
79
 
@@ -0,0 +1,38 @@
1
+ import { dropKeys } from '@shell/utils/object';
2
+ import jsyaml from 'js-yaml';
3
+
4
+ export function steveCleanForDownload(yaml: string, keys?: {
5
+ rootKeys?: string[],
6
+ metadataKeys?: string[],
7
+ conditionKeys?: string[]
8
+ }): string | undefined {
9
+ if (!yaml) {
10
+ return;
11
+ }
12
+
13
+ const {
14
+ rootKeys = [
15
+ 'id',
16
+ 'links',
17
+ 'type',
18
+ 'actions'
19
+ ],
20
+ metadataKeys = [
21
+ 'fields',
22
+ 'relationships',
23
+ 'state',
24
+ ],
25
+ conditionKeys = [
26
+ 'error',
27
+ 'transitioning',
28
+ ]
29
+ } = keys || {};
30
+
31
+ const obj: any = jsyaml.load(yaml);
32
+
33
+ dropKeys(obj, rootKeys);
34
+ dropKeys(obj?.metadata, metadataKeys);
35
+ (obj?.status?.conditions || []).forEach((condition: any) => dropKeys(condition, conditionKeys));
36
+
37
+ return jsyaml.dump(obj);
38
+ }