Properly handle takeover state in VXNetworks

Most of these actions/conditionals were looking for primary state, but
were failing during node takeover. Update the conditionals to look for
both router states instead.

Also add a wait to lock flushing until a takeover is completed.
This commit is contained in:
Joshua Boniface 2020-03-02 10:41:00 -05:00
parent b8852e116e
commit 1e4350ca6f
2 changed files with 15 additions and 12 deletions

View File

@ -74,6 +74,9 @@ def run_command(zk_conn, logger, this_node, data):
# Flushing VM RBD locks # Flushing VM RBD locks
if command == 'flush_locks': if command == 'flush_locks':
dom_uuid = args dom_uuid = args
# If this node is taking over primary state, wait until it's done
while this_node.router_state == 'takeover':
time.sleep(1)
if this_node.router_state == 'primary': if this_node.router_state == 'primary':
# Lock the command queue # Lock the command queue
zk_lock = zkhandler.writelock(zk_conn, '/cmd/domains') zk_lock = zkhandler.writelock(zk_conn, '/cmd/domains')

View File

@ -235,11 +235,11 @@ add rule inet filter forward ip6 saddr {netaddr6} counter jump {vxlannic}-out
if data and self.ip6_gateway != data.decode('ascii'): if data and self.ip6_gateway != data.decode('ascii'):
orig_gateway = self.ip6_gateway orig_gateway = self.ip6_gateway
if self.this_node.router_state == 'primary': if self.this_node.router_state in ['primary', 'takeover']:
if orig_gateway: if orig_gateway:
self.removeGateway6Address() self.removeGateway6Address()
self.ip6_gateway = data.decode('ascii') self.ip6_gateway = data.decode('ascii')
if self.this_node.router_state == 'primary': if self.this_node.router_state in ['primary', 'takeover']:
self.createGateway6Address() self.createGateway6Address()
if self.dhcp_server_daemon: if self.dhcp_server_daemon:
self.stopDHCPServer() self.stopDHCPServer()
@ -257,9 +257,9 @@ add rule inet filter forward ip6 saddr {netaddr6} counter jump {vxlannic}-out
if data and self.dhcp6_flag != ( data.decode('ascii') == 'True' ): if data and self.dhcp6_flag != ( data.decode('ascii') == 'True' ):
self.dhcp6_flag = ( data.decode('ascii') == 'True' ) self.dhcp6_flag = ( data.decode('ascii') == 'True' )
if self.dhcp6_flag and not self.dhcp_server_daemon and self.this_node.router_state == 'primary': if self.dhcp6_flag and not self.dhcp_server_daemon and self.this_node.router_state in ['primary', 'takeover']:
self.startDHCPServer() self.startDHCPServer()
elif self.dhcp_server_daemon and not self.dhcp4_flag and self.this_node.router_state == 'primary': elif self.dhcp_server_daemon and not self.dhcp4_flag and self.this_node.router_state in ['primary', 'takeover']:
self.stopDHCPServer() self.stopDHCPServer()
@self.zk_conn.DataWatch('/networks/{}/ip4_network'.format(self.vni)) @self.zk_conn.DataWatch('/networks/{}/ip4_network'.format(self.vni))
@ -286,11 +286,11 @@ add rule inet filter forward ip6 saddr {netaddr6} counter jump {vxlannic}-out
if data and self.ip4_gateway != data.decode('ascii'): if data and self.ip4_gateway != data.decode('ascii'):
orig_gateway = self.ip4_gateway orig_gateway = self.ip4_gateway
if self.this_node.router_state == 'primary': if self.this_node.router_state in ['primary', 'takeover']:
if orig_gateway: if orig_gateway:
self.removeGateway4Address() self.removeGateway4Address()
self.ip4_gateway = data.decode('ascii') self.ip4_gateway = data.decode('ascii')
if self.this_node.router_state == 'primary': if self.this_node.router_state in ['primary', 'takeover']:
self.createGateway4Address() self.createGateway4Address()
if self.dhcp_server_daemon: if self.dhcp_server_daemon:
self.stopDHCPServer() self.stopDHCPServer()
@ -308,9 +308,9 @@ add rule inet filter forward ip6 saddr {netaddr6} counter jump {vxlannic}-out
if data and self.dhcp4_flag != ( data.decode('ascii') == 'True' ): if data and self.dhcp4_flag != ( data.decode('ascii') == 'True' ):
self.dhcp4_flag = ( data.decode('ascii') == 'True' ) self.dhcp4_flag = ( data.decode('ascii') == 'True' )
if self.dhcp4_flag and not self.dhcp_server_daemon and self.this_node.router_state == 'primary': if self.dhcp4_flag and not self.dhcp_server_daemon and self.this_node.router_state in ['primary', 'takeover']:
self.startDHCPServer() self.startDHCPServer()
elif self.dhcp_server_daemon and not self.dhcp6_flag and self.this_node.router_state == 'primary': elif self.dhcp_server_daemon and not self.dhcp6_flag and self.this_node.router_state in ['primary', 'takeover']:
self.stopDHCPServer() self.stopDHCPServer()
@self.zk_conn.DataWatch('/networks/{}/dhcp4_start'.format(self.vni)) @self.zk_conn.DataWatch('/networks/{}/dhcp4_start'.format(self.vni))
@ -349,7 +349,7 @@ add rule inet filter forward ip6 saddr {netaddr6} counter jump {vxlannic}-out
if self.dhcp_reservations != new_reservations: if self.dhcp_reservations != new_reservations:
old_reservations = self.dhcp_reservations old_reservations = self.dhcp_reservations
self.dhcp_reservations = new_reservations self.dhcp_reservations = new_reservations
if self.this_node.router_state == 'primary': if self.this_node.router_state in ['primary', 'takeover']:
self.updateDHCPReservations(old_reservations, new_reservations) self.updateDHCPReservations(old_reservations, new_reservations)
if self.dhcp_server_daemon: if self.dhcp_server_daemon:
self.stopDHCPServer() self.stopDHCPServer()
@ -601,7 +601,7 @@ add rule inet filter forward ip6 saddr {netaddr6} counter jump {vxlannic}-out
self.createGateway4Address() self.createGateway4Address()
def createGateway6Address(self): def createGateway6Address(self):
if self.this_node.router_state == 'primary': if self.this_node.router_state in ['primary', 'takeover']:
self.logger.out( self.logger.out(
'Creating gateway {}/{} on interface {}'.format( 'Creating gateway {}/{} on interface {}'.format(
self.ip6_gateway, self.ip6_gateway,
@ -614,7 +614,7 @@ add rule inet filter forward ip6 saddr {netaddr6} counter jump {vxlannic}-out
common.createIPAddress(self.ip6_gateway, self.ip6_cidrnetmask, self.bridge_nic) common.createIPAddress(self.ip6_gateway, self.ip6_cidrnetmask, self.bridge_nic)
def createGateway4Address(self): def createGateway4Address(self):
if self.this_node.router_state == 'primary': if self.this_node.router_state in ['primary', 'takeover']:
self.logger.out( self.logger.out(
'Creating gateway {}/{} on interface {}'.format( 'Creating gateway {}/{} on interface {}'.format(
self.ip4_gateway, self.ip4_gateway,
@ -627,7 +627,7 @@ add rule inet filter forward ip6 saddr {netaddr6} counter jump {vxlannic}-out
common.createIPAddress(self.ip4_gateway, self.ip4_cidrnetmask, self.bridge_nic) common.createIPAddress(self.ip4_gateway, self.ip4_cidrnetmask, self.bridge_nic)
def startDHCPServer(self): def startDHCPServer(self):
if self.this_node.router_state == 'primary' and self.nettype == 'managed': if self.this_node.router_state in ['primary', 'takeover'] and self.nettype == 'managed':
self.logger.out( self.logger.out(
'Starting dnsmasq DHCP server on interface {}'.format( 'Starting dnsmasq DHCP server on interface {}'.format(
self.bridge_nic self.bridge_nic