github.com/kim0/docker@v0.6.2-0.20161130212042-4addda3f07e7/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  	var checkpointDir string
    25  	if config.CheckpointDir != "" {
    26  		checkpointDir = config.CheckpointDir
    27  	} else {
    28  		checkpointDir = container.CheckpointDir()
    29  	}
    30  
    31  	err = daemon.containerd.CreateCheckpoint(container.ID, config.CheckpointID, checkpointDir, config.Exit)
    32  	if err != nil {
    33  		return fmt.Errorf("Cannot checkpoint container %s: %s", name, err)
    34  	}
    35  
    36  	daemon.LogContainerEvent(container, "checkpoint")
    37  
    38  	return nil
    39  }
    40  
    41  // CheckpointDelete deletes the specified checkpoint
    42  func (daemon *Daemon) CheckpointDelete(name string, config types.CheckpointDeleteOptions) error {
    43  	container, err := daemon.GetContainer(name)
    44  	if err != nil {
    45  		return err
    46  	}
    47  
    48  	var checkpointDir string
    49  	if config.CheckpointDir != "" {
    50  		checkpointDir = config.CheckpointDir
    51  	} else {
    52  		checkpointDir = container.CheckpointDir()
    53  	}
    54  
    55  	return os.RemoveAll(filepath.Join(checkpointDir, config.CheckpointID))
    56  }
    57  
    58  // CheckpointList lists all checkpoints of the specified container
    59  func (daemon *Daemon) CheckpointList(name string, config types.CheckpointListOptions) ([]types.Checkpoint, error) {
    60  	var out []types.Checkpoint
    61  
    62  	container, err := daemon.GetContainer(name)
    63  	if err != nil {
    64  		return nil, err
    65  	}
    66  
    67  	var checkpointDir string
    68  	if config.CheckpointDir != "" {
    69  		checkpointDir = config.CheckpointDir
    70  	} else {
    71  		checkpointDir = container.CheckpointDir()
    72  	}
    73  
    74  	if err := os.MkdirAll(checkpointDir, 0755); err != nil {
    75  		return nil, err
    76  	}
    77  
    78  	dirs, err := ioutil.ReadDir(checkpointDir)
    79  	if err != nil {
    80  		return nil, err
    81  	}
    82  
    83  	for _, d := range dirs {
    84  		if !d.IsDir() {
    85  			continue
    86  		}
    87  		path := filepath.Join(checkpointDir, d.Name(), "config.json")
    88  		data, err := ioutil.ReadFile(path)
    89  		if err != nil {
    90  			return nil, err
    91  		}
    92  		var cpt types.Checkpoint
    93  		if err := json.Unmarshal(data, &cpt); err != nil {
    94  			return nil, err
    95  		}
    96  		out = append(out, cpt)
    97  	}
    98  
    99  	return out, nil
   100  }