github.com/portworx/docker@v1.12.1/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  	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", id, 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  	if err := sr.backend.UpdateService(vars["id"], version, service, encodedAuth); err != nil {
   160  		logrus.Errorf("Error updating service %s: %v", vars["id"], err)
   161  		return err
   162  	}
   163  	return nil
   164  }
   165  
   166  func (sr *swarmRouter) removeService(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   167  	if err := sr.backend.RemoveService(vars["id"]); err != nil {
   168  		logrus.Errorf("Error removing service %s: %v", vars["id"], err)
   169  		return err
   170  	}
   171  	return nil
   172  }
   173  
   174  func (sr *swarmRouter) getNodes(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   175  	if err := httputils.ParseForm(r); err != nil {
   176  		return err
   177  	}
   178  	filter, err := filters.FromParam(r.Form.Get("filters"))
   179  	if err != nil {
   180  		return err
   181  	}
   182  
   183  	nodes, err := sr.backend.GetNodes(basictypes.NodeListOptions{Filter: filter})
   184  	if err != nil {
   185  		logrus.Errorf("Error getting nodes: %v", err)
   186  		return err
   187  	}
   188  
   189  	return httputils.WriteJSON(w, http.StatusOK, nodes)
   190  }
   191  
   192  func (sr *swarmRouter) getNode(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   193  	node, err := sr.backend.GetNode(vars["id"])
   194  	if err != nil {
   195  		logrus.Errorf("Error getting node %s: %v", vars["id"], err)
   196  		return err
   197  	}
   198  
   199  	return httputils.WriteJSON(w, http.StatusOK, node)
   200  }
   201  
   202  func (sr *swarmRouter) updateNode(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   203  	var node types.NodeSpec
   204  	if err := json.NewDecoder(r.Body).Decode(&node); err != nil {
   205  		return err
   206  	}
   207  
   208  	rawVersion := r.URL.Query().Get("version")
   209  	version, err := strconv.ParseUint(rawVersion, 10, 64)
   210  	if err != nil {
   211  		return fmt.Errorf("Invalid node version '%s': %s", rawVersion, err.Error())
   212  	}
   213  
   214  	if err := sr.backend.UpdateNode(vars["id"], version, node); err != nil {
   215  		logrus.Errorf("Error updating node %s: %v", vars["id"], err)
   216  		return err
   217  	}
   218  	return nil
   219  }
   220  
   221  func (sr *swarmRouter) removeNode(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   222  	if err := httputils.ParseForm(r); err != nil {
   223  		return err
   224  	}
   225  
   226  	force := httputils.BoolValue(r, "force")
   227  
   228  	if err := sr.backend.RemoveNode(vars["id"], force); err != nil {
   229  		logrus.Errorf("Error removing node %s: %v", vars["id"], err)
   230  		return err
   231  	}
   232  	return nil
   233  }
   234  
   235  func (sr *swarmRouter) getTasks(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   236  	if err := httputils.ParseForm(r); err != nil {
   237  		return err
   238  	}
   239  	filter, err := filters.FromParam(r.Form.Get("filters"))
   240  	if err != nil {
   241  		return err
   242  	}
   243  
   244  	tasks, err := sr.backend.GetTasks(basictypes.TaskListOptions{Filter: filter})
   245  	if err != nil {
   246  		logrus.Errorf("Error getting tasks: %v", err)
   247  		return err
   248  	}
   249  
   250  	return httputils.WriteJSON(w, http.StatusOK, tasks)
   251  }
   252  
   253  func (sr *swarmRouter) getTask(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
   254  	task, err := sr.backend.GetTask(vars["id"])
   255  	if err != nil {
   256  		logrus.Errorf("Error getting task %s: %v", vars["id"], err)
   257  		return err
   258  	}
   259  
   260  	return httputils.WriteJSON(w, http.StatusOK, task)
   261  }