Fixed defaultroute on VPC routers in CsRoute and CsAddress

Refactored CsRoute
This commit is contained in:
Michael Andersen 2015-08-24 12:53:19 +02:00
parent bb93a61ee7
commit a9eb4ba5c9
3 changed files with 87 additions and 22 deletions

View File

@ -96,14 +96,19 @@ class CsAddress(CsDataBag):
return None return None
def process(self): def process(self):
route = CsRoute()
found_defaultroute = False
for dev in self.dbag: for dev in self.dbag:
if dev == "id": if dev == "id":
continue continue
ip = CsIP(dev, self.config) ip = CsIP(dev, self.config)
for address in self.dbag[dev]: for address in self.dbag[dev]:
if not address["nw_type"] == "control":
CsRoute(dev).add(address) gateway = str(address["gateway"])
network = str(address["network"])
ip.setAddress(address) ip.setAddress(address)
if ip.configured(): if ip.configured():
@ -118,6 +123,16 @@ class CsAddress(CsDataBag):
if CsDevice(dev, self.config).waitfordevice(): if CsDevice(dev, self.config).waitfordevice():
ip.configure() ip.configure()
if address["nw_type"] != "control":
route.add_route(dev, network)
# once we start processing public ip's we need to verify there
# is a default route and add if needed
if address["nw_type"] == "public" and not found_defaultroute:
if not route.defaultroute_exists():
if route.add_defaultroute(gateway):
found_defaultroute = True
class CsInterface: class CsInterface:
@ -275,8 +290,8 @@ class CsIP:
def post_configure(self): def post_configure(self):
""" The steps that must be done after a device is configured """ """ The steps that must be done after a device is configured """
if not self.get_type() in ["control"]: if not self.get_type() in ["control"]:
route = CsRoute(self.dev) route = CsRoute()
route.routeTable() route.add_table(self.dev)
CsRule(self.dev).addMark() CsRule(self.dev).addMark()
self.check_is_up() self.check_is_up()
self.set_mark() self.set_mark()
@ -467,9 +482,13 @@ class CsIP:
self.fw.append(["", "", "-A NETWORK_STATS -i eth2 ! -o eth0 -p tcp"]) self.fw.append(["", "", "-A NETWORK_STATS -i eth2 ! -o eth0 -p tcp"])
def post_config_change(self, method): def post_config_change(self, method):
route = CsRoute(self.dev) route = CsRoute()
route.routeTable() if method == "add":
route.add(self.address, method) route.add_table(self.dev)
route.add_route(self.dev, str(self.address["network"]))
elif method == "delete":
logging.warn("delete route not implemented")
self.fw_router() self.fw_router()
self.fw_vpcrouter() self.fw_vpcrouter()
# On deletion nw_type will no longer be known # On deletion nw_type will no longer be known

View File

@ -23,27 +23,33 @@ class CsRoute:
""" Manage routes """ """ Manage routes """
def __init__(self, dev): def __init__(self):
self.dev = dev self.table_prefix = "Table_"
self.tableNo = dev[3:]
self.table = "Table_%s" % (dev)
def routeTable(self): def get_tablename(self, name):
str = "%s %s" % (self.tableNo, self.table) return self.table_prefix + name
def add_table(self, devicename):
tablenumber = devicename[3:]
tablename = self.get_tablename(devicename)
str = "%s %s" % (tablenumber, tablename)
filename = "/etc/iproute2/rt_tables" filename = "/etc/iproute2/rt_tables"
logging.info( logging.info(
"Adding route table: " + str + " to " + filename + " if not present ") "Adding route table: " + str + " to " + filename + " if not present ")
CsHelper.addifmissing(filename, str) CsHelper.addifmissing(filename, str)
def flush(self): def flush_table(self, tablename):
CsHelper.execute("ip route flush table %s" % (self.table)) CsHelper.execute("ip route flush table %s" % (tablename))
CsHelper.execute("ip route flush cache") CsHelper.execute("ip route flush cache")
def add(self, address, method="add"): def add_route(self, dev, address):
# ip route show dev eth1 table Table_eth1 10.0.2.0/24 """ Wrapper method that adds table name and device to route statement """
if(method == "add"): # ip route add dev eth1 table Table_eth1 10.0.2.0/24
cmd = "dev %s table %s %s" % (self.dev, self.table, address['network']) table = self.get_tablename(dev)
self.set_route(cmd, method) logging.info("Adding route: dev " + dev + " table: " +
table + " network: " + address + " if not present")
cmd = "dev %s table %s %s" % (dev, table, address)
self.set_route(cmd)
def set_route(self, cmd, method="add"): def set_route(self, cmd, method="add"):
""" Add a route if it is not already defined """ """ Add a route if it is not already defined """
@ -59,3 +65,30 @@ class CsRoute:
else: else:
return return
CsHelper.execute(cmd) CsHelper.execute(cmd)
def add_defaultroute(self, gateway):
""" Add a default route
:param str gateway
:return: bool
"""
if gateway is not None:
cmd = "default via " + gateway
logging.info("Adding default route")
self.set_route(cmd)
return True
else:
return False
def defaultroute_exists(self):
""" Return True if a default route is present
:return: bool
"""
logging.info("Checking if default ipv4 route is present")
route_found = CsHelper.execute("ip -4 route list 0/0")
if len(route_found) > 0:
logging.info("Default route found: " + route_found[0])
return True
else:
logging.warn("No default route found!")
return False

View File

@ -26,8 +26,21 @@ class TestCsRoute(unittest.TestCase):
merge.DataBag.DPATH = "." merge.DataBag.DPATH = "."
def test_init(self): def test_init(self):
csroute = CsRoute(["one", "two", "three", "four"]) csroute = CsRoute()
self.assertTrue(csroute is not None) self.assertIsInstance(csroute, CsRoute)
def test_defaultroute_exists(self):
csroute = CsRoute()
self.assertFalse(csroute.defaultroute_exists())
def test_add_defaultroute(self):
csroute = CsRoute()
self.assertTrue(csroute.add_defaultroute("192.168.1.1"))
def test_get_tablename(self):
csroute = CsRoute()
name = "eth1"
self.assertEqual("Table_eth1", csroute.get_tablename(name))
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()