Updating API handlers

Signed-off-by: Nishant Totla <nishanttotla@gmail.com>
This commit is contained in:
Nishant Totla 2016-03-18 10:48:03 -07:00
parent 79575f3df6
commit 81e1528d0f
No known key found for this signature in database
GPG Key ID: 7EA5781C9B3D0C19
6 changed files with 75 additions and 27 deletions

View File

@ -394,7 +394,7 @@ func getContainersJSON(c *context, w http.ResponseWriter, r *http.Request) {
if !filters.MatchKVList("label", container.Config.Labels) {
continue
}
if !filters.Match("status", container.Info.State.StateString()) {
if !filters.Match("status", cluster.StateString(container.Info.State)) {
continue
}
if !filters.Match("node", container.Engine.Name) {
@ -423,8 +423,8 @@ func getContainersJSON(c *context, w http.ResponseWriter, r *http.Request) {
candidates = candidates[:limit]
}
// Convert cluster.Container back into dockerclient.Container.
out := []*dockerclient.Container{}
// Convert cluster.Container back into apitypes.Container.
out := []*apitypes.Container{}
for _, container := range candidates {
if before != nil {
if container.ID == before.ID {
@ -432,13 +432,13 @@ func getContainersJSON(c *context, w http.ResponseWriter, r *http.Request) {
}
continue
}
// Create a copy of the underlying dockerclient.Container so we can
// Create a copy of the underlying apitypes.Container so we can
// make changes without messing with cluster.Container.
tmp := (*container).Container
// Update the Status. The one we have is stale from the last `docker ps` the engine sent.
// `Status()` will generate a new one
tmp.Status = container.Info.State.String()
tmp.Status = cluster.FullStateString(container.Info.State)
if !container.Engine.IsHealthy() {
tmp.Status = "Host Down"
}
@ -455,7 +455,7 @@ func getContainersJSON(c *context, w http.ResponseWriter, r *http.Request) {
}
// insert node IP
tmp.Ports = make([]dockerclient.Port, len(container.Ports))
tmp.Ports = make([]apitypes.Port, len(container.Ports))
for i, port := range container.Ports {
tmp.Ports[i] = port
if port.IP == "0.0.0.0" {
@ -526,15 +526,13 @@ func getContainerJSON(c *context, w http.ResponseWriter, r *http.Request) {
func postContainersCreate(c *context, w http.ResponseWriter, r *http.Request) {
r.ParseForm()
var (
oldConfig = dockerclient.ContainerConfig{
HostConfig: dockerclient.HostConfig{
MemorySwappiness: -1,
},
}
name = r.Form.Get("name")
config = cluster.ContainerConfig{
defaultMemorySwappiness = int64(-1)
name = r.Form.Get("name")
config = cluster.ContainerConfig{
HostConfig: containertypes.HostConfig{
MemorySwappiness: -1,
Resources: containertypes.Resources{
MemorySwappiness: &(defaultMemorySwappiness),
},
},
}
)

View File

@ -10,7 +10,7 @@ import (
// Cluster is exported
type Cluster interface {
// Create a container
CreateContainer(config *ContainerConfig, name string, authConfig *dockerclient.AuthConfig) (*Container, error)
CreateContainer(config *ContainerConfig, name string, authConfig *types.AuthConfig) (*Container, error)
// Remove a container
RemoveContainer(container *Container, force, volumes bool) error

View File

@ -1,10 +1,13 @@
package cluster
import (
"fmt"
"strings"
"time"
"github.com/docker/docker/pkg/stringid"
"github.com/docker/engine-api/types"
"github.com/docker/go-units"
)
// Container is exported
@ -16,6 +19,50 @@ type Container struct {
Engine *Engine
}
// StateString returns a single string to describe state
func StateString(state *types.ContainerState) string {
if state.Running {
if state.Paused {
return "paused"
}
if state.Restarting {
return "restarting"
}
return "running"
}
if state.Dead {
return "dead"
}
return "exited"
}
// FullStateString returns human-readable description of the state
func FullStateString(state *types.ContainerState) string {
startedAt, _ := time.Parse(time.RFC3339Nano, state.StartedAt)
finishedAt, _ := time.Parse(time.RFC3339Nano, state.FinishedAt)
if state.Running {
if state.Paused {
return fmt.Sprintf("Up %s (Paused)", units.HumanDuration(time.Now().UTC().Sub(startedAt)))
}
if state.Restarting {
return fmt.Sprintf("Restarting (%d) %s ago", state.ExitCode, units.HumanDuration(time.Now().UTC().Sub(finishedAt)))
}
return fmt.Sprintf("Up %s", units.HumanDuration(time.Now().UTC().Sub(startedAt)))
}
if state.Dead {
return "Dead"
}
if finishedAt.IsZero() {
return ""
}
return fmt.Sprintf("Exited (%d) %s ago", state.ExitCode, units.HumanDuration(time.Now().UTC().Sub(finishedAt)))
}
// Refresh container
func (c *Container) Refresh() (*Container, error) {
return c.Engine.refreshContainer(c.ID, true)

View File

@ -632,7 +632,7 @@ func (e *Engine) RefreshContainers(full bool) error {
All: true,
Size: false,
}
containers, err := e.apiClient.ContainerList(opts)
containers, err := e.apiClient.ContainerList(context.TODO(), opts)
e.CheckConnectionErr(err)
if err != nil {
return err
@ -665,7 +665,7 @@ func (e *Engine) refreshContainer(ID string, full bool) (*Container, error) {
Size: false,
Filter: filterArgs,
}
containers, err := e.apiClient.ContainerList(opts)
containers, err := e.apiClient.ContainerList(context.TODO(), opts)
e.CheckConnectionErr(err)
if err != nil {
return nil, err
@ -720,7 +720,7 @@ func (e *Engine) updateContainer(c types.Container, containers map[string]*Conta
// Update ContainerInfo.
if full {
info, err := e.apiClient.ContainerInspect(c.ID)
info, err := e.apiClient.ContainerInspect(context.TODO(), c.ID)
e.CheckConnectionErr(err)
if err != nil {
return nil, err
@ -858,7 +858,7 @@ func (e *Engine) TotalCpus() int {
}
// Create a new container
func (e *Engine) Create(config *ContainerConfig, name string, pullImage bool, authConfig *dockerclient.AuthConfig) (*Container, error) {
func (e *Engine) Create(config *ContainerConfig, name string, pullImage bool, authConfig *types.AuthConfig) (*Container, error) {
var (
err error
createResp types.ContainerCreateResponse
@ -874,7 +874,7 @@ func (e *Engine) Create(config *ContainerConfig, name string, pullImage bool, au
// FIXME remove "duplicate" lines and move this to cluster/config.go
dockerConfig.CPUShares = int64(math.Ceil(float64(config.CPUShares*1024) / float64(e.Cpus)))
createResp, err = e.apiClient.ContainerCreate(&dockerConfig.Config, &dockerConfig.HostConfig, &dockerConfig.NetworkingConfig, name)
createResp, err = e.apiClient.ContainerCreate(context.TODO(), &dockerConfig.Config, &dockerConfig.HostConfig, &dockerConfig.NetworkingConfig, name)
e.CheckConnectionErr(err)
if err != nil {
// If the error is other than not found, abort immediately.
@ -886,7 +886,7 @@ func (e *Engine) Create(config *ContainerConfig, name string, pullImage bool, au
return nil, err
}
// ...And try again.
createResp, err = e.apiClient.ContainerCreate(&dockerConfig.Config, &dockerConfig.HostConfig, &dockerConfig.NetworkingConfig, name)
createResp, err = e.apiClient.ContainerCreate(context.TODO(), &dockerConfig.Config, &dockerConfig.HostConfig, &dockerConfig.NetworkingConfig, name)
e.CheckConnectionErr(err)
if err != nil {
return nil, err
@ -951,11 +951,14 @@ func (e *Engine) CreateVolume(request *types.VolumeCreateRequest) (*Volume, erro
}
// Pull an image on the engine
func (e *Engine) Pull(image string, authConfig *dockerclient.AuthConfig) error {
func (e *Engine) Pull(image string, authConfig *types.AuthConfig) error {
if !strings.Contains(image, ":") {
image = image + ":latest"
}
err := e.client.PullImage(image, authConfig)
pullOpts := types.ImagePullOptions{
ImageID: image,
}
_, err := e.apiClient.ImagePull(context.TODO(), pullOpts, nil)
e.CheckConnectionErr(err)
if err != nil {
return err

View File

@ -91,7 +91,7 @@ func (t *Task) Build(slaveID string, offers map[string]*mesosproto.Offer) {
for containerProtoPort, bindings := range t.config.HostConfig.PortBindings {
for _, binding := range bindings {
containerInfo := strings.SplitN(containerProtoPort, "/", 2)
containerInfo := strings.SplitN(string(containerProtoPort), "/", 2)
containerPort, err := strconv.ParseUint(containerInfo[0], 10, 32)
if err != nil {
log.Warn(err)
@ -135,7 +135,7 @@ func (t *Task) Build(slaveID string, offers map[string]*mesosproto.Offer) {
t.Container.Docker.Network = mesosproto.ContainerInfo_DockerInfo_BRIDGE.Enum()
}
if cpus := t.config.CpuShares; cpus > 0 {
if cpus := t.config.CPUShares; cpus > 0 {
t.Resources = append(t.Resources, mesosutil.NewScalarResource("cpus", float64(cpus)))
}

View File

@ -138,7 +138,7 @@ func (c *Cluster) StartContainer(container *cluster.Container, hostConfig *docke
}
// CreateContainer aka schedule a brand new container into the cluster.
func (c *Cluster) CreateContainer(config *cluster.ContainerConfig, name string, authConfig *dockerclient.AuthConfig) (*cluster.Container, error) {
func (c *Cluster) CreateContainer(config *cluster.ContainerConfig, name string, authConfig *types.AuthConfig) (*cluster.Container, error) {
container, err := c.createContainer(config, name, false, authConfig)
if err != nil {
@ -162,7 +162,7 @@ func (c *Cluster) CreateContainer(config *cluster.ContainerConfig, name string,
return container, err
}
func (c *Cluster) createContainer(config *cluster.ContainerConfig, name string, withImageAffinity bool, authConfig *dockerclient.AuthConfig) (*cluster.Container, error) {
func (c *Cluster) createContainer(config *cluster.ContainerConfig, name string, withImageAffinity bool, authConfig *types.AuthConfig) (*cluster.Container, error) {
c.scheduler.Lock()
// Ensure the name is available