@rancher/shell 0.2.5 → 0.3.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 (635) hide show
  1. package/assets/styles/global/_button.scss +5 -1
  2. package/assets/styles/global/_columns.scss +4 -0
  3. package/assets/styles/global/_layout.scss +1 -2
  4. package/assets/styles/global/_select.scss +1 -4
  5. package/assets/styles/themes/_dark.scss +8 -4
  6. package/assets/styles/themes/_light.scss +9 -3
  7. package/assets/styles/themes/_suse.scss +1 -1
  8. package/assets/styles/vendor/vue-select.scss +4 -3
  9. package/assets/translations/en-us.yaml +682 -74
  10. package/assets/translations/zh-hans.yaml +554 -170
  11. package/chart/istio.vue +1 -1
  12. package/chart/monitoring/grafana/index.vue +1 -1
  13. package/chart/monitoring/index.vue +1 -1
  14. package/chart/monitoring/prometheus/index.vue +4 -4
  15. package/chart/monitoring/steps/uninstall-v1.vue +2 -2
  16. package/cloud-credential/azure.vue +23 -0
  17. package/cloud-credential/harvester.vue +25 -62
  18. package/cloud-credential/pnap.vue +80 -0
  19. package/components/AdvancedSection.vue +9 -2
  20. package/components/Alert.vue +2 -2
  21. package/components/AlertTable.vue +1 -1
  22. package/components/AssignTo.vue +1 -1
  23. package/components/AsyncButton.vue +2 -2
  24. package/components/BrandImage.vue +1 -1
  25. package/components/ButtonDropdown.vue +0 -2
  26. package/components/ButtonGroup.vue +2 -1
  27. package/components/ClusterProviderIcon.vue +2 -2
  28. package/components/Collapse.vue +6 -2
  29. package/components/CollapsibleCard.vue +2 -3
  30. package/components/ConsumptionGauge.vue +4 -4
  31. package/components/ContainerResourceLimit.vue +1 -1
  32. package/components/CountBox.vue +1 -1
  33. package/components/CountGauge.vue +1 -1
  34. package/components/CruResource.vue +43 -5
  35. package/components/DashboardMetrics.vue +2 -2
  36. package/components/DetailTop.vue +58 -3
  37. package/components/DisableAuthProviderModal.vue +106 -0
  38. package/components/DraggableZone.vue +181 -0
  39. package/components/ExplorerMembers.vue +253 -30
  40. package/components/ExplorerProjectsNamespaces.vue +82 -38
  41. package/components/FixedBanner.vue +6 -6
  42. package/components/GlobalRoleBindings.vue +6 -6
  43. package/components/GradientBox.vue +2 -2
  44. package/components/GrowlManager.vue +3 -3
  45. package/components/IconMessage.vue +4 -4
  46. package/components/IconOrSvg.vue +149 -0
  47. package/components/Import.vue +5 -5
  48. package/components/InputOrDisplay.vue +1 -1
  49. package/components/KeyValueView.vue +1 -1
  50. package/components/LabelValue.vue +1 -1
  51. package/components/LogItem.vue +69 -0
  52. package/components/ModalWithCard.vue +1 -1
  53. package/components/MoveModal.vue +1 -1
  54. package/components/PercentageBar.vue +2 -2
  55. package/components/PodSecurityAdmission.vue +302 -0
  56. package/components/PromptChangePassword.vue +1 -1
  57. package/components/PromptModal.vue +2 -1
  58. package/components/PromptRemove.vue +2 -2
  59. package/components/PromptRestore.vue +13 -13
  60. package/components/Questions/Question.js +1 -1
  61. package/components/ResourceCancelModal.vue +3 -3
  62. package/components/ResourceDetail/Masthead.vue +55 -3
  63. package/components/ResourceDetail/index.vue +12 -5
  64. package/components/ResourceList/Masthead.vue +12 -2
  65. package/components/ResourceList/ResourceLoadingIndicator.vue +12 -2
  66. package/components/ResourceList/index.vue +53 -12
  67. package/components/ResourceList/resource-list.config.js +7 -0
  68. package/components/ResourceSummary.vue +4 -4
  69. package/components/ResourceTable.vue +31 -6
  70. package/components/RoleBindings.vue +19 -19
  71. package/components/SimpleBox.vue +6 -2
  72. package/components/SingleClusterInfo.vue +5 -5
  73. package/components/SortableTable/THead.vue +20 -6
  74. package/components/SortableTable/actions.js +4 -2
  75. package/components/SortableTable/index.vue +30 -19
  76. package/components/SortableTable/selection.js +2 -2
  77. package/components/Tabbed/index.vue +20 -15
  78. package/components/TableSparkLine.vue +1 -1
  79. package/components/TypeDescription.vue +1 -1
  80. package/components/Wizard.vue +1 -1
  81. package/components/YamlEditor.vue +6 -6
  82. package/components/__tests__/ApplicationCard.test.ts +27 -0
  83. package/components/__tests__/AsyncButton.test.ts +140 -0
  84. package/components/__tests__/BackLink.test.ts +33 -0
  85. package/components/__tests__/ButtonGroup.test.ts +124 -0
  86. package/components/__tests__/ClusterBadge.test.ts +32 -0
  87. package/components/__tests__/Collapse.spec.ts +44 -0
  88. package/components/__tests__/CollapsibleCard.test.ts +64 -0
  89. package/components/__tests__/ConsumptionGauge.test.ts +88 -0
  90. package/components/__tests__/CruResource.test.ts +6 -5
  91. package/components/__tests__/FixedBanner.test.ts +129 -0
  92. package/components/__tests__/GrowlManager.test.ts +147 -0
  93. package/components/__tests__/NamespaceFilter.test.ts +221 -0
  94. package/components/__tests__/PercentageBar.test.ts +32 -0
  95. package/components/__tests__/PodSecurityAdmission.test.ts +398 -0
  96. package/components/__tests__/SimpleBox.spec.ts +28 -0
  97. package/components/auth/AuthBanner.vue +20 -10
  98. package/components/auth/RoleDetailEdit.vue +41 -30
  99. package/components/auth/SelectPrincipal.vue +45 -5
  100. package/components/auth/login/ldap.vue +3 -0
  101. package/components/cards/ApplicationCard.vue +10 -5
  102. package/components/fleet/FleetBundleResources.vue +8 -8
  103. package/components/fleet/FleetClusters.vue +10 -10
  104. package/components/fleet/FleetRepos.vue +5 -5
  105. package/components/fleet/FleetResources.vue +6 -6
  106. package/components/fleet/FleetSummary.vue +5 -5
  107. package/components/fleet/ResourcesSummary.vue +1 -1
  108. package/components/form/ArrayList.vue +3 -35
  109. package/components/form/ArrayListGrouped.vue +14 -5
  110. package/components/form/ArrayListSelect.vue +8 -8
  111. package/components/form/BannerSettings.vue +6 -6
  112. package/components/form/ChangePassword.vue +3 -3
  113. package/components/form/Error.vue +10 -2
  114. package/components/form/FileSelector.vue +3 -3
  115. package/components/form/Footer.vue +1 -1
  116. package/components/form/GithubPicker.vue +4 -4
  117. package/components/form/KeyValue.vue +41 -9
  118. package/components/form/LabeledSelect.vue +5 -2
  119. package/components/form/Labels.vue +46 -16
  120. package/components/form/MatchExpressions.vue +1 -1
  121. package/components/form/Members/ClusterPermissionsEditor.vue +28 -28
  122. package/components/form/Members/MembershipEditor.vue +14 -14
  123. package/components/form/NameNsDescription.vue +1 -1
  124. package/components/form/NodeAffinity.vue +1 -1
  125. package/components/form/NodeScheduling.vue +1 -1
  126. package/components/form/Password.vue +3 -3
  127. package/components/form/PodAffinity.vue +1 -1
  128. package/components/form/Probe.vue +3 -3
  129. package/components/form/ProjectMemberEditor.vue +1 -1
  130. package/components/form/ResourceQuota/Project.vue +6 -6
  131. package/components/form/ResourceQuota/shared.js +12 -12
  132. package/components/form/ResourceTabs/index.vue +1 -6
  133. package/components/form/SecretSelector.vue +1 -1
  134. package/components/form/Security.vue +8 -7
  135. package/components/form/Select.vue +7 -2
  136. package/components/form/SelectOrCreateAuthSecret.vue +22 -29
  137. package/components/form/ServicePorts.vue +8 -0
  138. package/components/form/SimpleSecretSelector.vue +1 -1
  139. package/components/form/Taints.vue +1 -1
  140. package/components/form/UnitInput.vue +7 -7
  141. package/components/form/ValueFromResource.vue +1 -1
  142. package/components/form/WorkloadPorts.vue +8 -2
  143. package/components/form/__tests__/ArrayList.test.ts +74 -0
  144. package/components/form/__tests__/ArrayListGrouped.test.ts +6 -4
  145. package/components/formatter/AppSummaryGraph.vue +4 -4
  146. package/components/formatter/BadgeStateFormatter.vue +2 -2
  147. package/components/formatter/Checked.vue +2 -2
  148. package/components/formatter/ClusterLink.vue +8 -3
  149. package/components/formatter/Date.vue +1 -1
  150. package/components/formatter/DelayedValue.vue +1 -1
  151. package/components/formatter/Endpoints.vue +1 -1
  152. package/components/formatter/FleetSummaryGraph.vue +4 -4
  153. package/components/formatter/IconIsDefault.vue +3 -3
  154. package/components/formatter/IconText.vue +4 -4
  155. package/components/formatter/ImagePercentageBar.vue +4 -4
  156. package/components/formatter/IngressFullPath.vue +1 -1
  157. package/components/formatter/InternalExternalIP.vue +11 -8
  158. package/components/formatter/LinkDetail.vue +3 -3
  159. package/components/formatter/List.vue +1 -1
  160. package/components/formatter/ListLink.vue +1 -1
  161. package/components/formatter/ListLinkDetail.vue +1 -1
  162. package/components/formatter/LiveDate.vue +3 -3
  163. package/components/formatter/LiveDuration.vue +78 -0
  164. package/components/formatter/LivePodRestarts.vue +1 -1
  165. package/components/formatter/Number.vue +1 -1
  166. package/components/formatter/Percentage.vue +2 -2
  167. package/components/formatter/PercentageBar.vue +3 -3
  168. package/components/formatter/PodImages.vue +1 -1
  169. package/components/formatter/Principal.vue +1 -1
  170. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  171. package/components/formatter/QualityText.vue +1 -1
  172. package/components/formatter/ReceiverIcons.vue +2 -2
  173. package/components/formatter/Scale.vue +1 -1
  174. package/components/formatter/ScanResult.vue +1 -1
  175. package/components/formatter/SecretData.vue +1 -1
  176. package/components/formatter/ServiceType.vue +1 -1
  177. package/components/formatter/Shortened.vue +1 -1
  178. package/components/formatter/VerticalScroll.vue +2 -2
  179. package/components/formatter/VirtualServiceGateways.vue +3 -3
  180. package/components/formatter/Weight.vue +2 -2
  181. package/components/formatter/WorkloadDetailEndpoints.vue +1 -1
  182. package/components/formatter/WorkloadHealthScale.vue +7 -5
  183. package/components/formatter/__tests__/Date.test.ts +60 -0
  184. package/components/formatter/__tests__/LinkDetail.test.ts +72 -0
  185. package/components/formatter/__tests__/LiveDate.test.ts +84 -0
  186. package/components/formatter/__tests__/Si.test.ts +35 -0
  187. package/components/graph/LinePlot.vue +1 -1
  188. package/components/graph/ProgressArc.vue +5 -5
  189. package/components/nav/GlobalLoading.vue +1 -1
  190. package/components/nav/Header.vue +6 -4
  191. package/components/nav/Jump.vue +3 -3
  192. package/components/nav/NamespaceFilter.vue +200 -68
  193. package/components/nav/TopLevelMenu.vue +24 -21
  194. package/components/nav/Type.vue +1 -1
  195. package/components/nav/WindowManager/ChartReadme.vue +1 -1
  196. package/components/nav/WindowManager/ContainerLogs.vue +84 -127
  197. package/components/nav/WindowManager/ContainerShell.vue +28 -7
  198. package/components/nav/WindowManager/KubectlShell.vue +6 -6
  199. package/components/nav/WindowManager/MachineSsh.vue +1 -1
  200. package/components/nav/WindowManager/Window.vue +2 -0
  201. package/components/nav/WindowManager/index.vue +206 -25
  202. package/config/elemental-types.js +9 -0
  203. package/config/features.js +2 -0
  204. package/config/home-links.js +4 -1
  205. package/config/labels-annotations.js +19 -19
  206. package/config/pod-security-admission.ts +82 -0
  207. package/config/product/apps.js +5 -5
  208. package/config/product/auth.js +22 -21
  209. package/config/product/cis.js +24 -24
  210. package/config/product/explorer.js +25 -24
  211. package/config/product/fleet.js +7 -7
  212. package/config/product/gatekeeper.js +7 -7
  213. package/config/product/istio.js +7 -7
  214. package/config/product/legacy.js +21 -21
  215. package/config/product/logging.js +90 -90
  216. package/config/product/manager.js +19 -15
  217. package/config/product/monitoring.js +36 -36
  218. package/config/product/multi-cluster-apps.js +24 -24
  219. package/config/product/settings.js +42 -42
  220. package/config/secret.js +0 -1
  221. package/config/settings.ts +39 -22
  222. package/config/table-headers.js +70 -52
  223. package/config/types.js +11 -8
  224. package/config/uiplugins.js +4 -4
  225. package/content/docs/zh-hans/getting-started.md +113 -137
  226. package/content/docs/zh-hans/whats-new.md +8 -46
  227. package/creators/app/app.package.json +4 -1
  228. package/creators/app/{.eslintignore → files/.eslintignore} +0 -0
  229. package/creators/app/{.eslintrc.js → files/.eslintrc.js} +0 -0
  230. package/creators/app/{.vscode → files/.vscode}/settings.json +0 -0
  231. package/creators/app/{babel.config.js → files/babel.config.js} +0 -0
  232. package/creators/app/{nuxt.config.js → files/nuxt.config.js} +0 -0
  233. package/creators/app/{tsconfig.json → files/tsconfig.json} +2 -1
  234. package/creators/app/init +16 -17
  235. package/creators/app/package.json +7 -1
  236. package/creators/pkg/{babel.config.js → files/babel.config.js} +0 -0
  237. package/creators/pkg/{index.ts → files/index.ts} +0 -0
  238. package/creators/pkg/{tsconfig.json → files/tsconfig.json} +13 -12
  239. package/creators/pkg/{vue.config.js → files/vue.config.js} +0 -0
  240. package/creators/pkg/init +1 -1
  241. package/creators/pkg/package.json +2 -2
  242. package/creators/update/init +56 -0
  243. package/creators/update/package.json +20 -0
  244. package/creators/update/upgrade +56 -0
  245. package/detail/catalog.cattle.io.app.vue +1 -1
  246. package/detail/cis.cattle.io.clusterscan.vue +6 -6
  247. package/detail/configmap.vue +1 -1
  248. package/detail/constraints.gatekeeper.sh.constraint.vue +1 -1
  249. package/detail/fleet.cattle.io.bundle.vue +5 -5
  250. package/detail/fleet.cattle.io.gitrepo.vue +5 -5
  251. package/detail/helm.cattle.io.projecthelmchart.vue +1 -1
  252. package/detail/management.cattle.io.user.vue +3 -3
  253. package/detail/namespace.vue +13 -13
  254. package/detail/node.vue +2 -2
  255. package/detail/pod.vue +2 -2
  256. package/detail/provisioning.cattle.io.cluster.vue +47 -10
  257. package/detail/secret.vue +2 -2
  258. package/detail/service.vue +2 -9
  259. package/detail/workload/index.vue +1 -2
  260. package/dialog/AddClusterMemberDialog.vue +23 -29
  261. package/dialog/AddCustomBadgeDialog.vue +4 -4
  262. package/dialog/AddProjectMemberDialog.vue +81 -30
  263. package/dialog/AddonConfigConfirmationDialog.vue +1 -1
  264. package/dialog/DiagnosticTimingsDialog.vue +9 -8
  265. package/dialog/DrainNode.vue +56 -60
  266. package/dialog/ForceMachineRemoveDialog.vue +6 -8
  267. package/dialog/GenericPrompt.vue +16 -21
  268. package/dialog/RollbackWorkloadDialog.vue +22 -53
  269. package/dialog/RotateCertificatesDialog.vue +9 -11
  270. package/dialog/RotateEncryptionKeyDialog.vue +6 -10
  271. package/dialog/SaveAsRKETemplateDialog.vue +6 -14
  272. package/dialog/ScaleMachineDownDialog.vue +2 -2
  273. package/dialog/ScalePoolDownDialog.vue +121 -0
  274. package/edit/__tests__/management.cattle.io.setting.test.ts +4 -4
  275. package/edit/auth/azuread.vue +18 -18
  276. package/edit/auth/github.vue +10 -2
  277. package/edit/auth/googleoauth.vue +10 -1
  278. package/edit/auth/ldap/index.vue +14 -4
  279. package/edit/auth/oidc.vue +13 -3
  280. package/edit/auth/saml.vue +14 -4
  281. package/edit/autoscaling.horizontalpodautoscaler/external-metric.vue +2 -2
  282. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
  283. package/edit/autoscaling.horizontalpodautoscaler/metric-object-reference.vue +1 -1
  284. package/edit/autoscaling.horizontalpodautoscaler/object-metric.vue +2 -2
  285. package/edit/autoscaling.horizontalpodautoscaler/pod-metric.vue +2 -2
  286. package/edit/cis.cattle.io.clusterscan.vue +2 -2
  287. package/edit/cloudcredential.vue +3 -7
  288. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -1
  289. package/edit/fleet.cattle.io.clustergroup.vue +3 -3
  290. package/edit/fleet.cattle.io.gitrepo.vue +9 -9
  291. package/edit/group.principal.vue +2 -2
  292. package/edit/helm.cattle.io.projecthelmchart.vue +3 -3
  293. package/edit/logging-flow/Match.vue +39 -8
  294. package/edit/logging-flow/index.vue +28 -5
  295. package/edit/logging.banzaicloud.io.output/providers/datadog.vue +1 -1
  296. package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +1 -1
  297. package/edit/logging.banzaicloud.io.output/providers/gcs.vue +1 -1
  298. package/edit/logging.banzaicloud.io.output/providers/gelf.vue +1 -1
  299. package/edit/logging.banzaicloud.io.output/providers/kafka.vue +1 -1
  300. package/edit/logging.banzaicloud.io.output/providers/logz.vue +1 -1
  301. package/edit/logging.banzaicloud.io.output/providers/loki.vue +1 -1
  302. package/edit/logging.banzaicloud.io.output/providers/opensearch.vue +213 -0
  303. package/edit/logging.banzaicloud.io.output/providers/redis.vue +142 -0
  304. package/edit/logging.banzaicloud.io.output/providers/s3.vue +1 -1
  305. package/edit/logging.banzaicloud.io.output/providers/splunkHec.vue +1 -1
  306. package/edit/logging.banzaicloud.io.output/providers/syslog.vue +1 -1
  307. package/edit/management.cattle.io.fleetworkspace.vue +1 -1
  308. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +107 -0
  309. package/edit/management.cattle.io.project.vue +11 -4
  310. package/edit/management.cattle.io.projectroletemplatebinding.vue +5 -5
  311. package/edit/management.cattle.io.setting.vue +6 -3
  312. package/edit/management.cattle.io.user.vue +11 -5
  313. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +33 -17
  314. package/edit/monitoring.coreos.com.alertmanagerconfig/tls.vue +1 -1
  315. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +6 -6
  316. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +5 -5
  317. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +3 -3
  318. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +3 -3
  319. package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +4 -4
  320. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +14 -6
  321. package/edit/monitoring.coreos.com.receiver/auth.vue +2 -2
  322. package/edit/monitoring.coreos.com.receiver/index.vue +1 -1
  323. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  324. package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +1 -1
  325. package/edit/monitoring.coreos.com.receiver/types/pagerduty.vue +1 -1
  326. package/edit/monitoring.coreos.com.receiver/types/webhook.vue +1 -1
  327. package/edit/monitoring.coreos.com.route.vue +1 -1
  328. package/edit/namespace.vue +18 -4
  329. package/edit/networking.istio.io.destinationrule/LoadBalancer.vue +1 -1
  330. package/edit/networking.k8s.io.ingress/Certificate.vue +1 -0
  331. package/edit/networking.k8s.io.ingress/Certificates.vue +3 -3
  332. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +2 -2
  333. package/edit/networking.k8s.io.ingress/IngressClass.vue +9 -7
  334. package/edit/networking.k8s.io.ingress/Rule.vue +1 -1
  335. package/edit/networking.k8s.io.ingress/RulePath.vue +17 -11
  336. package/edit/networking.k8s.io.ingress/Rules.vue +7 -7
  337. package/edit/networking.k8s.io.ingress/index.vue +8 -6
  338. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -1
  339. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +3 -3
  340. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +1 -1
  341. package/edit/networking.k8s.io.networkpolicy/index.vue +5 -5
  342. package/edit/persistentvolume/index.vue +30 -27
  343. package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +1 -1
  344. package/edit/persistentvolume/plugins/azureDisk.vue +1 -1
  345. package/edit/persistentvolume/plugins/azureFile.vue +1 -1
  346. package/edit/persistentvolume/plugins/cephfs.vue +31 -31
  347. package/edit/persistentvolume/plugins/cinder.vue +1 -1
  348. package/edit/persistentvolume/plugins/csi.vue +104 -64
  349. package/edit/persistentvolume/plugins/fc.vue +21 -21
  350. package/edit/persistentvolume/plugins/flexVolume.vue +2 -2
  351. package/edit/persistentvolume/plugins/flocker.vue +1 -1
  352. package/edit/persistentvolume/plugins/gcePersistentDisk.vue +1 -1
  353. package/edit/persistentvolume/plugins/glusterfs.vue +1 -1
  354. package/edit/persistentvolume/plugins/hostPath.vue +1 -1
  355. package/edit/persistentvolume/plugins/iscsi.vue +47 -47
  356. package/edit/persistentvolume/plugins/local.vue +1 -1
  357. package/edit/persistentvolume/plugins/longhorn.vue +2 -2
  358. package/edit/persistentvolume/plugins/nfs.vue +1 -1
  359. package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -1
  360. package/edit/persistentvolume/plugins/portworxVolume.vue +1 -1
  361. package/edit/persistentvolume/plugins/quobyte.vue +1 -1
  362. package/edit/persistentvolume/plugins/rbd.vue +41 -41
  363. package/edit/persistentvolume/plugins/scaleIO.vue +1 -1
  364. package/edit/persistentvolume/plugins/storageos.vue +1 -1
  365. package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -1
  366. package/edit/persistentvolumeclaim.vue +78 -75
  367. package/edit/provisioning.cattle.io.cluster/DrainOptions.vue +1 -1
  368. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +12 -8
  369. package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +10 -1
  370. package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +87 -27
  371. package/edit/provisioning.cattle.io.cluster/S3Config.vue +1 -1
  372. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +3 -6
  373. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.tests.ts +1 -1
  374. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +93 -0
  375. package/edit/provisioning.cattle.io.cluster/import.vue +3 -3
  376. package/edit/provisioning.cattle.io.cluster/index.vue +31 -8
  377. package/edit/provisioning.cattle.io.cluster/rke2.vue +458 -164
  378. package/edit/resources.cattle.io.backup.vue +2 -2
  379. package/edit/secret/generic.vue +1 -0
  380. package/edit/secret/index.vue +3 -7
  381. package/edit/service.vue +3 -1
  382. package/edit/storage.k8s.io.storageclass/index.vue +101 -17
  383. package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +114 -0
  384. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/no-provisioner.vue +1 -1
  385. package/edit/token.vue +1 -1
  386. package/edit/ui.cattle.io.navlink.vue +8 -8
  387. package/edit/workload/Job.vue +3 -3
  388. package/edit/workload/Upgrading.vue +1 -1
  389. package/edit/workload/VolumeClaimTemplate.vue +1 -1
  390. package/edit/workload/__tests__/index.test.ts +98 -0
  391. package/edit/workload/index.vue +61 -11
  392. package/edit/workload/mixins/workload.js +128 -91
  393. package/edit/workload/storage/ContainerMountPaths.vue +1 -11
  394. package/edit/workload/storage/Mount.vue +1 -1
  395. package/edit/workload/storage/azureDisk.vue +1 -1
  396. package/edit/workload/storage/azureFile.vue +1 -1
  397. package/edit/workload/storage/csi/index.vue +1 -1
  398. package/edit/workload/storage/emptyDir.vue +88 -0
  399. package/edit/workload/storage/ephemeralVolume/index.vue +2 -2
  400. package/edit/workload/storage/gcePersistentDisk.vue +1 -1
  401. package/edit/workload/storage/hostPath.vue +1 -1
  402. package/edit/workload/storage/index.vue +8 -0
  403. package/edit/workload/storage/nfs.vue +1 -1
  404. package/edit/workload/storage/persistentVolumeClaim/index.vue +2 -2
  405. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -1
  406. package/edit/workload/storage/secret.vue +1 -1
  407. package/edit/workload/storage/vsphereVolume.vue +1 -1
  408. package/layouts/default.vue +132 -58
  409. package/list/__tests__/workload.test.ts +53 -0
  410. package/list/catalog.cattle.io.app.vue +1 -0
  411. package/list/cis.cattle.io.clusterscan.vue +1 -0
  412. package/list/fleet.cattle.io.bundle.vue +5 -6
  413. package/list/fleet.cattle.io.cluster.vue +6 -3
  414. package/list/fleet.cattle.io.clusterregistrationtoken.vue +5 -6
  415. package/list/fleet.cattle.io.gitrepo.vue +5 -10
  416. package/list/group.principal.vue +8 -8
  417. package/list/helm.cattle.io.projecthelmchart.vue +2 -6
  418. package/list/logging.banzaicloud.io.clusterflow.vue +4 -1
  419. package/list/logging.banzaicloud.io.flow.vue +6 -5
  420. package/list/management.cattle.io.cluster.vue +1 -0
  421. package/list/management.cattle.io.feature.vue +4 -5
  422. package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +47 -0
  423. package/list/management.cattle.io.setting.vue +2 -2
  424. package/list/management.cattle.io.user.vue +4 -10
  425. package/list/monitoring.coreos.com.alertmanagerconfig.vue +2 -7
  426. package/list/node.vue +9 -6
  427. package/list/persistentvolume.vue +3 -3
  428. package/list/persistentvolumeclaim.vue +3 -4
  429. package/list/provisioning.cattle.io.cluster.vue +21 -22
  430. package/list/service.vue +6 -14
  431. package/list/workload.vue +43 -38
  432. package/machine-config/amazonec2.vue +1 -1
  433. package/machine-config/azure.vue +429 -60
  434. package/machine-config/pnap.vue +288 -0
  435. package/mixins/__tests__/create-edit-view.test.ts +1 -1
  436. package/mixins/auth-config.js +1 -3
  437. package/mixins/browser-tab-visibility.js +8 -14
  438. package/mixins/chart.js +15 -15
  439. package/mixins/create-edit-view/impl.js +4 -0
  440. package/mixins/create-edit-view/index.js +9 -7
  441. package/mixins/form-validation.js +1 -1
  442. package/mixins/labeled-form-element.ts +6 -6
  443. package/mixins/resource-fetch-namespaced.js +98 -0
  444. package/mixins/resource-fetch.js +82 -48
  445. package/mixins/resource-manager.js +2 -24
  446. package/models/apps.controllerrevision.js +7 -0
  447. package/models/apps.daemonset.js +18 -0
  448. package/models/apps.deployment.js +44 -0
  449. package/models/apps.replicaset.js +7 -0
  450. package/models/apps.statefulset.js +18 -0
  451. package/models/autoscaling.horizontalpodautoscaler.js +5 -5
  452. package/models/batch.cronjob.js +15 -15
  453. package/models/batch.job.js +15 -0
  454. package/models/catalog.cattle.io.app.js +6 -6
  455. package/models/catalog.cattle.io.clusterrepo.js +7 -7
  456. package/models/catalog.cattle.io.operation.js +5 -5
  457. package/models/chart.js +4 -4
  458. package/models/cis.cattle.io.clusterscan.js +10 -10
  459. package/models/cluster/node.js +46 -38
  460. package/models/cluster.x-k8s.io.machine.js +39 -17
  461. package/models/cluster.x-k8s.io.machinedeployment.js +12 -2
  462. package/models/constraints.gatekeeper.sh.constraint.js +1 -1
  463. package/models/etcdbackup.js +4 -4
  464. package/models/event.js +7 -0
  465. package/models/fleet.cattle.io.cluster.js +15 -15
  466. package/models/fleet.cattle.io.clustergroup.js +1 -1
  467. package/models/fleet.cattle.io.gitrepo.js +15 -15
  468. package/models/group.principal.js +1 -1
  469. package/models/logging.banzaicloud.io.clusterflow.js +2 -2
  470. package/models/logging.banzaicloud.io.flow.js +6 -2
  471. package/models/logging.banzaicloud.io.output.js +15 -3
  472. package/models/management.cattle.io.authconfig.js +4 -4
  473. package/models/management.cattle.io.cluster.js +10 -10
  474. package/models/management.cattle.io.clusterroletemplatebinding.js +9 -9
  475. package/models/management.cattle.io.globalrole.js +26 -5
  476. package/models/management.cattle.io.node.js +46 -11
  477. package/models/management.cattle.io.nodepool.js +3 -3
  478. package/models/management.cattle.io.nodetemplate.js +21 -21
  479. package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.ts +4 -0
  480. package/models/management.cattle.io.project.js +32 -13
  481. package/models/management.cattle.io.projectroletemplatebinding.js +6 -6
  482. package/models/management.cattle.io.roletemplate.js +54 -31
  483. package/models/management.cattle.io.setting.js +1 -1
  484. package/models/management.cattle.io.user.js +41 -5
  485. package/models/monitoring.coreos.com.alertmanagerconfig.js +4 -4
  486. package/models/monitoring.coreos.com.receiver.js +7 -7
  487. package/models/monitoring.coreos.com.route.js +2 -2
  488. package/models/namespace.js +55 -5
  489. package/models/persistentvolume.js +14 -2
  490. package/models/persistentvolumeclaim.js +4 -4
  491. package/models/pod.js +25 -10
  492. package/models/projectroletemplatebinding.js +7 -0
  493. package/models/provisioning.cattle.io.cluster.js +89 -38
  494. package/models/rbac.authorization.k8s.io.role.js +4 -4
  495. package/models/rke-machine.cattle.io.pnapmachinetemplate.js +15 -0
  496. package/models/rke.cattle.io.etcdsnapshot.js +4 -4
  497. package/models/service.js +29 -28
  498. package/models/storage.k8s.io.storageclass.js +41 -26
  499. package/models/workload.js +66 -35
  500. package/nuxt.config.js +59 -34
  501. package/package.json +7 -7
  502. package/pages/about.vue +15 -3
  503. package/pages/account/index.vue +1 -1
  504. package/pages/auth/login.vue +37 -7
  505. package/pages/auth/setup.vue +11 -11
  506. package/pages/c/_cluster/_product/_resource/_id.vue +2 -2
  507. package/pages/c/_cluster/apps/charts/chart.vue +4 -4
  508. package/pages/c/_cluster/apps/charts/index.vue +21 -20
  509. package/pages/c/_cluster/apps/charts/install.vue +73 -36
  510. package/pages/c/_cluster/auth/config/_id.vue +8 -2
  511. package/pages/c/_cluster/auth/config/index.vue +8 -6
  512. package/pages/c/_cluster/auth/group.principal/assign-edit.vue +1 -1
  513. package/pages/c/_cluster/auth/roles/_resource/_id.vue +2 -2
  514. package/pages/c/_cluster/auth/roles/index.vue +5 -7
  515. package/pages/c/_cluster/explorer/EventsTable.vue +8 -8
  516. package/pages/c/_cluster/explorer/index.vue +26 -20
  517. package/pages/c/_cluster/explorer/tools/index.vue +4 -4
  518. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +2 -2
  519. package/pages/c/_cluster/fleet/index.vue +10 -10
  520. package/pages/c/_cluster/gatekeeper/index.vue +1 -1
  521. package/pages/c/_cluster/legacy/index.vue +1 -1
  522. package/pages/c/_cluster/longhorn/index.vue +2 -2
  523. package/pages/c/_cluster/mcapps/index.vue +1 -1
  524. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +15 -4
  525. package/pages/c/_cluster/monitoring/index.vue +1 -1
  526. package/pages/c/_cluster/navlinks/_group.vue +1 -1
  527. package/pages/c/_cluster/neuvector/index.vue +2 -2
  528. package/pages/c/_cluster/settings/banners.vue +30 -30
  529. package/pages/c/_cluster/settings/brand.vue +9 -9
  530. package/pages/c/_cluster/settings/links.vue +6 -6
  531. package/pages/c/_cluster/settings/performance.vue +48 -2
  532. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +1 -1
  533. package/pages/c/_cluster/uiplugins/InstallDialog.vue +1 -1
  534. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +59 -9
  535. package/pages/c/_cluster/uiplugins/index.vue +30 -4
  536. package/pages/diagnostic.vue +5 -4
  537. package/pages/home.vue +105 -30
  538. package/pages/prefs.vue +23 -12
  539. package/pages/rio/mesh.vue +5 -5
  540. package/pages/support/index.vue +7 -7
  541. package/pkg/dynamic-importer.lib.js +8 -0
  542. package/pkg/vue.config.js +14 -1
  543. package/plugins/dashboard-store/__tests__/mutations.spec.js +406 -0
  544. package/plugins/dashboard-store/actions.js +32 -25
  545. package/plugins/dashboard-store/getters.js +50 -33
  546. package/plugins/dashboard-store/mutations.js +134 -28
  547. package/plugins/dashboard-store/normalize.js +1 -1
  548. package/plugins/dashboard-store/resource-class.js +121 -141
  549. package/plugins/steve/actions.js +30 -0
  550. package/plugins/steve/caches/resourceCache.js +60 -0
  551. package/plugins/steve/getters.js +44 -1
  552. package/plugins/steve/mutations.js +97 -36
  553. package/plugins/steve/resourceWatcher.js +277 -0
  554. package/plugins/steve/schema.utils.js +25 -0
  555. package/plugins/steve/subscribe.js +292 -119
  556. package/plugins/steve/worker/index.js +17 -0
  557. package/plugins/steve/worker/web-worker.advanced.js +302 -0
  558. package/plugins/steve/{web-worker.steve-sub-worker.js → worker/web-worker.basic.js} +6 -47
  559. package/promptRemove/management.cattle.io.project.vue +1 -1
  560. package/promptRemove/mixin/roleDeletionCheck.js +7 -7
  561. package/promptRemove/pod.vue +2 -2
  562. package/rancher-components/components/BadgeState/BadgeState.spec.ts +12 -0
  563. package/rancher-components/components/BadgeState/BadgeState.vue +111 -0
  564. package/rancher-components/components/BadgeState/index.ts +1 -0
  565. package/rancher-components/components/Banner/Banner.test.ts +57 -0
  566. package/rancher-components/components/Banner/Banner.vue +242 -0
  567. package/rancher-components/components/Banner/index.ts +1 -0
  568. package/rancher-components/components/Card/Card.test.ts +37 -0
  569. package/rancher-components/components/Card/Card.vue +166 -0
  570. package/rancher-components/components/Card/index.ts +1 -0
  571. package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +68 -0
  572. package/rancher-components/components/Form/Checkbox/Checkbox.vue +418 -0
  573. package/rancher-components/components/Form/Checkbox/index.ts +1 -0
  574. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +23 -0
  575. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +355 -0
  576. package/rancher-components/components/Form/LabeledInput/index.ts +1 -0
  577. package/rancher-components/components/Form/Radio/RadioButton.vue +276 -0
  578. package/rancher-components/components/Form/Radio/RadioGroup.vue +253 -0
  579. package/rancher-components/components/Form/Radio/index.ts +2 -0
  580. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +169 -0
  581. package/rancher-components/components/Form/TextArea/index.ts +1 -0
  582. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +94 -0
  583. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +149 -0
  584. package/rancher-components/components/Form/ToggleSwitch/index.ts +1 -0
  585. package/rancher-components/components/Form/index.ts +5 -0
  586. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +151 -0
  587. package/rancher-components/components/LabeledTooltip/index.ts +1 -0
  588. package/rancher-components/components/StringList/StringList.test.ts +483 -0
  589. package/rancher-components/components/StringList/StringList.vue +611 -0
  590. package/rancher-components/components/StringList/index.ts +1 -0
  591. package/scripts/publish-shell.sh +38 -5
  592. package/scripts/record-deps.js +37 -0
  593. package/scripts/test-plugins-build.sh +19 -7
  594. package/scripts/typegen.sh +84 -0
  595. package/static/loading-indicator.html +1 -1
  596. package/store/action-menu.js +3 -3
  597. package/store/auth.js +4 -4
  598. package/store/aws.js +4 -4
  599. package/store/catalog.js +22 -22
  600. package/store/index.js +58 -7
  601. package/store/plugins.js +2 -19
  602. package/store/pnap.js +128 -0
  603. package/store/prefs.js +13 -3
  604. package/store/type-map.js +101 -44
  605. package/store/uiplugins.ts +2 -2
  606. package/store/wm.js +10 -0
  607. package/types/pod-security-admission.ts +36 -0
  608. package/types/shell/index.d.ts +3159 -0
  609. package/types/vue-shim.d +20 -0
  610. package/utils/__tests__/object.test.ts +17 -1
  611. package/utils/__tests__/pod-security-admission.test.ts +61 -0
  612. package/utils/alertmanagerconfig.js +6 -6
  613. package/utils/async.ts +36 -0
  614. package/utils/color.js +45 -0
  615. package/utils/crypto/browserHashUtils.js +18 -0
  616. package/utils/dynamic-importer.js +8 -0
  617. package/utils/gc/gc-types.ts +1 -1
  618. package/utils/install-redirect.js +1 -1
  619. package/utils/object.js +26 -2
  620. package/utils/parse-externalid.js +5 -5
  621. package/utils/pod-security-admission.ts +39 -0
  622. package/utils/socket.js +61 -24
  623. package/utils/string.js +2 -0
  624. package/utils/svg-filter.js +301 -0
  625. package/utils/time.js +55 -0
  626. package/utils/validators/cidr.js +4 -0
  627. package/utils/validators/formRules/__tests__/index.test.ts +26 -6
  628. package/utils/validators/formRules/index.ts +14 -0
  629. package/config/product/harvester-manager.js +0 -162
  630. package/creators/pkg/nuxt.config.js +0 -6
  631. package/edit/harvesterhci.io.management.cluster.vue +0 -153
  632. package/list/harvesterhci.io.management.cluster.vue +0 -241
  633. package/machine-config/harvester.vue +0 -693
  634. package/models/harvesterhci.io.management.cluster.js +0 -228
  635. package/pages/c/_cluster/harvesterManager/index.vue +0 -24
@@ -6,6 +6,8 @@ import { NAMESPACE, SCHEMA, COUNT, UI } from '@shell/config/types';
6
6
  import SteveModel from './steve-class';
7
7
  import HybridModel, { cleanHybridResources } from './hybrid-class';
8
8
  import NormanModel from './norman-class';
9
+ import { urlFor } from '@shell/plugins/dashboard-store/getters';
10
+ import { normalizeType } from '@shell/plugins/dashboard-store/normalize';
9
11
 
10
12
  export const STEVE_MODEL_TYPES = {
11
13
  NORMAN: 'norman',
@@ -67,6 +69,20 @@ export default {
67
69
  return url;
68
70
  },
69
71
 
72
+ urlFor: (state, getters) => (type, id, opt) => {
73
+ let url = urlFor(state, getters)(type, id, opt);
74
+
75
+ if (opt.namespaced) {
76
+ const parts = url.split('/');
77
+
78
+ url = `${ parts.join('/') }/${ opt.namespaced }`;
79
+
80
+ return url;
81
+ }
82
+
83
+ return url;
84
+ },
85
+
70
86
  defaultModel: state => (obj) => {
71
87
  const which = state.config.modelBaseClass || STEVE_MODEL_TYPES.BY_TYPE.STEVE;
72
88
 
@@ -106,6 +122,21 @@ export default {
106
122
  },
107
123
 
108
124
  cleanResource: () => (existing, data) => {
125
+ /**
126
+ * Resource counts are contained within a single 'count' resource with a 'counts' field that is a map of resource types
127
+ * When counts are updated through the websocket, only the resources that changed are sent so we can't load the new 'count' resource into the store as we would another resource
128
+ */
129
+ if (data?.type === COUNT && existing) {
130
+ data.counts = { ...existing.counts, ...data.counts };
131
+
132
+ return data;
133
+ }
134
+
135
+ // If the existing model has a cleanResource method, use it
136
+ if (existing?.cleanResource && typeof existing.cleanResource === 'function') {
137
+ return existing.cleanResource(data);
138
+ }
139
+
109
140
  const typeSuperClass = Object.getPrototypeOf(Object.getPrototypeOf(existing))?.constructor;
110
141
 
111
142
  return typeSuperClass === HybridModel ? cleanHybridResources(data) : data;
@@ -120,6 +151,18 @@ export default {
120
151
 
121
152
  gcIgnoreTypes: () => {
122
153
  return GC_IGNORE_TYPES;
123
- }
154
+ },
155
+
156
+ currentGeneration: state => (type) => {
157
+ type = normalizeType(type);
158
+
159
+ const cache = state.types[type];
160
+
161
+ if ( !cache ) {
162
+ return null;
163
+ }
164
+
165
+ return cache.generation;
166
+ },
124
167
 
125
168
  };
@@ -1,15 +1,18 @@
1
- import { addObject, removeObject } from '@shell/utils/array';
1
+ import { addObject } from '@shell/utils/array';
2
2
  import { NAMESPACE, POD, SCHEMA } from '@shell/config/types';
3
3
  import {
4
4
  forgetType,
5
5
  resetStore,
6
6
  loadAll,
7
7
  load,
8
- remove
8
+ remove,
9
+ batchChanges,
10
+ replace
9
11
  } from '@shell/plugins/dashboard-store/mutations';
10
- import { keyForSubscribe } from '@shell/plugins/steve/subscribe';
12
+ import { keyForSubscribe } from '@shell/plugins/steve/resourceWatcher';
11
13
  import { perfLoadAll } from '@shell/plugins/steve/performanceTesting';
12
14
  import Vue from 'vue';
15
+ import { classify } from '@shell/plugins/dashboard-store/classify';
13
16
 
14
17
  function registerNamespace(state, namespace) {
15
18
  let cache = state.podsByNamespace[namespace];
@@ -26,12 +29,99 @@ function registerNamespace(state, namespace) {
26
29
  return cache;
27
30
  }
28
31
 
32
+ /**
33
+ * update the podsByNamespace cache with new or changed pods
34
+ */
35
+ function updatePodsByNamespaceCache(state, ctx, pods, loadAll) {
36
+ if (loadAll) {
37
+ // Clear the entire cache - this is a fresh load
38
+ Object.keys(state.podsByNamespace).forEach((ns) => {
39
+ delete state.podsByNamespace[ns];
40
+ });
41
+ }
42
+
43
+ // Go through all of the pods and populate cache by namespace
44
+ pods.forEach((entry) => {
45
+ const classyResource = state.types[POD].map.get(entry.id) || classify(ctx, entry);
46
+
47
+ const cache = registerNamespace(state, classyResource.namespace); // Raw entry.namespace doesn't exist, so use classy
48
+ const existing = cache.map.get(entry.id);
49
+
50
+ if (existing) {
51
+ // CANNOT BE THE SAME REFERENCE
52
+ replace(existing, entry);
53
+ } else {
54
+ addObject(cache.list, classyResource);
55
+ cache.map.set(entry.id, classyResource);
56
+ }
57
+ });
58
+ }
59
+
60
+ /**
61
+ * clean the podsByNamespace cache of removed pods
62
+ */
63
+ function cleanPodsByNamespaceCache(state, resource) {
64
+ if (resource && resource.type === POD) {
65
+ const cache = state.podsByNamespace[resource.namespace];
66
+
67
+ // Extra defensive check that the cache exists for the namespace being removed
68
+ if (cache) {
69
+ const inList = cache.list.findIndex(p => p.id === resource.id);
70
+
71
+ if ( inList >= 0 ) {
72
+ cache.list.splice(inList, 1);
73
+ }
74
+ cache.map.delete(resource.id);
75
+ }
76
+ } else if (resource && resource.type === NAMESPACE) {
77
+ // Namespace deleted
78
+ delete state.podsByNamespace[resource.id];
79
+ }
80
+ }
81
+
29
82
  export default {
83
+ batchChanges(state, { ctx, batch }) {
84
+ batchChanges(state, { ctx, batch });
85
+
86
+ if (batch[POD]) {
87
+ const newAndChangedPods = Object.entries(batch[POD]).reduce((pods, [id, pod]) => {
88
+ if (pod.id) {
89
+ // resource.create and resource.change
90
+ pods.push(pod);// must NOT be same reference from store
91
+ } else {
92
+ // resource.remove (note - we've already lost the resource in the store, so pass through mocked one)
93
+ cleanPodsByNamespaceCache(state, {
94
+ id,
95
+ type: POD,
96
+ namespace: id.substring(0, id.indexOf('/'))
97
+ });
98
+ }
99
+
100
+ return pods;
101
+ }, []);
102
+
103
+ updatePodsByNamespaceCache(state, ctx, newAndChangedPods, false);
104
+ }
105
+
106
+ if (batch[NAMESPACE]) {
107
+ Object.entries(batch[NAMESPACE]).forEach(([id, namespace]) => {
108
+ if (!namespace.id) {
109
+ // resource.remove (note - we've already lost the resource in the store, so pass through mocked one)
110
+ cleanPodsByNamespaceCache(state, {
111
+ id,
112
+ type: NAMESPACE,
113
+ });
114
+ }
115
+ });
116
+ }
117
+ },
118
+
30
119
  loadAll(state, {
31
120
  type,
32
121
  data,
33
122
  ctx,
34
- skipHaveAll
123
+ skipHaveAll,
124
+ namespace
35
125
  }) {
36
126
  // Performance testing in dev and when env var is set
37
127
  if (process.env.dev && !!process.env.perfTest) {
@@ -39,23 +129,12 @@ export default {
39
129
  }
40
130
 
41
131
  const proxies = loadAll(state, {
42
- type, data, ctx, skipHaveAll
132
+ type, data, ctx, skipHaveAll, namespace
43
133
  });
44
134
 
45
135
  // If we loaded a set of pods, then update the podsByNamespace cache
46
136
  if (type === POD) {
47
- // Clear the entire cache - this is a fresh load
48
- Object.keys(state.podsByNamespace).forEach((ns) => {
49
- delete state.podsByNamespace[ns];
50
- });
51
-
52
- // Go through all of the pods and populate cache by namespace
53
- proxies.forEach((entry) => {
54
- const cache = registerNamespace(state, entry.namespace);
55
-
56
- addObject(cache.list, entry);
57
- cache.map.set(entry.id, entry);
58
- });
137
+ updatePodsByNamespaceCache(state, ctx, proxies, true);
59
138
  }
60
139
 
61
140
  // Notify the web worker of the initial load of schemas
@@ -83,13 +162,6 @@ export default {
83
162
  state.podsByNamespace = {};
84
163
  },
85
164
 
86
- clearFromQueue(state, type) {
87
- // Remove anything in the queue that is a resource update for the given type
88
- state.queue = state.queue.filter((item) => {
89
- return item.body?.type !== type;
90
- });
91
- },
92
-
93
165
  loadMulti(state, { data, ctx }) {
94
166
  for (const entry of data) {
95
167
  const resource = load(state, { data: entry, ctx });
@@ -106,17 +178,6 @@ export default {
106
178
  remove(state, obj) {
107
179
  remove(state, obj, this.getters);
108
180
 
109
- if (obj && obj.type === POD) {
110
- const cache = state.podsByNamespace[obj.namespace];
111
-
112
- // Extra defensive check that the cache exists for the namespace being removed
113
- if (cache) {
114
- removeObject(cache.list, obj);
115
- cache.map.delete(obj.id);
116
- }
117
- } else if (obj && obj.type === NAMESPACE) {
118
- // Namespace deleted
119
- delete state.podsByNamespace[obj.namespace];
120
- }
181
+ cleanPodsByNamespaceCache(state, obj);
121
182
  }
122
183
  };
@@ -0,0 +1,277 @@
1
+ /**
2
+ * Imports in a worker cannot include exports from the file invoking the worker or from files importing the invoking file.
3
+ */
4
+
5
+ import Socket, {
6
+ NO_WATCH,
7
+ NO_SCHEMA,
8
+ EVENT_MESSAGE,
9
+ EVENT_CONNECTED,
10
+ } from '@shell/utils/socket';
11
+ import { addParam } from '@shell/utils/url';
12
+
13
+ export const WATCH_STATUSES = {
14
+ /**
15
+ * watch has been asked for this resource but not request has not successfully been sent
16
+ */
17
+ WATCH_PENDING: 'pending',
18
+ /**
19
+ * requested but not confirmed by the socket yet
20
+ */
21
+ WATCH_REQUESTED: 'requested',
22
+ /**
23
+ * confirmed as active by the socket
24
+ */
25
+ WATCHING: 'watching',
26
+ /**
27
+ * temporarily stopped via message from the socket, a watch should immediately be triggered but the maintenance cycle will pick it up if that doesn't happen.
28
+ */
29
+ STOPPED: 'stopped',
30
+ /**
31
+ * stop has been asked for this resource, but request has not successfully been sent
32
+ */
33
+ REMOVE_PENDING: 'removed_pending',
34
+ /**
35
+ * stop request has been sent to the socket or it's been stopped by the socket itself and is now awaiting a resource.stop message
36
+ */
37
+ REMOVE_REQUESTED: 'removed_requested'
38
+ };
39
+
40
+ export const keyForSubscribe = ({
41
+ resourceType, type, namespace, id, selector
42
+ } = {}) => {
43
+ return [(resourceType || type), namespace, id, selector] // each watch param in an array
44
+ .filter(param => !!param) // filter out all the empty ones // the filter makes these keys neater
45
+ .join('/'); // join into a string so we can use it as an object key
46
+ };
47
+
48
+ export const watchKeyFromMessage = (msg) => {
49
+ const {
50
+ resourceType,
51
+ namespace,
52
+ id,
53
+ selector
54
+ } = msg;
55
+
56
+ const watchObject = {
57
+ resourceType,
58
+ id,
59
+ namespace,
60
+ selector
61
+ };
62
+
63
+ return keyForSubscribe(watchObject);
64
+ };
65
+
66
+ const {
67
+ WATCH_PENDING, WATCH_REQUESTED, WATCHING, STOPPED, REMOVE_PENDING, REQUESTED_REMOVE
68
+ } = WATCH_STATUSES;
69
+
70
+ export default class ResourceWatcher extends Socket {
71
+ watches = {};
72
+ status = '';
73
+ debugWatcher = false;
74
+ csrf;
75
+
76
+ constructor(url, autoReconnect = true, frameTimeout = null, protocol = null, maxTries = null, csrf) {
77
+ super(url, autoReconnect, frameTimeout, protocol, maxTries, true);
78
+ this.baseUrl = self.location.origin + url.replace('subscribe', '');
79
+ this.csrf = csrf;
80
+
81
+ this.addEventListener(EVENT_CONNECTED, (e) => {
82
+ this.trace(EVENT_CONNECTED, ': processing previously requested or watched resources');
83
+
84
+ Object.values(this.watches).forEach((watch) => {
85
+ const { status, error } = watch;
86
+ const watchKey = keyForSubscribe(watch);
87
+
88
+ if ([WATCH_PENDING, WATCH_REQUESTED, WATCHING].includes(status) && !error) {
89
+ this.trace(EVENT_CONNECTED, ': re-watching previously required resource', watchKey, status);
90
+ this.watches[watchKey].status = WATCH_PENDING;
91
+ this.watch(watchKey);
92
+ } else if ([REMOVE_PENDING].includes(status)) {
93
+ this.trace(EVENT_CONNECTED, ': un-watching previously watched resource', watchKey, status);
94
+ this.watches[watchKey].status = REMOVE_PENDING;
95
+ this.unwatch(watchKey);
96
+ }
97
+ });
98
+ });
99
+ }
100
+
101
+ trace(...args) {
102
+ this.debugWatcher && console.info('Resource Watcher:', ...args); // eslint-disable-line no-console
103
+ }
104
+
105
+ setDebug(on) {
106
+ this.debugWatcher = !!on;
107
+ }
108
+
109
+ watchExists(watchKey) {
110
+ return !!this.watches?.[watchKey];
111
+ }
112
+
113
+ async watch(watchKey, providedResourceVersion, providedResourceVersionTime, providedKeyParts = {}, providedSkipResourceVersion) {
114
+ const {
115
+ resourceType: providedResourceType,
116
+ id: providedId,
117
+ namespace: providedNamespace,
118
+ selector: providedSelector
119
+ } = providedKeyParts;
120
+
121
+ this.trace('watch:', 'requested', watchKey);
122
+
123
+ if ([WATCH_REQUESTED, WATCHING].includes(this.watches?.[watchKey]?.status)) {
124
+ this.trace('watch:', 'already requested or watching, aborting', watchKey);
125
+
126
+ return;
127
+ }
128
+
129
+ if (this.watches?.[watchKey]?.error) {
130
+ this.trace('watch:', 'in error, aborting', watchKey);
131
+
132
+ return;
133
+ }
134
+
135
+ const resourceType = providedResourceType || this.watches?.[watchKey]?.resourceType;
136
+ const id = providedId || this.watches?.[watchKey]?.id;
137
+ const namespace = providedNamespace || this.watches?.[watchKey]?.namespace;
138
+ const selector = providedSelector || this.watches?.[watchKey]?.selector;
139
+ let skipResourceVersion = this.watches?.[watchKey]?.skipResourceVersion || providedSkipResourceVersion;
140
+
141
+ const watchObject = {
142
+ resourceType,
143
+ id,
144
+ namespace,
145
+ selector
146
+ };
147
+
148
+ let resourceVersionTime = providedResourceVersionTime || this.watches?.[watchKey]?.resourceVersionTime;
149
+ let resourceVersion = providedResourceVersion || this.watches?.[watchKey]?.resourceVersion;
150
+
151
+ if (!skipResourceVersion && (!resourceVersion || Date.now() - resourceVersionTime > 300000)) { // 300000ms is 5minutes
152
+ this.trace('watch:', 'revision update required', watchKey);
153
+
154
+ const resourceUrl = this.baseUrl + resourceType;
155
+ const limitedResourceUrl = addParam(resourceUrl, 'limit', 1);
156
+ const opt = {
157
+ method: 'get',
158
+ headers: { accept: 'application/json' },
159
+ };
160
+
161
+ if (this.csrf) {
162
+ opt.headers['x-api-csrf'] = this.csrf;
163
+ }
164
+
165
+ await fetch(limitedResourceUrl, opt)
166
+ .then((res) => {
167
+ this.watches[watchKey] = { ...watchObject };
168
+ if (!res.ok) {
169
+ this.watches[watchKey].error = res.json();
170
+ console.warn(`Resource error retrieving resourceVersion`, resourceType, ':', res.json()); // eslint-disable-line no-console
171
+ } else {
172
+ this.watches[watchKey].error = undefined;
173
+ }
174
+
175
+ return res.json();
176
+ })
177
+ .then((res) => {
178
+ if (res.revision) {
179
+ resourceVersionTime = Date.now();
180
+ resourceVersion = res.revision;
181
+ } else if (!this.watches[watchKey].error) {
182
+ // if there wasn't a revision in the response and there wasn't an error we wrote to the watch then the resource doesn't get a revision and we can skip it on subsequent rewatches
183
+ skipResourceVersion = true;
184
+ }
185
+ });
186
+ // When this fails we should re-fetch all resources (aka same as resyncWatch, or we actually call it). #7917
187
+ // This would match the old approach
188
+ }
189
+
190
+ const success = this.send(JSON.stringify({
191
+ ...watchObject,
192
+ resourceVersion: !skipResourceVersion ? resourceVersion : undefined
193
+ }));
194
+
195
+ this.watches[watchKey] = {
196
+ ...watchObject,
197
+ status: success ? WATCH_STATUSES.WATCH_REQUESTED : WATCH_STATUSES.WATCH_PENDING,
198
+ resourceVersion,
199
+ resourceVersionTime,
200
+ skipResourceVersion
201
+ };
202
+ }
203
+
204
+ unwatch(watchKey) {
205
+ const watch = this.watches?.[watchKey] || {};
206
+ const {
207
+ resourceType, id, namespace, selector
208
+ } = watch;
209
+ const watchObject = {
210
+ resourceType,
211
+ id,
212
+ namespace,
213
+ selector
214
+ };
215
+
216
+ if (resourceType && this.watches[watchKey].status !== REQUESTED_REMOVE) {
217
+ const success = this.send(JSON.stringify({
218
+ ...watchObject,
219
+ stop: true
220
+ }));
221
+
222
+ this.watches[watchKey].status = success ? REQUESTED_REMOVE : REMOVE_PENDING;
223
+ }
224
+ }
225
+
226
+ /**
227
+ * Handles message from Backend to UI
228
+ */
229
+ _onmessage(event) {
230
+ const {
231
+ name: eventName, resourceType, data: { type }, id, namespace, selector, data
232
+ } = JSON.parse(event.data);
233
+ const watchKey = keyForSubscribe({
234
+ resourceType,
235
+ type,
236
+ id,
237
+ namespace,
238
+ selector
239
+ });
240
+
241
+ if (eventName === 'resource.start' && this.watches?.[watchKey]?.status === WATCH_REQUESTED) {
242
+ this.watches[watchKey].status = WATCHING;
243
+ } else if (eventName === 'resource.stop' && this.watches?.[watchKey]) {
244
+ if (this.watches?.[watchKey]?.status === REQUESTED_REMOVE) {
245
+ delete this.watches[watchKey];
246
+ } else {
247
+ this.watches[watchKey].status = STOPPED;
248
+ delete this.watches[watchKey].resourceVersion;
249
+ delete this.watches[watchKey].resourceVersionTime;
250
+ this.watch(watchKey);
251
+ this.dispatchEvent(new CustomEvent(EVENT_MESSAGE, { detail: event }));
252
+ }
253
+ } else if (eventName === 'resource.error') {
254
+ const err = data?.error?.toLowerCase();
255
+
256
+ if ( this.watches[watchKey] && err.includes('watch not allowed') ) {
257
+ this.watches[watchKey].error = { type: resourceType, reason: NO_WATCH };
258
+ } else if ( this.watches[watchKey] && err.includes('failed to find schema') ) {
259
+ // This can happen when the cattle-cluster-agent goes down (redeploy deployment, kill pod, etc)
260
+ // The previous method was just to track the error and block any further attempts to watch (canWatch)
261
+ // This method means we can retry on the next findX (should be safe, unless there are other use cases...)
262
+
263
+ this.watches[watchKey].error = { type: resourceType, reason: NO_SCHEMA };
264
+ } else if ( err.includes('too old') ) {
265
+ // We don't actually know the gap between the requested revision and the oldest available revision.
266
+ // For this case we should re-fetch all resources (aka same as resyncWatch, or we actually call it). #7917
267
+ // This would match the old approach
268
+ delete this.watches[watchKey].resourceVersion;
269
+ delete this.watches[watchKey].resourceVersionTime;
270
+ delete this.watches[watchKey].skipResourceVersion;
271
+ this.watch(watchKey);
272
+ }
273
+ }
274
+
275
+ super._onmessage(event);
276
+ }
277
+ }
@@ -0,0 +1,25 @@
1
+ import { normalizeType } from '@shell/plugins/dashboard-store/normalize';
2
+
3
+ /**
4
+ * Inject special fields for indexing schemas
5
+ *
6
+ * Note
7
+ * This mutates input in a function, which is bad...
8
+ * but ensures the reference isn't broken, which is needed to maintain similar functionality as before
9
+ */
10
+ export function addSchemaIndexFields(schema) {
11
+ schema._id = normalizeType(schema.id);
12
+ schema._group = normalizeType(schema.attributes?.group);
13
+ }
14
+
15
+ /**
16
+ * Remove special fields for indexing schemas
17
+ *
18
+ * Note
19
+ * This mutates input in a function, which is bad...
20
+ * but ensures the reference isn't broken, which is needed to maintain similar functionality as before
21
+ */
22
+ export function removeSchemaIndexFields(schema) {
23
+ delete schema._id;
24
+ delete schema._group;
25
+ }