@rancher/shell 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/styles/global/_button.scss +5 -1
- package/assets/styles/global/_columns.scss +4 -0
- package/assets/styles/global/_layout.scss +1 -2
- package/assets/styles/global/_select.scss +1 -4
- package/assets/styles/themes/_dark.scss +4 -4
- package/assets/styles/themes/_light.scss +4 -3
- package/assets/styles/themes/_suse.scss +1 -1
- package/assets/styles/vendor/vue-select.scss +4 -3
- package/assets/translations/en-us.yaml +669 -73
- package/assets/translations/zh-hans.yaml +547 -165
- package/chart/monitoring/steps/uninstall-v1.vue +2 -2
- package/cloud-credential/azure.vue +23 -0
- package/cloud-credential/harvester.vue +25 -62
- package/cloud-credential/pnap.vue +80 -0
- package/components/.DS_Store +0 -0
- package/components/AdvancedSection.vue +9 -2
- package/components/Alert.vue +2 -2
- package/components/ButtonDropdown.vue +0 -2
- package/components/ButtonGroup.vue +1 -0
- package/components/CollapsibleCard.vue +0 -1
- package/components/CruResource.vue +41 -4
- package/components/DetailTop.vue +58 -3
- package/components/DisableAuthProviderModal.vue +106 -0
- package/{rancher-components/components/Utils/DraggableZone → components}/DraggableZone.vue +0 -0
- package/components/ExplorerMembers.vue +253 -30
- package/components/ExplorerProjectsNamespaces.vue +77 -33
- package/components/GrowlManager.vue +3 -3
- package/components/IconOrSvg.vue +149 -0
- package/components/LogItem.vue +69 -0
- package/components/PodSecurityAdmission.vue +302 -0
- package/components/PromptModal.vue +1 -0
- package/components/ResourceDetail/Masthead.vue +54 -2
- package/components/ResourceDetail/index.vue +12 -5
- package/components/ResourceList/Masthead.vue +11 -1
- package/components/ResourceList/ResourceLoadingIndicator.vue +12 -2
- package/components/ResourceList/index.vue +53 -12
- package/components/ResourceList/resource-list.config.js +7 -0
- package/components/ResourceTable.vue +31 -6
- package/components/SimpleBox.vue +1 -1
- package/components/SortableTable/THead.vue +15 -5
- package/components/SortableTable/index.vue +21 -10
- package/components/Tabbed/index.vue +20 -15
- package/components/__tests__/.DS_Store +0 -0
- package/components/__tests__/AsyncButton.test.ts +140 -0
- package/components/__tests__/BackLink.test.ts +33 -0
- package/components/__tests__/ButtonGroup.test.ts +124 -0
- package/components/__tests__/ClusterBadge.test.ts +32 -0
- package/components/__tests__/CollapsibleCard.test.ts +64 -0
- package/components/__tests__/ConsumptionGauge.test.ts +88 -0
- package/components/__tests__/CruResource.test.ts +3 -2
- package/components/__tests__/FixedBanner.test.ts +129 -0
- package/components/__tests__/GrowlManager.test.ts +147 -0
- package/components/__tests__/NamespaceFilter.test.ts +33 -25
- package/components/__tests__/PercentageBar.test.ts +32 -0
- package/components/__tests__/PodSecurityAdmission.test.ts +398 -0
- package/components/auth/AuthBanner.vue +20 -10
- package/components/auth/RoleDetailEdit.vue +26 -17
- package/components/auth/SelectPrincipal.vue +36 -5
- package/components/form/ArrayList.vue +3 -35
- package/components/form/ArrayListGrouped.vue +13 -4
- package/components/form/ArrayListSelect.vue +5 -5
- package/components/form/Error.vue +8 -0
- package/components/form/KeyValue.vue +39 -7
- package/components/form/LabeledSelect.vue +5 -2
- package/components/form/Labels.vue +46 -16
- package/components/form/Members/ClusterPermissionsEditor.vue +17 -17
- package/components/form/Members/MembershipEditor.vue +12 -12
- package/components/form/NameNsDescription.vue +1 -1
- package/components/form/NodeScheduling.vue +1 -1
- package/components/form/Probe.vue +3 -3
- package/components/form/ResourceQuota/Project.vue +6 -6
- package/components/form/ResourceTabs/index.vue +1 -6
- package/components/form/Security.vue +7 -6
- package/components/form/Select.vue +3 -2
- package/components/form/SelectOrCreateAuthSecret.vue +22 -29
- package/components/form/ServicePorts.vue +8 -0
- package/components/form/WorkloadPorts.vue +7 -1
- package/components/form/__tests__/ArrayList.test.ts +74 -0
- package/components/form/__tests__/ArrayListGrouped.test.ts +6 -4
- package/components/formatter/Checked.vue +1 -1
- package/components/formatter/ClusterLink.vue +5 -0
- package/components/formatter/IconIsDefault.vue +2 -2
- package/components/formatter/InternalExternalIP.vue +11 -8
- package/components/formatter/LiveDuration.vue +78 -0
- package/components/formatter/WorkloadHealthScale.vue +5 -3
- package/components/nav/Header.vue +6 -3
- package/components/nav/NamespaceFilter.vue +146 -63
- package/components/nav/TopLevelMenu.vue +22 -19
- package/components/nav/WindowManager/ContainerLogs.vue +83 -126
- package/components/nav/WindowManager/ContainerShell.vue +9 -7
- package/components/nav/WindowManager/Window.vue +2 -0
- package/components/nav/WindowManager/index.vue +10 -0
- package/config/elemental-types.js +9 -0
- package/config/features.js +2 -0
- package/config/home-links.js +4 -1
- package/config/pod-security-admission.ts +82 -0
- package/config/product/apps.js +1 -1
- package/config/product/auth.js +6 -5
- package/config/product/explorer.js +6 -6
- package/config/product/fleet.js +1 -1
- package/config/product/manager.js +6 -2
- package/config/secret.js +0 -1
- package/config/settings.ts +26 -9
- package/config/table-headers.js +22 -11
- package/config/types.js +4 -1
- package/content/docs/zh-hans/getting-started.md +113 -137
- package/content/docs/zh-hans/whats-new.md +8 -46
- package/creators/pkg/package-lock.json +37 -0
- package/creators/pkg/package.json +1 -1
- package/detail/catalog.cattle.io.app.vue +1 -1
- package/detail/pod.vue +1 -1
- package/detail/provisioning.cattle.io.cluster.vue +35 -9
- package/detail/service.vue +2 -9
- package/detail/workload/index.vue +0 -1
- package/dialog/AddClusterMemberDialog.vue +22 -28
- package/dialog/AddProjectMemberDialog.vue +53 -9
- package/dialog/DiagnosticTimingsDialog.vue +8 -7
- package/dialog/DrainNode.vue +44 -48
- package/dialog/ForceMachineRemoveDialog.vue +5 -7
- package/dialog/GenericPrompt.vue +15 -20
- package/dialog/RollbackWorkloadDialog.vue +15 -46
- package/dialog/RotateCertificatesDialog.vue +5 -7
- package/dialog/RotateEncryptionKeyDialog.vue +5 -9
- package/dialog/SaveAsRKETemplateDialog.vue +5 -13
- package/dialog/ScaleMachineDownDialog.vue +1 -1
- package/dialog/ScalePoolDownDialog.vue +121 -0
- package/edit/__tests__/management.cattle.io.setting.test.ts +3 -3
- package/edit/auth/azuread.vue +16 -16
- package/edit/auth/github.vue +8 -0
- package/edit/auth/googleoauth.vue +10 -1
- package/edit/auth/ldap/index.vue +10 -0
- package/edit/auth/oidc.vue +10 -0
- package/edit/auth/saml.vue +10 -0
- package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
- package/edit/cloudcredential.vue +3 -7
- package/edit/logging-flow/Match.vue +39 -8
- package/edit/logging-flow/index.vue +27 -4
- package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +107 -0
- package/edit/management.cattle.io.project.vue +8 -1
- package/edit/management.cattle.io.setting.vue +5 -2
- package/edit/management.cattle.io.user.vue +7 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +23 -7
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +2 -2
- package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +14 -6
- package/edit/namespace.vue +18 -4
- package/edit/networking.k8s.io.ingress/Certificate.vue +1 -0
- package/edit/networking.k8s.io.ingress/IngressClass.vue +8 -6
- package/edit/networking.k8s.io.ingress/RulePath.vue +12 -6
- package/edit/networking.k8s.io.ingress/index.vue +8 -6
- package/edit/persistentvolume/index.vue +30 -27
- package/edit/persistentvolume/plugins/cephfs.vue +29 -29
- package/edit/persistentvolume/plugins/csi.vue +102 -62
- package/edit/persistentvolume/plugins/fc.vue +19 -19
- package/edit/persistentvolume/plugins/iscsi.vue +45 -45
- package/edit/persistentvolume/plugins/rbd.vue +39 -39
- package/edit/persistentvolumeclaim.vue +78 -75
- package/edit/provisioning.cattle.io.cluster/MachinePool.vue +11 -7
- package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +10 -1
- package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +87 -27
- package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +3 -6
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +93 -0
- package/edit/provisioning.cattle.io.cluster/import.vue +1 -1
- package/edit/provisioning.cattle.io.cluster/index.vue +29 -6
- package/edit/provisioning.cattle.io.cluster/rke2.vue +440 -152
- package/edit/secret/index.vue +3 -7
- package/edit/service.vue +3 -1
- package/edit/storage.k8s.io.storageclass/index.vue +100 -16
- package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +114 -0
- package/edit/workload/__tests__/index.test.ts +98 -0
- package/edit/workload/index.vue +58 -8
- package/edit/workload/mixins/workload.js +107 -70
- package/edit/workload/storage/ContainerMountPaths.vue +0 -10
- package/edit/workload/storage/emptyDir.vue +88 -0
- package/edit/workload/storage/ephemeralVolume/index.vue +1 -1
- package/edit/workload/storage/index.vue +8 -0
- package/edit/workload/storage/persistentVolumeClaim/index.vue +1 -1
- package/layouts/default.vue +57 -44
- package/list/__tests__/workload.test.ts +5 -2
- package/list/catalog.cattle.io.app.vue +1 -0
- package/list/cis.cattle.io.clusterscan.vue +1 -0
- package/list/fleet.cattle.io.bundle.vue +5 -6
- package/list/fleet.cattle.io.cluster.vue +6 -3
- package/list/fleet.cattle.io.clusterregistrationtoken.vue +5 -6
- package/list/fleet.cattle.io.gitrepo.vue +4 -9
- package/list/helm.cattle.io.projecthelmchart.vue +1 -5
- package/list/logging.banzaicloud.io.clusterflow.vue +4 -1
- package/list/logging.banzaicloud.io.flow.vue +6 -5
- package/list/management.cattle.io.cluster.vue +1 -0
- package/list/management.cattle.io.feature.vue +3 -4
- package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +47 -0
- package/list/management.cattle.io.setting.vue +2 -2
- package/list/management.cattle.io.user.vue +4 -10
- package/list/monitoring.coreos.com.alertmanagerconfig.vue +2 -7
- package/list/node.vue +8 -5
- package/list/persistentvolume.vue +3 -3
- package/list/persistentvolumeclaim.vue +3 -4
- package/list/provisioning.cattle.io.cluster.vue +18 -19
- package/list/service.vue +6 -14
- package/list/workload.vue +43 -38
- package/machine-config/azure.vue +429 -60
- package/machine-config/pnap.vue +288 -0
- package/mixins/auth-config.js +1 -3
- package/mixins/browser-tab-visibility.js +8 -14
- package/mixins/chart.js +1 -1
- package/mixins/create-edit-view/impl.js +4 -0
- package/mixins/create-edit-view/index.js +4 -2
- package/mixins/resource-fetch-namespaced.js +98 -0
- package/mixins/resource-fetch.js +79 -45
- package/mixins/resource-manager.js +1 -23
- package/models/apps.controllerrevision.js +7 -0
- package/models/apps.daemonset.js +18 -0
- package/models/apps.deployment.js +44 -0
- package/models/apps.replicaset.js +7 -0
- package/models/apps.statefulset.js +18 -0
- package/models/batch.job.js +7 -14
- package/models/cluster/node.js +10 -2
- package/models/cluster.x-k8s.io.machine.js +26 -4
- package/models/cluster.x-k8s.io.machinedeployment.js +12 -2
- package/models/event.js +7 -0
- package/models/logging.banzaicloud.io.flow.js +4 -0
- package/models/management.cattle.io.cluster.js +1 -1
- package/models/management.cattle.io.clusterroletemplatebinding.js +1 -1
- package/models/management.cattle.io.globalrole.js +2 -2
- package/models/management.cattle.io.node.js +37 -2
- package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.ts +4 -0
- package/models/management.cattle.io.project.js +30 -11
- package/models/management.cattle.io.setting.js +1 -1
- package/models/management.cattle.io.user.js +37 -1
- package/models/namespace.js +42 -5
- package/models/persistentvolume.js +14 -2
- package/models/pod.js +15 -0
- package/models/projectroletemplatebinding.js +7 -0
- package/models/provisioning.cattle.io.cluster.js +61 -10
- package/models/rke-machine.cattle.io.pnapmachinetemplate.js +15 -0
- package/models/service.js +14 -13
- package/models/storage.k8s.io.storageclass.js +33 -18
- package/models/workload.js +38 -7
- package/nuxt.config.js +27 -17
- package/package.json +7 -7
- package/pages/about.vue +14 -2
- package/pages/c/_cluster/apps/charts/index.vue +4 -3
- package/pages/c/_cluster/apps/charts/install.vue +59 -22
- package/pages/c/_cluster/auth/config/_id.vue +6 -0
- package/pages/c/_cluster/auth/config/index.vue +8 -6
- package/pages/c/_cluster/auth/group.principal/assign-edit.vue +1 -1
- package/pages/c/_cluster/auth/roles/index.vue +1 -1
- package/pages/c/_cluster/explorer/index.vue +12 -6
- package/pages/c/_cluster/longhorn/index.vue +1 -1
- package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +15 -4
- package/pages/c/_cluster/monitoring/index.vue +1 -1
- package/pages/c/_cluster/neuvector/index.vue +1 -1
- package/pages/c/_cluster/settings/performance.vue +48 -2
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +34 -1
- package/pages/c/_cluster/uiplugins/index.vue +28 -2
- package/pages/diagnostic.vue +5 -4
- package/pages/home.vue +105 -30
- package/pages/prefs.vue +23 -12
- package/pages/rio/mesh.vue +1 -1
- package/pkg/dynamic-importer.lib.js +8 -0
- package/pkg/vue.config.js +4 -0
- package/plugins/dashboard-store/__tests__/mutations.spec.js +406 -0
- package/plugins/dashboard-store/actions.js +32 -25
- package/plugins/dashboard-store/getters.js +50 -33
- package/plugins/dashboard-store/mutations.js +134 -28
- package/plugins/dashboard-store/resource-class.js +21 -41
- package/plugins/steve/actions.js +30 -0
- package/plugins/steve/caches/resourceCache.js +60 -0
- package/plugins/steve/getters.js +44 -1
- package/plugins/steve/mutations.js +97 -36
- package/plugins/steve/resourceWatcher.js +277 -0
- package/plugins/steve/schema.utils.js +25 -0
- package/plugins/steve/subscribe.js +288 -115
- package/plugins/steve/worker/index.js +17 -0
- package/plugins/steve/worker/web-worker.advanced.js +302 -0
- package/plugins/steve/{web-worker.steve-sub-worker.js → worker/web-worker.basic.js} +3 -44
- package/rancher-components/Card/Card.vue +3 -3
- package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +1 -0
- package/rancher-components/StringList/StringList.test.ts +45 -420
- package/rancher-components/StringList/StringList.vue +1 -10
- package/rancher-components/components/Banner/Banner.test.ts +44 -0
- package/rancher-components/components/Banner/Banner.vue +129 -61
- package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +13 -22
- package/rancher-components/components/Form/Checkbox/Checkbox.vue +8 -6
- package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +9 -9
- package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +0 -1
- package/rancher-components/components/StringList/StringList.test.ts +7 -7
- package/rancher-components/components/StringList/StringList.vue +21 -15
- package/scripts/test-plugins-build.sh +8 -0
- package/static/loading-indicator.html +1 -1
- package/store/index.js +54 -3
- package/store/plugins.js +0 -17
- package/store/pnap.js +128 -0
- package/store/prefs.js +4 -2
- package/store/type-map.js +55 -13
- package/types/pod-security-admission.ts +36 -0
- package/types/shell/index.d.ts +496 -396
- package/utils/__tests__/object.test.ts +17 -1
- package/utils/__tests__/pod-security-admission.test.ts +61 -0
- package/utils/async.ts +36 -0
- package/utils/color.js +45 -0
- package/utils/crypto/browserHashUtils.js +18 -0
- package/utils/dynamic-importer.js +8 -0
- package/utils/install-redirect.js +1 -1
- package/utils/object.js +24 -0
- package/utils/pod-security-admission.ts +39 -0
- package/utils/socket.js +61 -24
- package/utils/string.js +2 -0
- package/utils/svg-filter.js +301 -0
- package/utils/time.js +49 -0
- package/utils/validators/cidr.js +4 -0
- package/utils/validators/formRules/__tests__/index.test.ts +23 -3
- package/utils/validators/formRules/index.ts +14 -0
- package/config/product/harvester-manager.js +0 -162
- package/edit/harvesterhci.io.management.cluster.vue +0 -153
- package/list/harvesterhci.io.management.cluster.vue +0 -241
- package/machine-config/harvester.vue +0 -693
- package/models/harvesterhci.io.management.cluster.js +0 -228
- package/pages/c/_cluster/harvesterManager/index.vue +0 -24
- package/rancher-components/Card/Card.test.ts +0 -39
- package/rancher-components/Utils/DraggableZone/DraggableZone.vue +0 -181
- package/rancher-components/Utils/DraggableZone/index.ts +0 -1
- 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';
|