/
eni.go
147 lines (121 loc) · 3.3 KB
/
eni.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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package eni
import (
"fmt"
"net"
"net/netip"
"github.com/AliyunContainerService/terway/pkg/aliyun/instance"
"github.com/AliyunContainerService/terway/pkg/aliyun/metadata"
"github.com/AliyunContainerService/terway/types"
"github.com/AliyunContainerService/terway/types/daemon"
)
// ENIInfoGetter interface to get eni information
type ENIInfoGetter interface {
GetENIByMac(mac string) (*daemon.ENI, error)
GetENIPrivateAddressesByMACv2(mac string) ([]netip.Addr, error)
GetENIPrivateIPv6AddressesByMACv2(mac string) ([]netip.Addr, error)
GetENIs(containsMainENI bool) ([]*daemon.ENI, error)
GetSecondaryENIMACs() ([]string, error)
}
type ENIMetadata struct {
ipv4, ipv6 bool
}
func NewENIMetadata(ipv4, ipv6 bool) *ENIMetadata {
return &ENIMetadata{
ipv4: ipv4,
ipv6: ipv6,
}
}
func (e *ENIMetadata) GetENIByMac(mac string) (*daemon.ENI, error) {
eni := daemon.ENI{
MAC: mac,
}
var err error
eni.ID, err = metadata.GetENIID(mac)
if err != nil {
return nil, fmt.Errorf("error get eni by id %s, %w", eni.ID, err)
}
ip, err := metadata.GetENIPrimaryIP(mac)
if err != nil {
return nil, fmt.Errorf("error get eni primary ip by %s, %w", mac, err)
}
eni.PrimaryIP = types.IPSet{
IPv4: ip,
}
gw, err := metadata.GetENIGateway(mac)
if err != nil {
return nil, fmt.Errorf("error get eni gateway by mac %s, %w", mac, err)
}
vSwitchCIDR, err := metadata.GetVSwitchCIDR(mac)
if err != nil {
return nil, fmt.Errorf("error get eni vSwitchCIDR from metaserver, mac: %s, %w", mac, err)
}
var v6gw net.IP
var vSwitchIPv6CIDR *net.IPNet
if e.ipv6 {
v6gw, err = metadata.GetENIV6Gateway(mac)
if err != nil {
return nil, fmt.Errorf("error get eni ipv6 gateway from metaserver, mac: %s, %w", mac, err)
}
vSwitchIPv6CIDR, err = metadata.GetVSwitchIPv6CIDR(mac)
if err != nil {
return nil, fmt.Errorf("error get eni vSwitchIPv6CIDR from metaserver, mac: %s, %w", mac, err)
}
}
eni.VSwitchCIDR = types.IPNetSet{
IPv4: vSwitchCIDR,
IPv6: vSwitchIPv6CIDR,
}
eni.GatewayIP = types.IPSet{
IPv4: gw,
IPv6: v6gw,
}
vswitch, err := metadata.GetENIVSwitchID(mac)
if err != nil {
return nil, fmt.Errorf("error get eni vswitch from metaserver, mac: %s, %w", mac, err)
}
eni.VSwitchID = vswitch
return &eni, nil
}
func (e *ENIMetadata) GetENIPrivateAddressesByMACv2(mac string) ([]netip.Addr, error) {
return metadata.GetIPv4ByMac(mac)
}
func (e *ENIMetadata) GetENIPrivateIPv6AddressesByMACv2(mac string) ([]netip.Addr, error) {
return metadata.GetIPv6ByMac(mac)
}
func (e *ENIMetadata) GetENIs(containsMainENI bool) ([]*daemon.ENI, error) {
var enis []*daemon.ENI
mainENIMac := instance.GetInstanceMeta().PrimaryMAC
macs, err := metadata.GetENIsMAC()
if err != nil {
return nil, err
}
for _, mac := range macs {
if !containsMainENI {
if mac == mainENIMac {
continue
}
}
eni, err := e.GetENIByMac(mac)
if err != nil {
return nil, err
}
enis = append(enis, eni)
}
return enis, nil
}
// GetSecondaryENIMACs return secondary ENI macs
func (e *ENIMetadata) GetSecondaryENIMACs() ([]string, error) {
var result []string
mainENIMac := instance.GetInstanceMeta().PrimaryMAC
macs, err := metadata.GetENIsMAC()
if err != nil {
return nil, err
}
for _, mac := range macs {
if mac == mainENIMac {
continue
}
result = append(result, mac)
}
return result, nil
}