feat(network): Support for listing disk space on a Sonarr instance

This commit is contained in:
2024-11-22 15:54:11 -07:00
parent d96316577a
commit a881d1f33a
17 changed files with 185 additions and 39 deletions
+8 -8
View File
@@ -8,7 +8,7 @@ use urlencoding::encode;
use crate::models::radarr_models::{
AddMovieBody, AddMovieSearchResult, AddOptions, BlocklistResponse, Collection, CollectionMovie,
CommandBody, Credit, CreditType, DeleteMovieParams, DiskSpace, DownloadRecord, DownloadsResponse,
CommandBody, Credit, CreditType, DeleteMovieParams, DownloadRecord, DownloadsResponse,
EditCollectionParams, EditIndexerParams, EditMovieParams, IndexerSettings, IndexerTestResult,
Movie, MovieCommandBody, MovieHistoryItem, RadarrSerdeable, ReleaseDownloadBody, SystemStatus,
Task, TaskName, Update,
@@ -19,8 +19,8 @@ use crate::models::servarr_data::radarr::modals::{
};
use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock;
use crate::models::servarr_models::{
AddRootFolderBody, HostConfig, Indexer, LogResponse, QualityProfile, QueueEvent, Release,
RootFolder, SecurityConfig, Tag,
AddRootFolderBody, DiskSpace, HostConfig, Indexer, LogResponse, QualityProfile, QueueEvent,
Release, RootFolder, SecurityConfig, Tag,
};
use crate::models::stateful_table::StatefulTable;
use crate::models::{HorizontallyScrollableText, Route, Scrollable, ScrollableText};
@@ -61,7 +61,7 @@ pub enum RadarrEvent {
GetMovieDetails(Option<i64>),
GetMovieHistory(Option<i64>),
GetMovies,
GetOverview,
GetDiskSpace,
GetQualityProfiles,
GetQueuedEvents,
GetReleases(Option<i64>),
@@ -107,7 +107,7 @@ impl NetworkResource for RadarrEvent {
RadarrEvent::SearchNewMovie(_) => "/movie/lookup",
RadarrEvent::GetMovieCredits(_) => "/credit",
RadarrEvent::GetMovieHistory(_) => "/history/movie",
RadarrEvent::GetOverview => "/diskspace",
RadarrEvent::GetDiskSpace => "/diskspace",
RadarrEvent::GetQualityProfiles => "/qualityprofile",
RadarrEvent::GetReleases(_) | RadarrEvent::DownloadRelease(_) => "/release",
RadarrEvent::AddRootFolder(_)
@@ -220,7 +220,7 @@ impl<'a, 'b> Network<'a, 'b> {
.await
.map(RadarrSerdeable::from),
RadarrEvent::GetMovies => self.get_movies().await.map(RadarrSerdeable::from),
RadarrEvent::GetOverview => self.get_diskspace().await.map(RadarrSerdeable::from),
RadarrEvent::GetDiskSpace => self.get_radarr_diskspace().await.map(RadarrSerdeable::from),
RadarrEvent::GetQualityProfiles => self
.get_radarr_quality_profiles()
.await
@@ -1368,9 +1368,9 @@ impl<'a, 'b> Network<'a, 'b> {
.await
}
async fn get_diskspace(&mut self) -> Result<Vec<DiskSpace>> {
async fn get_radarr_diskspace(&mut self) -> Result<Vec<DiskSpace>> {
info!("Fetching Radarr disk space");
let event = RadarrEvent::GetOverview;
let event = RadarrEvent::GetDiskSpace;
let request_props = self
.request_props_from(event, RequestMethod::Get, None::<()>, None, None)
+4 -4
View File
@@ -222,7 +222,7 @@ mod test {
#[case(RadarrEvent::SearchNewMovie(None), "/movie/lookup")]
#[case(RadarrEvent::GetMovieCredits(None), "/credit")]
#[case(RadarrEvent::GetMovieHistory(None), "/history/movie")]
#[case(RadarrEvent::GetOverview, "/diskspace")]
#[case(RadarrEvent::GetDiskSpace, "/diskspace")]
#[case(RadarrEvent::GetQualityProfiles, "/qualityprofile")]
#[case(RadarrEvent::GetStatus, "/system/status")]
#[case(RadarrEvent::GetTasks, "/system/task")]
@@ -262,7 +262,7 @@ mod test {
}
#[tokio::test]
async fn test_handle_get_diskspace_event() {
async fn test_handle_get_radarr_diskspace_event() {
let (async_server, app_arc, _server) = mock_servarr_api(
RequestMethod::Get,
None,
@@ -277,7 +277,7 @@ mod test {
}
])),
None,
RadarrEvent::GetOverview,
RadarrEvent::GetDiskSpace,
None,
None,
)
@@ -295,7 +295,7 @@ mod test {
];
if let RadarrSerdeable::DiskSpaces(disk_space) = network
.handle_radarr_event(RadarrEvent::GetOverview)
.handle_radarr_event(RadarrEvent::GetDiskSpace)
.await
.unwrap()
{
+20 -2
View File
@@ -10,8 +10,8 @@ use crate::{
sonarr_data::ActiveSonarrBlock,
},
servarr_models::{
AddRootFolderBody, HostConfig, Indexer, LogResponse, QualityProfile, QueueEvent, Release,
RootFolder, SecurityConfig, Tag,
AddRootFolderBody, DiskSpace, HostConfig, Indexer, LogResponse, QualityProfile, QueueEvent,
Release, RootFolder, SecurityConfig, Tag,
},
sonarr_models::{
BlocklistResponse, DownloadRecord, DownloadsResponse, Episode, IndexerSettings, Series,
@@ -49,6 +49,7 @@ pub enum SonarrEvent {
GetEpisodes(Option<i64>),
GetEpisodeHistory(Option<i64>),
GetLogs(Option<u64>),
GetDiskSpace,
GetQualityProfiles,
GetQueuedEvents,
GetRootFolders,
@@ -77,6 +78,7 @@ impl NetworkResource for SonarrEvent {
SonarrEvent::GetHostConfig | SonarrEvent::GetSecurityConfig => "/config/host",
SonarrEvent::GetIndexers | SonarrEvent::DeleteIndexer(_) => "/indexer",
SonarrEvent::GetLogs(_) => "/log",
SonarrEvent::GetDiskSpace => "/diskspace",
SonarrEvent::GetQualityProfiles => "/qualityprofile",
SonarrEvent::GetQueuedEvents => "/command",
SonarrEvent::GetRootFolders
@@ -163,6 +165,7 @@ impl<'a, 'b> Network<'a, 'b> {
.get_sonarr_logs(events)
.await
.map(SonarrSerdeable::from),
SonarrEvent::GetDiskSpace => self.get_sonarr_diskspace().await.map(SonarrSerdeable::from),
SonarrEvent::GetQualityProfiles => self
.get_sonarr_quality_profiles()
.await
@@ -843,6 +846,21 @@ impl<'a, 'b> Network<'a, 'b> {
.await
}
async fn get_sonarr_diskspace(&mut self) -> Result<Vec<DiskSpace>> {
info!("Fetching Sonarr disk space");
let event = SonarrEvent::GetDiskSpace;
let request_props = self
.request_props_from(event, RequestMethod::Get, None::<()>, None, None)
.await;
self
.handle_request::<(), Vec<DiskSpace>>(request_props, |disk_space_vec, mut app| {
app.data.sonarr_data.disk_space_vec = disk_space_vec;
})
.await
}
async fn get_sonarr_quality_profiles(&mut self) -> Result<Vec<QualityProfile>> {
info!("Fetching Sonarr quality profiles");
let event = SonarrEvent::GetQualityProfiles;
+49 -1
View File
@@ -17,7 +17,7 @@ mod test {
use crate::models::servarr_data::sonarr::modals::{EpisodeDetailsModal, SeasonDetailsModal};
use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock;
use crate::models::servarr_models::{
HostConfig, Indexer, IndexerField, Language, LogResponse, Quality, QualityProfile,
DiskSpace, HostConfig, Indexer, IndexerField, Language, LogResponse, Quality, QualityProfile,
QualityWrapper, QueueEvent, Release, RootFolder, SecurityConfig, Tag,
};
use crate::models::sonarr_models::SystemStatus;
@@ -212,6 +212,7 @@ mod test {
#[case(SonarrEvent::DeleteBlocklistItem(None), "/blocklist")]
#[case(SonarrEvent::HealthCheck, "/health")]
#[case(SonarrEvent::GetBlocklist, "/blocklist?page=1&pageSize=10000")]
#[case(SonarrEvent::GetDiskSpace, "/diskspace")]
#[case(SonarrEvent::GetSeriesHistory(None), "/history/series")]
#[case(SonarrEvent::GetLogs(Some(500)), "/log")]
#[case(SonarrEvent::GetQualityProfiles, "/qualityprofile")]
@@ -784,6 +785,53 @@ mod test {
}
}
#[tokio::test]
async fn test_handle_get_sonarr_diskspace_event() {
let (async_server, app_arc, _server) = mock_servarr_api(
RequestMethod::Get,
None,
Some(json!([
{
"freeSpace": 1111,
"totalSpace": 2222,
},
{
"freeSpace": 3333,
"totalSpace": 4444
}
])),
None,
SonarrEvent::GetDiskSpace,
None,
None,
)
.await;
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
let disk_space_vec = vec![
DiskSpace {
free_space: 1111,
total_space: 2222,
},
DiskSpace {
free_space: 3333,
total_space: 4444,
},
];
if let SonarrSerdeable::DiskSpaces(disk_space) = network
.handle_sonarr_event(SonarrEvent::GetDiskSpace)
.await
.unwrap()
{
async_server.assert_async().await;
assert_eq!(
app_arc.lock().await.data.sonarr_data.disk_space_vec,
disk_space_vec
);
assert_eq!(disk_space, disk_space_vec);
}
}
#[tokio::test]
async fn test_handle_get_sonarr_healthcheck_event() {
let (async_server, app_arc, _server) = mock_servarr_api(