From 5a8bceb43e4d3f05f3a0f80a3a530fbd8deb7195 Mon Sep 17 00:00:00 2001 From: Nan Deng Date: Thu, 12 Jun 2014 14:59:03 -0700 Subject: [PATCH 1/7] passed unit test --- container/container.go | 2 +- container/filter.go | 6 +++--- container/filter_test.go | 24 ++++++++++++------------ container/statssum.go | 2 +- container/statssum_test.go | 2 +- info/container.go | 11 +++++++++-- info/container_test.go | 8 ++++++-- 7 files changed, 33 insertions(+), 22 deletions(-) diff --git a/container/container.go b/container/container.go index 7d21d1d1..ecec1706 100644 --- a/container/container.go +++ b/container/container.go @@ -32,7 +32,7 @@ type ListType int type ContainerHandler interface { GetSpec() (*info.ContainerSpec, error) GetStats() (*info.ContainerStats, error) - ListContainers(listType ListType) ([]string, error) + ListContainers(listType ListType) ([]info.ContainerRef, error) ListThreads(listType ListType) ([]int, error) ListProcesses(listType ListType) ([]int, error) StatsSummary() (*info.ContainerStatsPercentiles, error) diff --git a/container/filter.go b/container/filter.go index 0495bdc7..b1ed38c5 100644 --- a/container/filter.go +++ b/container/filter.go @@ -34,7 +34,7 @@ func (self *containerListFilter) GetStats() (*info.ContainerStats, error) { return self.handler.GetStats() } -func (self *containerListFilter) ListContainers(listType ListType) ([]string, error) { +func (self *containerListFilter) ListContainers(listType ListType) ([]info.ContainerRef, error) { containers, err := self.handler.ListContainers(listType) if err != nil { return nil, err @@ -42,9 +42,9 @@ func (self *containerListFilter) ListContainers(listType ListType) ([]string, er if len(containers) == 0 { return nil, nil } - ret := make([]string, 0, len(containers)) + ret := make([]info.ContainerRef, 0, len(containers)) for _, c := range containers { - if self.filter(c) { + if self.filter(c.Name) { ret = append(ret, c) } } diff --git a/container/filter_test.go b/container/filter_test.go index b6c2d41a..3c4250d8 100644 --- a/container/filter_test.go +++ b/container/filter_test.go @@ -37,9 +37,9 @@ func (self *mockContainerHandler) GetStats() (*info.ContainerStats, error) { return args.Get(0).(*info.ContainerStats), args.Error(1) } -func (self *mockContainerHandler) ListContainers(listType ListType) ([]string, error) { +func (self *mockContainerHandler) ListContainers(listType ListType) ([]info.ContainerRef, error) { args := self.Called(listType) - return args.Get(0).([]string), args.Error(1) + return args.Get(0).([]info.ContainerRef), args.Error(1) } func (self *mockContainerHandler) ListThreads(listType ListType) ([]int, error) { @@ -55,10 +55,10 @@ func (self *mockContainerHandler) ListProcesses(listType ListType) ([]int, error func TestWhiteListContainerFilter(t *testing.T) { mockc := &mockContainerHandler{} mockc.On("ListContainers", LIST_RECURSIVE).Return( - []string{ - "/docker/ee0103", - "/container/created/by/lmctfy", - "/user/something", + []info.ContainerRef{ + info.ContainerRef{Name: "/docker/ee0103"}, + info.ContainerRef{Name: "/container/created/by/lmctfy"}, + info.ContainerRef{Name: "/user/something"}, }, nil, ) @@ -76,7 +76,7 @@ func TestWhiteListContainerFilter(t *testing.T) { for _, c := range containers { legal := false for _, prefix := range filterPaths { - if strings.HasPrefix(c, prefix) { + if strings.HasPrefix(c.Name, prefix) { legal = true } } @@ -90,10 +90,10 @@ func TestWhiteListContainerFilter(t *testing.T) { func TestBlackListContainerFilter(t *testing.T) { mockc := &mockContainerHandler{} mockc.On("ListContainers", LIST_RECURSIVE).Return( - []string{ - "/docker/ee0103", - "/container/created/by/lmctfy", - "/user/something", + []info.ContainerRef{ + info.ContainerRef{Name: "/docker/ee0103"}, + info.ContainerRef{Name: "/container/created/by/lmctfy"}, + info.ContainerRef{Name: "/user/something"}, }, nil, ) @@ -111,7 +111,7 @@ func TestBlackListContainerFilter(t *testing.T) { for _, c := range containers { legal := true for _, prefix := range filterPaths { - if strings.HasPrefix(c, prefix) { + if strings.HasPrefix(c.Name, prefix) { legal = false } } diff --git a/container/statssum.go b/container/statssum.go index 081e6667..b18c7222 100644 --- a/container/statssum.go +++ b/container/statssum.go @@ -94,7 +94,7 @@ func (self *percentilesContainerHandlerWrapper) GetStats() (*info.ContainerStats return stats, nil } -func (self *percentilesContainerHandlerWrapper) ListContainers(listType ListType) ([]string, error) { +func (self *percentilesContainerHandlerWrapper) ListContainers(listType ListType) ([]info.ContainerRef, error) { return self.handler.ListContainers(listType) } diff --git a/container/statssum_test.go b/container/statssum_test.go index 0c020e12..995a29fc 100644 --- a/container/statssum_test.go +++ b/container/statssum_test.go @@ -29,7 +29,7 @@ type mockContainer struct { func (self *mockContainer) GetSpec() (*info.ContainerSpec, error) { return nil, nil } -func (self *mockContainer) ListContainers(listType ListType) ([]string, error) { +func (self *mockContainer) ListContainers(listType ListType) ([]info.ContainerRef, error) { return nil, nil } diff --git a/info/container.go b/info/container.go index fe9245b0..d288494d 100644 --- a/info/container.go +++ b/info/container.go @@ -49,12 +49,19 @@ type ContainerSpec struct { Memory *MemorySpec `json:"memory,omitempty"` } -type ContainerInfo struct { +// Container reference contains enough information to uniquely identify a container +type ContainerRef struct { // The absolute name of the container. Name string `json:"name"` + Aliases []string `json:"aliases,omitempty"` +} + +type ContainerInfo struct { + ContainerRef + // The direct subcontainers of the current container. - Subcontainers []string `json:"subcontainers,omitempty"` + Subcontainers []ContainerRef `json:"subcontainers,omitempty"` // The isolation used in the container. Spec *ContainerSpec `json:"spec,omitempty"` diff --git a/info/container_test.go b/info/container_test.go index bf449a4e..a0e67755 100644 --- a/info/container_test.go +++ b/info/container_test.go @@ -30,7 +30,9 @@ func TestStatsStartTime(t *testing.T) { stats = append(stats, s) } cinfo := &ContainerInfo{ - Name: "/some/container", + ContainerRef: ContainerRef{ + Name: "/some/container", + }, Stats: stats, } ref := ct.Add(time.Duration(N-1) * time.Second) @@ -52,7 +54,9 @@ func TestStatsEndTime(t *testing.T) { stats = append(stats, s) } cinfo := &ContainerInfo{ - Name: "/some/container", + ContainerRef: ContainerRef{ + Name: "/some/container", + }, Stats: stats, } ref := ct From 89b5484734be74e113e43889530bb6d80a3345d1 Mon Sep 17 00:00:00 2001 From: Nan Deng Date: Thu, 12 Jun 2014 15:03:18 -0700 Subject: [PATCH 2/7] changed actual handlers --- container/docker/handler.go | 15 ++++++++++----- container/lmctfy/lmctfy_container.go | 9 +++++---- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/container/docker/handler.go b/container/docker/handler.go index 80cb7fc7..58b2cb90 100644 --- a/container/docker/handler.go +++ b/container/docker/handler.go @@ -285,12 +285,12 @@ func (self *dockerContainerHandler) GetStats() (stats *info.ContainerStats, err return } -func (self *dockerContainerHandler) ListContainers(listType container.ListType) ([]string, error) { +func (self *dockerContainerHandler) ListContainers(listType container.ListType) ([]info.ContainerRef, error) { if self.isDockerContainer() { return nil, nil } if self.isRootContainer() && listType == container.LIST_SELF { - return []string{"/docker"}, nil + return []info.ContainerRef{info.ContainerRef{Name: "/docker"}}, nil } opt := docker.ListContainersOptions{ All: true, @@ -299,16 +299,21 @@ func (self *dockerContainerHandler) ListContainers(listType container.ListType) if err != nil { return nil, err } - ret := make([]string, 0, len(containers)+1) + ret := make([]info.ContainerRef, 0, len(containers)+1) for _, c := range containers { if !strings.HasPrefix(c.Status, "Up ") { continue } path := fmt.Sprintf("/docker/%v", c.ID) - ret = append(ret, path) + aliases := c.Names + ref := info.ContainerRef{ + Name: path, + Aliases: aliases, + } + ret = append(ret, ref) } if self.isRootContainer() { - ret = append(ret, "/docker") + ret = append(ret, info.ContainerRef{Name: "/docker"}) } return ret, nil } diff --git a/container/lmctfy/lmctfy_container.go b/container/lmctfy/lmctfy_container.go index d0d33860..39d5d2c5 100644 --- a/container/lmctfy/lmctfy_container.go +++ b/container/lmctfy/lmctfy_container.go @@ -157,7 +157,7 @@ func (c *lmctfyContainerHandler) GetStats() (*info.ContainerStats, error) { } // Gets all subcontainers. -func (c *lmctfyContainerHandler) ListContainers(listType container.ListType) ([]string, error) { +func (c *lmctfyContainerHandler) ListContainers(listType container.ListType) ([]info.ContainerRef, error) { // Prepare the arguments. args := []string{"list", "containers", "-v"} if listType == container.LIST_RECURSIVE { @@ -174,13 +174,14 @@ func (c *lmctfyContainerHandler) ListContainers(listType container.ListType) ([] // Parse lines as container names. if len(data) == 0 { - return []string{}, nil + return nil, nil } names := strings.Split(string(data), "\n") - containerNames := make([]string, 0, len(names)) + containerNames := make([]info.ContainerRef, 0, len(names)) for _, name := range names { if len(name) != 0 { - containerNames = append(containerNames, name) + ref := info.ContainerRef{Name: name} + containerNames = append(containerNames, ref) } } return containerNames, nil From 163179a84e0f08cef845edfa0b1decc072acc6d8 Mon Sep 17 00:00:00 2001 From: Nan Deng Date: Thu, 12 Jun 2014 15:31:35 -0700 Subject: [PATCH 3/7] changed pages and manager. --- container/statssum.go | 4 +++- manager/container.go | 4 ++-- manager/manager.go | 40 ++++++++++++++++++++-------------------- pages/containers.go | 23 +++++++++++++---------- 4 files changed, 38 insertions(+), 33 deletions(-) diff --git a/container/statssum.go b/container/statssum.go index b18c7222..6756456b 100644 --- a/container/statssum.go +++ b/container/statssum.go @@ -63,8 +63,10 @@ func (self *percentilesContainerHandlerWrapper) GetStats() (*info.ContainerStats if err != nil { return nil, err } + // nil stats and nil error is possible for /docker container. if stats == nil { - return nil, fmt.Errorf("container handler returns a nil error and a nil stats") + // return nil, fmt.Errorf("container handler returns a nil error and a nil stats") + return nil, nil } if stats.Timestamp.IsZero() { return nil, fmt.Errorf("container handler did not set timestamp") diff --git a/manager/container.go b/manager/container.go index be7eea1e..bba9db7d 100644 --- a/manager/container.go +++ b/manager/container.go @@ -35,8 +35,8 @@ type containerStat struct { Data *info.ContainerStats } type containerInfo struct { - Name string - Subcontainers []string + info.ContainerRef + Subcontainers []info.ContainerRef Spec *info.ContainerSpec Stats *list.List StatsSummary *info.ContainerStatsPercentiles diff --git a/manager/manager.go b/manager/manager.go index 6320fa19..474e7139 100644 --- a/manager/manager.go +++ b/manager/manager.go @@ -111,7 +111,9 @@ func (m *manager) GetContainerInfo(containerName string) (*info.ContainerInfo, e // Make a copy of the info for the user. ret := &info.ContainerInfo{ - Name: cinfo.Name, + ContainerRef: info.ContainerRef{ + Name: cinfo.Name, + }, Subcontainers: cinfo.Subcontainers, Spec: cinfo.Spec, StatsSummary: cinfo.StatsSummary, @@ -180,10 +182,8 @@ func (m *manager) destroyContainer(containerName string) error { return nil } -type empty struct{} - // Detect all containers that have been added or deleted. -func (m *manager) getContainersDiff() (added []string, removed []string, err error) { +func (m *manager) getContainersDiff() (added []info.ContainerRef, removed []info.ContainerRef, err error) { // TODO(vmarmol): We probably don't need to lock around / since it will always be there. m.containersLock.RLock() defer m.containersLock.RUnlock() @@ -197,24 +197,24 @@ func (m *manager) getContainersDiff() (added []string, removed []string, err err if err != nil { return nil, nil, err } - allContainers = append(allContainers, "/") + allContainers = append(allContainers, info.ContainerRef{Name: "/"}) // Determine which were added and which were removed. - allContainersSet := make(map[string]*empty) - for name, _ := range m.containers { - allContainersSet[name] = &empty{} + allContainersSet := make(map[string]*containerData) + for name, d := range m.containers { + allContainersSet[name] = d } - for _, name := range allContainers { - delete(allContainersSet, name) - _, ok := m.containers[name] + for _, c := range allContainers { + delete(allContainersSet, c.Name) + _, ok := m.containers[c.Name] if !ok { - added = append(added, name) + added = append(added, c) } } // Removed ones are no longer in the container listing. - for name, _ := range allContainersSet { - removed = append(removed, name) + for _, d := range allContainersSet { + removed = append(removed, d.info.ContainerRef) } return @@ -228,18 +228,18 @@ func (m *manager) detectContainers() error { } // Add the new containers. - for _, name := range added { - _, err = m.createContainer(name) + for _, c := range added { + _, err = m.createContainer(c.Name) if err != nil { - return fmt.Errorf("Failed to create existing container: %s: %s", name, err) + return fmt.Errorf("Failed to create existing container: %s: %s", c.Name, err) } } // Remove the old containers. - for _, name := range removed { - err = m.destroyContainer(name) + for _, c := range removed { + err = m.destroyContainer(c.Name) if err != nil { - return fmt.Errorf("Failed to destroy existing container: %s: %s", name, err) + return fmt.Errorf("Failed to destroy existing container: %s: %s", c.Name, err) } } diff --git a/pages/containers.go b/pages/containers.go index 8efb84d2..c2522cb7 100644 --- a/pages/containers.go +++ b/pages/containers.go @@ -50,8 +50,8 @@ var pageTemplate *template.Template type pageData struct { ContainerName string - ParentContainers []string - Subcontainers []string + ParentContainers []info.ContainerRef + Subcontainers []info.ContainerRef Spec *info.ContainerSpec Stats []*info.ContainerStats MachineInfo *info.MachineInfo @@ -69,14 +69,17 @@ func init() { } // TODO(vmarmol): Escape this correctly. -func containerLink(containerName string, basenameOnly bool, cssClasses string) interface{} { +func containerLink(containerRef info.ContainerRef, basenameOnly bool, cssClasses string) interface{} { var displayName string - if basenameOnly { - displayName = path.Base(string(containerName)) + containerName := containerRef.Name + if len(containerRef.Aliases) > 0 { + displayName = containerRef.Aliases[0] + } else if basenameOnly { + displayName = path.Base(string(containerRef.Name)) } else { - displayName = string(containerName) + displayName = string(containerRef.Name) } - if containerName == "root" { + if containerRef.Name == "root" { containerName = "/" } return template.HTML(fmt.Sprintf("%s", cssClasses, ContainersPage[:len(ContainersPage)-1], containerName, displayName)) @@ -167,15 +170,15 @@ func ServerContainersPage(m manager.Manager, w http.ResponseWriter, u *url.URL) } // Make a list of the parent containers and their links - var parentContainers []string - parentContainers = append(parentContainers, string("root")) + var parentContainers []info.ContainerRef + parentContainers = append(parentContainers, info.ContainerRef{Name: "root"}) parentName := "" for _, part := range strings.Split(string(cont.Name), "/") { if part == "" { continue } parentName += "/" + part - parentContainers = append(parentContainers, string(parentName)) + parentContainers = append(parentContainers, info.ContainerRef{Name: parentName}) } data := &pageData{ From 312bcae2dbc311b4337f45ea900dd2bea97733eb Mon Sep 17 00:00:00 2001 From: Nan Deng Date: Thu, 12 Jun 2014 17:32:46 -0700 Subject: [PATCH 4/7] gofmt -r "ContainerRef->ContainerReference" -w -l . --- container/container.go | 2 +- container/docker/handler.go | 10 +++++----- container/filter.go | 4 ++-- container/filter_test.go | 20 ++++++++++---------- container/lmctfy/lmctfy_container.go | 6 +++--- container/statssum.go | 2 +- container/statssum_test.go | 2 +- info/container.go | 6 +++--- info/container_test.go | 4 ++-- manager/container.go | 10 +++++----- manager/manager.go | 8 ++++---- pages/containers.go | 14 +++++++------- 12 files changed, 44 insertions(+), 44 deletions(-) diff --git a/container/container.go b/container/container.go index ecec1706..c2661bba 100644 --- a/container/container.go +++ b/container/container.go @@ -32,7 +32,7 @@ type ListType int type ContainerHandler interface { GetSpec() (*info.ContainerSpec, error) GetStats() (*info.ContainerStats, error) - ListContainers(listType ListType) ([]info.ContainerRef, error) + ListContainers(listType ListType) ([]info.ContainerReference, error) ListThreads(listType ListType) ([]int, error) ListProcesses(listType ListType) ([]int, error) StatsSummary() (*info.ContainerStatsPercentiles, error) diff --git a/container/docker/handler.go b/container/docker/handler.go index 58b2cb90..5952e72c 100644 --- a/container/docker/handler.go +++ b/container/docker/handler.go @@ -285,12 +285,12 @@ func (self *dockerContainerHandler) GetStats() (stats *info.ContainerStats, err return } -func (self *dockerContainerHandler) ListContainers(listType container.ListType) ([]info.ContainerRef, error) { +func (self *dockerContainerHandler) ListContainers(listType container.ListType) ([]info.ContainerReference, error) { if self.isDockerContainer() { return nil, nil } if self.isRootContainer() && listType == container.LIST_SELF { - return []info.ContainerRef{info.ContainerRef{Name: "/docker"}}, nil + return []info.ContainerReference{info.ContainerReference{Name: "/docker"}}, nil } opt := docker.ListContainersOptions{ All: true, @@ -299,21 +299,21 @@ func (self *dockerContainerHandler) ListContainers(listType container.ListType) if err != nil { return nil, err } - ret := make([]info.ContainerRef, 0, len(containers)+1) + ret := make([]info.ContainerReference, 0, len(containers)+1) for _, c := range containers { if !strings.HasPrefix(c.Status, "Up ") { continue } path := fmt.Sprintf("/docker/%v", c.ID) aliases := c.Names - ref := info.ContainerRef{ + ref := info.ContainerReference{ Name: path, Aliases: aliases, } ret = append(ret, ref) } if self.isRootContainer() { - ret = append(ret, info.ContainerRef{Name: "/docker"}) + ret = append(ret, info.ContainerReference{Name: "/docker"}) } return ret, nil } diff --git a/container/filter.go b/container/filter.go index b1ed38c5..0d262c3f 100644 --- a/container/filter.go +++ b/container/filter.go @@ -34,7 +34,7 @@ func (self *containerListFilter) GetStats() (*info.ContainerStats, error) { return self.handler.GetStats() } -func (self *containerListFilter) ListContainers(listType ListType) ([]info.ContainerRef, error) { +func (self *containerListFilter) ListContainers(listType ListType) ([]info.ContainerReference, error) { containers, err := self.handler.ListContainers(listType) if err != nil { return nil, err @@ -42,7 +42,7 @@ func (self *containerListFilter) ListContainers(listType ListType) ([]info.Conta if len(containers) == 0 { return nil, nil } - ret := make([]info.ContainerRef, 0, len(containers)) + ret := make([]info.ContainerReference, 0, len(containers)) for _, c := range containers { if self.filter(c.Name) { ret = append(ret, c) diff --git a/container/filter_test.go b/container/filter_test.go index 3c4250d8..3a3a3d46 100644 --- a/container/filter_test.go +++ b/container/filter_test.go @@ -37,9 +37,9 @@ func (self *mockContainerHandler) GetStats() (*info.ContainerStats, error) { return args.Get(0).(*info.ContainerStats), args.Error(1) } -func (self *mockContainerHandler) ListContainers(listType ListType) ([]info.ContainerRef, error) { +func (self *mockContainerHandler) ListContainers(listType ListType) ([]info.ContainerReference, error) { args := self.Called(listType) - return args.Get(0).([]info.ContainerRef), args.Error(1) + return args.Get(0).([]info.ContainerReference), args.Error(1) } func (self *mockContainerHandler) ListThreads(listType ListType) ([]int, error) { @@ -55,10 +55,10 @@ func (self *mockContainerHandler) ListProcesses(listType ListType) ([]int, error func TestWhiteListContainerFilter(t *testing.T) { mockc := &mockContainerHandler{} mockc.On("ListContainers", LIST_RECURSIVE).Return( - []info.ContainerRef{ - info.ContainerRef{Name: "/docker/ee0103"}, - info.ContainerRef{Name: "/container/created/by/lmctfy"}, - info.ContainerRef{Name: "/user/something"}, + []info.ContainerReference{ + info.ContainerReference{Name: "/docker/ee0103"}, + info.ContainerReference{Name: "/container/created/by/lmctfy"}, + info.ContainerReference{Name: "/user/something"}, }, nil, ) @@ -90,10 +90,10 @@ func TestWhiteListContainerFilter(t *testing.T) { func TestBlackListContainerFilter(t *testing.T) { mockc := &mockContainerHandler{} mockc.On("ListContainers", LIST_RECURSIVE).Return( - []info.ContainerRef{ - info.ContainerRef{Name: "/docker/ee0103"}, - info.ContainerRef{Name: "/container/created/by/lmctfy"}, - info.ContainerRef{Name: "/user/something"}, + []info.ContainerReference{ + info.ContainerReference{Name: "/docker/ee0103"}, + info.ContainerReference{Name: "/container/created/by/lmctfy"}, + info.ContainerReference{Name: "/user/something"}, }, nil, ) diff --git a/container/lmctfy/lmctfy_container.go b/container/lmctfy/lmctfy_container.go index 39d5d2c5..24e06cee 100644 --- a/container/lmctfy/lmctfy_container.go +++ b/container/lmctfy/lmctfy_container.go @@ -157,7 +157,7 @@ func (c *lmctfyContainerHandler) GetStats() (*info.ContainerStats, error) { } // Gets all subcontainers. -func (c *lmctfyContainerHandler) ListContainers(listType container.ListType) ([]info.ContainerRef, error) { +func (c *lmctfyContainerHandler) ListContainers(listType container.ListType) ([]info.ContainerReference, error) { // Prepare the arguments. args := []string{"list", "containers", "-v"} if listType == container.LIST_RECURSIVE { @@ -177,10 +177,10 @@ func (c *lmctfyContainerHandler) ListContainers(listType container.ListType) ([] return nil, nil } names := strings.Split(string(data), "\n") - containerNames := make([]info.ContainerRef, 0, len(names)) + containerNames := make([]info.ContainerReference, 0, len(names)) for _, name := range names { if len(name) != 0 { - ref := info.ContainerRef{Name: name} + ref := info.ContainerReference{Name: name} containerNames = append(containerNames, ref) } } diff --git a/container/statssum.go b/container/statssum.go index 6756456b..5a85a24b 100644 --- a/container/statssum.go +++ b/container/statssum.go @@ -96,7 +96,7 @@ func (self *percentilesContainerHandlerWrapper) GetStats() (*info.ContainerStats return stats, nil } -func (self *percentilesContainerHandlerWrapper) ListContainers(listType ListType) ([]info.ContainerRef, error) { +func (self *percentilesContainerHandlerWrapper) ListContainers(listType ListType) ([]info.ContainerReference, error) { return self.handler.ListContainers(listType) } diff --git a/container/statssum_test.go b/container/statssum_test.go index 995a29fc..bd31fdb4 100644 --- a/container/statssum_test.go +++ b/container/statssum_test.go @@ -29,7 +29,7 @@ type mockContainer struct { func (self *mockContainer) GetSpec() (*info.ContainerSpec, error) { return nil, nil } -func (self *mockContainer) ListContainers(listType ListType) ([]info.ContainerRef, error) { +func (self *mockContainer) ListContainers(listType ListType) ([]info.ContainerReference, error) { return nil, nil } diff --git a/info/container.go b/info/container.go index d288494d..87d00dbb 100644 --- a/info/container.go +++ b/info/container.go @@ -50,7 +50,7 @@ type ContainerSpec struct { } // Container reference contains enough information to uniquely identify a container -type ContainerRef struct { +type ContainerReference struct { // The absolute name of the container. Name string `json:"name"` @@ -58,10 +58,10 @@ type ContainerRef struct { } type ContainerInfo struct { - ContainerRef + ContainerReference // The direct subcontainers of the current container. - Subcontainers []ContainerRef `json:"subcontainers,omitempty"` + Subcontainers []ContainerReference `json:"subcontainers,omitempty"` // The isolation used in the container. Spec *ContainerSpec `json:"spec,omitempty"` diff --git a/info/container_test.go b/info/container_test.go index a0e67755..4b275bec 100644 --- a/info/container_test.go +++ b/info/container_test.go @@ -30,7 +30,7 @@ func TestStatsStartTime(t *testing.T) { stats = append(stats, s) } cinfo := &ContainerInfo{ - ContainerRef: ContainerRef{ + ContainerReference: ContainerReference{ Name: "/some/container", }, Stats: stats, @@ -54,7 +54,7 @@ func TestStatsEndTime(t *testing.T) { stats = append(stats, s) } cinfo := &ContainerInfo{ - ContainerRef: ContainerRef{ + ContainerReference: ContainerReference{ Name: "/some/container", }, Stats: stats, diff --git a/manager/container.go b/manager/container.go index bba9db7d..59e1bdcd 100644 --- a/manager/container.go +++ b/manager/container.go @@ -35,11 +35,11 @@ type containerStat struct { Data *info.ContainerStats } type containerInfo struct { - info.ContainerRef - Subcontainers []info.ContainerRef - Spec *info.ContainerSpec - Stats *list.List - StatsSummary *info.ContainerStatsPercentiles + info.ContainerReference + Subcontainers []info.ContainerReference + Spec *info.ContainerSpec + Stats *list.List + StatsSummary *info.ContainerStatsPercentiles } type containerData struct { diff --git a/manager/manager.go b/manager/manager.go index 474e7139..2837341d 100644 --- a/manager/manager.go +++ b/manager/manager.go @@ -111,7 +111,7 @@ func (m *manager) GetContainerInfo(containerName string) (*info.ContainerInfo, e // Make a copy of the info for the user. ret := &info.ContainerInfo{ - ContainerRef: info.ContainerRef{ + ContainerReference: info.ContainerReference{ Name: cinfo.Name, }, Subcontainers: cinfo.Subcontainers, @@ -183,7 +183,7 @@ func (m *manager) destroyContainer(containerName string) error { } // Detect all containers that have been added or deleted. -func (m *manager) getContainersDiff() (added []info.ContainerRef, removed []info.ContainerRef, err error) { +func (m *manager) getContainersDiff() (added []info.ContainerReference, removed []info.ContainerReference, err error) { // TODO(vmarmol): We probably don't need to lock around / since it will always be there. m.containersLock.RLock() defer m.containersLock.RUnlock() @@ -197,7 +197,7 @@ func (m *manager) getContainersDiff() (added []info.ContainerRef, removed []info if err != nil { return nil, nil, err } - allContainers = append(allContainers, info.ContainerRef{Name: "/"}) + allContainers = append(allContainers, info.ContainerReference{Name: "/"}) // Determine which were added and which were removed. allContainersSet := make(map[string]*containerData) @@ -214,7 +214,7 @@ func (m *manager) getContainersDiff() (added []info.ContainerRef, removed []info // Removed ones are no longer in the container listing. for _, d := range allContainersSet { - removed = append(removed, d.info.ContainerRef) + removed = append(removed, d.info.ContainerReference) } return diff --git a/pages/containers.go b/pages/containers.go index c2522cb7..2b7f3946 100644 --- a/pages/containers.go +++ b/pages/containers.go @@ -49,9 +49,9 @@ var funcMap = template.FuncMap{ var pageTemplate *template.Template type pageData struct { - ContainerName string - ParentContainers []info.ContainerRef - Subcontainers []info.ContainerRef + ContainerName string + ParentContainers []info.ContainerReference + Subcontainers []info.ContainerReference Spec *info.ContainerSpec Stats []*info.ContainerStats MachineInfo *info.MachineInfo @@ -69,7 +69,7 @@ func init() { } // TODO(vmarmol): Escape this correctly. -func containerLink(containerRef info.ContainerRef, basenameOnly bool, cssClasses string) interface{} { +func containerLink(containerRef info.ContainerReference, basenameOnly bool, cssClasses string) interface{} { var displayName string containerName := containerRef.Name if len(containerRef.Aliases) > 0 { @@ -170,15 +170,15 @@ func ServerContainersPage(m manager.Manager, w http.ResponseWriter, u *url.URL) } // Make a list of the parent containers and their links - var parentContainers []info.ContainerRef - parentContainers = append(parentContainers, info.ContainerRef{Name: "root"}) + var parentContainers []info.ContainerReference + parentContainers = append(parentContainers, info.ContainerReference{Name: "root"}) parentName := "" for _, part := range strings.Split(string(cont.Name), "/") { if part == "" { continue } parentName += "/" + part - parentContainers = append(parentContainers, info.ContainerRef{Name: parentName}) + parentContainers = append(parentContainers, info.ContainerReference{Name: parentName}) } data := &pageData{ From 84ec5a7e915d0cb9b802b2d39188a6c375203b3d Mon Sep 17 00:00:00 2001 From: Nan Deng Date: Thu, 12 Jun 2014 17:35:20 -0700 Subject: [PATCH 5/7] rename var --- pages/containers.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pages/containers.go b/pages/containers.go index 2b7f3946..60034cec 100644 --- a/pages/containers.go +++ b/pages/containers.go @@ -49,9 +49,9 @@ var funcMap = template.FuncMap{ var pageTemplate *template.Template type pageData struct { - ContainerName string - ParentContainers []info.ContainerReference - Subcontainers []info.ContainerReference + ContainerName string + ParentContainers []info.ContainerReference + Subcontainers []info.ContainerReference Spec *info.ContainerSpec Stats []*info.ContainerStats MachineInfo *info.MachineInfo @@ -69,17 +69,17 @@ func init() { } // TODO(vmarmol): Escape this correctly. -func containerLink(containerRef info.ContainerReference, basenameOnly bool, cssClasses string) interface{} { +func containerLink(container info.ContainerReference, basenameOnly bool, cssClasses string) interface{} { var displayName string - containerName := containerRef.Name - if len(containerRef.Aliases) > 0 { - displayName = containerRef.Aliases[0] + containerName := container.Name + if len(container.Aliases) > 0 { + displayName = container.Aliases[0] } else if basenameOnly { - displayName = path.Base(string(containerRef.Name)) + displayName = path.Base(string(container.Name)) } else { - displayName = string(containerRef.Name) + displayName = string(container.Name) } - if containerRef.Name == "root" { + if container.Name == "root" { containerName = "/" } return template.HTML(fmt.Sprintf("%s", cssClasses, ContainersPage[:len(ContainersPage)-1], containerName, displayName)) From 90fc23fe61a498566fa78325d6f4624fe0b22474 Mon Sep 17 00:00:00 2001 From: Nan Deng Date: Thu, 12 Jun 2014 17:36:42 -0700 Subject: [PATCH 6/7] rename var --- manager/manager.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/manager/manager.go b/manager/manager.go index 2837341d..3df5c927 100644 --- a/manager/manager.go +++ b/manager/manager.go @@ -228,18 +228,18 @@ func (m *manager) detectContainers() error { } // Add the new containers. - for _, c := range added { - _, err = m.createContainer(c.Name) + for _, container := range added { + _, err = m.createContainer(container.Name) if err != nil { - return fmt.Errorf("Failed to create existing container: %s: %s", c.Name, err) + return fmt.Errorf("Failed to create existing container: %s: %s", container.Name, err) } } // Remove the old containers. - for _, c := range removed { - err = m.destroyContainer(c.Name) + for _, container := range removed { + err = m.destroyContainer(container.Name) if err != nil { - return fmt.Errorf("Failed to destroy existing container: %s: %s", c.Name, err) + return fmt.Errorf("Failed to destroy existing container: %s: %s", container.Name, err) } } From 30baa981670d05aff055d697037989bdd0f98afa Mon Sep 17 00:00:00 2001 From: Nan Deng Date: Thu, 12 Jun 2014 17:37:49 -0700 Subject: [PATCH 7/7] error when GetStats() return nil, nil --- container/statssum.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/container/statssum.go b/container/statssum.go index 5a85a24b..b562d93b 100644 --- a/container/statssum.go +++ b/container/statssum.go @@ -63,10 +63,8 @@ func (self *percentilesContainerHandlerWrapper) GetStats() (*info.ContainerStats if err != nil { return nil, err } - // nil stats and nil error is possible for /docker container. if stats == nil { - // return nil, fmt.Errorf("container handler returns a nil error and a nil stats") - return nil, nil + return nil, fmt.Errorf("container handler returns a nil error and a nil stats") } if stats.Timestamp.IsZero() { return nil, fmt.Errorf("container handler did not set timestamp")