From c67dba63113a766a96f598c17557510843996406 Mon Sep 17 00:00:00 2001 From: Logan Lipke Date: Thu, 10 Sep 2020 10:12:24 -0700 Subject: [PATCH] Added VRProfile for creating virtual routers and vr connections --- py-json/realm.py | 126 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) diff --git a/py-json/realm.py b/py-json/realm.py index 7399ab78..bd8c0181 100755 --- a/py-json/realm.py +++ b/py-json/realm.py @@ -678,6 +678,10 @@ class Realm(LFCliBase): vap_prof = VAPProfile(lfclient_url=self.lfclient_url, local_realm=self, debug_=self.debug) return vap_prof + def new_vr_profile(self): + vap_prof = VRProfile(lfclient_url=self.lfclient_url, local_realm=self, debug_=self.debug) + return vap_prof + def new_http_profile(self): http_prof = HTTPProfile(self.lfclient_host, self.lfclient_port, local_realm=self, debug_=self.debug) return http_prof @@ -1805,6 +1809,128 @@ class VAPProfile(LFCliBase): # And now see if they are gone LFUtils.wait_until_ports_disappear(base_url=self.lfclient_url, port_list=desired_ports) +class VRProfile(LFCliBase): + def __init__(self, lfclient_url, local_realm, ssid="NA", ssid_pass="NA", mode=0, debug_=False): + self.debug = debug_ + self.lfclient_url = lfclient_url + self.ssid = ssid + self.ssid_pass = ssid_pass + self.mode = mode + self.local_realm = local_realm + self.vr_name = None + + self.created_rdds = [] + self.created_vrcxs = [] + + self.add_vr_data = { + "alias": None, + "shelf": 1, + "resource": 1, + "x": 100, + "y": 100, + "width": 250, + "height": 250, + "flags": 0 + } + + self.vrcx_data = { + 'shelf': 1, + 'resource': 1, + 'vr-name': None, + 'local_dev': None, # outer rdd + 'remote_dev': None, # inner rdd + "x": 0, + "y": 0, + "width": 10, + "height": 10, + 'flags': 0, + "subnets": None, + "nexthop": None, + "vrrp_ip": "0.0.0.0" + } + + self.set_port_data = { + "shelf": 1, + "resource": 1, + "port": None, + "ip_addr": None, + "netmask": None, + "gateway": None + } + + def create_rdd(self, resource, ip_addr, netmask, gateway, suppress_related_commands_=True, debug_=False): + rdd_data = { + "shelf": 1, + "resource": resource, + "port": "rdd0", + "peer_ifname": "rdd1" + } + # print("creating rdd0") + self.local_realm.json_post("add_rdd", rdd_data, suppress_related_commands_=suppress_related_commands_, debug_=debug_) + + rdd_data = { + "shelf": 1, + "resource": resource, + "port": "rdd1", + "peer_ifname": "rdd0" + } + # print("creating rdd1") + self.local_realm.json_post("add_rdd", rdd_data, suppress_related_commands_=suppress_related_commands_, debug_=debug_) + + self.set_port_data["port"] = "rdd0" + self.set_port_data["ip_addr"] = gateway + self.set_port_data["netmask"] = netmask + self.set_port_data["gateway"] = gateway + self.local_realm.json_post("set_port", self.set_port_data, suppress_related_commands_=suppress_related_commands_, debug_=debug_) + + self.set_port_data["port"] = "rdd1" + self.set_port_data["ip_addr"] = ip_addr + self.set_port_data["netmask"] = netmask + self.set_port_data["gateway"] = gateway + self.local_realm.json_post("set_port", self.set_port_data, suppress_related_commands_=suppress_related_commands_, debug_=debug_) + + self.created_rdds.append("rdd0") + self.created_rdds.append("rdd1") + + def create_vrcx(self, resource, local_dev, remote_dev, subnets, nexthop, flags, suppress_related_commands_=True, debug_=False): + if self.vr_name is not None: + self.vrcx_data["resource"] = resource + self.vrcx_data["vr_name"] = self.vr_name + self.vrcx_data["local_dev"] = local_dev + self.vrcx_data["remote_dev"] = remote_dev + self.vrcx_data["subnets"] = subnets + self.vrcx_data["nexthop"] = nexthop + self.vrcx_data["flags"] = flags + self.local_realm.json_post("add_vrcx", self.vrcx_data, suppress_related_commands_=suppress_related_commands_, debug_=debug_) + else: + raise ValueError("vr_name must be set. Current name: %s" % self.vr_name) + + + def create(self, resource, upstream_port="eth1", debug=False, + upstream_subnets="20.20.20.0/24", upstream_nexthop="20.20.20.1", + local_subnets="10.40.0.0/24", local_nexthop="10.40.3.198", + rdd_ip="20.20.20.20", rdd_gateway="20.20.20.1", rdd_netmask="255.255.255.0", + suppress_related_commands_=True): + + # Create vr + if self.vr_name is not None: + self.add_vr_data["alias"] = self.vr_name + self.local_realm.json_post("add_vr", self.add_vr_data, debug_=debug) + else: + raise ValueError("vr_name must be set. Current name: %s" % self.vr_name) + # Create 1 rdd pair + self.create_rdd(resource=resource, ip_addr=rdd_ip, gateway=rdd_gateway, netmask=rdd_netmask) # rdd0, rdd1; rdd0 gateway, rdd1 connected to network + + # connect rdds and upstream + self.create_vrcx(resource=resource, local_dev=upstream_port, remote_dev="NA", subnets=upstream_subnets, nexthop=upstream_nexthop, + flags=257, suppress_related_commands_=suppress_related_commands_, debug_=debug) + self.create_vrcx(resource=resource, local_dev="rdd0", remote_dev="rdd1", subnets=local_subnets, nexthop=local_nexthop, + flags=1, suppress_related_commands_=suppress_related_commands_, debug_=debug) + + def cleanup(self, resource, delay=0.03): + # TODO: Cleanup for VRProfile + pass + class FIOCXProfile(LFCliBase): def __init__(self, lfclient_host, lfclient_port, local_realm, debug_=False): super().__init__(lfclient_host, lfclient_port, debug_, _halt_on_error=True)