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 }