github.com/vieux/docker@v0.6.3-0.20161004191708-e097c2a938c7/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 }