/// <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;
        }
예제 #2
0
        /// <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;
        }