@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
@@ -1,228 +0,0 @@
1
- import Vue from 'vue';
2
- import ProvCluster from '@shell/models/provisioning.cattle.io.cluster';
3
- import { DEFAULT_WORKSPACE, HCI, MANAGEMENT } from '@shell/config/types';
4
- import { HARVESTER_NAME, HARVESTER_NAME as VIRTUAL } from '@shell/config/product/harvester-manager';
5
- import { SETTING } from '@shell/config/settings';
6
-
7
- export default class HciCluster extends ProvCluster {
8
- get stateObj() {
9
- return this._stateObj;
10
- }
11
-
12
- applyDefaults() {
13
- if ( !this.spec ) {
14
- Vue.set(this, 'spec', { agentEnvVars: [] });
15
- Vue.set(this, 'metadata', { namespace: DEFAULT_WORKSPACE });
16
- }
17
- }
18
-
19
- get isReady() {
20
- // If the Connected condition exists, use that (2.6+)
21
- if ( this.hasCondition('Connected') ) {
22
- return this.isCondition('Connected');
23
- }
24
-
25
- // Otherwise use Ready (older)
26
- return this.isCondition('Ready');
27
- }
28
-
29
- get canEdit() {
30
- return false;
31
- }
32
-
33
- cachedHarvesterClusterVersion = '';
34
-
35
- _uiInfo = undefined;
36
-
37
- /**
38
- * Fetch and cache the response for /ui-info
39
- *
40
- * Storing this in a cache means any changes to `ui-info` require a dashboard refresh... but it cuts out a http request every time we
41
- * go to a cluster
42
- *
43
- * @param {string} clusterId
44
- */
45
- async _getUiInfo(clusterId) {
46
- if (!this._uiInfo) {
47
- try {
48
- const infoUrl = `/k8s/clusters/${ clusterId }/v1/harvester/ui-info`;
49
-
50
- this._uiInfo = await this.$dispatch('request', { url: infoUrl });
51
- } catch (e) {
52
- console.info(`Failed to fetch harvester ui-info from ${ this.nameDisplay }, this may be an older cluster that cannot provide one`); // eslint-disable-line no-console
53
- }
54
- }
55
-
56
- return this._uiInfo;
57
- }
58
-
59
- /**
60
- * Determine the harvester plugin's package name and url for legacy clusters that don't provide the package (i.e. it's coming from
61
- * outside the cluster)
62
- */
63
- _legacyClusterPkgDetails() {
64
- let uiOfflinePreferred = this.$rootGetters['management/byId'](MANAGEMENT.SETTING, SETTING.UI_OFFLINE_PREFERRED)?.value;
65
- // options: ['dynamic', 'true', 'false']
66
-
67
- if (uiOfflinePreferred === 'dynamic') {
68
- // We shouldn't need to worry about the version of the dashboard when embedded in harvester (aka in isSingleProduct)
69
- const version = this.$rootGetters['management/byId'](MANAGEMENT.SETTING, 'server-version')?.value;
70
-
71
- if (version.endsWith('-head')) {
72
- uiOfflinePreferred = 'false';
73
- } else {
74
- uiOfflinePreferred = 'true';
75
- }
76
- }
77
-
78
- // This is the version that's embedded in the dashboard
79
- const pkgName = `${ HARVESTER_NAME }-1.0.3`;
80
-
81
- if (uiOfflinePreferred === 'true') {
82
- // Embedded (aka give me the embedded plugin that was in the last rancher release)
83
- const embeddedPath = `${ pkgName }/${ pkgName }.umd.min.js`;
84
-
85
- return {
86
- pkgUrl: process.env.dev ? `${ process.env.api }/dashboard/${ embeddedPath }` : embeddedPath,
87
- pkgName
88
- };
89
- }
90
-
91
- if (uiOfflinePreferred === 'false') {
92
- // Remote (aka give me the latest version of the embedded plugin that might not have been released yet)
93
- const uiDashboardHarvesterRemotePlugin = this.$rootGetters['management/byId'](MANAGEMENT.SETTING, SETTING.UI_DASHBOARD_HARVESTER_LEGACY_PLUGIN)?.value;
94
- const parts = uiDashboardHarvesterRemotePlugin?.replace('.umd.min.js', '').split('/');
95
- const pkgNameFromUrl = parts?.length > 1 ? parts[parts.length - 1] : null;
96
-
97
- if (!pkgNameFromUrl) {
98
- throw new Error(`Unable to determine harvester plugin name from '${ uiDashboardHarvesterRemotePlugin }'`);
99
- }
100
-
101
- return {
102
- pkgUrl: uiDashboardHarvesterRemotePlugin,
103
- pkgName: pkgNameFromUrl
104
- };
105
- }
106
-
107
- throw new Error(`Unsupported value for ${ SETTING.UI_OFFLINE_PREFERRED }: 'uiOfflinePreferred'`);
108
- }
109
-
110
- /**
111
- * Determine the harvester plugin's package name and url for clusters that provide the plugin
112
- */
113
- _supportedClusterPkgDetails(uiInfo, clusterId) {
114
- let pkgName = `${ HARVESTER_NAME }-${ uiInfo['ui-plugin-bundled-version'] }`;
115
- const fileName = `${ pkgName }.umd.min.js`;
116
- let pkgUrl;
117
-
118
- if (uiInfo['ui-source'] === 'bundled' ) { // offline bundled
119
- pkgUrl = `/k8s/clusters/${ clusterId }/v1/harvester/plugin-assets/${ fileName }`;
120
- } else if (uiInfo['ui-source'] === 'external') {
121
- if (uiInfo['ui-plugin-index']) {
122
- pkgUrl = uiInfo['ui-plugin-index'];
123
-
124
- // When using an external address, the pkgName should also be get from the url
125
- const names = pkgUrl.split('/');
126
- const jsName = names[names.length - 1];
127
-
128
- pkgName = jsName?.split('.umd.min.js')[0];
129
- } else {
130
- throw new Error('Harvester cluster requested the plugin at `ui-plugin-index` is used, however did not provide a value for it');
131
- }
132
- }
133
-
134
- return {
135
- pkgUrl,
136
- pkgName
137
- };
138
- }
139
-
140
- _overridePkgDetails() {
141
- // Support loading the pkg from a locally, or other, address
142
- // This helps testing of the harvester plugin when packaged up, instead of directly imported
143
- const harvesterPkgUrl = process.env.harvesterPkgUrl;
144
-
145
- if (!harvesterPkgUrl) {
146
- return;
147
- }
148
- const parts = harvesterPkgUrl.replace('.umd.min.js', '').split('/');
149
- const pkgNameFromUrl = parts.length > 1 ? parts[parts.length - 1] : null;
150
-
151
- if (pkgNameFromUrl) {
152
- return {
153
- pkgUrl: harvesterPkgUrl,
154
- pkgName: pkgNameFromUrl
155
- };
156
- }
157
- }
158
-
159
- async _pkgDetails() {
160
- const overridePkgDetails = this._overridePkgDetails();
161
-
162
- if (overridePkgDetails) {
163
- return overridePkgDetails;
164
- }
165
-
166
- const clusterId = this.mgmt.id;
167
- const uiInfo = await this._getUiInfo(clusterId);
168
-
169
- return uiInfo ? this._supportedClusterPkgDetails(uiInfo, clusterId) : this._legacyClusterPkgDetails();
170
- }
171
-
172
- async loadClusterPlugin() {
173
- // Skip loading if it's built in
174
- const plugins = this.$rootState.$plugin.getPlugins();
175
- const loadedPkgs = Object.keys(plugins);
176
-
177
- if (loadedPkgs.find(pkg => pkg === HARVESTER_NAME)) {
178
- console.info('Harvester plugin built is built in, skipping load from external sources'); // eslint-disable-line no-console
179
-
180
- return;
181
- }
182
-
183
- // Determine the plugin name and the url it can be fetched from
184
- const { pkgUrl, pkgName } = await this._pkgDetails();
185
-
186
- console.info('Harvester plugin details: ', pkgName, pkgUrl); // eslint-disable-line no-console
187
-
188
- // Skip loading if we've previously loaded the correct one
189
- if (!!plugins[pkgName]) {
190
- console.info('Harvester plugin already loaded, no need to load', pkgName); // eslint-disable-line no-console
191
-
192
- return;
193
- }
194
-
195
- console.info('Attempting to load Harvester plugin', pkgName); // eslint-disable-line no-console
196
-
197
- const res = await this.$rootState.$plugin.loadAsync(pkgName, pkgUrl);
198
-
199
- console.info('Loaded Harvester plugin', pkgName); // eslint-disable-line no-console
200
-
201
- return res;
202
- }
203
-
204
- goToCluster() {
205
- this.loadClusterPlugin()
206
- .then(() => {
207
- this.currentRouter().push({
208
- name: `${ VIRTUAL }-c-cluster-resource`,
209
- params: {
210
- cluster: this.status.clusterName,
211
- product: VIRTUAL,
212
- resource: HCI.DASHBOARD // Go directly to dashboard to avoid blip of components on screen
213
- }
214
- });
215
- })
216
- .catch((err) => {
217
- const message = typeof error === 'object' ? JSON.stringify(err) : err;
218
-
219
- console.error('Failed to load harvester package: ', message); // eslint-disable-line no-console
220
-
221
- this.$dispatch('growl/error', {
222
- title: this.t('harvesterManager.plugins.loadError'),
223
- message,
224
- timeout: 5000
225
- }, { root: true });
226
- });
227
- }
228
- }
@@ -1,24 +0,0 @@
1
- <script>
2
- import { NAME } from '@shell/config/product/harvester-manager';
3
- import { HCI } from '@shell/config/types';
4
-
5
- export default {
6
- middleware({ redirect, route } ) {
7
- return redirect({
8
- name: 'c-cluster-product-resource',
9
- params: {
10
- ...route.params,
11
- product: NAME,
12
- resource: HCI.CLUSTER
13
- }
14
- });
15
- }
16
- };
17
-
18
- </script>
19
-
20
- <template>
21
- <div>
22
- This is harvester Manager.
23
- </div>
24
- </template>
@@ -1,39 +0,0 @@
1
- import { mount } from '@vue/test-utils';
2
- import { Card } from './index';
3
-
4
- describe('component: Card', () => {
5
- const title = 'Card title';
6
- const body = 'Card body';
7
-
8
- it('should have a card title', () => {
9
- const wrapper = mount(Card, {
10
- propsData: { title },
11
- slots: {
12
- title: '<div>Card title</div>',
13
- }
14
- });
15
-
16
- const element = wrapper.find('[data-testid="card-title-slot"]')
17
- expect(element.exists()).toBe(true);
18
- expect(element.text()).toBe(title)
19
- });
20
-
21
- it('should have a card body', () => {
22
- const wrapper = mount(Card, {
23
- propsData: { body },
24
- slots: {
25
- body: '<div>Card body</div>',
26
- }
27
- });
28
- const element = wrapper.find('[data-testid="card-body-slot"]')
29
- expect(element.exists()).toBe(true);
30
- expect(element.text()).toBe(body)
31
- });
32
-
33
- it('should display the default card actions', () => {
34
- const wrapper = mount(Card)
35
- const element = wrapper.find('[data-testid="card-actions-slot"]')
36
- expect(element.exists()).toBe(true);
37
- });
38
- });
39
-
@@ -1,181 +0,0 @@
1
- <script lang="ts">
2
- import Vue from 'vue';
3
- import { mapState } from 'vuex';
4
- import { BOTTOM, CENTER, LEFT, RIGHT } from '@shell/utils/position';
5
-
6
- interface Data {
7
- drag: Drag;
8
- }
9
-
10
- type Zone = null | typeof CENTER | typeof RIGHT | typeof BOTTOM | typeof LEFT;
11
-
12
- export interface Drag {
13
- active: boolean;
14
- zone: Zone;
15
- }
16
-
17
- export default Vue.extend({
18
- data(): Data {
19
- return {
20
- drag: {
21
- active: false,
22
- zone: CENTER,
23
- },
24
- };
25
- },
26
-
27
- computed: {
28
-
29
- ...mapState('wm', ['userPin']),
30
-
31
- pin: {
32
- get(): Zone {
33
- return this.userPin;
34
- },
35
-
36
- set(pin: Zone) {
37
- if (pin === CENTER) {
38
- return;
39
- }
40
- window.localStorage.setItem('wm-pin', pin as string);
41
- this.$store.commit('wm/setUserPin', pin);
42
- },
43
- },
44
-
45
- },
46
-
47
- methods: {
48
-
49
- onDragStart() {
50
- this.drag.active = true;
51
- },
52
-
53
- onDragOver(event: DragEvent, zone: Zone) {
54
- this.drag.zone = zone;
55
- if (zone !== CENTER) {
56
- event.preventDefault();
57
- }
58
- },
59
-
60
- onDragEnd() {
61
- this.pin = this.drag.zone;
62
- this.drag = {
63
- active: false,
64
- zone: CENTER,
65
- };
66
- },
67
-
68
- }
69
- });
70
- </script>
71
-
72
- <template>
73
- <div v-if="drag.active">
74
- <span
75
- v-if="drag.zone != pin"
76
- class="pin-effect-area"
77
- :class="drag.zone"
78
- />
79
- <span
80
- class="drag-area center"
81
- @dragover="onDragOver($event, 'center')"
82
- />
83
- <span
84
- class="drag-area right"
85
- @dragover="onDragOver($event, 'right')"
86
- />
87
- <span
88
- class="drag-area bottom"
89
- @dragover="onDragOver($event, 'bottom')"
90
- />
91
- <span
92
- class="drag-area left"
93
- @dragover="onDragOver($event, 'left')"
94
- />
95
- </div>
96
- </template>
97
-
98
- <style lang='scss' scoped>
99
-
100
- .pin-effect-area {
101
- position: absolute;
102
- z-index: 997;
103
- width: 0;
104
- height: 0;
105
- border-style: hidden;
106
-
107
- &.right {
108
- top: 55px;
109
- right: 0;
110
- width: 300px;
111
- transition: width .5s ease;
112
- height: 100%;
113
- background-image: linear-gradient(to right, var(--drag-over-outer-bg), var(--drag-over-inner-bg));
114
- border-left: 1px;
115
- border-style: hidden hidden hidden dashed;
116
- }
117
-
118
- &.left {
119
- top: 55px;
120
- left: 0;
121
- width: 300px;
122
- transition: width .5s ease;
123
- height: 100%;
124
- background-image: linear-gradient(to left, var(--drag-over-outer-bg), var(--drag-over-inner-bg));
125
- border-right: 1px;
126
- border-style: hidden dashed hidden hidden;
127
- }
128
-
129
- &.bottom {
130
- bottom: 0;
131
- height: 270px;
132
- transition: height .5s ease;
133
- width: 100%;
134
- background-image: linear-gradient(to top, var(--drag-over-inner-bg), var(--drag-over-outer-bg));
135
- border-top: 1px;
136
- border-style: dashed hidden hidden hidden;
137
- }
138
-
139
- &.center {
140
- width: 0;
141
- height: 0;
142
- }
143
- }
144
-
145
- // ToDo make height and width as input variable
146
- .drag-area {
147
- position: absolute;
148
- z-index: 999;
149
- width: 0;
150
- height: 0;
151
- opacity: 0;
152
-
153
- &.center {
154
- top: 0;
155
- right: 0;
156
- width: 100%;
157
- height: 100%;
158
- z-index: 998;
159
- }
160
-
161
- &.right {
162
- top: 55px;
163
- right: 0;
164
- width: 300px;
165
- height: 100%;
166
- }
167
-
168
- &.left {
169
- top: 55px;
170
- left: 0;
171
- width: 300px;
172
- height: 100%;
173
- }
174
-
175
- &.bottom {
176
- bottom: 0;
177
- height: 270px;
178
- width: 100%;
179
- }
180
- }
181
- </style>
@@ -1 +0,0 @@
1
- export { default as DraggableZone } from './DraggableZone.vue';
@@ -1 +0,0 @@
1
- export { default as DraggableZone } from './DraggableZone.vue';