diff --git a/databuild/dashboard/pages.ts b/databuild/dashboard/pages.ts index 3b0e1bd..623ffb9 100644 --- a/databuild/dashboard/pages.ts +++ b/databuild/dashboard/pages.ts @@ -13,6 +13,7 @@ export const RecentActivity = { console.log('RecentActivity: Starting loadData, loading=', this.loading); this.loading = true; this.error = null; + m.redraw(); // Redraw to show loading state const service = DashboardService.getInstance(); console.log('RecentActivity: Got service instance, calling getRecentActivity'); @@ -23,11 +24,13 @@ export const RecentActivity = { this.data = data; this.loading = false; console.log('RecentActivity: Data loaded, loading=', this.loading, 'data=', !!this.data); + m.redraw(); // Explicitly redraw after data loads }) .catch(error => { console.error('RecentActivity: Error in loadData:', error); this.error = error instanceof Error ? error.message : 'Failed to load data'; this.loading = false; + m.redraw(); // Redraw after error }); }, diff --git a/databuild/dashboard/services.ts b/databuild/dashboard/services.ts index 026b01e..f2da894 100644 --- a/databuild/dashboard/services.ts +++ b/databuild/dashboard/services.ts @@ -57,14 +57,14 @@ export class DashboardService { const recentBuilds: BuildRequest[] = activityResponse.recentBuilds.map((build: BuildSummary) => ({ id: build.buildRequestId, status: build.status, - createdAt: new Date(build.createdAt * 1000).toISOString(), // Convert from Unix timestamp - updatedAt: new Date(build.updatedAt * 1000).toISOString() + createdAt: new Date(build.createdAt / 1000000).toISOString(), // Convert from nanoseconds to milliseconds + updatedAt: new Date(build.updatedAt / 1000000).toISOString() })); const recentPartitions: PartitionBuild[] = activityResponse.recentPartitions.map((partition: PartitionSummary) => ({ ref: partition.partitionRef, status: partition.status, - updatedAt: new Date(partition.updatedAt * 1000).toISOString(), + updatedAt: new Date(partition.updatedAt / 1000000).toISOString(), buildRequestId: partition.buildRequestId || undefined })); diff --git a/databuild/event_log/sqlite.rs b/databuild/event_log/sqlite.rs index 9775b15..1d2a045 100644 --- a/databuild/event_log/sqlite.rs +++ b/databuild/event_log/sqlite.rs @@ -4,27 +4,29 @@ use rusqlite::{params, Connection, Row}; use serde_json; use std::sync::{Arc, Mutex}; -// Helper functions to convert strings back to enum values -fn string_to_build_request_status(s: &str) -> BuildRequestStatus { - match s { - "BuildRequestReceived" => BuildRequestStatus::BuildRequestReceived, - "BuildRequestPlanning" => BuildRequestStatus::BuildRequestPlanning, - "BuildRequestExecuting" => BuildRequestStatus::BuildRequestExecuting, - "BuildRequestCompleted" => BuildRequestStatus::BuildRequestCompleted, - "BuildRequestFailed" => BuildRequestStatus::BuildRequestFailed, - "BuildRequestCancelled" => BuildRequestStatus::BuildRequestCancelled, +// Helper functions to convert integer values back to enum values +fn int_to_build_request_status(i: i32) -> BuildRequestStatus { + match i { + 0 => BuildRequestStatus::BuildRequestUnknown, + 1 => BuildRequestStatus::BuildRequestReceived, + 2 => BuildRequestStatus::BuildRequestPlanning, + 3 => BuildRequestStatus::BuildRequestExecuting, + 4 => BuildRequestStatus::BuildRequestCompleted, + 5 => BuildRequestStatus::BuildRequestFailed, + 6 => BuildRequestStatus::BuildRequestCancelled, _ => BuildRequestStatus::BuildRequestUnknown, } } -fn string_to_partition_status(s: &str) -> PartitionStatus { - match s { - "PartitionRequested" => PartitionStatus::PartitionRequested, - "PartitionScheduled" => PartitionStatus::PartitionScheduled, - "PartitionBuilding" => PartitionStatus::PartitionBuilding, - "PartitionAvailable" => PartitionStatus::PartitionAvailable, - "PartitionFailed" => PartitionStatus::PartitionFailed, - "PartitionDelegated" => PartitionStatus::PartitionDelegated, +fn int_to_partition_status(i: i32) -> PartitionStatus { + match i { + 0 => PartitionStatus::PartitionUnknown, + 1 => PartitionStatus::PartitionRequested, + 2 => PartitionStatus::PartitionScheduled, + 3 => PartitionStatus::PartitionBuilding, + 4 => PartitionStatus::PartitionAvailable, + 5 => PartitionStatus::PartitionFailed, + 6 => PartitionStatus::PartitionDelegated, _ => PartitionStatus::PartitionUnknown, } } @@ -465,9 +467,14 @@ impl BuildEventLog for SqliteBuildEventLog { .map_err(|e| BuildEventLogError::QueryError(e.to_string()))?; let build_row_mapper = |row: &Row| -> rusqlite::Result { + let status_str: String = row.get(1)?; + let status = status_str.parse::() + .map(int_to_build_request_status) + .unwrap_or(BuildRequestStatus::BuildRequestUnknown); + Ok(BuildRequestSummary { build_request_id: row.get(0)?, - status: string_to_build_request_status(&row.get::<_, String>(1)?), + status, requested_partitions: serde_json::from_str(&row.get::<_, String>(2)?).unwrap_or_default(), created_at: row.get(3)?, updated_at: row.get(4)?, @@ -535,9 +542,14 @@ impl BuildEventLog for SqliteBuildEventLog { .map_err(|e| BuildEventLogError::QueryError(e.to_string()))?; let row_mapper = |row: &Row| -> rusqlite::Result { + let status_str: String = row.get(1)?; + let status = status_str.parse::() + .map(int_to_partition_status) + .unwrap_or(PartitionStatus::PartitionUnknown); + Ok(PartitionSummary { partition_ref: row.get(0)?, - status: string_to_partition_status(&row.get::<_, String>(1)?), + status, updated_at: row.get(2)?, build_request_id: Some(row.get(3)?), }) diff --git a/databuild/service/main.rs b/databuild/service/main.rs index 7b53dce..9c02d6e 100644 --- a/databuild/service/main.rs +++ b/databuild/service/main.rs @@ -60,7 +60,11 @@ async fn main() { let port: u16 = matches.get_one::("port").unwrap() .parse().expect("Invalid port number"); let host = matches.get_one::("host").unwrap(); - let event_log_uri = matches.get_one::("event-log").unwrap(); + + // Check environment variable first, fall back to command line argument + let event_log_uri = env::var("DATABUILD_BUILD_EVENT_LOG") + .unwrap_or_else(|_| matches.get_one::("event-log").unwrap().to_string()); + let graph_label = matches.get_one::("graph-label").unwrap().to_string(); let job_lookup_path = matches.get_one::("job-lookup-path").unwrap().to_string(); @@ -110,7 +114,7 @@ async fn main() { // Create service let service = match BuildGraphService::new( - event_log_uri, + &event_log_uri, graph_label, job_lookup_path, candidate_jobs,