/// <summary>
        /// Adds the specified string collection of file exclusions.</summary>
        /// <param name="writeToDb">If true, the object will be written to the Database.</param>
        public async Task <LogicalVolume> AddLogicalVolume(LogicalVolume volume, bool writeToDb)
        {
            if (LogicalVolumes.Contains(volume))
            {
                return(LogicalVolumes.First(x => x.Equals(volume)));
            }

            LogicalVolumes.Add(volume);
            if (writeToDb)
            {
                await Database.InsertLogicalVolumeAsync(volume);
            }

            return(volume);
        }
        private bool LogicalVolumeLayout()
        {
            var upSizeLock = new Dictionary <string, long>();

            //Try to resize lv to fit inside newly created lvm
            foreach (var volumeGroup in VolumeGroupHelpers)
            {
                //Tell the volume group it has a size of the physical volume to work with * 99% to account for errors to allow alittle over
                //volumeGroup.AgreedPvSizeBlk = Convert.ToInt64(volumeGroup.AgreedPvSizeBlk * .99);
                foreach (var partition in _imageSchema.HardDrives[HdNumberToGet].Partitions)
                {
                    //Find the partition this volume group belongs to
                    if (_imageSchema.HardDrives[HdNumberToGet].Name + partition.Prefix + partition.Number !=
                        volumeGroup.Pv)
                    {
                        continue;
                    }
                    var singleLvVerified = false;

                    var percentCounter = -.1;

                    while (!singleLvVerified)
                    {
                        percentCounter += .1;
                        double totalPvPercentage = 0;
                        LogicalVolumes.Clear();
                        if (!partition.Active)
                        {
                            continue;
                        }

                        var isError = false;
                        foreach (var lv in partition.VolumeGroup.LogicalVolumes)
                        {
                            if (!lv.Active)
                            {
                                continue;
                            }

                            var clientPartitionLv = new ClientLogicalVolume
                            {
                                Name   = lv.Name,
                                Vg     = lv.VolumeGroup,
                                Uuid   = lv.Uuid,
                                VgUuid = volumeGroup.Uuid,
                                FsType = lv.FsType
                            };

                            var logicalVolumeHelper = new ServiceClientPartition(_imageProfile).LogicalVolume(lv, LbsByte,
                                                                                                              _newHdSize, HdNumberToGet);
                            var percentOfPvForThisLv = (double)logicalVolumeHelper.MinSizeBlk /
                                                       volumeGroup.AgreedPvSizeBlk;
                            var tmpClientPartitionSizeLvBlk = logicalVolumeHelper.MinSizeBlk;

                            if (volumeGroup.IsFusion)
                            {
                                clientPartitionLv.Size = 0;
                                LogicalVolumes.Add(clientPartitionLv);
                                singleLvVerified = true;
                                continue;
                            }

                            if (upSizeLock.ContainsKey(lv.Name))
                            {
                                tmpClientPartitionSizeLvBlk = upSizeLock[lv.Name];
                            }
                            else
                            {
                                if (logicalVolumeHelper.IsDynamicSize)
                                {
                                    clientPartitionLv.SizeIsDynamic = true;
                                    var percentOfOrigDrive = Convert.ToInt64(lv.Size) /
                                                             (double)
                                                             Convert.ToInt64(
                                        _imageSchema.HardDrives[HdNumberToGet].Size);

                                    if (Convert.ToInt64(NewHdBlk * percentOfOrigDrive) < logicalVolumeHelper.MinSizeBlk)
                                    {
                                        //This will never work because each loop only gets smaller
                                        tmpClientPartitionSizeLvBlk =
                                            Convert.ToInt64(NewHdBlk * (percentOfOrigDrive + percentCounter / 100));

                                        if (logicalVolumeHelper.MinSizeBlk < tmpClientPartitionSizeLvBlk)
                                        {
                                            upSizeLock.Add(lv.Name, tmpClientPartitionSizeLvBlk);
                                        }
                                    }
                                    else
                                    {
                                        if (percentOfOrigDrive - percentCounter / 100 <= 0)
                                        {
                                            tmpClientPartitionSizeLvBlk =
                                                Convert.ToInt64(NewHdBlk * percentOfOrigDrive);
                                        }
                                        else
                                        {
                                            tmpClientPartitionSizeLvBlk =
                                                Convert.ToInt64(NewHdBlk *
                                                                (percentOfOrigDrive - percentCounter / 100));
                                        }
                                    }
                                    percentOfPvForThisLv = (double)tmpClientPartitionSizeLvBlk /
                                                           volumeGroup.AgreedPvSizeBlk;
                                }
                            }

                            if (logicalVolumeHelper.MinSizeBlk > tmpClientPartitionSizeLvBlk)
                            {
                                isError = true;
                                break;
                            }

                            clientPartitionLv.Size = tmpClientPartitionSizeLvBlk;
                            totalPvPercentage     += percentOfPvForThisLv;
                            LogicalVolumes.Add(clientPartitionLv);
                        }

                        //Could not determine a partition layout that works with this hard drive
                        if (isError && percentCounter > 99)
                        {
                            return(false);
                        }

                        //This partition size doesn't work, continuation of break from earlier
                        if (isError)
                        {
                            continue;
                        }

                        if (totalPvPercentage <= 1)
                        {
                            long totalAllocatedBlk     = 0;
                            var  dynamicPartitionCount = 0;
                            //If totalPercentage is too far below 1 try to increase size of available resizable partitions
                            if (totalPvPercentage < .95)
                            {
                                foreach (var lv in LogicalVolumes)
                                {
                                    totalAllocatedBlk += Convert.ToInt64(lv.Size);
                                    if (lv.SizeIsDynamic)
                                    {
                                        dynamicPartitionCount++;
                                    }
                                }
                                var totalUnallocated = volumeGroup.AgreedPvSizeBlk - totalAllocatedBlk;
                                if (dynamicPartitionCount > 0)
                                {
                                    foreach (var lv in LogicalVolumes.Where(lv => lv.SizeIsDynamic))
                                    {
                                        lv.Size = lv.Size + totalUnallocated / dynamicPartitionCount;
                                    }
                                }
                            }
                            singleLvVerified = true;
                        }

                        //Theoretically should never hit this, but added to prevent infinite loop
                        if (percentCounter > 100)
                        {
                            return(false);
                        }
                    }
                }
            }
            return(true);
        }