Handle special mount filtering at a higher level.

closes #2743
This commit is contained in:
Taloth Saldono 2019-03-06 22:34:17 +01:00
parent 6bb649bac5
commit 6698ca400c
4 changed files with 67 additions and 15 deletions

View File

@ -418,7 +418,12 @@ namespace NzbDrone.Common.Disk
return new FileStream(path, FileMode.Create);
}
public virtual List<IMount> GetMounts()
public List<IMount> GetMounts()
{
return GetAllMounts().Where(d => !IsSpecialMount(d)).ToList();
}
protected virtual List<IMount> GetAllMounts()
{
return GetDriveInfoMounts().Where(d => d.DriveType == DriveType.Fixed || d.DriveType == DriveType.Network || d.DriveType == DriveType.Removable)
.Select(d => new DriveInfoMount(d))
@ -426,11 +431,16 @@ namespace NzbDrone.Common.Disk
.ToList();
}
protected virtual bool IsSpecialMount(IMount mount)
{
return false;
}
public virtual IMount GetMount(string path)
{
try
{
var mounts = GetMounts();
var mounts = GetAllMounts();
return mounts.Where(drive => drive.RootDirectory.PathEquals(path) ||
drive.RootDirectory.IsParentPath(path))

View File

@ -1,8 +1,11 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using FluentAssertions;
using Mono.Unix;
using NUnit.Framework;
using NzbDrone.Common.Disk;
using NzbDrone.Common.Test.DiskTests;
using NzbDrone.Mono.Disk;
@ -87,5 +90,37 @@ namespace NzbDrone.Mono.Test.DiskProviderTests
File.ReadAllText(source).Should().Be("Some content");
File.ReadAllText(destination).Should().Be("Some content");
}
private void GivenSpecialMount(string rootDir)
{
Mocker.GetMock<IProcMountProvider>()
.Setup(v => v.GetMounts())
.Returns(new List<IMount> {
new ProcMount(DriveType.Fixed, rootDir, rootDir, "myfs", new MountOptions(new Dictionary<string, string>()))
});
}
[TestCase("/snap/blaat")]
[TestCase("/var/lib/docker/zfs-storage-mount")]
public void should_ignore_special_mounts(string rootDir)
{
GivenSpecialMount(rootDir);
var mounts = Subject.GetMounts();
mounts.Select(d => d.RootDirectory).Should().NotContain(rootDir);
}
[TestCase("/snap/blaat")]
[TestCase("/var/lib/docker/zfs-storage-moun")]
public void should_return_special_mount_when_queried(string rootDir)
{
GivenSpecialMount(rootDir);
var mount = Subject.GetMount(Path.Combine(rootDir, "dir/somefile.mkv"));
mount.Should().NotBeNull();
mount.RootDirectory.Should().Be(rootDir);
}
}
}

View File

@ -75,7 +75,7 @@ namespace NzbDrone.Mono.Disk
SetOwner(path, user, group);
}
public override List<IMount> GetMounts()
protected override List<IMount> GetAllMounts()
{
return _procMountProvider.GetMounts()
.Concat(GetDriveInfoMounts()
@ -87,6 +87,25 @@ namespace NzbDrone.Mono.Disk
.ToList();
}
protected override bool IsSpecialMount(IMount mount)
{
var root = mount.RootDirectory;
if (root.StartsWith("/var/lib/"))
{
// Could be /var/lib/docker when docker uses zfs. Very unlikely that a useful mount is located in /var/lib.
return true;
}
if (root.StartsWith("/snap/"))
{
// Mount point for snap packages
return true;
}
return false;
}
public override long? GetTotalSize(string path)
{
Ensure.That(path, () => path).IsValidPath();

View File

@ -111,18 +111,6 @@ namespace NzbDrone.Mono.Disk
return null;
}
if (mount.StartsWith("/var/lib/"))
{
// Could be /var/lib/docker when docker uses zfs. Very unlikely that a useful mount is located in /var/lib.
return null;
}
if (mount.StartsWith("/snap/"))
{
// Mount point for snap packages
return null;
}
var driveType = FindDriveType.Find(type);
if (name.StartsWith("/dev/") || GetFileSystems().GetValueOrDefault(type, false))