|
|
|
@ -191,61 +191,17 @@ func (r *Ring) AddPeer(p *Machine) bool {
|
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch { |
|
|
|
|
case r.ID == rings.RingZeroID: |
|
|
|
|
r.setRingZeroAllowedIPs(rp) |
|
|
|
|
case p.IsGateway(): |
|
|
|
|
r.setRingOneGatewayAllowedIPs(rp) |
|
|
|
|
default: |
|
|
|
|
r.setRingOneNodeAllowedIPs(rp) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
r.setRingZeroAllowedIPs(rp) |
|
|
|
|
r.Peers = append(r.Peers, rp) |
|
|
|
|
return true |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (r *Ring) setRingZeroAllowedIPs(rp *RingPeer) { |
|
|
|
|
regionID, zoneID, _, _ := r.Decode(rp.Address) |
|
|
|
|
|
|
|
|
|
// everyone on ring0 is a gateway to ring1
|
|
|
|
|
subnet, _ := rings.RingOnePrefix(regionID, zoneID) |
|
|
|
|
rp.AllowSubnet(subnet) |
|
|
|
|
|
|
|
|
|
// peer
|
|
|
|
|
rp.AllowCIDR(rp.Address, 32) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (r *Ring) setRingOneGatewayAllowedIPs(rp *RingPeer) { |
|
|
|
|
regionID, zoneID, _, _ := r.Decode(rp.Address) |
|
|
|
|
|
|
|
|
|
// peer
|
|
|
|
|
func (*Ring) setRingZeroAllowedIPs(rp *RingPeer) { |
|
|
|
|
// ring0 peer
|
|
|
|
|
rp.AllowCIDR(rp.Address, 32) |
|
|
|
|
|
|
|
|
|
// ring1 gateways connect to all other ring1 networks
|
|
|
|
|
r.ForEachZone(func(z *Zone) bool { |
|
|
|
|
if !z.Is(regionID, zoneID) { |
|
|
|
|
subnet := z.RingOnePrefix() |
|
|
|
|
rp.AllowSubnet(subnet) |
|
|
|
|
} |
|
|
|
|
return false |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
// ring1 gateways also connect to all ring0 addresses
|
|
|
|
|
r.ForEachZone(func(z *Zone) bool { |
|
|
|
|
z.ForEachMachine(func(p *Machine) bool { |
|
|
|
|
if p.IsGateway() { |
|
|
|
|
addr, _ := p.RingZeroAddress() |
|
|
|
|
rp.AllowCIDR(addr, 32) |
|
|
|
|
} |
|
|
|
|
return false |
|
|
|
|
}) |
|
|
|
|
return false |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (*Ring) setRingOneNodeAllowedIPs(rp *RingPeer) { |
|
|
|
|
// only to the peer itself
|
|
|
|
|
rp.AllowCIDR(rp.Address, 32) |
|
|
|
|
// everyone on ring0 has a leg on ring1
|
|
|
|
|
rp.AllowCIDR(rp.Node.RingOneAddress(), 32) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// ForEachMachine calls a function for each Machine in the ring
|
|
|
|
|