Skip to content

Commit 2d4ed27

Browse files
swordqiuQiu Jian
andauthored
fix: ipv6 compatibility issues fixes 20250809 (#23060)
Co-authored-by: Qiu Jian <[email protected]>
1 parent afde29e commit 2d4ed27

File tree

19 files changed

+149
-67
lines changed

19 files changed

+149
-67
lines changed

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,12 @@ require (
9696
k8s.io/cri-api v0.22.17
9797
k8s.io/klog/v2 v2.20.0
9898
moul.io/http2curl/v2 v2.3.0
99-
yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250806071135-2a78d1b1ef8c
99+
yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250807082238-ddfb05be205b
100100
yunion.io/x/executor v0.0.0-20250518005516-5402e9e0bed0
101101
yunion.io/x/jsonutils v1.0.1-0.20250507052344-1abcf4f443b1
102102
yunion.io/x/log v1.0.1-0.20240305175729-7cf2d6cd5a91
103103
yunion.io/x/ovsdb v0.0.0-20230306173834-f164f413a900
104-
yunion.io/x/pkg v1.10.4-0.20250805171825-2431e10f90a9
104+
yunion.io/x/pkg v1.10.4-0.20250810004221-0a408931e156
105105
yunion.io/x/s3cli v0.0.0-20241221171442-1c11599d28e1
106106
yunion.io/x/sqlchemy v1.1.3-0.20250806073422-e37f5197cec0
107107
yunion.io/x/structarg v0.0.0-20231017124457-df4d5009457c

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1408,8 +1408,8 @@ sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK
14081408
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
14091409
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
14101410
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
1411-
yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250806071135-2a78d1b1ef8c h1:tIiyoVwkYXhcu4wCnQLUDiB6NeqkuX92zvPOzB9vYz4=
1412-
yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250806071135-2a78d1b1ef8c/go.mod h1:FXxAEbdNfWXX9gjME3K2nJhkydHY5EKEUZb+RLEzVwQ=
1411+
yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250807082238-ddfb05be205b h1:Gn3hVmtSz10NVgmAdCU2idgCb+0XnrpG3cv+nKL6zDo=
1412+
yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20250807082238-ddfb05be205b/go.mod h1:FXxAEbdNfWXX9gjME3K2nJhkydHY5EKEUZb+RLEzVwQ=
14131413
yunion.io/x/executor v0.0.0-20250518005516-5402e9e0bed0 h1:msG4SiDSVU7CrXH06WuHlNEZXIooTcmNbfrIGHuIHBU=
14141414
yunion.io/x/executor v0.0.0-20250518005516-5402e9e0bed0/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws=
14151415
yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634=
@@ -1423,8 +1423,8 @@ yunion.io/x/ovsdb v0.0.0-20230306173834-f164f413a900 h1:Hu/4ERvoWaN6aiFs4h4/yvVB
14231423
yunion.io/x/ovsdb v0.0.0-20230306173834-f164f413a900/go.mod h1:0vLkNEhlmA64HViPBAnSTUMrx5QP1CLsxXmxDKQ80tc=
14241424
yunion.io/x/pkg v0.0.0-20190620104149-945c25821dbf/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E=
14251425
yunion.io/x/pkg v0.0.0-20190628082551-f4033ba2ea30/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E=
1426-
yunion.io/x/pkg v1.10.4-0.20250805171825-2431e10f90a9 h1:8NuoKUPb3sHigChE6Mz6Nf9aZvM/TvORueIZAMYfPK0=
1427-
yunion.io/x/pkg v1.10.4-0.20250805171825-2431e10f90a9/go.mod h1:0Bwxqd9MA3ACi119/l02FprY/o9gHahmYC2bsSbnVpM=
1426+
yunion.io/x/pkg v1.10.4-0.20250810004221-0a408931e156 h1:ONxzK7UJhLKrDUM7vH6EQPNhwkCXaWDtmC67fF12/RE=
1427+
yunion.io/x/pkg v1.10.4-0.20250810004221-0a408931e156/go.mod h1:0Bwxqd9MA3ACi119/l02FprY/o9gHahmYC2bsSbnVpM=
14281428
yunion.io/x/s3cli v0.0.0-20241221171442-1c11599d28e1 h1:1KJ3YYinydPHpDEQRXdr/T8SYcKZ5Er+m489H+PnaQ4=
14291429
yunion.io/x/s3cli v0.0.0-20241221171442-1c11599d28e1/go.mod h1:0iFKpOs1y4lbCxeOmq3Xx/0AcQoewVPwj62eRluioEo=
14301430
yunion.io/x/sqlchemy v1.1.3-0.20250806073422-e37f5197cec0 h1:Eha/ywh4foMJm7VJ8ibFOi+WPHacuTWtosAGpOld5vo=

pkg/apis/compute/guestnetwork.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,14 @@ type GuestnetworkDetails struct {
3636
EipAddr string `json:"eip_addr"`
3737

3838
NetworkAddresses []NetworkAddrConf `json:"network_addresses"`
39+
40+
GuestIpMask int8 `json:"guest_ip_mask"`
41+
// 网关地址
42+
GuestGateway string `json:"guest_gateway"`
43+
44+
GuestIp6Mask uint8 `json:"guest_ip6_mask"`
45+
// 网关地址
46+
GuestGateway6 string `json:"guest_gateway6"`
3947
}
4048

4149
type GuestnetworkShortDesc struct {
@@ -58,6 +66,8 @@ type GuestnetworkShortDesc struct {
5866
SubIps string `json:"sub_ips"`
5967
// 端口映射
6068
PortMappings GuestPortMappings `json:"port_mappings"`
69+
70+
IsDefault bool `json:"is_default"`
6171
}
6272

6373
type GuestnetworkListInput struct {

pkg/cloudproxy/agent/worker/worker.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ func (w *Worker) initProxyAgent_(ctx context.Context) error {
120120
)
121121
if agentDetail.BindAddr == "" || !bindAddrExist(bindAddr) {
122122
var err error
123-
bindAddr, err = netutils2.MyIP()
123+
bindAddr, err = netutils2.MyIPSmart()
124124
if err != nil {
125125
return errors.Wrap(err, "find bind Addr")
126126
}

pkg/compute/models/guest_queries.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,8 @@ func fetchGuestNICs(ctx context.Context, guestIds []string, virtual tristate.Tri
571571

572572
gnwq.Field("port_mappings"),
573573

574+
gnwq.Field("is_default"),
575+
574576
wirq.Field("vpc_id"),
575577
subIP.Field("sub_ips"),
576578
)

pkg/compute/models/guestnetworks.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,10 @@ func (manager *SGuestnetworkManager) FetchCustomizeColumns(
175175
if net, ok := netMap[netIds[i]]; ok {
176176
rows[i].Network = net.Name
177177
rows[i].WireId = net.WireId
178+
rows[i].GuestIpMask = net.GuestIpMask
179+
rows[i].GuestGateway = net.GuestGateway
180+
rows[i].GuestIp6Mask = net.GuestIp6Mask
181+
rows[i].GuestGateway6 = net.GuestGateway6
178182
}
179183
}
180184

@@ -408,7 +412,7 @@ func (manager *SGuestnetworkManager) newGuestNetwork(
408412
}
409413
}
410414

411-
if vpc.Id != api.DEFAULT_VPC_ID && provider == api.CLOUD_PROVIDER_ONECLOUD && len(gn.IpAddr) > 0 || len(gn.Ip6Addr) > 0 {
415+
if vpc.Id != api.DEFAULT_VPC_ID && provider == api.CLOUD_PROVIDER_ONECLOUD && (len(gn.IpAddr) > 0 || len(gn.Ip6Addr) > 0) {
412416
var err error
413417
GuestnetworkManager.lockAllocMappedAddr(ctx)
414418
defer GuestnetworkManager.unlockAllocMappedAddr(ctx)

pkg/compute/models/networks.go

Lines changed: 69 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3294,13 +3294,37 @@ func (manager *SNetworkManager) PerformTryCreateNetwork(ctx context.Context, use
32943294
if len(input.Ip) == 0 {
32953295
return nil, httperrors.NewMissingParameterError("ip")
32963296
}
3297-
ipV4, err := netutils.NewIPV4Addr(input.Ip)
3298-
if err != nil {
3299-
return nil, httperrors.NewInputParameterError("ip")
3300-
}
3297+
3298+
var ipV4, ipV4NetAddr netutils.IPV4Addr
3299+
var ipV6, ipV6NetAddr netutils.IPV6Addr
3300+
var err error
3301+
33013302
if input.Mask == 0 {
33023303
return nil, httperrors.NewMissingParameterError("mask")
33033304
}
3305+
3306+
if regutils.MatchIP4Addr(input.Ip) {
3307+
ipV4, err = netutils.NewIPV4Addr(input.Ip)
3308+
if err != nil {
3309+
return nil, errors.Wrapf(err, "invalid ipv4 address %s", input.Ip)
3310+
}
3311+
if ipV4.IsZero() {
3312+
return nil, errors.Wrapf(errors.ErrInvalidFormat, "invalid ipv4 address %s", input.Ip)
3313+
}
3314+
ipV4NetAddr = ipV4.NetAddr(int8(input.Mask))
3315+
} else if regutils.MatchIP6Addr(input.Ip) {
3316+
ipV6, err = netutils.NewIPV6Addr(input.Ip)
3317+
if err != nil {
3318+
return nil, errors.Wrapf(err, "invalid ipv6 address %s", input.Ip)
3319+
}
3320+
if ipV6.IsZero() {
3321+
return nil, errors.Wrapf(errors.ErrInvalidFormat, "invalid ipv6 address %s", input.Ip)
3322+
}
3323+
ipV6NetAddr = ipV6.NetAddr(uint8(input.Mask))
3324+
} else {
3325+
return nil, errors.Wrapf(errors.ErrInvalidFormat, "invalid ip address %s", input.Ip)
3326+
}
3327+
33043328
if len(input.ServerType) == 0 {
33053329
return nil, httperrors.NewMissingParameterError("server_type")
33063330
}
@@ -3312,12 +3336,16 @@ func (manager *SNetworkManager) PerformTryCreateNetwork(ctx context.Context, use
33123336
}
33133337

33143338
var (
3315-
ipV4NetAddr = ipV4.NetAddr(int8(input.Mask))
3316-
nm *SNetwork
3317-
matched bool
3339+
nm *SNetwork
3340+
matched bool
33183341
)
33193342

3320-
q := NetworkManager.Query().Equals("server_type", input.ServerType).Equals("guest_ip_mask", input.Mask)
3343+
q := NetworkManager.Query().Equals("server_type", input.ServerType)
3344+
if !ipV4.IsZero() {
3345+
q = q.Equals("guest_ip_mask", input.Mask)
3346+
} else if !ipV6.IsZero() {
3347+
q = q.Equals("guest_ip6_mask", input.Mask)
3348+
}
33213349

33223350
listQuery := api.NetworkListInput{}
33233351
err = query.Unmarshal(&listQuery)
@@ -3350,14 +3378,27 @@ func (manager *SNetworkManager) PerformTryCreateNetwork(ctx context.Context, use
33503378
return nil, err
33513379
}
33523380
n := item.(*SNetwork)
3353-
if n.GetIPRange().Contains(ipV4) {
3354-
nm = n
3355-
matched = true
3356-
break
3357-
} else if nIpV4, _ := netutils.NewIPV4Addr(n.GuestIpStart); nIpV4.NetAddr(n.GuestIpMask) == ipV4NetAddr {
3358-
nm = n
3359-
matched = false
3360-
break
3381+
3382+
if !ipV4.IsZero() {
3383+
if n.getIPRange().Contains(ipV4) {
3384+
nm = n
3385+
matched = true
3386+
break
3387+
} else if nIpV4, _ := netutils.NewIPV4Addr(n.GuestIpStart); nIpV4.NetAddr(n.GuestIpMask) == ipV4NetAddr {
3388+
nm = n
3389+
matched = false
3390+
break
3391+
}
3392+
} else if !ipV6.IsZero() {
3393+
if n.getIPRange6().Contains(ipV6) {
3394+
nm = n
3395+
matched = true
3396+
break
3397+
} else if nIpV6, _ := netutils.NewIPV6Addr(n.GuestIp6Start); nIpV6.NetAddr(n.GuestIp6Mask) == ipV6NetAddr {
3398+
nm = n
3399+
matched = false
3400+
break
3401+
}
33613402
}
33623403
}
33633404

@@ -3369,13 +3410,20 @@ func (manager *SNetworkManager) PerformTryCreateNetwork(ctx context.Context, use
33693410
ret.Set("find_matched", jsonutils.JSONTrue)
33703411
ret.Set("wire_id", jsonutils.NewString(nm.WireId))
33713412
if !matched {
3372-
log.Infof("Find same subnet network %s %s/%d", nm.Name, nm.GuestGateway, nm.GuestIpMask)
3413+
log.Infof("Find same subnet network %s %s/%d %s/%d", nm.Name, nm.GuestGateway, nm.GuestIpMask, nm.GuestGateway6, nm.GuestIp6Mask)
33733414
newNetwork := new(SNetwork)
33743415
newNetwork.SetModelManager(NetworkManager, newNetwork)
3375-
newNetwork.GuestIpStart = input.Ip
3376-
newNetwork.GuestIpEnd = input.Ip
3377-
newNetwork.GuestGateway = nm.GuestGateway
3378-
newNetwork.GuestIpMask = int8(input.Mask)
3416+
if !ipV4.IsZero() {
3417+
newNetwork.GuestIpStart = ipV4.String()
3418+
newNetwork.GuestIpEnd = ipV4.String()
3419+
newNetwork.GuestGateway = nm.GuestGateway
3420+
newNetwork.GuestIpMask = int8(input.Mask)
3421+
} else if !ipV6.IsZero() {
3422+
newNetwork.GuestIp6Start = ipV6.String()
3423+
newNetwork.GuestIp6End = ipV6.String()
3424+
newNetwork.GuestGateway6 = nm.GuestGateway6
3425+
newNetwork.GuestIp6Mask = uint8(input.Mask)
3426+
}
33793427
newNetwork.GuestDns = nm.GuestDns
33803428
newNetwork.GuestDhcp = nm.GuestDhcp
33813429
newNetwork.GuestNtp = nm.GuestNtp

pkg/compute/models/vpcs.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -997,8 +997,8 @@ func (manager *SVpcManager) ValidateCreateData(
997997
return input, err
998998
}
999999

1000-
if region.GetDriver().IsVpcCreateNeedInputCidr() && len(input.CidrBlock) == 0 {
1001-
return input, httperrors.NewMissingParameterError("cidr")
1000+
if region.GetDriver().IsVpcCreateNeedInputCidr() && len(input.CidrBlock) == 0 && len(input.CidrBlock6) == 0 {
1001+
return input, httperrors.NewMissingParameterError("cidr_block or cidr_block6")
10021002
}
10031003

10041004
keys := GetVpcQuotaKeysFromCreateInput(ownerId, input)

pkg/compute/regiondrivers/kvm.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"fmt"
2121
"sort"
2222
"strconv"
23+
"strings"
2324

2425
"yunion.io/x/cloudmux/pkg/cloudprovider"
2526
"yunion.io/x/jsonutils"
@@ -517,9 +518,15 @@ func (self *SKVMRegionDriver) RequestDeleteLoadbalancerListenerRule(ctx context.
517518
}
518519

519520
func (self *SKVMRegionDriver) ValidateCreateVpcData(ctx context.Context, userCred mcclient.TokenCredential, input api.VpcCreateInput) (api.VpcCreateInput, error) {
520-
if !utils.IsInStringArray(input.CidrBlock, []string{"192.168.0.0/16", "10.0.0.0/8", "172.16.0.0/12"}) {
521+
if len(input.CidrBlock) > 0 && !utils.IsInStringArray(input.CidrBlock, []string{"192.168.0.0/16", "10.0.0.0/8", "172.16.0.0/12"}) {
521522
return input, httperrors.NewInputParameterError("Invalid cidr_block, want 192.168.0.0/16|10.0.0.0/8|172.16.0.0/12, got %s", input.CidrBlock)
522523
}
524+
if len(input.CidrBlock6) > 0 {
525+
input.CidrBlock6 = strings.ToLower(input.CidrBlock6)
526+
if !strings.HasPrefix(input.CidrBlock6, "fd") {
527+
return input, httperrors.NewInputParameterError("Invalid ipv6 cidr_block, %s outside of IPv6 private unicast address range fd00::/8", input.CidrBlock6)
528+
}
529+
}
523530
return input, nil
524531
}
525532

pkg/hostman/hostinfo/hostbridge/hostbridge.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -344,12 +344,12 @@ func (d *SBaseBridgeDriver) ConfirmToConfig() (bool, string, error) {
344344
if d.bridge.Addr != d.ip {
345345
return false, "", fmt.Errorf("bridge %s IP %s is not expected IP %s, mismatch", d.bridge, d.bridge.Addr, d.ip)
346346
}
347-
} else if len(d.ip6) == 0 {
347+
} else {
348348
if d.inter != nil && len(d.inter.Addr) > 0 {
349349
return false, "", fmt.Errorf("interface %s should have no address", d.inter)
350350
}
351-
if len(d.bridge.Addr) == 0 {
352-
return false, "", fmt.Errorf("bridge %s should have 169.254.0.0/16 address", d.bridge)
351+
if len(d.bridge.Addr) > 0 {
352+
return false, "", fmt.Errorf("bridge %s (%s) should have no ipv4 address", d.bridge, d.bridge.Addr)
353353
}
354354
if !d.bridge.IsSecretInterface() {
355355
return false, "", fmt.Errorf("%s should have address in 169.254.0.0/16", d.bridge)

0 commit comments

Comments
 (0)