Add in the ability to expose the ip address of a container.

This commit is contained in:
Matt Wringe 2016-07-13 13:58:43 -04:00
parent 2290707a3b
commit 213c254bb7
5 changed files with 51 additions and 0 deletions

View File

@ -59,6 +59,9 @@ type ContainerHandler interface {
// Returns container labels, if available. // Returns container labels, if available.
GetContainerLabels() map[string]string GetContainerLabels() map[string]string
// Returns the container's ip address, if available
GetContainerIPAddress() string
// Returns whether the container still exists. // Returns whether the container still exists.
Exists() bool Exists() bool

View File

@ -94,6 +94,9 @@ type dockerContainerHandler struct {
// Filesystem handler. // Filesystem handler.
fsHandler common.FsHandler fsHandler common.FsHandler
// The IP address of the container
ipAddress string
ignoreMetrics container.MetricSet ignoreMetrics container.MetricSet
// thin pool watcher // thin pool watcher
@ -222,6 +225,22 @@ func newDockerContainerHandler(
handler.networkMode = ctnr.HostConfig.NetworkMode handler.networkMode = ctnr.HostConfig.NetworkMode
handler.deviceID = ctnr.GraphDriver.Data["DeviceId"] handler.deviceID = ctnr.GraphDriver.Data["DeviceId"]
// Obtain the IP address for the contianer.
// If the NetworkMode starts with 'container:' then we need to use the IP address of the container specified.
// This happens in cases such as kubernetes where the containers doesn't have an IP address itself and we need to use the pod's address
ipAddress := ctnr.NetworkSettings.IPAddress
networkMode := string(ctnr.HostConfig.NetworkMode)
if ipAddress == "" && strings.HasPrefix(networkMode, "container:") {
containerId := strings.TrimPrefix(networkMode, "container:")
c, err := client.ContainerInspect(context.Background(), containerId)
if err != nil {
return nil, fmt.Errorf("failed to inspect container %q: %v", id, err)
}
ipAddress = c.NetworkSettings.IPAddress
}
handler.ipAddress = ipAddress
if !ignoreMetrics.Has(container.DiskUsageMetrics) { if !ignoreMetrics.Has(container.DiskUsageMetrics) {
handler.fsHandler = &dockerFsHandler{ handler.fsHandler = &dockerFsHandler{
fsHandler: common.NewFsHandler(time.Minute, rootfsStorageDir, otherStorageDir, fsInfo), fsHandler: common.NewFsHandler(time.Minute, rootfsStorageDir, otherStorageDir, fsInfo),
@ -412,6 +431,10 @@ func (self *dockerContainerHandler) GetContainerLabels() map[string]string {
return self.labels return self.labels
} }
func (self *dockerContainerHandler) GetContainerIPAddress() string {
return self.ipAddress
}
func (self *dockerContainerHandler) ListProcesses(listType container.ListType) ([]int, error) { func (self *dockerContainerHandler) ListProcesses(listType container.ListType) ([]int, error) {
return containerlibcontainer.GetProcesses(self.cgroupManager) return containerlibcontainer.GetProcesses(self.cgroupManager)
} }

View File

@ -256,6 +256,11 @@ func (self *rawContainerHandler) GetContainerLabels() map[string]string {
return map[string]string{} return map[string]string{}
} }
func (self *rawContainerHandler) GetContainerIPAddress() string {
// the IP address for the raw container corresponds to the system ip address.
return "127.0.0.1"
}
func (self *rawContainerHandler) ListContainers(listType container.ListType) ([]info.ContainerReference, error) { func (self *rawContainerHandler) ListContainers(listType container.ListType) ([]info.ContainerReference, error) {
return common.ListContainers(self.name, self.cgroupPaths, listType) return common.ListContainers(self.name, self.cgroupPaths, listType)
} }

View File

@ -250,6 +250,21 @@ func (handler *rktContainerHandler) GetStats() (*info.ContainerStats, error) {
return stats, nil return stats, nil
} }
func (self *rktContainerHandler) GetContainerIPAddress() string {
// attempt to return the ip address of the pod
// if a specific ip address of the pod could not be determined, return the system ip address
if self.isPod && len(self.apiPod.Networks) > 0 {
address := self.apiPod.Networks[0].Ipv4
if address != "" {
return address
} else {
return self.apiPod.Networks[0].Ipv6
}
} else {
return "127.0.0.1"
}
}
func (handler *rktContainerHandler) GetCgroupPath(resource string) (string, error) { func (handler *rktContainerHandler) GetCgroupPath(resource string) (string, error) {
path, ok := handler.cgroupPaths[resource] path, ok := handler.cgroupPaths[resource]
if !ok { if !ok {

View File

@ -96,6 +96,11 @@ func (self *MockContainerHandler) Type() container.ContainerType {
return args.Get(0).(container.ContainerType) return args.Get(0).(container.ContainerType)
} }
func (self *MockContainerHandler) GetContainerIPAddress() string {
args := self.Called()
return args.Get(0).(string)
}
type FactoryForMockContainerHandler struct { type FactoryForMockContainerHandler struct {
Name string Name string
PrepareContainerHandlerFunc func(name string, handler *MockContainerHandler) PrepareContainerHandlerFunc func(name string, handler *MockContainerHandler)