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  }