@rancher/shell 0.1.0 → 0.1.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 (595) hide show
  1. package/assets/styles/base/_basic.scss +0 -1
  2. package/assets/styles/base/_variables.scss +2 -0
  3. package/assets/styles/global/_labeled-input.scss +6 -1
  4. package/assets/styles/global/_select.scss +9 -0
  5. package/assets/styles/vendor/vue-js-modal.scss +4 -0
  6. package/assets/translations/en-us.yaml +240 -16
  7. package/assets/translations/zh-hans.yaml +335 -111
  8. package/chart/example.vue +1 -1
  9. package/chart/istio.vue +2 -2
  10. package/chart/logging/index.vue +2 -2
  11. package/chart/monitoring/alerting/index.vue +2 -2
  12. package/chart/monitoring/grafana/index.vue +2 -2
  13. package/chart/monitoring/index.vue +2 -2
  14. package/chart/monitoring/prometheus/index.vue +4 -4
  15. package/chart/rancher-alerting-drivers.vue +17 -3
  16. package/chart/rancher-backup/S3.vue +37 -4
  17. package/chart/rancher-backup/index.vue +3 -3
  18. package/cloud-credential/aws.vue +1 -1
  19. package/cloud-credential/azure.vue +1 -1
  20. package/cloud-credential/digitalocean.vue +1 -1
  21. package/cloud-credential/gcp.vue +1 -1
  22. package/cloud-credential/generic.vue +1 -1
  23. package/cloud-credential/harvester.vue +2 -2
  24. package/cloud-credential/linode.vue +1 -1
  25. package/cloud-credential/s3.vue +2 -2
  26. package/cloud-credential/vmwarevsphere.vue +1 -1
  27. package/components/ActionMenu.vue +11 -1
  28. package/components/Alert.vue +1 -1
  29. package/components/AssignTo.vue +2 -2
  30. package/components/AsyncButton.vue +25 -12
  31. package/components/AwsComplianceBanner.vue +44 -0
  32. package/components/BannerGraphic.vue +11 -2
  33. package/components/ChartReadme.vue +10 -2
  34. package/components/CompoundStatusBadge.vue +50 -0
  35. package/components/CopyToClipboardText.vue +25 -4
  36. package/components/CruResource.vue +185 -16
  37. package/components/CruResourceFooter.vue +17 -1
  38. package/components/EtcdInfoBanner.vue +1 -1
  39. package/components/FilterLabel.vue +254 -0
  40. package/components/GlobalRoleBindings.vue +2 -2
  41. package/components/GrafanaDashboard.vue +1 -1
  42. package/components/GrowlManager.vue +20 -9
  43. package/components/HarvesterServiceAddOnConfig.vue +2 -2
  44. package/components/Import.vue +2 -2
  45. package/components/LandingPagePreference.vue +2 -2
  46. package/components/Markdown.vue +44 -12
  47. package/components/ModalWithCard.vue +2 -2
  48. package/components/MoveModal.vue +1 -1
  49. package/components/PercentageBar.vue +1 -1
  50. package/components/PromptChangePassword.vue +1 -1
  51. package/components/PromptModal.vue +13 -2
  52. package/components/PromptRemove.vue +64 -33
  53. package/components/PromptRestore.vue +3 -3
  54. package/components/Questions/Boolean.vue +1 -1
  55. package/components/Questions/Float.vue +1 -1
  56. package/components/Questions/Int.vue +1 -1
  57. package/components/Questions/Reference.vue +1 -1
  58. package/components/Questions/String.vue +1 -1
  59. package/components/RelatedResources.vue +1 -1
  60. package/components/RelatedWorkloadsTable.vue +3 -1
  61. package/components/ResourceDetail/Masthead.vue +27 -9
  62. package/components/ResourceDetail/index.vue +72 -7
  63. package/components/ResourceList/Masthead.vue +22 -0
  64. package/components/ResourceList/ResourceLoadingIndicator.vue +137 -0
  65. package/components/ResourceList/index.vue +42 -7
  66. package/components/ResourceTable.vue +11 -2
  67. package/components/ResourceYaml.vue +7 -1
  68. package/components/SelectIconGrid.vue +14 -1
  69. package/components/SortableTable/THead.vue +1 -1
  70. package/components/SortableTable/debug.js +117 -0
  71. package/components/SortableTable/index.vue +200 -43
  72. package/components/SortableTable/paging.js +2 -12
  73. package/components/SortableTable/selection.js +3 -0
  74. package/components/SortableTable/sorting.js +3 -1
  75. package/components/Tabbed/Tab.vue +25 -4
  76. package/components/Tabbed/index.vue +133 -119
  77. package/components/TypeDescription.vue +1 -1
  78. package/components/VMConsoleBar.vue +1 -1
  79. package/components/Wizard.vue +53 -14
  80. package/components/YamlEditor.vue +10 -0
  81. package/components/__tests__/CopyCode.test.ts +1 -7
  82. package/components/__tests__/CruResource.test.ts +1 -8
  83. package/components/auth/AllowedPrincipals.vue +1 -1
  84. package/components/auth/AuthBanner.vue +2 -1
  85. package/components/auth/AzureWarning.vue +69 -0
  86. package/components/auth/RoleDetailEdit.vue +4 -4
  87. package/components/auth/login/ldap.vue +1 -1
  88. package/components/cards/ApplicationCard.vue +140 -0
  89. package/components/dialog/AddClusterMemberDialog.vue +1 -1
  90. package/components/dialog/AddCustomBadgeDialog.vue +4 -4
  91. package/components/dialog/AddProjectMemberDialog.vue +2 -2
  92. package/components/dialog/AddonConfigConfirmationDialog.vue +1 -1
  93. package/components/dialog/DrainNode.vue +3 -3
  94. package/components/dialog/ForceMachineRemoveDialog.vue +2 -2
  95. package/components/dialog/GenericPrompt.vue +2 -2
  96. package/components/dialog/RollbackWorkloadDialog.vue +2 -2
  97. package/components/dialog/RotateCertificatesDialog.vue +3 -3
  98. package/components/dialog/RotateEncryptionKeyDialog.vue +11 -6
  99. package/components/dialog/SaveAsRKETemplateDialog.vue +3 -3
  100. package/components/dialog/harvester/AddHotplugModal.vue +3 -3
  101. package/components/dialog/harvester/BackupModal.vue +3 -3
  102. package/components/dialog/harvester/CloneTemplate.vue +3 -3
  103. package/components/dialog/harvester/EjectCDROMDialog.vue +3 -3
  104. package/components/dialog/harvester/ExportImageDialog.vue +3 -3
  105. package/components/dialog/harvester/MaintenanceDialog.vue +2 -2
  106. package/components/dialog/harvester/MigrationDialog.vue +2 -2
  107. package/components/dialog/harvester/RestoreDialog.vue +2 -2
  108. package/components/dialog/harvester/SupportBundle.vue +2 -2
  109. package/components/dialog/harvester/UnplugVolume.vue +2 -2
  110. package/components/fleet/FleetBundleResources.vue +1 -1
  111. package/components/fleet/FleetBundles.vue +1 -1
  112. package/components/fleet/FleetResources.vue +5 -3
  113. package/components/fleet/ForceDirectedTreeChart/chartIcons.js +17 -0
  114. package/components/fleet/ForceDirectedTreeChart/index.vue +553 -0
  115. package/components/form/ArrayList.vue +22 -3
  116. package/components/form/BannerSettings.vue +3 -3
  117. package/components/form/ChangePassword.vue +2 -2
  118. package/components/form/Command.vue +28 -9
  119. package/components/form/Error.vue +50 -0
  120. package/components/form/Footer.vue +2 -5
  121. package/components/form/HealthCheck.vue +2 -2
  122. package/components/form/HookOption.vue +2 -2
  123. package/components/form/InputWithSelect.vue +12 -2
  124. package/components/form/KeyValue.vue +5 -2
  125. package/components/form/LabeledSelect.vue +27 -14
  126. package/components/form/Labels.vue +12 -0
  127. package/components/form/MatchExpressions.vue +44 -10
  128. package/components/form/Members/ClusterPermissionsEditor.vue +3 -3
  129. package/components/form/Members/MembershipEditor.vue +10 -1
  130. package/components/form/Members/ProjectMembershipEditor.vue +1 -0
  131. package/components/form/NameNsDescription.vue +202 -79
  132. package/components/form/Networking.vue +1 -1
  133. package/components/form/NodeAffinity.vue +41 -26
  134. package/components/form/NodeScheduling.vue +29 -3
  135. package/components/form/NotificationSettings.vue +2 -2
  136. package/components/form/Password.vue +1 -1
  137. package/components/form/PodAffinity.vue +64 -6
  138. package/components/form/PodSecurity.vue +2 -2
  139. package/components/form/Ports.vue +1 -1
  140. package/components/form/Probe.vue +60 -17
  141. package/components/form/ProjectMemberEditor.vue +3 -3
  142. package/components/form/ResourceQuota/NamespaceRow.vue +46 -2
  143. package/components/form/ResourceQuota/Project.vue +4 -0
  144. package/components/form/ResourceTabs/index.vue +19 -7
  145. package/components/form/RuleSelector.vue +1 -1
  146. package/components/form/Security.vue +56 -14
  147. package/components/form/Select.vue +52 -10
  148. package/components/form/SelectOrCreateAuthSecret.vue +70 -31
  149. package/components/form/ServiceNameSelect.vue +1 -1
  150. package/components/form/ServicePorts.vue +10 -2
  151. package/components/form/ShellInput.vue +1 -1
  152. package/components/form/SimpleSecretSelector.vue +2 -2
  153. package/components/form/Tolerations.vue +1 -1
  154. package/components/form/UnitInput.vue +12 -3
  155. package/components/form/ValueFromResource.vue +1 -1
  156. package/components/form/WorkloadPorts.vue +1 -1
  157. package/components/form/__tests__/Command.test.ts +63 -0
  158. package/components/form/__tests__/Error.test.ts +56 -0
  159. package/components/form/__tests__/MatchExpressions.test.ts +79 -0
  160. package/components/form/__tests__/Probe.test.ts +62 -0
  161. package/components/form/__tests__/Security.test.ts +55 -0
  162. package/components/form/__tests__/UnitInput.test.ts +31 -23
  163. package/components/formatter/BadgeStateFormatter.vue +1 -1
  164. package/components/formatter/Capitalize.vue +7 -0
  165. package/components/formatter/ClusterLink.vue +6 -2
  166. package/components/formatter/ClusterProvider.vue +36 -0
  167. package/components/formatter/DelayedValue.vue +43 -0
  168. package/components/formatter/Endpoints.vue +2 -2
  169. package/components/formatter/HarvesterDiskState.vue +1 -1
  170. package/components/formatter/HarvesterIpAddress.vue +37 -18
  171. package/components/formatter/HarvesterMigrationState.vue +1 -1
  172. package/components/formatter/HarvesterVmState.vue +1 -1
  173. package/components/formatter/LinkDetail.vue +11 -2
  174. package/components/formatter/LinkName.vue +2 -2
  175. package/components/formatter/LiveExpiryBadgeState.vue +1 -1
  176. package/components/formatter/LivePodRestarts.vue +47 -0
  177. package/components/formatter/MachineSummaryGraph.vue +51 -5
  178. package/components/formatter/PodsUsage.vue +5 -3
  179. package/components/formatter/Weight.vue +1 -1
  180. package/components/formatter/WorkloadHealthScale.vue +17 -6
  181. package/components/nav/HarvesterUpgrade.vue +15 -5
  182. package/components/nav/Header.vue +15 -6
  183. package/components/nav/Jump.vue +1 -1
  184. package/components/nav/NamespaceFilter.vue +30 -10
  185. package/components/nav/TopLevelMenu.vue +52 -14
  186. package/components/nav/WindowManager/ContainerLogs.vue +14 -2
  187. package/components/nav/WorkspaceSwitcher.vue +1 -1
  188. package/components/{NovncConsole.vue → novnc/NovncConsole.vue} +0 -0
  189. package/components/novnc/NovncConsoleItem.vue +89 -0
  190. package/components/novnc/NovncConsoleWrapper.vue +243 -0
  191. package/config/labels-annotations.js +6 -2
  192. package/config/product/explorer.js +7 -3
  193. package/config/product/fleet.js +4 -1
  194. package/config/product/manager.js +5 -6
  195. package/config/product/settings.js +12 -1
  196. package/config/query-params.js +2 -0
  197. package/config/roles.ts +5 -0
  198. package/config/settings.js +60 -63
  199. package/config/table-headers.js +47 -18
  200. package/config/types.js +24 -8
  201. package/content/docs/en-us/whats-new.md +25 -0
  202. package/core/plugin.ts +12 -2
  203. package/creators/app/init +7 -1
  204. package/creators/pkg/tsconfig.json +2 -3
  205. package/detail/catalog.cattle.io.app.vue +1 -1
  206. package/detail/cis.cattle.io.clusterscan.vue +1 -1
  207. package/detail/fleet.cattle.io.bundle.vue +73 -21
  208. package/detail/fleet.cattle.io.gitrepo.vue +5 -4
  209. package/detail/harvesterhci.io.host/HarvesterHostBasic.vue +25 -4
  210. package/detail/harvesterhci.io.host/HarvesterHostDisk.vue +2 -2
  211. package/detail/harvesterhci.io.virtualmachinebackup/index.vue +1 -1
  212. package/detail/helm.cattle.io.projecthelmchart.vue +1 -1
  213. package/detail/networking.k8s.io.ingress.vue +10 -2
  214. package/detail/pod.vue +37 -1
  215. package/detail/provisioning.cattle.io.cluster.vue +102 -15
  216. package/detail/workload/index.vue +163 -15
  217. package/edit/auth/azuread.vue +146 -34
  218. package/edit/auth/github.vue +3 -3
  219. package/edit/auth/googleoauth.vue +3 -3
  220. package/edit/auth/ldap/config.vue +15 -7
  221. package/edit/auth/ldap/index.vue +2 -2
  222. package/edit/auth/oidc.vue +3 -3
  223. package/edit/auth/saml.vue +3 -3
  224. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
  225. package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +1 -1
  226. package/edit/autoscaling.horizontalpodautoscaler/metric-object-reference.vue +1 -1
  227. package/edit/autoscaling.horizontalpodautoscaler/metric-target.vue +1 -1
  228. package/edit/autoscaling.horizontalpodautoscaler/metrics-row.vue +1 -1
  229. package/edit/catalog.cattle.io.clusterrepo.vue +2 -2
  230. package/edit/cis.cattle.io.clusterscan.vue +4 -4
  231. package/edit/cis.cattle.io.clusterscanbenchmark.vue +1 -1
  232. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -1
  233. package/edit/fleet.cattle.io.cluster.vue +1 -0
  234. package/edit/fleet.cattle.io.clustergroup.vue +1 -1
  235. package/edit/fleet.cattle.io.gitrepo.vue +290 -157
  236. package/edit/harvesterhci.io.host/HarvesterDisk.vue +4 -5
  237. package/edit/harvesterhci.io.host/index.vue +28 -19
  238. package/edit/harvesterhci.io.keypair.vue +1 -1
  239. package/edit/harvesterhci.io.managedchart/rancher-monitoring.vue +1 -1
  240. package/edit/harvesterhci.io.management.cluster.vue +1 -1
  241. package/edit/harvesterhci.io.networkattachmentdefinition.vue +2 -2
  242. package/edit/harvesterhci.io.setting/additional-ca.vue +1 -1
  243. package/edit/harvesterhci.io.setting/backup-target.vue +1 -1
  244. package/edit/harvesterhci.io.setting/http-proxy.vue +1 -1
  245. package/edit/harvesterhci.io.setting/index.vue +3 -3
  246. package/edit/harvesterhci.io.setting/overcommit-config.vue +4 -1
  247. package/edit/harvesterhci.io.setting/ssl-parameters.vue +1 -1
  248. package/edit/harvesterhci.io.setting/support-bundle-image.vue +1 -1
  249. package/edit/harvesterhci.io.setting/vip-pools.vue +1 -1
  250. package/edit/harvesterhci.io.setting/vm-force-reset-policy.vue +2 -2
  251. package/edit/harvesterhci.io.virtualmachinebackup.vue +2 -2
  252. package/edit/harvesterhci.io.virtualmachineimage.vue +2 -2
  253. package/edit/harvesterhci.io.virtualmachinetemplateversion.vue +26 -18
  254. package/edit/helm.cattle.io.projecthelmchart.vue +3 -3
  255. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +2 -2
  256. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/AccessCredentialsUsers.vue +1 -1
  257. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/index.vue +1 -1
  258. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/DataTemplate.vue +1 -0
  259. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/index.vue +2 -1
  260. package/edit/kubevirt.io.virtualmachine/VirtualMachineCpuMemory.vue +3 -1
  261. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/__tests__/HarvesterEditNetwork.test.ts +41 -0
  262. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue +79 -36
  263. package/edit/kubevirt.io.virtualmachine/VirtualMachineReserved.vue +54 -0
  264. package/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue +1 -1
  265. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +2 -3
  266. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditContainer.test.ts +40 -0
  267. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditExisting.test.ts +102 -0
  268. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVMImage.test.ts +117 -0
  269. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVolume.test.ts +74 -0
  270. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/container.vue +59 -13
  271. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue +72 -16
  272. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/vmImage.vue +74 -14
  273. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue +35 -9
  274. package/edit/kubevirt.io.virtualmachine/index.vue +33 -24
  275. package/edit/logging-flow/index.vue +1 -1
  276. package/edit/logging.banzaicloud.io.output/index.vue +1 -1
  277. package/edit/logging.banzaicloud.io.output/providers/awsElasticsearch.vue +1 -1
  278. package/edit/logging.banzaicloud.io.output/providers/azurestorage.vue +1 -1
  279. package/edit/logging.banzaicloud.io.output/providers/cloudwatch.vue +1 -1
  280. package/edit/logging.banzaicloud.io.output/providers/datadog.vue +2 -2
  281. package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +2 -2
  282. package/edit/logging.banzaicloud.io.output/providers/file.vue +1 -1
  283. package/edit/logging.banzaicloud.io.output/providers/forward.vue +1 -1
  284. package/edit/logging.banzaicloud.io.output/providers/gcs.vue +2 -2
  285. package/edit/logging.banzaicloud.io.output/providers/gelf.vue +2 -2
  286. package/edit/logging.banzaicloud.io.output/providers/kafka.vue +2 -2
  287. package/edit/logging.banzaicloud.io.output/providers/kinesisStream.vue +1 -1
  288. package/edit/logging.banzaicloud.io.output/providers/logdna.vue +1 -1
  289. package/edit/logging.banzaicloud.io.output/providers/logz.vue +2 -2
  290. package/edit/logging.banzaicloud.io.output/providers/loki.vue +2 -2
  291. package/edit/logging.banzaicloud.io.output/providers/newrelic.vue +1 -1
  292. package/edit/logging.banzaicloud.io.output/providers/s3.vue +2 -2
  293. package/edit/logging.banzaicloud.io.output/providers/splunkHec.vue +2 -2
  294. package/edit/logging.banzaicloud.io.output/providers/sumologic.vue +1 -1
  295. package/edit/logging.banzaicloud.io.output/providers/syslog.vue +2 -2
  296. package/edit/management.cattle.io.clusterroletemplatebinding.vue +2 -0
  297. package/edit/management.cattle.io.node.vue +71 -0
  298. package/edit/management.cattle.io.project.vue +28 -23
  299. package/edit/management.cattle.io.setting.vue +14 -3
  300. package/edit/management.cattle.io.user.vue +1 -1
  301. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +4 -4
  302. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +13 -13
  303. package/edit/monitoring.coreos.com.alertmanagerconfig/routeConfig.vue +18 -10
  304. package/edit/monitoring.coreos.com.alertmanagerconfig/tls.vue +2 -2
  305. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +12 -7
  306. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +12 -7
  307. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +20 -11
  308. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +13 -8
  309. package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +25 -7
  310. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +2 -2
  311. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +20 -7
  312. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +1 -1
  313. package/edit/monitoring.coreos.com.prometheusrule/index.vue +19 -8
  314. package/edit/monitoring.coreos.com.receiver/auth.vue +1 -1
  315. package/edit/monitoring.coreos.com.receiver/index.vue +2 -2
  316. package/edit/monitoring.coreos.com.receiver/tls.vue +2 -2
  317. package/edit/monitoring.coreos.com.receiver/types/email.vue +2 -2
  318. package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +2 -2
  319. package/edit/monitoring.coreos.com.receiver/types/pagerduty.vue +2 -2
  320. package/edit/monitoring.coreos.com.receiver/types/slack.vue +2 -2
  321. package/edit/monitoring.coreos.com.receiver/types/webhook.banner.vue +1 -1
  322. package/edit/monitoring.coreos.com.receiver/types/webhook.vue +3 -3
  323. package/edit/monitoring.coreos.com.route.vue +2 -2
  324. package/edit/namespace.vue +0 -8
  325. package/edit/network.harvesterhci.io.clusternetwork/vlan.vue +1 -1
  326. package/edit/networking.istio.io.destinationrule/LoadBalancer.vue +2 -2
  327. package/edit/networking.istio.io.destinationrule/index.vue +1 -1
  328. package/edit/networking.k8s.io.ingress/Certificate.vue +5 -1
  329. package/edit/networking.k8s.io.ingress/Certificates.vue +5 -0
  330. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +17 -2
  331. package/edit/networking.k8s.io.ingress/IngressClass.vue +63 -0
  332. package/edit/networking.k8s.io.ingress/Rule.vue +42 -6
  333. package/edit/networking.k8s.io.ingress/RulePath.vue +29 -5
  334. package/edit/networking.k8s.io.ingress/Rules.vue +11 -0
  335. package/edit/networking.k8s.io.ingress/index.vue +104 -15
  336. package/edit/networking.k8s.io.networkpolicy/PolicyRulePort.vue +1 -1
  337. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +2 -2
  338. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -2
  339. package/edit/persistentvolume/index.vue +1 -1
  340. package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +2 -2
  341. package/edit/persistentvolume/plugins/azureDisk.vue +2 -2
  342. package/edit/persistentvolume/plugins/azureFile.vue +2 -2
  343. package/edit/persistentvolume/plugins/cephfs.vue +4 -4
  344. package/edit/persistentvolume/plugins/cinder.vue +2 -2
  345. package/edit/persistentvolume/plugins/csi.vue +2 -2
  346. package/edit/persistentvolume/plugins/fc.vue +4 -4
  347. package/edit/persistentvolume/plugins/flexVolume.vue +2 -2
  348. package/edit/persistentvolume/plugins/flocker.vue +1 -1
  349. package/edit/persistentvolume/plugins/gcePersistentDisk.vue +2 -2
  350. package/edit/persistentvolume/plugins/glusterfs.vue +2 -2
  351. package/edit/persistentvolume/plugins/hostPath.vue +1 -1
  352. package/edit/persistentvolume/plugins/iscsi.vue +4 -4
  353. package/edit/persistentvolume/plugins/local.vue +1 -1
  354. package/edit/persistentvolume/plugins/longhorn.vue +2 -2
  355. package/edit/persistentvolume/plugins/nfs.vue +2 -2
  356. package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -1
  357. package/edit/persistentvolume/plugins/portworxVolume.vue +2 -2
  358. package/edit/persistentvolume/plugins/quobyte.vue +2 -2
  359. package/edit/persistentvolume/plugins/rbd.vue +4 -4
  360. package/edit/persistentvolume/plugins/scaleIO.vue +2 -2
  361. package/edit/persistentvolume/plugins/storageos.vue +2 -2
  362. package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -1
  363. package/edit/persistentvolumeclaim.vue +24 -8
  364. package/edit/provisioning.cattle.io.cluster/ACE.vue +2 -2
  365. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +8 -3
  366. package/edit/provisioning.cattle.io.cluster/DrainOptions.vue +2 -2
  367. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +15 -3
  368. package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +16 -3
  369. package/edit/provisioning.cattle.io.cluster/S3Config.vue +2 -2
  370. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +1 -1
  371. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.tests.ts +1 -7
  372. package/edit/provisioning.cattle.io.cluster/import.vue +2 -1
  373. package/edit/provisioning.cattle.io.cluster/index.vue +26 -7
  374. package/edit/provisioning.cattle.io.cluster/rke2.vue +136 -48
  375. package/edit/resources.cattle.io.backup.vue +26 -8
  376. package/edit/resources.cattle.io.restore.vue +3 -3
  377. package/edit/secret/basic.vue +1 -1
  378. package/edit/secret/index.vue +80 -2
  379. package/edit/secret/registry.vue +2 -2
  380. package/edit/secret/ssh.vue +1 -1
  381. package/edit/secret/tls.vue +1 -1
  382. package/edit/service.vue +47 -11
  383. package/edit/serviceaccount.vue +1 -1
  384. package/edit/storage.k8s.io.storageclass/index.vue +1 -1
  385. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/aws-ebs.vue +7 -3
  386. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/azure-disk.vue +1 -1
  387. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/azure-file.vue +1 -1
  388. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/cinder.vue +2 -2
  389. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/gce-pd.vue +2 -2
  390. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/glusterfs.vue +1 -1
  391. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/portworx-volume.vue +1 -1
  392. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/quobyte.vue +1 -1
  393. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/rbd.vue +1 -1
  394. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/scaleio.vue +1 -1
  395. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/storageos.vue +1 -1
  396. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/vsphere-volume.vue +1 -1
  397. package/edit/token.vue +3 -3
  398. package/edit/ui.cattle.io.navlink.vue +2 -2
  399. package/edit/workload/Job.vue +111 -23
  400. package/edit/workload/Upgrading.vue +77 -22
  401. package/edit/workload/__tests__/Job.test.ts +72 -0
  402. package/edit/workload/__tests__/Upgrading.test.ts +60 -0
  403. package/edit/workload/index.vue +13 -1085
  404. package/edit/workload/mixins/workload.js +900 -0
  405. package/edit/workload/storage/Mount.vue +2 -2
  406. package/edit/workload/storage/awsElasticBlockStore.vue +1 -1
  407. package/edit/workload/storage/azureDisk.vue +2 -2
  408. package/edit/workload/storage/azureFile.vue +1 -1
  409. package/edit/workload/storage/ephemeralVolume/index.vue +2 -2
  410. package/edit/workload/storage/gcePersistentDisk.vue +1 -1
  411. package/edit/workload/storage/hostPath.vue +1 -1
  412. package/edit/workload/storage/nfs.vue +2 -2
  413. package/edit/workload/storage/persistentVolumeClaim/index.vue +2 -2
  414. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +3 -3
  415. package/edit/workload/storage/secret.vue +2 -2
  416. package/edit/workload/storage/vsphereVolume.vue +1 -1
  417. package/edit/workload/types/Deployment.vue +377 -0
  418. package/edit/workload/types/Generic.vue +295 -0
  419. package/layouts/default.vue +26 -7
  420. package/layouts/error.vue +3 -2
  421. package/layouts/home.vue +12 -2
  422. package/layouts/plain.vue +18 -2
  423. package/layouts/unauthenticated.vue +2 -1
  424. package/list/catalog.cattle.io.clusterrepo.vue +1 -1
  425. package/list/fleet.cattle.io.bundle.vue +1 -1
  426. package/list/fleet.cattle.io.cluster.vue +1 -1
  427. package/list/fleet.cattle.io.clusterregistrationtoken.vue +1 -1
  428. package/list/harvesterhci.io.dashboard/HarvesterUpgrade.vue +9 -8
  429. package/list/harvesterhci.io.dashboard/UpgradeInfo.vue +40 -0
  430. package/list/harvesterhci.io.dashboard/index.vue +14 -36
  431. package/list/harvesterhci.io.host/index.vue +24 -12
  432. package/list/harvesterhci.io.networkattachmentdefinition.vue +1 -1
  433. package/list/harvesterhci.io.setting.vue +1 -1
  434. package/list/harvesterhci.io.virtualmachinebackup.vue +1 -1
  435. package/list/harvesterhci.io.virtualmachineimage.vue +36 -3
  436. package/list/harvesterhci.io.virtualmachinetemplateversion.vue +1 -5
  437. package/list/helm.cattle.io.projecthelmchart.vue +1 -1
  438. package/list/kubevirt.io.virtualmachine.vue +4 -2
  439. package/list/management.cattle.io.feature.vue +3 -3
  440. package/list/management.cattle.io.setting.vue +2 -2
  441. package/list/monitoring.coreos.com.alertmanagerconfig.vue +1 -1
  442. package/list/namespace.vue +3 -1
  443. package/list/node.vue +10 -3
  444. package/list/persistentvolumeclaim.vue +42 -0
  445. package/list/provisioning.cattle.io.cluster.vue +22 -20
  446. package/list/workload.vue +31 -6
  447. package/machine-config/amazonec2.vue +37 -12
  448. package/machine-config/azure.vue +3 -3
  449. package/machine-config/digitalocean.vue +2 -2
  450. package/machine-config/generic.vue +1 -1
  451. package/machine-config/harvester.vue +124 -25
  452. package/machine-config/linode.vue +2 -2
  453. package/machine-config/vmwarevsphere.vue +5 -5
  454. package/middleware/authenticated.js +36 -6
  455. package/middleware/unauthenticated.js +22 -0
  456. package/mixins/brand.js +50 -3
  457. package/mixins/browser-tab-visibility.js +37 -0
  458. package/mixins/chart.js +36 -4
  459. package/mixins/{compact-input.js → compact-input.ts} +5 -3
  460. package/mixins/form-validation.js +122 -0
  461. package/mixins/harvester-vm/index.js +134 -90
  462. package/mixins/labeled-form-element.ts +193 -0
  463. package/mixins/resource-fetch.js +173 -0
  464. package/models/cluster.x-k8s.io.machine.js +6 -2
  465. package/models/etcdbackup.js +4 -0
  466. package/models/event.js +4 -0
  467. package/models/fleet.cattle.io.bundle.js +1 -1
  468. package/models/fleet.cattle.io.gitrepo.js +10 -0
  469. package/models/harvester/harvesterhci.io.virtualmachinebackup.js +5 -2
  470. package/models/harvester/harvesterhci.io.virtualmachineimage.js +11 -8
  471. package/models/harvester/harvesterhci.io.virtualmachinetemplateversion.js +11 -2
  472. package/models/harvester/kubevirt.io.virtualmachine.js +2 -2
  473. package/models/harvester/kubevirt.io.virtualmachineinstance.js +1 -1
  474. package/models/harvester/node.js +27 -32
  475. package/models/harvester/persistentvolumeclaim.js +1 -1
  476. package/models/management.cattle.io.cluster.js +17 -11
  477. package/models/management.cattle.io.clusterroletemplatebinding.js +2 -2
  478. package/models/management.cattle.io.globalrole.js +19 -0
  479. package/models/management.cattle.io.node.js +10 -11
  480. package/models/management.cattle.io.project.js +60 -26
  481. package/models/management.cattle.io.roletemplate.js +19 -0
  482. package/models/monitoring.coreos.com.alertmanagerconfig.js +3 -2
  483. package/models/monitoring.coreos.com.prometheusrule.js +9 -0
  484. package/models/namespace.js +9 -1
  485. package/models/networking.k8s.io.ingress.js +17 -5
  486. package/models/persistentvolumeclaim.js +47 -1
  487. package/models/projectroletemplatebinding.js +2 -2
  488. package/models/provisioning.cattle.io.cluster.js +92 -13
  489. package/models/rke.cattle.io.etcdsnapshot.js +4 -0
  490. package/models/service.js +11 -5
  491. package/models/storage.k8s.io.storageclass.js +14 -1
  492. package/models/workload.js +7 -2
  493. package/nuxt.config.js +27 -7
  494. package/package.json +10 -14
  495. package/pages/about.vue +15 -1
  496. package/pages/account/index.vue +1 -1
  497. package/pages/auth/login.vue +17 -5
  498. package/pages/auth/setup.vue +47 -9
  499. package/pages/c/_cluster/_product/_resource/create.vue +1 -1
  500. package/pages/c/_cluster/_product/members/index.vue +6 -1
  501. package/pages/c/_cluster/_product/projectsnamespaces.vue +113 -11
  502. package/pages/c/_cluster/apps/charts/chart.vue +1 -1
  503. package/pages/c/_cluster/apps/charts/index.vue +2 -2
  504. package/pages/c/_cluster/apps/charts/install.vue +197 -19
  505. package/pages/c/_cluster/auth/config/index.vue +1 -1
  506. package/pages/c/_cluster/explorer/EventsTable.vue +1 -15
  507. package/pages/c/_cluster/explorer/index.vue +64 -35
  508. package/pages/c/_cluster/explorer/tools/index.vue +1 -1
  509. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +249 -0
  510. package/pages/c/_cluster/fleet/index.vue +47 -65
  511. package/pages/c/_cluster/harvester/airgapupgrade/index.vue +7 -4
  512. package/pages/c/_cluster/harvester/console/_uid/vnc.vue +7 -1
  513. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +8 -14
  514. package/pages/c/_cluster/monitoring/index.vue +1 -1
  515. package/pages/c/_cluster/monitoring/route-receiver/index.vue +1 -1
  516. package/pages/c/_cluster/settings/banners.vue +2 -2
  517. package/pages/c/_cluster/settings/brand.vue +62 -7
  518. package/pages/c/_cluster/settings/performance.vue +167 -0
  519. package/pages/diagnostic.vue +468 -0
  520. package/pages/fail-whale.vue +17 -5
  521. package/pages/home.vue +36 -22
  522. package/pages/plugins.vue +1 -1
  523. package/pages/prefs.vue +20 -7
  524. package/pages/support/index.vue +51 -9
  525. package/pkg/auto-import.js +1 -1
  526. package/pkg/dynamic-importer.lib.js +8 -0
  527. package/pkg/tsconfig.json +26 -9
  528. package/pkg/vue.config.js +8 -0
  529. package/plugins/console.js +29 -0
  530. package/plugins/dashboard-store/actions.js +171 -28
  531. package/plugins/dashboard-store/getters.js +13 -1
  532. package/plugins/dashboard-store/index.js +5 -1
  533. package/plugins/dashboard-store/mutations.js +72 -22
  534. package/plugins/dashboard-store/resource-class.js +259 -184
  535. package/plugins/i18n.js +9 -3
  536. package/plugins/steve/actions.js +16 -1
  537. package/plugins/steve/getters.js +9 -1
  538. package/plugins/steve/index.js +6 -2
  539. package/plugins/steve/mutations.js +100 -5
  540. package/plugins/steve/norman-class.js +8 -0
  541. package/plugins/steve/performanceTesting.js +5 -0
  542. package/plugins/steve/subscribe.js +144 -12
  543. package/plugins/steve/web-worker.steve-sub-worker.js +129 -0
  544. package/promptRemove/kubevirt.io.virtualmachine.vue +3 -17
  545. package/promptRemove/management.cattle.io.project.vue +128 -0
  546. package/promptRemove/pod.vue +131 -0
  547. package/rancher-components/BadgeState/BadgeState.spec.ts +12 -0
  548. package/{components → rancher-components/BadgeState}/BadgeState.vue +18 -10
  549. package/rancher-components/BadgeState/index.ts +1 -0
  550. package/{components/__tests__ → rancher-components/Banner}/Banner.test.ts +1 -1
  551. package/{components → rancher-components/Banner}/Banner.vue +22 -7
  552. package/rancher-components/Banner/index.ts +1 -0
  553. package/{components → rancher-components/Card}/Card.vue +58 -12
  554. package/rancher-components/Card/index.ts +1 -0
  555. package/{components/form → rancher-components/Form/Checkbox}/Checkbox.vue +118 -25
  556. package/rancher-components/Form/Checkbox/index.ts +1 -0
  557. package/{components/form/__tests__ → rancher-components/Form/LabeledInput}/LabeledInput.test.ts +13 -2
  558. package/rancher-components/Form/LabeledInput/LabeledInput.vue +341 -0
  559. package/rancher-components/Form/LabeledInput/index.ts +1 -0
  560. package/{components/form → rancher-components/Form/Radio}/RadioButton.vue +50 -22
  561. package/{components/form → rancher-components/Form/Radio}/RadioGroup.vue +76 -28
  562. package/rancher-components/Form/Radio/index.ts +2 -0
  563. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +169 -0
  564. package/rancher-components/Form/TextArea/index.ts +1 -0
  565. package/rancher-components/Form/index.ts +4 -0
  566. package/{components/form → rancher-components/LabeledTooltip}/LabeledTooltip.vue +32 -11
  567. package/rancher-components/LabeledTooltip/index.ts +1 -0
  568. package/scripts/build-pkg.sh +4 -0
  569. package/scripts/publish-shell.sh +37 -18
  570. package/scripts/test-plugins-build.sh +115 -0
  571. package/store/catalog.js +4 -0
  572. package/store/growl.js +6 -0
  573. package/store/i18n.js +18 -9
  574. package/store/index.js +190 -107
  575. package/store/prefs.js +8 -2
  576. package/store/resource-fetch.js +44 -0
  577. package/store/type-map.js +43 -7
  578. package/store/uiplugins.ts +1 -1
  579. package/utils/favicon.js +40 -0
  580. package/utils/object.js +26 -9
  581. package/utils/promise.js +20 -0
  582. package/utils/socket.js +10 -1
  583. package/utils/string.js +16 -0
  584. package/utils/validators/formRules/__tests__/index.test.ts +928 -0
  585. package/utils/validators/formRules/index.ts +447 -0
  586. package/utils/validators/prometheusrule.js +1 -1
  587. package/utils/validators/vm.js +12 -5
  588. package/utils/width.js +39 -0
  589. package/yarn-error.log +196 -0
  590. package/components/NovncConsoleWrapper.vue +0 -150
  591. package/components/form/Container.vue +0 -143
  592. package/components/form/LabeledInput.vue +0 -245
  593. package/components/form/Scheduling.vue +0 -115
  594. package/components/form/TextAreaAutoGrow.vue +0 -127
  595. package/mixins/labeled-form-element.js +0 -137
@@ -7,21 +7,33 @@ import { ucFirst } from '@shell/utils/string';
7
7
  import { compare } from '@shell/utils/version';
8
8
  import { AS, MODE, _VIEW, _YAML } from '@shell/config/query-params';
9
9
 
10
+ /**
11
+ * Class representing Cluster resource.
12
+ * @extends SteveModal
13
+ */
10
14
  export default class ProvCluster extends SteveModel {
11
15
  get details() {
12
16
  const out = [
13
17
  {
14
- label: 'Provisioner',
18
+ label: this.t('cluster.detail.provisioner'),
15
19
  content: this.provisionerDisplay || this.t('generic.none'),
16
20
  },
17
21
  {
18
- label: 'Machine Provider',
22
+ label: this.t('cluster.detail.machineProvider'),
19
23
  content: this.machineProvider ? this.machineProviderDisplay : null,
20
24
  },
21
25
  {
22
- label: 'Kubernetes Version',
26
+ label: this.t('cluster.detail.kubernetesVersion'),
23
27
  content: this.kubernetesVersion,
24
28
  },
29
+ {
30
+ label: this.t('cluster.detail.machinePools'),
31
+ content: this.pools.length,
32
+ },
33
+ {
34
+ label: this.t('cluster.detail.machines'),
35
+ content: this.desired,
36
+ },
25
37
  ].filter(x => !!x.content);
26
38
 
27
39
  if (!this.machineProvider) {
@@ -33,13 +45,19 @@ export default class ProvCluster extends SteveModel {
33
45
  return out;
34
46
  }
35
47
 
36
- get availableActions() {
37
- // No actions for Harvester clusters
38
- if (this.isHarvester) {
39
- return [];
48
+ // using this computed because on the provisioning cluster we are
49
+ // displaying the oldest age between provisioning.cluster and management.cluster
50
+ // so that on a version upgrade of Rancher (ex: 2.5.x to 2.6.x)
51
+ // we can have the correct age of the cluster displayed on the UI side
52
+ get creationTimestamp() {
53
+ const provCreationTimestamp = Date.parse(this.metadata?.creationTimestamp);
54
+ const mgmtCreationTimestamp = Date.parse(this.mgmt?.metadata?.creationTimestamp);
55
+
56
+ if (mgmtCreationTimestamp && mgmtCreationTimestamp < provCreationTimestamp) {
57
+ return this.mgmt?.metadata?.creationTimestamp;
40
58
  }
41
59
 
42
- return this._availableActions;
60
+ return super.creationTimestamp;
43
61
  }
44
62
 
45
63
  get _availableActions() {
@@ -60,6 +78,17 @@ export default class ProvCluster extends SteveModel {
60
78
 
61
79
  const canSnapshot = ready && ((this.isRke2 && this.canUpdate) || (this.isRke1 && this.mgmt?.hasAction('backupEtcd')));
62
80
 
81
+ const clusterTemplatesSchema = this.$getters['schemaFor']('management.cattle.io.clustertemplate');
82
+ let canUpdateClusterTemplate = false;
83
+
84
+ if (clusterTemplatesSchema && (clusterTemplatesSchema.resourceMethods.includes('blocked-PUT') || clusterTemplatesSchema.resourceMethods.includes('PUT'))) {
85
+ canUpdateClusterTemplate = true;
86
+ }
87
+
88
+ const normanClusterSaveTemplateAction = !!this.normanCluster?.actions?.saveAsTemplate;
89
+
90
+ const canSaveRKETemplate = this.isRke1 && this.mgmt?.status?.driver === 'rancherKubernetesEngine' && !this.mgmt?.spec?.clusterTemplateName && this.hasLink('update') && canUpdateClusterTemplate && normanClusterSaveTemplateAction;
91
+
63
92
  const actions = [
64
93
  // Note: Actions are not supported in the Steve API, so we check
65
94
  // available actions for RKE1 clusters, but not RKE2 clusters.
@@ -75,6 +104,12 @@ export default class ProvCluster extends SteveModel {
75
104
  icon: 'icon icon-download',
76
105
  bulkable: true,
77
106
  enabled: this.mgmt?.hasAction('generateKubeconfig') && ready,
107
+ }, {
108
+ action: 'copyKubeConfig',
109
+ label: this.t('cluster.copyConfig'),
110
+ bulkable: false,
111
+ enabled: this.mgmt?.hasAction('generateKubeconfig') && ready,
112
+ icon: 'icon icon-copy',
78
113
  }, {
79
114
  action: 'snapshotAction',
80
115
  label: this.$rootGetters['i18n/t']('nav.takeSnapshot'),
@@ -96,18 +131,29 @@ export default class ProvCluster extends SteveModel {
96
131
  action: 'rotateEncryptionKey',
97
132
  label: this.$rootGetters['i18n/t']('nav.rotateEncryptionKeys'),
98
133
  icon: 'icon icon-refresh',
99
- // Disabling encryption key rotation for RKE2 for now because it was removed from v2.6.5
100
- enabled: (this.isRke1 && this.mgmt?.hasAction('rotateEncryptionKey') && ready) // || canEditRKE2cluster
134
+ enabled: canEditRKE2cluster || (this.isRke1 && this.mgmt?.hasAction('rotateEncryptionKey') && ready)
101
135
  }, {
102
136
  action: 'saveAsRKETemplate',
103
137
  label: this.$rootGetters['i18n/t']('nav.saveAsRKETemplate'),
104
138
  icon: 'icon icon-folder',
105
- enabled: this.isRke1 && this.mgmt?.status?.driver === 'rancherKubernetesEngine' && !this.mgmt?.spec?.clusterTemplateName && this.hasLink('update'),
139
+ enabled: canSaveRKETemplate,
106
140
  }, { divider: true }];
107
141
 
108
142
  return actions.concat(out);
109
143
  }
110
144
 
145
+ get normanCluster() {
146
+ const name = this.status?.clusterName;
147
+
148
+ if ( !name ) {
149
+ return null;
150
+ }
151
+
152
+ const out = this.$rootGetters['rancher/byId'](NORMAN.CLUSTER, name);
153
+
154
+ return out;
155
+ }
156
+
111
157
  goToViewYaml() {
112
158
  let location;
113
159
 
@@ -128,6 +174,10 @@ export default class ProvCluster extends SteveModel {
128
174
  this.currentRouter().push(location);
129
175
  }
130
176
 
177
+ get canDelete() {
178
+ return super.canDelete && this.stateObj.name !== 'removing';
179
+ }
180
+
131
181
  get canEditYaml() {
132
182
  if (!this.isRke2) {
133
183
  return false;
@@ -136,7 +186,17 @@ export default class ProvCluster extends SteveModel {
136
186
  return super.canEditYaml;
137
187
  }
138
188
 
189
+ get isAKS() {
190
+ return this.provisioner === 'AKS';
191
+ }
192
+
193
+ get isEKS() {
194
+ return this.provisioner === 'EKS';
195
+ }
196
+
139
197
  get isImported() {
198
+ // As of Rancher v2.6.7, this returns false for imported K3s clusters,
199
+ // in which this.provisioner is `k3s`.
140
200
  return this.provisioner === 'imported';
141
201
  }
142
202
 
@@ -152,7 +212,13 @@ export default class ProvCluster extends SteveModel {
152
212
  return false;
153
213
  }
154
214
 
215
+ get confirmRemove() {
216
+ return true;
217
+ }
218
+
155
219
  get isImportedK3s() {
220
+ // As of Rancher v2.6.7, this returns false for imported K3s clusters,
221
+ // in which this.provisioner is `k3s`.
156
222
  return this.isImported && this.mgmt?.status?.provider === 'k3s';
157
223
  }
158
224
 
@@ -188,13 +254,17 @@ export default class ProvCluster extends SteveModel {
188
254
  return out;
189
255
  }
190
256
 
257
+ get isReady() {
258
+ return !!this.mgmt?.isReady;
259
+ }
260
+
191
261
  waitForProvisioner(timeout, interval) {
192
262
  return this.waitForTestFn(() => {
193
263
  return !!this.provisioner;
194
264
  }, `set provisioner`, timeout, interval);
195
265
  }
196
266
 
197
- waitForMgmt(timeout, interval) {
267
+ waitForMgmt(timeout = 60000, interval) {
198
268
  return this.waitForTestFn(() => {
199
269
  // `this` instance isn't getting updated with `status.clusterName`
200
270
  // Workaround - Get fresh copy from the store
@@ -202,7 +272,7 @@ export default class ProvCluster extends SteveModel {
202
272
  const name = this.status?.clusterName || pCluster?.status?.clusterName;
203
273
 
204
274
  return name && !!this.$rootGetters['management/byId'](MANAGEMENT.CLUSTER, name);
205
- }, `mgmt cluster create`, timeout, interval);
275
+ }, this.$rootGetters['i18n/t']('cluster.managementTimeout'), timeout, interval);
206
276
  }
207
277
 
208
278
  get provisioner() {
@@ -406,6 +476,15 @@ export default class ProvCluster extends SteveModel {
406
476
  return this.mgmt?.generateKubeConfig();
407
477
  }
408
478
 
479
+ async copyKubeConfig() {
480
+ await this.mgmt?.copyKubeConfig();
481
+
482
+ this.$dispatch('growl/success', {
483
+ title: this.t('cluster.copiedConfig'),
484
+ timeout: 3000,
485
+ }, { root: true });
486
+ }
487
+
409
488
  downloadKubeConfig() {
410
489
  return this.mgmt?.downloadKubeConfig();
411
490
  }
@@ -66,4 +66,8 @@ export default class EtcdBackup extends NormanModel {
66
66
 
67
67
  return trans || error ? fileMessage || ucFirst(message) : '';
68
68
  }
69
+
70
+ get backupLocation() {
71
+ return this.metadata?.annotations?.['etcdsnapshot.rke.io/storage'];
72
+ }
69
73
  }
package/models/service.js CHANGED
@@ -98,11 +98,17 @@ export default class extends SteveModel {
98
98
  });
99
99
  }
100
100
 
101
- if (loadBalancerIP && this.serviceType === 'LoadBalancer') {
102
- out.push({
103
- label: this.t('servicesPage.ips.loadBalancerIp.label'),
104
- content: loadBalancerIP
105
- });
101
+ if (this.serviceType === 'LoadBalancer') {
102
+ const statusIps = this.status.loadBalancer?.ingress?.map(ingress => ingress.hostname || ingress.ip).join(', ');
103
+
104
+ const loadbalancerInfo = loadBalancerIP || statusIps || '';
105
+
106
+ if (loadbalancerInfo) {
107
+ out.push({
108
+ label: this.t('servicesPage.ips.loadBalancer.label'),
109
+ content: loadbalancerInfo
110
+ });
111
+ }
106
112
  }
107
113
 
108
114
  if (externalName) {
@@ -79,9 +79,22 @@ export default class extends SteveModel {
79
79
  }
80
80
 
81
81
  updateDefault(value) {
82
+ // Update model so that the list reflects the change straight away
82
83
  this.setAnnotation(STORAGE.DEFAULT_STORAGE_CLASS, value.toString());
83
84
  this.setAnnotation(STORAGE.BETA_DEFAULT_STORAGE_CLASS, value.toString());
84
- this.save();
85
+
86
+ // Patch the annotations rather than saving the whole object, as ssome storage classes
87
+ // won't allow the complete object to be saved again
88
+ const data = {
89
+ metadata: {
90
+ annotations: {
91
+ [STORAGE.DEFAULT_STORAGE_CLASS]: value.toString(),
92
+ [STORAGE.BETA_DEFAULT_STORAGE_CLASS]: value.toString()
93
+ }
94
+ }
95
+ };
96
+
97
+ return this.patch(data, {}, true, true);
85
98
  }
86
99
 
87
100
  setDefault() {
@@ -7,7 +7,7 @@ import { clone, get, set } from '@shell/utils/object';
7
7
  import day from 'dayjs';
8
8
  import SteveModel from '@shell/plugins/steve/steve-class';
9
9
  import { shortenedImage } from '@shell/utils/string';
10
- import { convertSelectorObj, matching } from '@shell/utils/selector';
10
+ import { convertSelectorObj, matching, matches } from '@shell/utils/selector';
11
11
  import { SEPARATOR } from '@shell/components/DetailTop';
12
12
 
13
13
  export default class Workload extends SteveModel {
@@ -272,6 +272,7 @@ export default class Workload extends SteveModel {
272
272
  required: true,
273
273
  type: 'string',
274
274
  validators: ['cronSchedule'],
275
+ translationKey: 'workload.cronSchedule'
275
276
  });
276
277
  }
277
278
 
@@ -770,7 +771,11 @@ export default class Workload extends SteveModel {
770
771
  const podRelationship = relationships.filter(relationship => relationship.toType === POD)[0];
771
772
 
772
773
  if (podRelationship) {
773
- return this.$getters['matching'](POD, podRelationship.selector).filter(pod => pod?.metadata?.namespace === this.metadata.namespace);
774
+ const pods = this.$getters['podsByNamespace'](this.metadata.namespace);
775
+
776
+ return pods.filter((obj) => {
777
+ return matches(obj, podRelationship.selector);
778
+ });
774
779
  } else {
775
780
  return [];
776
781
  }
package/nuxt.config.js CHANGED
@@ -2,10 +2,11 @@ import fs from 'fs';
2
2
  import path from 'path';
3
3
  import serveStatic from 'serve-static';
4
4
  import webpack from 'webpack';
5
+
5
6
  import { STANDARD } from './config/private-label';
7
+ import { generateDynamicTypeImport } from './pkg/auto-import';
6
8
  import { directiveSsr as t } from './plugins/i18n';
7
9
  import { trimWhitespaceSsr as trimWhitespace } from './plugins/trim-whitespace';
8
- import { generateDynamicTypeImport } from './pkg/auto-import';
9
10
 
10
11
  const createProxyMiddleware = require('http-proxy-middleware');
11
12
 
@@ -21,6 +22,8 @@ export default function(dir, _appConfig) {
21
22
  let SHELL = 'node_modules/@rancher/shell';
22
23
  let SHELL_ABS = path.join(dir, 'node_modules/@rancher/shell');
23
24
  let NUXT_SHELL = '~~node_modules/@rancher/shell';
25
+ let COMPONENTS_DIR = path.join(SHELL_ABS, 'rancher-components');
26
+ let typescript = {};
24
27
 
25
28
  // If we have a local folder named 'shell' then use that rather than the one in node_modules
26
29
  // This will be the case in the main dashboard repository.
@@ -28,6 +31,9 @@ export default function(dir, _appConfig) {
28
31
  SHELL = './shell';
29
32
  SHELL_ABS = path.join(dir, 'shell');
30
33
  NUXT_SHELL = '~~/shell';
34
+ COMPONENTS_DIR = path.join(dir, 'pkg', 'rancher-components', 'src', 'components');
35
+
36
+ typescript = { typeCheck: { eslint: { files: './shell/**/*.{ts,js,vue}' } } };
31
37
  }
32
38
 
33
39
  // ===============================================================================================
@@ -42,7 +48,8 @@ export default function(dir, _appConfig) {
42
48
  const autoLoadPackages = [];
43
49
  const watcherIgnores = [
44
50
  /.shell/,
45
- /dist-pkg/
51
+ /dist-pkg/,
52
+ /scripts\/standalone/
46
53
  ];
47
54
 
48
55
  autoLoad.forEach((pkg) => {
@@ -303,9 +310,10 @@ export default function(dir, _appConfig) {
303
310
  },
304
311
 
305
312
  alias: {
306
- '~shell': SHELL_ABS,
307
- '@shell': SHELL_ABS,
308
- '@pkg': path.join(dir, 'pkg'),
313
+ '~shell': SHELL_ABS,
314
+ '@shell': SHELL_ABS,
315
+ '@pkg': path.join(dir, 'pkg'),
316
+ '@components': COMPONENTS_DIR,
309
317
  },
310
318
 
311
319
  modulesDir: [
@@ -351,7 +359,10 @@ export default function(dir, _appConfig) {
351
359
  useShortDoctype: !dev
352
360
  },
353
361
 
354
- filenames: { chunk: ({ isDev }) => isDev ? '[name].js' : '[name].[contenthash].js' },
362
+ // Don't include `[name]` in prod file names
363
+ // This flattens out the folder structure (avoids crazy paths like `_nuxt/pages/account/create-key/pages/c/_cluster/_product/_resource/_id/pages/c/_cluster/_product/_resource`)
364
+ // and uses nuxt's workaround to address issues with filenames containing `//` (see https://github.com/nuxt/nuxt.js/issues/8274)
365
+ filenames: { chunk: ({ isDev }) => isDev ? '[name].js' : '[contenthash].js' },
355
366
  // @TODO figure out how to split chunks up better, by product
356
367
  // optimization: {
357
368
  // splitChunks: {
@@ -443,6 +454,13 @@ export default function(dir, _appConfig) {
443
454
  },
444
455
  });
445
456
 
457
+ // Ensure there is a fallback for browsers that don't support web workers
458
+ config.module.rules.unshift({
459
+ test: /web-worker.[a-z-]+.js/i,
460
+ loader: 'worker-loader',
461
+ options: { inline: 'fallback' },
462
+ });
463
+
446
464
  // Prevent warning in log with the md files in the content folder
447
465
  config.module.rules.push({
448
466
  test: /\.md$/,
@@ -553,6 +571,7 @@ export default function(dir, _appConfig) {
553
571
  path.join(NUXT_SHELL, 'plugins/trim-whitespace'),
554
572
  { src: path.join(NUXT_SHELL, 'plugins/extend-router') },
555
573
  { src: path.join(NUXT_SHELL, 'plugins/lookup'), ssr: false },
574
+ { src: path.join(NUXT_SHELL, 'plugins/console'), ssr: false },
556
575
  { src: path.join(NUXT_SHELL, 'plugins/int-number'), ssr: false },
557
576
  { src: path.join(NUXT_SHELL, 'plugins/nuxt-client-init'), ssr: false },
558
577
  path.join(NUXT_SHELL, 'plugins/replaceall'),
@@ -607,7 +626,8 @@ export default function(dir, _appConfig) {
607
626
  ]
608
627
  },
609
628
 
610
- typescript: { typeCheck: { eslint: { files: './**/*.{ts,js,vue}' } } },
629
+ // Typescript eslint
630
+ typescript,
611
631
 
612
632
  ssr: false,
613
633
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rancher/shell",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Rancher Dashboard Shell",
5
5
  "repository": "https://github.com/rancherlabs/dashboard",
6
6
  "license": "Apache-2.0",
@@ -55,13 +55,15 @@
55
55
  "@vue/cli-plugin-babel": "^4.5.15",
56
56
  "@vue/cli-plugin-typescript": "^4.5.15",
57
57
  "@vue/cli-service": "^4.5.13",
58
- "@vue/test-utils": "^1.0.0-beta.27",
58
+ "@vue/test-utils": "1.2.1",
59
+ "@vue/vue2-jest": "^27.0.0",
59
60
  "add": "^2.0.6",
60
61
  "ansi_up": "^5.0.0",
61
62
  "babel-eslint": "^10.0.1",
62
63
  "babel-plugin-module-resolver": "^4.0.0",
63
64
  "babel-preset-vue": "^2.0.2",
64
65
  "browser-env": "^3.2.6",
66
+ "comlink": "^4.3.1",
65
67
  "cookie": "^0.4.0",
66
68
  "cookie-universal-nuxt": "^2.0.17",
67
69
  "core-js": "^3.20.3",
@@ -81,17 +83,20 @@
81
83
  "eslint-config-standard": ">=12.0.0",
82
84
  "eslint-import-resolver-node": "0.3.4",
83
85
  "eslint-module-utils": "2.6.1",
84
- "eslint-plugin-ava": "^9.0.0",
85
86
  "eslint-plugin-cypress": "^2.11.3",
87
+ "eslint-plugin-jest": "^23.6.0",
86
88
  "eslint-plugin-import": "2.23.4",
87
- "eslint-plugin-node": "^11.1.0",
89
+ "eslint-plugin-n": "^15.2.0",
88
90
  "eslint-plugin-vue": "7.14.0",
89
91
  "event-target-shim": "^5.0.1",
90
92
  "express": "^4.17.1",
91
93
  "file-saver": "^2.0.2",
94
+ "frontmatter-markdown-loader": "^3.6.3",
92
95
  "identicon.js": "^2.3.3",
93
96
  "intl-messageformat": "^7.7.2",
94
97
  "is-url": "^1.2.4",
98
+ "jest": "^27.5.1",
99
+ "jest-serializer-vue": "^2.0.2",
95
100
  "jexl": "^2.2.2",
96
101
  "jquery": "^3.5.0",
97
102
  "js-cookie": "^2.2.0",
@@ -144,18 +149,9 @@
144
149
  "xterm-addon-search": "^0.7.0",
145
150
  "xterm-addon-web-links": "^0.4.0",
146
151
  "xterm-addon-webgl": "^0.9.0",
152
+ "worker-loader": "^3.0.8",
147
153
  "yarn": "^1.22.11"
148
154
  },
149
- "ava": {
150
- "files": [
151
- "test/**/*"
152
- ],
153
- "require": [
154
- "./test/_setup.js"
155
- ],
156
- "tap": true,
157
- "verbose": true
158
- },
159
155
  "nyc": {
160
156
  "extension": [
161
157
  ".js",
package/pages/about.vue CHANGED
@@ -90,7 +90,15 @@ export default {
90
90
  <Loading v-if="!settings" />
91
91
  <div v-else class="about">
92
92
  <BackLink :link="backLink" />
93
- <h1 v-t="'about.title'" />
93
+ <div class="title-block mt-20 mb-40">
94
+ <h1 v-t="'about.title'" />
95
+ <n-link
96
+ :to="{ name: 'diagnostic' }"
97
+ class="btn role-primary"
98
+ >
99
+ {{ t('about.diagnostic.title') }}
100
+ </n-link>
101
+ </div>
94
102
  <h3>{{ t('about.versions.title') }}</h3>
95
103
  <table>
96
104
  <thead>
@@ -174,6 +182,12 @@ export default {
174
182
 
175
183
  <style lang="scss" scoped>
176
184
  .about {
185
+ .title-block {
186
+ display: flex;
187
+ align-items: center;
188
+ justify-content: space-between;
189
+ }
190
+
177
191
  table {
178
192
  border-collapse: collapse;
179
193
  overflow: hidden;
@@ -8,7 +8,7 @@ import Principal from '@shell/components/auth/Principal';
8
8
  import BackRoute from '@shell/mixins/back-link';
9
9
  import { mapGetters } from 'vuex';
10
10
 
11
- import Banner from '@shell/components/Banner';
11
+ import { Banner } from '@components/Banner';
12
12
  import ResourceTable from '@shell/components/ResourceTable';
13
13
  import CopyToClipboardText from '@shell/components/CopyToClipboardText';
14
14
 
@@ -1,14 +1,14 @@
1
1
  <script>
2
2
  import { removeObject } from '@shell/utils/array';
3
3
  import { USERNAME } from '@shell/config/cookies';
4
- import LabeledInput from '@shell/components/form/LabeledInput';
4
+ import { LabeledInput } from '@components/Form/LabeledInput';
5
5
  import AsyncButton from '@shell/components/AsyncButton';
6
6
  import BrandImage from '@shell/components/BrandImage';
7
7
  import InfoBox from '@shell/components/InfoBox';
8
8
  import CopyCode from '@shell/components/CopyCode';
9
- import Banner from '@shell/components/Banner';
9
+ import { Banner } from '@components/Banner';
10
10
  import { LOCAL, LOGGED_OUT, TIMED_OUT, _FLAGGED } from '@shell/config/query-params';
11
- import Checkbox from '@shell/components/form/Checkbox';
11
+ import { Checkbox } from '@components/Form/Checkbox';
12
12
  import Password from '@shell/components/form/Password';
13
13
  import { sortBy } from '@shell/utils/sort';
14
14
  import { configType } from '@shell/models/management.cattle.io.authconfig';
@@ -291,7 +291,11 @@ export default {
291
291
  {{ t('login.loginAgain') }}
292
292
  </h4>
293
293
  </div>
294
- <div v-if="firstLogin" class="first-login-message">
294
+ <div
295
+ v-if="firstLogin"
296
+ class="first-login-message"
297
+ data-testid="first-login-message"
298
+ >
295
299
  <InfoBox color="info">
296
300
  <t k="setup.defaultPassword.intro" :raw="true" />
297
301
 
@@ -340,6 +344,7 @@ export default {
340
344
  id="username"
341
345
  ref="username"
342
346
  v-model.trim="username"
347
+ data-testid="local-login-username"
343
348
  :label="t('login.username')"
344
349
  autocomplete="username"
345
350
  />
@@ -349,6 +354,7 @@ export default {
349
354
  id="password"
350
355
  ref="password"
351
356
  v-model="password"
357
+ data-testid="local-login-password"
352
358
  :label="t('login.password')"
353
359
  autocomplete="password"
354
360
  />
@@ -358,6 +364,7 @@ export default {
358
364
  <div class="col span-12 text-center">
359
365
  <AsyncButton
360
366
  id="submit"
367
+ data-testid="login-submit"
361
368
  type="submit"
362
369
  :action-label="t('login.loginWithLocal')"
363
370
  :waiting-label="t('login.loggingIn')"
@@ -372,7 +379,12 @@ export default {
372
379
  </div>
373
380
  </form>
374
381
  <div v-if="hasLocal && !showLocal" class="mt-20 text-center">
375
- <a id="login-useLocal" role="button" @click="toggleLocal">
382
+ <a
383
+ id="login-useLocal"
384
+ data-testid="login-useLocal"
385
+ role="button"
386
+ @click="toggleLocal"
387
+ >
376
388
  {{ t('login.useLocal') }}
377
389
  </a>
378
390
  </div>