Skip to content

Commit ab5ea72

Browse files
authored
Merge pull request kubernetes#418 from muff1nman/namespace-option
Add namespace option for events
2 parents 4ad6227 + 7fd465e commit ab5ea72

File tree

3 files changed

+17
-12
lines changed

3 files changed

+17
-12
lines changed

cmd/options/options.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ type NodeProblemDetectorOptions struct {
4949
// k8sExporter options
5050
// EnableK8sExporter is the flag determining whether to report to Kubernetes.
5151
EnableK8sExporter bool
52+
// EventNamespace is the namespace events are written to
53+
EventNamespace string
5254
// ApiServerOverride is the custom URI used to connect to Kubernetes ApiServer.
5355
ApiServerOverride string
5456
// APIServerWaitTimeout is the timeout on waiting for kube-apiserver to be
@@ -105,6 +107,7 @@ func (npdo *NodeProblemDetectorOptions) AddFlags(fs *pflag.FlagSet) {
105107
[]string{}, "List of paths to custom plugin monitor config files, comma separated.")
106108
fs.MarkDeprecated("custom-plugin-monitors", "replaced by --config.custom-plugin-monitor. NPD will panic if both --custom-plugin-monitors and --config.custom-plugin-monitor are set.")
107109
fs.BoolVar(&npdo.EnableK8sExporter, "enable-k8s-exporter", true, "Enables reporting to Kubernetes API server.")
110+
fs.StringVar(&npdo.EventNamespace, "event-namespace", "", "Namespace for recorded Kubernetes events.")
108111
fs.StringVar(&npdo.ApiServerOverride, "apiserver-override",
109112
"", "Custom URI used to connect to Kubernetes ApiServer. This is ignored if --enable-k8s-exporter is false.")
110113
fs.DurationVar(&npdo.APIServerWaitTimeout, "apiserver-wait-timeout", time.Duration(5)*time.Minute, "The timeout on waiting for kube-apiserver to be ready. This is ignored if --enable-k8s-exporter is false.")

pkg/exporters/k8sexporter/problemclient/problem_client.go

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,12 @@ type Client interface {
5353
}
5454

5555
type nodeProblemClient struct {
56-
nodeName string
57-
client typedcorev1.CoreV1Interface
58-
clock clock.Clock
59-
recorders map[string]record.EventRecorder
60-
nodeRef *v1.ObjectReference
56+
nodeName string
57+
client typedcorev1.CoreV1Interface
58+
clock clock.Clock
59+
recorders map[string]record.EventRecorder
60+
nodeRef *v1.ObjectReference
61+
eventNamespace string
6162
}
6263

6364
// NewClientOrDie creates a new problem client, panics if error occurs.
@@ -76,7 +77,8 @@ func NewClientOrDie(npdo *options.NodeProblemDetectorOptions) Client {
7677
// TODO(random-liu): Set QPS Limit
7778
c.client = clientset.NewForConfigOrDie(cfg).CoreV1()
7879
c.nodeName = npdo.NodeName
79-
c.nodeRef = getNodeRef(c.nodeName)
80+
c.eventNamespace = npdo.EventNamespace
81+
c.nodeRef = getNodeRef(c.eventNamespace, c.nodeName)
8082
c.recorders = make(map[string]record.EventRecorder)
8183
return c
8284
}
@@ -113,7 +115,7 @@ func (c *nodeProblemClient) Eventf(eventType, source, reason, messageFmt string,
113115
recorder, found := c.recorders[source]
114116
if !found {
115117
// TODO(random-liu): If needed use separate client and QPS limit for event.
116-
recorder = getEventRecorder(c.client, c.nodeName, source)
118+
recorder = getEventRecorder(c.client, c.eventNamespace, c.nodeName, source)
117119
c.recorders[source] = recorder
118120
}
119121
recorder.Eventf(c.nodeRef, eventType, reason, messageFmt, args...)
@@ -133,20 +135,20 @@ func generatePatch(conditions []v1.NodeCondition) ([]byte, error) {
133135
}
134136

135137
// getEventRecorder generates a recorder for specific node name and source.
136-
func getEventRecorder(c typedcorev1.CoreV1Interface, nodeName, source string) record.EventRecorder {
138+
func getEventRecorder(c typedcorev1.CoreV1Interface, namespace, nodeName, source string) record.EventRecorder {
137139
eventBroadcaster := record.NewBroadcaster()
138140
eventBroadcaster.StartLogging(glog.V(4).Infof)
139141
recorder := eventBroadcaster.NewRecorder(legacyscheme.Scheme, v1.EventSource{Component: source, Host: nodeName})
140-
eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: c.Events("")})
142+
eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: c.Events(namespace)})
141143
return recorder
142144
}
143145

144-
func getNodeRef(nodeName string) *v1.ObjectReference {
146+
func getNodeRef(namespace, nodeName string) *v1.ObjectReference {
145147
// TODO(random-liu): Get node to initialize the node reference
146148
return &v1.ObjectReference{
147149
Kind: "Node",
148150
Name: nodeName,
149151
UID: types.UID(nodeName),
150-
Namespace: "",
152+
Namespace: namespace,
151153
}
152154
}

pkg/exporters/k8sexporter/problemclient/problem_client_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func newFakeProblemClient() *nodeProblemClient {
4242
// TODO(random-liu): Add test for SetConditions when we have good fake for *client.Client
4343
clock: &clock.FakeClock{},
4444
recorders: make(map[string]record.EventRecorder),
45-
nodeRef: getNodeRef(testNode),
45+
nodeRef: getNodeRef("", testNode),
4646
}
4747
}
4848

0 commit comments

Comments
 (0)