github.com/kobeld/docker@v1.12.0-rc1/api/server/router/swarm/cluster_routes.go (about)

     1  package swarm
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"net/http"
     7  	"strconv"
     8  
     9  	"github.com/Sirupsen/logrus"
    10  	"github.com/docker/docker/api/server/httputils"
    11  	basictypes "github.com/docker/engine-api/types"
    12  	"github.com/docker/engine-api/types/filters"
    13  	types "github.com/docker/engine-api/types/swarm"
    14  	"golang.org/x/net/context"
    15  )
    16  
    17  func (sr *swarmRouter) initCluster(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
    18  	var req types.InitRequest
    19  	if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
    20  		return err
    21  	}
    22  	nodeID, err := sr.backend.Init(req)
    23  	if err != nil {
    24  		logrus.Errorf("Error initializing swarm: %v", err)
    25  		return err
    26  	}
    27  	return httputils.WriteJSON(w, http.StatusOK, nodeID)
    28  }
    29  
    30  func (sr *swarmRouter) joinCluster(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
    31  	var req types.JoinRequest
    32  	if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
    33  		return err
    34  	}
    35  	return sr.backend.Join(req)
    36  }
    37  
    38  func (sr *swarmRouter) leaveCluster(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  
    43  	force := httputils.BoolValue(r, "force")
    44  	return sr.backend.Leave(force)
    45  }
    46  
    47  func (sr *swarmRouter) inspectCluster(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
    48  	swarm, err := sr.backend.Inspect()
    49  	if err != nil {
    50  		logrus.Errorf("Error getting swarm: %v", err)
    51  		return err
    52  	}
    53  
    54  	return httputils.WriteJSON(w, http.StatusOK, swarm)
    55  }
    56  
    57  func (sr *swarmRouter) updateCluster(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
    58  	var swarm types.Spec
    59  	if err := json.NewDecoder(r.Body).Decode(&swarm); err != nil {
    60  		return err
    61  	}
    62  
    63  	rawVersion := r.URL.Query().Get("version")
    64  	version, err := strconv.ParseUint(rawVersion, 10, 64)
    65  	if err != nil {
    66  		return fmt.Errorf("Invalid swarm version '%s': %s", rawVersion, err.Error())
    67  	}
    68  
    69  	if err := sr.backend.Update(version, swarm); err != nil {
    70  		logrus.Errorf("Error configuring swarm: %v", err)
    71  		return err
    72  	}
    73  	return nil
    74  }
    75  
    76  func (sr *swarmRouter) getServices(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
    77  	if err := httputils.ParseForm(r); err != nil {
    78  		return err
    79  	}
    80  	filter, err := filters.FromParam(r.Form.Get("filters"))
    81  	if err != nil {
    82  		return err
    83  	}
    84  
    85  	services, err := sr.backend.GetServices(basictypes.ServiceListOptions{Filter: filter})
    86  	if err != nil {
    87  		logrus.Errorf("Error getting services: %v", err)
    88  		return err
    89  	}
    90  
    91  	return httputils.WriteJSON(w, http.StatusOK, services)
    92  }
    93  
    94  func (sr *swarmRouter) getService(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
    95  	service, err := sr.backend.GetService(vars["id"])
    96  	if err != nil {
    97  		logrus.Errorf("Error getting service %s: %v", vars["id"], err)
    98  		return err
    99  	}
   100  
   101  	return httputils.WriteJSON(w, http.StatusOK, service)
   102  }
   103  
   104  func (sr *swarmRouter) createService(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   105  	var service types.ServiceSpec
   106  	if err := json.NewDecoder(r.Body).Decode(&service); err != nil {
   107  		return err
   108  	}
   109  
   110  	id, err := sr.backend.CreateService(service)
   111  	if err != nil {
   112  		logrus.Errorf("Error reating service %s: %v", id, err)
   113  		return err
   114  	}
   115  
   116  	return httputils.WriteJSON(w, http.StatusCreated, &basictypes.ServiceCreateResponse{
   117  		ID: id,
   118  	})
   119  }
   120  
   121  func (sr *swarmRouter) updateService(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   122  	var service types.ServiceSpec
   123  	if err := json.NewDecoder(r.Body).Decode(&service); err != nil {
   124  		return err
   125  	}
   126  
   127  	rawVersion := r.URL.Query().Get("version")
   128  	version, err := strconv.ParseUint(rawVersion, 10, 64)
   129  	if err != nil {
   130  		return fmt.Errorf("Invalid service version '%s': %s", rawVersion, err.Error())
   131  	}
   132  
   133  	if err := sr.backend.UpdateService(vars["id"], version, service); err != nil {
   134  		logrus.Errorf("Error updating service %s: %v", vars["id"], err)
   135  		return err
   136  	}
   137  	return nil
   138  }
   139  
   140  func (sr *swarmRouter) removeService(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   141  	if err := sr.backend.RemoveService(vars["id"]); err != nil {
   142  		logrus.Errorf("Error removing service %s: %v", vars["id"], err)
   143  		return err
   144  	}
   145  	return nil
   146  }
   147  
   148  func (sr *swarmRouter) getNodes(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   149  	if err := httputils.ParseForm(r); err != nil {
   150  		return err
   151  	}
   152  	filter, err := filters.FromParam(r.Form.Get("filters"))
   153  	if err != nil {
   154  		return err
   155  	}
   156  
   157  	nodes, err := sr.backend.GetNodes(basictypes.NodeListOptions{Filter: filter})
   158  	if err != nil {
   159  		logrus.Errorf("Error getting nodes: %v", err)
   160  		return err
   161  	}
   162  
   163  	return httputils.WriteJSON(w, http.StatusOK, nodes)
   164  }
   165  
   166  func (sr *swarmRouter) getNode(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   167  	node, err := sr.backend.GetNode(vars["id"])
   168  	if err != nil {
   169  		logrus.Errorf("Error getting node %s: %v", vars["id"], err)
   170  		return err
   171  	}
   172  
   173  	return httputils.WriteJSON(w, http.StatusOK, node)
   174  }
   175  
   176  func (sr *swarmRouter) updateNode(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   177  	var node types.NodeSpec
   178  	if err := json.NewDecoder(r.Body).Decode(&node); err != nil {
   179  		return err
   180  	}
   181  
   182  	rawVersion := r.URL.Query().Get("version")
   183  	version, err := strconv.ParseUint(rawVersion, 10, 64)
   184  	if err != nil {
   185  		return fmt.Errorf("Invalid node version '%s': %s", rawVersion, err.Error())
   186  	}
   187  
   188  	if err := sr.backend.UpdateNode(vars["id"], version, node); err != nil {
   189  		logrus.Errorf("Error updating node %s: %v", vars["id"], err)
   190  		return err
   191  	}
   192  	return nil
   193  }
   194  
   195  func (sr *swarmRouter) removeNode(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   196  	if err := sr.backend.RemoveNode(vars["id"]); err != nil {
   197  		logrus.Errorf("Error removing node %s: %v", vars["id"], err)
   198  		return err
   199  	}
   200  	return nil
   201  }
   202  
   203  func (sr *swarmRouter) getTasks(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   204  	if err := httputils.ParseForm(r); err != nil {
   205  		return err
   206  	}
   207  	filter, err := filters.FromParam(r.Form.Get("filters"))
   208  	if err != nil {
   209  		return err
   210  	}
   211  
   212  	tasks, err := sr.backend.GetTasks(basictypes.TaskListOptions{Filter: filter})
   213  	if err != nil {
   214  		logrus.Errorf("Error getting tasks: %v", err)
   215  		return err
   216  	}
   217  
   218  	return httputils.WriteJSON(w, http.StatusOK, tasks)
   219  }
   220  
   221  func (sr *swarmRouter) getTask(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   222  	task, err := sr.backend.GetTask(vars["id"])
   223  	if err != nil {
   224  		logrus.Errorf("Error getting task %s: %v", vars["id"], err)
   225  		return err
   226  	}
   227  
   228  	return httputils.WriteJSON(w, http.StatusOK, task)
   229  }