github.com/kim0/docker@v0.6.2-0.20161130212042-4addda3f07e7/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/docker/api/types"
    12  	"github.com/docker/docker/api/types/filters"
    13  	types "github.com/docker/docker/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  	var flags types.UpdateFlags
    70  
    71  	if value := r.URL.Query().Get("rotateWorkerToken"); value != "" {
    72  		rot, err := strconv.ParseBool(value)
    73  		if err != nil {
    74  			return fmt.Errorf("invalid value for rotateWorkerToken: %s", value)
    75  		}
    76  
    77  		flags.RotateWorkerToken = rot
    78  	}
    79  
    80  	if value := r.URL.Query().Get("rotateManagerToken"); value != "" {
    81  		rot, err := strconv.ParseBool(value)
    82  		if err != nil {
    83  			return fmt.Errorf("invalid value for rotateManagerToken: %s", value)
    84  		}
    85  
    86  		flags.RotateManagerToken = rot
    87  	}
    88  
    89  	if err := sr.backend.Update(version, swarm, flags); err != nil {
    90  		logrus.Errorf("Error configuring swarm: %v", err)
    91  		return err
    92  	}
    93  	return nil
    94  }
    95  
    96  func (sr *swarmRouter) getServices(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
    97  	if err := httputils.ParseForm(r); err != nil {
    98  		return err
    99  	}
   100  	filter, err := filters.FromParam(r.Form.Get("filters"))
   101  	if err != nil {
   102  		return err
   103  	}
   104  
   105  	services, err := sr.backend.GetServices(basictypes.ServiceListOptions{Filter: filter})
   106  	if err != nil {
   107  		logrus.Errorf("Error getting services: %v", err)
   108  		return err
   109  	}
   110  
   111  	return httputils.WriteJSON(w, http.StatusOK, services)
   112  }
   113  
   114  func (sr *swarmRouter) getService(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   115  	service, err := sr.backend.GetService(vars["id"])
   116  	if err != nil {
   117  		logrus.Errorf("Error getting service %s: %v", vars["id"], err)
   118  		return err
   119  	}
   120  
   121  	return httputils.WriteJSON(w, http.StatusOK, service)
   122  }
   123  
   124  func (sr *swarmRouter) createService(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   125  	var service types.ServiceSpec
   126  	if err := json.NewDecoder(r.Body).Decode(&service); err != nil {
   127  		return err
   128  	}
   129  
   130  	// Get returns "" if the header does not exist
   131  	encodedAuth := r.Header.Get("X-Registry-Auth")
   132  
   133  	id, err := sr.backend.CreateService(service, encodedAuth)
   134  	if err != nil {
   135  		logrus.Errorf("Error creating service %s: %v", service.Name, err)
   136  		return err
   137  	}
   138  
   139  	return httputils.WriteJSON(w, http.StatusCreated, &basictypes.ServiceCreateResponse{
   140  		ID: id,
   141  	})
   142  }
   143  
   144  func (sr *swarmRouter) updateService(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   145  	var service types.ServiceSpec
   146  	if err := json.NewDecoder(r.Body).Decode(&service); err != nil {
   147  		return err
   148  	}
   149  
   150  	rawVersion := r.URL.Query().Get("version")
   151  	version, err := strconv.ParseUint(rawVersion, 10, 64)
   152  	if err != nil {
   153  		return fmt.Errorf("Invalid service version '%s': %s", rawVersion, err.Error())
   154  	}
   155  
   156  	// Get returns "" if the header does not exist
   157  	encodedAuth := r.Header.Get("X-Registry-Auth")
   158  
   159  	registryAuthFrom := r.URL.Query().Get("registryAuthFrom")
   160  
   161  	if err := sr.backend.UpdateService(vars["id"], version, service, encodedAuth, registryAuthFrom); err != nil {
   162  		logrus.Errorf("Error updating service %s: %v", vars["id"], err)
   163  		return err
   164  	}
   165  	return nil
   166  }
   167  
   168  func (sr *swarmRouter) removeService(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   169  	if err := sr.backend.RemoveService(vars["id"]); err != nil {
   170  		logrus.Errorf("Error removing service %s: %v", vars["id"], err)
   171  		return err
   172  	}
   173  	return nil
   174  }
   175  
   176  func (sr *swarmRouter) getNodes(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   177  	if err := httputils.ParseForm(r); err != nil {
   178  		return err
   179  	}
   180  	filter, err := filters.FromParam(r.Form.Get("filters"))
   181  	if err != nil {
   182  		return err
   183  	}
   184  
   185  	nodes, err := sr.backend.GetNodes(basictypes.NodeListOptions{Filter: filter})
   186  	if err != nil {
   187  		logrus.Errorf("Error getting nodes: %v", err)
   188  		return err
   189  	}
   190  
   191  	return httputils.WriteJSON(w, http.StatusOK, nodes)
   192  }
   193  
   194  func (sr *swarmRouter) getNode(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   195  	node, err := sr.backend.GetNode(vars["id"])
   196  	if err != nil {
   197  		logrus.Errorf("Error getting node %s: %v", vars["id"], err)
   198  		return err
   199  	}
   200  
   201  	return httputils.WriteJSON(w, http.StatusOK, node)
   202  }
   203  
   204  func (sr *swarmRouter) updateNode(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   205  	var node types.NodeSpec
   206  	if err := json.NewDecoder(r.Body).Decode(&node); err != nil {
   207  		return err
   208  	}
   209  
   210  	rawVersion := r.URL.Query().Get("version")
   211  	version, err := strconv.ParseUint(rawVersion, 10, 64)
   212  	if err != nil {
   213  		return fmt.Errorf("Invalid node version '%s': %s", rawVersion, err.Error())
   214  	}
   215  
   216  	if err := sr.backend.UpdateNode(vars["id"], version, node); err != nil {
   217  		logrus.Errorf("Error updating node %s: %v", vars["id"], err)
   218  		return err
   219  	}
   220  	return nil
   221  }
   222  
   223  func (sr *swarmRouter) removeNode(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   224  	if err := httputils.ParseForm(r); err != nil {
   225  		return err
   226  	}
   227  
   228  	force := httputils.BoolValue(r, "force")
   229  
   230  	if err := sr.backend.RemoveNode(vars["id"], force); err != nil {
   231  		logrus.Errorf("Error removing node %s: %v", vars["id"], err)
   232  		return err
   233  	}
   234  	return nil
   235  }
   236  
   237  func (sr *swarmRouter) getTasks(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   238  	if err := httputils.ParseForm(r); err != nil {
   239  		return err
   240  	}
   241  	filter, err := filters.FromParam(r.Form.Get("filters"))
   242  	if err != nil {
   243  		return err
   244  	}
   245  
   246  	tasks, err := sr.backend.GetTasks(basictypes.TaskListOptions{Filter: filter})
   247  	if err != nil {
   248  		logrus.Errorf("Error getting tasks: %v", err)
   249  		return err
   250  	}
   251  
   252  	return httputils.WriteJSON(w, http.StatusOK, tasks)
   253  }
   254  
   255  func (sr *swarmRouter) getTask(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   256  	task, err := sr.backend.GetTask(vars["id"])
   257  	if err != nil {
   258  		logrus.Errorf("Error getting task %s: %v", vars["id"], err)
   259  		return err
   260  	}
   261  
   262  	return httputils.WriteJSON(w, http.StatusOK, task)
   263  }