github.com/kobeld/docker@v1.12.0-rc1/daemon/graphdriver/proxy.go (about)

     1  // +build experimental
     2  
     3  package graphdriver
     4  
     5  import (
     6  	"errors"
     7  	"fmt"
     8  
     9  	"github.com/docker/docker/pkg/archive"
    10  )
    11  
    12  type graphDriverProxy struct {
    13  	name   string
    14  	client pluginClient
    15  }
    16  
    17  type graphDriverRequest struct {
    18  	ID         string `json:",omitempty"`
    19  	Parent     string `json:",omitempty"`
    20  	MountLabel string `json:",omitempty"`
    21  }
    22  
    23  type graphDriverResponse struct {
    24  	Err      string            `json:",omitempty"`
    25  	Dir      string            `json:",omitempty"`
    26  	Exists   bool              `json:",omitempty"`
    27  	Status   [][2]string       `json:",omitempty"`
    28  	Changes  []archive.Change  `json:",omitempty"`
    29  	Size     int64             `json:",omitempty"`
    30  	Metadata map[string]string `json:",omitempty"`
    31  }
    32  
    33  type graphDriverInitRequest struct {
    34  	Home string
    35  	Opts []string
    36  }
    37  
    38  func (d *graphDriverProxy) Init(home string, opts []string) error {
    39  	args := &graphDriverInitRequest{
    40  		Home: home,
    41  		Opts: opts,
    42  	}
    43  	var ret graphDriverResponse
    44  	if err := d.client.Call("GraphDriver.Init", args, &ret); err != nil {
    45  		return err
    46  	}
    47  	if ret.Err != "" {
    48  		return errors.New(ret.Err)
    49  	}
    50  	return nil
    51  }
    52  
    53  func (d *graphDriverProxy) String() string {
    54  	return d.name
    55  }
    56  
    57  func (d *graphDriverProxy) CreateReadWrite(id, parent, mountLabel string, storageOpt map[string]string) error {
    58  	args := &graphDriverRequest{
    59  		ID:         id,
    60  		Parent:     parent,
    61  		MountLabel: mountLabel,
    62  	}
    63  	var ret graphDriverResponse
    64  	if err := d.client.Call("GraphDriver.CreateReadWrite", args, &ret); err != nil {
    65  		return err
    66  	}
    67  	if ret.Err != "" {
    68  		return errors.New(ret.Err)
    69  	}
    70  	return nil
    71  }
    72  
    73  func (d *graphDriverProxy) Create(id, parent, mountLabel string, storageOpt map[string]string) error {
    74  	args := &graphDriverRequest{
    75  		ID:         id,
    76  		Parent:     parent,
    77  		MountLabel: mountLabel,
    78  	}
    79  	var ret graphDriverResponse
    80  	if err := d.client.Call("GraphDriver.Create", args, &ret); err != nil {
    81  		return err
    82  	}
    83  	if ret.Err != "" {
    84  		return errors.New(ret.Err)
    85  	}
    86  	return nil
    87  }
    88  
    89  func (d *graphDriverProxy) Remove(id string) error {
    90  	args := &graphDriverRequest{ID: id}
    91  	var ret graphDriverResponse
    92  	if err := d.client.Call("GraphDriver.Remove", args, &ret); err != nil {
    93  		return err
    94  	}
    95  	if ret.Err != "" {
    96  		return errors.New(ret.Err)
    97  	}
    98  	return nil
    99  }
   100  
   101  func (d *graphDriverProxy) Get(id, mountLabel string) (string, error) {
   102  	args := &graphDriverRequest{
   103  		ID:         id,
   104  		MountLabel: mountLabel,
   105  	}
   106  	var ret graphDriverResponse
   107  	if err := d.client.Call("GraphDriver.Get", args, &ret); err != nil {
   108  		return "", err
   109  	}
   110  	var err error
   111  	if ret.Err != "" {
   112  		err = errors.New(ret.Err)
   113  	}
   114  	return ret.Dir, err
   115  }
   116  
   117  func (d *graphDriverProxy) Put(id string) error {
   118  	args := &graphDriverRequest{ID: id}
   119  	var ret graphDriverResponse
   120  	if err := d.client.Call("GraphDriver.Put", args, &ret); err != nil {
   121  		return err
   122  	}
   123  	if ret.Err != "" {
   124  		return errors.New(ret.Err)
   125  	}
   126  	return nil
   127  }
   128  
   129  func (d *graphDriverProxy) Exists(id string) bool {
   130  	args := &graphDriverRequest{ID: id}
   131  	var ret graphDriverResponse
   132  	if err := d.client.Call("GraphDriver.Exists", args, &ret); err != nil {
   133  		return false
   134  	}
   135  	return ret.Exists
   136  }
   137  
   138  func (d *graphDriverProxy) Status() [][2]string {
   139  	args := &graphDriverRequest{}
   140  	var ret graphDriverResponse
   141  	if err := d.client.Call("GraphDriver.Status", args, &ret); err != nil {
   142  		return nil
   143  	}
   144  	return ret.Status
   145  }
   146  
   147  func (d *graphDriverProxy) GetMetadata(id string) (map[string]string, error) {
   148  	args := &graphDriverRequest{
   149  		ID: id,
   150  	}
   151  	var ret graphDriverResponse
   152  	if err := d.client.Call("GraphDriver.GetMetadata", args, &ret); err != nil {
   153  		return nil, err
   154  	}
   155  	if ret.Err != "" {
   156  		return nil, errors.New(ret.Err)
   157  	}
   158  	return ret.Metadata, nil
   159  }
   160  
   161  func (d *graphDriverProxy) Cleanup() error {
   162  	args := &graphDriverRequest{}
   163  	var ret graphDriverResponse
   164  	if err := d.client.Call("GraphDriver.Cleanup", args, &ret); err != nil {
   165  		return nil
   166  	}
   167  	if ret.Err != "" {
   168  		return errors.New(ret.Err)
   169  	}
   170  	return nil
   171  }
   172  
   173  func (d *graphDriverProxy) Diff(id, parent string) (archive.Archive, error) {
   174  	args := &graphDriverRequest{
   175  		ID:     id,
   176  		Parent: parent,
   177  	}
   178  	body, err := d.client.Stream("GraphDriver.Diff", args)
   179  	if err != nil {
   180  		return nil, err
   181  	}
   182  	return archive.Archive(body), nil
   183  }
   184  
   185  func (d *graphDriverProxy) Changes(id, parent string) ([]archive.Change, error) {
   186  	args := &graphDriverRequest{
   187  		ID:     id,
   188  		Parent: parent,
   189  	}
   190  	var ret graphDriverResponse
   191  	if err := d.client.Call("GraphDriver.Changes", args, &ret); err != nil {
   192  		return nil, err
   193  	}
   194  	if ret.Err != "" {
   195  		return nil, errors.New(ret.Err)
   196  	}
   197  
   198  	return ret.Changes, nil
   199  }
   200  
   201  func (d *graphDriverProxy) ApplyDiff(id, parent string, diff archive.Reader) (int64, error) {
   202  	var ret graphDriverResponse
   203  	if err := d.client.SendFile(fmt.Sprintf("GraphDriver.ApplyDiff?id=%s&parent=%s", id, parent), diff, &ret); err != nil {
   204  		return -1, err
   205  	}
   206  	if ret.Err != "" {
   207  		return -1, errors.New(ret.Err)
   208  	}
   209  	return ret.Size, nil
   210  }
   211  
   212  func (d *graphDriverProxy) DiffSize(id, parent string) (int64, error) {
   213  	args := &graphDriverRequest{
   214  		ID:     id,
   215  		Parent: parent,
   216  	}
   217  	var ret graphDriverResponse
   218  	if err := d.client.Call("GraphDriver.DiffSize", args, &ret); err != nil {
   219  		return -1, err
   220  	}
   221  	if ret.Err != "" {
   222  		return -1, errors.New(ret.Err)
   223  	}
   224  	return ret.Size, nil
   225  }