mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Fixed defaultroute on VPC routers in CsRoute and CsAddress
Refactored CsRoute
This commit is contained in:
parent
bb93a61ee7
commit
a9eb4ba5c9
@ -96,14 +96,19 @@ class CsAddress(CsDataBag):
|
||||
return None
|
||||
|
||||
def process(self):
|
||||
route = CsRoute()
|
||||
found_defaultroute = False
|
||||
|
||||
for dev in self.dbag:
|
||||
if dev == "id":
|
||||
continue
|
||||
ip = CsIP(dev, self.config)
|
||||
|
||||
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)
|
||||
|
||||
if ip.configured():
|
||||
@ -118,6 +123,16 @@ class CsAddress(CsDataBag):
|
||||
if CsDevice(dev, self.config).waitfordevice():
|
||||
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:
|
||||
|
||||
@ -275,8 +290,8 @@ class CsIP:
|
||||
def post_configure(self):
|
||||
""" The steps that must be done after a device is configured """
|
||||
if not self.get_type() in ["control"]:
|
||||
route = CsRoute(self.dev)
|
||||
route.routeTable()
|
||||
route = CsRoute()
|
||||
route.add_table(self.dev)
|
||||
CsRule(self.dev).addMark()
|
||||
self.check_is_up()
|
||||
self.set_mark()
|
||||
@ -467,9 +482,13 @@ class CsIP:
|
||||
self.fw.append(["", "", "-A NETWORK_STATS -i eth2 ! -o eth0 -p tcp"])
|
||||
|
||||
def post_config_change(self, method):
|
||||
route = CsRoute(self.dev)
|
||||
route.routeTable()
|
||||
route.add(self.address, method)
|
||||
route = CsRoute()
|
||||
if method == "add":
|
||||
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_vpcrouter()
|
||||
# On deletion nw_type will no longer be known
|
||||
|
||||
@ -23,27 +23,33 @@ class CsRoute:
|
||||
|
||||
""" Manage routes """
|
||||
|
||||
def __init__(self, dev):
|
||||
self.dev = dev
|
||||
self.tableNo = dev[3:]
|
||||
self.table = "Table_%s" % (dev)
|
||||
def __init__(self):
|
||||
self.table_prefix = "Table_"
|
||||
|
||||
def routeTable(self):
|
||||
str = "%s %s" % (self.tableNo, self.table)
|
||||
def get_tablename(self, name):
|
||||
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"
|
||||
logging.info(
|
||||
"Adding route table: " + str + " to " + filename + " if not present ")
|
||||
CsHelper.addifmissing(filename, str)
|
||||
|
||||
def flush(self):
|
||||
CsHelper.execute("ip route flush table %s" % (self.table))
|
||||
def flush_table(self, tablename):
|
||||
CsHelper.execute("ip route flush table %s" % (tablename))
|
||||
CsHelper.execute("ip route flush cache")
|
||||
|
||||
def add(self, address, method="add"):
|
||||
# ip route show dev eth1 table Table_eth1 10.0.2.0/24
|
||||
if(method == "add"):
|
||||
cmd = "dev %s table %s %s" % (self.dev, self.table, address['network'])
|
||||
self.set_route(cmd, method)
|
||||
def add_route(self, dev, address):
|
||||
""" Wrapper method that adds table name and device to route statement """
|
||||
# ip route add dev eth1 table Table_eth1 10.0.2.0/24
|
||||
table = self.get_tablename(dev)
|
||||
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"):
|
||||
""" Add a route if it is not already defined """
|
||||
@ -59,3 +65,30 @@ class CsRoute:
|
||||
else:
|
||||
return
|
||||
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
|
||||
|
||||
@ -26,8 +26,21 @@ class TestCsRoute(unittest.TestCase):
|
||||
merge.DataBag.DPATH = "."
|
||||
|
||||
def test_init(self):
|
||||
csroute = CsRoute(["one", "two", "three", "four"])
|
||||
self.assertTrue(csroute is not None)
|
||||
csroute = CsRoute()
|
||||
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__':
|
||||
unittest.main()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user