@@ -18,6 +18,7 @@ package ipam
1818
1919import (
2020 "context"
21+ "net"
2122 "reflect"
2223 "strings"
2324
@@ -45,6 +46,15 @@ const (
4546 defaultListLimit = 200
4647)
4748
49+ func ipEqual (a , b ipamv1.IPAddressStr ) bool {
50+ ipA := net .ParseIP (string (a ))
51+ ipB := net .ParseIP (string (b ))
52+ if ipA == nil || ipB == nil {
53+ return false
54+ }
55+ return ipA .Equal (ipB )
56+ }
57+
4858// IPPoolManagerInterface is an interface for a IPPoolManager.
4959type IPPoolManagerInterface interface {
5060 SetFinalizer ()
@@ -436,7 +446,7 @@ func (m *IPPoolManager) allocateAddress(addressClaim *ipamv1.IPClaim,
436446 isRequestedIPAllocated := false
437447
438448 // Conflict-case, claim is preAllocated but has requested different IP
439- if requestedIP != "" && ipPreAllocated && requestedIP != preAllocatedAddress {
449+ if requestedIP != "" && ipPreAllocated && ! ipEqual ( requestedIP , preAllocatedAddress ) {
440450 addressClaim .Status .ErrorMessage = ptr .To ("PreAllocation and requested ip address are conflicting" )
441451 return "" , 0 , nil , []ipamv1.IPAddressStr {}, errors .New ("PreAllocation and requested ip address are conflicting" )
442452 }
@@ -453,15 +463,15 @@ func (m *IPPoolManager) allocateAddress(addressClaim *ipamv1.IPClaim,
453463 }
454464 index ++
455465 // Check if requestedIP is present and matches the current address
456- if requestedIP != "" && allocatedAddress != requestedIP {
466+ if requestedIP != "" && ! ipEqual ( allocatedAddress , requestedIP ) {
457467 continue
458468 }
459- if requestedIP != "" && allocatedAddress == requestedIP {
469+ if requestedIP != "" && ipEqual ( allocatedAddress , requestedIP ) {
460470 isRequestedIPAllocated = true
461471 }
462472 // We have a pre-allocated ip, we just need to ensure that it matches the current address
463473 // if it does not, continue and try the next address
464- if ipPreAllocated && allocatedAddress != preAllocatedAddress {
474+ if ipPreAllocated && ! ipEqual ( allocatedAddress , preAllocatedAddress ) {
465475 continue
466476 }
467477 // Here the two addresses match, so we continue with that one
@@ -527,7 +537,7 @@ func (m *IPPoolManager) capiAllocateAddress(addressClaim *capipamv1beta1.IPAddre
527537 isRequestedIPAllocated := false
528538
529539 // Conflict-case, claim is preAllocated but has requested different IP
530- if requestedIP != "" && ipPreAllocated && requestedIP != preAllocatedAddress {
540+ if requestedIP != "" && ipPreAllocated && ! ipEqual ( requestedIP , preAllocatedAddress ) {
531541 conditions := clusterv1beta1.Conditions {}
532542 conditions = append (conditions , clusterv1beta1.Condition {
533543 Type : "ErrorMessage" ,
@@ -553,15 +563,15 @@ func (m *IPPoolManager) capiAllocateAddress(addressClaim *capipamv1beta1.IPAddre
553563 }
554564 index ++
555565 // Check if requestedIP is present and matches the current address
556- if requestedIP != "" && allocatedAddress != requestedIP {
566+ if requestedIP != "" && ! ipEqual ( allocatedAddress , requestedIP ) {
557567 continue
558568 }
559- if requestedIP != "" && allocatedAddress == requestedIP {
569+ if requestedIP != "" && ipEqual ( allocatedAddress , requestedIP ) {
560570 isRequestedIPAllocated = true
561571 }
562572 // We have a pre-allocated ip, we just need to ensure that it matches the current address
563573 // if it does not, continue and try the next address
564- if ipPreAllocated && allocatedAddress != preAllocatedAddress {
574+ if ipPreAllocated && ! ipEqual ( allocatedAddress , preAllocatedAddress ) {
565575 continue
566576 }
567577 // Here the two addresses match, so we continue with that one
0 commit comments