+
+
+
+ {{ t('harvester.vgpu.noPermission') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pkg/harvester/models/devices.harvesterhci.io.migconfiguration.js b/pkg/harvester/models/devices.harvesterhci.io.migconfiguration.js
new file mode 100644
index 00000000..411f30ec
--- /dev/null
+++ b/pkg/harvester/models/devices.harvesterhci.io.migconfiguration.js
@@ -0,0 +1,116 @@
+import SteveModel from '@shell/plugins/steve/steve-class';
+import { escapeHtml } from '@shell/utils/string';
+import { colorForState } from '@shell/plugins/dashboard-store/resource-class';
+
+/**
+ * Class representing vGPU MIGConfiguration resource.
+ * @extends SteveModal
+ */
+export default class MIGCONFIGURATION extends SteveModel {
+ get _availableActions() {
+ let out = super._availableActions;
+
+ out = out.map((action) => {
+ if (action.action === 'showConfiguration') {
+ return { ...action, enabled: !this.spec.enabled };
+ } else if (action.action === 'goToEditYaml') {
+ return { ...action, enabled: !this.spec.enabled };
+ } else if (action.action === 'goToEdit') {
+ // need to wait for status to be disabled or empty value, then allow user to editConfig
+ return { ...action, enabled: !this.spec.enabled && ['disabled', ''].includes(this.configStatus) };
+ } else {
+ return action;
+ }
+ });
+
+ out.push(
+ {
+ action: 'enableConfig',
+ enabled: !this.isEnabled,
+ icon: 'icon icon-fw icon-dot',
+ label: 'Enable',
+ },
+ {
+ action: 'disableConfig',
+ enabled: this.isEnabled,
+ icon: 'icon icon-fw icon-dot-open',
+ label: 'Disable',
+ },
+ );
+
+ return out;
+ }
+
+ get canYaml() {
+ return false;
+ }
+
+ get disableResourceDetailDrawer() {
+ return true;
+ }
+
+ get canDelete() {
+ return false;
+ }
+
+ get configStatus() {
+ return this.status.status;
+ }
+
+ get actualState() {
+ return this.isEnabled ? 'Enabled' : 'Disabled';
+ }
+
+ get stateDisplay() {
+ return this.actualState;
+ }
+
+ get stateColor() {
+ const state = this.actualState;
+
+ return colorForState(state);
+ }
+
+ get isEnabled() {
+ return this.spec.enabled;
+ }
+
+ get configuredProfiles() {
+ const configuredProfiles = this.spec?.profileSpec?.filter((p) => p.requested > 0) || [];
+
+ if (configuredProfiles.length === 0) {
+ return '';
+ }
+
+ return configuredProfiles
+ .map((profile) => `${ profile.name } * ${ profile.requested }`)
+ .join(', ');
+ }
+
+ async enableConfig() {
+ try {
+ this.spec.enabled = true;
+ await this.save();
+ } catch (err) {
+ this.$dispatch('growl/fromError', {
+ title: this.t('generic.notification.title.error', { name: escapeHtml(this.name) }),
+ err,
+ }, { root: true });
+ }
+ }
+
+ async disableConfig() {
+ const { enabled: currentEnabled } = this.spec;
+
+ try {
+ this.spec.enabled = false;
+ await this.save();
+ } catch (err) {
+ this.spec.enabled = currentEnabled;
+ this.$dispatch('growl/fromError', {
+ title: this.t('generic.notification.title.error', { name: escapeHtml(this.name) }),
+ err,
+ }, { root: true });
+ }
+ }
+}
diff --git a/pkg/harvester/types.ts b/pkg/harvester/types.ts
index b8f8908a..b4f7c6ea 100644
--- a/pkg/harvester/types.ts
+++ b/pkg/harvester/types.ts
@@ -44,6 +44,7 @@ export const HCI = {
SR_IOVGPU_DEVICE: 'devices.harvesterhci.io.sriovgpudevice',
USB_DEVICE: 'devices.harvesterhci.io.usbdevice',
USB_CLAIM: 'devices.harvesterhci.io.usbdeviceclaim',
+ MIG_CONFIGURATION: 'devices.harvesterhci.io.migconfiguration',
VLAN_CONFIG: 'network.harvesterhci.io.vlanconfig',
VLAN_STATUS: 'network.harvesterhci.io.vlanstatus',
ADD_ONS: 'harvesterhci.io.addon',
@@ -53,7 +54,7 @@ export const HCI = {
LB: 'loadbalancer.harvesterhci.io.loadbalancer',
IP_POOL: 'loadbalancer.harvesterhci.io.ippool',
HARVESTER_CONFIG: 'rke-machine-config.cattle.io.harvesterconfig',
- LVM_VOLUME_GROUP: 'harvesterhci.io.lvmvolumegroup'
+ LVM_VOLUME_GROUP: 'harvesterhci.io.lvmvolumegroup',
};
export const VOLUME_SNAPSHOT = 'snapshot.storage.k8s.io.volumesnapshot';