Skip to content

Commit

Permalink
Temporary commit:
Browse files Browse the repository at this point in the history
Filters ip addresses from both the connectivity results and the
host interfaces using all the machine networks.
  • Loading branch information
CrystalChun committed Mar 21, 2024
1 parent 5c17573 commit e2907a2
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 32 deletions.
6 changes: 1 addition & 5 deletions internal/cluster/cluster.go
Expand Up @@ -1399,12 +1399,8 @@ func (m *Manager) setConnectivityMajorityGroupsForClusterInternal(cluster *commo
majorityGroups[cidr] = majorityGroup
}

primaryMachineCIDR := ""
if network.IsMachineCidrAvailable(cluster) {
primaryMachineCIDR = network.GetMachineCidrById(cluster, 0)
}
for _, family := range []network.AddressFamily{network.IPv4, network.IPv6} {
majorityGroup, err := network.CreateL3MajorityGroup(hosts, family, primaryMachineCIDR)
majorityGroup, err := network.CreateL3MajorityGroup(hosts, family, network.GetMachineNetworkCidrs(cluster))
if err != nil {
m.log.WithError(err).Warnf("Create L3 majority group for cluster %s failed", cluster.ID.String())
} else {
Expand Down
39 changes: 21 additions & 18 deletions internal/network/connectivity_groups.go
Expand Up @@ -416,9 +416,10 @@ func newL2QueryFactory(cidr string) (hostQueryFactory, error) {
}

type l3Query struct {
current int
connectivityReport models.ConnectivityReport
nodesAddresses map[strfmt.UUID]map[string]bool
current int
connectivityReport models.ConnectivityReport
nodesAddresses map[strfmt.UUID]map[string]bool
machineNetworkCidrs []string
}

func (l *l3Query) next() strfmt.UUID {
Expand All @@ -431,25 +432,29 @@ func (l *l3Query) next() strfmt.UUID {
}
foundAddresses := make(map[string]bool)
for _, l3 := range rh.L3Connectivity {
_, foundAddress := addresses[l3.RemoteIPAddress]
if foundAddress && l3.Successful {
foundAddresses[l3.RemoteIPAddress] = true
if isInCidr := IpInCidrs(l3.RemoteIPAddress, l.machineNetworkCidrs); isInCidr {
_, foundAddress := addresses[l3.RemoteIPAddress]
if foundAddress && l3.Successful {
foundAddresses[l3.RemoteIPAddress] = true
}
}
}
if len(addresses) == len(foundAddresses) {
if len(foundAddresses) > 0 && len(addresses) == len(foundAddresses) {
return rh.HostID
}
}
return ""
}

type l3QueryFactory struct {
nodesAddresses map[strfmt.UUID]map[string]bool
nodesAddresses map[strfmt.UUID]map[string]bool
machineNetworkCidrs []string
}

func (l *l3QueryFactory) create(h *models.Host) (hostQuery, error) {
ret := l3Query{
nodesAddresses: l.nodesAddresses,
nodesAddresses: l.nodesAddresses,
machineNetworkCidrs: l.machineNetworkCidrs,
}
err := json.Unmarshal([]byte(h.Connectivity), &ret.connectivityReport)
if err != nil {
Expand All @@ -458,7 +463,7 @@ func (l *l3QueryFactory) create(h *models.Host) (hostQuery, error) {
return &ret, nil
}

func newL3QueryFactory(hosts []*models.Host, family AddressFamily, primaryMachineCIDR string) (hostQueryFactory, error) {
func newL3QueryFactory(hosts []*models.Host, family AddressFamily, machineNetworkCidrs []string) (hostQueryFactory, error) {
nodesAddresses := make(map[strfmt.UUID]map[string]bool)
for _, h := range hosts {
if h.Inventory == "" {
Expand All @@ -482,19 +487,17 @@ func newL3QueryFactory(hosts []*models.Host, family AddressFamily, primaryMachin
if err != nil {
return nil, err
}
ipInCidr, err := IpInCidr(ip.String(), primaryMachineCIDR)
if err != nil {
return nil, err
}
if ipInCidr {

if ipInCidr := IpInCidrs(ip.String(), machineNetworkCidrs); ipInCidr {
value[ip.String()] = true
}
}
}
nodesAddresses[*h.ID] = value
}
return &l3QueryFactory{
nodesAddresses: nodesAddresses,
nodesAddresses: nodesAddresses,
machineNetworkCidrs: machineNetworkCidrs,
}, nil
}

Expand Down Expand Up @@ -577,11 +580,11 @@ func CreateL2MajorityGroup(cidr string, hosts []*models.Host) ([]strfmt.UUID, er
* It is done by taking a sorted connectivity group list according to the group size, and from this group take the
* largest one
*/
func CreateL3MajorityGroup(hosts []*models.Host, family AddressFamily, primaryMachineCIDR string) ([]strfmt.UUID, error) {
func CreateL3MajorityGroup(hosts []*models.Host, family AddressFamily, machineCidrs []string) ([]strfmt.UUID, error) {
if !funk.Contains([]AddressFamily{IPv4, IPv6}, family) {
return nil, errors.Errorf("Unexpected address family %+v", family)
}
factory, err := newL3QueryFactory(hosts, family, primaryMachineCIDR)
factory, err := newL3QueryFactory(hosts, family, machineCidrs)
if err != nil {
return nil, err
}
Expand Down
20 changes: 11 additions & 9 deletions internal/network/connectivity_groups_test.go
Expand Up @@ -530,6 +530,8 @@ func GenerateL3ConnectivityGroupTests(ipV4 bool, net1CIDR, net2CIDR string) {
} else {
family = IPv6
}
cidrs := []string{net1CIDR, net2CIDR}

Describe(fmt.Sprintf("connectivity groups %s", ipVersion), func() {
BeforeEach(func() {
if ipV4 {
Expand Down Expand Up @@ -560,7 +562,7 @@ func GenerateL3ConnectivityGroupTests(ipV4 bool, net1CIDR, net2CIDR string) {
Inventory: makeInventory(nodes[2]),
},
}
ret, err := CreateL3MajorityGroup(hosts, family)
ret, err := CreateL3MajorityGroup(hosts, family, cidrs)
Expect(err).ToNot(HaveOccurred())
Expect(ret).To(Equal([]strfmt.UUID{}))
})
Expand All @@ -579,7 +581,7 @@ func GenerateL3ConnectivityGroupTests(ipV4 bool, net1CIDR, net2CIDR string) {
Inventory: makeInventory(nodes[2]),
},
}
ret, err := CreateL3MajorityGroup(hosts, family)
ret, err := CreateL3MajorityGroup(hosts, family, cidrs)
Expect(err).ToNot(HaveOccurred())
Expect(ret).To(Equal([]strfmt.UUID{}))
})
Expand All @@ -604,7 +606,7 @@ func GenerateL3ConnectivityGroupTests(ipV4 bool, net1CIDR, net2CIDR string) {
Inventory: makeInventory(nodes[2]),
},
}
ret, err := CreateL3MajorityGroup(hosts, family)
ret, err := CreateL3MajorityGroup(hosts, family, cidrs)
Expect(err).ToNot(HaveOccurred())
Expect(ret).To(Equal([]strfmt.UUID{}))
})
Expand Down Expand Up @@ -632,7 +634,7 @@ func GenerateL3ConnectivityGroupTests(ipV4 bool, net1CIDR, net2CIDR string) {
Inventory: makeInventory(nodes[2]),
},
}
ret, err := CreateL3MajorityGroup(hosts, family)
ret, err := CreateL3MajorityGroup(hosts, family, cidrs)
Expect(err).ToNot(HaveOccurred())
Expect(ret).To(HaveLen(0))
})
Expand Down Expand Up @@ -660,7 +662,7 @@ func GenerateL3ConnectivityGroupTests(ipV4 bool, net1CIDR, net2CIDR string) {
Inventory: makeInventory(nodes[2]),
},
}
ret, err := CreateL3MajorityGroup(hosts, family)
ret, err := CreateL3MajorityGroup(hosts, family, cidrs)
Expect(err).ToNot(HaveOccurred())
Expect(ret).To(HaveLen(3))
Expect(ret).To(ContainElement(*nodes[0].id))
Expand Down Expand Up @@ -691,7 +693,7 @@ func GenerateL3ConnectivityGroupTests(ipV4 bool, net1CIDR, net2CIDR string) {
Inventory: makeInventory(nodes[2]),
},
}
ret, err := CreateL3MajorityGroup(hosts, family)
ret, err := CreateL3MajorityGroup(hosts, family, cidrs)
Expect(err).ToNot(HaveOccurred())
Expect(ret).To(HaveLen(0))
})
Expand Down Expand Up @@ -730,7 +732,7 @@ func GenerateL3ConnectivityGroupTests(ipV4 bool, net1CIDR, net2CIDR string) {
Inventory: makeInventory(nodes[3]),
},
}
ret, err := CreateL3MajorityGroup(hosts, family)
ret, err := CreateL3MajorityGroup(hosts, family, cidrs)
Expect(err).ToNot(HaveOccurred())
Expect(ret).To(HaveLen(4))
Expect(ret).To(ContainElement(*nodes[0].id))
Expand Down Expand Up @@ -774,7 +776,7 @@ func GenerateL3ConnectivityGroupTests(ipV4 bool, net1CIDR, net2CIDR string) {
Inventory: makeInventory(nodes[3]),
},
}
ret, err := CreateL3MajorityGroup(hosts, family)
ret, err := CreateL3MajorityGroup(hosts, family, cidrs)
Expect(err).ToNot(HaveOccurred())
Expect(ret).To(HaveLen(4))
Expect(ret).To(ContainElement(*nodes[0].id))
Expand Down Expand Up @@ -815,7 +817,7 @@ func GenerateL3ConnectivityGroupTests(ipV4 bool, net1CIDR, net2CIDR string) {
Inventory: makeInventory(nodes[3]),
},
}
ret, err := CreateL3MajorityGroup(hosts, family)
ret, err := CreateL3MajorityGroup(hosts, family, cidrs)
Expect(err).ToNot(HaveOccurred())
Expect(ret).To(HaveLen(3))
Expect(ret).To(ContainElement(*nodes[0].id))
Expand Down
9 changes: 9 additions & 0 deletions internal/network/machine_network_cidr.go
Expand Up @@ -281,6 +281,15 @@ func IpInCidr(ipAddr, cidr string) (bool, error) {
return ipNet.Contains(ip), nil
}

func IpInCidrs(ipAddr string, cidrs []string) bool {
for _, cidr := range cidrs {
if isInCidr, _ := IpInCidr(ipAddr, cidr); isInCidr {
return true
}
}
return false
}

func belongsToNetwork(log logrus.FieldLogger, h *models.Host, machineIpnet *net.IPNet) bool {
var inventory models.Inventory
err := json.Unmarshal([]byte(h.Inventory), &inventory)
Expand Down

0 comments on commit e2907a2

Please sign in to comment.