-
Notifications
You must be signed in to change notification settings - Fork 98
/
find.go
114 lines (100 loc) · 2.99 KB
/
find.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// Unless explicitly stated otherwise all files in this repository are licensed
// under the Apache License Version 2.0.
// This product includes software developed at Datadog (https://www.datadoghq.com/).
// Copyright 2016-2020 Datadog, Inc.
package find
import (
"context"
"errors"
"fmt"
"github.com/DataDog/datadog-operator/pkg/plugin/common"
"github.com/spf13/cobra"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/cli-runtime/pkg/genericclioptions"
)
var findExample = `
# find the datadog agent pod monitoring a pod named foo
%[1]s find foo
`
// options provides information required by Datadog find command
type options struct {
genericclioptions.IOStreams
common.Options
args []string
podName string
}
// newOptions provides an instance of getOptions with default values
func newOptions(streams genericclioptions.IOStreams) *options {
o := &options{
IOStreams: streams,
}
o.SetConfigFlags()
return o
}
// New provides a cobra command wrapping options for "find" sub command
func New(streams genericclioptions.IOStreams) *cobra.Command {
o := newOptions(streams)
cmd := &cobra.Command{
Use: "find [pod name] [flags]",
Short: "Find datadog agent pod monitoring a given pod",
Example: fmt.Sprintf(findExample, "kubectl datadog"),
SilenceUsage: true,
RunE: func(c *cobra.Command, args []string) error {
if err := o.complete(c, args); err != nil {
return err
}
if err := o.validate(); err != nil {
return err
}
return o.run(c)
},
}
o.ConfigFlags.AddFlags(cmd.Flags())
return cmd
}
// complete sets all information required for processing the command
func (o *options) complete(cmd *cobra.Command, args []string) error {
o.args = args
if len(args) > 0 {
o.podName = args[0]
}
return o.Init(cmd)
}
// validate ensures that all required arguments and flag values are provided
func (o *options) validate() error {
if o.podName == "" {
return errors.New("pod name argument is missing")
}
argsCount := len(o.args)
if argsCount > 1 {
return fmt.Errorf("one argument is allowed, got %d", argsCount)
}
return nil
}
// run runs the find command
func (o *options) run(cmd *cobra.Command) error {
pod, err := o.Clientset.CoreV1().Pods(o.UserNamespace).Get(context.TODO(), o.podName, metav1.GetOptions{})
if err != nil {
return err
}
agentName, err := o.getAgentByNode(pod.Spec.NodeName)
if err != nil {
return err
}
cmd.Println(fmt.Sprintf("Agent %s is monitoring %s", agentName, o.podName))
return nil
}
// getAgentByNode returns the pod of the datadog agent running on a given node
func (o *options) getAgentByNode(nodeName string) (string, error) {
podList, err := o.Clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{
FieldSelector: fmt.Sprintf("spec.nodeName=%s", nodeName),
LabelSelector: common.AgentLabel,
})
if err != nil {
return "", err
}
if len(podList.Items) == 0 {
return "", fmt.Errorf("no agent pod found. Label selector used: %s", common.AgentLabel)
}
return podList.Items[0].Name, nil
}