Skip to content

Commit 4096d04

Browse files
Merge pull request #16569 from rst0git/run-checkpoint-image-v2
Add support for checkpoint images with 'podman run'
2 parents 5b6a03f + a93a390 commit 4096d04

File tree

3 files changed

+407
-0
lines changed

3 files changed

+407
-0
lines changed

pkg/domain/infra/abi/containers.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"errors"
66
"fmt"
77
"os"
8+
"reflect"
89
"strconv"
910
"sync"
1011
"time"
@@ -1110,6 +1111,44 @@ func (ic *ContainerEngine) ContainerRun(ctx context.Context, opts entities.Conta
11101111
fmt.Fprintf(os.Stderr, "%s\n", w)
11111112
}
11121113

1114+
if opts.Spec != nil && !reflect.ValueOf(opts.Spec).IsNil() {
1115+
// If this is a checkpoint image, restore it.
1116+
img, resolvedImageName := opts.Spec.GetImage()
1117+
if img != nil && resolvedImageName != "" {
1118+
imgData, err := img.Inspect(ctx, nil)
1119+
if err != nil {
1120+
return nil, err
1121+
}
1122+
if imgData != nil {
1123+
_, isCheckpointImage := imgData.Annotations[define.CheckpointAnnotationRuntimeName]
1124+
if isCheckpointImage {
1125+
var restoreOptions entities.RestoreOptions
1126+
restoreOptions.Name = opts.Spec.Name
1127+
restoreOptions.Pod = opts.Spec.Pod
1128+
responses, err := ic.ContainerRestore(ctx, []string{resolvedImageName}, restoreOptions)
1129+
if err != nil {
1130+
return nil, err
1131+
}
1132+
1133+
report := entities.ContainerRunReport{}
1134+
for _, r := range responses {
1135+
report.Id = r.Id
1136+
report.ExitCode = 0
1137+
if r.Err != nil {
1138+
logrus.Errorf("Failed to restore checkpoint image %s: %v", resolvedImageName, r.Err)
1139+
report.ExitCode = 126
1140+
}
1141+
if r.RawInput != "" {
1142+
logrus.Errorf("Failed to restore checkpoint image %s: %v", resolvedImageName, r.RawInput)
1143+
report.ExitCode = 126
1144+
}
1145+
}
1146+
return &report, nil
1147+
}
1148+
}
1149+
}
1150+
}
1151+
11131152
rtSpec, spec, optsN, err := generate.MakeContainer(ctx, ic.Libpod, opts.Spec, false, nil)
11141153
if err != nil {
11151154
return nil, err

pkg/domain/infra/tunnel/containers.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77
"io"
88
"os"
9+
"reflect"
910
"strconv"
1011
"strings"
1112
"sync"
@@ -790,6 +791,30 @@ func (ic *ContainerEngine) ContainerListExternal(ctx context.Context) ([]entitie
790791
}
791792

792793
func (ic *ContainerEngine) ContainerRun(ctx context.Context, opts entities.ContainerRunOptions) (*entities.ContainerRunReport, error) {
794+
if opts.Spec != nil && !reflect.ValueOf(opts.Spec).IsNil() && opts.Spec.RawImageName != "" {
795+
// If this is a checkpoint image, restore it.
796+
getImageOptions := new(images.GetOptions).WithSize(false)
797+
inspectReport, err := images.GetImage(ic.ClientCtx, opts.Spec.RawImageName, getImageOptions)
798+
if err != nil {
799+
return nil, fmt.Errorf("no such container or image: %s", opts.Spec.RawImageName)
800+
}
801+
if inspectReport != nil {
802+
_, isCheckpointImage := inspectReport.Annotations[define.CheckpointAnnotationRuntimeName]
803+
if isCheckpointImage {
804+
restoreOptions := new(containers.RestoreOptions)
805+
restoreOptions.WithName(opts.Spec.Name)
806+
restoreOptions.WithPod(opts.Spec.Pod)
807+
808+
restoreReport, err := containers.Restore(ic.ClientCtx, inspectReport.ID, restoreOptions)
809+
if err != nil {
810+
return nil, err
811+
}
812+
runReport := entities.ContainerRunReport{Id: restoreReport.Id}
813+
return &runReport, nil
814+
}
815+
}
816+
}
817+
793818
con, err := containers.CreateWithSpec(ic.ClientCtx, opts.Spec, nil)
794819
if err != nil {
795820
return nil, err

0 commit comments

Comments
 (0)