From 629ca225098445f9531be3a3b7709b66e5b4667a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Fri, 2 Feb 2024 17:14:21 +0800 Subject: [PATCH] fix(region): support public ipv6 addr sync (#19420) --- go.mod | 2 +- go.sum | 4 +- vendor/modules.txt | 2 +- .../pkg/multicloud/aliyun/instance.go | 6 ++ .../pkg/multicloud/aliyun/instancenic.go | 5 ++ .../multicloud/aliyun/networkinterfaces.go | 5 ++ .../x/cloudmux/pkg/multicloud/aliyun/vpc.go | 27 ++++--- .../cloudmux/pkg/multicloud/aliyun/vswitch.go | 58 +++++++++++++-- .../x/cloudmux/pkg/multicloud/aws/instance.go | 6 ++ .../pkg/multicloud/aws/instancenic.go | 5 ++ .../x/cloudmux/pkg/multicloud/aws/network.go | 70 +++++++++++++++++++ .../pkg/multicloud/aws/networkinterface.go | 6 +- .../x/cloudmux/pkg/multicloud/aws/vpc.go | 13 ++++ .../pkg/multicloud/huawei/instance.go | 12 ++++ .../pkg/multicloud/huawei/instancenic.go | 5 ++ .../cloudmux/pkg/multicloud/huawei/network.go | 40 +++++++++++ .../x/cloudmux/pkg/multicloud/network_base.go | 4 +- .../pkg/multicloud/qcloud/instance.go | 7 ++ .../pkg/multicloud/qcloud/instancenic.go | 5 ++ .../cloudmux/pkg/multicloud/qcloud/network.go | 49 +++++++++++-- .../pkg/multicloud/qcloud/networkinterface.go | 4 ++ .../x/cloudmux/pkg/multicloud/qcloud/vpc.go | 9 +-- 22 files changed, 311 insertions(+), 33 deletions(-) diff --git a/go.mod b/go.mod index 2ed8895741..415f13bc33 100644 --- a/go.mod +++ b/go.mod @@ -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 diff --git a/go.sum b/go.sum index f243a29351..e80c8d3f28 100644 --- a/go.sum +++ b/go.sum @@ -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= diff --git a/vendor/modules.txt b/vendor/modules.txt index 777eaad8f0..b3787592a1 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -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 diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/instance.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/instance.go index 2853797bdc..9fe3300797 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/instance.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/instance.go @@ -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 { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/instancenic.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/instancenic.go index 2143d756cd..498f1f8ac6 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/instancenic.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/instancenic.go @@ -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 diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/networkinterfaces.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/networkinterfaces.go index 24ae508a64..5c0419bc7e 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/networkinterfaces.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/networkinterfaces.go @@ -72,6 +72,11 @@ type SNetworkInterface struct { NetworkInterfaceId string PrimaryIpAddress string PrivateIpAddress string + Ipv6Sets struct { + Ipv6Set []struct { + Ipv6Address string + } + } Attachment struct { InstanceId string diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/vpc.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/vpc.go index 42706d285c..6a8fb8e63a 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/vpc.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/vpc.go @@ -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) } diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/vswitch.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/vswitch.go index 40fee8710b..de0a248196 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/vswitch.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/vswitch.go @@ -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 diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/instance.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/instance.go index 57ccc2704b..34511f4283 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/instance.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/instance.go @@ -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 diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/instancenic.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/instancenic.go index 39e4a2b72b..5e55005868 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/instancenic.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/instancenic.go @@ -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 } diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/network.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/network.go index 07912d3b46..45a4508e64 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/network.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/network.go @@ -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) diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/networkinterface.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/networkinterface.go index 7b7b7c7126..4905018ccd 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/networkinterface.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/networkinterface.go @@ -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) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/vpc.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/vpc.go index 013b5e38bf..4fcf46f3d2 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/vpc.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/vpc.go @@ -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 { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/instance.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/instance.go index 12a9eb20e4..36250b8103 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/instance.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/instance.go @@ -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 diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/instancenic.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/instancenic.go index bcc6aefe3b..b0c68e5885 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/instancenic.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/instancenic.go @@ -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 } diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/network.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/network.go index 48ec001a2d..42ac297ad1 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/network.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/network.go @@ -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 diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/network_base.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/network_base.go index 9e80ed535e..1487b86d0c 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/network_base.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/network_base.go @@ -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 "" } diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/instance.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/instance.go index 2124c2e192..ba0f108643 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/instance.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/instance.go @@ -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 diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/instancenic.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/instancenic.go index 0a439285f4..3657a33b83 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/instancenic.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/instancenic.go @@ -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()) diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/network.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/network.go index 13016a5045..da891b1a2c 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/network.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/network.go @@ -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 diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/networkinterface.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/networkinterface.go index 1b3ce92e1a..38ef1b12c1 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/networkinterface.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/networkinterface.go @@ -76,6 +76,10 @@ type SNetworkInterface struct { Attachment SNetworkInterfaceAttachment Zone string PrivateIpAddressSet []SPrivateIpAddress + Ipv6AddressSet []struct { + Address string + State string + } } func (nic *SNetworkInterface) GetName() string { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/vpc.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/vpc.go index 7c187f0c5e..a78e4100bb 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/vpc.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/vpc.go @@ -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 }