/// <summary> /// Calculates the minimum block size required for a volume group by determine the size of each /// logical volume within the volume group. Does not assume that any volume group actually exists. /// Volume Groups don't really have a size, so this ends up being the size of the physical partition. /// I just separated it for clarity. /// </summary> public ClientVolumeGroupHelper VolumeGroup(int hdNumberToGet, int partNumberToGet, long newHdSize) { var lbsByte = _imageSchema.HardDrives[hdNumberToGet].Lbs; var volumeGroupHelper = new ClientVolumeGroupHelper { MinSizeBlk = 0, HasLv = false }; if (_imageSchema.HardDrives[hdNumberToGet].Partitions[partNumberToGet].FsId.ToLower() != "8e" && _imageSchema.HardDrives[hdNumberToGet].Partitions[partNumberToGet].FsId.ToLower() != "8e00") return volumeGroupHelper; if (!_imageSchema.HardDrives[hdNumberToGet].Partitions[partNumberToGet].Active) return volumeGroupHelper; //if part.vg is null, most likely version 2.3.0 beta1 before lvm was added. if (_imageSchema.HardDrives[hdNumberToGet].Partitions[partNumberToGet].VolumeGroup == null) return volumeGroupHelper; //if vg.name is null partition was uploaded at physical partion level, by using the shrink_lvm=false flag if (_imageSchema.HardDrives[hdNumberToGet].Partitions[partNumberToGet].VolumeGroup.Name == null) return volumeGroupHelper; volumeGroupHelper.Name = _imageSchema.HardDrives[hdNumberToGet].Partitions[partNumberToGet].VolumeGroup.Name; foreach (var logicalVolume in _imageSchema.HardDrives[hdNumberToGet].Partitions[partNumberToGet].VolumeGroup.LogicalVolumes) { if (!logicalVolume.Active) continue; volumeGroupHelper.HasLv = true; volumeGroupHelper.Pv = _imageSchema.HardDrives[hdNumberToGet].Partitions[partNumberToGet].VolumeGroup.PhysicalVolume; var logicalVolumeHelper = LogicalVolume(logicalVolume, lbsByte, newHdSize,hdNumberToGet); volumeGroupHelper.MinSizeBlk += logicalVolumeHelper.MinSizeBlk; } if (volumeGroupHelper.HasLv) return volumeGroupHelper; //Could Have VG Without LVs //Set arbitrary minimum size to 100mb volumeGroupHelper.Pv = _imageSchema.HardDrives[hdNumberToGet].Partitions[partNumberToGet].VolumeGroup.PhysicalVolume; volumeGroupHelper.MinSizeBlk = 100 * 1024 * 1024 / lbsByte; return volumeGroupHelper; }
/// <summary> /// Calculates the minimum block size required for a volume group by determine the size of each /// logical volume within the volume group. Does not assume that any volume group actually exists. /// Volume Groups don't really have a size, so this ends up being the size of the physical partition. /// I just separated it for clarity. /// </summary> public ClientVolumeGroupHelper VolumeGroup(int hdNumberToGet, int partNumberToGet, long newHdSize) { var lbsByte = _imageSchema.HardDrives[hdNumberToGet].Lbs; var volumeGroupHelper = new ClientVolumeGroupHelper { MinSizeBlk = 0, HasLv = false }; if (_imageProfile.Image.Environment == "linux" || string.IsNullOrEmpty(_imageProfile.Image.Environment)) { if (_imageSchema.HardDrives[hdNumberToGet].Partitions[partNumberToGet].FsId.ToLower() != "8e" && _imageSchema.HardDrives[hdNumberToGet].Partitions[partNumberToGet].FsId.ToLower() != "8e00") return volumeGroupHelper; } if (!_imageSchema.HardDrives[hdNumberToGet].Partitions[partNumberToGet].Active) return volumeGroupHelper; //if part.vg is null, most likely version 2.3.0 beta1 before lvm was added. if (_imageSchema.HardDrives[hdNumberToGet].Partitions[partNumberToGet].VolumeGroup == null) return volumeGroupHelper; //if vg.name is null partition was uploaded at physical partion level, by using the shrink_lvm=false flag if (_imageSchema.HardDrives[hdNumberToGet].Partitions[partNumberToGet].VolumeGroup.Name == null) return volumeGroupHelper; volumeGroupHelper.Name = _imageSchema.HardDrives[hdNumberToGet].Partitions[partNumberToGet].VolumeGroup.Name; volumeGroupHelper.Uuid = _imageSchema.HardDrives[hdNumberToGet].Partitions[partNumberToGet].VolumeGroup.Uuid; foreach (var logicalVolume in _imageSchema.HardDrives[hdNumberToGet].Partitions[partNumberToGet].VolumeGroup.LogicalVolumes) { if (!logicalVolume.Active) continue; volumeGroupHelper.HasLv = true; volumeGroupHelper.Pv = _imageSchema.HardDrives[hdNumberToGet].Partitions[partNumberToGet].VolumeGroup.PhysicalVolume; var logicalVolumeHelper = LogicalVolume(logicalVolume, lbsByte, newHdSize,hdNumberToGet); volumeGroupHelper.MinSizeBlk += logicalVolumeHelper.MinSizeBlk; //assume fusion drive if (logicalVolume.FsType.ToLower().Contains("hfs") && newHdSize <= 121332826112) volumeGroupHelper.IsFusion = true; } if (volumeGroupHelper.HasLv) return volumeGroupHelper; //Could Have VG Without LVs //Set arbitrary minimum size to 100mb volumeGroupHelper.Pv = _imageSchema.HardDrives[hdNumberToGet].Partitions[partNumberToGet].VolumeGroup.PhysicalVolume; volumeGroupHelper.MinSizeBlk = 100 * 1024 * 1024 / lbsByte; return volumeGroupHelper; }