@rancher/shell 0.3.0 → 0.3.2

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 (342) 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/_gauges.scss +1 -1
  4. package/assets/styles/global/_layout.scss +5 -2
  5. package/assets/styles/global/_select.scss +1 -4
  6. package/assets/styles/themes/_dark.scss +5 -4
  7. package/assets/styles/themes/_light.scss +4 -3
  8. package/assets/styles/themes/_suse.scss +1 -1
  9. package/assets/styles/vendor/vue-select.scss +4 -3
  10. package/assets/translations/en-us.yaml +673 -73
  11. package/assets/translations/zh-hans.yaml +720 -207
  12. package/chart/monitoring/steps/uninstall-v1.vue +2 -2
  13. package/cloud-credential/azure.vue +23 -0
  14. package/cloud-credential/harvester.vue +25 -62
  15. package/cloud-credential/pnap.vue +80 -0
  16. package/components/.DS_Store +0 -0
  17. package/components/ActionMenu.vue +28 -7
  18. package/components/AdvancedSection.vue +9 -2
  19. package/components/Alert.vue +2 -2
  20. package/components/ButtonDropdown.vue +0 -2
  21. package/components/ButtonGroup.vue +1 -0
  22. package/components/CollapsibleCard.vue +0 -1
  23. package/components/CruResource.vue +41 -4
  24. package/components/DetailTop.vue +72 -4
  25. package/components/DisableAuthProviderModal.vue +106 -0
  26. package/{rancher-components/components/Utils/DraggableZone → components}/DraggableZone.vue +0 -0
  27. package/components/ExplorerMembers.vue +253 -30
  28. package/components/ExplorerProjectsNamespaces.vue +77 -33
  29. package/components/ExtensionPanel.vue +42 -0
  30. package/components/GrowlManager.vue +3 -3
  31. package/components/IconOrSvg.vue +178 -0
  32. package/components/LogItem.vue +69 -0
  33. package/components/PodSecurityAdmission.vue +302 -0
  34. package/components/PromptModal.vue +1 -0
  35. package/components/ResourceDetail/Masthead.vue +69 -4
  36. package/components/ResourceDetail/index.vue +12 -5
  37. package/components/ResourceList/Masthead.vue +11 -1
  38. package/components/ResourceList/ResourceLoadingIndicator.vue +12 -2
  39. package/components/ResourceList/index.vue +66 -12
  40. package/components/ResourceList/resource-list.config.js +7 -0
  41. package/components/ResourceTable.vue +33 -6
  42. package/components/SimpleBox.vue +1 -1
  43. package/components/SortableTable/THead.vue +21 -14
  44. package/components/SortableTable/filtering.js +1 -1
  45. package/components/SortableTable/index.vue +21 -10
  46. package/components/SortableTable/selection.js +15 -3
  47. package/components/Tabbed/Tab.vue +1 -1
  48. package/components/Tabbed/index.vue +20 -15
  49. package/components/__tests__/.DS_Store +0 -0
  50. package/components/__tests__/AsyncButton.test.ts +140 -0
  51. package/components/__tests__/BackLink.test.ts +33 -0
  52. package/components/__tests__/ButtonGroup.test.ts +124 -0
  53. package/components/__tests__/ClusterBadge.test.ts +32 -0
  54. package/components/__tests__/CollapsibleCard.test.ts +64 -0
  55. package/components/__tests__/ConsumptionGauge.test.ts +88 -0
  56. package/components/__tests__/CruResource.test.ts +3 -2
  57. package/components/__tests__/FixedBanner.test.ts +129 -0
  58. package/components/__tests__/GrowlManager.test.ts +147 -0
  59. package/components/__tests__/NamespaceFilter.test.ts +33 -25
  60. package/components/__tests__/PercentageBar.test.ts +32 -0
  61. package/components/__tests__/PodSecurityAdmission.test.ts +398 -0
  62. package/components/auth/AuthBanner.vue +20 -10
  63. package/components/auth/RoleDetailEdit.vue +26 -17
  64. package/components/auth/SelectPrincipal.vue +36 -5
  65. package/components/form/ArrayList.vue +3 -35
  66. package/components/form/ArrayListGrouped.vue +13 -4
  67. package/components/form/ArrayListSelect.vue +5 -5
  68. package/components/form/Error.vue +8 -0
  69. package/components/form/KeyValue.vue +39 -7
  70. package/components/form/LabeledSelect.vue +5 -2
  71. package/components/form/Labels.vue +46 -16
  72. package/components/form/Members/ClusterPermissionsEditor.vue +17 -17
  73. package/components/form/Members/MembershipEditor.vue +12 -12
  74. package/components/form/NameNsDescription.vue +1 -1
  75. package/components/form/NodeScheduling.vue +1 -1
  76. package/components/form/Probe.vue +3 -3
  77. package/components/form/ResourceQuota/Project.vue +6 -6
  78. package/components/form/ResourceTabs/index.vue +24 -6
  79. package/components/form/Security.vue +7 -6
  80. package/components/form/Select.vue +3 -2
  81. package/components/form/SelectOrCreateAuthSecret.vue +22 -29
  82. package/components/form/ServicePorts.vue +8 -0
  83. package/components/form/WorkloadPorts.vue +7 -1
  84. package/components/form/__tests__/ArrayList.test.ts +74 -0
  85. package/components/form/__tests__/ArrayListGrouped.test.ts +6 -4
  86. package/components/formatter/Checked.vue +1 -1
  87. package/components/formatter/ClusterLink.vue +5 -0
  88. package/components/formatter/IconIsDefault.vue +2 -2
  89. package/components/formatter/InternalExternalIP.vue +11 -8
  90. package/components/formatter/LiveDuration.vue +78 -0
  91. package/components/formatter/WorkloadHealthScale.vue +5 -3
  92. package/components/nav/Header.vue +74 -7
  93. package/components/nav/NamespaceFilter.vue +146 -63
  94. package/components/nav/TopLevelMenu.vue +22 -19
  95. package/components/nav/WindowManager/ContainerLogs.vue +83 -126
  96. package/components/nav/WindowManager/ContainerShell.vue +9 -7
  97. package/components/nav/WindowManager/Window.vue +2 -0
  98. package/components/nav/WindowManager/index.vue +10 -0
  99. package/config/elemental-types.js +9 -0
  100. package/config/features.js +2 -0
  101. package/config/home-links.js +4 -1
  102. package/config/pod-security-admission.ts +82 -0
  103. package/config/product/apps.js +1 -1
  104. package/config/product/auth.js +6 -5
  105. package/config/product/backup.js +1 -1
  106. package/config/product/explorer.js +6 -6
  107. package/config/product/fleet.js +1 -1
  108. package/config/product/manager.js +6 -2
  109. package/config/query-params.js +1 -0
  110. package/config/secret.js +0 -1
  111. package/config/settings.ts +26 -9
  112. package/config/table-headers.js +22 -11
  113. package/config/types.js +4 -1
  114. package/config/uiplugins.js +3 -3
  115. package/content/docs/zh-hans/getting-started.md +113 -137
  116. package/content/docs/zh-hans/whats-new.md +8 -46
  117. package/core/plugin-helpers.js +171 -0
  118. package/core/plugin.ts +61 -1
  119. package/core/plugins.js +33 -0
  120. package/core/types.ts +128 -2
  121. package/creators/pkg/package-lock.json +37 -0
  122. package/creators/pkg/package.json +1 -1
  123. package/detail/catalog.cattle.io.app.vue +1 -1
  124. package/detail/pod.vue +1 -1
  125. package/detail/provisioning.cattle.io.cluster.vue +35 -9
  126. package/detail/service.vue +2 -9
  127. package/detail/workload/index.vue +0 -1
  128. package/dialog/AddClusterMemberDialog.vue +22 -28
  129. package/dialog/AddProjectMemberDialog.vue +53 -9
  130. package/dialog/DiagnosticTimingsDialog.vue +8 -7
  131. package/dialog/DrainNode.vue +44 -48
  132. package/dialog/ForceMachineRemoveDialog.vue +5 -7
  133. package/dialog/GenericPrompt.vue +15 -20
  134. package/dialog/RollbackWorkloadDialog.vue +15 -46
  135. package/dialog/RotateCertificatesDialog.vue +5 -7
  136. package/dialog/RotateEncryptionKeyDialog.vue +5 -9
  137. package/dialog/SaveAsRKETemplateDialog.vue +5 -13
  138. package/dialog/ScaleMachineDownDialog.vue +1 -1
  139. package/dialog/ScalePoolDownDialog.vue +121 -0
  140. package/edit/__tests__/management.cattle.io.setting.test.ts +3 -3
  141. package/edit/auth/azuread.vue +16 -16
  142. package/edit/auth/github.vue +8 -0
  143. package/edit/auth/googleoauth.vue +10 -1
  144. package/edit/auth/ldap/index.vue +10 -0
  145. package/edit/auth/oidc.vue +10 -0
  146. package/edit/auth/saml.vue +10 -0
  147. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
  148. package/edit/catalog.cattle.io.clusterrepo.vue +3 -0
  149. package/edit/cloudcredential.vue +3 -7
  150. package/edit/logging-flow/Match.vue +39 -8
  151. package/edit/logging-flow/index.vue +27 -4
  152. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +107 -0
  153. package/edit/management.cattle.io.project.vue +8 -1
  154. package/edit/management.cattle.io.setting.vue +5 -2
  155. package/edit/management.cattle.io.user.vue +7 -1
  156. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +36 -8
  157. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +2 -2
  158. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +14 -6
  159. package/edit/namespace.vue +18 -4
  160. package/edit/networking.k8s.io.ingress/Certificate.vue +1 -0
  161. package/edit/networking.k8s.io.ingress/IngressClass.vue +8 -6
  162. package/edit/networking.k8s.io.ingress/RulePath.vue +12 -6
  163. package/edit/networking.k8s.io.ingress/index.vue +8 -6
  164. package/edit/persistentvolume/index.vue +30 -27
  165. package/edit/persistentvolume/plugins/cephfs.vue +29 -29
  166. package/edit/persistentvolume/plugins/csi.vue +102 -62
  167. package/edit/persistentvolume/plugins/fc.vue +19 -19
  168. package/edit/persistentvolume/plugins/iscsi.vue +45 -45
  169. package/edit/persistentvolume/plugins/rbd.vue +39 -39
  170. package/edit/persistentvolumeclaim.vue +78 -75
  171. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +11 -7
  172. package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +10 -1
  173. package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +87 -27
  174. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +3 -6
  175. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +96 -0
  176. package/edit/provisioning.cattle.io.cluster/import.vue +1 -1
  177. package/edit/provisioning.cattle.io.cluster/index.vue +29 -6
  178. package/edit/provisioning.cattle.io.cluster/rke2.vue +445 -154
  179. package/edit/secret/index.vue +3 -7
  180. package/edit/service.vue +3 -1
  181. package/edit/storage.k8s.io.storageclass/index.vue +100 -16
  182. package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +114 -0
  183. package/edit/workload/__tests__/index.test.ts +98 -0
  184. package/edit/workload/index.vue +58 -8
  185. package/edit/workload/mixins/workload.js +107 -70
  186. package/edit/workload/storage/ContainerMountPaths.vue +0 -10
  187. package/edit/workload/storage/emptyDir.vue +88 -0
  188. package/edit/workload/storage/ephemeralVolume/index.vue +1 -1
  189. package/edit/workload/storage/index.vue +8 -0
  190. package/edit/workload/storage/persistentVolumeClaim/index.vue +1 -1
  191. package/layouts/default.vue +57 -44
  192. package/list/__tests__/workload.test.ts +5 -2
  193. package/list/catalog.cattle.io.app.vue +1 -0
  194. package/list/cis.cattle.io.clusterscan.vue +1 -0
  195. package/list/fleet.cattle.io.bundle.vue +5 -6
  196. package/list/fleet.cattle.io.cluster.vue +6 -3
  197. package/list/fleet.cattle.io.clusterregistrationtoken.vue +5 -6
  198. package/list/fleet.cattle.io.gitrepo.vue +4 -9
  199. package/list/helm.cattle.io.projecthelmchart.vue +1 -5
  200. package/list/logging.banzaicloud.io.clusterflow.vue +4 -1
  201. package/list/logging.banzaicloud.io.flow.vue +6 -5
  202. package/list/management.cattle.io.cluster.vue +1 -0
  203. package/list/management.cattle.io.feature.vue +3 -4
  204. package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +47 -0
  205. package/list/management.cattle.io.setting.vue +2 -2
  206. package/list/management.cattle.io.user.vue +4 -10
  207. package/list/monitoring.coreos.com.alertmanagerconfig.vue +2 -7
  208. package/list/node.vue +8 -5
  209. package/list/persistentvolume.vue +3 -3
  210. package/list/persistentvolumeclaim.vue +3 -4
  211. package/list/provisioning.cattle.io.cluster.vue +18 -19
  212. package/list/service.vue +6 -14
  213. package/list/workload.vue +43 -38
  214. package/machine-config/azure.vue +429 -60
  215. package/machine-config/pnap.vue +288 -0
  216. package/mixins/auth-config.js +1 -3
  217. package/mixins/browser-tab-visibility.js +8 -14
  218. package/mixins/chart.js +1 -1
  219. package/mixins/create-edit-view/impl.js +4 -0
  220. package/mixins/create-edit-view/index.js +4 -2
  221. package/mixins/resource-fetch-namespaced.js +98 -0
  222. package/mixins/resource-fetch.js +79 -45
  223. package/mixins/resource-manager.js +1 -23
  224. package/models/apps.controllerrevision.js +7 -0
  225. package/models/apps.daemonset.js +18 -0
  226. package/models/apps.deployment.js +44 -0
  227. package/models/apps.replicaset.js +7 -0
  228. package/models/apps.statefulset.js +18 -0
  229. package/models/batch.job.js +7 -14
  230. package/models/cluster/node.js +10 -2
  231. package/models/cluster.x-k8s.io.machine.js +26 -4
  232. package/models/cluster.x-k8s.io.machinedeployment.js +12 -2
  233. package/models/event.js +7 -0
  234. package/models/logging.banzaicloud.io.flow.js +4 -0
  235. package/models/management.cattle.io.cluster.js +1 -1
  236. package/models/management.cattle.io.clusterroletemplatebinding.js +1 -1
  237. package/models/management.cattle.io.globalrole.js +2 -2
  238. package/models/management.cattle.io.node.js +37 -2
  239. package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.ts +4 -0
  240. package/models/management.cattle.io.project.js +30 -11
  241. package/models/management.cattle.io.setting.js +1 -1
  242. package/models/management.cattle.io.user.js +37 -1
  243. package/models/namespace.js +42 -5
  244. package/models/persistentvolume.js +14 -2
  245. package/models/pod.js +15 -0
  246. package/models/projectroletemplatebinding.js +7 -0
  247. package/models/provisioning.cattle.io.cluster.js +61 -10
  248. package/models/rke-machine.cattle.io.pnapmachinetemplate.js +15 -0
  249. package/models/service.js +14 -13
  250. package/models/storage.k8s.io.storageclass.js +33 -18
  251. package/models/workload.js +38 -7
  252. package/nuxt.config.js +27 -17
  253. package/package.json +7 -7
  254. package/pages/about.vue +14 -2
  255. package/pages/c/_cluster/apps/charts/index.vue +21 -3
  256. package/pages/c/_cluster/apps/charts/install.vue +59 -22
  257. package/pages/c/_cluster/auth/config/_id.vue +6 -0
  258. package/pages/c/_cluster/auth/config/index.vue +8 -6
  259. package/pages/c/_cluster/auth/group.principal/assign-edit.vue +1 -1
  260. package/pages/c/_cluster/auth/roles/index.vue +1 -1
  261. package/pages/c/_cluster/explorer/index.vue +51 -6
  262. package/pages/c/_cluster/longhorn/index.vue +1 -1
  263. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +15 -4
  264. package/pages/c/_cluster/monitoring/index.vue +1 -1
  265. package/pages/c/_cluster/neuvector/index.vue +1 -1
  266. package/pages/c/_cluster/settings/performance.vue +48 -2
  267. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +2 -0
  268. package/pages/c/_cluster/uiplugins/InstallDialog.vue +3 -0
  269. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +42 -2
  270. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +2 -0
  271. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +1 -0
  272. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +2 -0
  273. package/pages/c/_cluster/uiplugins/index.vue +42 -3
  274. package/pages/diagnostic.vue +5 -4
  275. package/pages/home.vue +105 -30
  276. package/pages/prefs.vue +23 -12
  277. package/pages/rio/mesh.vue +1 -1
  278. package/pkg/dynamic-importer.lib.js +8 -0
  279. package/pkg/vue.config.js +4 -0
  280. package/plugins/dashboard-store/__tests__/mutations.spec.js +406 -0
  281. package/plugins/dashboard-store/actions.js +32 -25
  282. package/plugins/dashboard-store/getters.js +50 -33
  283. package/plugins/dashboard-store/mutations.js +134 -28
  284. package/plugins/dashboard-store/resource-class.js +37 -42
  285. package/plugins/steve/actions.js +30 -0
  286. package/plugins/steve/caches/resourceCache.js +60 -0
  287. package/plugins/steve/getters.js +44 -1
  288. package/plugins/steve/mutations.js +97 -36
  289. package/plugins/steve/resourceWatcher.js +277 -0
  290. package/plugins/steve/schema.utils.js +25 -0
  291. package/plugins/steve/subscribe.js +288 -115
  292. package/plugins/steve/worker/index.js +17 -0
  293. package/plugins/steve/worker/web-worker.advanced.js +302 -0
  294. package/plugins/steve/{web-worker.steve-sub-worker.js → worker/web-worker.basic.js} +3 -44
  295. package/rancher-components/Card/Card.vue +3 -3
  296. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +1 -0
  297. package/rancher-components/StringList/StringList.test.ts +45 -420
  298. package/rancher-components/StringList/StringList.vue +1 -10
  299. package/rancher-components/components/Banner/Banner.test.ts +44 -0
  300. package/rancher-components/components/Banner/Banner.vue +130 -61
  301. package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +13 -22
  302. package/rancher-components/components/Form/Checkbox/Checkbox.vue +8 -6
  303. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +9 -9
  304. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +0 -1
  305. package/rancher-components/components/StringList/StringList.test.ts +7 -7
  306. package/rancher-components/components/StringList/StringList.vue +21 -15
  307. package/scripts/test-plugins-build.sh +8 -0
  308. package/static/loading-indicator.html +1 -1
  309. package/store/action-menu.js +4 -3
  310. package/store/index.js +54 -3
  311. package/store/plugins.js +0 -17
  312. package/store/pnap.js +128 -0
  313. package/store/prefs.js +4 -2
  314. package/store/type-map.js +81 -13
  315. package/types/pod-security-admission.ts +36 -0
  316. package/types/shell/index.d.ts +497 -396
  317. package/utils/__tests__/object.test.ts +17 -1
  318. package/utils/__tests__/pod-security-admission.test.ts +61 -0
  319. package/utils/async.ts +36 -0
  320. package/utils/color.js +45 -0
  321. package/utils/crypto/browserHashUtils.js +18 -0
  322. package/utils/dynamic-importer.js +8 -0
  323. package/utils/install-redirect.js +1 -1
  324. package/utils/object.js +24 -0
  325. package/utils/pod-security-admission.ts +39 -0
  326. package/utils/socket.js +61 -24
  327. package/utils/string.js +2 -0
  328. package/utils/svg-filter.js +301 -0
  329. package/utils/time.js +49 -0
  330. package/utils/validators/cidr.js +4 -0
  331. package/utils/validators/formRules/__tests__/index.test.ts +23 -3
  332. package/utils/validators/formRules/index.ts +14 -0
  333. package/config/product/harvester-manager.js +0 -162
  334. package/edit/harvesterhci.io.management.cluster.vue +0 -153
  335. package/list/harvesterhci.io.management.cluster.vue +0 -241
  336. package/machine-config/harvester.vue +0 -693
  337. package/models/harvesterhci.io.management.cluster.js +0 -228
  338. package/pages/c/_cluster/harvesterManager/index.vue +0 -24
  339. package/rancher-components/Card/Card.test.ts +0 -39
  340. package/rancher-components/Utils/DraggableZone/DraggableZone.vue +0 -181
  341. package/rancher-components/Utils/DraggableZone/index.ts +0 -1
  342. package/rancher-components/components/Utils/DraggableZone/index.ts +0 -1
package/models/pod.js CHANGED
@@ -181,6 +181,21 @@ export default class Pod extends WorkloadService {
181
181
  return 0;
182
182
  }
183
183
 
184
+ processSaveResponse(res) {
185
+ if (res._headers && res._headers.warning) {
186
+ const warnings = res._headers.warning.split('299') || [];
187
+ const hasPsaWarnings = warnings.filter(warning => warning.includes('violate PodSecurity')).length;
188
+
189
+ if (hasPsaWarnings) {
190
+ this.$dispatch('growl/warning', {
191
+ title: this.$rootGetters['i18n/t']('growl.podSecurity.title'),
192
+ message: this.$rootGetters['i18n/t']('growl.podSecurity.message'),
193
+ timeout: 5000,
194
+ }, { root: true });
195
+ }
196
+ }
197
+ }
198
+
184
199
  save() {
185
200
  const prev = { ...this };
186
201
 
@@ -17,4 +17,11 @@ export default class PRTB extends NormanModel {
17
17
  get roleTemplate() {
18
18
  return this.$rootGetters['management/byId'](MANAGEMENT.ROLE_TEMPLATE, this.roleTemplateId);
19
19
  }
20
+
21
+ get steve() {
22
+ return this.$dispatch(`management/find`, {
23
+ type: MANAGEMENT.PROJECT_ROLE_TEMPLATE_BINDING,
24
+ id: this.id?.replace(':', '/')
25
+ }, { root: true });
26
+ }
20
27
  }
@@ -71,6 +71,17 @@ export default class ProvCluster extends SteveModel {
71
71
  return super.creationTimestamp;
72
72
  }
73
73
 
74
+ // Models can specify a single action that will be shown as a button in the details masthead
75
+ get detailsAction() {
76
+ const canExplore = this.mgmt?.isReady && !this.hasError;
77
+
78
+ return {
79
+ action: 'explore',
80
+ label: this.$rootGetters['i18n/t']('cluster.explore'),
81
+ enabled: canExplore,
82
+ };
83
+ }
84
+
74
85
  get _availableActions() {
75
86
  const out = super._availableActions;
76
87
  const isLocal = this.mgmt?.isLocal;
@@ -114,12 +125,12 @@ export default class ProvCluster extends SteveModel {
114
125
  label: this.$rootGetters['i18n/t']('nav.kubeconfig.download'),
115
126
  icon: 'icon icon-download',
116
127
  bulkable: true,
117
- enabled: this.mgmt?.hasAction('generateKubeconfig') && ready,
128
+ enabled: this.mgmt?.hasAction('generateKubeconfig'),
118
129
  }, {
119
130
  action: 'copyKubeConfig',
120
131
  label: this.t('cluster.copyConfig'),
121
132
  bulkable: false,
122
- enabled: this.mgmt?.hasAction('generateKubeconfig') && ready,
133
+ enabled: this.mgmt?.hasAction('generateKubeconfig'),
123
134
  icon: 'icon icon-copy',
124
135
  }, {
125
136
  action: 'snapshotAction',
@@ -165,6 +176,15 @@ export default class ProvCluster extends SteveModel {
165
176
  return out;
166
177
  }
167
178
 
179
+ explore() {
180
+ const location = {
181
+ name: 'c-cluster',
182
+ params: { cluster: this.mgmt.id }
183
+ };
184
+
185
+ this.currentRouter().push(location);
186
+ }
187
+
168
188
  goToViewYaml() {
169
189
  let location;
170
190
 
@@ -423,6 +443,36 @@ export default class ProvCluster extends SteveModel {
423
443
  return this.pools.reduce((acc, pool) => acc + (pool.unavailable || 0), 0);
424
444
  }
425
445
 
446
+ get unavailableMachines() {
447
+ if (this.isReady) {
448
+ if (this.isRke1) {
449
+ const names = this.nodes.filter((node) => {
450
+ return node.status.conditions.find(c => c.error && c.type === 'Ready');
451
+ }).map((node) => {
452
+ const name = node.status.nodeName || node.metadata.name;
453
+
454
+ return this.t('cluster.availabilityWarnings.node', { name });
455
+ });
456
+
457
+ return names.join('<br>');
458
+ } else {
459
+ const names = this.machines.filter((machine) => {
460
+ return machine.status.conditions.find(c => c.error && c.type === 'NodeHealthy');
461
+ }).map((machine) => {
462
+ if (machine.status.nodeRef?.name) {
463
+ return this.t('cluster.availabilityWarnings.node', { name: machine.status.nodeRef.name });
464
+ }
465
+
466
+ return this.t('cluster.availabilityWarnings.machine', { name: machine.metadata.name });
467
+ });
468
+
469
+ return names.join('<br>');
470
+ }
471
+ }
472
+
473
+ return '';
474
+ }
475
+
426
476
  get stateParts() {
427
477
  const out = [
428
478
  {
@@ -580,24 +630,25 @@ export default class ProvCluster extends SteveModel {
580
630
  this.$dispatch('promptRestore', [resource]);
581
631
  }
582
632
 
583
- saveAsRKETemplate(resources = this) {
633
+ saveAsRKETemplate(cluster = this) {
584
634
  this.$dispatch('promptModal', {
585
- resources,
586
- component: 'SaveAsRKETemplateDialog'
635
+ componentProps: { cluster },
636
+ component: 'SaveAsRKETemplateDialog'
587
637
  });
588
638
  }
589
639
 
590
- rotateCertificates(resources = this) {
640
+ rotateCertificates(cluster = this) {
591
641
  this.$dispatch('promptModal', {
592
- resources,
642
+ componentProps: { cluster },
643
+
593
644
  component: 'RotateCertificatesDialog'
594
645
  });
595
646
  }
596
647
 
597
- rotateEncryptionKey(resources = this) {
648
+ rotateEncryptionKey(cluster = this) {
598
649
  this.$dispatch('promptModal', {
599
- resources,
600
- component: 'RotateEncryptionKeyDialog'
650
+ componentProps: { cluster },
651
+ component: 'RotateEncryptionKeyDialog'
601
652
  });
602
653
  }
603
654
 
@@ -0,0 +1,15 @@
1
+ import MachineTemplate from './rke-machine.cattle.io.machinetemplate';
2
+
3
+ export default class PnapMachineTemplate extends MachineTemplate {
4
+ get provider() {
5
+ return 'pnap';
6
+ }
7
+
8
+ get providerLocation() {
9
+ return this.spec.template.spec.serverLocation;
10
+ }
11
+
12
+ get providerSize() {
13
+ return this.spec.template.spec.serverType;
14
+ }
15
+ }
package/models/service.js CHANGED
@@ -128,23 +128,24 @@ export default class extends SteveModel {
128
128
  return out;
129
129
  }
130
130
 
131
- get pods() {
131
+ get podRelationship() {
132
132
  const { metadata:{ relationships = [] } } = this;
133
133
 
134
- return async() => {
135
- const podRelationship = (relationships || []).filter(relationship => relationship.toType === POD)[0];
136
- let pods = [];
134
+ return (relationships || []).filter(relationship => relationship.toType === POD)[0];
135
+ }
137
136
 
138
- if (podRelationship) {
139
- pods = await this.$dispatch('cluster/findMatching', {
140
- type: POD,
141
- selector: podRelationship.selector,
142
- namespace: this.namespace
143
- }, { root: true });
144
- }
137
+ async fetchPods() {
138
+ if (this.podRelationship) {
139
+ await this.$dispatch('cluster/findMatching', {
140
+ type: POD,
141
+ selector: this.podRelationship.selector,
142
+ namespace: this.namespace
143
+ }, { root: true });
144
+ }
145
+ }
145
146
 
146
- return pods;
147
- };
147
+ get pods() {
148
+ return this.podRelationship ? this.$getters.matching( POD, this.podRelationship.selector, this.namespace ) : [];
148
149
  }
149
150
 
150
151
  get serviceType() {
@@ -2,21 +2,26 @@ import { STORAGE } from '@shell/config/labels-annotations';
2
2
  import { STORAGE_CLASS } from '@shell/config/types';
3
3
  import SteveModel from '@shell/plugins/steve/steve-class';
4
4
 
5
+ // These are storage class drivers w/ custom components
6
+ // all but longhorn are in-tree plugins
5
7
  export const PROVISIONER_OPTIONS = [
6
8
  {
7
- labelKey: 'storageClass.aws-ebs.title',
8
- value: 'kubernetes.io/aws-ebs',
9
- supported: true
9
+ labelKey: 'storageClass.aws-ebs.title',
10
+ value: 'kubernetes.io/aws-ebs',
11
+ supported: true,
12
+ deprecated: true,
10
13
  },
11
14
  {
12
- labelKey: 'storageClass.azure-disk.title',
13
- value: 'kubernetes.io/azure-disk',
14
- supported: true
15
+ labelKey: 'storageClass.azure-disk.title',
16
+ value: 'kubernetes.io/azure-disk',
17
+ supported: true,
18
+ deprecated: true
15
19
  },
16
20
  {
17
- labelKey: 'storageClass.azure-file.title',
18
- value: 'kubernetes.io/azure-file',
19
- supported: true
21
+ labelKey: 'storageClass.azure-file.title',
22
+ value: 'kubernetes.io/azure-file',
23
+ supported: true,
24
+ deprecated: true,
20
25
  },
21
26
  {
22
27
  labelKey: 'storageClass.rbd.title',
@@ -27,9 +32,10 @@ export const PROVISIONER_OPTIONS = [
27
32
  value: 'kubernetes.io/glusterfs',
28
33
  },
29
34
  {
30
- labelKey: 'storageClass.gce-pd.title',
31
- value: 'kubernetes.io/gce-pd',
32
- supported: true
35
+ labelKey: 'storageClass.gce-pd.title',
36
+ value: 'kubernetes.io/gce-pd',
37
+ supported: true,
38
+ deprecated: true,
33
39
  },
34
40
  {
35
41
  labelKey: 'storageClass.no-provisioner.title',
@@ -41,8 +47,9 @@ export const PROVISIONER_OPTIONS = [
41
47
  supported: true
42
48
  },
43
49
  {
44
- labelKey: 'storageClass.cinder.title',
45
- value: 'kubernetes.io/cinder',
50
+ labelKey: 'storageClass.cinder.title',
51
+ value: 'kubernetes.io/cinder',
52
+ deprecated: true,
46
53
  },
47
54
  {
48
55
  labelKey: 'storageClass.portworx-volume.title',
@@ -61,17 +68,25 @@ export const PROVISIONER_OPTIONS = [
61
68
  value: 'kubernetes.io/storageos',
62
69
  },
63
70
  {
64
- labelKey: 'storageClass.vsphere-volume.title',
65
- value: 'kubernetes.io/vsphere-volume',
66
- supported: true
71
+ labelKey: 'storageClass.vsphere-volume.title',
72
+ value: 'kubernetes.io/vsphere-volume',
73
+ supported: true,
74
+ deprecated: true
75
+ },
76
+ {
77
+ labelKey: 'storageClass.harvesterhci.title',
78
+ value: 'driver.harvesterhci.io',
79
+ supported: true,
80
+ hideCustomize: true,
67
81
  }
68
82
  ];
69
83
 
70
84
  export default class extends SteveModel {
71
85
  get provisionerDisplay() {
72
86
  const option = PROVISIONER_OPTIONS.find(o => o.value === this.provisioner);
87
+ const fallback = `${ this.provisioner } ${ this.t('persistentVolume.csi.drivers.suffix') }`;
73
88
 
74
- return option ? this.t(option.labelKey) : this.provisioner;
89
+ return option ? this.t(option.labelKey) : this.$rootGetters['i18n/withFallback'](`persistentVolume.csi.drivers.${ this.provisioner.replaceAll('.', '-') }`, null, fallback);
75
90
  }
76
91
 
77
92
  get isDefault() {
@@ -7,6 +7,16 @@ import { convertSelectorObj, matching, matches } from '@shell/utils/selector';
7
7
  import { SEPARATOR } from '@shell/components/DetailTop';
8
8
  import WorkloadService from '@shell/models/workload.service';
9
9
 
10
+ export const defaultContainer = {
11
+ imagePullPolicy: 'Always',
12
+ name: 'container-0',
13
+ securityContext: {
14
+ runAsNonRoot: false,
15
+ readOnlyRootFilesystem: false,
16
+ privileged: false,
17
+ allowPrivilegeEscalation: false,
18
+ }
19
+ };
10
20
  export default class Workload extends WorkloadService {
11
21
  // remove clone as yaml/edit as yaml until API supported
12
22
  get _availableActions() {
@@ -98,7 +108,9 @@ export default class Workload extends WorkloadService {
98
108
  if (!spec.template) {
99
109
  spec.template = {
100
110
  spec: {
101
- restartPolicy: this.type === WORKLOAD_TYPES.JOB ? 'Never' : 'Always', containers: [{ imagePullPolicy: 'Always', name: 'container-0' }], initContainers: []
111
+ restartPolicy: this.type === WORKLOAD_TYPES.JOB ? 'Never' : 'Always',
112
+ containers: [{ ...defaultContainer }],
113
+ initContainers: []
102
114
  }
103
115
  };
104
116
  }
@@ -109,14 +121,14 @@ export default class Workload extends WorkloadService {
109
121
  vm.$set(this, 'spec', spec);
110
122
  }
111
123
 
112
- toggleRollbackModal( resources = this ) {
124
+ toggleRollbackModal( workload = this ) {
113
125
  this.$dispatch('promptModal', {
114
- resources,
115
- component: 'RollbackWorkloadDialog'
126
+ componentProps: { workload },
127
+ component: 'RollbackWorkloadDialog'
116
128
  });
117
129
  }
118
130
 
119
- async rollBackWorkload( cluster, workload, rollbackRequestData ) {
131
+ async rollBackWorkload( cluster, workload, type, rollbackRequestData ) {
120
132
  const rollbackRequestBody = JSON.stringify(rollbackRequestData);
121
133
 
122
134
  if ( Array.isArray( workload ) ) {
@@ -125,8 +137,15 @@ export default class Workload extends WorkloadService {
125
137
  const namespace = workload.metadata.namespace;
126
138
  const workloadName = workload.metadata.name;
127
139
 
128
- // Ensure we go out to the correct cluster
129
- await this.patch(rollbackRequestBody, { url: `/k8s/clusters/${ cluster.id }/apis/apps/v1/namespaces/${ namespace }/deployments/${ workloadName }` });
140
+ /**
141
+ * Ensure we go out to the correct cluster
142
+ *
143
+ * Build the request body in the same format that kubectl
144
+ * uses to call the Kubernetes API to roll back a workload.
145
+ * To see an example request body, run:
146
+ * kubectl rollout undo deployment/[deployment name] --to-revision=[revision number] -v=8
147
+ */
148
+ await this.patch(rollbackRequestBody, { url: `/k8s/clusters/${ cluster.id }/apis/apps/v1/namespaces/${ namespace }/${ type }/${ workloadName }` });
130
149
  }
131
150
 
132
151
  pause() {
@@ -610,6 +629,18 @@ export default class Workload extends WorkloadService {
610
629
  return out;
611
630
  }
612
631
 
632
+ get currentRevisionNumber() {
633
+ if (this.ownedByWorkload || this.kind === 'Job' || this.kind === 'CronJob') {
634
+ return undefined;
635
+ }
636
+ if (this.kind === 'Deployment') {
637
+ return this.metadata.annotations['deployment.kubernetes.io/revision'];
638
+ }
639
+
640
+ // 'DaemonSet', 'StatefulSet'
641
+ return this.metadata.generation;
642
+ }
643
+
613
644
  async matchingPods() {
614
645
  const all = await this.$dispatch('findAll', { type: POD });
615
646
  const allInNamespace = all.filter(pod => pod.metadata.namespace === this.metadata.namespace);
package/nuxt.config.js CHANGED
@@ -22,16 +22,15 @@ export const API_PATH = api;
22
22
 
23
23
  const dev = (process.env.NODE_ENV !== 'production');
24
24
  const devPorts = dev || process.env.DEV_PORTS === 'true';
25
- const version = process.env.VERSION ||
26
- process.env.DRONE_TAG ||
27
- process.env.DRONE_VERSION ||
28
- require('./package.json').version;
25
+
26
+ // human readable version used on rancher dashboard about page
27
+ const dashboardVersion = process.env.DASHBOARD_VERSION;
29
28
 
30
29
  const prime = process.env.PRIME;
31
30
 
32
31
  const pl = process.env.PL || STANDARD;
33
- const commit = process.env.COMMIT || 'head';
34
32
  const perfTest = (process.env.PERF_TEST === 'true'); // Enable performance testing when in dev
33
+ const instrumentCode = (process.env.TEST_INSTRUMENT === 'true'); // Instrument code for code coverage in e2e tests
35
34
 
36
35
  // Allow skipping of eslint check
37
36
  // 0 = Skip browser and console checks
@@ -84,8 +83,21 @@ export default function(dir, _appConfig) {
84
83
  }
85
84
  }
86
85
 
86
+ // Instrument code for tests
87
+ const babelPlugins = [
88
+ // TODO: Browser support
89
+ // ['@babel/plugin-transform-modules-commonjs'],
90
+ ['@babel/plugin-proposal-private-property-in-object', { loose: true }]
91
+ ];
92
+
93
+ if (instrumentCode) {
94
+ babelPlugins.push('babel-plugin-istanbul');
95
+
96
+ console.warn('Instrumenting code for coverage'); // eslint-disable-line no-console
97
+ }
98
+
87
99
  // ===============================================================================================
88
- // Functions for the UI Pluginas
100
+ // Functions for the UI Plugins
89
101
  // ===============================================================================================
90
102
 
91
103
  const appConfig = _appConfig || {};
@@ -225,7 +237,11 @@ export default function(dir, _appConfig) {
225
237
 
226
238
  if (index !== -1 && (index + 1) < ctx.length) {
227
239
  const pkg = ctx[index + 1];
228
- const p = path.resolve(dir, 'pkg', pkg, resource.request.substr(5));
240
+ let p = path.resolve(dir, 'pkg', pkg, resource.request.substr(5));
241
+
242
+ if (resource.request.startsWith(`@pkg/${ pkg }`)) {
243
+ p = path.resolve(dir, 'pkg', resource.request.substr(5));
244
+ }
229
245
 
230
246
  resource.request = p;
231
247
  }
@@ -266,7 +282,7 @@ export default function(dir, _appConfig) {
266
282
  console.log(`Build: ${ dev ? 'Development' : 'Production' }`); // eslint-disable-line no-console
267
283
 
268
284
  if ( !dev ) {
269
- console.log(`Version: ${ version } (${ commit })`); // eslint-disable-line no-console
285
+ console.log(`Version: ${ dashboardVersion }`); // eslint-disable-line no-console
270
286
  }
271
287
 
272
288
  if ( resourceBase ) {
@@ -305,8 +321,6 @@ export default function(dir, _appConfig) {
305
321
 
306
322
  // Configuration visible to the client, https://nuxtjs.org/api/configuration-env
307
323
  env: {
308
- commit,
309
- version,
310
324
  dev,
311
325
  pl,
312
326
  perfTest,
@@ -315,7 +329,8 @@ export default function(dir, _appConfig) {
315
329
  api
316
330
  },
317
331
 
318
- publicRuntimeConfig: { rancherEnv },
332
+ // vars accessible via this.$config https://nuxtjs.org/docs/configuration-glossary/configuration-runtime-config/
333
+ publicRuntimeConfig: { rancherEnv, dashboardVersion },
319
334
 
320
335
  buildDir: dev ? '.nuxt' : '.nuxt-prod',
321
336
 
@@ -538,12 +553,7 @@ export default function(dir, _appConfig) {
538
553
  '@babel/preset-typescript',
539
554
  ];
540
555
  },
541
- plugins: [
542
- // TODO: Browser support
543
- // ['@babel/plugin-transform-modules-commonjs'],
544
- ['@babel/plugin-proposal-private-property-in-object', { loose: true }],
545
- 'babel-plugin-istanbul'
546
- ],
556
+ plugins: babelPlugins
547
557
  }
548
558
  },
549
559
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rancher/shell",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Rancher Dashboard Shell",
5
5
  "repository": "https://github.com/rancherlabs/dashboard",
6
6
  "license": "Apache-2.0",
@@ -113,7 +113,7 @@
113
113
  "nyc": "15.1.0",
114
114
  "papaparse": "5.3.0",
115
115
  "portal-vue": "2.1.7",
116
- "rancher-icons": "rancher/icons#v2.0.9",
116
+ "rancher-icons": "rancher/icons#v2.0.13",
117
117
  "require-extension-hooks": "0.3.3",
118
118
  "require-extension-hooks-babel": "1.0.0",
119
119
  "require-extension-hooks-vue": "3.0.0",
@@ -143,11 +143,11 @@
143
143
  "vuex": "3.6.2",
144
144
  "webpack-bundle-analyzer": "4.5.0",
145
145
  "webpack-virtual-modules": "0.4.3",
146
- "xterm": "4.9.0",
147
- "xterm-addon-fit": "0.4.0",
148
- "xterm-addon-search": "0.7.0",
149
- "xterm-addon-web-links": "0.4.0",
150
- "xterm-addon-webgl": "0.9.0",
146
+ "xterm": "5.0.0",
147
+ "xterm-addon-fit": "0.6.0",
148
+ "xterm-addon-search": "0.10.0",
149
+ "xterm-addon-web-links": "0.7.0",
150
+ "xterm-addon-webgl": "0.13.0",
151
151
  "worker-loader": "3.0.8",
152
152
  "yarn": "1.22.18"
153
153
  },
package/pages/about.vue CHANGED
@@ -16,7 +16,8 @@ export default {
16
16
  },
17
17
  data() {
18
18
  return {
19
- settings: null,
19
+ dashboardVersion: this.$config.dashboardVersion,
20
+ settings: null,
20
21
  SETTING
21
22
  };
22
23
  },
@@ -117,10 +118,21 @@ export default {
117
118
  target="_blank"
118
119
  rel="nofollow noopener noreferrer"
119
120
  >
120
- {{ appName }}
121
+ {{ t("about.versions.rancher") }}
121
122
  </a>
122
123
  </td><td>{{ rancherVersion.value }}</td>
123
124
  </tr>
125
+ <tr v-if="dashboardVersion">
126
+ <td>
127
+ <a
128
+ href="https://github.com/rancher/dashboard"
129
+ target="_blank"
130
+ rel="nofollow noopener noreferrer"
131
+ >
132
+ {{ t("generic.dashboard") }}
133
+ </a>
134
+ </td><td>{{ dashboardVersion }}</td>
135
+ </tr>
124
136
  <tr v-if="cliVersion">
125
137
  <td>
126
138
  <a
@@ -21,6 +21,7 @@ import { CATALOG } from '@shell/config/labels-annotations';
21
21
  import { isUIPlugin } from '@shell/config/uiplugins';
22
22
 
23
23
  export default {
24
+ name: 'Charts',
24
25
  components: {
25
26
  AsyncButton,
26
27
  Banner,
@@ -34,7 +35,7 @@ export default {
34
35
  },
35
36
 
36
37
  async fetch() {
37
- await this.$store.dispatch('catalog/load');
38
+ await this.$store.dispatch('catalog/load', { force: true, reset: true });
38
39
 
39
40
  const query = this.$route.query;
40
41
 
@@ -53,7 +54,7 @@ export default {
53
54
  searchQuery: null,
54
55
  showDeprecated: null,
55
56
  showHidden: null,
56
- chartMode: this.$store.getters['prefs/get'](SHOW_CHART_MODE),
57
+ isPspLegacy: false,
57
58
  chartOptions: [
58
59
  {
59
60
  label: 'Browse',
@@ -71,6 +72,8 @@ export default {
71
72
  ...mapGetters(['currentCluster']),
72
73
  ...mapGetters({ allCharts: 'catalog/charts', loadingErrors: 'catalog/errors' }),
73
74
 
75
+ chartMode: mapPref(SHOW_CHART_MODE),
76
+
74
77
  hideRepos: mapPref(HIDE_REPOS),
75
78
 
76
79
  repoOptions() {
@@ -238,6 +241,14 @@ export default {
238
241
  }
239
242
  },
240
243
 
244
+ created() {
245
+ const release = this.currentCluster?.status?.version.gitVersion || '';
246
+ const isRKE2 = release.includes('rke2');
247
+ const version = release.match(/\d+/g);
248
+
249
+ this.isPspLegacy = version?.length ? isRKE2 && (+version[0] === 1 && +version[1] < 25) : false;
250
+ },
251
+
241
252
  methods: {
242
253
  colorForChart(chart) {
243
254
  const repos = this.repoOptions;
@@ -339,7 +350,7 @@ export default {
339
350
  <template>
340
351
  <Loading v-if="$fetchState.pending" />
341
352
  <div v-else>
342
- <header class="header-layout">
353
+ <header>
343
354
  <div class="title">
344
355
  <h1 class="m-0">
345
356
  {{ t('catalog.charts.header') }}
@@ -362,6 +373,13 @@ export default {
362
373
  @clicked="(row) => selectChart(row)"
363
374
  />
364
375
  </div>
376
+
377
+ <Banner
378
+ v-if="isPspLegacy"
379
+ color="warning"
380
+ :label="t('catalog.chart.banner.legacy')"
381
+ />
382
+
365
383
  <TypeDescription resource="chart" />
366
384
  <div class="left-right-split">
367
385
  <Select