mirror of https://github.com/rancher/dashboard.git
194 lines
4.7 KiB
JavaScript
194 lines
4.7 KiB
JavaScript
import { CATALOG } from '@/config/labels-annotations';
|
|
import { FLEET, MANAGEMENT } from '@/config/types';
|
|
import { insertAt } from '@/utils/array';
|
|
import { parseSi } from '@/utils/units';
|
|
|
|
// See translation file cluster.providers for list of providers
|
|
// If the logo is not named with the provider name, add an override here
|
|
const PROVIDER_LOGO_OVERRIDE = {};
|
|
|
|
export default {
|
|
details() {
|
|
const out = [
|
|
{
|
|
label: 'Provisioner',
|
|
content: this.provisionerDisplay
|
|
},
|
|
{
|
|
label: 'Node Provider',
|
|
content: this.nodeProviderDisplay
|
|
},
|
|
{
|
|
label: 'Kubernetes Version',
|
|
content: this.kubernetesVersion,
|
|
},
|
|
];
|
|
|
|
return out;
|
|
},
|
|
|
|
_availableActions() {
|
|
const out = this._standardActions;
|
|
|
|
insertAt(out, 0, {
|
|
action: 'openShell',
|
|
label: 'Kubectl Shell',
|
|
icon: 'icon icon-terminal',
|
|
enabled: !!this.links.shell,
|
|
});
|
|
|
|
return out;
|
|
},
|
|
|
|
canDelete() {
|
|
return this.hasLink('remove') && !this?.spec?.internal;
|
|
},
|
|
|
|
provisioner() {
|
|
const allKeys = Object.keys(this.spec);
|
|
const configKey = allKeys.find( k => k.endsWith('Config'));
|
|
|
|
if ( configKey ) {
|
|
return configKey.replace(/Config$/, '');
|
|
}
|
|
},
|
|
|
|
nodePools() {
|
|
const pools = this.$getters['all'](MANAGEMENT.NODE_POOL);
|
|
|
|
return pools.filter(x => x.spec?.clusterName === this.id);
|
|
},
|
|
|
|
nodeProvider() {
|
|
const kind = this.nodePools?.[0]?.provider;
|
|
|
|
if ( kind ) {
|
|
return kind.replace(/config$/i, '').toLowerCase();
|
|
} else if ( this.spec?.internal ) {
|
|
return 'local';
|
|
}
|
|
},
|
|
|
|
groupByLabel() {
|
|
return this.$rootGetters['i18n/t']('resourceTable.groupLabel.notInAWorkspace');
|
|
},
|
|
|
|
isReady() {
|
|
// If the Connected condition exists, use that (2.6+)
|
|
if ( this.hasCondition('Connected') ) {
|
|
return this.isCondition('Connected');
|
|
}
|
|
|
|
// Otherwise use Ready (older)
|
|
return this.isCondition('Ready');
|
|
},
|
|
|
|
kubernetesVersion() {
|
|
const fromStatus = this.status?.version?.gitVersion;
|
|
const fromSpec = this.spec?.[`${ this.provisioner }Config`]?.kubernetesVersion;
|
|
|
|
return fromStatus || fromSpec || this.$rootGetters['i18n/t']('generic.unknown');
|
|
},
|
|
|
|
kubernetesVersionBase() {
|
|
return this.kubernetesVersion.replace(/[+-].*$/, '');
|
|
},
|
|
|
|
kubernetesVersionExtension() {
|
|
if ( this.kubernetesVersion.match(/[+-]]/) ) {
|
|
return this.kubernetesVersion.replace(/^.*([+-])/, '$1');
|
|
}
|
|
|
|
return '';
|
|
},
|
|
|
|
openShell() {
|
|
return () => {
|
|
this.$dispatch('wm/open', {
|
|
id: `kubectl-${ this.id }`,
|
|
label: this.$rootGetters['i18n/t']('wm.kubectlShell.title', { name: this.nameDisplay }),
|
|
icon: 'terminal',
|
|
component: 'KubectlShell',
|
|
attrs: {
|
|
cluster: this,
|
|
pod: {}
|
|
}
|
|
}, { root: true });
|
|
};
|
|
},
|
|
|
|
providerOs() {
|
|
if ( this.status?.provider === 'rke.windows' ) {
|
|
return 'windows';
|
|
}
|
|
|
|
return 'linux';
|
|
},
|
|
|
|
providerOsLogo() {
|
|
return require(`~/assets/images/vendor/${ this.providerOs }.svg`);
|
|
},
|
|
|
|
providerLogo() {
|
|
const provider = this.status?.provider || 'kubernetes';
|
|
// Only interested in the part before the period
|
|
const prv = provider.split('.')[0];
|
|
// Allow overrides if needed
|
|
const logo = PROVIDER_LOGO_OVERRIDE[prv] || prv;
|
|
|
|
let icon;
|
|
|
|
try {
|
|
icon = require(`~/assets/images/providers/${ prv }.svg`);
|
|
} catch (e) {
|
|
console.warn(`Can not find provider logo for provider ${ logo }`); // eslint-disable-line no-console
|
|
// Use fallback generic Kubernetes icon
|
|
icon = require(`~/assets/images/providers/kubernetes.svg`);
|
|
}
|
|
|
|
return icon;
|
|
},
|
|
|
|
scope() {
|
|
return this.id === 'local' ? CATALOG._MANAGEMENT : CATALOG._DOWNSTREAM;
|
|
},
|
|
|
|
setClusterNameLabel() {
|
|
return (andSave) => {
|
|
if ( this.ownerReferences?.length || this.metadata?.labels?.[FLEET.CLUSTER_NAME] === this.id ) {
|
|
return;
|
|
}
|
|
|
|
this.metadata = this.metadata || {};
|
|
this.metadata.labels = this.metadata.labels || {};
|
|
this.metadata.labels[FLEET.CLUSTER_NAME] = this.id;
|
|
|
|
if ( andSave ) {
|
|
return this.save();
|
|
}
|
|
};
|
|
},
|
|
|
|
availableCpu() {
|
|
const reserved = parseSi(this.status.requested?.cpu);
|
|
const allocatable = parseSi(this.status.allocatable?.cpu);
|
|
|
|
if ( allocatable > 0 && reserved >= 0 ) {
|
|
return Math.max(0, allocatable - reserved);
|
|
} else {
|
|
return null;
|
|
}
|
|
},
|
|
|
|
availableMemory() {
|
|
const reserved = parseSi(this.status.requested?.memory);
|
|
const allocatable = parseSi(this.status.allocatable?.memory);
|
|
|
|
if ( allocatable > 0 && reserved >= 0 ) {
|
|
return Math.max(0, allocatable - reserved);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
};
|