44 "encoding/json"
55 "fmt"
66 "math/big"
7- "net"
87 "os"
98 "time"
109
@@ -25,14 +24,14 @@ const (
2524 defaultOpTimeout = 300 * time .Second
2625 defaultWaitInterval = 5 * time .Second
2726
28- reservedVIPCount = 12
29- reservedVIPCountForVlan int64 = 7 //reserve 1/7 ip for hostnic br
27+ reservedVIPCountForVxlan int64 = 12
28+ reservedVIPCountForVlan int64 = 7 //reserve 1/7 ip for hostnic br
3029
3130)
3231
33- var (
34- customReservedIPCount int64 = 0
35- )
32+ // var (
33+ // customReservedIPCount int64 = 0
34+ // )
3635
3736type Options struct {
3837 Tag string
@@ -177,7 +176,7 @@ func (q *qingcloudAPIWrapper) GetCreatedNicsByName(name string) ([]*rpc.HostNic,
177176
178177 if len (netIDs ) > 0 {
179178 tmp := removeDupByMap (netIDs )
180- vxnets , err := q .GetVxNets (tmp )
179+ vxnets , err := q .GetVxNets (tmp , 0 )
181180 if err != nil {
182181 return nil , err
183182 }
@@ -217,7 +216,7 @@ func (q *qingcloudAPIWrapper) GetCreatedNicsByVxNet(vxnet string) ([]*rpc.HostNi
217216
218217 if len (netIDs ) > 0 {
219218 tmp := removeDupByMap (netIDs )
220- vxnets , err := q .GetVxNets (tmp )
219+ vxnets , err := q .GetVxNets (tmp , 0 )
221220 if err != nil {
222221 return nil , err
223222 }
@@ -446,7 +445,7 @@ func (q *qingcloudAPIWrapper) DescribeNicJobs(ids []string) ([]string, map[strin
446445 return left , working , nil
447446}
448447
449- func (q * qingcloudAPIWrapper ) getVxNets (ids []string , public bool ) ([]* rpc.VxNet , error ) {
448+ func (q * qingcloudAPIWrapper ) getVxNets (ids []string , public bool , customReservedIPCount int64 ) ([]* rpc.VxNet , error ) {
450449 input := & service.DescribeVxNetsInput {
451450 VxNets : service .StringSlice (ids ),
452451 Limit : service .Int (constants .NicNumLimit ),
@@ -477,21 +476,23 @@ func (q *qingcloudAPIWrapper) getVxNets(ids []string, public bool) ([]*rpc.VxNet
477476 if qcVxNet .TunnelType != nil {
478477 vxnetItem .TunnelType = * qcVxNet .TunnelType
479478 }
479+ var reservedIPCount int64
480480 if vxnetItem .TunnelType == constants .TunnelTypeVlan {
481- // parse ip_network to get mask; if mask is 24, reserve more ip than specifc in config
482- _ , ipNet , err := net .ParseCIDR (vxnetItem .Network )
483- if err != nil {
484- log .Errorf ("parse ip_network to get mask error: %v" , err )
485- }
486- maskLength , _ := ipNet .Mask .Size ()
487- if maskLength == 24 {
488- log .Infof ("vxnet %s ip network %s mask is 24, reserve another 64 ip" , * qcVxNet .VxNetID , vxnetItem .Network )
489- customReservedIPCount = 64
481+ totalCount := IPRangeCount (* qcVxNet .Router .DYNIPStart , * qcVxNet .Router .DYNIPEnd )
482+ reservedIPCount = totalCount / reservedVIPCountForVlan
483+ maxCustomReservedCount := totalCount - reservedIPCount - 1
484+
485+ if (customReservedIPCount >= 0 && maxCustomReservedCount < customReservedIPCount ) || customReservedIPCount < 0 {
486+ return nil , fmt .Errorf ("invalid customReservedIPCount %d config in vxnetpool spec, should in range 0~%d" , customReservedIPCount , maxCustomReservedCount )
490487 }
491- vxnetItem .IPEnd = getIPEndAfterReservedForVlan (* qcVxNet .Router .DYNIPStart , * qcVxNet .Router .DYNIPEnd , reservedVIPCountForVlan , customReservedIPCount )
488+ log .Infof ("vxnet %s custom reserve ip count: %d" , * qcVxNet .VxNetID , customReservedIPCount )
489+
492490 } else {
493- vxnetItem .IPEnd = getIPEndAfterReserved (* qcVxNet .Router .DYNIPEnd , reservedVIPCount , customReservedIPCount )
491+ reservedIPCount = reservedVIPCountForVxlan
492+ customReservedIPCount = 0
494493 }
494+ vxnetItem .IPEnd = getIPEndAfterReserved (* qcVxNet .Router .DYNIPEnd , reservedIPCount , customReservedIPCount )
495+
495496 } else {
496497 return nil , fmt .Errorf ("vxnet %s should bind to vpc" , * qcVxNet .VxNetID )
497498 }
@@ -502,12 +503,12 @@ func (q *qingcloudAPIWrapper) getVxNets(ids []string, public bool) ([]*rpc.VxNet
502503 return vxNets , nil
503504}
504505
505- func (q * qingcloudAPIWrapper ) GetVxNets (ids []string ) (map [string ]* rpc.VxNet , error ) {
506+ func (q * qingcloudAPIWrapper ) GetVxNets (ids []string , customReservedIPCount int64 ) (map [string ]* rpc.VxNet , error ) {
506507 if len (ids ) <= 0 {
507508 return nil , errors .WithStack (fmt .Errorf ("GetVxNets should not have empty input" ))
508509 }
509510
510- vxnets , err := q .getVxNets (ids , false )
511+ vxnets , err := q .getVxNets (ids , false , customReservedIPCount )
511512 if err != nil {
512513 return nil , err
513514 }
@@ -523,7 +524,7 @@ func (q *qingcloudAPIWrapper) GetVxNets(ids []string) (map[string]*rpc.VxNet, er
523524 }
524525 }
525526 if len (left ) > 0 {
526- vxnets , err := q .getVxNets (left , true )
527+ vxnets , err := q .getVxNets (left , true , customReservedIPCount )
527528 if err != nil {
528529 return nil , err
529530 }
@@ -571,7 +572,7 @@ func (q *qingcloudAPIWrapper) attachNicTag(nics []string) {
571572func (q * qingcloudAPIWrapper ) CreateVIPs (vxnet * rpc.VxNet ) (string , error ) {
572573 vipName := constants .NicPrefix + vxnet .ID
573574 vipRange := fmt .Sprintf ("%s-%s" , vxnet .IPStart , vxnet .IPEnd )
574- count := IPRangeCount (vxnet .IPStart , vxnet .IPEnd )
575+ count := int ( IPRangeCount (vxnet .IPStart , vxnet .IPEnd ) )
575576 input := & service.CreateVIPsInput {
576577 Count : & count ,
577578 VIPName : & vipName ,
@@ -758,23 +759,16 @@ func (q *qingcloudAPIWrapper) DescribeClusterNodes(clusterID string) ([]*rpc.Nod
758759 return nodes , nil
759760}
760761
761- func IPRangeCount (from , to string ) int {
762+ func IPRangeCount (from , to string ) int64 {
762763 startIP := cnet .ParseIP (from )
763764 endIP := cnet .ParseIP (to )
764765 startInt := cnet .IPToBigInt (* startIP )
765766 endInt := cnet .IPToBigInt (* endIP )
766- return int ( big .NewInt (0 ).Sub (endInt , startInt ).Int64 () + 1 )
767+ return big .NewInt (0 ).Sub (endInt , startInt ).Int64 () + 1
767768}
768769
769770func getIPEndAfterReserved (end string , reservedCount , customReservedCount int64 ) string {
770771 e := cnet .ParseIP (end )
771772 i := big .NewInt (0 ).Sub (cnet .IPToBigInt (* e ), big .NewInt (reservedCount + customReservedCount ))
772773 return cnet .BigIntToIP (i ).String ()
773774}
774-
775- func getIPEndAfterReservedForVlan (start , end string , reservedCount , customReservedCount int64 ) string {
776- s := cnet .ParseIP (start )
777- e := cnet .ParseIP (end )
778- i := big .NewInt (0 ).Sub (cnet .IPToBigInt (* e ), big .NewInt ((cnet .IPToBigInt (* e ).Int64 ()- cnet .IPToBigInt (* s ).Int64 ()+ 1 )/ reservedCount + customReservedCount ))
779- return cnet .BigIntToIP (i ).String ()
780- }
0 commit comments