github.com/ncdc/docker@v0.10.1-0.20160129113957-6c6729ef5b74/integration-cli/docker_cli_volume_driver_compat_unix_test.go (about)

     1  // +build !windows
     2  
     3  package main
     4  
     5  import (
     6  	"encoding/json"
     7  	"fmt"
     8  	"io"
     9  	"io/ioutil"
    10  	"net/http"
    11  	"net/http/httptest"
    12  	"os"
    13  	"path/filepath"
    14  	"strings"
    15  
    16  	"github.com/docker/docker/pkg/integration/checker"
    17  
    18  	"github.com/go-check/check"
    19  )
    20  
    21  func init() {
    22  	check.Suite(&DockerExternalVolumeSuiteCompatV1_1{
    23  		ds: &DockerSuite{},
    24  	})
    25  }
    26  
    27  type DockerExternalVolumeSuiteCompatV1_1 struct {
    28  	server *httptest.Server
    29  	ds     *DockerSuite
    30  	d      *Daemon
    31  	ec     *eventCounter
    32  }
    33  
    34  func (s *DockerExternalVolumeSuiteCompatV1_1) SetUpTest(c *check.C) {
    35  	s.d = NewDaemon(c)
    36  	s.ec = &eventCounter{}
    37  }
    38  
    39  func (s *DockerExternalVolumeSuiteCompatV1_1) TearDownTest(c *check.C) {
    40  	s.d.Stop()
    41  	s.ds.TearDownTest(c)
    42  }
    43  
    44  func (s *DockerExternalVolumeSuiteCompatV1_1) SetUpSuite(c *check.C) {
    45  	mux := http.NewServeMux()
    46  	s.server = httptest.NewServer(mux)
    47  
    48  	type pluginRequest struct {
    49  		Name string
    50  	}
    51  
    52  	type pluginResp struct {
    53  		Mountpoint string `json:",omitempty"`
    54  		Err        string `json:",omitempty"`
    55  	}
    56  
    57  	type vol struct {
    58  		Name       string
    59  		Mountpoint string
    60  	}
    61  	var volList []vol
    62  
    63  	read := func(b io.ReadCloser) (pluginRequest, error) {
    64  		defer b.Close()
    65  		var pr pluginRequest
    66  		if err := json.NewDecoder(b).Decode(&pr); err != nil {
    67  			return pr, err
    68  		}
    69  		return pr, nil
    70  	}
    71  
    72  	send := func(w http.ResponseWriter, data interface{}) {
    73  		switch t := data.(type) {
    74  		case error:
    75  			http.Error(w, t.Error(), 500)
    76  		case string:
    77  			w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json")
    78  			fmt.Fprintln(w, t)
    79  		default:
    80  			w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json")
    81  			json.NewEncoder(w).Encode(&data)
    82  		}
    83  	}
    84  
    85  	mux.HandleFunc("/Plugin.Activate", func(w http.ResponseWriter, r *http.Request) {
    86  		s.ec.activations++
    87  		send(w, `{"Implements": ["VolumeDriver"]}`)
    88  	})
    89  
    90  	mux.HandleFunc("/VolumeDriver.Create", func(w http.ResponseWriter, r *http.Request) {
    91  		s.ec.creations++
    92  		pr, err := read(r.Body)
    93  		if err != nil {
    94  			send(w, err)
    95  			return
    96  		}
    97  		volList = append(volList, vol{Name: pr.Name})
    98  		send(w, nil)
    99  	})
   100  
   101  	mux.HandleFunc("/VolumeDriver.Remove", func(w http.ResponseWriter, r *http.Request) {
   102  		s.ec.removals++
   103  		pr, err := read(r.Body)
   104  		if err != nil {
   105  			send(w, err)
   106  			return
   107  		}
   108  
   109  		if err := os.RemoveAll(hostVolumePath(pr.Name)); err != nil {
   110  			send(w, &pluginResp{Err: err.Error()})
   111  			return
   112  		}
   113  
   114  		for i, v := range volList {
   115  			if v.Name == pr.Name {
   116  				if err := os.RemoveAll(hostVolumePath(v.Name)); err != nil {
   117  					send(w, fmt.Sprintf(`{"Err": "%v"}`, err))
   118  					return
   119  				}
   120  				volList = append(volList[:i], volList[i+1:]...)
   121  				break
   122  			}
   123  		}
   124  		send(w, nil)
   125  	})
   126  
   127  	mux.HandleFunc("/VolumeDriver.Path", func(w http.ResponseWriter, r *http.Request) {
   128  		s.ec.paths++
   129  
   130  		pr, err := read(r.Body)
   131  		if err != nil {
   132  			send(w, err)
   133  			return
   134  		}
   135  		p := hostVolumePath(pr.Name)
   136  		send(w, &pluginResp{Mountpoint: p})
   137  	})
   138  
   139  	mux.HandleFunc("/VolumeDriver.Mount", func(w http.ResponseWriter, r *http.Request) {
   140  		s.ec.mounts++
   141  
   142  		pr, err := read(r.Body)
   143  		if err != nil {
   144  			send(w, err)
   145  			return
   146  		}
   147  
   148  		p := hostVolumePath(pr.Name)
   149  		if err := os.MkdirAll(p, 0755); err != nil {
   150  			send(w, &pluginResp{Err: err.Error()})
   151  			return
   152  		}
   153  
   154  		if err := ioutil.WriteFile(filepath.Join(p, "test"), []byte(s.server.URL), 0644); err != nil {
   155  			send(w, err)
   156  			return
   157  		}
   158  
   159  		send(w, &pluginResp{Mountpoint: p})
   160  	})
   161  
   162  	mux.HandleFunc("/VolumeDriver.Unmount", func(w http.ResponseWriter, r *http.Request) {
   163  		s.ec.unmounts++
   164  
   165  		_, err := read(r.Body)
   166  		if err != nil {
   167  			send(w, err)
   168  			return
   169  		}
   170  
   171  		send(w, nil)
   172  	})
   173  
   174  	err := os.MkdirAll("/etc/docker/plugins", 0755)
   175  	c.Assert(err, checker.IsNil)
   176  
   177  	err = ioutil.WriteFile("/etc/docker/plugins/test-external-volume-driver.spec", []byte(s.server.URL), 0644)
   178  	c.Assert(err, checker.IsNil)
   179  }
   180  
   181  func (s *DockerExternalVolumeSuiteCompatV1_1) TearDownSuite(c *check.C) {
   182  	s.server.Close()
   183  
   184  	err := os.RemoveAll("/etc/docker/plugins")
   185  	c.Assert(err, checker.IsNil)
   186  }
   187  
   188  func (s *DockerExternalVolumeSuiteCompatV1_1) TestExternalVolumeDriverCompatV1_1(c *check.C) {
   189  	err := s.d.StartWithBusybox()
   190  	c.Assert(err, checker.IsNil)
   191  
   192  	out, err := s.d.Cmd("run", "--name=test", "-v", "foo:/bar", "--volume-driver", "test-external-volume-driver", "busybox", "sh", "-c", "echo hello > /bar/hello")
   193  	c.Assert(err, checker.IsNil, check.Commentf(out))
   194  	out, err = s.d.Cmd("rm", "test")
   195  	c.Assert(err, checker.IsNil, check.Commentf(out))
   196  
   197  	out, err = s.d.Cmd("run", "--name=test2", "-v", "foo:/bar", "busybox", "cat", "/bar/hello")
   198  	c.Assert(err, checker.IsNil, check.Commentf(out))
   199  	c.Assert(strings.TrimSpace(out), checker.Equals, "hello")
   200  
   201  	err = s.d.Restart()
   202  	c.Assert(err, checker.IsNil)
   203  
   204  	out, err = s.d.Cmd("start", "-a", "test2")
   205  	c.Assert(strings.TrimSpace(out), checker.Equals, "hello")
   206  
   207  	out, err = s.d.Cmd("rm", "test2")
   208  	c.Assert(err, checker.IsNil, check.Commentf(out))
   209  
   210  	out, err = s.d.Cmd("volume", "inspect", "foo")
   211  	c.Assert(err, checker.IsNil, check.Commentf(out))
   212  
   213  	out, err = s.d.Cmd("volume", "rm", "foo")
   214  	c.Assert(err, checker.IsNil, check.Commentf(out))
   215  }