@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
@@ -1,6 +1,109 @@
1
1
  import { mount } from '@vue/test-utils';
2
2
  import Banzai from '@shell/edit/logging.banzaicloud.io.output/index.vue';
3
3
 
4
+ const outputSchema = {
5
+ id: 'logging.banzaicloud.io.output',
6
+ type: 'schema',
7
+ links: {
8
+ collection: 'https://localhost:8005/v1/logging.banzaicloud.io.outputs',
9
+ self: 'https://localhost:8005/v1/schemas/logging.banzaicloud.io.output'
10
+ },
11
+ pluralName: 'logging.banzaicloud.io.outputs',
12
+ resourceMethods: [
13
+ 'GET',
14
+ 'DELETE',
15
+ 'PUT',
16
+ 'PATCH'
17
+ ],
18
+ _resourceFields: null,
19
+ requiresResourceFields: true,
20
+ collectionMethods: [
21
+ 'GET',
22
+ 'POST'
23
+ ],
24
+ attributes: {
25
+ columns: [
26
+ {
27
+ name: 'Active',
28
+ field: '.status.active',
29
+ type: 'boolean'
30
+ },
31
+ {
32
+ name: 'Problems',
33
+ field: '.status.problemsCount',
34
+ type: 'integer'
35
+ }
36
+ ],
37
+ group: 'logging.banzaicloud.io',
38
+ kind: 'Output',
39
+ namespaced: true,
40
+ resource: 'outputs',
41
+ verbs: [
42
+ 'delete',
43
+ 'deletecollection',
44
+ 'get',
45
+ 'list',
46
+ 'patch',
47
+ 'create',
48
+ 'update',
49
+ 'watch'
50
+ ],
51
+ version: 'v1beta1'
52
+ },
53
+ _id: 'logging.banzaicloud.io.output',
54
+ _group: 'logging.banzaicloud.io',
55
+ store: 'cluster',
56
+ _schemaDefinitionsIds: {
57
+ self: 'io.banzaicloud.logging.v1beta1.Output',
58
+ others: [
59
+ 'io.banzaicloud.logging.v1beta1.Output.spec',
60
+ 'io.banzaicloud.logging.v1beta1.Output.spec.awsElasticsearch.buffer'
61
+ ]
62
+ },
63
+ schemaDefinitions: {
64
+ 'io.banzaicloud.logging.v1beta1.Output.spec.awsElasticsearch.buffer': {
65
+ resourceFields: {
66
+ chunk_full_threshold: { type: 'string' },
67
+ chunk_limit_records: { type: 'int' },
68
+ chunk_limit_size: { type: 'string' },
69
+ compress: { type: 'string' },
70
+ delayed_commit_timeout: { type: 'string' },
71
+ disable_chunk_backup: { type: 'boolean' },
72
+ disabled: { type: 'boolean' },
73
+ flush_at_shutdown: { type: 'boolean' },
74
+ flush_interval: { type: 'string' },
75
+ flush_mode: { type: 'string' },
76
+ flush_thread_burst_interval: { type: 'string' },
77
+ flush_thread_count: { type: 'int' },
78
+ flush_thread_interval: { type: 'string' },
79
+ overflow_action: { type: 'string' },
80
+ path: { type: 'string' },
81
+ queue_limit_length: { type: 'int' },
82
+ queued_chunks_limit_size: { type: 'int' },
83
+ retry_exponential_backoff_base: { type: 'string' },
84
+ retry_forever: { type: 'boolean' },
85
+ retry_max_interval: { type: 'string' },
86
+ retry_max_times: { type: 'int' },
87
+ retry_randomize: { type: 'boolean' },
88
+ retry_secondary_threshold: { type: 'string' },
89
+ retry_timeout: { type: 'string' },
90
+ retry_type: { type: 'string' },
91
+ retry_wait: { type: 'string' },
92
+ tags: { type: 'string' },
93
+ timekey: { type: 'string' },
94
+ timekey_use_utc: { type: 'boolean' },
95
+ timekey_wait: { type: 'string' },
96
+ timekey_zone: { type: 'string' },
97
+ total_limit_size: { type: 'string' },
98
+ type: { type: 'string' }
99
+ },
100
+ type: 'io.banzaicloud.logging.v1beta1.Output.spec.awsElasticsearch.buffer',
101
+ description: ''
102
+ }
103
+ },
104
+ fetchResourceFields: async() => jest.fn()
105
+ };
106
+
4
107
  describe('view: logging.banzaicloud.io.output', () => {
5
108
  it.each([
6
109
  ['http://localhost:3100', []],
@@ -15,8 +118,10 @@ describe('view: logging.banzaicloud.io.output', () => {
15
118
  }
16
119
  },
17
120
  mocks: {
18
- $store: {
19
- getters: {
121
+ $fetchState: { pending: false },
122
+ $store: {
123
+ dispatch: jest.fn(),
124
+ getters: {
20
125
  currentStore: () => 'current_store',
21
126
  'management/schemaFor': jest.fn(),
22
127
  'current_store/all': jest.fn(),
@@ -40,4 +145,129 @@ describe('view: logging.banzaicloud.io.output', () => {
40
145
 
41
146
  expect((wrapper.vm as any).errors).toStrictEqual(expectation);
42
147
  });
148
+
149
+ it('should load the default YAML data for output buffer config (from schema) in a CREATE scenario', async() => {
150
+ const wrapper = mount(Banzai, {
151
+ data: () => ({ selectedProvider: 'awsElasticsearch' }),
152
+ propsData: {
153
+ value: {
154
+ save: jest.fn(),
155
+ spec: {}
156
+ }
157
+ },
158
+ mocks: {
159
+ $fetchState: { pending: false },
160
+ $store: {
161
+ dispatch(arg: any) {
162
+ if (arg === 'cluster/find') {
163
+ return outputSchema;
164
+ }
165
+
166
+ return jest.fn();
167
+ },
168
+ getters: {
169
+ currentStore: () => 'current_store',
170
+ 'management/schemaFor': jest.fn(),
171
+ 'current_store/all': jest.fn(),
172
+ 'current_store/schemaFor': jest.fn(),
173
+ 'cluster/all': () => [outputSchema],
174
+ 'cluster/byId': () => outputSchema,
175
+ 'type-map/isSpoofed': jest.fn(),
176
+ 'i18n/t': jest.fn().mockImplementation((key: string) => key),
177
+ namespaces: () => ({}),
178
+ }
179
+ },
180
+ $route: {
181
+ name: 'whatever',
182
+ query: { AS: '' }
183
+ },
184
+ $router: { replace: jest.fn() },
185
+ }
186
+ });
187
+
188
+ // call async fetch - needed for test assertion
189
+ await Banzai.fetch.call(wrapper.vm);
190
+
191
+ const yaml = `#chunk_limit_records: int
192
+ #chunk_limit_size: string
193
+ #compress: string
194
+ #delayed_commit_timeout: string
195
+ #disable_chunk_backup: boolean
196
+ #disabled: boolean
197
+ #flush_at_shutdown: boolean
198
+ #flush_interval: string
199
+ #flush_mode: string
200
+ #flush_thread_burst_interval: string
201
+ #flush_thread_count: int
202
+ #flush_thread_interval: string
203
+ #overflow_action: string
204
+ #path: string
205
+ #queue_limit_length: int
206
+ #queued_chunks_limit_size: int
207
+ #retry_exponential_backoff_base: string
208
+ #retry_forever: boolean
209
+ #retry_max_interval: string
210
+ #retry_max_times: int
211
+ #retry_randomize: boolean
212
+ #retry_secondary_threshold: string
213
+ #retry_timeout: string
214
+ #retry_type: string
215
+ #retry_wait: string
216
+ #tags: string
217
+ #timekey: string
218
+ #timekey_use_utc: boolean
219
+ #timekey_wait: string
220
+ #timekey_zone: string
221
+ #total_limit_size: string
222
+ #type: string`;
223
+
224
+ expect(wrapper.vm.initialBufferYaml).toStrictEqual(yaml);
225
+ expect(wrapper.vm.bufferYaml).toStrictEqual(yaml);
226
+ });
227
+
228
+ it('should load current output buffer config in an EDIT scenario', async() => {
229
+ const wrapper = mount(Banzai, {
230
+ data: () => ({ selectedProvider: 'awsElasticsearch' }),
231
+ propsData: {
232
+ value: {
233
+ save: jest.fn(),
234
+ spec: { awsElasticsearch: { buffer: '#chunk_limit_records: int' } }
235
+ }
236
+ },
237
+ mocks: {
238
+ $fetchState: { pending: false },
239
+ $store: {
240
+ dispatch(arg: any) {
241
+ if (arg === 'cluster/find') {
242
+ return outputSchema;
243
+ }
244
+
245
+ return jest.fn();
246
+ },
247
+ getters: {
248
+ currentStore: () => 'current_store',
249
+ 'management/schemaFor': jest.fn(),
250
+ 'current_store/all': jest.fn(),
251
+ 'current_store/schemaFor': jest.fn(),
252
+ 'cluster/all': jest.fn(),
253
+ 'cluster/byId': () => outputSchema,
254
+ 'type-map/isSpoofed': jest.fn(),
255
+ 'i18n/t': jest.fn().mockImplementation((key: string) => key),
256
+ namespaces: () => ({}),
257
+ }
258
+ },
259
+ $route: {
260
+ name: 'whatever',
261
+ query: { AS: '' }
262
+ },
263
+ $router: { replace: jest.fn() },
264
+ }
265
+ });
266
+
267
+ // call async fetch - needed for test assertion
268
+ await Banzai.fetch.call(wrapper.vm);
269
+
270
+ expect(wrapper.vm.initialBufferYaml).toContain('#chunk_limit_records: int');
271
+ expect(wrapper.vm.bufferYaml).toContain('#chunk_limit_records: int');
272
+ });
43
273
  });
@@ -1,6 +1,7 @@
1
1
  <script>
2
2
  import CreateEditView from '@shell/mixins/create-edit-view';
3
- import { SECRET, LOGGING, SCHEMA } from '@shell/config/types';
3
+ import Loading from '@shell/components/Loading';
4
+ import { LOGGING, SCHEMA } from '@shell/config/types';
4
5
  import Tabbed from '@shell/components/Tabbed';
5
6
  import Tab from '@shell/components/Tabbed/Tab';
6
7
  import CruResource from '@shell/components/CruResource';
@@ -19,18 +20,45 @@ import YamlEditor, { EDITOR_MODES } from '@shell/components/YamlEditor';
19
20
 
20
21
  export default {
21
22
  components: {
22
- Banner, CruResource, Labels, LabeledSelect, NameNsDescription, Tab, Tabbed, YamlEditor
23
- },
23
+ Banner, CruResource, Labels, LabeledSelect, NameNsDescription, Tab, Tabbed, YamlEditor, Loading
24
+ }, //
24
25
 
25
26
  mixins: [CreateEditView],
26
27
 
27
28
  async fetch() {
28
- await this.$store.dispatch('cluster/findAll', { type: SECRET });
29
+ const schemas = this.$store.getters['cluster/all'](SCHEMA);
30
+ const resourceSchema = this.$store.getters['cluster/byId'](SCHEMA, LOGGING.OUTPUT);
31
+ const schemaDefinition = await resourceSchema.fetchResourceFields();
32
+
33
+ let bufferYaml = '';
34
+
35
+ if ( !isEmpty(this.value.spec[this.selectedProvider]?.buffer) ) {
36
+ bufferYaml = jsyaml.dump(this.value.spec[this.selectedProvider].buffer);
37
+ } else if (schemaDefinition) {
38
+ bufferYaml = createYaml(
39
+ schemas,
40
+ `io.banzaicloud.logging.v1beta1.Output.spec.${ this.selectedProvider }.buffer`,
41
+ {},
42
+ true,
43
+ 1,
44
+ '',
45
+ LOGGING.OUTPUT
46
+ );
47
+
48
+ // createYaml doesn't support passing reference types (array, map) as the first type. As such
49
+ // I'm manipulating the output since I'm not sure it's something we want to actually support
50
+ // seeing as it's really createResourceYaml and this here is a gray area between spoofed types
51
+ // and just a field within a spec.
52
+ bufferYaml = bufferYaml.substring(bufferYaml.indexOf('\n') + 1).replace(/# {2}/g, '#');
53
+ }
54
+
55
+ if (bufferYaml.length) {
56
+ this.bufferYaml = bufferYaml;
57
+ this.initialBufferYaml = bufferYaml;
58
+ }
29
59
  },
30
60
 
31
61
  data() {
32
- const schemas = this.$store.getters['cluster/all'](SCHEMA);
33
-
34
62
  if (this.isCreate) {
35
63
  this.value.metadata.namespace = 'default';
36
64
  }
@@ -44,8 +72,6 @@ export default {
44
72
  }));
45
73
 
46
74
  if (this.mode !== _VIEW) {
47
- this.$set(this.value, 'spec', this.value.spec || {});
48
-
49
75
  providers.forEach((provider) => {
50
76
  this.$set(this.value.spec, provider.name, this.value.spec[provider.name] || clone(provider.default));
51
77
  });
@@ -58,28 +84,15 @@ export default {
58
84
  return !isEmpty(correctedSpecProvider) && !isEqual(correctedSpecProvider, provider.default);
59
85
  });
60
86
 
61
- const selectedProvider = selectedProviders?.[0]?.value || providers[0].value;
62
-
63
- let bufferYaml;
87
+ const hasMultipleProvidersSelected = selectedProviders?.length > 1;
64
88
 
65
- if ( !isEmpty(this.value.spec[selectedProvider]?.buffer) ) {
66
- bufferYaml = jsyaml.dump(this.value.spec[selectedProvider].buffer);
67
- } else {
68
- bufferYaml = createYaml(schemas, `logging.banzaicloud.io.v1beta1.output.spec.${ selectedProvider }.buffer`, []);
69
- // createYaml doesn't support passing reference types (array, map) as the first type. As such
70
- // I'm manipulating the output since I'm not sure it's something we want to actually support
71
- // seeing as it's really createResourceYaml and this here is a gray area between spoofed types
72
- // and just a field within a spec.
73
- bufferYaml = bufferYaml.substring(bufferYaml.indexOf('\n') + 1).replace(/# {2}/g, '#');
74
- }
89
+ const selectedProvider = selectedProviders?.[0]?.value || providers[0].value;
75
90
 
76
91
  return {
77
- bufferYaml,
78
- initialBufferYaml: bufferYaml,
92
+ bufferYaml: '',
79
93
  providers,
80
94
  selectedProvider,
81
- hasMultipleProvidersSelected: selectedProviders?.length > 1,
82
- selectedProviders,
95
+ hasMultipleProvidersSelected,
83
96
  LOGGING
84
97
  };
85
98
  },
@@ -157,7 +170,11 @@ export default {
157
170
  </script>
158
171
 
159
172
  <template>
160
- <div class="output">
173
+ <Loading v-if="$fetchState.pending" />
174
+ <div
175
+ v-else
176
+ class="output"
177
+ >
161
178
  <CruResource
162
179
  :done-route="doneRoute"
163
180
  :mode="cruMode"
@@ -1,15 +1,15 @@
1
1
  <script lang="ts">
2
- import Vue, { PropType, VueConstructor } from 'vue';
2
+ import { PropType, defineComponent } from 'vue';
3
3
  import CreateEditView from '@shell/mixins/create-edit-view';
4
4
  import CruResource from '@shell/components/CruResource.vue';
5
5
  import PodSecurityAdmission from '@shell/components/PodSecurityAdmission.vue';
6
6
  import Loading from '@shell/components/Loading.vue';
7
7
  import NameNsDescription from '@shell/components/form/NameNsDescription.vue';
8
- import { PSA, PSAConfig, PSADefaults, PSAExemptions } from '@shell/types/pod-security-admission';
8
+ import { PSA, PSAConfig, PSADefaults, PSAExemptions } from '@shell/types/resources/pod-security-admission';
9
9
  import { PSADimensions } from '@shell/config/pod-security-admission';
10
10
  import { MANAGEMENT } from '@shell/config/types';
11
11
 
12
- export default (Vue as VueConstructor<Vue & InstanceType<typeof CreateEditView>>).extend({
12
+ export default defineComponent({
13
13
  mixins: [CreateEditView],
14
14
  components: {
15
15
  CruResource,
@@ -103,8 +103,9 @@ export default {
103
103
  methods: {
104
104
  async save(saveCb) {
105
105
  try {
106
- // clear up of the unused resourceQuotas will now be done on the model side
106
+ this.errors = [];
107
107
 
108
+ // clear up of the unused resourceQuotas will now be done on the model side
108
109
  if (this.mode === _CREATE) {
109
110
  const savedProject = await this.value.save();
110
111
 
@@ -43,6 +43,7 @@ export default {
43
43
  created() {
44
44
  this.value.value = this.value.value || this.value.default;
45
45
  this.enumOptions = this.setting?.kind === 'enum' ? this.setting.options.map((id) => ({
46
+ // i18n-uses advancedSettings.enum.*
46
47
  label: `advancedSettings.enum.${ this.value.id }.${ id }`,
47
48
  value: id,
48
49
  })) : [];
@@ -51,6 +52,12 @@ export default {
51
52
  path: 'value',
52
53
  rules: this.setting.ruleSet.map(({ name }) => name)
53
54
  }] : [];
55
+
56
+ // Don't allow the user to reset the server URL if there is no default
57
+ // helps to ensure that a value is always set
58
+ if (isServerUrl(this.value.id) && !this.value.default) {
59
+ this.canReset = false;
60
+ }
54
61
  },
55
62
 
56
63
  computed: {
@@ -72,6 +79,10 @@ export default {
72
79
  return isServerUrl(this.value.id) && isLocalhost(this.value.value);
73
80
  },
74
81
 
82
+ showWarningBanner() {
83
+ return this.setting?.warning;
84
+ },
85
+
75
86
  validationPassed() {
76
87
  return this.fvFormIsValid && this.fvGetPathErrors(['value']).length === 0;
77
88
  }
@@ -134,6 +145,13 @@ export default {
134
145
  @finish="saveSettings"
135
146
  @cancel="done"
136
147
  >
148
+ <Banner
149
+ v-if="showWarningBanner"
150
+ color="warning"
151
+ :label="t(`advancedSettings.warnings.${ setting.warning }`)"
152
+ data-testid="advanced_settings_warning_banner"
153
+ />
154
+
137
155
  <h4>{{ description }}</h4>
138
156
 
139
157
  <h5
@@ -159,6 +177,7 @@ export default {
159
177
  v-if="showLocalhostWarning"
160
178
  color="warning"
161
179
  :label="t('validation.setting.serverUrl.localhost')"
180
+ data-testid="setting-serverurl-localhost-warning"
162
181
  />
163
182
 
164
183
  <Banner
@@ -166,6 +185,7 @@ export default {
166
185
  :key="i"
167
186
  color="error"
168
187
  :label="err"
188
+ data-testid="setting-error-banner"
169
189
  />
170
190
 
171
191
  <div class="mt-20">
@@ -8,6 +8,7 @@ import CruResource from '@shell/components/CruResource';
8
8
  import { exceptionToErrorsArray } from '@shell/utils/error';
9
9
  import { _CREATE, _EDIT } from '@shell/config/query-params';
10
10
  import Loading from '@shell/components/Loading';
11
+ import { wait } from '@shell/utils/async';
11
12
 
12
13
  export default {
13
14
  components: {
@@ -159,7 +160,7 @@ export default {
159
160
  // - Fetching the norman user again sometimes shows the correct value, sometimes not
160
161
  // - Even if the fetched norman user shows the correct value, it doesn't show up in the steve user
161
162
  // - Looks like we re-request the stale version via socket?
162
- await new Promise((resolve) => setTimeout(resolve, 5000));
163
+ await wait(5000);
163
164
  }
164
165
 
165
166
  // Save user updates
@@ -13,6 +13,7 @@ import RouteConfig from './routeConfig';
13
13
  import ResourceTable from '@shell/components/ResourceTable';
14
14
  import ActionMenu from '@shell/components/ActionMenu';
15
15
  import { _CREATE, _EDIT, _VIEW, _CONFIG } from '@shell/config/query-params';
16
+ import { fetchAlertManagerConfigSpecs } from '@shell/utils/alertmanagerconfig';
16
17
 
17
18
  export default {
18
19
  components: {
@@ -32,11 +33,16 @@ export default {
32
33
  const inStore = this.$store.getters['currentProduct'].inStore;
33
34
  const alertmanagerConfigId = this.value.id;
34
35
 
36
+ const { receiverSchema, routeSchema } = await fetchAlertManagerConfigSpecs(this.$store);
37
+
38
+ this.receiverSchema = receiverSchema;
39
+ this.routeSchema = routeSchema;
40
+
35
41
  const alertmanagerConfigResource = await this.$store.dispatch(`${ inStore }/find`, { type: MONITORING.ALERTMANAGERCONFIG, id: alertmanagerConfigId });
36
42
 
37
43
  this.alertmanagerConfigId = alertmanagerConfigId;
38
44
  this.alertmanagerConfigResource = alertmanagerConfigResource;
39
- this.alertmanagerConfigDetailRoute = alertmanagerConfigResource._detailLocation;
45
+ this.alertmanagerConfigDetailRoute = alertmanagerConfigResource?._detailLocation;
40
46
 
41
47
  const alertmanagerConfigActions = alertmanagerConfigResource.availableActions;
42
48
  const receiverActions = alertmanagerConfigResource.getReceiverActions(alertmanagerConfigActions);
@@ -48,8 +54,6 @@ export default {
48
54
  this.value.applyDefaults();
49
55
 
50
56
  const defaultReceiverValues = {};
51
- const receiverSchema = this.$store.getters['cluster/schemaFor'](MONITORING.SPOOFED.ALERTMANAGERCONFIG_RECEIVER_SPEC);
52
- const routeSchema = this.$store.getters['cluster/schemaFor'](MONITORING.SPOOFED.ALERTMANAGERCONFIG_ROUTE_SPEC);
53
57
  const receiverOptions = (this.value?.spec?.receivers || []).map((receiver) => receiver.name);
54
58
 
55
59
  return {
@@ -82,8 +86,6 @@ export default {
82
86
  receiverActions: [],
83
87
  receiverOptions,
84
88
  receiverTypes: RECEIVERS_TYPES,
85
- routeSchema,
86
- receiverSchema,
87
89
  selectedReceiverName: '',
88
90
  selectedRowValue: null,
89
91
  view: _VIEW,
@@ -224,7 +226,7 @@ export default {
224
226
  @clickedActionButton="setActionMenuState"
225
227
  >
226
228
  <template #header-button>
227
- <nuxt-link
229
+ <router-link
228
230
  v-if="createReceiverLink && createReceiverLink.name"
229
231
  :to="mode !== create ? createReceiverLink : {}"
230
232
  >
@@ -232,6 +234,7 @@ export default {
232
234
  class="btn role-primary"
233
235
  :disabled="mode === create"
234
236
  :tooltip="t('monitoring.alertmanagerConfig.disabledReceiverButton')"
237
+ data-testid="v2-monitoring-add-receiver"
235
238
  >
236
239
  {{ t('monitoring.receiver.addReceiver') }}
237
240
  <i
@@ -240,7 +243,7 @@ export default {
240
243
  class="icon icon-info"
241
244
  />
242
245
  </button>
243
- </nuxt-link>
246
+ </router-link>
244
247
  </template>
245
248
  </ResourceTable>
246
249
  </Tab>
@@ -1,5 +1,4 @@
1
1
  <script>
2
- import { MONITORING } from '@shell/config/types';
3
2
  import ArrayListGrouped from '@shell/components/form/ArrayListGrouped';
4
3
  import Loading from '@shell/components/Loading';
5
4
  import { Banner } from '@components/Banner';
@@ -13,7 +12,10 @@ import jsyaml from 'js-yaml';
13
12
  import ButtonDropdown from '@shell/components/ButtonDropdown';
14
13
  import { _CREATE, _VIEW } from '@shell/config/query-params';
15
14
  import FormValidation from '@shell/mixins/form-validation';
15
+ import { fetchAlertManagerConfigSpecs } from '@shell/utils/alertmanagerconfig';
16
16
 
17
+ // i18n-uses monitoringReceiver.slack.*, monitoringReceiver.email.*, monitoringReceiver.pagerduty.*
18
+ // i18n-uses monitoringReceiver.opsgenie.*, monitoringReceiver.webhook.*, monitoringReceiver.custom.*
17
19
  export const RECEIVERS_TYPES = [
18
20
  {
19
21
  name: 'slack',
@@ -103,16 +105,7 @@ export default {
103
105
 
104
106
  mixins: [CreateEditView, FormValidation],
105
107
 
106
- data(props) {
107
- const currentReceiver = {};
108
- const mode = this.$route.query.mode;
109
-
110
- if (mode === _CREATE) {
111
- RECEIVERS_TYPES.forEach((receiverType) => {
112
- this.$set(currentReceiver, receiverType.key, currentReceiver[receiverType.key] || []);
113
- });
114
- }
115
-
108
+ async fetch() {
116
109
  /**
117
110
  * example receiver value:
118
111
  * {
@@ -120,14 +113,13 @@ export default {
120
113
  * slackConfigs: [...]
121
114
  * }
122
115
  */
123
- const receiverSchema = this.$store.getters['cluster/schemaFor'](MONITORING.SPOOFED.ALERTMANAGERCONFIG_RECEIVER_SPEC);
116
+ const { receiverSchema } = await fetchAlertManagerConfigSpecs(this.$store);
124
117
 
125
118
  if (!receiverSchema) {
126
- throw new Error("Can't render the form because the AlertmanagerConfig schema is not loaded yet.");
119
+ throw new Error("Can't render the form because the AlertmanagerConfig schema, or it's definitions, is not loaded yet.");
127
120
  }
128
121
 
129
122
  const expectedFields = Object.keys(receiverSchema.resourceFields);
130
-
131
123
  const suffix = {};
132
124
 
133
125
  Object.keys(this.value).forEach((key) => {
@@ -142,13 +134,25 @@ export default {
142
134
  suffixYaml = '';
143
135
  }
144
136
 
137
+ this.expectedFields = expectedFields;
138
+ this.suffixYaml = suffixYaml;
139
+ },
140
+
141
+ data(props) {
142
+ const currentReceiver = {};
143
+ const mode = this.$route.query.mode;
144
+
145
+ if (mode === _CREATE) {
146
+ RECEIVERS_TYPES.forEach((receiverType) => {
147
+ this.$set(currentReceiver, receiverType.key, currentReceiver[receiverType.key] || []);
148
+ });
149
+ }
150
+
145
151
  return {
146
152
  create: _CREATE,
147
153
  EDITOR_MODES,
148
- expectedFields,
149
154
  fileFound: false,
150
155
  receiverTypes: RECEIVERS_TYPES,
151
- suffixYaml,
152
156
  view: _VIEW,
153
157
  yamlError: '',
154
158
  fvFormRuleSets: [
@@ -286,6 +290,7 @@ export default {
286
290
  :required="true"
287
291
  :mode="mode"
288
292
  :rules="fvGetAndReportPathRules('name')"
293
+ data-testid="v2-monitoring-receiver-name"
289
294
  />
290
295
  </div>
291
296
  </div>
@@ -188,6 +188,7 @@ export default {
188
188
  :mode="mode"
189
189
  label="Proxy URL"
190
190
  placeholder="e.g. http://my-proxy/"
191
+ data-testid="v2-monitoring-receiver-pagerduty-proxy-url"
191
192
  />
192
193
  </div>
193
194
  </div>
@@ -285,6 +285,7 @@ export default {
285
285
  :label="t('prometheusRule.alertingRules.name')"
286
286
  :required="true"
287
287
  :mode="mode"
288
+ data-testid="v2-monitoring-alerting-rules-alert-name"
288
289
  />
289
290
  </div>
290
291
  <div class="col span-6">
@@ -314,6 +315,7 @@ export default {
314
315
  foldGutter: false,
315
316
  readOnly: mode === 'view',
316
317
  }"
318
+ data-testid="v2-monitoring-alerting-rules-promql"
317
319
  @onInput="queueUpdate"
318
320
  />
319
321
  </template>
@@ -353,6 +355,7 @@ export default {
353
355
  :label="t('prometheusRule.alertingRules.labels.severity.choices.label')"
354
356
  :localized-label="false"
355
357
  :options="severityOptions"
358
+ data-testid="v2-monitoring-alerting-rules-severity"
356
359
  />
357
360
  </div>
358
361
  </div>
@@ -144,6 +144,7 @@ export default {
144
144
  :disabled="disableAddRecord"
145
145
  type="button"
146
146
  class="btn role-tertiary"
147
+ data-testid="v2-monitoring-add-record"
147
148
  @click="addRule('record')"
148
149
  >
149
150
  <t k="prometheusRule.recordingRules.addLabel" />
@@ -193,6 +194,7 @@ export default {
193
194
  :disabled="disableAddAlert"
194
195
  type="button"
195
196
  class="btn role-tertiary"
197
+ data-testid="v2-monitoring-add-alert"
196
198
  @click="addRule('alert')"
197
199
  >
198
200
  <t k="prometheusRule.alertingRules.addLabel" />