@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
@@ -7,6 +7,34 @@ import { sortBy } from '@shell/utils/sort';
7
7
  import day from 'dayjs';
8
8
  import SteveModel from '@shell/plugins/steve/steve-class';
9
9
 
10
+ // This could be removed and just replaced with schema.fetchResourceFields()... but there's some getters that use hasSpecsScheduledScanConfig before it runs
11
+ /**
12
+ * For the given schema, determine if the schema of it's associated scan's type has scheduledScanConfig
13
+ *
14
+ * This is resourceFields based, so we need to fetch schema definition
15
+ */
16
+ export const fetchSpecsScheduledScanConfig = async(schema) => {
17
+ await schema.fetchResourceFields();
18
+
19
+ return hasSpecsScheduledScanConfig(schema);
20
+ };
21
+
22
+ /**
23
+ * For the given schema, determine if the schema of it's associated scan's type has scheduledScanConfig
24
+ *
25
+ * Assumes schemaDefinitions have been fetched (see async fetchSpecsScheduledScanConfig above)
26
+ */
27
+ export const hasSpecsScheduledScanConfig = (schema) => {
28
+ const specSchemaId = get(schema, 'resourceFields.spec.type');
29
+ const specSchema = schema.schemaDefinitions?.[specSchemaId];
30
+
31
+ if (!specSchema) {
32
+ return false;
33
+ }
34
+
35
+ return !!get(specSchema, 'resourceFields.scheduledScanConfig');
36
+ };
37
+
10
38
  export default class ClusterScan extends SteveModel {
11
39
  get _availableActions() {
12
40
  let out = super._availableActions;
@@ -64,14 +92,7 @@ export default class ClusterScan extends SteveModel {
64
92
  }
65
93
 
66
94
  canBeScheduled() {
67
- const schema = this.$getters['schemaFor'](this.type);
68
- const specSchema = this.$getters['schemaFor'](get(schema, 'resourceFields.spec.type') || '');
69
-
70
- if (!specSchema) {
71
- return false;
72
- }
73
-
74
- return !!get(specSchema, 'resourceFields.scheduledScanConfig');
95
+ return hasSpecsScheduledScanConfig(this.$getters['schemaFor'](this.type));
75
96
  }
76
97
 
77
98
  get isScheduled() {
@@ -32,8 +32,16 @@ export default class CloudCredential extends NormanModel {
32
32
  };
33
33
  }
34
34
 
35
+ get secretName() {
36
+ return this.id.replace(':', '/');
37
+ }
38
+
35
39
  get secret() {
36
- return this.$rootGetters['management/byId'](SECRET, this.id.replace(':', '/'));
40
+ return this.$rootGetters['management/byId'](SECRET, this.secretName);
41
+ }
42
+
43
+ async getSecret() {
44
+ await this.$dispatch('management/find', { type: SECRET, id: this.secretName }, { root: true });
37
45
  }
38
46
 
39
47
  get configKey() {
@@ -450,6 +450,10 @@ export default class ClusterNode extends SteveModel {
450
450
  get provider() {
451
451
  return this.$rootGetters['currentCluster'].provisioner.toLowerCase();
452
452
  }
453
+
454
+ get displayTaintsAndLabels() {
455
+ return !!this.spec.taints?.length || !!this.customLabelCount;
456
+ }
453
457
  }
454
458
 
455
459
  function calculatePercentage(allocatable, capacity) {
@@ -0,0 +1,6 @@
1
+ import SteveSchema from '../steve-schema';
2
+
3
+ /**
4
+ * This is the steve schema that's used for the cluster store
5
+ */
6
+ export default class ClusterStoreSchema extends SteveSchema { }
@@ -0,0 +1,33 @@
1
+ import NormanModel from '@shell/plugins/steve/norman-class';
2
+
3
+ export const LABEL_CONTAINS_PROTECTED = [
4
+ 'io.cattle.lifecycle',
5
+ 'kubernetes.io',
6
+ 'cattle.io',
7
+ 'k3s.io',
8
+ ];
9
+
10
+ export const ANNOTATIONS_CONTAINS_PROTECTED = [
11
+ 'coreos.com',
12
+ 'cattle.io',
13
+ 'k3s.io',
14
+ 'kubernetes.io',
15
+ 'k3s.io',
16
+ ];
17
+ export default class NormanCluster extends NormanModel {
18
+ get systemLabels() {
19
+ return Object.keys(this.labels || {}).filter((key) => LABEL_CONTAINS_PROTECTED.find((label) => key.includes(label)));
20
+ }
21
+
22
+ get systemAnnotations() {
23
+ return Object.keys(this.annotations || {}).filter((key) => ANNOTATIONS_CONTAINS_PROTECTED.find((annotation) => key.includes(annotation)));
24
+ }
25
+
26
+ get hasSystemLabels() {
27
+ return !!(this.systemLabels || []).length;
28
+ }
29
+
30
+ get hasSystemAnnotations() {
31
+ return !!(this.systemAnnotations || []).length;
32
+ }
33
+ }
@@ -0,0 +1,62 @@
1
+ import { DESCRIPTION } from '@shell/config/labels-annotations';
2
+ import NormanModel from '@shell/plugins/steve/norman-class';
3
+ import { KONTAINER_TO_DRIVER } from './management.cattle.io.kontainerdriver';
4
+
5
+ export default class Driver extends NormanModel {
6
+ get canViewYaml() {
7
+ return false;
8
+ }
9
+
10
+ get driverName() {
11
+ if (!this.builtIn) {
12
+ // if the driver is not built in, there's a good change its a custom one
13
+ // custom drivers have a random id, so shouldn't be used as the type
14
+ // instead use the status.displayName. this will map to the name extracted from the binary
15
+ const driverName = this.status?.displayName?.toLowerCase();
16
+
17
+ if (driverName) {
18
+ // some drivers are built in but don't have the builtIn flag. ensure we pass these through K_TO_D
19
+ return KONTAINER_TO_DRIVER[driverName] || driverName;
20
+ }
21
+ }
22
+
23
+ return KONTAINER_TO_DRIVER[this.id] || this.id;
24
+ }
25
+
26
+ get nameDisplay() {
27
+ const path = `cluster.provider.${ this.driverName }`;
28
+ const label = this.driverName || this.name || this.id;
29
+
30
+ return this.$rootGetters['i18n/withFallback'](path, label);
31
+ }
32
+
33
+ get description() {
34
+ if (!!this.builtIn || !!this.builtin) {
35
+ return this.$rootGetters['i18n/withFallback']('tableHeaders.builtIn');
36
+ } else {
37
+ return this.url;
38
+ }
39
+ }
40
+
41
+ /**
42
+ * Set description based on the type of model available with private fallback
43
+ */
44
+ set description(value) {
45
+ if (this.annotations) {
46
+ this.annotations[DESCRIPTION] = value;
47
+ }
48
+
49
+ this._description = value;
50
+ }
51
+
52
+ cleanForSave(data, forNew) {
53
+ const val = super.cleanForSave(data, forNew);
54
+
55
+ if (forNew) {
56
+ val.active = true;
57
+ }
58
+ delete val.metadata;
59
+
60
+ return val;
61
+ }
62
+ }
@@ -119,17 +119,6 @@ export default class FleetCluster extends SteveModel {
119
119
  return this.metadata?.state?.name || 'unknown';
120
120
  }
121
121
 
122
- get nodeInfo() {
123
- const ready = this.status?.agent?.readyNodes || 0;
124
- const unready = this.status?.agent?.nonReadyNodes || 0;
125
-
126
- return {
127
- ready,
128
- unready,
129
- total: ready + unready,
130
- };
131
- }
132
-
133
122
  get repoInfo() {
134
123
  const ready = this.status?.readyGitRepos || 0;
135
124
  const total = this.status?.desiredReadyGitRepos || 0;
@@ -141,6 +130,29 @@ export default class FleetCluster extends SteveModel {
141
130
  };
142
131
  }
143
132
 
133
+ get bundleInfo() {
134
+ const bundlesData = {
135
+ ready: 0,
136
+ total: 0
137
+ };
138
+ const readyBundles = this.status?.display?.readyBundles;
139
+
140
+ if (readyBundles && readyBundles.includes('/')) {
141
+ const dataArr = readyBundles.split('/');
142
+
143
+ if (dataArr.length === 2 && parseInt(dataArr[0]) >= 0 && parseInt(dataArr[1]) >= 0) {
144
+ bundlesData.ready = parseInt(dataArr[0]);
145
+ bundlesData.total = parseInt(dataArr[1]);
146
+
147
+ return bundlesData;
148
+ }
149
+ }
150
+
151
+ bundlesData.noValidData = true;
152
+
153
+ return bundlesData;
154
+ }
155
+
144
156
  get mgmt() {
145
157
  const mgmt = this.$getters['byId'](MANAGEMENT.CLUSTER, this.metadata?.labels?.[FLEET_LABELS.CLUSTER_NAME]);
146
158
 
@@ -105,6 +105,8 @@ export default class GitRepo extends SteveModel {
105
105
  const groups = workspace?.clusterGroups || [];
106
106
 
107
107
  if (workspace?.id === 'fleet-local') {
108
+ // should we be getting the clusters from workspace.clusters instead of having to rely on the groups,
109
+ // which takes an additional request to be done on the Fleet dashboard screen?
108
110
  const local = findBy(groups, 'id', 'fleet-local/default');
109
111
 
110
112
  if (local) {
@@ -314,6 +316,14 @@ export default class GitRepo extends SteveModel {
314
316
  return 0;
315
317
  }
316
318
 
319
+ get targetClustersReady() {
320
+ if (this.targetClusters && this.targetClusters.length) {
321
+ return this.targetClusters.filter((cluster) => cluster.state === 'active');
322
+ }
323
+
324
+ return 0;
325
+ }
326
+
317
327
  get bundleDeployments() {
318
328
  const bds = this.$getters['all'](FLEET.BUNDLE_DEPLOYMENT);
319
329
 
@@ -22,7 +22,7 @@ export default class ProjectHelmChart extends SteveModel {
22
22
  const clusterId = this.$rootGetters['currentCluster']?.id;
23
23
  const project = this.$rootGetters['management/byId'](MANAGEMENT.PROJECT, `${ clusterId }/${ this.projectId }`);
24
24
 
25
- return project.spec.displayName;
25
+ return project?.spec.displayName;
26
26
  }
27
27
 
28
28
  get namespaces() {
@@ -0,0 +1,68 @@
1
+ import Driver from '@shell/models/driver';
2
+
3
+ export default class KontainerDriver extends Driver {
4
+ get doneRoute() {
5
+ return 'c-cluster-manager-driver-kontainerdriver';
6
+ }
7
+
8
+ get _availableActions() {
9
+ const out = [
10
+ {
11
+ action: 'activate',
12
+ label: 'Activate',
13
+ icon: 'icon icon-play',
14
+ bulkable: true,
15
+ enabled: !!this.links.update && !this.active
16
+ },
17
+ {
18
+ action: 'deactivate',
19
+ label: 'Deactivate',
20
+ icon: 'icon icon-pause',
21
+ bulkable: true,
22
+ enabled: !!this.links.update && !!this.active,
23
+ weight: -1
24
+ },
25
+ { divider: true },
26
+ {
27
+ action: 'viewInApi',
28
+ enabled: true,
29
+ icon: 'icon icon-external-link',
30
+ label: this.t('action.viewInApi'),
31
+ },
32
+ { divider: true },
33
+ {
34
+ action: 'goToEdit',
35
+ label: this.t('action.edit'),
36
+ icon: 'icon icon-edit',
37
+ bulkable: false,
38
+ enabled: !!this.links.update && !this.builtin,
39
+ },
40
+ {
41
+ action: 'promptRemove',
42
+ altAction: 'remove',
43
+ bulkAction: 'promptRemove',
44
+ label: this.t('action.remove'),
45
+ bulkable: true,
46
+ icon: 'icon icon-delete',
47
+ enabled: !!this.links.remove,
48
+ weight: -10,
49
+ }
50
+ ];
51
+
52
+ return out;
53
+ }
54
+
55
+ deactivate() {
56
+ this.$dispatch('promptModal', {
57
+ componentProps: { url: `v3/kontainerDrivers/${ escape(this.id) }?action=deactivate`, name: this.nameDisplay },
58
+ component: 'DeactivateDriverDialog'
59
+ });
60
+ }
61
+
62
+ activate() {
63
+ return this.$dispatch('rancher/request', {
64
+ url: `v3/kontainerDrivers/${ escape(this.id) }?action=activate`,
65
+ method: 'post',
66
+ }, { root: true });
67
+ }
68
+ }
@@ -0,0 +1,6 @@
1
+ import SteveSchema from '../steve-schema';
2
+
3
+ /**
4
+ * This is the steve schema that's used for the management store
5
+ */
6
+ export default class ManagementStoreSchema extends SteveSchema { }
@@ -14,10 +14,11 @@ export const configType = {
14
14
  googleoauth: 'oauth',
15
15
  local: '',
16
16
  github: 'oauth',
17
- keycloakoidc: 'oidc'
17
+ keycloakoidc: 'oidc',
18
+ oidc: 'oidc',
18
19
  };
19
20
 
20
- const imageOverrides = { keycloakoidc: 'keycloak' };
21
+ const imageOverrides = { keycloakoidc: 'keycloak', oidc: 'openid' };
21
22
 
22
23
  export default class AuthConfig extends SteveModel {
23
24
  get _availableActions() {
@@ -299,9 +299,10 @@ export default class MgmtCluster extends HybridModel {
299
299
 
300
300
  // Custom badge to show for the Cluster (if the appropriate annotations are set)
301
301
  get badge() {
302
- const text = this.metadata?.annotations?.[CLUSTER_BADGE.TEXT];
302
+ const icon = this.metadata?.annotations?.[CLUSTER_BADGE.ICON_TEXT];
303
+ const comment = this.metadata?.annotations?.[CLUSTER_BADGE.TEXT];
303
304
 
304
- if (!text) {
305
+ if (!icon && !comment) {
305
306
  return undefined;
306
307
  }
307
308
 
@@ -309,10 +310,10 @@ export default class MgmtCluster extends HybridModel {
309
310
  const iconText = this.metadata?.annotations[CLUSTER_BADGE.ICON_TEXT] || '';
310
311
 
311
312
  return {
312
- text,
313
+ text: comment || undefined,
313
314
  color,
314
315
  textColor: textColor(parseColor(color)),
315
- iconText: iconText.substr(0, 2)
316
+ iconText: iconText.substr(0, 3)
316
317
  };
317
318
  }
318
319
 
@@ -37,6 +37,7 @@ export default class GlobalRole extends SteveDescriptionModel {
37
37
  }
38
38
 
39
39
  get nameDisplay() {
40
+ // i18n-uses rbac.globalRoles.role.*.label
40
41
  const path = `rbac.globalRoles.role.${ this.id }.label`;
41
42
  const label = this.displayName || this.metadata?.name || this.id;
42
43
 
@@ -46,6 +47,7 @@ export default class GlobalRole extends SteveDescriptionModel {
46
47
  get descriptionDisplay() {
47
48
  return this.description ||
48
49
  this.metadata?.annotations?.[DESCRIPTION] ||
50
+ // i18n-uses rbac.globalRoles.role.*.description
49
51
  this.$rootGetters['i18n/withFallback'](`rbac.globalRoles.role.${ this.id }.description`, this.t(`rbac.globalRoles.unknownRole.description`));
50
52
  }
51
53
 
@@ -1,5 +1,6 @@
1
1
  import { NORMAN } from '@shell/config/types';
2
2
  import HybridModel, { cleanHybridResources } from '@shell/plugins/steve/hybrid-class';
3
+ import day from 'dayjs';
3
4
 
4
5
  export default class User extends HybridModel {
5
6
  // Preserve description
@@ -99,6 +100,38 @@ export default class User extends HybridModel {
99
100
  return this.$rootGetters['i18n/withFallback'](`model.authConfig.provider."${ this.provider }"`, null, this.provider);
100
101
  }
101
102
 
103
+ /**
104
+ * Gets the last-login label in milliseconds
105
+ * @returns {number}
106
+ */
107
+ get userLastLogin() {
108
+ return this.metadata?.labels?.['cattle.io/last-login'] * 1000;
109
+ }
110
+
111
+ /**
112
+ * Gets the disabled-after label in milliseconds
113
+ * @returns {number}
114
+ */
115
+ get userDisabledIn() {
116
+ return this.metadata?.labels?.['cattle.io/disable-after'] * 1000;
117
+ }
118
+
119
+ /**
120
+ * Provides a display value for the userDisabledIn date based on the user
121
+ * state.
122
+ */
123
+ get userDisabledInDisplay() {
124
+ return this.state === 'inactive' ? null : this.userDisabledIn;
125
+ }
126
+
127
+ /**
128
+ * Gets the delete-after label in milliseconds
129
+ * @returns {number}
130
+ */
131
+ get userDeletedIn() {
132
+ return this.metadata?.labels?.['cattle.io/delete-after'] * 1000;
133
+ }
134
+
102
135
  get state() {
103
136
  if ( this.enabled === false ) {
104
137
  return 'inactive';
@@ -107,6 +140,19 @@ export default class User extends HybridModel {
107
140
  return this.metadata?.state?.name || 'unknown';
108
141
  }
109
142
 
143
+ get stateDisplay() {
144
+ switch (this.state) {
145
+ case 'inactive':
146
+ return this.t('user.state.inactive');
147
+ case 'active':
148
+ return this.t('user.state.active');
149
+ case 'unknown':
150
+ return this.t('user.state.unknown');
151
+ default:
152
+ return this.state;
153
+ }
154
+ }
155
+
110
156
  get description() {
111
157
  return this._description;
112
158
  }
@@ -177,7 +223,7 @@ export default class User extends HybridModel {
177
223
  return [
178
224
  {
179
225
  action: 'activate',
180
- label: this.t('action.activate'),
226
+ label: this.t('action.enable'),
181
227
  icon: 'icon icon-play',
182
228
  bulkable: true,
183
229
  bulkAction: 'activateBulk',
@@ -186,7 +232,7 @@ export default class User extends HybridModel {
186
232
  },
187
233
  {
188
234
  action: 'deactivate',
189
- label: this.t('action.deactivate'),
235
+ label: this.t('action.disable'),
190
236
  icon: 'icon icon-pause',
191
237
  bulkable: true,
192
238
  bulkAction: 'deactivateBulk',
@@ -211,6 +257,25 @@ export default class User extends HybridModel {
211
257
  formatter: 'CopyToClipboard',
212
258
  content: this.username
213
259
  },
260
+ { separator: true },
261
+ {
262
+ label: this.t('tableHeaders.userLastLogin'),
263
+ formatter: 'LiveDate',
264
+ formatterOpts: { addSuffix: true, suffix: `${ this.t('suffix.ago') } (${ day(this.userLastLogin) })` },
265
+ content: this.userLastLogin,
266
+ },
267
+ {
268
+ label: this.t('tableHeaders.userDisabledIn'),
269
+ formatter: 'LiveDate',
270
+ formatterOpts: { isCountdown: true },
271
+ content: this.userDisabledInDisplay,
272
+ },
273
+ {
274
+ label: this.t('tableHeaders.userDeletedIn'),
275
+ formatter: 'LiveDate',
276
+ formatterOpts: { isCountdown: true },
277
+ content: this.userDeletedIn,
278
+ },
214
279
  ...this._details
215
280
  ];
216
281
  }
@@ -4,6 +4,8 @@ import { MONITORING } from '@shell/config/types';
4
4
  import jsyaml from 'js-yaml';
5
5
  import SteveModel from '@shell/plugins/steve/steve-class';
6
6
 
7
+ // i18n-uses monitoringReceiver.slack.*, monitoringReceiver.email.*, monitoringReceiver.pagerduty.*
8
+ // i18n-uses monitoringReceiver.opsgenie.*, monitoringReceiver.webhook.*, monitoringReceiver.custom.*
7
9
  export const RECEIVERS_TYPES = [
8
10
  {
9
11
  name: 'slack',
@@ -66,7 +68,7 @@ export default class Receiver extends SteveModel {
66
68
  }
67
69
 
68
70
  async save() {
69
- const errors = await this.validationErrors(this);
71
+ const errors = this.validationErrors(this);
70
72
 
71
73
  if (!isEmpty(errors)) {
72
74
  return Promise.reject(errors);
@@ -34,7 +34,7 @@ export default class Route extends SteveModel {
34
34
  }
35
35
 
36
36
  async save() {
37
- const errors = await this.validationErrors(this);
37
+ const errors = this.validationErrors(this);
38
38
 
39
39
  if (!isEmpty(errors)) {
40
40
  return Promise.reject(errors);
@@ -44,7 +44,8 @@ export default class Ingress extends SteveModel {
44
44
  const isTargetsWorkload = serviceName.startsWith('ingress-');
45
45
  const id = `${ this.namespace }/${ serviceName }`;
46
46
 
47
- if ( isTargetsWorkload ) {
47
+ if (isTargetsWorkload) {
48
+ // Need to expose workloadId's and fetch specific ones in IngressTarget?
48
49
  const workload = workloads.find((w) => w.id === (id));
49
50
 
50
51
  return workload?.detailLocation || '';
@@ -0,0 +1,68 @@
1
+ import Driver from '@shell/models/driver';
2
+
3
+ export default class NodeDriver extends Driver {
4
+ get doneRoute() {
5
+ return 'c-cluster-manager-driver-nodedriver';
6
+ }
7
+
8
+ get _availableActions() {
9
+ const out = [
10
+ {
11
+ action: 'activate',
12
+ label: 'Activate',
13
+ icon: 'icon icon-play',
14
+ bulkable: true,
15
+ enabled: !!this.actions.activate && this.state === 'inactive',
16
+ },
17
+ {
18
+ action: 'deactivate',
19
+ label: 'Deactivate',
20
+ icon: 'icon icon-pause',
21
+ bulkable: true,
22
+ enabled: !!this.actions.deactivate && this.state === 'active',
23
+ weight: -1,
24
+ },
25
+ { divider: true },
26
+ {
27
+ action: 'viewInApi',
28
+ enabled: true,
29
+ icon: 'icon icon-external-link',
30
+ label: this.t('action.viewInApi'),
31
+ },
32
+ { divider: true },
33
+ {
34
+ action: 'goToEdit',
35
+ label: this.t('action.edit'),
36
+ icon: 'icon icon-edit',
37
+ bulkable: false,
38
+ enabled: !!this.links.update && !this.builtin,
39
+ },
40
+ {
41
+ action: 'promptRemove',
42
+ altAction: 'remove',
43
+ bulkAction: 'promptRemove',
44
+ label: this.t('action.remove'),
45
+ bulkable: true,
46
+ icon: 'icon icon-delete',
47
+ enabled: !!this.links.update && !this.active,
48
+ weight: -10,
49
+ }
50
+ ];
51
+
52
+ return out;
53
+ }
54
+
55
+ deactivate() {
56
+ this.$dispatch('promptModal', {
57
+ componentProps: { url: `v3/nodeDrivers/${ escape(this.id) }?action=deactivate`, name: this.nameDisplay },
58
+ component: 'DeactivateDriverDialog'
59
+ });
60
+ }
61
+
62
+ activate() {
63
+ return this.$dispatch('rancher/request', {
64
+ url: `v3/nodeDrivers/${ escape(this.id) }?action=activate`,
65
+ method: 'post',
66
+ }, { root: true });
67
+ }
68
+ }
@@ -9,7 +9,8 @@ import { ucFirst } from '@shell/utils/string';
9
9
  import { compare } from '@shell/utils/version';
10
10
  import { AS, MODE, _VIEW, _YAML } from '@shell/config/query-params';
11
11
  import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
12
- import { CAPI as CAPI_ANNOTATIONS } from '@shell/config/labels-annotations';
12
+ import { CAPI as CAPI_ANNOTATIONS, NODE_ARCHITECTURE } from '@shell/config/labels-annotations';
13
+ import capitalize from 'lodash/capitalize';
13
14
 
14
15
  /**
15
16
  * Class representing Cluster resource.
@@ -403,6 +404,38 @@ export default class ProvCluster extends SteveModel {
403
404
  return this.mgmt?.providerLogo;
404
405
  }
405
406
 
407
+ get nodesArchitecture() {
408
+ const obj = {};
409
+
410
+ this.nodes?.forEach((node) => {
411
+ if (!node.metadata?.state?.transitioning) {
412
+ const architecture = node.status?.nodeLabels?.[NODE_ARCHITECTURE];
413
+
414
+ const key = architecture ? capitalize(architecture) : this.t('cluster.architecture.label.unknown');
415
+
416
+ obj[key] = (obj[key] || 0) + 1;
417
+ }
418
+ });
419
+
420
+ return obj;
421
+ }
422
+
423
+ get architecture() {
424
+ const keys = Object.keys(this.nodesArchitecture);
425
+
426
+ switch (keys.length) {
427
+ case 0:
428
+ return { label: this.t('generic.provisioning') };
429
+ case 1:
430
+ return { label: keys[0] };
431
+ default:
432
+ return {
433
+ label: this.t('cluster.architecture.label.mixed'),
434
+ tooltip: keys.reduce((acc, k) => `${ acc }${ k }: ${ this.nodesArchitecture[k] }<br>`, '')
435
+ };
436
+ }
437
+ }
438
+
406
439
  get kubernetesVersion() {
407
440
  const unknown = this.$rootGetters['i18n/t']('generic.unknown');
408
441