From af7002d495b3a5f52c1b0bc1e7c95d8b180b27d5 Mon Sep 17 00:00:00 2001 From: Jed Reynolds Date: Mon, 1 Mar 2021 13:32:36 -0800 Subject: [PATCH] vr_profile.py: WIP adding placement logic for virtual routers Signed-off-by: Jed Reynolds --- py-json/vr_profile.py | 126 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 109 insertions(+), 17 deletions(-) diff --git a/py-json/vr_profile.py b/py-json/vr_profile.py index 85900c64..5e08fd19 100644 --- a/py-json/vr_profile.py +++ b/py-json/vr_profile.py @@ -8,6 +8,10 @@ from realm import BaseProfile class VRProfile(BaseProfile): + Default_Margin = 15 # margin between routers and router connections + Default_VR_height = 250 + Default_VR_width = 50 + """ Virtual Router profile """ @@ -65,7 +69,7 @@ class VRProfile(BaseProfile): rect = Rect(x=int(x), y=int(y), width=int(width), height=int(height)); return rect - def get_bounding_rect(self, + def get_occupied_area(self, resource=1, debug=False): debug |= self.debug @@ -193,6 +197,74 @@ class VRProfile(BaseProfile): else: raise ValueError("vr_name must be set. Current name: %s" % self.vr_name) + def find_position(self, eid=None, target_group=None, debug=False): + debug |= self.debug + """ + get rectangular coordinates of VR or VRCX + :param eid: + :param target_group: + :return: + """ + pass + + def next_available_area(self, + go_right=True, + go_down=False, + debug=False, + height=Default_VR_height, + width=Default_VR_width): + """ + Returns a coordinate adjacent to the right or bottom of the presently occupied area with a 15px margin. + :param go_right: look to right + :param go_down: look to bottom + :param debug: + :return: rectangle that that next next VR could occupy + """ + debug |= self.debug + + # pprint(("used_vrcx_area:", used_vrcx_area)) + # print("used x %s, y %s" % (used_vrcx_area.right+15, used_vrcx_area.top+15 )) + + if not (go_right or go_down): + raise ValueError("Either go right or go down") + + used_vrcx_area = self.get_occupied_area(resource=self.vr_eid[1], debug=debug) + next_area = None + if (go_right): + next_area = Rect(x=used_vrcx_area.right+15, + y=15, + width=50, + height=250) + elif (go_down): + next_area = Rect(x=15, + y=used_vrcx_area.bottom+15, + width=50, + height=250) + else: + raise ValueError("Unexpected positioning") + + # pprint(("next_rh_area", next_area)) + # print("next_rh_area: right %s, top %s" % (next_area.right, next_area.top )) + # print("next_rh_area: x %s, y %s" % (next_area.x, next_area.y )) + return next_area + + def move_vrcx(self, debug=False): + debug |= self.debug + + + def move_vr(self, eid=None, go_right=True, go_down=False, upper_left_x=None, upper_left_y=None, debug=False): + """ + + :param edit: virtual router EID + :param go_right: select next area to the right of things + :param go_down: select next area below all things + :param upper_left_x: integer value for specific x + :param upper_left_y: integer value for specific y + :return: + """ + debug |= self.debug + used_vrcx_area = self.get_occupied_area(resource=self.vr_eid[1], debug=debug) + def create(self, vr_name=None, # upstream_port=None, @@ -203,32 +275,21 @@ class VRProfile(BaseProfile): debug=False, suppress_related_commands_=True): # Create vr - if self.debug: - debug = True + debug |= self.debug + if vr_name is None: raise ValueError("vr_name must be set. Current name: %s" % vr_name) - self.vr_eid = self.parent_realm.name_to_eid(vr_name) # determine a free area to place a router - used_vrcx_area = self.get_bounding_rect(resource=self.vr_eid[1], - debug=debug) - pprint(("used_vrcx_area:", used_vrcx_area)) - - next_rh_area = Rect(x=used_vrcx_area.right+15, - y=used_vrcx_area.top+15, - width=50, - height=250) - # pprint(("next_rh_area", next_rh_area)) - # exit(1) - + next_area = self.next_available_area(go_right=True) self.add_vr_data = { "alias": self.vr_eid[2], "shelf": 1, "resource": self.vr_eid[1], - "x": next_rh_area.x, - "y": next_rh_area.y, + "x": int(next_area.x), + "y": 15, "width": 50, "height": 250, "flags": 0 @@ -263,6 +324,37 @@ class VRProfile(BaseProfile): # nexthop=local_nexthop, # flags=1, suppress_related_commands_=suppress_related_commands_, debug_=debug) + # move a + + def remove_vr(self, eid=None, + refresh=True, + debug=False, + delay=0.05, + die_on_error=False): + + if (eid is None) or (eid[1] is None) or (eid[2] is None): + self.logg("remove_vr: invalid eid: ", audit_list=[eid]) + if (die_on_error): + raise ValueError("remove_vr: invalid eid: "+eid) + data = { + "shelf": 1, + "resource": eid[1], + "router_name": eid[2] + } + self.json_post("/cli-json/rm_vr", data, debug_=self.debug) + time.sleep(delay) + if (refresh): + self.json_post("/cli-json/nc_show_vr", { + "shelf": 1, + "resource": eid[1], + "router": "all" + }, debug_=self.debug) + self.json_post("/cli-json/nc_show_vrcx", { + "shelf": 1, + "resource": eid[1], + "cx_name": "all" + }, debug_=self.debug) + def cleanup(self, resource=0, vr_id=0, delay=0.3, debug=False): debug |= self.debug if self.vr_eid is None: