Skip to content

Commit

Permalink
Merge pull request #16569 from rst0git/run-checkpoint-image-v2
Browse files Browse the repository at this point in the history
Add support for checkpoint images with 'podman run'
  • Loading branch information
openshift-merge-robot authored Dec 7, 2022
2 parents 5b6a03f + a93a390 commit 4096d04
Show file tree
Hide file tree
Showing 3 changed files with 407 additions and 0 deletions.
39 changes: 39 additions & 0 deletions pkg/domain/infra/abi/containers.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"os"
"reflect"
"strconv"
"sync"
"time"
Expand Down Expand Up @@ -1110,6 +1111,44 @@ func (ic *ContainerEngine) ContainerRun(ctx context.Context, opts entities.Conta
fmt.Fprintf(os.Stderr, "%s\n", w)
}

if opts.Spec != nil && !reflect.ValueOf(opts.Spec).IsNil() {
// If this is a checkpoint image, restore it.
img, resolvedImageName := opts.Spec.GetImage()
if img != nil && resolvedImageName != "" {
imgData, err := img.Inspect(ctx, nil)
if err != nil {
return nil, err
}
if imgData != nil {
_, isCheckpointImage := imgData.Annotations[define.CheckpointAnnotationRuntimeName]
if isCheckpointImage {
var restoreOptions entities.RestoreOptions
restoreOptions.Name = opts.Spec.Name
restoreOptions.Pod = opts.Spec.Pod
responses, err := ic.ContainerRestore(ctx, []string{resolvedImageName}, restoreOptions)
if err != nil {
return nil, err
}

report := entities.ContainerRunReport{}
for _, r := range responses {
report.Id = r.Id
report.ExitCode = 0
if r.Err != nil {
logrus.Errorf("Failed to restore checkpoint image %s: %v", resolvedImageName, r.Err)
report.ExitCode = 126
}
if r.RawInput != "" {
logrus.Errorf("Failed to restore checkpoint image %s: %v", resolvedImageName, r.RawInput)
report.ExitCode = 126
}
}
return &report, nil
}
}
}
}

rtSpec, spec, optsN, err := generate.MakeContainer(ctx, ic.Libpod, opts.Spec, false, nil)
if err != nil {
return nil, err
Expand Down
25 changes: 25 additions & 0 deletions pkg/domain/infra/tunnel/containers.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"fmt"
"io"
"os"
"reflect"
"strconv"
"strings"
"sync"
Expand Down Expand Up @@ -790,6 +791,30 @@ func (ic *ContainerEngine) ContainerListExternal(ctx context.Context) ([]entitie
}

func (ic *ContainerEngine) ContainerRun(ctx context.Context, opts entities.ContainerRunOptions) (*entities.ContainerRunReport, error) {
if opts.Spec != nil && !reflect.ValueOf(opts.Spec).IsNil() && opts.Spec.RawImageName != "" {
// If this is a checkpoint image, restore it.
getImageOptions := new(images.GetOptions).WithSize(false)
inspectReport, err := images.GetImage(ic.ClientCtx, opts.Spec.RawImageName, getImageOptions)
if err != nil {
return nil, fmt.Errorf("no such container or image: %s", opts.Spec.RawImageName)
}
if inspectReport != nil {
_, isCheckpointImage := inspectReport.Annotations[define.CheckpointAnnotationRuntimeName]
if isCheckpointImage {
restoreOptions := new(containers.RestoreOptions)
restoreOptions.WithName(opts.Spec.Name)
restoreOptions.WithPod(opts.Spec.Pod)

restoreReport, err := containers.Restore(ic.ClientCtx, inspectReport.ID, restoreOptions)
if err != nil {
return nil, err
}
runReport := entities.ContainerRunReport{Id: restoreReport.Id}
return &runReport, nil
}
}
}

con, err := containers.CreateWithSpec(ic.ClientCtx, opts.Spec, nil)
if err != nil {
return nil, err
Expand Down
Loading

0 comments on commit 4096d04

Please sign in to comment.