fix(region): support public ipv6 addr sync (#19420)

This commit is contained in:
屈轩
2024-02-02 17:14:21 +08:00
committed by GitHub
parent 1e5d988346
commit 629ca22509
22 changed files with 311 additions and 33 deletions
+1 -1
View File
@@ -88,7 +88,7 @@ require (
k8s.io/client-go v0.19.3
k8s.io/cluster-bootstrap v0.19.3
moul.io/http2curl/v2 v2.3.0
yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240131125247-71c9e0baa777
yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240202081639-6a67ceb49f35
yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32
yunion.io/x/jsonutils v1.0.1-0.20230613121553-0f3b41e2ef19
yunion.io/x/log v1.0.1-0.20230411060016-feb3f46ab361
+2 -2
View File
@@ -1201,8 +1201,8 @@ sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240131125247-71c9e0baa777 h1:/5eC7wrBuySoO2R2a9RU48mP1bwBoEo7Mdha1OcKN6c=
yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240131125247-71c9e0baa777/go.mod h1:aj1gR9PPb6eqqKOwvANe26CoZFY8ydmXy0fuvgKYXH0=
yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240202081639-6a67ceb49f35 h1:pgyOGaIkGBhgBNMNAhRFHFn9oDS2iq4vBUJAelQfBiQ=
yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240202081639-6a67ceb49f35/go.mod h1:dsUESXIbXJ+/ywbNClhldOrbPOiBi2udrgOnB/ffoWk=
yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32 h1:v7POYkQwo1XzOxBoIoRVr/k0V9Y5JyjpshlIFa9raug=
yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws=
yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634=
+1 -1
View File
@@ -1465,7 +1465,7 @@ sigs.k8s.io/structured-merge-diff/v4/value
# sigs.k8s.io/yaml v1.2.0
## explicit; go 1.12
sigs.k8s.io/yaml
# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240131125247-71c9e0baa777
# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20240202081639-6a67ceb49f35
## explicit; go 1.18
yunion.io/x/cloudmux/pkg/apis
yunion.io/x/cloudmux/pkg/apis/billing
+6
View File
@@ -142,6 +142,7 @@ func (self *SRegion) GetInstances(zoneId string, ids []string) ([]SInstance, err
params := make(map[string]string)
params["RegionId"] = self.RegionId
params["MaxResults"] = "100"
params["AdditionalAttributes.1"] = "NETWORK_PRIMARY_ENI_IP"
if len(zoneId) > 0 {
params["ZoneId"] = zoneId
@@ -276,6 +277,11 @@ func (self *SInstance) GetINics() ([]cloudprovider.ICloudNic, error) {
ipAddr: networkInterface.PrimaryIpAddress,
macAddr: networkInterface.MacAddress,
}
for _, ipv6 := range networkInterface.Ipv6Sets.Ipv6Set {
if len(ipv6.Ipv6Address) > 0 {
nic.ip6Addr = ipv6.Ipv6Address
}
}
nics = append(nics, &nic)
}
for _, classicIp := range self.InnerIpAddress.IpAddress {
+5
View File
@@ -31,6 +31,7 @@ type SInstanceNic struct {
instance *SInstance
id string
ipAddr string
ip6Addr string
macAddr string
classic bool
@@ -53,6 +54,10 @@ func (self *SInstanceNic) GetIP() string {
return self.ipAddr
}
func (self *SInstanceNic) GetIP6() string {
return self.ip6Addr
}
func (self *SInstanceNic) GetMAC() string {
if len(self.macAddr) > 0 {
return self.macAddr
@@ -72,6 +72,11 @@ type SNetworkInterface struct {
NetworkInterfaceId string
PrimaryIpAddress string
PrivateIpAddress string
Ipv6Sets struct {
Ipv6Set []struct {
Ipv6Address string
}
}
Attachment struct {
InstanceId string
+16 -11
View File
@@ -50,17 +50,18 @@ type SVpc struct {
routeTables []cloudprovider.ICloudRouteTable
CidrBlock string
CreationTime time.Time
Description string
IsDefault bool
RegionId string
Status string
UserCidrs SUserCIDRs
VRouterId string
VSwitchIds SVSwitchIds
VpcId string
VpcName string
CidrBlock string
Ipv6CidrBlock string
CreationTime time.Time
Description string
IsDefault bool
RegionId string
Status string
UserCidrs SUserCIDRs
VRouterId string
VSwitchIds SVSwitchIds
VpcId string
VpcName string
}
func (self *SVpc) GetId() string {
@@ -90,6 +91,10 @@ func (self *SVpc) GetCidrBlock() string {
return self.CidrBlock
}
func (self *SVpc) GetCidrBlock6() string {
return self.Ipv6CidrBlock
}
func (self *SVpc) GetStatus() string {
return strings.ToLower(self.Status)
}
+51 -7
View File
@@ -50,6 +50,7 @@ type SVSwitch struct {
CidrBlock string
Ipv6CidrBlock string
EnabledIpv6 bool
CreationTime time.Time
Description string
IsDefault bool
@@ -79,27 +80,70 @@ func (self *SVSwitch) GetGlobalId() string {
return self.VSwitchId
}
func (self *SVSwitch) IsEmulated() bool {
return false
}
func (self *SVSwitch) GetStatus() string {
return strings.ToLower(self.Status)
}
func (self *SVSwitch) Refresh() error {
log.Debugf("vsiwtch refresh %s", self.VSwitchId)
new, err := self.wire.zone.region.GetVSwitchAttributes(self.VSwitchId)
net, err := self.wire.zone.region.GetVSwitchAttributes(self.VSwitchId)
if err != nil {
return err
}
return jsonutils.Update(self, new)
return jsonutils.Update(self, net)
}
func (self *SVSwitch) GetIWire() cloudprovider.ICloudWire {
return self.wire
}
func (net *SVSwitch) GetIp6Start() string {
if len(net.Ipv6CidrBlock) > 0 {
prefix, err := netutils.NewIPV6Prefix(net.Ipv6CidrBlock)
if err != nil {
return ""
}
return prefix.Address.NetAddr(prefix.MaskLen).StepUp().String()
}
return ""
}
func (net *SVSwitch) GetIp6End() string {
if len(net.Ipv6CidrBlock) > 0 {
prefix, err := netutils.NewIPV6Prefix(net.Ipv6CidrBlock)
if err != nil {
return ""
}
end := prefix.Address.NetAddr(prefix.MaskLen).BroadcastAddr(prefix.MaskLen)
for i := 0; i < 15; i++ {
end = end.StepDown()
}
return end.String()
}
return ""
}
func (net *SVSwitch) GetIp6Mask() uint8 {
if len(net.Ipv6CidrBlock) > 0 {
prefix, err := netutils.NewIPV6Prefix(net.Ipv6CidrBlock)
if err != nil {
return 0
}
return prefix.MaskLen
}
return 0
}
func (net *SVSwitch) GetGateway6() string {
if len(net.Ipv6CidrBlock) > 0 {
prefix, err := netutils.NewIPV6Prefix(net.Ipv6CidrBlock)
if err != nil {
return ""
}
return prefix.Address.NetAddr(prefix.MaskLen).StepUp().String()
}
return ""
}
func (self *SVSwitch) GetIpStart() string {
pref, _ := netutils.NewIPV4Prefix(self.CidrBlock)
startIp := pref.Address.NetAddr(pref.MaskLen) // 0
+6
View File
@@ -319,6 +319,12 @@ func (self *SInstance) GetINics() ([]cloudprovider.ICloudNic, error) {
ipAddr: networkInterface.PrivateIpAddress,
macAddr: networkInterface.MacAddress,
}
for _, ip6 := range networkInterface.IPv6AddressesSet {
if len(ip6.IPv6Address) > 0 {
nic.ip6Addr = ip6.IPv6Address
break
}
}
nics = append(nics, &nic)
}
return nics, nil
+5
View File
@@ -25,6 +25,7 @@ type SInstanceNic struct {
id string
ipAddr string
ip6Addr string
macAddr string
cloudprovider.DummyICloudNic
@@ -38,6 +39,10 @@ func (self *SInstanceNic) GetIP() string {
return self.ipAddr
}
func (self *SInstanceNic) GetIP6() string {
return self.ip6Addr
}
func (self *SInstanceNic) GetMAC() string {
return self.macAddr
}
+70
View File
@@ -41,6 +41,10 @@ type SNetwork struct {
SubnetId string `xml:"subnetId"`
VpcId string `xml:"vpcId"`
AvailabilityZone string `xml:"availabilityZone"`
IPv6CidrBlockAssociationSet []struct {
IPv6CidrBlock string `xml:"ipv6CidrBlock"`
} `xml:"ipv6CidrBlockAssociationSet>item"`
}
func (self *SNetwork) GetId() string {
@@ -97,6 +101,72 @@ func (self *SNetwork) GetIWire() cloudprovider.ICloudWire {
return self.wire
}
func (net *SNetwork) GetIp6Start() string {
for _, ipv6 := range net.IPv6CidrBlockAssociationSet {
if len(ipv6.IPv6CidrBlock) == 0 {
continue
}
prefix, err := netutils.NewIPV6Prefix(ipv6.IPv6CidrBlock)
if err != nil {
return ""
}
return prefix.Address.NetAddr(prefix.MaskLen).
StepUp(). // 1
StepUp(). // 2
StepUp(). // 3
StepUp(). // 4
String()
}
return ""
}
func (net *SNetwork) GetIp6End() string {
for _, ipv6 := range net.IPv6CidrBlockAssociationSet {
if len(ipv6.IPv6CidrBlock) == 0 {
continue
}
prefix, err := netutils.NewIPV6Prefix(ipv6.IPv6CidrBlock)
if err != nil {
return ""
}
end := prefix.Address.NetAddr(prefix.MaskLen).BroadcastAddr(prefix.MaskLen)
return end.
StepDown(). // fffe
String()
}
return ""
}
func (net *SNetwork) GetIp6Mask() uint8 {
for _, ipv6 := range net.IPv6CidrBlockAssociationSet {
if len(ipv6.IPv6CidrBlock) == 0 {
continue
}
prefix, err := netutils.NewIPV6Prefix(ipv6.IPv6CidrBlock)
if err != nil {
return 0
}
return prefix.MaskLen
}
return 0
}
func (net *SNetwork) GetGateway6() string {
for _, ipv6 := range net.IPv6CidrBlockAssociationSet {
if len(ipv6.IPv6CidrBlock) == 0 {
continue
}
prefix, err := netutils.NewIPV6Prefix(ipv6.IPv6CidrBlock)
if err != nil {
return ""
}
return prefix.Address.NetAddr(prefix.MaskLen).
StepUp(). // 1
String()
}
return ""
}
// 每个子网 CIDR 块中的前四个 IP 地址和最后一个 IP 地址无法使用
func (self *SNetwork) GetIpStart() string {
pref, _ := netutils.NewIPV4Prefix(self.CidrBlock)
+5 -1
View File
@@ -65,7 +65,11 @@ type SNetworkInterface struct {
GroupSet []SGroupSet `xml:"groupSet>item"`
Attachment SAttachment `xml:"attachment"`
PrivateIpAddressesSet []SPrivateIpAddress `xml:"privateIpAddressesSet>item"`
InterfaceType string `xml:"interfaceType"`
IPv6AddressesSet []struct {
IPv6Address string `xml:"ipv6Address"`
IsPrimaryIpv6 bool `xml:"isPrimaryIpv6"`
} `xml:"ipv6AddressesSet>item"`
InterfaceType string `xml:"interfaceType"`
}
func (self *SRegion) GetNetworkInterface(id string) (*SNetworkInterface, error) {
+13
View File
@@ -47,6 +47,9 @@ type SVpc struct {
State string `xml:"state"`
} `xml:"cidrBlockState"`
} `xml:"cidrBlockAssociationSet>item"`
IPv6CidrBlockAssociationSet []struct {
IPv6CidrBlock string `xml:"ipv6CidrBlock"`
} `xml:"ipv6CidrBlockAssociationSet>item"`
IsDefault bool `xml:"isDefault"`
Status string `xml:"state"`
InstanceTenancy string `xml:"instanceTenancy"`
@@ -103,6 +106,16 @@ func (self *SVpc) GetCidrBlock() string {
return strings.Join(cidr, ",")
}
func (self *SVpc) GetCidrBlock6() string {
ret := []string{}
for _, cidr := range self.IPv6CidrBlockAssociationSet {
if len(cidr.IPv6CidrBlock) > 0 {
ret = append(ret, cidr.IPv6CidrBlock)
}
}
return strings.Join(ret, ",")
}
func (self *SVpc) GetIWires() ([]cloudprovider.ICloudWire, error) {
zones, err := self.region.GetZones("")
if err != nil {
+12
View File
@@ -398,8 +398,20 @@ func (self *SInstance) GetINics() ([]cloudprovider.ICloudNic, error) {
}
}
}
for _, ipAddresses := range self.Addresses {
for _, ipAddress := range ipAddresses {
if ipAddress.OSEXTIPSType == "fixed" && ipAddress.Version == "6" {
if _, ok := ret[ipAddress.OSEXTIPSMACMACAddr]; ok {
ret[ipAddress.OSEXTIPSMACMACAddr].ip6Addr = ipAddress.Addr
}
}
}
}
nics := make([]cloudprovider.ICloudNic, 0)
for mac := range ret {
log.Errorf("mac: %s ip: %s ipv6: %s", ret[mac].macAddr, ret[mac].ipAddr, ret[mac].ip6Addr)
nics = append(nics, ret[mac])
}
return nics, nil
+5
View File
@@ -25,6 +25,7 @@ import (
type SInstanceNic struct {
instance *SInstance
ipAddr string
ip6Addr string
macAddr string
subAddrs []string
@@ -39,6 +40,10 @@ func (self *SInstanceNic) GetIP() string {
return self.ipAddr
}
func (self *SInstanceNic) GetIP6() string {
return self.ip6Addr
}
func (self *SInstanceNic) GetSubAddress() ([]string, error) {
return self.subAddrs, nil
}
+40
View File
@@ -40,9 +40,11 @@ type SNetwork struct {
AvailabilityZone string `json:"availability_zone"`
CIDR string `json:"cidr"`
CIDRV6 string `json:"cidr_v6"`
DHCPEnable bool `json:"dhcp_enable"`
DNSList []string `json:"dnsList"`
GatewayIP string `json:"gateway_ip"`
GatewayIPv6 string `json:"gateway_ip_v6"`
ID string `json:"id"`
Ipv6Enable bool `json:"ipv6_enable"`
Name string `json:"name"`
@@ -94,6 +96,44 @@ func (self *SNetwork) GetIWire() cloudprovider.ICloudWire {
return self.wire
}
func (net *SNetwork) GetIp6Start() string {
if len(net.CIDRV6) > 0 {
prefix, err := netutils.NewIPV6Prefix(net.CIDRV6)
if err != nil {
return ""
}
return prefix.Address.NetAddr(prefix.MaskLen).StepUp().StepUp().String()
}
return ""
}
func (net *SNetwork) GetIp6End() string {
if len(net.CIDRV6) > 0 {
prefix, err := netutils.NewIPV6Prefix(net.CIDRV6)
if err != nil {
return ""
}
end := prefix.Address.NetAddr(prefix.MaskLen).BroadcastAddr(prefix.MaskLen)
return end.StepDown().StepDown().StepDown().StepDown().StepDown().String()
}
return ""
}
func (net *SNetwork) GetIp6Mask() uint8 {
if len(net.CIDRV6) > 0 {
prefix, err := netutils.NewIPV6Prefix(net.CIDRV6)
if err != nil {
return 0
}
return prefix.MaskLen
}
return 0
}
func (net *SNetwork) GetGateway6() string {
return net.GatewayIPv6
}
func (self *SNetwork) GetIpStart() string {
pref, _ := netutils.NewIPV4Prefix(self.CIDR)
startIp := pref.Address.NetAddr(pref.MaskLen) // 0
+2 -2
View File
@@ -26,10 +26,10 @@ func (net *SNetworkBase) GetIp6End() string {
return ""
}
func (self *SNetworkBase) GetIp6Mask() uint8 {
func (net *SNetworkBase) GetIp6Mask() uint8 {
return 0
}
func (self *SNetworkBase) GetGateway6() string {
func (net *SNetworkBase) GetGateway6() string {
return ""
}
+7
View File
@@ -131,6 +131,7 @@ type SInstance struct {
SecurityGroupIds []string // 实例所属安全组。该参数可以通过调用 DescribeSecurityGroups 的返回值中的sgId字段来获取。
LoginSettings LoginSettings //实例登录设置。目前只返回实例所关联的密钥。
InstanceState string // 实例状态。取值范围:PENDING:表示创建中 LAUNCH_FAILED:表示创建失败 RUNNING:表示运行中 STOPPED:表示关机 STARTING:表示开机中 STOPPING:表示关机中 REBOOTING:表示重启中 SHUTDOWN:表示停止待销毁 TERMINATING:表示销毁中。
IPv6Addresses []string
Tags []Tag
}
@@ -302,6 +303,12 @@ func (self *SInstance) GetINics() ([]cloudprovider.ICloudNic, error) {
nic.ipAddr = addr.PrivateIpAddress
}
}
for _, addr := range networkInterface.Ipv6AddressSet {
if len(addr.Address) > 0 {
nic.ip6Addr = addr.Address
break
}
}
ret = append(ret, nic)
}
return ret, nil
+5
View File
@@ -24,6 +24,7 @@ type SInstanceNic struct {
id string
ipAddr string
ip6Addr string
macAddr string
classic bool
@@ -38,6 +39,10 @@ func (self *SInstanceNic) GetIP() string {
return self.ipAddr
}
func (self *SInstanceNic) GetIP6() string {
return self.ip6Addr
}
func (self *SInstanceNic) GetMAC() string {
if len(self.macAddr) == 0 {
ip, _ := netutils.NewIPV4Addr(self.GetIP())
+45 -4
View File
@@ -35,6 +35,7 @@ type SNetwork struct {
wire *SWire
CidrBlock string
Ipv6CidrBlock string
Zone string
SubnetId string
VpcId string
@@ -61,10 +62,6 @@ func (self *SNetwork) GetGlobalId() string {
return self.SubnetId
}
func (self *SNetwork) IsEmulated() bool {
return false
}
func (self *SNetwork) GetStatus() string {
return api.NETWORK_STATUS_AVAILABLE
}
@@ -115,6 +112,50 @@ func (self *SNetwork) SetTags(tags map[string]string, replace bool) error {
return self.wire.vpc.region.SetResourceTags("vpc", "subnet", []string{self.SubnetId}, tags, replace)
}
func (net *SNetwork) GetIp6Start() string {
if len(net.Ipv6CidrBlock) > 0 {
prefix, err := netutils.NewIPV6Prefix(net.Ipv6CidrBlock)
if err != nil {
return ""
}
return prefix.Address.NetAddr(prefix.MaskLen).StepUp().String()
}
return ""
}
func (net *SNetwork) GetIp6End() string {
if len(net.Ipv6CidrBlock) > 0 {
prefix, err := netutils.NewIPV6Prefix(net.Ipv6CidrBlock)
if err != nil {
return ""
}
return prefix.Address.NetAddr(prefix.MaskLen).BroadcastAddr(prefix.MaskLen).String()
}
return ""
}
func (net *SNetwork) GetIp6Mask() uint8 {
if len(net.Ipv6CidrBlock) > 0 {
prefix, err := netutils.NewIPV6Prefix(net.Ipv6CidrBlock)
if err != nil {
return 0
}
return prefix.MaskLen
}
return 0
}
func (net *SNetwork) GetGateway6() string {
if len(net.Ipv6CidrBlock) > 0 {
prefix, err := netutils.NewIPV6Prefix(net.Ipv6CidrBlock)
if err != nil {
return ""
}
return prefix.Address.NetAddr(prefix.MaskLen).StepUp().String()
}
return ""
}
func (self *SNetwork) GetGateway() string {
pref, _ := netutils.NewIPV4Prefix(self.CidrBlock)
endIp := pref.Address.BroadcastAddr(pref.MaskLen) // 255
@@ -76,6 +76,10 @@ type SNetworkInterface struct {
Attachment SNetworkInterfaceAttachment
Zone string
PrivateIpAddressSet []SPrivateIpAddress
Ipv6AddressSet []struct {
Address string
State string
}
}
func (nic *SNetworkInterface) GetName() string {
+5 -4
View File
@@ -34,6 +34,7 @@ type SVpc struct {
iwires []cloudprovider.ICloudWire
CidrBlock string
Ipv6CidrBlock string
CreatedTime time.Time
DhcpOptionsId string
DnsServerSet []string
@@ -59,10 +60,6 @@ func (self *SVpc) GetGlobalId() string {
return self.VpcId
}
func (self *SVpc) IsEmulated() bool {
return false
}
func (self *SVpc) GetIsDefault() bool {
return self.IsDefault
}
@@ -71,6 +68,10 @@ func (self *SVpc) GetCidrBlock() string {
return self.CidrBlock
}
func (self *SVpc) GetCidrBlock6() string {
return self.Ipv6CidrBlock
}
func (self *SVpc) GetStatus() string {
return api.VPC_STATUS_AVAILABLE
}