github.com/vieux/docker@v0.6.3-0.20161004191708-e097c2a938c7/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 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 }