This commit is contained in:
		@@ -13,20 +13,13 @@ enum VMDisksError {
 | 
				
			|||||||
    Config(&'static str),
 | 
					    Config(&'static str),
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Type of disk allocation
 | 
					 | 
				
			||||||
#[derive(Copy, Clone, Debug, serde::Serialize, serde::Deserialize, Eq, PartialEq)]
 | 
					 | 
				
			||||||
pub enum VMDiskAllocType {
 | 
					 | 
				
			||||||
    Fixed,
 | 
					 | 
				
			||||||
    Sparse,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/// Disk allocation type
 | 
					/// Disk allocation type
 | 
				
			||||||
#[derive(serde::Serialize, serde::Deserialize)]
 | 
					#[derive(serde::Serialize, serde::Deserialize)]
 | 
				
			||||||
#[serde(tag = "format")]
 | 
					#[serde(tag = "format")]
 | 
				
			||||||
pub enum VMDiskFormat {
 | 
					pub enum VMDiskFormat {
 | 
				
			||||||
    Raw {
 | 
					    Raw {
 | 
				
			||||||
        /// Type of disk allocation
 | 
					        /// Is raw file a sparse file?
 | 
				
			||||||
        alloc_type: VMDiskAllocType,
 | 
					        is_sparse: bool,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    QCow2,
 | 
					    QCow2,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -61,12 +54,7 @@ impl VMFileDisk {
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            format: match info.format {
 | 
					            format: match info.format {
 | 
				
			||||||
                DiskFileFormat::Raw { is_sparse } => VMDiskFormat::Raw {
 | 
					                DiskFileFormat::Raw { is_sparse } => VMDiskFormat::Raw { is_sparse },
 | 
				
			||||||
                    alloc_type: match is_sparse {
 | 
					 | 
				
			||||||
                        true => VMDiskAllocType::Sparse,
 | 
					 | 
				
			||||||
                        false => VMDiskAllocType::Fixed,
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                DiskFileFormat::QCow2 { .. } => VMDiskFormat::QCow2,
 | 
					                DiskFileFormat::QCow2 { .. } => VMDiskFormat::QCow2,
 | 
				
			||||||
                _ => anyhow::bail!("Unsupported image format: {:?}", info.format),
 | 
					                _ => anyhow::bail!("Unsupported image format: {:?}", info.format),
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
@@ -131,9 +119,7 @@ impl VMFileDisk {
 | 
				
			|||||||
        DiskFileInfo::create(
 | 
					        DiskFileInfo::create(
 | 
				
			||||||
            &file,
 | 
					            &file,
 | 
				
			||||||
            match self.format {
 | 
					            match self.format {
 | 
				
			||||||
                VMDiskFormat::Raw { alloc_type } => DiskFileFormat::Raw {
 | 
					                VMDiskFormat::Raw { is_sparse } => DiskFileFormat::Raw { is_sparse },
 | 
				
			||||||
                    is_sparse: alloc_type == VMDiskAllocType::Sparse,
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                VMDiskFormat::QCow2 => DiskFileFormat::QCow2 {
 | 
					                VMDiskFormat::QCow2 => DiskFileFormat::QCow2 {
 | 
				
			||||||
                    virtual_size: self.size,
 | 
					                    virtual_size: self.size,
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,11 +29,9 @@ export interface BaseFileVMDisk {
 | 
				
			|||||||
  deleteType?: "keepfile" | "deletefile";
 | 
					  deleteType?: "keepfile" | "deletefile";
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export type DiskAllocType = "Sparse" | "Fixed";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
interface RawVMDisk {
 | 
					interface RawVMDisk {
 | 
				
			||||||
  format: "Raw";
 | 
					  format: "Raw";
 | 
				
			||||||
  alloc_type: DiskAllocType;
 | 
					  is_sparse: boolean;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface QCow2Disk {
 | 
					interface QCow2Disk {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,6 @@ import { ServerApi } from "../api/ServerApi";
 | 
				
			|||||||
import { VMFileDisk, VMInfo } from "../api/VMApi";
 | 
					import { VMFileDisk, VMInfo } from "../api/VMApi";
 | 
				
			||||||
import { useAlert } from "../hooks/providers/AlertDialogProvider";
 | 
					import { useAlert } from "../hooks/providers/AlertDialogProvider";
 | 
				
			||||||
import { useLoadingMessage } from "../hooks/providers/LoadingMessageProvider";
 | 
					import { useLoadingMessage } from "../hooks/providers/LoadingMessageProvider";
 | 
				
			||||||
import { useSnackbar } from "../hooks/providers/SnackbarProvider";
 | 
					 | 
				
			||||||
import { FileDiskImageWidget } from "../widgets/FileDiskImageWidget";
 | 
					import { FileDiskImageWidget } from "../widgets/FileDiskImageWidget";
 | 
				
			||||||
import { CheckboxInput } from "../widgets/forms/CheckboxInput";
 | 
					import { CheckboxInput } from "../widgets/forms/CheckboxInput";
 | 
				
			||||||
import { SelectInput } from "../widgets/forms/SelectInput";
 | 
					import { SelectInput } from "../widgets/forms/SelectInput";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,13 +13,14 @@ import {
 | 
				
			|||||||
  Tooltip,
 | 
					  Tooltip,
 | 
				
			||||||
} from "@mui/material";
 | 
					} from "@mui/material";
 | 
				
			||||||
import { filesize } from "filesize";
 | 
					import { filesize } from "filesize";
 | 
				
			||||||
 | 
					import React from "react";
 | 
				
			||||||
import { ServerApi } from "../../api/ServerApi";
 | 
					import { ServerApi } from "../../api/ServerApi";
 | 
				
			||||||
import { VMFileDisk, VMInfo, VMState } from "../../api/VMApi";
 | 
					import { VMFileDisk, VMInfo, VMState } from "../../api/VMApi";
 | 
				
			||||||
 | 
					import { ConvertDiskImageDialog } from "../../dialogs/ConvertDiskImageDialog";
 | 
				
			||||||
import { useConfirm } from "../../hooks/providers/ConfirmDialogProvider";
 | 
					import { useConfirm } from "../../hooks/providers/ConfirmDialogProvider";
 | 
				
			||||||
 | 
					import { CheckboxInput } from "./CheckboxInput";
 | 
				
			||||||
import { SelectInput } from "./SelectInput";
 | 
					import { SelectInput } from "./SelectInput";
 | 
				
			||||||
import { TextInput } from "./TextInput";
 | 
					import { TextInput } from "./TextInput";
 | 
				
			||||||
import React from "react";
 | 
					 | 
				
			||||||
import { ConvertDiskImageDialog } from "../../dialogs/ConvertDiskImageDialog";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function VMDisksList(p: {
 | 
					export function VMDisksList(p: {
 | 
				
			||||||
  vm: VMInfo;
 | 
					  vm: VMInfo;
 | 
				
			||||||
@@ -166,7 +167,9 @@ function DiskInfo(p: {
 | 
				
			|||||||
            </>
 | 
					            </>
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          secondary={`${filesize(p.disk.size)} - ${p.disk.format}${
 | 
					          secondary={`${filesize(p.disk.size)} - ${p.disk.format}${
 | 
				
			||||||
            p.disk.format == "Raw" ? " - " + p.disk.alloc_type : ""
 | 
					            p.disk.format == "Raw"
 | 
				
			||||||
 | 
					              ? " - " + (p.disk.is_sparse ? "Sparse" : "Fixed")
 | 
				
			||||||
 | 
					              : ""
 | 
				
			||||||
          }`}
 | 
					          }`}
 | 
				
			||||||
        />
 | 
					        />
 | 
				
			||||||
      </ListItem>
 | 
					      </ListItem>
 | 
				
			||||||
@@ -218,21 +221,20 @@ function DiskInfo(p: {
 | 
				
			|||||||
        value={p.disk.format}
 | 
					        value={p.disk.format}
 | 
				
			||||||
        onValueChange={(v) => {
 | 
					        onValueChange={(v) => {
 | 
				
			||||||
          p.disk.format = v as any;
 | 
					          p.disk.format = v as any;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          if (p.disk.format === "Raw") p.disk.is_sparse = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          p.onChange?.();
 | 
					          p.onChange?.();
 | 
				
			||||||
        }}
 | 
					        }}
 | 
				
			||||||
      />
 | 
					      />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      {p.disk.format === "Raw" && (
 | 
					      {p.disk.format === "Raw" && (
 | 
				
			||||||
        <SelectInput
 | 
					        <CheckboxInput
 | 
				
			||||||
          editable={true}
 | 
					          editable
 | 
				
			||||||
          label="File allocation type"
 | 
					          label="Sparse file"
 | 
				
			||||||
          options={[
 | 
					          checked={p.disk.is_sparse}
 | 
				
			||||||
            { label: "Sparse allocation", value: "Sparse" },
 | 
					 | 
				
			||||||
            { label: "Fixed allocation", value: "Fixed" },
 | 
					 | 
				
			||||||
          ]}
 | 
					 | 
				
			||||||
          value={p.disk.alloc_type}
 | 
					 | 
				
			||||||
          onValueChange={(v) => {
 | 
					          onValueChange={(v) => {
 | 
				
			||||||
            if (p.disk.format === "Raw") p.disk.alloc_type = v as any;
 | 
					            if (p.disk.format === "Raw") p.disk.is_sparse = v;
 | 
				
			||||||
            p.onChange?.();
 | 
					            p.onChange?.();
 | 
				
			||||||
          }}
 | 
					          }}
 | 
				
			||||||
        />
 | 
					        />
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user