Skip to content

Commit e49bcbc

Browse files
authored
Merge pull request #12 from OrangeBao/main
feat: support check mode for node to node, node to pod, pod to pod, p…
2 parents a247b26 + 64269b1 commit e49bcbc

File tree

10 files changed

+135
-19
lines changed

10 files changed

+135
-19
lines changed

pkg/command/check.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ func NewCheckCmd() *cobra.Command {
5858
func (o *CheckOptions) LoadConfig() {
5959
fromConfig := &share.DoOptions{}
6060
if err := utils.ReadOpt(fromConfig); err == nil {
61+
if len(fromConfig.Mode) == 0 {
62+
fromConfig.Mode = share.Pod
63+
}
6164
once.Do(func() {
6265
klog.Infof("use config from file!!!!!!")
6366
})
@@ -79,7 +82,7 @@ func (o *CheckOptions) Complete() error {
7982
Version: o.DoOption.Version,
8083
PodWaitTime: o.DoOption.PodWaitTime,
8184
Port: o.DoOption.Port,
82-
EnableHostNetwork: false,
85+
EnableHostNetwork: o.DoOption.GetEnableHostNetwork(true),
8386
EnableAnalysis: false,
8487
}
8588
if err := srcfloater.CompleteFromKubeConfigPath(o.DoOption.SrcKubeConfig, ""); err != nil {
@@ -97,7 +100,7 @@ func (o *CheckOptions) Complete() error {
97100
Version: o.DoOption.Version,
98101
PodWaitTime: o.DoOption.PodWaitTime,
99102
Port: o.DoOption.Port,
100-
EnableHostNetwork: false,
103+
EnableHostNetwork: o.DoOption.GetEnableHostNetwork(false),
101104
EnableAnalysis: false,
102105
}
103106
if err := dstfloater.CompleteFromKubeConfigPath(o.DoOption.DstKubeConfig, ""); err != nil {

pkg/command/clean.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ func NewCleanCmd() *cobra.Command {
5151
func (o *CleanOptions) LoadConfig() {
5252
fromConfig := &share.DoOptions{}
5353
if err := utils.ReadOpt(fromConfig); err == nil {
54+
if len(fromConfig.Mode) == 0 {
55+
fromConfig.Mode = share.Pod
56+
}
5457
once.Do(func() {
5558
klog.Infof("use config from file!!!!!!")
5659
})
@@ -68,7 +71,7 @@ func (o *CleanOptions) Complete() error {
6871
Version: o.DoOption.Version,
6972
PodWaitTime: o.DoOption.PodWaitTime,
7073
Port: o.DoOption.Port,
71-
EnableHostNetwork: false,
74+
EnableHostNetwork: o.DoOption.GetEnableHostNetwork(true),
7275
EnableAnalysis: false,
7376
}
7477
if err := srcfloater.CompleteFromKubeConfigPath(o.DoOption.SrcKubeConfig, ""); err != nil {
@@ -86,7 +89,7 @@ func (o *CleanOptions) Complete() error {
8689
Version: o.DoOption.Version,
8790
PodWaitTime: o.DoOption.PodWaitTime,
8891
Port: o.DoOption.Port,
89-
EnableHostNetwork: false,
92+
EnableHostNetwork: o.DoOption.GetEnableHostNetwork(false),
9093
EnableAnalysis: false,
9194
}
9295
if err := dstfloater.CompleteFromKubeConfigPath(o.DoOption.DstKubeConfig, ""); err != nil {

pkg/command/init.go

+1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ func (o *InitOptions) Run() error {
6565
// dst
6666
DstImageRepository: "",
6767
DstKubeConfig: "",
68+
Mode: share.Pod,
6869
}
6970

7071
if err := utils.WriteOpt(doOptions); err != nil {

pkg/command/resume.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ func NewResumeCmd() *cobra.Command {
5252
func (o *ResumeOptions) LoadConfig() {
5353
fromConfig := &share.DoOptions{}
5454
if err := utils.ReadOpt(fromConfig); err == nil {
55+
if len(fromConfig.Mode) == 0 {
56+
fromConfig.Mode = share.Pod
57+
}
5558
once.Do(func() {
5659
klog.Infof("use config from file!!!!!!")
5760
})
@@ -72,7 +75,7 @@ func (o *ResumeOptions) Complete() error {
7275
Version: o.DoOption.Version,
7376
PodWaitTime: o.DoOption.PodWaitTime,
7477
Port: o.DoOption.Port,
75-
EnableHostNetwork: false,
78+
EnableHostNetwork: o.DoOption.GetEnableHostNetwork(true),
7679
EnableAnalysis: false,
7780
}
7881
if err := srcfloater.CompleteFromKubeConfigPath(o.DoOption.SrcKubeConfig, ""); err != nil {
@@ -90,7 +93,7 @@ func (o *ResumeOptions) Complete() error {
9093
Version: o.DoOption.Version,
9194
PodWaitTime: o.DoOption.PodWaitTime,
9295
Port: o.DoOption.Port,
93-
EnableHostNetwork: false,
96+
EnableHostNetwork: o.DoOption.GetEnableHostNetwork(false),
9497
EnableAnalysis: false,
9598
}
9699
if err := dstfloater.CompleteFromKubeConfigPath(o.DoOption.DstKubeConfig, ""); err != nil {

pkg/command/share/do.go

+75-9
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,19 @@ import (
1111
"k8s.io/klog/v2"
1212
)
1313

14+
type ModeType string
15+
16+
const (
17+
Node ModeType = "node"
18+
Pod ModeType = "pod"
19+
NodeToPod ModeType = "node-to-pod"
20+
PodToNode ModeType = "pod-to-node"
21+
)
22+
1423
type DoOptions struct {
15-
Namespace string `json:"namespace,omitempty"`
16-
Version string `json:"version,omitempty"`
24+
Namespace string `json:"namespace,omitempty"`
25+
Version string `json:"version,omitempty"`
26+
Mode ModeType `json:"mode,omitempty"`
1727

1828
Protocol string `json:"protocol,omitempty"`
1929
PodWaitTime int `json:"podWaitTime,omitempty"`
@@ -38,33 +48,78 @@ type DoOptions struct {
3848
ResumeRecord []*PrintCheckData `json:"-"`
3949
}
4050

51+
func (o *DoOptions) GetEnableHostNetwork(isSrc bool) bool {
52+
if isSrc {
53+
switch o.Mode {
54+
case Node, NodeToPod:
55+
return true
56+
case Pod, PodToNode:
57+
return false
58+
}
59+
} else {
60+
switch o.Mode {
61+
case Node, PodToNode:
62+
return true
63+
case NodeToPod, Pod:
64+
return false
65+
}
66+
}
67+
return false
68+
}
69+
70+
func (o *DoOptions) GetInfo(floater *Floater, isSrc bool) ([]*FloatInfo, error) {
71+
if isSrc {
72+
switch o.Mode {
73+
case Node, NodeToPod:
74+
return floater.GetNodesInfo()
75+
case Pod, PodToNode:
76+
return floater.GetPodInfo()
77+
}
78+
} else {
79+
switch o.Mode {
80+
case Node, PodToNode:
81+
return floater.GetNodesInfo()
82+
case NodeToPod, Pod:
83+
return floater.GetPodInfo()
84+
}
85+
}
86+
return floater.GetPodInfo()
87+
}
88+
4189
func (o *DoOptions) Run() error {
4290
if err := o.SrcFloater.CreateFloater(); err != nil {
4391
return err
4492
}
4593

4694
if o.DstKubeConfig != "" {
47-
srcPodInfos, err := o.SrcFloater.GetPodInfo()
95+
srcInfos, err := o.GetInfo(o.SrcFloater, true)
4896
if err != nil {
4997
return fmt.Errorf("get src cluster podInfos failed: %s", err)
5098
}
5199

52100
if err = o.DstFloater.CreateFloater(); err != nil {
53101
return err
54102
}
55-
var dstPodInfos []*FloatInfo
56-
dstPodInfos, err = o.DstFloater.GetPodInfo()
103+
var dstInfos []*FloatInfo
104+
dstInfos, err = o.GetInfo(o.DstFloater, false)
57105
if err != nil {
58106
return fmt.Errorf("get dist cluster podInfos failed: %s", err)
59107
}
60108

61-
PrintResult(o.RunRange(srcPodInfos, dstPodInfos))
109+
PrintResult(o.RunRange(srcInfos, dstInfos))
62110
} else {
63-
srcPodInfos, err := o.SrcFloater.GetPodInfo()
111+
srcInfos, err := o.GetInfo(o.SrcFloater, true)
64112
if err != nil {
65113
return fmt.Errorf("get src cluster podInfos failed: %s", err)
66114
}
67-
PrintResult(o.RunRange(srcPodInfos, srcPodInfos))
115+
116+
var dstInfos []*FloatInfo
117+
dstInfos, err = o.GetInfo(o.SrcFloater, false)
118+
if err != nil {
119+
return fmt.Errorf("get dist cluster podInfos failed: %s", err)
120+
}
121+
122+
PrintResult(o.RunRange(srcInfos, dstInfos))
68123
}
69124

70125
if o.AutoClean {
@@ -149,7 +204,13 @@ func (o *DoOptions) RunRange(iPodInfos []*FloatInfo, jPodInfos []*FloatInfo) []*
149204
cmdObj = command.NewCmd(o.Protocol, o.TargetHostToLookup, o.TargetDNSServer)
150205
} else {
151206
for _, jPodInfo := range jPodInfos {
152-
for _, ip := range jPodInfo.PodIPs {
207+
targetIPs := jPodInfo.PodIPs
208+
needWrapper := false
209+
if len(jPodInfo.NodeIPs) != 0 {
210+
targetIPs = jPodInfo.NodeIPs
211+
needWrapper = true
212+
}
213+
for _, ip := range targetIPs {
153214
var targetIP string
154215
var err error
155216
var cmdResult *command.Result
@@ -163,6 +224,11 @@ func (o *DoOptions) RunRange(iPodInfos []*FloatInfo, jPodInfos []*FloatInfo) []*
163224
}
164225
// ToDo RunRange && RunNative func support multiple commands, and the code needs to be optimized
165226
cmdObj := command.NewCmd(o.Protocol, targetIP, o.Port)
227+
if needWrapper {
228+
cmdObj = command.Wrapper{
229+
Cmd: cmdObj,
230+
}
231+
}
166232
cmdResult = o.SrcFloater.CommandExec(iPodInfo, cmdObj)
167233
}
168234
mutex.Lock()

pkg/command/share/floater.go

+15-1
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,21 @@ func (f *Floater) applyDaemonSet() error {
161161
if err != nil {
162162
return err
163163
}
164-
_, err = f.Client.AppsV1().DaemonSets(f.Namespace).Create(context.Background(), clusterlinkFloaterDaemonSet, metav1.CreateOptions{})
164+
165+
applyFunc := func() error {
166+
_, err = f.Client.AppsV1().DaemonSets(f.Namespace).Create(context.Background(), clusterlinkFloaterDaemonSet, metav1.CreateOptions{})
167+
return err
168+
}
169+
170+
_, err = f.Client.AppsV1().DaemonSets(f.Namespace).Get(context.Background(), f.Name, metav1.GetOptions{})
171+
if err == nil {
172+
applyFunc = func() error {
173+
_, err = f.Client.AppsV1().DaemonSets(f.Namespace).Update(context.Background(), clusterlinkFloaterDaemonSet, metav1.UpdateOptions{})
174+
return err
175+
}
176+
}
177+
178+
err = applyFunc()
165179
if err != nil {
166180
if !apierrors.IsAlreadyExists(err) {
167181
return fmt.Errorf("linkctl floater run error, daemonset options failed: %v", err)

pkg/command/share/remote-command/ping.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ package command
33
import (
44
"fmt"
55
"regexp"
6+
7+
"github.com/kosmos.io/netdoctor/pkg/utils"
68
)
79

8-
var pingReg, _ = regexp.Compile(`PING[\s\S]*1\spackets\stransmitted,\s1\spackets\sreceived,\s0[%]\spacket\sloss[\s\S]*$`)
10+
var pingReg, _ = regexp.Compile(`PING[\s\S]*\s0[%]\spacket\sloss[\s\S]*$`)
911

1012
type Ping struct {
1113
TargetIP string
@@ -17,7 +19,11 @@ func (c *Ping) GetTargetStr() string {
1719

1820
func (c *Ping) GetCommandStr() string {
1921
// execute once
20-
return fmt.Sprintf("ping -c 1 %s", c.TargetIP)
22+
if utils.IsIPv6(c.TargetIP) {
23+
return fmt.Sprintf("ping6 -c 1 %s", c.TargetIP)
24+
} else {
25+
return fmt.Sprintf("ping -c 1 %s", c.TargetIP)
26+
}
2127
}
2228

2329
func (c *Ping) ParseResult(result string) *Result {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package command
2+
3+
import "fmt"
4+
5+
type Wrapper struct {
6+
Cmd Command
7+
}
8+
9+
func (w Wrapper) GetCommandStr() string {
10+
return fmt.Sprintf(`nsenter --target "1" --mount --uts --ipc --net --pid -- %s`, w.Cmd.GetCommandStr())
11+
}
12+
13+
func (w Wrapper) ParseResult(str string) *Result {
14+
return w.Cmd.ParseResult(str)
15+
}
16+
17+
func (w Wrapper) GetTargetStr() string {
18+
return w.Cmd.GetTargetStr()
19+
}

pkg/manifest/manifest_daemonsets.go

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ spec:
4141
value: "{{ .Port }}"
4242
- name: "ENABLE_ANALYSIS"
4343
value: "{{ .EnableAnalysis }}"
44+
hostPID: true
4445
tolerations:
4546
- effect: NoSchedule
4647
operator: Exists

pkg/utils/constants.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ type Protocol string
1111
const (
1212
TCP Protocol = "tcp"
1313
UDP Protocol = "udp"
14-
IPv4 Protocol = "ipv4"
14+
ICMP Protocol = "icmp"
1515
DNS Protocol = "dns"
1616
)

0 commit comments

Comments
 (0)