...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package netutils
17
18 import (
19 "net"
20 "strconv"
21 "strings"
22
23 "github.com/pkg/errors"
24
25 "github.com/chaos-mesh/chaos-mesh/api/v1alpha1"
26 "github.com/chaos-mesh/chaos-mesh/pkg/mock"
27 )
28
29
30 func IPToCidr(ip string) string {
31
32 return ip + "/32"
33 }
34
35
36 func ResolveCidrs(names []string) ([]v1alpha1.CidrAndPort, error) {
37 cidrs := []v1alpha1.CidrAndPort{}
38 for _, target := range names {
39
40 cidr, err := ResolveCidr(target)
41 if err != nil {
42 return nil, err
43 }
44
45 cidrs = append(cidrs, cidr...)
46 }
47
48 return cidrs, nil
49 }
50
51
52 func ResolveCidr(name string) ([]v1alpha1.CidrAndPort, error) {
53 var toResolve string
54 var port uint16
55
56 if host, portStr, err := net.SplitHostPort(name); err == nil {
57 toResolve = host
58 port64, err := strconv.ParseUint(portStr, 10, 16)
59 if err != nil {
60 return nil, errors.Errorf("parse port %s", err)
61 }
62 port = uint16(port64)
63 } else {
64 toResolve = name
65 }
66
67 _, ipnet, err := net.ParseCIDR(toResolve)
68 if err == nil {
69 return []v1alpha1.CidrAndPort{{Cidr: ipnet.String(), Port: port}}, nil
70 }
71
72 if net.ParseIP(toResolve) != nil {
73 return []v1alpha1.CidrAndPort{{Cidr: IPToCidr(toResolve), Port: port}}, nil
74 }
75
76 addrs, err := LookupIP(toResolve)
77 if err != nil {
78 return nil, err
79 }
80
81 cidrs := []v1alpha1.CidrAndPort{}
82 for _, addr := range addrs {
83 addr := addr.String()
84
85
86 if strings.Contains(addr, ".") {
87 cidrs = append(cidrs, v1alpha1.CidrAndPort{Cidr: IPToCidr(addr), Port: port})
88 }
89 }
90 return cidrs, nil
91 }
92
93 func LookupIP(host string) ([]net.IP, error) {
94 if result := mock.On("LookupIP"); result != nil {
95 return result.([]net.IP), nil
96 }
97 return net.LookupIP(host)
98 }
99