func pullImage(c *nodecontainer.NodeContainerConfig, client *docker.Client, p DockerProvisioner, pool string) (string, error) { image := c.Image() output, err := pullWithRetry(client, p, image, 3) if err != nil { return "", err } digest, _ := fix.GetImageDigest(output) err = c.PinImageIfNeeded(image, digest, pool) if err != nil { return "", err } return image, err }
// title: node container update // path: /docker/nodecontainers/{name} // method: POST // consume: application/x-www-form-urlencoded // responses: // 200: Ok // 400: Invald data // 401: Unauthorized // 404: Not found func nodeContainerUpdate(w http.ResponseWriter, r *http.Request, t auth.Token) (err error) { err = r.ParseForm() if err != nil { return err } dec := form.NewDecoder(nil) dec.IgnoreUnknownKeys(true) dec.IgnoreCase(true) var config nodecontainer.NodeContainerConfig err = dec.DecodeValues(&config, r.Form) if err != nil { return err } poolName := r.FormValue("pool") var ctxs []permission.PermissionContext if poolName != "" { ctxs = append(ctxs, permission.Context(permission.CtxPool, poolName)) } if !permission.Check(t, permission.PermNodecontainerUpdate, ctxs...) { return permission.ErrUnauthorized } evt, err := event.New(&event.Opts{ Target: event.Target{Type: event.TargetTypeNodeContainer, Value: config.Name}, Kind: permission.PermNodecontainerUpdate, Owner: t, CustomData: event.FormToCustomData(r.Form), Allowed: event.Allowed(permission.PermPoolReadEvents, ctxs...), }) if err != nil { return err } defer func() { evt.Done(err) }() config.Name = r.URL.Query().Get(":name") err = nodecontainer.UpdateContainer(poolName, &config) if err != nil { if err == nodecontainer.ErrNodeContainerNotFound { return &tsuruErrors.HTTP{ Code: http.StatusNotFound, Message: err.Error(), } } if _, ok := err.(nodecontainer.ValidationErr); ok { return &tsuruErrors.HTTP{ Code: http.StatusBadRequest, Message: err.Error(), } } return err } return nil }