github.com/vieux/docker@v0.6.3-0.20161004191708-e097c2a938c7/daemon/checkpoint.go (about)

     1  package daemon
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  
    10  	"github.com/docker/docker/api/types"
    11  )
    12  
    13  // CheckpointCreate checkpoints the process running in a container with CRIU
    14  func (daemon *Daemon) CheckpointCreate(name string, config types.CheckpointCreateOptions) error {
    15  	container, err := daemon.GetContainer(name)
    16  	if err != nil {
    17  		return err
    18  	}
    19  
    20  	if !container.IsRunning() {
    21  		return fmt.Errorf("Container %s not running", name)
    22  	}
    23  
    24  	err = daemon.containerd.CreateCheckpoint(container.ID, config.CheckpointID, container.CheckpointDir(), config.Exit)
    25  	if err != nil {
    26  		return fmt.Errorf("Cannot checkpoint container %s: %s", name, err)
    27  	}
    28  
    29  	daemon.LogContainerEvent(container, "checkpoint")
    30  
    31  	return nil
    32  }
    33  
    34  // CheckpointDelete deletes the specified checkpoint
    35  func (daemon *Daemon) CheckpointDelete(name string, checkpoint string) error {
    36  	container, err := daemon.GetContainer(name)
    37  	if err != nil {
    38  		return err
    39  	}
    40  
    41  	checkpointDir := container.CheckpointDir()
    42  	return os.RemoveAll(filepath.Join(checkpointDir, checkpoint))
    43  }
    44  
    45  // CheckpointList lists all checkpoints of the specified container
    46  func (daemon *Daemon) CheckpointList(name string) ([]types.Checkpoint, error) {
    47  	var out []types.Checkpoint
    48  
    49  	container, err := daemon.GetContainer(name)
    50  	if err != nil {
    51  		return nil, err
    52  	}
    53  
    54  	checkpointDir := container.CheckpointDir()
    55  	if err := os.MkdirAll(checkpointDir, 0755); err != nil {
    56  		return nil, err
    57  	}
    58  
    59  	dirs, err := ioutil.ReadDir(checkpointDir)
    60  	if err != nil {
    61  		return nil, err
    62  	}
    63  
    64  	for _, d := range dirs {
    65  		if !d.IsDir() {
    66  			continue
    67  		}
    68  		path := filepath.Join(checkpointDir, d.Name(), "config.json")
    69  		data, err := ioutil.ReadFile(path)
    70  		if err != nil {
    71  			return nil, err
    72  		}
    73  		var cpt types.Checkpoint
    74  		if err := json.Unmarshal(data, &cpt); err != nil {
    75  			return nil, err
    76  		}
    77  		out = append(out, cpt)
    78  	}
    79  
    80  	return out, nil
    81  }