@@ -478,6 +478,27 @@ pub(crate) fn get_base_commit(repo: &ostree::Repo, commit: &str) -> Result<Optio
478
478
Ok ( r)
479
479
}
480
480
481
+ #[ context( "Loading deployment into kexec" ) ]
482
+ async fn kexec_load ( sysroot : & Storage , deployment : & Deployment ) -> Result < ( ) > {
483
+ // Clone all the things to move to worker thread
484
+ let sysroot = sysroot. sysroot . clone ( ) ;
485
+ // ostree::Deployment is incorrently !Send 😢 so convert it to an integer
486
+ let deployment_index = deployment. index ( ) as usize ;
487
+
488
+ async_task_with_spinner (
489
+ "Deploying" ,
490
+ spawn_blocking_cancellable_flatten ( move |cancellable| -> Result < ( ) > {
491
+ let deployments = sysroot. deployments ( ) ;
492
+ let deployment = & deployments[ deployment_index] ;
493
+
494
+ sysroot. deployment_kexec_load ( & deployment, Some ( cancellable) ) ?;
495
+ Ok ( ( ) )
496
+ } ) ,
497
+ )
498
+ . await ?;
499
+ Ok ( ( ) )
500
+ }
501
+
481
502
#[ context( "Writing deployment" ) ]
482
503
async fn deploy (
483
504
sysroot : & Storage ,
@@ -552,6 +573,12 @@ fn origin_from_imageref(imgref: &ImageReference) -> Result<glib::KeyFile> {
552
573
Ok ( origin)
553
574
}
554
575
576
+ #[ derive( Debug , Clone , Default ) ]
577
+ #[ non_exhaustive]
578
+ pub ( crate ) struct StageOptions {
579
+ pub ( crate ) deploy_kexec : bool ,
580
+ }
581
+
555
582
/// Stage (queue deployment of) a fetched container image.
556
583
#[ context( "Staging" ) ]
557
584
pub ( crate ) async fn stage (
@@ -560,7 +587,11 @@ pub(crate) async fn stage(
560
587
image : & ImageState ,
561
588
spec : & RequiredHostSpec < ' _ > ,
562
589
prog : ProgressWriter ,
590
+ StageOptions { deploy_kexec } : StageOptions ,
563
591
) -> Result < ( ) > {
592
+ let steps_total = 4 + ( deploy_kexec as u64 ) ;
593
+ let mut steps = 0 ;
594
+
564
595
let mut subtask = SubTaskStep {
565
596
subtask : "merging" . into ( ) ,
566
597
description : "Merging Image" . into ( ) ,
@@ -574,7 +605,7 @@ pub(crate) async fn stage(
574
605
id : image. manifest_digest . clone ( ) . as_ref ( ) . into ( ) ,
575
606
steps_cached : 0 ,
576
607
steps : 0 ,
577
- steps_total : 3 ,
608
+ steps_total,
578
609
subtasks : subtasks
579
610
. clone ( )
580
611
. into_iter ( )
@@ -590,13 +621,14 @@ pub(crate) async fn stage(
590
621
subtask. id = "deploying" . into ( ) ;
591
622
subtask. description = "Deploying Image" . into ( ) ;
592
623
subtask. completed = false ;
624
+ steps += 1 ;
593
625
prog. send ( Event :: ProgressSteps {
594
626
task : "staging" . into ( ) ,
595
627
description : "Deploying Image" . into ( ) ,
596
628
id : image. manifest_digest . clone ( ) . as_ref ( ) . into ( ) ,
597
629
steps_cached : 0 ,
598
- steps : 1 ,
599
- steps_total : 3 ,
630
+ steps,
631
+ steps_total,
600
632
subtasks : subtasks
601
633
. clone ( )
602
634
. into_iter ( )
@@ -620,13 +652,14 @@ pub(crate) async fn stage(
620
652
subtask. id = "bound_images" . into ( ) ;
621
653
subtask. description = "Pulling Bound Images" . into ( ) ;
622
654
subtask. completed = false ;
655
+ steps += 1 ;
623
656
prog. send ( Event :: ProgressSteps {
624
657
task : "staging" . into ( ) ,
625
658
description : "Deploying Image" . into ( ) ,
626
659
id : image. manifest_digest . clone ( ) . as_ref ( ) . into ( ) ,
627
660
steps_cached : 0 ,
628
- steps : 1 ,
629
- steps_total : 3 ,
661
+ steps,
662
+ steps_total,
630
663
subtasks : subtasks
631
664
. clone ( )
632
665
. into_iter ( )
@@ -642,13 +675,14 @@ pub(crate) async fn stage(
642
675
subtask. id = "cleanup" . into ( ) ;
643
676
subtask. description = "Removing old images" . into ( ) ;
644
677
subtask. completed = false ;
678
+ steps += 1 ;
645
679
prog. send ( Event :: ProgressSteps {
646
680
task : "staging" . into ( ) ,
647
681
description : "Deploying Image" . into ( ) ,
648
682
id : image. manifest_digest . clone ( ) . as_ref ( ) . into ( ) ,
649
683
steps_cached : 0 ,
650
- steps : 2 ,
651
- steps_total : 3 ,
684
+ steps,
685
+ steps_total,
652
686
subtasks : subtasks
653
687
. clone ( )
654
688
. into_iter ( )
@@ -663,15 +697,41 @@ pub(crate) async fn stage(
663
697
}
664
698
println ! ( " Digest: {}" , image. manifest_digest) ;
665
699
700
+ if deploy_kexec {
701
+ subtask. completed = true ;
702
+ subtasks. push ( subtask. clone ( ) ) ;
703
+ subtask. subtask = "kexec" . into ( ) ;
704
+ subtask. id = "kexec" . into ( ) ;
705
+ subtask. description = "Loading image into kexec" . into ( ) ;
706
+ subtask. completed = false ;
707
+ steps += 1 ;
708
+ prog. send ( Event :: ProgressSteps {
709
+ task : "staging" . into ( ) ,
710
+ description : "Deploying Image" . into ( ) ,
711
+ id : image. manifest_digest . clone ( ) . as_ref ( ) . into ( ) ,
712
+ steps_cached : 0 ,
713
+ steps,
714
+ steps_total,
715
+ subtasks : subtasks
716
+ . clone ( )
717
+ . into_iter ( )
718
+ . chain ( [ subtask. clone ( ) ] )
719
+ . collect ( ) ,
720
+ } )
721
+ . await ;
722
+ crate :: deploy:: kexec_load ( sysroot, & deployment) . await ?;
723
+ }
724
+
666
725
subtask. completed = true ;
667
726
subtasks. push ( subtask. clone ( ) ) ;
727
+ steps += 1 ;
668
728
prog. send ( Event :: ProgressSteps {
669
729
task : "staging" . into ( ) ,
670
730
description : "Deploying Image" . into ( ) ,
671
731
id : image. manifest_digest . clone ( ) . as_ref ( ) . into ( ) ,
672
732
steps_cached : 0 ,
673
- steps : 3 ,
674
- steps_total : 3 ,
733
+ steps,
734
+ steps_total,
675
735
subtasks : subtasks
676
736
. clone ( )
677
737
. into_iter ( )
0 commit comments