github.com/yasker/longhorn-engine@v0.0.0-20160621014712-6ed6cfca0729/agent/controller/rest/snapshot.go (about) 1 package rest 2 3 import ( 4 "bufio" 5 "fmt" 6 "net/http" 7 "os" 8 "os/exec" 9 10 "github.com/gorilla/mux" 11 12 "github.com/rancher/go-rancher/api" 13 "github.com/rancher/go-rancher/client" 14 ) 15 16 func (s *Server) ListSnapshots(rw http.ResponseWriter, req *http.Request) error { 17 apiContext := api.GetApiContext(req) 18 snapshots, err := s.listSnapshot(apiContext) 19 if err != nil { 20 return err 21 } 22 apiContext.Write(&client.GenericCollection{ 23 Data: []interface{}{ 24 snapshots, 25 }, 26 }) 27 return nil 28 } 29 30 func (s *Server) GetSnapshot(rw http.ResponseWriter, req *http.Request) error { 31 apiContext := api.GetApiContext(req) 32 vars := mux.Vars(req) 33 id, ok := vars["id"] 34 if !ok { 35 return fmt.Errorf("Snapshot id not supplied.") 36 } 37 38 snap, err := s.getSnapshot(apiContext, id) 39 if err != nil { 40 return err 41 } 42 43 if snap == nil { 44 rw.WriteHeader(http.StatusNotFound) 45 return nil 46 } 47 48 apiContext.Write(snap) 49 return nil 50 } 51 52 func (s *Server) CreateSnapshot(rw http.ResponseWriter, req *http.Request) error { 53 apiContext := api.GetApiContext(req) 54 var snapshot snapshot 55 if err := apiContext.Read(&snapshot); err != nil { 56 return err 57 } 58 59 name, err := s.controllerClient.Snapshot(snapshot.Name) 60 if err != nil { 61 return err 62 } 63 64 apiContext.Write(newSnapshot(apiContext, name)) 65 66 return nil 67 } 68 69 func (s *Server) DeleteSnapshot(rw http.ResponseWriter, req *http.Request) error { 70 apiContext := api.GetApiContext(req) 71 vars := mux.Vars(req) 72 id, ok := vars["id"] 73 if !ok { 74 return fmt.Errorf("Snapshot id not supplied.") 75 } 76 77 snapshot, err := s.getSnapshot(apiContext, id) 78 if err != nil { 79 return err 80 } 81 82 if snapshot == nil { 83 rw.WriteHeader(http.StatusNotFound) 84 return nil 85 } 86 87 cmd := exec.Command("longhorn", "snapshots", "rm", snapshot.Id) 88 cmd.Stderr = os.Stderr 89 cmd.Stdout = os.Stdout 90 if err := cmd.Run(); err != nil { 91 return err 92 } 93 94 rw.WriteHeader(http.StatusNoContent) 95 return nil 96 } 97 98 func (s *Server) listSnapshot(context *api.ApiContext) ([]*snapshot, error) { 99 cmd := exec.Command("longhorn", "snapshots") 100 cmd.Stderr = os.Stderr 101 output, err := cmd.StdoutPipe() 102 if err != nil { 103 return nil, err 104 } 105 106 if err := cmd.Start(); err != nil { 107 return nil, err 108 } 109 110 scanner := bufio.NewScanner(output) 111 first := true 112 snapshots := []*snapshot{} 113 for scanner.Scan() { 114 if first { 115 first = false 116 continue 117 } 118 119 name := scanner.Text() 120 snap := newSnapshot(context, name) 121 snapshots = append(snapshots, snap) 122 } 123 124 if err := cmd.Wait(); err != nil { 125 return nil, err 126 } 127 128 if err := scanner.Err(); err != nil { 129 return nil, err 130 } 131 132 return snapshots, nil 133 } 134 135 func (s *Server) getSnapshot(context *api.ApiContext, id string) (*snapshot, error) { 136 snapshots, err := s.listSnapshot(context) 137 if err != nil { 138 return nil, err 139 } 140 for _, s := range snapshots { 141 if s.Id == id { 142 return s, nil 143 } 144 } 145 return nil, nil 146 }