Merge pull request #1146 from jimmyxian/improve-image-all

Add support images -a
This commit is contained in:
Alexandre Beslic 2015-08-12 11:17:52 -07:00
commit 83f93dff47
9 changed files with 32 additions and 24 deletions

View File

@ -28,7 +28,7 @@ const APIVERSION = "1.16"
func getInfo(c *context, w http.ResponseWriter, r *http.Request) {
info := dockerclient.Info{
Containers: int64(len(c.cluster.Containers())),
Images: int64(len(c.cluster.Images())),
Images: int64(len(c.cluster.Images(false))),
DriverStatus: c.statusHandler.Status(),
NEventsListener: int64(c.eventsHandler.Size()),
Debug: c.debug,
@ -78,7 +78,7 @@ func getImages(c *context, w http.ResponseWriter, r *http.Request) {
// Create a map of engine address to the list of images it holds.
engineImages := make(map[string][]*cluster.Image)
for _, image := range c.cluster.Images() {
for _, image := range c.cluster.Images(true) {
engineImages[image.Engine.Addr] = append(engineImages[image.Engine.Addr], image)
}
@ -114,6 +114,8 @@ func getImagesJSON(c *context, w http.ResponseWriter, r *http.Request) {
return
}
all := boolValue(r, "all")
filters, err := dockerfilters.FromParam(r.Form.Get("filters"))
if err != nil {
httpError(w, err.Error(), http.StatusInternalServerError)
@ -123,7 +125,7 @@ func getImagesJSON(c *context, w http.ResponseWriter, r *http.Request) {
accepteds, _ := filters["node"]
images := []*cluster.Image{}
for _, image := range c.cluster.Images() {
for _, image := range c.cluster.Images(all) {
if len(accepteds) != 0 {
found := false
for _, accepted := range accepteds {
@ -585,7 +587,7 @@ func proxyImage(c *context, w http.ResponseWriter, r *http.Request) {
func proxyImageTagOptional(c *context, w http.ResponseWriter, r *http.Request) {
name := mux.Vars(r)["name"]
for _, image := range c.cluster.Images() {
for _, image := range c.cluster.Images(true) {
if len(strings.SplitN(name, ":", 2)) == 2 && image.Match(name, true) ||
len(strings.SplitN(name, ":", 2)) == 1 && image.Match(name, false) {
proxy(c.tlsConfig, image.Engine.Addr, w, r)

View File

@ -15,7 +15,7 @@ type Cluster interface {
RemoveContainer(container *Container, force bool) error
// Return all images
Images() []*Image
Images(all bool) []*Image
// Return one image matching `IDOrName`
Image(IDOrName string) *Image

View File

@ -185,7 +185,7 @@ func (e *Engine) RemoveImage(image *Image, name string) ([]*dockerclient.ImageDe
// RefreshImages refreshes the list of images on the engine.
func (e *Engine) RefreshImages() error {
images, err := e.client.ListImages(false)
images, err := e.client.ListImages(true)
if err != nil {
return err
}
@ -507,12 +507,14 @@ func (e *Engine) Containers() Containers {
}
// Images returns all the images in the engine
func (e *Engine) Images() []*Image {
func (e *Engine) Images(all bool) []*Image {
e.RLock()
images := make([]*Image, 0, len(e.images))
for _, image := range e.images {
images = append(images, image)
if all || (!all && len(image.RepoTags) != 0 && image.RepoTags[0] != "<none>:<none>") {
images = append(images, image)
}
}
e.RUnlock()
return images

View File

@ -64,7 +64,7 @@ func TestEngineCpusMemory(t *testing.T) {
client.On("Info").Return(mockInfo, nil)
client.On("Version").Return(mockVersion, nil)
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{}, nil)
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil)
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil)
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
assert.NoError(t, engine.ConnectWithClient(client))
@ -85,7 +85,7 @@ func TestEngineSpecs(t *testing.T) {
client.On("Info").Return(mockInfo, nil)
client.On("Version").Return(mockVersion, nil)
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{}, nil)
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil)
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil)
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
assert.NoError(t, engine.ConnectWithClient(client))
@ -114,7 +114,7 @@ func TestEngineState(t *testing.T) {
// The client will return one container at first, then a second one will appear.
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{{Id: "one"}}, nil).Once()
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil).Once()
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil).Once()
client.On("InspectContainer", "one").Return(&dockerclient.ContainerInfo{Config: &dockerclient.ContainerConfig{CpuShares: 100}}, nil).Once()
client.On("ListContainers", true, false, fmt.Sprintf("{%q:[%q]}", "id", "two")).Return([]dockerclient.Container{{Id: "two"}}, nil).Once()
client.On("InspectContainer", "two").Return(&dockerclient.ContainerInfo{Config: &dockerclient.ContainerConfig{CpuShares: 100}}, nil).Once()
@ -159,7 +159,7 @@ func TestCreateContainer(t *testing.T) {
client.On("Version").Return(mockVersion, nil)
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{}, nil).Once()
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil).Once()
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil).Once()
assert.NoError(t, engine.ConnectWithClient(client))
assert.True(t, engine.isConnected())
@ -172,7 +172,7 @@ func TestCreateContainer(t *testing.T) {
id := "id1"
client.On("CreateContainer", &mockConfig, name).Return(id, nil).Once()
client.On("ListContainers", true, false, fmt.Sprintf(`{"id":[%q]}`, id)).Return([]dockerclient.Container{{Id: id}}, nil).Once()
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil).Once()
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil).Once()
client.On("InspectContainer", id).Return(&dockerclient.ContainerInfo{Config: &config.ContainerConfig}, nil).Once()
container, err := engine.Create(config, name, false)
assert.Nil(t, err)
@ -195,7 +195,7 @@ func TestCreateContainer(t *testing.T) {
client.On("CreateContainer", &mockConfig, name).Return("", dockerclient.ErrNotFound).Once()
client.On("CreateContainer", &mockConfig, name).Return(id, nil).Once()
client.On("ListContainers", true, false, fmt.Sprintf(`{"id":[%q]}`, id)).Return([]dockerclient.Container{{Id: id}}, nil).Once()
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil).Once()
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil).Once()
client.On("InspectContainer", id).Return(&dockerclient.ContainerInfo{Config: &config.ContainerConfig}, nil).Once()
container, err = engine.Create(config, name, true)
assert.Nil(t, err)
@ -241,7 +241,7 @@ func TestUsedCpus(t *testing.T) {
client.On("Info").Return(mockInfo, nil)
client.On("Version").Return(mockVersion, nil)
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil).Once()
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil).Once()
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{{Id: "test"}}, nil).Once()
client.On("InspectContainer", "test").Return(&dockerclient.ContainerInfo{Config: &dockerclient.ContainerConfig{CpuShares: cpuShares}}, nil).Once()
engine.ConnectWithClient(client)
@ -268,7 +268,7 @@ func TestContainerRemovedDuringRefresh(t *testing.T) {
client.On("Info").Return(mockInfo, nil)
client.On("Version").Return(mockVersion, nil)
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil)
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil)
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{container1, container2}, nil)
client.On("InspectContainer", "c1").Return(info1, errors.New("Not found"))

View File

@ -190,13 +190,13 @@ func (c *Cluster) RemoveContainer(container *cluster.Container, force bool) erro
}
// Images returns all the images in the cluster.
func (c *Cluster) Images() []*cluster.Image {
func (c *Cluster) Images(all bool) []*cluster.Image {
c.RLock()
defer c.RUnlock()
out := []*cluster.Image{}
for _, s := range c.slaves {
out = append(out, s.engine.Images()...)
out = append(out, s.engine.Images(all)...)
}
return out

View File

@ -259,13 +259,13 @@ func (c *Cluster) monitorDiscovery(ch <-chan discovery.Entries, errCh <-chan err
}
// Images returns all the images in the cluster.
func (c *Cluster) Images() []*cluster.Image {
func (c *Cluster) Images(all bool) []*cluster.Image {
c.RLock()
defer c.RUnlock()
out := []*cluster.Image{}
for _, e := range c.engines {
out = append(out, e.Images()...)
out = append(out, e.Images(all)...)
}
return out
@ -298,7 +298,7 @@ func (c *Cluster) RemoveImages(name string) ([]*dockerclient.ImageDelete, error)
errs := []string{}
var err error
for _, e := range c.engines {
for _, image := range e.Images() {
for _, image := range e.Images(true) {
if image.Match(name, true) {
content, err := image.Engine.RemoveImage(image, name)
if err != nil {

View File

@ -129,7 +129,7 @@ func TestImportImage(t *testing.T) {
client.On("Version").Return(mockVersion, nil)
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{}, nil).Once()
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil)
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil)
// connect client
engine.ConnectWithClient(client)
@ -177,7 +177,7 @@ func TestLoadImage(t *testing.T) {
client.On("Version").Return(mockVersion, nil)
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{}, nil).Once()
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil)
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil)
// connect client
engine.ConnectWithClient(client)

View File

@ -34,7 +34,7 @@ func NewNode(e *cluster.Engine) *Node {
Name: e.Name,
Labels: e.Labels,
Containers: e.Containers(),
Images: e.Images(),
Images: e.Images(true),
UsedMemory: e.UsedMemory(),
UsedCpus: e.UsedCpus(),
TotalMemory: e.TotalMemory(),

View File

@ -38,4 +38,8 @@ function teardown() {
[ "$status" -eq 0 ]
[ "${#lines[@]}" -eq 2 ]
[[ "${lines[1]}" == *"busybox"* ]]
# Try images -a
run docker_swarm images -a
[ "${#lines[@]}" -ge 5 ]
}