@rancher/shell 1.2.0 → 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 (689) 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 +299 -63
  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/AppModal.vue +167 -0
  31. package/components/AssignTo.vue +7 -4
  32. package/components/AsyncButton.vue +27 -5
  33. package/components/BackLink.vue +4 -4
  34. package/components/BannerGraphic.vue +1 -0
  35. package/components/BrandImage.vue +47 -1
  36. package/components/Carousel.vue +15 -8
  37. package/components/Certificates.vue +161 -0
  38. package/components/ClusterBadge.vue +12 -3
  39. package/components/ClusterIconMenu.vue +55 -12
  40. package/components/ClusterProviderIcon.vue +14 -3
  41. package/components/CodeMirror.vue +111 -17
  42. package/components/CommunityLinks.vue +12 -8
  43. package/components/CopyCode.vue +6 -2
  44. package/components/CopyToClipboard.vue +2 -1
  45. package/components/CopyToClipboardText.vue +14 -9
  46. package/components/CreateDriver.vue +81 -0
  47. package/components/CruResource.vue +52 -27
  48. package/components/DetailTop.vue +2 -2
  49. package/components/Dialog.vue +6 -5
  50. package/components/DisableAuthProviderModal.vue +14 -8
  51. package/components/DraggableZone.vue +2 -2
  52. package/components/EtcdInfoBanner.vue +5 -5
  53. package/components/ExplorerMembers.vue +3 -3
  54. package/components/ExplorerProjectsNamespaces.vue +31 -7
  55. package/components/FixedBanner.vue +48 -36
  56. package/components/GlobalRoleBindings.vue +26 -0
  57. package/components/IconOrSvg.vue +1 -1
  58. package/components/Import.vue +10 -6
  59. package/components/Inactivity.vue +1 -5
  60. package/components/KeyValueView.vue +14 -10
  61. package/components/Markdown.vue +16 -12
  62. package/components/MessageLink.vue +2 -2
  63. package/components/ModalWithCard.vue +5 -8
  64. package/components/MoveModal.vue +35 -33
  65. package/components/PodSecurityAdmission.vue +3 -3
  66. package/components/PromptChangePassword.vue +33 -33
  67. package/components/PromptModal.vue +11 -21
  68. package/components/PromptRemove.vue +11 -17
  69. package/components/PromptRestore.vue +18 -16
  70. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  71. package/components/Questions/__tests__/Float.test.ts +9 -19
  72. package/components/Questions/__tests__/Int.test.ts +9 -19
  73. package/components/Questions/__tests__/String.test.ts +9 -19
  74. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  75. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  76. package/components/Questions/index.vue +19 -3
  77. package/components/ResourceCancelModal.vue +34 -29
  78. package/components/ResourceDetail/Masthead.vue +48 -16
  79. package/components/ResourceDetail/index.vue +6 -4
  80. package/components/ResourceList/Masthead.vue +10 -9
  81. package/components/ResourceList/index.vue +65 -14
  82. package/components/ResourceTable.vue +87 -21
  83. package/components/ResourceYaml.vue +35 -5
  84. package/components/SelectIconGrid.vue +3 -3
  85. package/components/SideNav.vue +50 -94
  86. package/components/SingleClusterInfo.vue +4 -4
  87. package/components/SortableTable/THead.vue +33 -21
  88. package/components/SortableTable/filtering.js +9 -1
  89. package/components/SortableTable/grouping.js +8 -1
  90. package/components/SortableTable/index.vue +143 -44
  91. package/components/SortableTable/paging.js +36 -7
  92. package/components/SortableTable/selection.js +2 -1
  93. package/components/SortableTable/sorting.js +24 -7
  94. package/components/StatusTable.vue +5 -1
  95. package/components/Tabbed/index.vue +18 -1
  96. package/components/TableDataUserIcon.vue +47 -0
  97. package/components/TypeDescription.vue +1 -0
  98. package/components/Wizard.vue +1 -0
  99. package/components/YamlEditor.vue +1 -0
  100. package/components/__tests__/AppModal.test.ts +98 -0
  101. package/components/__tests__/AsyncButton.test.ts +1 -3
  102. package/components/__tests__/BackLink.test.ts +1 -1
  103. package/components/__tests__/ButtonGroup.test.ts +3 -6
  104. package/components/__tests__/Carousel.test.ts +43 -0
  105. package/components/__tests__/Certificates.test.ts +29 -0
  106. package/components/__tests__/CodeMirror.test.ts +87 -0
  107. package/components/__tests__/CopyCode.test.ts +5 -4
  108. package/components/__tests__/CruResource.test.ts +10 -9
  109. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  110. package/components/__tests__/FixedBanner.test.ts +5 -20
  111. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  112. package/components/__tests__/TabTitle.test.ts +129 -0
  113. package/components/auth/AzureWarning.vue +2 -2
  114. package/components/auth/RoleDetailEdit.vue +10 -0
  115. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  116. package/components/auth/login/oidc.vue +7 -1
  117. package/components/fleet/FleetBundles.vue +5 -11
  118. package/components/fleet/FleetClusters.vue +9 -9
  119. package/components/fleet/FleetIntro.vue +11 -17
  120. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  121. package/components/fleet/FleetRepos.vue +63 -27
  122. package/components/fleet/FleetResources.vue +6 -1
  123. package/components/fleet/FleetStatus.vue +3 -3
  124. package/components/fleet/FleetSummary.vue +35 -30
  125. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  126. package/components/fleet/__tests__/FleetSummary.test.ts +316 -0
  127. package/components/form/ArrayList.vue +22 -18
  128. package/components/form/ArrayListSelect.vue +5 -0
  129. package/components/form/BannerSettings.vue +3 -0
  130. package/components/form/ClusterAppearance.vue +132 -0
  131. package/components/form/ColorInput.vue +1 -0
  132. package/components/form/Error.vue +3 -3
  133. package/components/form/FileSelector.vue +1 -0
  134. package/components/form/Footer.vue +2 -2
  135. package/components/form/GitPicker.vue +83 -38
  136. package/components/form/KeyValue.vue +69 -48
  137. package/components/form/LabeledSelect.vue +145 -41
  138. package/components/form/Labels.vue +3 -1
  139. package/components/form/NameNsDescription.vue +26 -9
  140. package/components/form/Password.vue +3 -1
  141. package/components/form/ResourceLabeledSelect.vue +187 -0
  142. package/components/form/ResourceTabs/index.vue +31 -15
  143. package/components/form/SecretSelector.vue +93 -18
  144. package/components/form/SelectOrCreateAuthSecret.vue +132 -59
  145. package/components/form/SimpleSecretSelector.vue +88 -28
  146. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  147. package/components/form/__tests__/KeyValue.test.ts +120 -11
  148. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  149. package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +25 -15
  150. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  151. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  152. package/components/formatter/AppSummaryGraph.vue +2 -2
  153. package/components/formatter/Checked.vue +11 -3
  154. package/components/formatter/CloudCredPublicData.vue +30 -0
  155. package/components/formatter/ClusterLink.vue +2 -2
  156. package/components/formatter/ClusterProvider.vue +1 -18
  157. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  158. package/components/formatter/FleetSummaryGraph.vue +25 -12
  159. package/components/formatter/ImagePercentageBar.vue +0 -4
  160. package/components/formatter/IngressTarget.vue +18 -7
  161. package/components/formatter/Link.vue +2 -2
  162. package/components/formatter/LinkDetail.vue +2 -2
  163. package/components/formatter/LinkDetailImage.vue +2 -2
  164. package/components/formatter/LinkName.vue +2 -2
  165. package/components/formatter/LiveDuration.vue +1 -1
  166. package/components/formatter/PercentageBar.vue +1 -1
  167. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  168. package/components/formatter/SecretType.vue +2 -2
  169. package/components/formatter/VirtualServiceGateways.vue +2 -2
  170. package/components/formatter/WorkloadDetailEndpoints.vue +12 -22
  171. package/components/formatter/__tests__/Checked.test.ts +19 -0
  172. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  173. package/components/formatter/__tests__/WorkloadDetailEndpoints.test.ts +81 -0
  174. package/components/nav/Group.vue +9 -7
  175. package/components/nav/Header.vue +84 -45
  176. package/components/nav/Jump.vue +19 -9
  177. package/components/nav/NamespaceFilter.vue +8 -1
  178. package/components/nav/TopLevelMenu.vue +391 -132
  179. package/components/nav/Type.vue +71 -106
  180. package/components/nav/WindowManager/ContainerLogs.vue +120 -19
  181. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  182. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  183. package/components/nav/WindowManager/index.vue +11 -10
  184. package/components/nav/__tests__/TopLevelMenu.test.ts +400 -6
  185. package/components/nav/__tests__/Type.test.ts +322 -97
  186. package/components/nuxt/nuxt-child.js +9 -78
  187. package/components/nuxt/nuxt-error.vue +1 -1
  188. package/components/nuxt/nuxt-link.client.js +13 -95
  189. package/{layouts → components/templates}/blank.vue +1 -1
  190. package/{layouts → components/templates}/default.vue +11 -101
  191. package/{layouts → components/templates}/error.vue +13 -26
  192. package/{layouts → components/templates}/home.vue +4 -1
  193. package/{layouts → components/templates}/plain.vue +4 -1
  194. package/{layouts → components/templates}/standalone.vue +1 -5
  195. package/{layouts → components/templates}/unauthenticated.vue +2 -3
  196. package/composables/useCompactInput.test.ts +36 -0
  197. package/composables/useCompactInput.ts +20 -0
  198. package/composables/useLabeledFormElement.test.ts +135 -0
  199. package/composables/useLabeledFormElement.ts +138 -0
  200. package/config/harvester-manager-types.js +2 -0
  201. package/config/home-links.js +2 -1
  202. package/config/labels-annotations.js +2 -1
  203. package/config/middleware.js +0 -6
  204. package/config/pagination-table-headers.js +57 -0
  205. package/config/pod-security-admission.ts +1 -1
  206. package/config/private-label.js +21 -1
  207. package/config/product/auth.js +1 -0
  208. package/config/product/explorer.js +166 -45
  209. package/config/product/fleet.js +6 -1
  210. package/config/product/legacy.js +2 -11
  211. package/config/product/manager.js +51 -25
  212. package/config/query-params.js +2 -0
  213. package/config/roles.ts +23 -0
  214. package/config/router/index.js +23 -0
  215. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  216. package/config/router/navigation-guards/authentication.js +63 -0
  217. package/config/router/navigation-guards/index.js +15 -0
  218. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  219. package/config/router/routes.js +487 -0
  220. package/config/settings.ts +31 -2
  221. package/config/store.js +8 -4
  222. package/config/system-namespaces.js +3 -0
  223. package/config/table-headers.js +66 -1
  224. package/config/types.js +35 -20
  225. package/config/uiplugins.js +10 -5
  226. package/core/plugin-helpers.js +4 -6
  227. package/core/plugin-routes.ts +56 -114
  228. package/core/plugin.ts +18 -11
  229. package/core/plugins-loader.js +7 -9
  230. package/core/plugins.js +289 -285
  231. package/core/types-provisioning.ts +7 -0
  232. package/creators/app/files/.eslintignore +0 -2
  233. package/creators/app/files/.gitlab-ci.yml +14 -0
  234. package/creators/app/files/.vscode/settings.json +0 -1
  235. package/creators/app/init +19 -0
  236. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  237. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  238. package/creators/pkg/init +32 -0
  239. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +77 -0
  240. package/detail/__tests__/service.test.ts +62 -0
  241. package/detail/catalog.cattle.io.app.vue +1 -1
  242. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  243. package/detail/fleet.cattle.io.bundle.vue +1 -1
  244. package/detail/fleet.cattle.io.cluster.vue +11 -1
  245. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  246. package/detail/namespace.vue +2 -2
  247. package/detail/networking.k8s.io.ingress.vue +52 -19
  248. package/detail/node.vue +22 -3
  249. package/detail/provisioning.cattle.io.cluster.vue +27 -9
  250. package/detail/service.vue +1 -1
  251. package/detail/workload/index.vue +1 -0
  252. package/dialog/AddCustomBadgeDialog.vue +318 -161
  253. package/dialog/DeactivateDriverDialog.vue +118 -0
  254. package/dialog/RollbackWorkloadDialog.vue +2 -2
  255. package/dialog/RotateCertificatesDialog.vue +0 -21
  256. package/dialog/ScaleMachineDownDialog.vue +34 -17
  257. package/directives/clean-html.js +15 -0
  258. package/directives/clean-tooltip.js +32 -0
  259. package/directives/focus.js +41 -0
  260. package/directives/int-number.js +21 -0
  261. package/directives/positive-int-number.js +19 -0
  262. package/directives/trim-whitespace.js +19 -0
  263. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  264. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  265. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  266. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  267. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  268. package/edit/__tests__/nodeDriver.test.ts +107 -0
  269. package/edit/__tests__/service.test.ts +85 -0
  270. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  271. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  272. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  273. package/edit/auth/__tests__/azuread.test.ts +241 -0
  274. package/edit/auth/__tests__/oidc.test.ts +137 -0
  275. package/edit/auth/azuread.vue +133 -31
  276. package/edit/auth/github.vue +5 -17
  277. package/edit/auth/googleoauth.vue +6 -23
  278. package/edit/auth/ldap/index.vue +5 -17
  279. package/edit/auth/oidc.vue +143 -42
  280. package/edit/auth/saml.vue +5 -14
  281. package/edit/catalog.cattle.io.clusterrepo.vue +177 -9
  282. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  283. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  284. package/edit/cloudcredential.vue +28 -4
  285. package/edit/configmap.vue +10 -4
  286. package/edit/fleet.cattle.io.gitrepo.vue +3 -1
  287. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  288. package/edit/kontainerDriver.vue +65 -0
  289. package/edit/logging-flow/Match.vue +10 -9
  290. package/edit/logging-flow/index.vue +4 -19
  291. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  292. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  293. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  294. package/edit/management.cattle.io.project.vue +3 -53
  295. package/edit/management.cattle.io.setting.vue +52 -2
  296. package/edit/management.cattle.io.user.vue +2 -1
  297. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  298. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  299. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +1 -1
  300. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +2 -2
  301. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +1 -1
  302. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +15 -3
  303. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +4 -1
  304. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  305. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  306. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  307. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  308. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  309. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  310. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +46 -7
  311. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +1 -1
  312. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  313. package/edit/nodeDriver.vue +65 -0
  314. package/edit/persistentvolume/index.vue +2 -2
  315. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +33 -16
  316. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +276 -0
  317. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  318. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +3 -0
  319. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  320. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  321. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  322. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +77 -13
  323. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +391 -0
  324. package/edit/provisioning.cattle.io.cluster/import.vue +4 -4
  325. package/edit/provisioning.cattle.io.cluster/index.vue +126 -51
  326. package/edit/provisioning.cattle.io.cluster/rke2.vue +325 -791
  327. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  328. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +217 -0
  329. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +123 -129
  330. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  331. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  332. package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +1 -0
  333. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  334. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +190 -0
  335. package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +3 -0
  336. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +148 -0
  337. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  338. package/edit/resources.cattle.io.backup.vue +139 -124
  339. package/edit/resources.cattle.io.restore.vue +146 -126
  340. package/edit/service.vue +13 -0
  341. package/edit/serviceaccount.vue +46 -4
  342. package/edit/token.vue +1 -0
  343. package/edit/workload/Upgrading.vue +3 -2
  344. package/edit/workload/__tests__/Job.test.ts +1 -3
  345. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  346. package/edit/workload/index.vue +2 -1
  347. package/edit/workload/mixins/workload.js +35 -2
  348. package/edit/workload/storage/emptyDir.vue +2 -2
  349. package/initialize/App.vue +75 -0
  350. package/initialize/app-extended.js +128 -0
  351. package/initialize/entry-helpers.js +549 -0
  352. package/initialize/entry.js +32 -0
  353. package/initialize/install-components.js +23 -0
  354. package/initialize/install-directives.js +59 -0
  355. package/initialize/install-plugins.js +123 -0
  356. package/list/__tests__/workload.test.ts +1 -1
  357. package/list/catalog.cattle.io.app.vue +1 -0
  358. package/list/cis.cattle.io.clusterscan.vue +16 -10
  359. package/list/group.principal.vue +2 -2
  360. package/list/management.cattle.io.feature.vue +12 -14
  361. package/list/management.cattle.io.setting.vue +1 -0
  362. package/list/management.cattle.io.user.vue +13 -4
  363. package/list/networking.k8s.io.ingress.vue +36 -0
  364. package/list/node.vue +212 -73
  365. package/list/provisioning.cattle.io.cluster.vue +17 -4
  366. package/list/ui.cattle.io.navlink.vue +2 -2
  367. package/list/workload.vue +22 -0
  368. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  369. package/machine-config/__tests__/vmwarevsphere.test.ts +1 -3
  370. package/machine-config/amazonec2.vue +1 -1
  371. package/machine-config/azure.vue +2 -1
  372. package/machine-config/generic.vue +11 -15
  373. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  374. package/machine-config/vmwarevsphere.vue +31 -27
  375. package/middleware/authenticated.js +23 -380
  376. package/mixins/__tests__/chart.test.ts +48 -6
  377. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  378. package/mixins/auth-config.js +5 -9
  379. package/mixins/brand.js +102 -96
  380. package/mixins/chart.js +27 -13
  381. package/mixins/create-edit-view/index.js +2 -2
  382. package/mixins/fetch.client.js +42 -48
  383. package/mixins/labeled-form-element.ts +27 -2
  384. package/mixins/page-actions.js +7 -5
  385. package/mixins/resource-fetch-api-pagination.js +304 -0
  386. package/mixins/resource-fetch-namespaced.js +1 -1
  387. package/mixins/resource-fetch.js +46 -5
  388. package/models/__tests__/cluster.test.ts +44 -0
  389. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  390. package/models/__tests__/management.cattle.io.cluster.test.ts +23 -0
  391. package/models/__tests__/management.cattle.io.node.ts +85 -0
  392. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  393. package/models/__tests__/namespace.test.ts +49 -9
  394. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +241 -0
  395. package/models/__tests__/schema.tests.ts +24 -0
  396. package/models/__tests__/secret.test.ts +37 -0
  397. package/models/__tests__/steve-schema.test.ts +73 -0
  398. package/models/__tests__/storage.k8s.io.storageclass.test.ts +22 -0
  399. package/models/__tests__/workload.test.ts +91 -0
  400. package/models/catalog.cattle.io.app.js +8 -0
  401. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  402. package/models/catalog.cattle.io.uiplugin.js +7 -8
  403. package/models/cis.cattle.io.clusterscan.js +29 -8
  404. package/models/cloudcredential.js +9 -1
  405. package/models/cluster/node.js +8 -4
  406. package/models/cluster/schema.js +6 -0
  407. package/models/cluster.js +33 -0
  408. package/models/cluster.x-k8s.io.machine.js +1 -1
  409. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  410. package/models/driver.js +62 -0
  411. package/models/fleet.cattle.io.cluster.js +27 -11
  412. package/models/fleet.cattle.io.gitrepo.js +66 -13
  413. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  414. package/models/kontainerdriver.js +68 -0
  415. package/models/management/schema.js +6 -0
  416. package/models/management.cattle.io.authconfig.js +3 -2
  417. package/models/management.cattle.io.cluster.js +16 -7
  418. package/models/management.cattle.io.globalrole.js +2 -0
  419. package/models/management.cattle.io.kontainerdriver.js +1 -0
  420. package/models/management.cattle.io.node.js +18 -14
  421. package/models/management.cattle.io.nodepool.js +17 -0
  422. package/models/management.cattle.io.project.js +0 -36
  423. package/models/management.cattle.io.setting.js +11 -7
  424. package/models/management.cattle.io.user.js +2 -2
  425. package/models/monitoring.coreos.com.receiver.js +3 -1
  426. package/models/monitoring.coreos.com.route.js +1 -1
  427. package/models/namespace.js +1 -1
  428. package/models/networking.k8s.io.ingress.js +2 -1
  429. package/models/nodedriver.js +68 -0
  430. package/models/pod.js +20 -0
  431. package/models/provisioning.cattle.io.cluster.js +125 -10
  432. package/models/schema.js +28 -7
  433. package/models/secret.js +126 -18
  434. package/models/service.js +2 -0
  435. package/models/steve-schema.ts +254 -0
  436. package/models/storage.k8s.io.storageclass.js +1 -1
  437. package/models/workload.js +17 -0
  438. package/models/workload.service.js +18 -0
  439. package/package.json +17 -14
  440. package/pages/about.vue +12 -6
  441. package/pages/account/create-key.vue +0 -1
  442. package/pages/account/index.vue +7 -3
  443. package/pages/auth/login.vue +106 -103
  444. package/pages/auth/logout.vue +2 -4
  445. package/pages/auth/setup.vue +92 -66
  446. package/pages/auth/verify.vue +30 -24
  447. package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +2 -17
  448. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  449. package/pages/c/_cluster/apps/charts/index.vue +99 -69
  450. package/pages/c/_cluster/apps/charts/install.helpers.js +2 -13
  451. package/pages/c/_cluster/apps/charts/install.vue +9 -9
  452. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  453. package/pages/c/_cluster/auth/config/index.vue +15 -9
  454. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  455. package/pages/c/_cluster/ecm/index.vue +0 -2
  456. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  457. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  458. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  459. package/pages/c/_cluster/explorer/index.vue +253 -91
  460. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  461. package/pages/c/_cluster/explorer/tools/index.vue +10 -6
  462. package/pages/c/_cluster/fleet/index.vue +89 -94
  463. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  464. package/pages/c/_cluster/longhorn/index.vue +52 -17
  465. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  466. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  467. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  468. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +94 -0
  469. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  470. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  471. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +63 -0
  472. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  473. package/pages/c/_cluster/manager/pages/_page.vue +4 -5
  474. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  475. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  476. package/pages/c/_cluster/neuvector/index.vue +1 -0
  477. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  478. package/pages/c/_cluster/settings/banners.vue +86 -10
  479. package/pages/c/_cluster/settings/brand.vue +261 -38
  480. package/pages/c/_cluster/settings/index.vue +4 -6
  481. package/pages/c/_cluster/settings/links.vue +3 -2
  482. package/pages/c/_cluster/settings/performance.vue +71 -3
  483. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  484. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +12 -8
  485. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  486. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  487. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  488. package/pages/c/_cluster/uiplugins/InstallDialog.vue +53 -18
  489. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  490. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  491. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  492. package/pages/c/_cluster/uiplugins/index.vue +38 -54
  493. package/pages/diagnostic.vue +2 -2
  494. package/pages/fail-whale.vue +103 -42
  495. package/pages/home.vue +81 -24
  496. package/pages/prefs.vue +8 -4
  497. package/pages/support/index.vue +14 -10
  498. package/pkg/auto-import.js +1 -1
  499. package/plugins/axios.js +0 -36
  500. package/plugins/back-button.js +3 -5
  501. package/plugins/clean-html-directive.js +5 -30
  502. package/plugins/clean-html.js +53 -0
  503. package/plugins/clean-tooltip-directive.js +6 -31
  504. package/plugins/codemirror-loader.js +1 -1
  505. package/plugins/codemirror.js +41 -9
  506. package/plugins/dashboard-store/__tests__/mutations.test.ts +389 -0
  507. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  508. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  509. package/plugins/dashboard-store/actions.js +132 -25
  510. package/plugins/dashboard-store/classify.js +1 -18
  511. package/plugins/dashboard-store/getters.js +154 -44
  512. package/plugins/dashboard-store/index.js +0 -111
  513. package/plugins/dashboard-store/mutations.js +150 -52
  514. package/plugins/dashboard-store/resource-class.js +77 -127
  515. package/plugins/directives.js +6 -39
  516. package/plugins/ember-cookie.js +13 -0
  517. package/plugins/global-formatters.js +26 -5
  518. package/plugins/i18n.js +89 -55
  519. package/plugins/int-number.js +6 -20
  520. package/plugins/plugin.js +3 -3
  521. package/plugins/positive-int-number.js +6 -17
  522. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +81 -10
  523. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  524. package/plugins/steve/__tests__/resource-utils.test.ts +159 -0
  525. package/plugins/steve/__tests__/steve-class.test.ts +59 -0
  526. package/plugins/steve/__tests__/subscribe.spec.ts +4 -1
  527. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  528. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  529. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  530. package/plugins/steve/actions.js +3 -38
  531. package/plugins/steve/getters.js +164 -61
  532. package/plugins/steve/hybrid-class.js +5 -1
  533. package/plugins/steve/mutations.js +24 -3
  534. package/plugins/steve/norman-class.js +142 -2
  535. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  536. package/plugins/steve/resource-utils.ts +38 -0
  537. package/plugins/steve/schema.d.ts +22 -0
  538. package/plugins/steve/steve-class.js +22 -0
  539. package/plugins/steve/steve-pagination-utils.ts +368 -0
  540. package/plugins/steve/subscribe.js +17 -76
  541. package/plugins/trim-whitespace.js +6 -34
  542. package/plugins/vue-js-modal.js +1 -1
  543. package/public/index.html +1 -0
  544. package/rancher-components/Form/LabeledInput/LabeledInput.vue +13 -8
  545. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  546. package/rancher-components/components/Banner/Banner.test.ts +1 -5
  547. package/rancher-components/components/Banner/Banner.vue +2 -2
  548. package/rancher-components/components/Card/Card.vue +4 -4
  549. package/rancher-components/components/Form/Checkbox/Checkbox.vue +4 -3
  550. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  551. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +57 -24
  552. package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -3
  553. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  554. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  555. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  556. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  557. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  558. package/rancher-components/components/StringList/StringList.test.ts +270 -0
  559. package/rancher-components/components/StringList/StringList.vue +65 -26
  560. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +69 -0
  561. package/scripts/clean +1 -1
  562. package/scripts/extension/bundle +19 -7
  563. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  564. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  565. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  566. package/scripts/extension/helm/package/Dockerfile +1 -1
  567. package/scripts/extension/helm/scripts/package +11 -3
  568. package/scripts/extension/helm/scripts/patch +27 -0
  569. package/scripts/extension/parse-tag-name +4 -4
  570. package/scripts/extension/publish +25 -14
  571. package/scripts/publish-shell.sh +11 -1
  572. package/scripts/serve-pkgs +0 -2
  573. package/scripts/test-plugins-build.sh +87 -11
  574. package/scripts/vue-migrate.js +683 -0
  575. package/server/har-file.js +183 -0
  576. package/store/__tests__/catalog.test.ts +224 -0
  577. package/store/__tests__/type-map.test.ts +1122 -0
  578. package/store/auth.js +23 -4
  579. package/store/aws.js +53 -6
  580. package/store/catalog.js +22 -6
  581. package/store/cru-resource.ts +26 -0
  582. package/store/customisation.js +35 -0
  583. package/store/features.js +7 -4
  584. package/store/i18n.js +11 -0
  585. package/store/index.js +139 -48
  586. package/store/plugins.js +8 -4
  587. package/store/prefs.js +33 -38
  588. package/store/type-map.js +288 -213
  589. package/store/type-map.utils.ts +226 -0
  590. package/tsconfig.json +34 -9
  591. package/tsconfig.paths.json +21 -0
  592. package/types/components/labeledSelect.ts +50 -0
  593. package/types/resources/settings.d.ts +32 -0
  594. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  595. package/types/shell/index.d.ts +1042 -767
  596. package/types/store/dashboard-store.types.ts +42 -0
  597. package/types/store/pagination.types.ts +457 -0
  598. package/types/store/type-map.ts +30 -0
  599. package/types/store/vuex.d.ts +9 -0
  600. package/types/vue-shim.d.ts +51 -0
  601. package/utils/__tests__/cluster.test.ts +20 -18
  602. package/utils/__tests__/create-yaml.test.ts +359 -2
  603. package/utils/__tests__/kontainer.test.ts +92 -0
  604. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  605. package/utils/alertmanagerconfig.js +19 -0
  606. package/utils/array.ts +40 -1
  607. package/utils/async.ts +2 -0
  608. package/utils/auth.js +152 -4
  609. package/utils/axios.js +2 -21
  610. package/utils/azure.js +24 -0
  611. package/utils/banners.js +103 -0
  612. package/utils/clipboard.js +5 -0
  613. package/utils/cluster.js +1 -1
  614. package/utils/config.js +4 -0
  615. package/utils/create-yaml.js +59 -28
  616. package/utils/custom-validators.js +0 -2
  617. package/utils/error.js +41 -1
  618. package/utils/formatter.js +5 -3
  619. package/utils/git.ts +1 -1
  620. package/utils/install-redirect.js +1 -1
  621. package/utils/kontainer.ts +186 -0
  622. package/utils/object.js +24 -0
  623. package/utils/pagination-utils.ts +154 -0
  624. package/utils/pod-security-admission.ts +1 -1
  625. package/utils/router.js +86 -0
  626. package/utils/settings.ts +46 -0
  627. package/utils/time.js +2 -1
  628. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  629. package/utils/url.ts +1 -1
  630. package/utils/validators/formRules/__tests__/index.test.ts +70 -4
  631. package/utils/validators/formRules/index.ts +15 -9
  632. package/utils/validators/index.js +1 -0
  633. package/utils/validators/setting.js +6 -10
  634. package/vue.config.js +377 -401
  635. package/.DS_Store +0 -0
  636. package/assets/images/providers/aks-black.svg +0 -28
  637. package/assets/images/providers/aks.svg +0 -31
  638. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  639. package/components/ChartPsp.vue +0 -76
  640. package/components/EventsTable.vue +0 -67
  641. package/components/TabbedLinks/index.vue +0 -94
  642. package/components/__tests__/ChartPsp.test.ts +0 -75
  643. package/components/formatter/__tests__/ClusterProvider.test.ts +0 -28
  644. package/components/nuxt/nuxt-link.server.js +0 -16
  645. package/components/nuxt/nuxt.js +0 -101
  646. package/config/router.js +0 -408
  647. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -237
  648. package/initialize/App.js +0 -198
  649. package/initialize/client.js +0 -875
  650. package/initialize/index.js +0 -364
  651. package/initialize/layouts.ts +0 -26
  652. package/middleware/i18n.js +0 -10
  653. package/middleware/unauthenticated.js +0 -22
  654. package/mixins/fetch.server.js +0 -73
  655. package/pages/c/_cluster/apps/index.vue +0 -17
  656. package/pages/c/_cluster/auth/index.vue +0 -19
  657. package/pages/c/_cluster/index.vue +0 -17
  658. package/pages/c/_cluster/legacy/index.vue +0 -22
  659. package/pages/c/_cluster/manager/index.vue +0 -22
  660. package/pages/c/_cluster/mcapps/index.vue +0 -21
  661. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  662. package/pages/c/index.vue +0 -9
  663. package/pages/rio/mesh.vue +0 -508
  664. package/plugins/dashboard-store/__tests__/mutations.spec.ts +0 -406
  665. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  666. package/plugins/portal-vue.js +0 -4
  667. package/plugins/portal.js +0 -4
  668. package/plugins/resize.js +0 -5
  669. package/plugins/shortkey.js +0 -4
  670. package/plugins/tooltip.js +0 -4
  671. package/plugins/transitions.js +0 -4
  672. package/plugins/v-select.js +0 -4
  673. package/plugins/vue-clipboard2.js +0 -4
  674. package/rancher-components/components/BadgeState/BadgeState.spec.ts +0 -12
  675. package/tsconfig.default.json +0 -46
  676. package/utils/group.js +0 -70
  677. package/utils/nuxt.js +0 -659
  678. package/utils/router.scrollBehavior.js +0 -80
  679. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  680. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  681. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  682. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  683. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  684. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  685. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  686. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  687. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
  688. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  689. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
package/models/secret.js CHANGED
@@ -6,6 +6,10 @@ import { SERVICE_ACCOUNT } from '@shell/config/types';
6
6
  import { set } from '@shell/utils/object';
7
7
  import { NAME as MANAGER } from '@shell/config/product/manager';
8
8
  import SteveModel from '@shell/plugins/steve/steve-class';
9
+ import { colorForState, stateDisplay, STATES_ENUM } from '@shell/plugins/dashboard-store/resource-class';
10
+ import { diffFrom } from '@shell/utils/time';
11
+ import day from 'dayjs';
12
+ import { steveCleanForDownload } from '@shell/plugins/steve/resource-utils';
9
13
 
10
14
  export const TYPES = {
11
15
  OPAQUE: 'Opaque',
@@ -23,7 +27,12 @@ export const TYPES = {
23
27
  RKE_AUTH_CONFIG: 'rke.cattle.io/auth-config'
24
28
  };
25
29
 
30
+ /** Class a cert as expiring if in eight days */
31
+ const certExpiringPeriod = 1000 * 60 * 60 * 24 * 8;
32
+
26
33
  export default class Secret extends SteveModel {
34
+ _cachedCertInfo;
35
+
27
36
  get hasSensitiveData() {
28
37
  return true;
29
38
  }
@@ -46,7 +55,7 @@ export default class Secret extends SteveModel {
46
55
  if (annotations[CERTMANAGER.ISSUER]) {
47
56
  return annotations[CERTMANAGER.ISSUER];
48
57
  } else if (this.isCertificate) {
49
- return this.certInfo?.issuer;
58
+ return this.cachedCertInfo?.issuer;
50
59
  } else {
51
60
  return null;
52
61
  }
@@ -54,7 +63,7 @@ export default class Secret extends SteveModel {
54
63
 
55
64
  get notAfter() {
56
65
  if (this.isCertificate) {
57
- return this.certInfo?.notAfter;
66
+ return this.cachedCertInfo?.notAfter;
58
67
  } else {
59
68
  return null;
60
69
  }
@@ -62,7 +71,7 @@ export default class Secret extends SteveModel {
62
71
 
63
72
  get cn() {
64
73
  if (this.isCertificate) {
65
- return this.certInfo?.cn;
74
+ return this.cachedCertInfo?.cn;
66
75
  }
67
76
 
68
77
  return null;
@@ -80,14 +89,13 @@ export default class Secret extends SteveModel {
80
89
  // use text-warning' or 'text-error' if cert is expiring within 8 days or is expired
81
90
  get dateClass() {
82
91
  if (this.isCertificate) {
83
- const eightDays = 691200000;
84
-
85
- if (this.timeTilExpiration > eightDays ) {
86
- return '';
87
- } else if (this.timeTilExpiration > 0) {
92
+ switch (this.certState) {
93
+ case STATES_ENUM.EXPIRING:
88
94
  return 'text-warning';
89
- } else {
95
+ case STATES_ENUM.EXPIRED:
90
96
  return 'text-error';
97
+ default:
98
+ return '';
91
99
  }
92
100
  }
93
101
 
@@ -248,7 +256,7 @@ export default class Secret extends SteveModel {
248
256
  // parse TLS certs and return issuer, notAfter, cn, sans
249
257
  get certInfo() {
250
258
  const pem = base64Decode(this.data['tls.crt']);
251
- let issuer, notAfter, cn, sans, x;
259
+ let issuer, notBefore, notAfter, cn, sans, x;
252
260
  const END_MARKER = '-----END CERTIFICATE-----';
253
261
 
254
262
  if (pem) {
@@ -266,6 +274,7 @@ export default class Secret extends SteveModel {
266
274
  const issuerString = x.getIssuerString();
267
275
 
268
276
  issuer = issuerString.slice(issuerString.indexOf('CN=') + 3);
277
+ notBefore = r.zulutodate(x.getNotBefore());
269
278
  notAfter = r.zulutodate(x.getNotAfter());
270
279
 
271
280
  const cnString = x.getSubjectString();
@@ -281,25 +290,39 @@ export default class Secret extends SteveModel {
281
290
  sans = [];
282
291
  }
283
292
 
284
- return {
285
- issuer, notAfter, cn, sans
293
+ const certInfo = {
294
+ issuer, notBefore, notAfter, cn, sans
286
295
  };
296
+
297
+ return certInfo;
287
298
  }
288
299
 
289
300
  return null;
290
301
  }
291
302
 
303
+ get cachedCertInfo() {
304
+ if (!this._cachedCertInfo) {
305
+ this._cachedCertInfo = this.certInfo;
306
+ }
307
+
308
+ return this._cachedCertInfo;
309
+ }
310
+
292
311
  // use for + n more name display
293
312
  get unrepeatedSans() {
294
313
  if (this._type === TYPES.TLS ) {
295
- if (this.certInfo?.sans?.filter) {
296
- const commonBases = this.certInfo?.sans.filter((name) => name.indexOf('*.') === 0 || name.indexOf('www.') === 0).map((name) => name.substr(name.indexOf('.')));
297
- const displaySans = removeObjects(this.certInfo?.sans, commonBases);
314
+ const certInfo = this.cachedCertInfo;
315
+
316
+ if (certInfo?.sans?.filter) {
317
+ const commonBases = certInfo?.sans
318
+ .filter((name) => name.indexOf('*.') === 0 || name.indexOf('www.') === 0)
319
+ .map((name) => name.substr(name.indexOf('.')));
320
+ const displaySans = removeObjects(certInfo?.sans, commonBases);
298
321
 
299
322
  return displaySans;
300
323
  }
301
324
 
302
- return this.certInfo?.sans || [];
325
+ return certInfo?.sans?.array || certInfo?.sans || [];
303
326
  }
304
327
 
305
328
  return null;
@@ -307,16 +330,28 @@ export default class Secret extends SteveModel {
307
330
 
308
331
  get timeTilExpiration() {
309
332
  if (this._type === TYPES.TLS) {
310
- const expiration = this.certInfo.notAfter;
333
+ const certInfo = this.cachedCertInfo;
334
+
335
+ if (!certInfo?.notAfter) {
336
+ return null;
337
+ }
338
+
339
+ const expiration = certInfo.notAfter;
311
340
  const timeThen = expiration.valueOf();
312
341
  const timeNow = Date.now();
313
342
 
314
- return timeThen - timeNow;
343
+ const timeTilExpiration = timeThen - timeNow;
344
+
345
+ return timeTilExpiration < 0 ? 0 : timeTilExpiration;
315
346
  }
316
347
 
317
348
  return null;
318
349
  }
319
350
 
351
+ get timeTilExpirationDate() {
352
+ return this.timeTilExpiration > 0 ? this.cachedCertInfo?.notAfter?.valueOf() : null;
353
+ }
354
+
320
355
  get decodedData() {
321
356
  const out = {};
322
357
 
@@ -357,4 +392,77 @@ export default class Secret extends SteveModel {
357
392
  return 'c-cluster-product-resource';
358
393
  }
359
394
  }
395
+
396
+ get certLifetime() {
397
+ if (this._type === TYPES.TLS) {
398
+ const certInfo = this.cachedCertInfo;
399
+
400
+ if (certInfo) {
401
+ return diffFrom(day(certInfo.notBefore), day(certInfo.notAfter), (key, args) => this.t(key, args)).string;
402
+ }
403
+ }
404
+
405
+ return null;
406
+ }
407
+
408
+ /**
409
+ * Get the model `state` for secrets of type cert
410
+ */
411
+ get certState() {
412
+ if (this._type !== TYPES.TLS) {
413
+ return undefined;
414
+ }
415
+
416
+ if (typeof this.timeTilExpiration !== 'number' || this.timeTilExpiration > certExpiringPeriod ) {
417
+ return '';
418
+ } else if (this.timeTilExpiration > 0) {
419
+ return STATES_ENUM.EXPIRING;
420
+ } else {
421
+ return STATES_ENUM.EXPIRED;
422
+ }
423
+ }
424
+
425
+ /**
426
+ * Get the model `state display` for secrets of type cert
427
+ */
428
+ get certStateDisplay() {
429
+ if (this._type !== TYPES.TLS) {
430
+ return undefined;
431
+ }
432
+
433
+ return stateDisplay(this.certState);
434
+ }
435
+
436
+ /**
437
+ * Get the model `state background` for secrets of type cert
438
+ */
439
+ get certStateBackground() {
440
+ if (this._type !== TYPES.TLS) {
441
+ return undefined;
442
+ }
443
+
444
+ const color = colorForState(this.certState);
445
+
446
+ return color.replace('text-', 'bg-');
447
+ }
448
+
449
+ cleanForSave(data, forNew) {
450
+ const val = super.cleanForSave(data, forNew);
451
+
452
+ // Secrets on create with _type will return validation error
453
+ // Secrets on edit without _type will return http error
454
+ if (forNew) {
455
+ delete val._type;
456
+ }
457
+
458
+ return val;
459
+ }
460
+
461
+ async cleanForDownload(yaml) {
462
+ // secret resource contains the type attribute
463
+ // ref: https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/secret-v1/
464
+ // ref: https://kubernetes.io/docs/concepts/configuration/secret/#secret-types
465
+
466
+ return steveCleanForDownload(yaml, { rootKeys: ['id', 'links', 'actions'] });
467
+ }
360
468
  }
package/models/service.js CHANGED
@@ -2,6 +2,8 @@ import find from 'lodash/find';
2
2
  import { POD } from '@shell/config/types';
3
3
  import SteveModel from '@shell/plugins/steve/steve-class';
4
4
 
5
+ // i18n-uses servicesPage.serviceTypes.clusterIp.*, servicesPage.serviceTypes.externalName.*, servicesPage.serviceTypes.headless.*
6
+ // i18n-uses servicesPage.serviceTypes.loadBalancer.*, servicesPage.serviceTypes.nodePort.*
5
7
  export const DEFAULT_SERVICE_TYPES = [
6
8
  {
7
9
  id: 'ClusterIP',
@@ -0,0 +1,254 @@
1
+ import { STEVE } from '@shell/config/types';
2
+ import Schema from './schema';
3
+ import { wait } from '@shell/utils/async';
4
+
5
+ interface ResourceField {
6
+ type: string,
7
+ description: string,
8
+ }
9
+ type ResourceFields = { [id: string]: ResourceField }
10
+
11
+ interface SchemaDefinition {
12
+ type: string,
13
+ description: string,
14
+ resourceFields: ResourceFields
15
+ }
16
+ type SchemaDefinitions = { [definitionId: string]: SchemaDefinition }
17
+
18
+ type SchemaId = {
19
+ self: string;
20
+ others: string[];
21
+ }
22
+ type SchemaIds = { [schemaId: string]: SchemaId }
23
+
24
+ interface SchemaDefinitionResponse {
25
+ definitions: SchemaDefinitions,
26
+ definitionType: string,
27
+ }
28
+
29
+ const SchemaDefinitionCache: { [store: string]: {
30
+ ids: SchemaIds,
31
+ definitions: SchemaDefinitions,
32
+ } } = {};
33
+
34
+ /**
35
+ * Steve Schema specific functionality
36
+ */
37
+ export default class SteveSchema extends Schema {
38
+ static reset(store: string): void {
39
+ delete SchemaDefinitionCache[store];
40
+ }
41
+
42
+ _resourceFields?: ResourceFields;
43
+
44
+ /**
45
+ * If resourceFields have not been provided, they are required to be fetched aka schemaDefinition world
46
+ */
47
+ requiresResourceFields: boolean;
48
+
49
+ // These are just for typing, eventually we'll get them when Schema is fully converted to typescript
50
+ id?: string;
51
+ type?: string;
52
+ links?: any;
53
+ $ctx?: any;
54
+
55
+ /**
56
+ * This should match the root Schema ctor (...args throws ts error)
57
+ */
58
+ constructor(data: unknown, ctx: unknown, rehydrateNamespace?: null | undefined, setClone?: boolean) {
59
+ super(data, ctx, rehydrateNamespace, setClone);
60
+
61
+ if (!SchemaDefinitionCache[this.store]) {
62
+ SchemaDefinitionCache[this.store] = {
63
+ ids: {},
64
+ definitions: {}
65
+ };
66
+ }
67
+
68
+ this.requiresResourceFields = this._resourceFields === null; // This is set pre ctor via `set'er, but TS complains that it's not initialised
69
+ }
70
+
71
+ // Notes on Schemas, resourceFields and schemaDefinitions
72
+ // - Schemas previously contained a `resourceFields` collection, which is now null
73
+ // - resourceFields now come from a new `schemaDefinitions` endpoint
74
+ // - for neatness / safety / compatibility with norman resources... we fetch schemaDefinitions and return their resourceFields in a resourceFields getter
75
+
76
+ /******************
77
+ * Resource Fields
78
+ ****************** /
79
+
80
+ /**
81
+ * Is the property `resourceFields` available
82
+ *
83
+ * If the schema definition is required and it hasn't been fetched this will be false
84
+ *
85
+ * This is a non-erroring request, unlike the resourceFields getter which will error if schema definition is required but missing
86
+ */
87
+ get hasResourceFields(): boolean {
88
+ if (this.requiresResourceFields) {
89
+ return !!this.schemaDefinition?.resourceFields;
90
+ }
91
+
92
+ return !!this._resourceFields;
93
+ }
94
+
95
+ /**
96
+ * Fields associated with instances of this schema
97
+ *
98
+ * This will either come directly from the schema or from the schema's definition
99
+ */
100
+ get resourceFields(): ResourceFields {
101
+ if (this.requiresResourceFields) {
102
+ if (!this.schemaDefinitionsIds) {
103
+ throw new Error(`Cannot find resourceFields for Schema ${ this.id } (schemaDefinitions have not been fetched) `);
104
+ }
105
+
106
+ if (!this.schemaDefinition) {
107
+ throw new Error(`No schemaDefinition for ${ this.id } found (not in schemaDefinition response) `);
108
+ }
109
+
110
+ return this.schemaDefinition.resourceFields;
111
+ }
112
+
113
+ return this._resourceFields as ResourceFields;
114
+ }
115
+
116
+ /**
117
+ * Apply the original `resourceFields` param (if it exists). If it does not then we'll need to fetch the schema definition
118
+ */
119
+ set resourceFields(resourceFields: ResourceFields) {
120
+ this._resourceFields = resourceFields;
121
+ this.requiresResourceFields = this._resourceFields === null;
122
+ }
123
+
124
+ /**
125
+ * Ensure this schema has a populated `resourceFields` property
126
+ *
127
+ * This happens via making a request to fetch the schema definition
128
+ */
129
+ async fetchResourceFields(depth = 0): Promise<SchemaDefinition | null | undefined> {
130
+ if (!this.requiresResourceFields) {
131
+ // Not needed, no-op
132
+ return;
133
+ }
134
+
135
+ if (this.schemaDefinition) {
136
+ // Already have it, no-op
137
+ return this.schemaDefinition;
138
+ }
139
+
140
+ const url = this.schemaDefinitionUrl;
141
+
142
+ if (!url) {
143
+ console.warn(`Unable to fetch schema definitions for ${ this.id } (failed to find url of schema definition)`); // eslint-disable-line no-console
144
+
145
+ return;
146
+ }
147
+
148
+ if (depth >= 4) {
149
+ console.warn(`Unable to fetch schema definitions for ${ this.id } (too many failed requests)`); // eslint-disable-line no-console
150
+
151
+ return;
152
+ }
153
+
154
+ let res;
155
+
156
+ try {
157
+ // Make a direct request to fetch the schema definition
158
+ res = await this.$dispatch('request', {
159
+ type: STEVE.SCHEMA_DEFINITION,
160
+ url
161
+ });
162
+ } catch (e: any) {
163
+ if ( e?._status === 500) {
164
+ // Rancher could be updating it's definition cache, attempt a few times
165
+ await wait(2000);
166
+
167
+ return this.fetchResourceFields(++depth);
168
+ }
169
+
170
+ console.warn(`Unable to fetch schema definitions for ${ this.id }`, e); // eslint-disable-line no-console
171
+
172
+ return;
173
+ }
174
+
175
+ this.cacheSchemaDefinitionResponse(res);
176
+
177
+ return this.schemaDefinition;
178
+ }
179
+
180
+ /**
181
+ * Convert collection of schema definitions for this schema into objects we can store
182
+ *
183
+ * Split out for unit testing purposes
184
+ */
185
+ private cacheSchemaDefinitionResponse(res: SchemaDefinitionResponse): void {
186
+ const { [res.definitionType]: self, ...others } = res.definitions;
187
+ const store = this.store;
188
+
189
+ SchemaDefinitionCache[store].ids[this.id as string] = { self: self.type, others: Object.keys(others) };
190
+ Object.entries(res.definitions).forEach(([type, sd]) => {
191
+ SchemaDefinitionCache[store].definitions[type] = sd;
192
+ });
193
+ }
194
+
195
+ /*********************
196
+ * Schema Definitions
197
+ ********************* /
198
+
199
+ /**
200
+ * Store this schema's definition and a collection of associated definitions (all ids)
201
+ */
202
+
203
+ /**
204
+ * The schema definition for this schema
205
+ */
206
+ get schemaDefinition(): SchemaDefinition | null {
207
+ if (!this.schemaDefinitionsIds) {
208
+ return null;
209
+ }
210
+
211
+ return SchemaDefinitionCache[this.store].definitions[this.schemaDefinitionsIds.self];
212
+ }
213
+
214
+ /**
215
+ * The schema definitions for this schema definition's resourceFields
216
+ */
217
+ get schemaDefinitions(): SchemaDefinitions | null {
218
+ if (!this.schemaDefinitionsIds) {
219
+ return null;
220
+ }
221
+
222
+ return this.schemaDefinitionsIds.others.reduce((res, d) => {
223
+ res[d] = SchemaDefinitionCache[this.store].definitions[d];
224
+
225
+ return res;
226
+ }, {} as SchemaDefinitions);
227
+ }
228
+
229
+ /**
230
+ * URL to fetch this schema's definition
231
+ */
232
+ get schemaDefinitionUrl(): string {
233
+ return this.links?.self?.replace('/schemas/', '/schemaDefinitions/');
234
+ }
235
+
236
+ /*********************
237
+ * Local Properties
238
+ *
239
+ * This could be set in the ctor, however are removed in `replaceResource` when there are socket updates..
240
+ * ... so use getters instead
241
+ *
242
+ *********************/
243
+
244
+ /**
245
+ * The name (namespace) of the vuex store this schema lives in (i.e. cluster, management, etc)
246
+ */
247
+ private get store(): string {
248
+ return this.$ctx.state?.config?.namespace;
249
+ }
250
+
251
+ private get schemaDefinitionsIds(): SchemaId | undefined {
252
+ return SchemaDefinitionCache[this.store]?.ids[this.id as string];
253
+ }
254
+ }
@@ -84,7 +84,7 @@ export const PROVISIONER_OPTIONS = [
84
84
  export default class extends SteveModel {
85
85
  get provisionerDisplay() {
86
86
  const option = PROVISIONER_OPTIONS.find((o) => o.value === this.provisioner);
87
- const fallback = `${ this.provisioner } ${ this.t('persistentVolume.csi.drivers.suffix') }`;
87
+ const fallback = `${ this.provisioner } ${ this.t('persistentVolume.csi.suffix') }`;
88
88
 
89
89
  return option ? this.t(option.labelKey) : this.$rootGetters['i18n/withFallback'](`persistentVolume.csi.drivers.${ this.provisioner.replaceAll('.', '-') }`, null, fallback);
90
90
  }
@@ -647,6 +647,23 @@ export default class Workload extends WorkloadService {
647
647
 
648
648
  const selector = convertSelectorObj(this.spec.selector);
649
649
 
650
+ // See https://github.com/rancher/dashboard/issues/10417, all pods bad, need to replace local selector somehow
650
651
  return matching(allInNamespace, selector);
651
652
  }
653
+
654
+ cleanForSave(data) {
655
+ const val = super.cleanForSave(data);
656
+
657
+ // remove fields from containers
658
+ val.spec?.template?.spec?.containers?.forEach((container) => {
659
+ this.cleanContainerForSave(container);
660
+ });
661
+
662
+ // remove fields from initContainers
663
+ val.spec?.template?.spec?.initContainers?.forEach((container) => {
664
+ this.cleanContainerForSave(container);
665
+ });
666
+
667
+ return val;
668
+ }
652
669
  }
@@ -320,4 +320,22 @@ export default class WorkloadService extends SteveModel {
320
320
 
321
321
  return { toSave, toRemove };
322
322
  }
323
+
324
+ cleanForSave(data) {
325
+ const val = super.cleanForSave(data);
326
+
327
+ delete val.__active;
328
+ delete val.type;
329
+
330
+ return val;
331
+ }
332
+
333
+ cleanContainerForSave(container) {
334
+ delete container.__active;
335
+ delete container.active;
336
+ delete container._init;
337
+ delete container.error;
338
+
339
+ return container;
340
+ }
323
341
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rancher/shell",
3
- "version": "1.2.0",
3
+ "version": "2.0.0",
4
4
  "description": "Rancher Dashboard Shell",
5
5
  "repository": "https://github.com/rancherlabs/dashboard",
6
6
  "license": "Apache-2.0",
@@ -30,6 +30,7 @@
30
30
  "@aws-sdk/client-ec2": "3.1.0",
31
31
  "@aws-sdk/client-eks": "3.1.0",
32
32
  "@aws-sdk/client-kms": "3.8.1",
33
+ "@aws-sdk/client-iam": "3.18.0",
33
34
  "@babel/plugin-proposal-optional-chaining": "7.14.5",
34
35
  "@babel/plugin-proposal-private-property-in-object": "7.14.5",
35
36
  "@babel/preset-typescript": "7.16.7",
@@ -41,6 +42,7 @@
41
42
  "@nuxtjs/eslint-config-typescript": "6.0.1",
42
43
  "@nuxtjs/webpack-profile": "0.1.0",
43
44
  "@popperjs/core": "2.4.4",
45
+ "@types/is-url": "1.2.30",
44
46
  "@types/node": "16.4.3",
45
47
  "@typescript-eslint/eslint-plugin": "4.33.0",
46
48
  "@typescript-eslint/parser": "4.33.0",
@@ -105,7 +107,7 @@
105
107
  "nyc": "15.1.0",
106
108
  "papaparse": "5.3.0",
107
109
  "portal-vue": "2.1.7",
108
- "rancher-icons": "rancher/icons#v2.0.16",
110
+ "@rancher/icons": "2.0.29",
109
111
  "sass": "1.51.0",
110
112
  "sass-loader": "10.2.1",
111
113
  "serve-static": "1.14.1",
@@ -115,29 +117,29 @@
115
117
  "start-server-and-test": "1.13.1",
116
118
  "style-loader": "1.2.1",
117
119
  "ts-node": "8.10.2",
118
- "typescript": "4.1.6",
120
+ "typescript": "4.5.5",
119
121
  "url-parse": "1.5.10",
120
122
  "v-tooltip": "2.0.3",
121
- "vue": "2.7.14",
122
- "vue-clipboard2": "0.3.1",
123
+ "vue": "2.7.16",
124
+ "clipboard-polyfill": "4.0.1",
123
125
  "vue-codemirror": "4.0.6",
124
126
  "vue-js-modal": "1.3.35",
125
127
  "vue-resize": "0.4.5",
126
128
  "vue-select": "3.18.3",
127
- "vue-server-renderer": "2.7.14",
129
+ "vue-server-renderer": "2.7.16",
128
130
  "vue-shortkey": "3.1.7",
129
- "vue-template-compiler": "2.7.14",
131
+ "vue-template-compiler": "2.7.16",
130
132
  "vue-virtual-scroll-list": "^2.3.4",
131
- "vue2-transitions": "0.3.0",
132
133
  "vuedraggable": "2.24.3",
133
134
  "vuex": "3.6.2",
134
135
  "webpack-bundle-analyzer": "4.5.0",
135
136
  "webpack-virtual-modules": "0.4.3",
136
- "xterm": "5.0.0",
137
- "xterm-addon-fit": "0.6.0",
138
- "xterm-addon-search": "0.10.0",
139
- "xterm-addon-web-links": "0.7.0",
140
- "xterm-addon-webgl": "0.13.0",
137
+ "xterm": "5.2.1",
138
+ "xterm-addon-canvas": "^0.5.0",
139
+ "xterm-addon-fit": "0.8.0",
140
+ "xterm-addon-search": "0.13.0",
141
+ "xterm-addon-web-links": "0.9.0",
142
+ "xterm-addon-webgl": "0.16.0",
141
143
  "worker-loader": "3.0.8",
142
144
  "yarn": "1.22.18"
143
145
  },
@@ -150,7 +152,8 @@
150
152
  "qs": ">=6.7.3",
151
153
  "nth-check": ">=2.0.1",
152
154
  "follow-redirects": ">=1.14.7",
153
- "merge": ">=2.1.1"
155
+ "merge": ">=2.1.1",
156
+ "semver": ">=7.5.2"
154
157
  },
155
158
  "nyc": {
156
159
  "extension": [
package/pages/about.vue CHANGED
@@ -7,11 +7,13 @@ import { SETTING } from '@shell/config/settings';
7
7
  import { getVendor } from '@shell/config/private-label';
8
8
  import { downloadFile } from '@shell/utils/download';
9
9
  import { mapGetters } from 'vuex';
10
+ import TabTitle from '@shell/components/TabTitle';
10
11
 
11
12
  export default {
12
- layout: 'plain',
13
- components: { BackLink, Loading },
14
- mixins: [BackRoute],
13
+ components: {
14
+ BackLink, Loading, TabTitle
15
+ },
16
+ mixins: [BackRoute],
15
17
  async fetch() {
16
18
  this.settings = await this.$store.dispatch(`management/findAll`, { type: MANAGEMENT.SETTING });
17
19
  },
@@ -97,14 +99,18 @@ export default {
97
99
  >
98
100
  <BackLink :link="backLink" />
99
101
  <div class="title-block mt-20 mb-40">
100
- <h1 v-t="'about.title'" />
101
- <n-link
102
+ <h1>
103
+ <TabTitle breadcrumb="vendor-only">
104
+ {{ t('about.title') }}
105
+ </TabTitle>
106
+ </h1>
107
+ <router-link
102
108
  :to="{ name: 'diagnostic' }"
103
109
  class="btn role-primary"
104
110
  data-testid="about__diagnostics_button"
105
111
  >
106
112
  {{ t('about.diagnostic.title') }}
107
- </n-link>
113
+ </router-link>
108
114
  </div>
109
115
  <h3>{{ t('about.versions.title') }}</h3>
110
116
  <table>
@@ -3,7 +3,6 @@ import ResourceDetail from '@shell/components/ResourceDetail';
3
3
 
4
4
  export default {
5
5
  name: 'APIKeyCreate',
6
- layout: 'plain',
7
6
  components: { ResourceDetail },
8
7
  };
9
8
  </script>