Skip to content

Commit

Permalink
k8s: Make node-name obtention more robust
Browse files Browse the repository at this point in the history
* Align with kubernetes on how the system uuid is obtained
* Fallback to report all pods (printing a warning) if the node-name cannot be obtained
  • Loading branch information
Alfonso Acosta committed Jan 11, 2017
1 parent 91769fc commit 396f276
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 17 deletions.
31 changes: 16 additions & 15 deletions probe/kubernetes/reporter.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package kubernetes

import (
"io/ioutil"
"os"
"strings"

"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/labels"

log "github.com/Sirupsen/logrus"

"github.com/google/cadvisor/utils/sysfs"
"github.com/weaveworks/common/mtime"
"github.com/weaveworks/scope/probe"
"github.com/weaveworks/scope/probe/controls"
Expand Down Expand Up @@ -95,17 +96,23 @@ type Reporter struct {
probe *probe.Probe
hostID string
handlerRegistry *controls.HandlerRegistry
thisNodeName string
}

// NewReporter makes a new Reporter
func NewReporter(client Client, pipes controls.PipeClient, probeID string, hostID string, probe *probe.Probe, handlerRegistry *controls.HandlerRegistry) *Reporter {
thisNodeName, err := GetNodeName(client)
if err != nil {
log.Warnf("cannot obtain k8s node name: all pods will be reported: %v", err)
}
reporter := &Reporter{
client: client,
pipes: pipes,
probeID: probeID,
probe: probe,
hostID: hostID,
handlerRegistry: handlerRegistry,
thisNodeName: thisNodeName,
}
reporter.registerControls()
client.WatchPods(reporter.podEvent)
Expand Down Expand Up @@ -316,17 +323,14 @@ func (r *Reporter) replicaSetTopology(probeID string, deployments []Deployment)

// GetNodeName return the k8s node name for the current machine.
// It is exported for testing.
var GetNodeName = func(r *Reporter) (string, error) {
uuidBytes, err := ioutil.ReadFile("/sys/class/dmi/id/product_uuid")
if os.IsNotExist(err) {
uuidBytes, err = ioutil.ReadFile("/sys/hypervisor/uuid")
}
var GetNodeName = func(client Client) (string, error) {
realSysFs, _ := sysfs.NewRealSysFs()
uuid, err := realSysFs.GetSystemUUID()
if err != nil {
return "", err
}
uuid := strings.Trim(string(uuidBytes), "\n")
nodeName := ""
err = r.client.WalkNodes(func(node *api.Node) error {
err = client.WalkNodes(func(node *api.Node) error {
if node.Status.NodeInfo.SystemUUID == string(uuid) {
nodeName = node.ObjectMeta.Name
}
Expand Down Expand Up @@ -387,12 +391,9 @@ func (r *Reporter) podTopology(services []Service, replicaSets []ReplicaSet) (re
))
}

thisNodeName, err := GetNodeName(r)
if err != nil {
return pods, err
}
err = r.client.WalkPods(func(p Pod) error {
if p.NodeName() != thisNodeName {
err := r.client.WalkPods(func(p Pod) error {
// Filter out pods not scheduled in this machine (if we know this node's name)
if r.thisNodeName != "" && p.NodeName() != r.thisNodeName {
return nil
}
for _, selector := range selectors {
Expand Down
4 changes: 2 additions & 2 deletions probe/kubernetes/reporter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ func (c mockPipeClient) PipeClose(appID, id string) error {
func TestReporter(t *testing.T) {
oldGetNodeName := kubernetes.GetNodeName
defer func() { kubernetes.GetNodeName = oldGetNodeName }()
kubernetes.GetNodeName = func(*kubernetes.Reporter) (string, error) {
kubernetes.GetNodeName = func(kubernetes.Client) (string, error) {
return nodeName, nil
}

Expand Down Expand Up @@ -273,7 +273,7 @@ func (c *callbackReadCloser) Close() error { return c.close() }
func TestReporterGetLogs(t *testing.T) {
oldGetNodeName := kubernetes.GetNodeName
defer func() { kubernetes.GetNodeName = oldGetNodeName }()
kubernetes.GetNodeName = func(*kubernetes.Reporter) (string, error) {
kubernetes.GetNodeName = func(kubernetes.Client) (string, error) {
return nodeName, nil
}

Expand Down

0 comments on commit 396f276

Please sign in to comment.