volume_routes.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package volume // import "github.com/docker/docker/api/server/router/volume"
  2. import (
  3. "context"
  4. "encoding/json"
  5. "io"
  6. "net/http"
  7. "github.com/docker/docker/api/server/httputils"
  8. "github.com/docker/docker/api/types/filters"
  9. volumetypes "github.com/docker/docker/api/types/volume"
  10. "github.com/docker/docker/errdefs"
  11. "github.com/docker/docker/volume/service/opts"
  12. "github.com/pkg/errors"
  13. )
  14. func (v *volumeRouter) getVolumesList(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
  15. if err := httputils.ParseForm(r); err != nil {
  16. return err
  17. }
  18. filters, err := filters.FromJSON(r.Form.Get("filters"))
  19. if err != nil {
  20. return errdefs.InvalidParameter(errors.Wrap(err, "error reading volume filters"))
  21. }
  22. volumes, warnings, err := v.backend.List(ctx, filters)
  23. if err != nil {
  24. return err
  25. }
  26. return httputils.WriteJSON(w, http.StatusOK, &volumetypes.VolumeListOKBody{Volumes: volumes, Warnings: warnings})
  27. }
  28. func (v *volumeRouter) getVolumeByName(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
  29. if err := httputils.ParseForm(r); err != nil {
  30. return err
  31. }
  32. volume, err := v.backend.Get(ctx, vars["name"], opts.WithGetResolveStatus)
  33. if err != nil {
  34. return err
  35. }
  36. return httputils.WriteJSON(w, http.StatusOK, volume)
  37. }
  38. func (v *volumeRouter) postVolumesCreate(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
  39. if err := httputils.ParseForm(r); err != nil {
  40. return err
  41. }
  42. if err := httputils.CheckForJSON(r); err != nil {
  43. return err
  44. }
  45. var req volumetypes.VolumeCreateBody
  46. if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
  47. if err == io.EOF {
  48. return errdefs.InvalidParameter(errors.New("got EOF while reading request body"))
  49. }
  50. return errdefs.InvalidParameter(err)
  51. }
  52. volume, err := v.backend.Create(ctx, req.Name, req.Driver, opts.WithCreateOptions(req.DriverOpts), opts.WithCreateLabels(req.Labels))
  53. if err != nil {
  54. return err
  55. }
  56. return httputils.WriteJSON(w, http.StatusCreated, volume)
  57. }
  58. func (v *volumeRouter) deleteVolumes(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
  59. if err := httputils.ParseForm(r); err != nil {
  60. return err
  61. }
  62. force := httputils.BoolValue(r, "force")
  63. if err := v.backend.Remove(ctx, vars["name"], opts.WithPurgeOnError(force)); err != nil {
  64. return err
  65. }
  66. w.WriteHeader(http.StatusNoContent)
  67. return nil
  68. }
  69. func (v *volumeRouter) postVolumesPrune(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
  70. if err := httputils.ParseForm(r); err != nil {
  71. return err
  72. }
  73. pruneFilters, err := filters.FromJSON(r.Form.Get("filters"))
  74. if err != nil {
  75. return err
  76. }
  77. pruneReport, err := v.backend.Prune(ctx, pruneFilters)
  78. if err != nil {
  79. return err
  80. }
  81. return httputils.WriteJSON(w, http.StatusOK, pruneReport)
  82. }