@rancher/shell 1.2.3 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (699) hide show
  1. package/assets/data/aws-regions.json +9 -0
  2. package/assets/images/vendor/openid.svg +18 -0
  3. package/assets/styles/app.scss +1 -2
  4. package/assets/styles/fonts/_icons.scss +3 -3
  5. package/assets/styles/global/_columns.scss +1 -1
  6. package/assets/styles/global/_labeled-input.scss +1 -0
  7. package/assets/styles/global/_layout.scss +99 -0
  8. package/assets/styles/themes/_csp.scss +2 -2
  9. package/assets/styles/themes/_dark.scss +8 -2
  10. package/assets/styles/themes/_light.scss +2 -1
  11. package/assets/styles/themes/_suse.scss +1 -1
  12. package/assets/styles/vendor/vue-select.scss +5 -0
  13. package/assets/translations/en-us.yaml +315 -64
  14. package/assets/translations/zh-hans.yaml +7 -31
  15. package/babel.config.js +8 -2
  16. package/chart/__tests__/S3.test.ts +9 -2
  17. package/chart/gatekeeper.vue +2 -11
  18. package/chart/istio.vue +1 -10
  19. package/chart/logging/index.vue +2 -11
  20. package/chart/monitoring/alerting/index.vue +7 -21
  21. package/chart/monitoring/grafana/index.vue +61 -2
  22. package/chart/monitoring/index.vue +52 -26
  23. package/chart/monitoring/prometheus/index.vue +39 -45
  24. package/chart/rancher-backup/S3.vue +11 -9
  25. package/chart/rancher-backup/index.vue +18 -15
  26. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  27. package/cloud-credential/azure.vue +4 -17
  28. package/cloud-credential/generic.vue +18 -9
  29. package/cloud-credential/harvester.vue +11 -3
  30. package/components/AlertTable.vue +17 -7
  31. package/components/AppModal.vue +167 -0
  32. package/components/AssignTo.vue +7 -4
  33. package/components/AsyncButton.vue +27 -5
  34. package/components/BackLink.vue +4 -4
  35. package/components/BannerGraphic.vue +1 -0
  36. package/components/BrandImage.vue +47 -1
  37. package/components/Carousel.vue +15 -8
  38. package/components/Certificates.vue +161 -0
  39. package/components/ClusterBadge.vue +12 -3
  40. package/components/ClusterIconMenu.vue +55 -12
  41. package/components/ClusterProviderIcon.vue +14 -3
  42. package/components/CodeMirror.vue +111 -17
  43. package/components/CommunityLinks.vue +12 -8
  44. package/components/CopyCode.vue +6 -2
  45. package/components/CopyToClipboard.vue +2 -1
  46. package/components/CopyToClipboardText.vue +14 -9
  47. package/components/CreateDriver.vue +81 -0
  48. package/components/CruResource.vue +52 -27
  49. package/components/DetailTop.vue +2 -2
  50. package/components/Dialog.vue +6 -5
  51. package/components/DisableAuthProviderModal.vue +14 -8
  52. package/components/DraggableZone.vue +2 -2
  53. package/components/EtcdInfoBanner.vue +5 -5
  54. package/components/ExplorerMembers.vue +3 -3
  55. package/components/ExplorerProjectsNamespaces.vue +31 -7
  56. package/components/FixedBanner.vue +48 -36
  57. package/components/GlobalRoleBindings.vue +26 -0
  58. package/components/GrafanaDashboard.vue +6 -4
  59. package/components/IconOrSvg.vue +1 -1
  60. package/components/Import.vue +10 -6
  61. package/components/Inactivity.vue +1 -5
  62. package/components/KeyValueView.vue +14 -10
  63. package/components/Markdown.vue +16 -12
  64. package/components/MessageLink.vue +2 -2
  65. package/components/ModalWithCard.vue +5 -8
  66. package/components/MoveModal.vue +35 -33
  67. package/components/PodSecurityAdmission.vue +3 -3
  68. package/components/PromptChangePassword.vue +33 -33
  69. package/components/PromptModal.vue +11 -21
  70. package/components/PromptRemove.vue +12 -17
  71. package/components/PromptRestore.vue +18 -16
  72. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  73. package/components/Questions/__tests__/Float.test.ts +9 -19
  74. package/components/Questions/__tests__/Int.test.ts +9 -19
  75. package/components/Questions/__tests__/String.test.ts +9 -19
  76. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  77. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  78. package/components/Questions/index.vue +19 -3
  79. package/components/ResourceCancelModal.vue +34 -29
  80. package/components/ResourceDetail/Masthead.vue +48 -16
  81. package/components/ResourceDetail/index.vue +6 -4
  82. package/components/ResourceList/Masthead.vue +10 -9
  83. package/components/ResourceList/index.vue +65 -14
  84. package/components/ResourceTable.vue +87 -21
  85. package/components/ResourceYaml.vue +35 -5
  86. package/components/SelectIconGrid.vue +3 -3
  87. package/components/SideNav.vue +50 -94
  88. package/components/SingleClusterInfo.vue +4 -4
  89. package/components/SortableTable/THead.vue +33 -21
  90. package/components/SortableTable/filtering.js +9 -1
  91. package/components/SortableTable/grouping.js +8 -1
  92. package/components/SortableTable/index.vue +143 -44
  93. package/components/SortableTable/paging.js +36 -7
  94. package/components/SortableTable/selection.js +2 -1
  95. package/components/SortableTable/sorting.js +24 -7
  96. package/components/StatusTable.vue +5 -1
  97. package/components/Tabbed/index.vue +18 -1
  98. package/components/TableDataUserIcon.vue +47 -0
  99. package/components/TypeDescription.vue +1 -0
  100. package/components/Wizard.vue +1 -0
  101. package/components/YamlEditor.vue +1 -0
  102. package/components/__tests__/AppModal.test.ts +98 -0
  103. package/components/__tests__/AsyncButton.test.ts +1 -3
  104. package/components/__tests__/BackLink.test.ts +1 -1
  105. package/components/__tests__/ButtonGroup.test.ts +3 -6
  106. package/components/__tests__/Carousel.test.ts +43 -0
  107. package/components/__tests__/Certificates.test.ts +29 -0
  108. package/components/__tests__/CodeMirror.test.ts +87 -0
  109. package/components/__tests__/CopyCode.test.ts +5 -4
  110. package/components/__tests__/CruResource.test.ts +10 -9
  111. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  112. package/components/__tests__/FixedBanner.test.ts +5 -20
  113. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  114. package/components/__tests__/TabTitle.test.ts +129 -0
  115. package/components/auth/AzureWarning.vue +2 -2
  116. package/components/auth/RoleDetailEdit.vue +10 -0
  117. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  118. package/components/auth/login/oidc.vue +7 -1
  119. package/components/fleet/FleetBundles.vue +5 -11
  120. package/components/fleet/FleetClusters.vue +9 -9
  121. package/components/fleet/FleetIntro.vue +11 -17
  122. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  123. package/components/fleet/FleetRepos.vue +63 -27
  124. package/components/fleet/FleetResources.vue +6 -1
  125. package/components/fleet/FleetStatus.vue +3 -3
  126. package/components/fleet/FleetSummary.vue +35 -30
  127. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  128. package/components/fleet/__tests__/FleetSummary.test.ts +316 -0
  129. package/components/form/ArrayList.vue +22 -18
  130. package/components/form/ArrayListSelect.vue +5 -0
  131. package/components/form/BannerSettings.vue +3 -0
  132. package/components/form/ClusterAppearance.vue +132 -0
  133. package/components/form/ColorInput.vue +1 -0
  134. package/components/form/Error.vue +3 -3
  135. package/components/form/FileSelector.vue +1 -0
  136. package/components/form/Footer.vue +2 -2
  137. package/components/form/GitPicker.vue +83 -38
  138. package/components/form/KeyValue.vue +70 -48
  139. package/components/form/LabeledSelect.vue +145 -41
  140. package/components/form/Labels.vue +3 -1
  141. package/components/form/NameNsDescription.vue +26 -9
  142. package/components/form/Password.vue +3 -1
  143. package/components/form/ResourceLabeledSelect.vue +187 -0
  144. package/components/form/ResourceTabs/index.vue +31 -15
  145. package/components/form/SecretSelector.vue +93 -18
  146. package/components/form/SelectOrCreateAuthSecret.vue +132 -59
  147. package/components/form/SimpleSecretSelector.vue +88 -28
  148. package/components/form/Taints.vue +13 -7
  149. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  150. package/components/form/__tests__/KeyValue.test.ts +120 -11
  151. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  152. package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +25 -15
  153. package/components/form/__tests__/Taints.test.ts +70 -0
  154. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  155. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  156. package/components/formatter/AppSummaryGraph.vue +2 -2
  157. package/components/formatter/Checked.vue +11 -3
  158. package/components/formatter/CloudCredPublicData.vue +30 -0
  159. package/components/formatter/ClusterLink.vue +2 -2
  160. package/components/formatter/ClusterProvider.vue +1 -18
  161. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  162. package/components/formatter/FleetSummaryGraph.vue +25 -12
  163. package/components/formatter/ImagePercentageBar.vue +0 -4
  164. package/components/formatter/IngressTarget.vue +18 -7
  165. package/components/formatter/Link.vue +2 -2
  166. package/components/formatter/LinkDetail.vue +2 -2
  167. package/components/formatter/LinkDetailImage.vue +2 -2
  168. package/components/formatter/LinkName.vue +2 -2
  169. package/components/formatter/LiveDuration.vue +1 -1
  170. package/components/formatter/PercentageBar.vue +1 -1
  171. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  172. package/components/formatter/SecretType.vue +2 -2
  173. package/components/formatter/VirtualServiceGateways.vue +2 -2
  174. package/components/formatter/WorkloadDetailEndpoints.vue +12 -22
  175. package/components/formatter/__tests__/Checked.test.ts +19 -0
  176. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  177. package/components/formatter/__tests__/WorkloadDetailEndpoints.test.ts +81 -0
  178. package/components/nav/Group.vue +9 -7
  179. package/components/nav/Header.vue +85 -46
  180. package/components/nav/Jump.vue +19 -9
  181. package/components/nav/NamespaceFilter.vue +8 -1
  182. package/components/nav/TopLevelMenu.vue +392 -136
  183. package/components/nav/Type.vue +71 -106
  184. package/components/nav/WindowManager/ContainerLogs.vue +120 -19
  185. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  186. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  187. package/components/nav/WindowManager/index.vue +11 -10
  188. package/components/nav/__tests__/TopLevelMenu.test.ts +400 -6
  189. package/components/nav/__tests__/Type.test.ts +322 -97
  190. package/components/nuxt/nuxt-child.js +9 -78
  191. package/components/nuxt/nuxt-error.vue +1 -1
  192. package/components/nuxt/nuxt-link.client.js +13 -95
  193. package/{layouts → components/templates}/blank.vue +1 -1
  194. package/{layouts → components/templates}/default.vue +11 -101
  195. package/{layouts → components/templates}/error.vue +13 -26
  196. package/{layouts → components/templates}/home.vue +4 -1
  197. package/{layouts → components/templates}/plain.vue +4 -1
  198. package/{layouts → components/templates}/standalone.vue +1 -5
  199. package/{layouts → components/templates}/unauthenticated.vue +2 -3
  200. package/composables/useCompactInput.test.ts +36 -0
  201. package/composables/useCompactInput.ts +20 -0
  202. package/composables/useLabeledFormElement.test.ts +135 -0
  203. package/composables/useLabeledFormElement.ts +138 -0
  204. package/config/harvester-manager-types.js +2 -0
  205. package/config/home-links.js +2 -1
  206. package/config/labels-annotations.js +2 -1
  207. package/config/middleware.js +0 -6
  208. package/config/pagination-table-headers.js +57 -0
  209. package/config/pod-security-admission.ts +1 -1
  210. package/config/private-label.js +21 -1
  211. package/config/product/auth.js +1 -0
  212. package/config/product/explorer.js +166 -45
  213. package/config/product/fleet.js +6 -1
  214. package/config/product/legacy.js +2 -11
  215. package/config/product/manager.js +51 -25
  216. package/config/query-params.js +2 -0
  217. package/config/roles.ts +23 -0
  218. package/config/router/index.js +23 -0
  219. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  220. package/config/router/navigation-guards/authentication.js +63 -0
  221. package/config/router/navigation-guards/i18n.js +13 -0
  222. package/config/router/navigation-guards/index.js +16 -0
  223. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  224. package/config/router/routes.js +487 -0
  225. package/config/settings.ts +31 -2
  226. package/config/store.js +8 -4
  227. package/config/system-namespaces.js +3 -0
  228. package/config/table-headers.js +66 -1
  229. package/config/types.js +35 -20
  230. package/config/uiplugins.js +10 -5
  231. package/core/plugin-helpers.js +4 -6
  232. package/core/plugin-routes.ts +56 -114
  233. package/core/plugin.ts +18 -11
  234. package/core/plugins-loader.js +7 -9
  235. package/core/plugins.js +289 -285
  236. package/core/types-provisioning.ts +7 -0
  237. package/creators/app/app.package.json +2 -1
  238. package/creators/app/files/.eslintignore +0 -2
  239. package/creators/app/files/.gitlab-ci.yml +14 -0
  240. package/creators/app/files/.vscode/settings.json +0 -1
  241. package/creators/app/init +19 -0
  242. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  243. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  244. package/creators/pkg/init +32 -0
  245. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +119 -0
  246. package/detail/__tests__/service.test.ts +62 -0
  247. package/detail/catalog.cattle.io.app.vue +1 -1
  248. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  249. package/detail/fleet.cattle.io.bundle.vue +1 -1
  250. package/detail/fleet.cattle.io.cluster.vue +11 -1
  251. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  252. package/detail/namespace.vue +2 -2
  253. package/detail/networking.k8s.io.ingress.vue +52 -19
  254. package/detail/node.vue +22 -3
  255. package/detail/provisioning.cattle.io.cluster.vue +31 -13
  256. package/detail/service.vue +1 -1
  257. package/detail/workload/index.vue +1 -0
  258. package/dialog/AddCustomBadgeDialog.vue +318 -161
  259. package/dialog/DeactivateDriverDialog.vue +137 -0
  260. package/dialog/RollbackWorkloadDialog.vue +2 -2
  261. package/dialog/RotateCertificatesDialog.vue +0 -21
  262. package/dialog/ScaleMachineDownDialog.vue +34 -17
  263. package/directives/clean-html.js +15 -0
  264. package/directives/clean-tooltip.js +32 -0
  265. package/directives/focus.js +41 -0
  266. package/directives/int-number.js +21 -0
  267. package/directives/positive-int-number.js +19 -0
  268. package/directives/trim-whitespace.js +19 -0
  269. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  270. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  271. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  272. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  273. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  274. package/edit/__tests__/nodeDriver.test.ts +107 -0
  275. package/edit/__tests__/service.test.ts +85 -0
  276. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  277. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  278. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  279. package/edit/auth/__tests__/azuread.test.ts +241 -0
  280. package/edit/auth/__tests__/oidc.test.ts +137 -0
  281. package/edit/auth/azuread.vue +133 -31
  282. package/edit/auth/github.vue +5 -17
  283. package/edit/auth/googleoauth.vue +6 -23
  284. package/edit/auth/ldap/index.vue +5 -17
  285. package/edit/auth/oidc.vue +143 -42
  286. package/edit/auth/saml.vue +5 -14
  287. package/edit/catalog.cattle.io.clusterrepo.vue +177 -9
  288. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  289. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  290. package/edit/cloudcredential.vue +28 -4
  291. package/edit/configmap.vue +10 -4
  292. package/edit/fleet.cattle.io.gitrepo.vue +3 -1
  293. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  294. package/edit/kontainerDriver.vue +65 -0
  295. package/edit/logging-flow/Match.vue +10 -9
  296. package/edit/logging-flow/index.vue +4 -19
  297. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  298. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  299. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  300. package/edit/management.cattle.io.project.vue +3 -53
  301. package/edit/management.cattle.io.setting.vue +52 -2
  302. package/edit/management.cattle.io.user.vue +2 -1
  303. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  304. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  305. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +1 -1
  306. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +2 -2
  307. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +1 -1
  308. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +15 -3
  309. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +4 -1
  310. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  311. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  312. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  313. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  314. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  315. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  316. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +46 -7
  317. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +1 -1
  318. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  319. package/edit/nodeDriver.vue +65 -0
  320. package/edit/persistentvolume/index.vue +2 -2
  321. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +33 -16
  322. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +276 -0
  323. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  324. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +3 -0
  325. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  326. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  327. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  328. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +77 -13
  329. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +391 -0
  330. package/edit/provisioning.cattle.io.cluster/import.vue +4 -4
  331. package/edit/provisioning.cattle.io.cluster/index.vue +126 -51
  332. package/edit/provisioning.cattle.io.cluster/rke2.vue +325 -791
  333. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  334. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +217 -0
  335. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +123 -129
  336. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  337. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  338. package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +1 -0
  339. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  340. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +190 -0
  341. package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +3 -0
  342. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +148 -0
  343. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  344. package/edit/resources.cattle.io.backup.vue +139 -124
  345. package/edit/resources.cattle.io.restore.vue +146 -126
  346. package/edit/service.vue +13 -0
  347. package/edit/serviceaccount.vue +46 -4
  348. package/edit/token.vue +3 -1
  349. package/edit/workload/Upgrading.vue +3 -2
  350. package/edit/workload/__tests__/Job.test.ts +1 -3
  351. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  352. package/edit/workload/index.vue +2 -1
  353. package/edit/workload/mixins/workload.js +35 -2
  354. package/edit/workload/storage/emptyDir.vue +2 -2
  355. package/initialize/App.vue +75 -0
  356. package/initialize/app-extended.js +128 -0
  357. package/initialize/entry-helpers.js +546 -0
  358. package/initialize/entry.js +32 -0
  359. package/initialize/install-components.js +23 -0
  360. package/initialize/install-directives.js +59 -0
  361. package/initialize/install-plugins.js +123 -0
  362. package/list/__tests__/workload.test.ts +1 -1
  363. package/list/catalog.cattle.io.app.vue +1 -0
  364. package/list/cis.cattle.io.clusterscan.vue +16 -10
  365. package/list/group.principal.vue +2 -2
  366. package/list/management.cattle.io.feature.vue +16 -16
  367. package/list/management.cattle.io.setting.vue +1 -0
  368. package/list/management.cattle.io.user.vue +13 -4
  369. package/list/networking.k8s.io.ingress.vue +36 -0
  370. package/list/node.vue +212 -73
  371. package/list/provisioning.cattle.io.cluster.vue +17 -4
  372. package/list/ui.cattle.io.navlink.vue +2 -2
  373. package/list/workload.vue +22 -0
  374. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  375. package/machine-config/__tests__/vmwarevsphere.test.ts +1 -3
  376. package/machine-config/amazonec2.vue +1 -1
  377. package/machine-config/azure.vue +2 -1
  378. package/machine-config/generic.vue +11 -15
  379. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  380. package/machine-config/vmwarevsphere.vue +31 -27
  381. package/middleware/authenticated.js +23 -399
  382. package/mixins/__tests__/chart.test.ts +48 -6
  383. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  384. package/mixins/auth-config.js +5 -9
  385. package/mixins/brand.js +102 -96
  386. package/mixins/chart.js +27 -13
  387. package/mixins/create-edit-view/index.js +2 -2
  388. package/mixins/fetch.client.js +42 -48
  389. package/mixins/labeled-form-element.ts +27 -2
  390. package/mixins/page-actions.js +7 -5
  391. package/mixins/resource-fetch-api-pagination.js +304 -0
  392. package/mixins/resource-fetch-namespaced.js +1 -1
  393. package/mixins/resource-fetch.js +46 -5
  394. package/models/__tests__/cluster.test.ts +44 -0
  395. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  396. package/models/__tests__/management.cattle.io.cluster.test.ts +23 -0
  397. package/models/__tests__/management.cattle.io.node.ts +85 -0
  398. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  399. package/models/__tests__/namespace.test.ts +49 -9
  400. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +241 -0
  401. package/models/__tests__/schema.tests.ts +24 -0
  402. package/models/__tests__/secret.test.ts +37 -0
  403. package/models/__tests__/steve-schema.test.ts +73 -0
  404. package/models/__tests__/storage.k8s.io.storageclass.test.ts +22 -0
  405. package/models/__tests__/workload.test.ts +91 -0
  406. package/models/catalog.cattle.io.app.js +8 -0
  407. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  408. package/models/catalog.cattle.io.uiplugin.js +7 -8
  409. package/models/cis.cattle.io.clusterscan.js +29 -8
  410. package/models/cloudcredential.js +9 -1
  411. package/models/cluster/node.js +8 -4
  412. package/models/cluster/schema.js +6 -0
  413. package/models/cluster.js +33 -0
  414. package/models/cluster.x-k8s.io.machine.js +1 -1
  415. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  416. package/models/driver.js +63 -0
  417. package/models/fleet.cattle.io.cluster.js +27 -11
  418. package/models/fleet.cattle.io.gitrepo.js +66 -13
  419. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  420. package/models/kontainerdriver.js +85 -0
  421. package/models/management/schema.js +6 -0
  422. package/models/management.cattle.io.authconfig.js +3 -2
  423. package/models/management.cattle.io.cluster.js +16 -7
  424. package/models/management.cattle.io.globalrole.js +2 -0
  425. package/models/management.cattle.io.kontainerdriver.js +1 -0
  426. package/models/management.cattle.io.node.js +18 -14
  427. package/models/management.cattle.io.nodepool.js +17 -0
  428. package/models/management.cattle.io.project.js +0 -36
  429. package/models/management.cattle.io.setting.js +11 -7
  430. package/models/management.cattle.io.user.js +2 -2
  431. package/models/monitoring.coreos.com.receiver.js +3 -1
  432. package/models/monitoring.coreos.com.route.js +1 -1
  433. package/models/namespace.js +1 -1
  434. package/models/networking.k8s.io.ingress.js +2 -1
  435. package/models/nodedriver.js +85 -0
  436. package/models/pod.js +20 -0
  437. package/models/provisioning.cattle.io.cluster.js +125 -10
  438. package/models/schema.js +28 -7
  439. package/models/secret.js +126 -18
  440. package/models/service.js +2 -0
  441. package/models/steve-schema.ts +254 -0
  442. package/models/storage.k8s.io.storageclass.js +1 -1
  443. package/models/workload.js +17 -0
  444. package/models/workload.service.js +18 -0
  445. package/package.json +18 -14
  446. package/pages/about.vue +12 -6
  447. package/pages/account/create-key.vue +0 -1
  448. package/pages/account/index.vue +7 -3
  449. package/pages/auth/login.vue +106 -103
  450. package/pages/auth/logout.vue +2 -4
  451. package/pages/auth/setup.vue +92 -66
  452. package/pages/auth/verify.vue +30 -24
  453. package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +2 -17
  454. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  455. package/pages/c/_cluster/apps/charts/index.vue +99 -69
  456. package/pages/c/_cluster/apps/charts/install.helpers.js +2 -13
  457. package/pages/c/_cluster/apps/charts/install.vue +12 -11
  458. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  459. package/pages/c/_cluster/auth/config/index.vue +15 -9
  460. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  461. package/pages/c/_cluster/ecm/index.vue +0 -2
  462. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  463. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  464. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  465. package/pages/c/_cluster/explorer/index.vue +253 -91
  466. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  467. package/pages/c/_cluster/explorer/tools/index.vue +10 -6
  468. package/pages/c/_cluster/fleet/index.vue +89 -94
  469. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  470. package/pages/c/_cluster/longhorn/index.vue +52 -17
  471. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  472. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  473. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  474. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +91 -0
  475. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  476. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  477. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +60 -0
  478. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  479. package/pages/c/_cluster/manager/pages/_page.vue +4 -5
  480. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  481. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  482. package/pages/c/_cluster/neuvector/index.vue +1 -0
  483. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  484. package/pages/c/_cluster/settings/banners.vue +86 -10
  485. package/pages/c/_cluster/settings/brand.vue +261 -38
  486. package/pages/c/_cluster/settings/index.vue +4 -6
  487. package/pages/c/_cluster/settings/links.vue +3 -2
  488. package/pages/c/_cluster/settings/performance.vue +71 -3
  489. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  490. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +12 -8
  491. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  492. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  493. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  494. package/pages/c/_cluster/uiplugins/InstallDialog.vue +55 -19
  495. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  496. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  497. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  498. package/pages/c/_cluster/uiplugins/index.vue +38 -54
  499. package/pages/diagnostic.vue +2 -2
  500. package/pages/fail-whale.vue +103 -42
  501. package/pages/home.vue +81 -24
  502. package/pages/prefs.vue +8 -4
  503. package/pages/support/index.vue +14 -10
  504. package/pkg/auto-import.js +1 -1
  505. package/plugins/axios.js +0 -36
  506. package/plugins/back-button.js +3 -5
  507. package/plugins/clean-html-directive.js +5 -30
  508. package/plugins/clean-html.js +53 -0
  509. package/plugins/clean-tooltip-directive.js +6 -31
  510. package/plugins/codemirror-loader.js +1 -1
  511. package/plugins/codemirror.js +41 -9
  512. package/plugins/dashboard-store/__tests__/mutations.test.ts +389 -0
  513. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  514. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  515. package/plugins/dashboard-store/actions.js +132 -25
  516. package/plugins/dashboard-store/classify.js +1 -18
  517. package/plugins/dashboard-store/getters.js +154 -44
  518. package/plugins/dashboard-store/index.js +0 -111
  519. package/plugins/dashboard-store/mutations.js +150 -52
  520. package/plugins/dashboard-store/resource-class.js +77 -127
  521. package/plugins/directives.js +6 -39
  522. package/plugins/ember-cookie.js +13 -0
  523. package/plugins/global-formatters.js +26 -5
  524. package/plugins/i18n.js +89 -55
  525. package/plugins/int-number.js +6 -20
  526. package/plugins/plugin.js +3 -3
  527. package/plugins/positive-int-number.js +6 -17
  528. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +81 -10
  529. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  530. package/plugins/steve/__tests__/resource-utils.test.ts +159 -0
  531. package/plugins/steve/__tests__/steve-class.test.ts +59 -0
  532. package/plugins/steve/__tests__/subscribe.spec.ts +4 -1
  533. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  534. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  535. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  536. package/plugins/steve/actions.js +3 -38
  537. package/plugins/steve/getters.js +164 -61
  538. package/plugins/steve/hybrid-class.js +5 -1
  539. package/plugins/steve/mutations.js +24 -3
  540. package/plugins/steve/norman-class.js +142 -2
  541. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  542. package/plugins/steve/resource-utils.ts +38 -0
  543. package/plugins/steve/schema.d.ts +22 -0
  544. package/plugins/steve/steve-class.js +22 -0
  545. package/plugins/steve/steve-pagination-utils.ts +368 -0
  546. package/plugins/steve/subscribe.js +17 -76
  547. package/plugins/trim-whitespace.js +6 -34
  548. package/plugins/vue-js-modal.js +1 -1
  549. package/promptRemove/pod.vue +15 -7
  550. package/public/index.html +1 -0
  551. package/rancher-components/Accordion/Accordion.test.ts +45 -0
  552. package/rancher-components/Accordion/Accordion.vue +86 -0
  553. package/rancher-components/Accordion/index.ts +1 -0
  554. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  555. package/rancher-components/Banner/Banner.test.ts +1 -5
  556. package/rancher-components/Banner/Banner.vue +2 -2
  557. package/rancher-components/Card/Card.vue +4 -4
  558. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  559. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  560. package/rancher-components/Form/LabeledInput/LabeledInput.vue +57 -24
  561. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  562. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  563. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  564. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  565. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  566. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  567. package/rancher-components/StringList/StringList.test.ts +270 -0
  568. package/rancher-components/StringList/StringList.vue +65 -26
  569. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +69 -0
  570. package/scripts/clean +1 -1
  571. package/scripts/extension/bundle +19 -7
  572. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  573. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  574. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  575. package/scripts/extension/helm/package/Dockerfile +1 -1
  576. package/scripts/extension/helm/scripts/package +11 -3
  577. package/scripts/extension/helm/scripts/patch +27 -0
  578. package/scripts/extension/parse-tag-name +4 -4
  579. package/scripts/extension/publish +25 -14
  580. package/scripts/publish-shell.sh +11 -1
  581. package/scripts/serve-pkgs +0 -2
  582. package/scripts/test-plugins-build.sh +87 -11
  583. package/scripts/vue-migrate.js +683 -0
  584. package/server/har-file.js +183 -0
  585. package/store/__tests__/catalog.test.ts +224 -0
  586. package/store/__tests__/type-map.test.ts +1122 -0
  587. package/store/auth.js +23 -4
  588. package/store/aws.js +53 -6
  589. package/store/catalog.js +22 -6
  590. package/store/cru-resource.ts +26 -0
  591. package/store/customisation.js +35 -0
  592. package/store/features.js +7 -4
  593. package/store/i18n.js +11 -0
  594. package/store/index.js +140 -49
  595. package/store/plugins.js +8 -4
  596. package/store/prefs.js +33 -38
  597. package/store/type-map.js +288 -213
  598. package/store/type-map.utils.ts +226 -0
  599. package/tsconfig.json +34 -9
  600. package/tsconfig.paths.json +21 -0
  601. package/types/components/labeledSelect.ts +50 -0
  602. package/types/resources/settings.d.ts +32 -0
  603. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  604. package/types/shell/index.d.ts +1045 -770
  605. package/types/store/dashboard-store.types.ts +42 -0
  606. package/types/store/pagination.types.ts +457 -0
  607. package/types/store/type-map.ts +30 -0
  608. package/types/store/vuex.d.ts +9 -0
  609. package/types/vue-shim.d.ts +51 -0
  610. package/utils/__tests__/cluster.test.ts +20 -18
  611. package/utils/__tests__/create-yaml.test.ts +359 -2
  612. package/utils/__tests__/kontainer.test.ts +180 -0
  613. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  614. package/utils/alertmanagerconfig.js +19 -0
  615. package/utils/array.ts +40 -1
  616. package/utils/async.ts +2 -0
  617. package/utils/auth.js +152 -4
  618. package/utils/axios.js +2 -21
  619. package/utils/azure.js +24 -0
  620. package/utils/banners.js +103 -0
  621. package/utils/clipboard.js +5 -0
  622. package/utils/cluster.js +1 -1
  623. package/utils/config.js +4 -0
  624. package/utils/create-yaml.js +59 -28
  625. package/utils/custom-validators.js +0 -2
  626. package/utils/error.js +41 -1
  627. package/utils/formatter.js +5 -3
  628. package/utils/git.ts +1 -1
  629. package/utils/install-redirect.js +1 -1
  630. package/utils/kontainer.ts +190 -0
  631. package/utils/object.js +24 -0
  632. package/utils/pagination-utils.ts +154 -0
  633. package/utils/pod-security-admission.ts +1 -1
  634. package/utils/router.js +86 -0
  635. package/utils/settings.ts +46 -0
  636. package/utils/time.js +2 -1
  637. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  638. package/utils/url.ts +1 -1
  639. package/utils/validators/formRules/__tests__/index.test.ts +70 -4
  640. package/utils/validators/formRules/index.ts +15 -9
  641. package/utils/validators/index.js +1 -0
  642. package/utils/validators/setting.js +6 -10
  643. package/utils/version.js +2 -1
  644. package/vue.config.js +377 -401
  645. package/.DS_Store +0 -0
  646. package/assets/images/providers/aks-black.svg +0 -28
  647. package/assets/images/providers/aks.svg +0 -31
  648. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  649. package/components/ChartPsp.vue +0 -76
  650. package/components/EventsTable.vue +0 -67
  651. package/components/TabbedLinks/index.vue +0 -94
  652. package/components/__tests__/ChartPsp.test.ts +0 -75
  653. package/components/formatter/__tests__/ClusterProvider.test.ts +0 -28
  654. package/components/nuxt/nuxt-link.server.js +0 -16
  655. package/components/nuxt/nuxt.js +0 -101
  656. package/config/router.js +0 -408
  657. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -237
  658. package/initialize/App.js +0 -198
  659. package/initialize/client.js +0 -875
  660. package/initialize/index.js +0 -364
  661. package/initialize/layouts.ts +0 -26
  662. package/middleware/i18n.js +0 -10
  663. package/middleware/unauthenticated.js +0 -22
  664. package/mixins/fetch.server.js +0 -73
  665. package/pages/c/_cluster/apps/index.vue +0 -17
  666. package/pages/c/_cluster/auth/index.vue +0 -19
  667. package/pages/c/_cluster/index.vue +0 -17
  668. package/pages/c/_cluster/legacy/index.vue +0 -22
  669. package/pages/c/_cluster/manager/index.vue +0 -22
  670. package/pages/c/_cluster/mcapps/index.vue +0 -21
  671. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  672. package/pages/c/index.vue +0 -9
  673. package/pages/rio/mesh.vue +0 -508
  674. package/plugins/dashboard-store/__tests__/mutations.spec.ts +0 -406
  675. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  676. package/plugins/portal-vue.js +0 -4
  677. package/plugins/portal.js +0 -4
  678. package/plugins/resize.js +0 -5
  679. package/plugins/shortkey.js +0 -4
  680. package/plugins/tooltip.js +0 -4
  681. package/plugins/transitions.js +0 -4
  682. package/plugins/v-select.js +0 -4
  683. package/plugins/vue-clipboard2.js +0 -4
  684. package/tsconfig.default.json +0 -46
  685. package/utils/group.js +0 -70
  686. package/utils/nuxt.js +0 -659
  687. package/utils/router.scrollBehavior.js +0 -80
  688. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  689. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  690. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  691. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  692. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  693. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  694. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  695. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  696. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
  697. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  698. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  699. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
@@ -1,6 +1,7 @@
1
1
  import { CAPI, MANAGEMENT, NORMAN } from '@shell/config/types';
2
2
  import { sortBy } from '@shell/utils/sort';
3
3
  import HybridModel from '@shell/plugins/steve/hybrid-class';
4
+ import { notOnlyOfRole } from '@shell/models/cluster.x-k8s.io.machine';
4
5
 
5
6
  export default class MgmtNodePool extends HybridModel {
6
7
  get nodeTemplate() {
@@ -161,6 +162,22 @@ export default class MgmtNodePool extends HybridModel {
161
162
  return this.norman?.hasLink('update');
162
163
  }
163
164
 
165
+ get isControlPlane() {
166
+ return this.spec?.controlPlane === true;
167
+ }
168
+
169
+ get isEtcd() {
170
+ return this.spec?.etcd === true;
171
+ }
172
+
173
+ canScaleDownPool() {
174
+ if (!this.isEtcd && !this.isControlPlane) {
175
+ return true;
176
+ }
177
+
178
+ return notOnlyOfRole(this, this?.provisioningCluster?.nodes);
179
+ }
180
+
164
181
  remove() {
165
182
  return this.norman?.remove();
166
183
  }
@@ -99,42 +99,6 @@ export default class Project extends HybridModel {
99
99
  // and the PUT request should have a query param _replace=true.
100
100
  const newValue = await norman.save({ replace: forceReplaceOnReq });
101
101
 
102
- let retryCount = 0;
103
-
104
- const finishProjectCreation = async() => {
105
- try {
106
- await newValue.doAction('setpodsecuritypolicytemplate', { podSecurityPolicyTemplateId: this.spec.podSecurityPolicyTemplateId || null });
107
- } catch (err) {
108
- if ( err.status === 409 || err.status === 403 ) {
109
- // The backend updates each new project soon after it is created,
110
- // so there is a chance of a 409 resource conflict or forbidden error. If that happens,
111
- // retry the action.
112
-
113
- // The 403 permission error can happen due to the user requesting
114
- // the project before the project is fully created and the project
115
- // permissions are assigned to the user so we allow some
116
- // time for that process to complete.
117
-
118
- if (retryCount < 3) {
119
- retryCount++;
120
- await setTimeout(() => {
121
- // Delay for three seconds to avoid another failure due to latency.
122
- finishProjectCreation();
123
- }, '3000');
124
- } else {
125
- throw err;
126
- }
127
- }
128
- }
129
- };
130
-
131
- // Only update PSP template if the value changed
132
- const newPSPTemplateID = this.spec.podSecurityPolicyTemplateId || null;
133
-
134
- if (norman.podSecurityPolicyTemplateId !== newPSPTemplateID) {
135
- await finishProjectCreation();
136
- }
137
-
138
102
  return newValue;
139
103
  }
140
104
 
@@ -1,5 +1,6 @@
1
1
  import { ALLOWED_SETTINGS } from '@shell/config/settings';
2
2
  import HybridModel from '@shell/plugins/steve/hybrid-class';
3
+ import { isServerUrl } from '@shell/utils/validators/setting';
3
4
 
4
5
  export default class Setting extends HybridModel {
5
6
  get fromEnv() {
@@ -31,12 +32,15 @@ export default class Setting extends HybridModel {
31
32
  }
32
33
 
33
34
  get customValidationRules() {
34
- return [
35
- {
36
- path: 'value',
37
- translationKey: 'setting.serverUrl.https',
38
- validators: [`isHttps:${ this.metadata.name }`]
39
- },
40
- ];
35
+ const out = [];
36
+
37
+ if (isServerUrl(this.metadata.name)) {
38
+ out.push({
39
+ path: 'value',
40
+ validators: ['required', 'https', 'url', 'trailingForwardSlash']
41
+ });
42
+ }
43
+
44
+ return out;
41
45
  }
42
46
  }
@@ -223,7 +223,7 @@ export default class User extends HybridModel {
223
223
  return [
224
224
  {
225
225
  action: 'activate',
226
- label: this.t('action.activate'),
226
+ label: this.t('action.enable'),
227
227
  icon: 'icon icon-play',
228
228
  bulkable: true,
229
229
  bulkAction: 'activateBulk',
@@ -232,7 +232,7 @@ export default class User extends HybridModel {
232
232
  },
233
233
  {
234
234
  action: 'deactivate',
235
- label: this.t('action.deactivate'),
235
+ label: this.t('action.disable'),
236
236
  icon: 'icon icon-pause',
237
237
  bulkable: true,
238
238
  bulkAction: 'deactivateBulk',
@@ -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);
@@ -87,7 +87,7 @@ export default class Namespace extends SteveModel {
87
87
  return true;
88
88
  }
89
89
 
90
- if ( this.metadata.name.endsWith('-system') ) {
90
+ if ( this.metadata.name.startsWith('cattle-') && this.metadata.name.endsWith('-system') ) {
91
91
  return true;
92
92
  }
93
93
 
@@ -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,85 @@
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: this.t('action.activate'),
13
+ icon: 'icon icon-play',
14
+ bulkable: true,
15
+ bulkAction: 'activateBulk',
16
+ enabled: !!this.actions.activate && this.state === 'inactive',
17
+ },
18
+ {
19
+ action: 'deactivate',
20
+ label: this.t('action.deactivate'),
21
+ icon: 'icon icon-pause',
22
+ bulkable: true,
23
+ bulkAction: 'deactivateBulk',
24
+ enabled: !!this.actions.deactivate && this.state === 'active',
25
+ weight: -1,
26
+ },
27
+ { divider: true },
28
+ {
29
+ action: 'viewInApi',
30
+ enabled: true,
31
+ icon: 'icon icon-external-link',
32
+ label: this.t('action.viewInApi'),
33
+ },
34
+ { divider: true },
35
+ {
36
+ action: 'goToEdit',
37
+ label: this.t('action.edit'),
38
+ icon: 'icon icon-edit',
39
+ bulkable: false,
40
+ enabled: !!this.links.update && !this.builtin,
41
+ },
42
+ {
43
+ action: 'promptRemove',
44
+ altAction: 'remove',
45
+ bulkAction: 'promptRemove',
46
+ label: this.t('action.remove'),
47
+ bulkable: true,
48
+ icon: 'icon icon-delete',
49
+ enabled: !!this.links.update && !this.active,
50
+ weight: -10,
51
+ }
52
+ ];
53
+
54
+ return out;
55
+ }
56
+
57
+ deactivate(resources = [this]) {
58
+ this.$dispatch('promptModal', {
59
+ componentProps: { drivers: resources, driverType: 'nodeDrivers' },
60
+ component: 'DeactivateDriverDialog'
61
+ });
62
+ }
63
+
64
+ deactivateBulk(resources) {
65
+ this.$dispatch('promptModal', {
66
+ componentProps: { drivers: resources, driverType: 'nodeDrivers' },
67
+ component: 'DeactivateDriverDialog'
68
+ });
69
+ }
70
+
71
+ activate() {
72
+ return this.$dispatch('rancher/request', {
73
+ url: `v3/nodeDrivers/${ escape(this.id) }?action=activate`,
74
+ method: 'post',
75
+ }, { root: true });
76
+ }
77
+
78
+ async activateBulk(resources) {
79
+ await Promise.all(resources.map((resource) => this.$dispatch('rancher/request', {
80
+ url: `v3/nodeDrivers/${ escape(resource.id) }?action=activate`,
81
+ method: 'post',
82
+ }, { root: true }
83
+ )));
84
+ }
85
+ }
package/models/pod.js CHANGED
@@ -3,6 +3,7 @@ import { colorForState, stateDisplay } from '@shell/plugins/dashboard-store/reso
3
3
  import { NODE, WORKLOAD_TYPES } from '@shell/config/types';
4
4
  import { escapeHtml, shortenedImage } from '@shell/utils/string';
5
5
  import WorkloadService from '@shell/models/workload.service';
6
+ import { deleteProperty } from '@shell/utils/object';
6
7
 
7
8
  export const WORKLOAD_PRIORITY = {
8
9
  [WORKLOAD_TYPES.DEPLOYMENT]: 1,
@@ -256,4 +257,23 @@ export default class Pod extends WorkloadService {
256
257
  return Promise.reject(e);
257
258
  });
258
259
  }
260
+
261
+ cleanForSave(data) {
262
+ const val = super.cleanForSave(data);
263
+
264
+ // remove fields from containers
265
+ val.spec?.containers?.forEach((container) => {
266
+ this.cleanContainerForSave(container);
267
+ });
268
+
269
+ // remove fields from initContainers
270
+ val.spec?.initContainers?.forEach((container) => {
271
+ this.cleanContainerForSave(container);
272
+ });
273
+
274
+ // This is probably added by generic workload components that shouldn't be added to pods
275
+ deleteProperty(val, 'spec.selector');
276
+
277
+ return val;
278
+ }
259
279
  }
@@ -1,5 +1,5 @@
1
1
  import {
2
- CAPI, MANAGEMENT, NORMAN, SNAPSHOT, HCI
2
+ CAPI, MANAGEMENT, NAMESPACE, NORMAN, SNAPSHOT, HCI, LOCAL_CLUSTER
3
3
  } from '@shell/config/types';
4
4
  import SteveModel from '@shell/plugins/steve/steve-class';
5
5
  import { findBy } from '@shell/utils/array';
@@ -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.
@@ -180,6 +181,16 @@ export default class ProvCluster extends SteveModel {
180
181
  return out;
181
182
  }
182
183
 
184
+ async findNormanCluster() {
185
+ const name = this.status?.clusterName;
186
+
187
+ if ( !name ) {
188
+ return null;
189
+ }
190
+
191
+ return await this.$dispatch('rancher/find', { type: NORMAN.CLUSTER, id: name }, { root: true });
192
+ }
193
+
183
194
  explore() {
184
195
  const location = {
185
196
  name: 'c-cluster',
@@ -239,10 +250,39 @@ export default class ProvCluster extends SteveModel {
239
250
  return providers.includes(this.provisioner);
240
251
  }
241
252
 
253
+ get isPrivateHostedProvider() {
254
+ if (this.isHostedKubernetesProvider && this.mgmt && this.provisioner) {
255
+ switch (this.provisioner.toLowerCase()) {
256
+ case 'gke':
257
+ return this.mgmt.spec?.gkeConfig?.privateClusterConfig?.enablePrivateEndpoint;
258
+ case 'eks':
259
+ return this.mgmt.spec?.eksConfig?.privateAccess;
260
+ case 'aks':
261
+ return this.mgmt.spec?.aksConfig?.privateCluster;
262
+ }
263
+ }
264
+
265
+ return false;
266
+ }
267
+
268
+ get isLocal() {
269
+ return this.mgmt?.isLocal;
270
+ }
271
+
242
272
  get isImported() {
243
273
  // As of Rancher v2.6.7, this returns false for imported K3s clusters,
244
274
  // in which this.provisioner is `k3s`.
245
- return this.provisioner === 'imported';
275
+
276
+ const isImportedProvisioner = this.provisioner === 'imported';
277
+ const isImportedSpecialCases = this.mgmt?.providerForEmberParam === 'import' ||
278
+ // when imported cluster is GKE
279
+ !!this.mgmt?.spec?.gkeConfig?.imported ||
280
+ // or AKS
281
+ !!this.mgmt?.spec?.aksConfig?.imported ||
282
+ // or EKS
283
+ !!this.mgmt?.spec?.eksConfig?.imported;
284
+
285
+ return !this.isLocal && (isImportedProvisioner || (!this.isRke2 && !this.mgmt?.machineProvider && isImportedSpecialCases));
246
286
  }
247
287
 
248
288
  get isCustom() {
@@ -262,8 +302,6 @@ export default class ProvCluster extends SteveModel {
262
302
  }
263
303
 
264
304
  get isImportedK3s() {
265
- // As of Rancher v2.6.7, this returns false for imported K3s clusters,
266
- // in which this.provisioner is `k3s`.
267
305
  return this.isImported && this.isK3s;
268
306
  }
269
307
 
@@ -272,7 +310,7 @@ export default class ProvCluster extends SteveModel {
272
310
  }
273
311
 
274
312
  get isK3s() {
275
- return this.mgmt?.status?.provider === 'k3s';
313
+ return this.mgmt?.status ? this.mgmt?.status.provider === 'k3s' : (this.spec?.kubernetesVersion || '').includes('k3s') ;
276
314
  }
277
315
 
278
316
  get isRke2() {
@@ -280,7 +318,7 @@ export default class ProvCluster extends SteveModel {
280
318
  }
281
319
 
282
320
  get isRke1() {
283
- return !!this.mgmt?.spec?.rancherKubernetesEngineConfig;
321
+ return !!this.mgmt?.spec?.rancherKubernetesEngineConfig || this.labels['provider.cattle.io'] === 'rke';
284
322
  }
285
323
 
286
324
  get isHarvester() {
@@ -366,6 +404,38 @@ export default class ProvCluster extends SteveModel {
366
404
  return this.mgmt?.providerLogo;
367
405
  }
368
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
+
369
439
  get kubernetesVersion() {
370
440
  const unknown = this.$rootGetters['i18n/t']('generic.unknown');
371
441
 
@@ -815,11 +885,11 @@ export default class ProvCluster extends SteveModel {
815
885
  get agentConfig() {
816
886
  // The one we want is the first one with no selector.
817
887
  // If there are multiple with no selector, that will fall under the unsupported message below.
818
- return this.spec.rkeConfig.machineSelectorConfig.find((x) => !x.machineLabelSelector).config;
888
+ return this.spec.rkeConfig.machineSelectorConfig.find((x) => !x.machineLabelSelector)?.config;
819
889
  }
820
890
 
821
891
  get cloudProvider() {
822
- return this.agentConfig['cloud-provider-name'];
892
+ return this.agentConfig?.['cloud-provider-name'];
823
893
  }
824
894
 
825
895
  get canClone() {
@@ -869,6 +939,51 @@ export default class ProvCluster extends SteveModel {
869
939
  }
870
940
 
871
941
  get hasError() {
872
- return this.status?.conditions?.some((condition) => condition.error === true);
942
+ // Before we were just checking for this.status?.conditions?.some((condition) => condition.error === true)
943
+ // but this is wrong as an error might exist but it might not be meaningful in the context of readiness of a cluster
944
+ // which is what this 'hasError' is used for.
945
+ // We now check if there's a ready condition after an error, which helps dictate the readiness of a cluster
946
+ // Based on the findings in https://github.com/rancher/dashboard/issues/10043
947
+ if (this.status?.conditions && this.status?.conditions.length) {
948
+ // if there are errors, we compare with how recent the "Ready" condition is compared to that error, otherwise we just move on
949
+ if (this.status?.conditions.some((c) => c.error === true)) {
950
+ // there's no ready condition and has an error, mark it
951
+ if (!this.status?.conditions.some((c) => c.type === 'Ready')) {
952
+ return true;
953
+ }
954
+
955
+ const filteredConditions = this.status?.conditions.filter((c) => c.error === true || c.type === 'Ready');
956
+ const mostRecentCondition = filteredConditions.reduce((a, b) => ((a.lastUpdateTime > b.lastUpdateTime) ? a : b));
957
+
958
+ return mostRecentCondition.error;
959
+ }
960
+ }
961
+
962
+ return false;
963
+ }
964
+
965
+ get namespaceLocation() {
966
+ const localCluster = this.$rootGetters['management/byId'](MANAGEMENT.CLUSTER, LOCAL_CLUSTER);
967
+
968
+ if (localCluster) {
969
+ return {
970
+ name: 'c-cluster-product-resource-id',
971
+ params: {
972
+ cluster: localCluster.id,
973
+ product: this.$rootGetters['productId'],
974
+ resource: NAMESPACE,
975
+ id: this.namespace
976
+ }
977
+ };
978
+ }
979
+
980
+ return null;
981
+ }
982
+
983
+ // JSON Paths that should be folded in the YAML editor by default
984
+ get yamlFolding() {
985
+ return [
986
+ 'spec.rkeConfig.machinePools.dynamicSchemaSpec',
987
+ ];
873
988
  }
874
989
  }
package/models/schema.js CHANGED
@@ -1,17 +1,38 @@
1
1
  import Resource from '@shell/plugins/dashboard-store/resource-class';
2
2
 
3
+ /**
4
+ * For types see schema.d.ts
5
+ */
3
6
  export default class Schema extends Resource {
4
7
  get groupName() {
5
8
  return this.attributes.namespaced ? 'ns' : 'cluster';
6
9
  }
7
10
  }
8
11
 
9
- export function parseType(str) {
10
- if ( str.startsWith('array[') ) {
11
- return ['array', ...parseType(str.slice(6, -1))];
12
- } else if ( str.startsWith('map[') ) {
13
- return ['map', ...parseType(str.slice(4, -1))];
14
- } else {
15
- return [str];
12
+ /**
13
+ * Handles
14
+ * - no subtype { type: 'io.cattle.provisioning.v1.Cluster.status' }
15
+ * - traditional map/array's with sub type in type e.g `{ type: array[io.cattle.provisioning.v1.Cluster.status] }`
16
+ * - new schema definitions map/array's with sub type property e.g. `{ type: 'array', subtype: 'io.cattle.provisioning.v1.Cluster.status' }`
17
+ */
18
+ const mapArrayTypeRegex = /([^[\s]*)(\[(.*)\])?/;
19
+
20
+ /**
21
+ * For the given resourceField find the root type and, if a collection of types, it's subtype
22
+ *
23
+ * @param {String} str type, may contain sub type
24
+ * @param {ResourceField} field resourceField entry, may contain sub type
25
+ * @returns [type, subtype]
26
+ */
27
+ export function parseType(str, field) {
28
+ const regexRes = mapArrayTypeRegex.exec(str);
29
+
30
+ const subtype = regexRes[3] || field?.subtype;
31
+ const res = [regexRes[1]];
32
+
33
+ if (subtype) {
34
+ res.push(subtype);
16
35
  }
36
+
37
+ return res;
17
38
  }