From 82f1bfe0ecd7b4a34958ffa65c50be90281c1194 Mon Sep 17 00:00:00 2001 From: Nishant Totla Date: Tue, 24 May 2016 16:57:44 -0700 Subject: [PATCH] Changing relevant function calls for updated engine-api Signed-off-by: Nishant Totla --- api/handlers.go | 7 ++- cluster/cluster.go | 4 +- cluster/engine.go | 96 ++++++++++++++++++++-------------------- cluster/mesos/cluster.go | 12 ++--- cluster/swarm/cluster.go | 12 ++--- 5 files changed, 65 insertions(+), 66 deletions(-) diff --git a/api/handlers.go b/api/handlers.go index 5d192795c5..9d57ed7ceb 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -620,7 +620,7 @@ func deleteContainers(c *context, w http.ResponseWriter, r *http.Request) { // POST /networks/create func postNetworksCreate(c *context, w http.ResponseWriter, r *http.Request) { - var request apitypes.NetworkCreate + var request apitypes.NetworkCreateRequest if err := json.NewDecoder(r.Body).Decode(&request); err != nil { httpError(w, err.Error(), http.StatusBadRequest) @@ -631,7 +631,7 @@ func postNetworksCreate(c *context, w http.ResponseWriter, r *http.Request) { request.Driver = "overlay" } - response, err := c.cluster.CreateNetwork(&request) + response, err := c.cluster.CreateNetwork(request.Name, &request.NetworkCreate) if err != nil { httpError(w, err.Error(), http.StatusInternalServerError) return @@ -1277,7 +1277,6 @@ func postBuild(c *context, w http.ResponseWriter, r *http.Request) { CPUSetMems: r.Form.Get("cpusetmems"), CgroupParent: r.Form.Get("cgroupparent"), ShmSize: int64ValueOrZero(r, "shmsize"), - Context: r.Body, } buildArgsJSON := r.Form.Get("buildargs") @@ -1306,7 +1305,7 @@ func postBuild(c *context, w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") wf := NewWriteFlusher(w) - err := c.cluster.BuildImage(buildImage, wf) + err := c.cluster.BuildImage(r.Body, buildImage, wf) if err != nil { httpError(w, err.Error(), http.StatusInternalServerError) } diff --git a/cluster/cluster.go b/cluster/cluster.go index b9b11f1a41..19ee1f89ea 100644 --- a/cluster/cluster.go +++ b/cluster/cluster.go @@ -39,7 +39,7 @@ type Cluster interface { Networks() Networks // Create a network - CreateNetwork(request *types.NetworkCreate) (*types.NetworkCreateResponse, error) + CreateNetwork(name string, request *types.NetworkCreate) (*types.NetworkCreateResponse, error) // Remove a network from the cluster RemoveNetwork(network *Network) error @@ -95,7 +95,7 @@ type Cluster interface { RenameContainer(container *Container, newName string) error // Build an image - BuildImage(*types.ImageBuildOptions, io.Writer) error + BuildImage(io.Reader, *types.ImageBuildOptions, io.Writer) error // Tag an image TagImage(IDOrName string, repo string, tag string, force bool) error diff --git a/cluster/engine.go b/cluster/engine.go index 063a29900a..2b5adb497f 100644 --- a/cluster/engine.go +++ b/cluster/engine.go @@ -17,7 +17,6 @@ import ( "golang.org/x/net/context" log "github.com/Sirupsen/logrus" - "github.com/docker/distribution/reference" "github.com/docker/docker/pkg/version" engineapi "github.com/docker/engine-api/client" "github.com/docker/engine-api/types" @@ -523,8 +522,8 @@ func (e *Engine) updateSpecs() error { // RemoveImage deletes an image from the engine. func (e *Engine) RemoveImage(name string, force bool) ([]types.ImageDelete, error) { - rmOpts := types.ImageRemoveOptions{name, force, true} - dels, err := e.apiClient.ImageRemove(context.Background(), rmOpts) + rmOpts := types.ImageRemoveOptions{force, true} + dels, err := e.apiClient.ImageRemove(context.Background(), name, rmOpts) e.CheckConnectionErr(err) e.RefreshImages() return dels, err @@ -916,11 +915,10 @@ func (e *Engine) Create(config *ContainerConfig, name string, pullImage bool, au // RemoveContainer removes a container from the engine. func (e *Engine) RemoveContainer(container *Container, force, volumes bool) error { opts := types.ContainerRemoveOptions{ - ContainerID: container.ID, Force: force, RemoveVolumes: volumes, } - err := e.apiClient.ContainerRemove(context.Background(), opts) + err := e.apiClient.ContainerRemove(context.Background(), container.ID, opts) e.CheckConnectionErr(err) if err != nil { return err @@ -936,8 +934,8 @@ func (e *Engine) RemoveContainer(container *Container, force, volumes bool) erro } // CreateNetwork creates a network in the engine -func (e *Engine) CreateNetwork(request *types.NetworkCreate) (*types.NetworkCreateResponse, error) { - response, err := e.apiClient.NetworkCreate(context.Background(), *request) +func (e *Engine) CreateNetwork(name string, request *types.NetworkCreate) (*types.NetworkCreateResponse, error) { + response, err := e.apiClient.NetworkCreate(context.Background(), name, *request) e.CheckConnectionErr(err) e.RefreshNetworks() @@ -959,36 +957,16 @@ func (e *Engine) CreateVolume(request *types.VolumeCreateRequest) (*Volume, erro } -// FIXME: This will become unnecessary after docker/engine-api#162 is merged -func buildImagePullOptions(image string) (types.ImagePullOptions, error) { - distributionRef, err := reference.ParseNamed(image) - if err != nil { - return types.ImagePullOptions{}, err - } - - name := distributionRef.Name() - tag := "latest" - - switch x := distributionRef.(type) { - case reference.Canonical: - tag = x.Digest().String() - case reference.NamedTagged: - tag = x.Tag() - } - - return types.ImagePullOptions{ - ImageID: name, - Tag: tag, - }, nil -} - // Pull an image on the engine func (e *Engine) Pull(image string, authConfig *types.AuthConfig) error { - pullOpts, err := buildImagePullOptions(image) - if err != nil { - return err + // TODO(nishanttotla): RegistryAuth probably needs fixing + pullOpts := types.ImagePullOptions{ + All: false, + RegistryAuth: authConfig.Auth, + PrivilegeFunc: nil, } - pullResponseBody, err := e.apiClient.ImagePull(context.Background(), pullOpts, nil) + // image is a ref here + pullResponseBody, err := e.apiClient.ImagePull(context.Background(), image, pullOpts) e.CheckConnectionErr(err) if err != nil { return err @@ -1052,13 +1030,25 @@ func (e *Engine) Load(reader io.Reader) error { // Import image func (e *Engine) Import(source string, repository string, tag string, imageReader io.Reader) error { - opts := types.ImageImportOptions{ - SourceName: source, - RepositoryName: repository, - Tag: tag, - Source: imageReader, + importSrc := types.ImageImportSource{ + Source: imageReader, + SourceName: source, } - _, err := e.apiClient.ImageImport(context.Background(), opts) + opts := types.ImageImportOptions{ + Tag: tag, + } + // TODO(nishanttotla): There might be a better way to pass a ref string than construct it here + + // generate ref string + ref := repository + if tag != "" { + if strings.Contains(tag, ":") { + ref += "@" + tag + } else { + ref += ":" + tag + } + } + _, err := e.apiClient.ImageImport(context.Background(), importSrc, ref, opts) e.CheckConnectionErr(err) if err != nil { return err @@ -1237,7 +1227,8 @@ func (e *Engine) StartContainer(id string, hostConfig *dockerclient.HostConfig) if hostConfig != nil { err = e.client.StartContainer(id, hostConfig) } else { - err = e.apiClient.ContainerStart(context.Background(), id) + // TODO(nishanttotla): Figure out what the checkpoint id (second string argument) should be + err = e.apiClient.ContainerStart(context.Background(), id, "") } e.CheckConnectionErr(err) if err != nil { @@ -1264,8 +1255,9 @@ func (e *Engine) RenameContainer(container *Container, newName string) error { } // BuildImage builds an image -func (e *Engine) BuildImage(buildImage *types.ImageBuildOptions) (io.ReadCloser, error) { - resp, err := e.apiClient.ImageBuild(context.Background(), *buildImage) +func (e *Engine) BuildImage(buildContext io.Reader, buildImage *types.ImageBuildOptions) (io.ReadCloser, error) { + // TODO(nishanttotla): buildcontext for image could be specific instead of nil + resp, err := e.apiClient.ImageBuild(context.Background(), buildContext, *buildImage) e.CheckConnectionErr(err) if err != nil { return nil, err @@ -1277,12 +1269,20 @@ func (e *Engine) BuildImage(buildImage *types.ImageBuildOptions) (io.ReadCloser, func (e *Engine) TagImage(IDOrName string, repo string, tag string, force bool) error { // send tag request to docker engine opts := types.ImageTagOptions{ - ImageID: IDOrName, - RepositoryName: repo, - Tag: tag, - Force: force, + Force: force, } - err := e.apiClient.ImageTag(context.Background(), opts) + // TODO(nishanttotla): There might be a better way to pass a ref string than construct it here + + // generate ref string + ref := repo + if tag != "" { + if strings.Contains(tag, ":") { + ref += "@" + tag + } else { + ref += ":" + tag + } + } + err := e.apiClient.ImageTag(context.Background(), IDOrName, ref, opts) e.CheckConnectionErr(err) if err != nil { return err diff --git a/cluster/mesos/cluster.go b/cluster/mesos/cluster.go index c999154502..948b964e84 100644 --- a/cluster/mesos/cluster.go +++ b/cluster/mesos/cluster.go @@ -256,15 +256,15 @@ func (c *Cluster) RemoveImages(name string, force bool) ([]types.ImageDelete, er } // CreateNetwork creates a network in the cluster -func (c *Cluster) CreateNetwork(request *types.NetworkCreate) (*types.NetworkCreateResponse, error) { +func (c *Cluster) CreateNetwork(name string, request *types.NetworkCreate) (*types.NetworkCreateResponse, error) { var ( - parts = strings.SplitN(request.Name, "/", 2) + parts = strings.SplitN(name, "/", 2) config = &cluster.ContainerConfig{} ) if len(parts) == 2 { // a node was specified, create the container only on this node - request.Name = parts[1] + name = parts[1] config = cluster.BuildContainerConfig(containertypes.Config{Env: []string{"constraint:node==" + parts[0]}}, containertypes.HostConfig{}, networktypes.NetworkingConfig{}) } @@ -282,7 +282,7 @@ func (c *Cluster) CreateNetwork(request *types.NetworkCreate) (*types.NetworkCre if !ok { return nil, fmt.Errorf("Unable to create network on agent %q", n.ID) } - resp, err := s.engine.CreateNetwork(request) + resp, err := s.engine.CreateNetwork(name, request) c.refreshNetworks() return resp, err } @@ -642,7 +642,7 @@ func (c *Cluster) RANDOMENGINE() (*cluster.Engine, error) { } // BuildImage builds an image -func (c *Cluster) BuildImage(buildImage *types.ImageBuildOptions, out io.Writer) error { +func (c *Cluster) BuildImage(buildContext io.Reader, buildImage *types.ImageBuildOptions, out io.Writer) error { c.scheduler.Lock() // get an engine @@ -661,7 +661,7 @@ func (c *Cluster) BuildImage(buildImage *types.ImageBuildOptions, out io.Writer) } n := nodes[0] - reader, err := c.agents[n.ID].engine.BuildImage(buildImage) + reader, err := c.agents[n.ID].engine.BuildImage(buildContext, buildImage) if err != nil { return err } diff --git a/cluster/swarm/cluster.go b/cluster/swarm/cluster.go index f33efe680f..120a066186 100644 --- a/cluster/swarm/cluster.go +++ b/cluster/swarm/cluster.go @@ -472,15 +472,15 @@ func (c *Cluster) refreshVolumes() { } // CreateNetwork creates a network in the cluster -func (c *Cluster) CreateNetwork(request *types.NetworkCreate) (response *types.NetworkCreateResponse, err error) { +func (c *Cluster) CreateNetwork(name string, request *types.NetworkCreate) (response *types.NetworkCreateResponse, err error) { var ( - parts = strings.SplitN(request.Name, "/", 2) + parts = strings.SplitN(name, "/", 2) config = &cluster.ContainerConfig{} ) if len(parts) == 2 { // a node was specified, create the container only on this node - request.Name = parts[1] + name = parts[1] config = cluster.BuildContainerConfig(containertypes.Config{Env: []string{"constraint:node==" + parts[0]}}, containertypes.HostConfig{}, networktypes.NetworkingConfig{}) } @@ -489,7 +489,7 @@ func (c *Cluster) CreateNetwork(request *types.NetworkCreate) (response *types.N return nil, err } if nodes != nil { - resp, err := c.engines[nodes[0].ID].CreateNetwork(request) + resp, err := c.engines[nodes[0].ID].CreateNetwork(name, request) if err == nil { if network := c.engines[nodes[0].ID].Networks().Get(resp.ID); network != nil && network.Scope == "global" { for id, engine := range c.engines { @@ -903,7 +903,7 @@ func (c *Cluster) RenameContainer(container *cluster.Container, newName string) } // BuildImage builds an image -func (c *Cluster) BuildImage(buildImage *types.ImageBuildOptions, out io.Writer) error { +func (c *Cluster) BuildImage(buildContext io.Reader, buildImage *types.ImageBuildOptions, out io.Writer) error { c.scheduler.Lock() // get an engine @@ -918,7 +918,7 @@ func (c *Cluster) BuildImage(buildImage *types.ImageBuildOptions, out io.Writer) } n := nodes[0] - reader, err := c.engines[n.ID].BuildImage(buildImage) + reader, err := c.engines[n.ID].BuildImage(buildContext, buildImage) if err != nil { return err }