1+ using System . ComponentModel . DataAnnotations . Schema ;
2+
3+ namespace GithubActionsOrchestrator . Database ;
4+ using Microsoft . EntityFrameworkCore ;
5+ using System ;
6+
7+ public class ActionsRunnerContext ( )
8+ : DbContext
9+ {
10+ public DbSet < Runner > Runners { get ; set ; }
11+ public DbSet < Job > Jobs { get ; set ; }
12+ public DbSet < RunnerLifecycle > RunnerLifecycles { get ; set ; }
13+
14+
15+
16+ protected override void OnConfiguring ( DbContextOptionsBuilder options )
17+ => options . UseNpgsql ( Program . Config . DbConnectionString ) ;
18+
19+ protected override void OnModelCreating ( ModelBuilder modelBuilder )
20+ {
21+ modelBuilder . Entity < Runner > ( )
22+ . HasOne ( r => r . Job )
23+ . WithOne ( )
24+ . HasForeignKey < Runner > ( r => r . JobId )
25+ . IsRequired ( false ) ;
26+
27+ modelBuilder . Entity < Job > ( )
28+ . HasOne ( j => j . Runner )
29+ . WithOne ( )
30+ . HasForeignKey < Job > ( j => j . RunnerId )
31+ . IsRequired ( false ) ;
32+ }
33+
34+ public async Task < Runner > LinkJobToRunner ( long jobId , string runnerName )
35+ {
36+ try
37+ {
38+ var job = await Jobs . Include ( x => x . Runner ) . FirstOrDefaultAsync ( x => x . GithubJobId == jobId ) ;
39+ var runner = await Runners . Include ( x => x . Job ) . Include ( x => x . Lifecycle ) . FirstOrDefaultAsync ( x => x . Hostname == runnerName ) ;
40+ runner . Job = job ;
41+ job . Runner = runner ;
42+ job . InProgressTime = DateTime . UtcNow ;
43+ runner . Lifecycle . Add ( new ( )
44+ {
45+ Event = $ "Runner got picked by job { jobId } ",
46+ Status = RunnerStatus . Processing ,
47+ EventTimeUtc = DateTime . UtcNow
48+ } ) ;
49+ await SaveChangesAsync ( ) ;
50+ return runner ;
51+ }
52+ catch
53+ {
54+ // unable to link
55+ return null ;
56+ }
57+
58+ }
59+
60+ }
61+
62+ // Runners provisioned over time
0 commit comments