From 6250bf3d0fe5352cc6accba49d49683e8010668a Mon Sep 17 00:00:00 2001 From: Nan Monnand Deng Date: Fri, 13 Jun 2014 18:18:26 -0400 Subject: [PATCH] Add ContainerReference() to ContainerHandler(). --- container/container.go | 1 + container/docker/factory.go | 10 ++++----- container/docker/handler.go | 33 ++++++++++++++++++++++++++++ container/filter.go | 4 ++++ container/filter_test.go | 5 +++++ container/lmctfy/lmctfy_container.go | 4 ++++ container/statssum.go | 4 ++++ container/statssum_test.go | 6 +++++ 8 files changed, 62 insertions(+), 5 deletions(-) diff --git a/container/container.go b/container/container.go index c2661bba..45af3e1f 100644 --- a/container/container.go +++ b/container/container.go @@ -30,6 +30,7 @@ type ListType int // Interface for container operation handlers. type ContainerHandler interface { + ContainerReference() (info.ContainerReference, error) GetSpec() (*info.ContainerSpec, error) GetStats() (*info.ContainerStats, error) ListContainers(listType ListType) ([]info.ContainerReference, error) diff --git a/container/docker/factory.go b/container/docker/factory.go index 6630c712..f7289590 100644 --- a/container/docker/factory.go +++ b/container/docker/factory.go @@ -40,11 +40,11 @@ func (self *dockerFactory) NewContainerHandler(name string) (handler container.C if err != nil { return } - handler = &dockerContainerHandler{ - client: client, - name: name, - machineInfoFactory: self.machineInfoFactory, - } + handler, err = newDockerContainerHandler( + client, + name, + self.machineInfoFactory, + ) return } diff --git a/container/docker/handler.go b/container/docker/handler.go index cb791108..ef477264 100644 --- a/container/docker/handler.go +++ b/container/docker/handler.go @@ -35,10 +35,43 @@ import ( type dockerContainerHandler struct { client *docker.Client name string + aliases []string machineInfoFactory info.MachineInfoFactory container.NoStatsSummary } +func newDockerContainerHandler( + client *docker.Client, + name string, + machineInfoFactory info.MachineInfoFactory, +) (container.ContainerHandler, error) { + handler := &dockerContainerHandler{ + client: client, + name: name, + machineInfoFactory: machineInfoFactory, + } + if !handler.isDockerContainer() { + return handler, nil + } + _, id, err := handler.splitName() + if err != nil { + return nil, fmt.Errorf("invalid docker container %v: %v", name, err) + } + ctnr, err := client.InspectContainer(id) + if err != nil { + return nil, fmt.Errorf("unable to inspect container %v: %v", name, err) + } + handler.aliases = append(handler.aliases, ctnr.Name) + return handler, nil +} + +func (self *dockerContainerHandler) ContainerReference() (info.ContainerReference, error) { + return info.ContainerReference{ + Name: self.name, + Aliases: self.aliases, + }, nil +} + func (self *dockerContainerHandler) splitName() (string, string, error) { parent, id := path.Split(self.name) cgroupSelf, err := os.Open("/proc/self/cgroup") diff --git a/container/filter.go b/container/filter.go index 0d262c3f..313a861e 100644 --- a/container/filter.go +++ b/container/filter.go @@ -26,6 +26,10 @@ type containerListFilter struct { NoStatsSummary } +func (self *containerListFilter) ContainerReference() (info.ContainerReference, error) { + return self.handler.ContainerReference() +} + func (self *containerListFilter) GetSpec() (*info.ContainerSpec, error) { return self.handler.GetSpec() } diff --git a/container/filter_test.go b/container/filter_test.go index 3a3a3d46..91abf3df 100644 --- a/container/filter_test.go +++ b/container/filter_test.go @@ -32,6 +32,11 @@ func (self *mockContainerHandler) GetSpec() (*info.ContainerSpec, error) { return args.Get(0).(*info.ContainerSpec), args.Error(1) } +func (self *mockContainerHandler) ContainerReference() (info.ContainerReference, error) { + args := self.Called() + return args.Get(0).(info.ContainerReference), args.Error(1) +} + func (self *mockContainerHandler) GetStats() (*info.ContainerStats, error) { args := self.Called() return args.Get(0).(*info.ContainerStats), args.Error(1) diff --git a/container/lmctfy/lmctfy_container.go b/container/lmctfy/lmctfy_container.go index 24e06cee..c41278ae 100644 --- a/container/lmctfy/lmctfy_container.go +++ b/container/lmctfy/lmctfy_container.go @@ -47,6 +47,10 @@ func New(name string) (container.ContainerHandler, error) { return el, nil } +func (self *lmctfyContainerHandler) ContainerReference() (info.ContainerReference, error) { + return info.ContainerReference{Name: self.Name}, nil +} + func getExitCode(err error) int { msg, ok := err.(*exec.ExitError) if ok { diff --git a/container/statssum.go b/container/statssum.go index b562d93b..d24caed2 100644 --- a/container/statssum.go +++ b/container/statssum.go @@ -36,6 +36,10 @@ func (self *percentilesContainerHandlerWrapper) GetSpec() (*info.ContainerSpec, return self.handler.GetSpec() } +func (self *percentilesContainerHandlerWrapper) ContainerReference() (info.ContainerReference, error) { + return self.handler.ContainerReference() +} + func (self *percentilesContainerHandlerWrapper) updatePrevStats(stats *info.ContainerStats) { if stats == nil || stats.Cpu == nil || stats.Memory == nil { // discard incomplete stats diff --git a/container/statssum_test.go b/container/statssum_test.go index bd31fdb4..654f93c0 100644 --- a/container/statssum_test.go +++ b/container/statssum_test.go @@ -94,6 +94,12 @@ func containerWithTrace(duration time.Duration, cpuUsages []uint64, memUsages [] } } +func (self *replayTrace) ContainerReference() (info.ContainerReference, error) { + return info.ContainerReference{ + Name: "replay", + }, nil +} + func (self *replayTrace) GetStats() (*info.ContainerStats, error) { stats := new(info.ContainerStats) stats.Cpu = new(info.CpuStats)