diff --git a/ansible/generate_topo.py b/ansible/generate_topo.py index 410d265f2aa..d9c482496e9 100755 --- a/ansible/generate_topo.py +++ b/ansible/generate_topo.py @@ -32,6 +32,21 @@ def __contains__(self, key): return any([key in lag_port for lag_port in self if isinstance(lag_port, LagPort)]) +class LagLink(set): + def __init__(self, *links): + super().__init__(links) + + +class LinkList(list): + def __init__(self, *lag_links: Union[LagLink, int]): + super().__init__(lag_links) + + def __contains__(self, key): + if super().__contains__(key): + return True + return any([key in lag_link for lag_link in self if isinstance(lag_link, LagLink)]) + + Breakout = namedtuple('Breakout', ['port', 'index']) # Define the roles for the devices in the topology @@ -124,6 +139,7 @@ def __contains__(self, key): 'uplink_ports': PortList(45, 46, 47, 48, 49, 50, 51, 52), 'peer_ports': [], 'skip_ports': PortList(63), + 'continuous_vms': True, "panel_port_step": 1}, 'p32o64lt2': {"ds_breakout": 2, "us_breakout": 2, "ds_link_step": 1, "us_link_step": 1, 'uplink_ports': PortList(45, 49, 46, 50), @@ -133,7 +149,34 @@ def __contains__(self, key): *[p for p in range(0, 32)] ), 'peer_ports': [], + 'continuous_vms': True, "panel_port_step": 1}, + 'p32v128f2': {"ds_breakout": 4, "us_breakout": 1, "ds_link_step": 1, "us_link_step": 1, + 'uplink_ports': PortList(*list(range(0, 32))), + 'lag_list': LinkList(LagLink(0, 1), LagLink(2, 3), LagLink(4, 5), LagLink(6, 7), + LagLink(16, 17), LagLink(18, 19), LagLink(20, 21), LagLink(22, 23)), + 'skip_ports': PortList(*list(range(8, 16)), *list(range(24, 32)), + 34, 35, 36, 37, 38, 57, 58, 59, 62, 63), + 'skip_links': ([33, 34, 35, 37, 38, 39, 145, 146, 147, 149, 150, 151] + + [link for port in range(39, 57) + for link in [32 + (port - 32) * 4 + 2, 32 + (port - 32) * 4 + 3]]), + 'peer_ports': [], + 'continuous_vms': True, + 'panel_port_step': 1, + "link_based": True}, + 'p32o64f2': {"ds_breakout": 1, "us_breakout": 2, "ds_link_step": 1, "us_link_step": 1, + 'uplink_ports': PortList(*list(range(32, 64))), + "lag_list": LinkList( + LagLink(0, 1), LagLink(2, 3), LagLink(4, 5), LagLink(6, 7), LagLink(8, 9), + LagLink(16, 17), LagLink(18, 19), LagLink(20, 21), LagLink(22, 23), LagLink(24, 25), + LagLink(56), LagLink(58), LagLink(60), LagLink(62), + LagLink(64), LagLink(66), LagLink(68), LagLink(70)), + 'skip_ports': PortList(*list(range(10, 16)), *list(range(26, 44)), *list(range(52, 64))), + 'skip_links': [link for port in range(44, 52) for link in [32 + (port - 32) * 2 + 1]], + 'peer_ports': [], + 'continuous_vms': True, + "panel_port_step": 1, + "link_based": True}, } overwrite_file_name = { @@ -197,8 +240,7 @@ def __init__(self, self.tornum = tornum # VLAN configuration - self.vlans = [link_id] if not isinstance( - link_id, range) else [*link_id] + self.vlans = link_id # BGP configuration self.asn = role_cfg["asn"] @@ -294,6 +336,132 @@ def __init__(self, name: str, vlan_count: int, hostifs: List[HostInterface], v4_ v6_prefix.network_address += 2**96 +def generate_topo_link_based(role: str, + panel_port_count: int, + port_cfg_type: str = "default", + ) -> Tuple[List[VM], List[HostInterface]]: + + def _find_lag_link(link_id: int) -> bool: + nonlocal port_cfg + if not isinstance(port_cfg["lag_list"], LinkList): + return False, None + + lag_link = next( + (lp for lp in (port_cfg["lag_list"]) + if isinstance(lp, LagLink) and link_id in lp), None) + return (lag_link is not None, lag_link) + + dut_role_cfg = roles_cfg[role] + port_cfg = hw_port_cfg[port_cfg_type] + uplink_ports = port_cfg.get('uplink_ports', []) + peer_ports = port_cfg.get('peer_ports', []) + skip_ports = port_cfg.get('skip_ports', []) + skip_links = port_cfg.get("skip_links", []) + + vm_list = [] + downlinkif_list = [] + uplinkif_list = [] + disabled_hostif_list = [] + per_role_vm_count = defaultdict(lambda: 0) + lag_links_assigned = set() + tornum = 1 + link_id_start = 0 + + for panel_port_id in list(range(0, panel_port_count, port_cfg['panel_port_step'])) + peer_ports: + vm_role_cfg = None + link_step = 1 + link_type = None + + if panel_port_id in uplink_ports: + if dut_role_cfg["uplink"] is None: + raise ValueError( + "Uplink port specified for a role that doesn't have an uplink") + + vm_role_cfg = dut_role_cfg["uplink"] + + link_id_end = link_id_start + port_cfg['us_breakout'] + link_step = port_cfg['us_link_step'] + link_type = 'up' + elif panel_port_id in peer_ports: + if dut_role_cfg["peer"] is None: + raise ValueError( + "Peer port specified for a role that doesn't have a peer") + + vm_role_cfg = dut_role_cfg["peer"] + + link_id_end = link_id_start + 1 + link_step = 1 + link_type = 'peer' + elif panel_port_id in port_cfg.get("fabric_ports", []): + vm_role_cfg = dut_role_cfg["fabric"] + + link_id_end = link_id_start + port_cfg.get("fabric_breakout", 1) + link_step = 1 + link_type = 'fabric' + else: + # If downlink is not specified, we consider it is host interface + if dut_role_cfg["downlink"] is not None: + vm_role_cfg = dut_role_cfg["downlink"] + + link_id_end = link_id_start + port_cfg['ds_breakout'] + link_step = port_cfg['ds_link_step'] + link_type = 'down' + + for link_id in range(link_id_start, link_id_end): + vm = None + hostif = None + + # Create the VM or host interface based on the configuration + if vm_role_cfg is not None: + if not port_cfg.get('continuous_vms', False): # the VM id is per-link basis if setting is False + per_role_vm_count[vm_role_cfg["role"]] += 1 + + if (link_id - link_id_start) % link_step == 0 and panel_port_id not in skip_ports: + # Skip breakout if defined + if panel_port_id in skip_ports: + continue + + if link_id in skip_links or link_id in lag_links_assigned: + continue + + is_lag_link, lag_link = _find_lag_link(link_id) + + if port_cfg.get('continuous_vms', False): # the VM id is continuous if setting is true + per_role_vm_count[vm_role_cfg["role"]] += 1 + + vm_role_cfg["asn"] += vm_role_cfg.get("asn_increment", 1) + vm_role_cfg["asn_v6"] += vm_role_cfg.get("asn_increment", 1) + + if is_lag_link: + # only create VM for first link in the lag + vm = VM(list(lag_link), len(vm_list), per_role_vm_count[vm_role_cfg["role"]], tornum, + dut_role_cfg["asn"], dut_role_cfg["asn_v6"], vm_role_cfg, link_id_start, + num_lags=len(lag_link)) + lag_links_assigned.update(lag_link) + else: + vm = VM([link_id], len(vm_list), per_role_vm_count[vm_role_cfg["role"]], tornum, + dut_role_cfg["asn"], dut_role_cfg["asn_v6"], vm_role_cfg, link_id, + num_lags=0) + vm_list.append(vm) + if link_type == 'up': + uplinkif_list.append(link_id) + elif link_type == 'down': + tornum += 1 + downlinkif_list.append(link_id) + else: + if ((link_id - link_id_start) % link_step == 0 + and panel_port_id not in skip_ports + and link_id not in port_cfg.get("skip_links", [])): + hostif = HostInterface(link_id) + downlinkif_list.append(hostif) + elif (panel_port_id in skip_ports) or (link_id in port_cfg.get("skip_links", [])): + hostif = HostInterface(link_id) + disabled_hostif_list.append(hostif) + link_id_start = link_id_end + + return vm_list, downlinkif_list, uplinkif_list, disabled_hostif_list + + def generate_topo(role: str, panel_port_count: int, uplink_ports: List[int], @@ -308,15 +476,20 @@ def _find_lag_port(port_id: int) -> bool: return False, None lag_port = next( - (lp for lp in port_cfg["uplink_ports"] if isinstance(lp, LagPort) and port_id in lp), None) + (lp for lp in (port_cfg["uplink_ports"] + port_cfg.get("downlink_ports", [])) + if isinstance(lp, LagPort) and port_id in lp), None) return (lag_port is not None, lag_port) dut_role_cfg = roles_cfg[role] port_cfg = hw_port_cfg[port_cfg_type] + if port_cfg.get("link_based", False): + return generate_topo_link_based(role, panel_port_count, port_cfg_type) + vm_list = [] downlinkif_list = [] uplinkif_list = [] + disabled_hostif_list = [] per_role_vm_count = defaultdict(lambda: 0) lag_port_assigned = set() tornum = 1 @@ -375,7 +548,8 @@ def _find_lag_port(port_id: int) -> bool: vm_role_cfg["asn"] += vm_role_cfg.get("asn_increment", 1) vm_role_cfg["asn_v6"] += vm_role_cfg.get("asn_increment", 1) - vm = VM(range(link_id_start, end_vlan_range), len(vm_list), per_role_vm_count[vm_role_cfg["role"]], tornum, + vm = VM(list(range(link_id_start, end_vlan_range)), len(vm_list), + per_role_vm_count[vm_role_cfg["role"]], tornum, dut_role_cfg["asn"], dut_role_cfg["asn_v6"], vm_role_cfg, link_id_start, num_lags=len(lag_port) * num_breakout) @@ -398,20 +572,20 @@ def _find_lag_port(port_id: int) -> bool: # Create the VM or host interface based on the configuration if vm_role_cfg is not None: - if 'lt2' not in role: # For non LT2 topo , the VM id is per-link basis. + if not port_cfg.get('continuous_vms', False): # the VM id is per-link basis if setting is False per_role_vm_count[vm_role_cfg["role"]] += 1 if (link_id - link_id_start) % link_step == 0 and panel_port_id not in skip_ports: # Skip breakout if defined - if (panel_port_id, link_id - link_id_start) in skip_ports: + if panel_port_id in skip_ports: continue - if 'lt2' in role: # for LT2 topo, the VM id is continuous regardless of the link. + if port_cfg.get('continuous_vms', False): # the VM id is continuous if setting is true per_role_vm_count[vm_role_cfg["role"]] += 1 vm_role_cfg["asn"] += vm_role_cfg.get("asn_increment", 1) vm_role_cfg["asn_v6"] += vm_role_cfg.get("asn_increment", 1) - vm = VM(link_id, len(vm_list), per_role_vm_count[vm_role_cfg["role"]], tornum, + vm = VM([link_id], len(vm_list), per_role_vm_count[vm_role_cfg["role"]], tornum, dut_role_cfg["asn"], dut_role_cfg["asn_v6"], vm_role_cfg, link_id, num_lags=vm_role_cfg.get('num_lags', 0)) vm_list.append(vm) @@ -421,12 +595,17 @@ def _find_lag_port(port_id: int) -> bool: tornum += 1 downlinkif_list.append(link_id) else: - if (link_id - link_id_start) % link_step == 0 and panel_port_id not in skip_ports: + if ((link_id - link_id_start) % link_step == 0 + and panel_port_id not in skip_ports + and link_id not in port_cfg.get("skip_links", [])): hostif = HostInterface(link_id) downlinkif_list.append(hostif) + elif (panel_port_id in skip_ports) or (link_id in port_cfg.get("skip_links", [])): + hostif = HostInterface(link_id) + disabled_hostif_list.append(hostif) link_id_start = link_id_end - return vm_list, downlinkif_list, uplinkif_list + return vm_list, downlinkif_list, uplinkif_list, disabled_hostif_list def generate_vlan_groups(hostif_list: List[HostInterface]) -> List[VlanGroup]: @@ -446,6 +625,7 @@ def generate_topo_file(role: str, template_file: str, vm_list: List[VM], hostif_list: List[HostInterface], + disabled_hostif_list: List[HostInterface], vlan_group_list: List[VlanGroup] ) -> str: @@ -456,6 +636,7 @@ def generate_topo_file(role: str, dut=roles_cfg[role], vm_list=vm_list, hostif_list=hostif_list, + disabled_hostif_list=disabled_hostif_list, vlan_group_list=vlan_group_list) return output @@ -472,7 +653,10 @@ def write_topo_file(role: str, uplink_keyword = f"u{uplink_port_count}" if uplink_port_count > 0 else "" peer_keyword = f"s{peer_port_count}" if peer_port_count > 0 else "" - file_path = f"vars/topo_{role}-{keyword}-{downlink_keyword}{uplink_keyword}{peer_keyword}{suffix}.yml" + if keyword != "": + file_path = f"vars/topo_{role}-{keyword}-{downlink_keyword}{uplink_keyword}{peer_keyword}{suffix}.yml" + else: + file_path = f"vars/topo_{role}-{downlink_keyword}{uplink_keyword}{peer_keyword}{suffix}.yml" if role in overwrite_file_name and keyword in overwrite_file_name[role]: file_path = f"vars/topo_{overwrite_file_name[role][keyword]}.yml" @@ -485,7 +669,7 @@ def write_topo_file(role: str, @click.command() @click.option("--role", "-r", required=True, type=click.Choice(['t0', 't1', 'lt2']), help="Role of the device") -@click.option("--keyword", "-k", required=True, type=str, help="Keyword for the topology file") +@click.option("--keyword", "-k", required=False, type=str, default="", help="Keyword for the topology file") @click.option("--template", "-t", required=True, type=str, help="Path to the Jinja template file") @click.option("--port-count", "-c", required=True, type=int, help="Number of physical ports used on the device") @click.option("--uplinks", "-u", required=False, type=str, default="", help="Comma-separated list of uplink ports") @@ -522,7 +706,8 @@ def main(role: str, keyword: str, template: str, port_count: int, uplinks: str, - ./generate_topo.py -r t1 -k isolated-v6 -t t1-isolated-v6 -c 64 -l 'c448o16-lag-sparse' - ./generate_topo.py -r lt2 -k o128 -t lt2_128 -c 64 -l 'o128lt2' - ./generate_topo.py -r lt2 -k p32o64 -t lt2_p32o64 -c 64 -l 'p32o64lt2' - + - ./generate_topo.py -r t0 -k f2 -t t0 -c 64 -l 'p32v128f2' + - ./generate_topo.py -r t1 -k f2 -t t1 -c 64 -l 'p32o64f2' """ uplink_ports = [int(port) for port in uplinks.split(",")] if uplinks != "" else \ hw_port_cfg[link_cfg]['uplink_ports'] @@ -531,14 +716,13 @@ def main(role: str, keyword: str, template: str, port_count: int, uplinks: str, skip_ports = [int(port) for port in skips.split( ",")] if skips != "" else hw_port_cfg[link_cfg]['skip_ports'] - vm_list, downlinkif_list, uplinkif_list = generate_topo(role, port_count, uplink_ports, peer_ports, - skip_ports, link_cfg) + vm_list, downlinkif_list, uplinkif_list, disabled_hostif_list = \ + generate_topo(role, port_count, uplink_ports, peer_ports, skip_ports, link_cfg) vlan_group_list = [] if role == "t0": vlan_group_list = generate_vlan_groups(downlinkif_list) file_content = generate_topo_file( - role, f"templates/topo_{template}.j2", vm_list, downlinkif_list, vlan_group_list) - + role, f"templates/topo_{template}.j2", vm_list, downlinkif_list, disabled_hostif_list, vlan_group_list) write_topo_file(role, keyword, len(downlinkif_list), len(uplinkif_list), len(peer_ports), '-lag' if 'lag' in link_cfg else '', file_content) diff --git a/ansible/module_utils/port_utils.py b/ansible/module_utils/port_utils.py index 83e1bb294e7..e10a50bdcb8 100644 --- a/ansible/module_utils/port_utils.py +++ b/ansible/module_utils/port_utils.py @@ -133,6 +133,12 @@ def get_port_alias_to_name_map(hwsku, asic_name=None): port_alias_to_name_map["etp%d%s" % (i, j)] = "Ethernet%d" % ((i - 1) * 8 + x - 1) port_alias_to_name_map["etp65"] = "Ethernet512" port_alias_to_name_map["etp66"] = "Ethernet513" + elif hwsku in ["Arista-7060X6-64PE-B-P32V128", "Arista-7060X6-64PE-P32V128"]: + for i in range(1, 33): + port_alias_to_name_map["etp%d" % (i)] = "Ethernet%d" % ((i - 1) * 8) + for i in range(33, 65): + for x, j in zip([1, 3, 5, 7], ["a", "b", "c", "d"]): + port_alias_to_name_map["etp%d%s" % (i, j)] = "Ethernet%d" % ((i - 1) * 8 + x - 1) elif hwsku == "Arista-7060X6-64PE-256x200G": for i in range(1, 65): for j in [1, 3, 5, 7]: diff --git a/ansible/roles/eos/templates/t0-f2-d40u8-leaf.j2 b/ansible/roles/eos/templates/t0-f2-d40u8-leaf.j2 new file mode 120000 index 00000000000..8430cb1debd --- /dev/null +++ b/ansible/roles/eos/templates/t0-f2-d40u8-leaf.j2 @@ -0,0 +1 @@ +t0-leaf.j2 \ No newline at end of file diff --git a/ansible/roles/eos/templates/t1-f2-d10u8-spine.j2 b/ansible/roles/eos/templates/t1-f2-d10u8-spine.j2 new file mode 100644 index 00000000000..1f6b43733bd --- /dev/null +++ b/ansible/roles/eos/templates/t1-f2-d10u8-spine.j2 @@ -0,0 +1,144 @@ +{% set host = configuration[hostname] %} +{% set mgmt_ip = ansible_host %} +{% if vm_type is defined and vm_type == "ceos" %} + {% set mgmt_if_index = 0 %} +{% else %} + {% set mgmt_if_index = 1 %} +{% endif %} +no schedule tech-support +! +{% if vm_type is defined and vm_type == "ceos" %} +agent LicenseManager shutdown +agent PowerFuse shutdown +agent PowerManager shutdown +agent Thermostat shutdown +agent LedPolicy shutdown +agent StandbyCpld shutdown +agent Bfd shutdown +{% endif %} +! +hostname {{ hostname }} +! +vrf definition MGMT + rd 1:1 +! +spanning-tree mode mstp +! +aaa root secret 0 123456 +! +username admin privilege 15 role network-admin secret 0 123456 +! +clock timezone UTC +! +lldp run +lldp management-address Management{{ mgmt_if_index }} +lldp management-address vrf MGMT +! +snmp-server community {{ snmp_rocommunity }} ro +snmp-server vrf MGMT +! +ip routing +ip routing vrf MGMT +ipv6 unicast-routing +! +{% if disable_ceos_mgmt_gateway is defined and disable_ceos_mgmt_gateway == 'yes'%} +{% elif vm_mgmt_gw is defined %} +ip route vrf MGMT 0.0.0.0/0 {{ vm_mgmt_gw }} +{% else %} +ip route vrf MGMT 0.0.0.0/0 {{ mgmt_gw }} +{% endif %} +! +interface Management {{ mgmt_if_index }} + description TO LAB MGMT SWITCH +{% if vm_type is defined and vm_type == "ceos" %} + vrf MGMT +{% else %} + vrf forwarding MGMT +{% endif %} + ip address {{ mgmt_ip }}/{{ mgmt_prefixlen }} + no shutdown +! +{% for name, iface in host['interfaces'].items() %} +interface {{ name }} + {% if name.startswith('Loopback') %} + description LOOPBACK + {% else %} + mtu 9214 + no switchport + no shutdown + {% endif %} + {% if name.startswith('Port-Channel') %} + port-channel min-links 1 + {% endif %} + {% if iface['lacp'] is defined %} + channel-group {{ iface['lacp'] }} mode active + lacp rate normal + {% endif %} + {% if iface['ipv4'] is defined %} + ip address {{ iface['ipv4'] }} + {% endif %} + {% if iface['ipv6'] is defined %} + ipv6 enable + ipv6 address {{ iface['ipv6'] }} + ipv6 nd ra suppress + {% endif %} + no shutdown +! +{% endfor %} +! +interface {{ bp_ifname }} + description backplane + no switchport + no shutdown +{% if host['bp_interface']['ipv4'] is defined %} + ip address {{ host['bp_interface']['ipv4'] }} +{% endif %} +{% if host['bp_interface']['ipv6'] is defined %} + ipv6 enable + ipv6 address {{ host['bp_interface']['ipv6'] }} + ipv6 nd ra suppress +{% endif %} + no shutdown +! +router bgp {{ host['bgp']['asn'] }} + router-id {{ host['bgp']['router-id'] if host['bgp']['router-id'] is defined else host['interfaces']['Loopback0']['ipv4'] | ansible.utils.ipaddr('address') }} + ! +{% for asn, remote_ips in host['bgp']['peers'].items() %} + {% for remote_ip in remote_ips %} + neighbor {{ remote_ip }} remote-as {{ asn }} + neighbor {{ remote_ip }} description {{ asn }} + neighbor {{ remote_ip }} next-hop-self + {% if remote_ip | ansible.utils.ipv6 %} + address-family ipv6 + neighbor {{ remote_ip }} activate + exit + {% endif %} + {% endfor %} +{% endfor %} +{% if props.enable_ipv4_routes_generation is not defined or props.enable_ipv4_routes_generation %} + neighbor {{ props.nhipv4 }} remote-as {{ host['bgp']['asn'] }} + neighbor {{ props.nhipv4 }} description exabgp_v4 +{% endif %} +{% if props.enable_ipv6_routes_generation is not defined or props.enable_ipv6_routes_generation %} + neighbor {{ props.nhipv6 }} remote-as {{ host['bgp']['asn'] }} + neighbor {{ props.nhipv6 }} description exabgp_v6 + address-family ipv6 + neighbor {{ props.nhipv6 }} activate + exit +{% endif %} + ! +{% for name, iface in host['interfaces'].items() if name.startswith('Loopback') %} + {% if iface['ipv4'] is defined %} + network {{ iface['ipv4'] }} + {% endif %} + {% if iface['ipv6'] is defined %} + network {{ iface['ipv6'] }} + {% endif %} +{% endfor %} +! +management api http-commands + no protocol https + protocol http + no shutdown +! +end diff --git a/ansible/roles/eos/templates/t1-f2-d10u8-tor.j2 b/ansible/roles/eos/templates/t1-f2-d10u8-tor.j2 new file mode 100644 index 00000000000..bf82f7c8a39 --- /dev/null +++ b/ansible/roles/eos/templates/t1-f2-d10u8-tor.j2 @@ -0,0 +1,144 @@ +{% set host = configuration[hostname] %} +{% set mgmt_ip = ansible_host %} +{% set tornum = host['tornum'] %} +{% if vm_type is defined and vm_type == "ceos" %} +{% set mgmt_if_index = 0 %} +{% else %} +{% set mgmt_if_index = 1 %} +{% endif %} +no schedule tech-support +! +{% if vm_type is defined and vm_type == "ceos" %} +agent LicenseManager shutdown +agent PowerFuse shutdown +agent PowerManager shutdown +agent Thermostat shutdown +agent LedPolicy shutdown +agent StandbyCpld shutdown +agent Bfd shutdown +{% endif %} +! +hostname {{ hostname }} +! +vrf definition MGMT + rd 1:1 +! +spanning-tree mode mstp +! +aaa root secret 0 123456 +! +username admin privilege 15 role network-admin secret 0 123456 +! +clock timezone UTC +! +lldp run +lldp management-address Management{{ mgmt_if_index }} +lldp management-address vrf MGMT +! +snmp-server community {{ snmp_rocommunity }} ro +snmp-server vrf MGMT +! +ip routing +ip routing vrf MGMT +ipv6 unicast-routing +! +{% if disable_ceos_mgmt_gateway is defined and disable_ceos_mgmt_gateway == 'yes'%} +{% elif vm_mgmt_gw is defined %} +ip route vrf MGMT 0.0.0.0/0 {{ vm_mgmt_gw }} +{% else %} +ip route vrf MGMT 0.0.0.0/0 {{ mgmt_gw }} +{% endif %} +! +interface Management {{ mgmt_if_index }} + description TO LAB MGMT SWITCH + {% if vm_type is defined and vm_type == "ceos" %} + vrf MGMT +{% else %} + vrf forwarding MGMT + {% endif %} + ip address {{ mgmt_ip }}/{{ mgmt_prefixlen }} + no shutdown +! +{% for name, iface in host['interfaces'].items() %} +interface {{ name }} +{% if name.startswith('Loopback') %} + description LOOPBACK +{% else %} + mtu 9214 + no switchport + no shutdown +{% endif %} +{% if name.startswith('Port-Channel') %} + port-channel min-links 1 +{% endif %} +{% if iface['ipv4'] is defined %} + ip address {{ iface['ipv4'] }} +{% endif %} +{% if iface['ipv6'] is defined %} + ipv6 enable + ipv6 address {{ iface['ipv6'] }} + ipv6 nd ra suppress +{% endif %} +{% if iface['lacp'] is defined %} + channel-group {{ iface['lacp'] }} mode active + lacp rate normal +{% endif %} + no shutdown +! +{% endfor %} +! +interface {{ bp_ifname }} + description backplane + no switchport + no shutdown +{% if host['bp_interface']['ipv4'] is defined %} + ip address {{ host['bp_interface']['ipv4'] }} +{% endif %} +{% if host['bp_interface']['ipv6'] is defined %} + ipv6 enable + ipv6 address {{ host['bp_interface']['ipv6'] }} + ipv6 nd ra suppress +{% endif %} + no shutdown +! +router bgp {{ host['bgp']['asn'] }} + router-id {{ host['interfaces']['Loopback0']['ipv4'] | ansible.utils.ipaddr('address') }} + ! + graceful-restart restart-time {{ bgp_gr_timer }} + graceful-restart + ! +{% for asn, remote_ips in host['bgp']['peers'].items() %} +{% for remote_ip in remote_ips %} + neighbor {{ remote_ip }} remote-as {{ asn }} + neighbor {{ remote_ip }} description {{ asn }} + neighbor {{ remote_ip }} next-hop-self +{% if remote_ip | ansible.utils.ipv6 %} + address-family ipv6 + neighbor {{ remote_ip }} activate + exit +{% endif %} +{% endfor %} +{% endfor %} + neighbor {{ props.nhipv4 }} remote-as {{ host['bgp']['asn'] }} + neighbor {{ props.nhipv4 }} description exabgp_v4 + neighbor {{ props.nhipv6 }} remote-as {{ host['bgp']['asn'] }} + neighbor {{ props.nhipv6 }} description exabgp_v6 + address-family ipv6 + neighbor {{ props.nhipv6 }} activate + exit + ! +{% for name, iface in host['interfaces'].items() if name.startswith('Loopback') %} +{% if iface['ipv4'] is defined %} + network {{ iface['ipv4'] }} +{% endif %} +{% if iface['ipv6'] is defined %} + network {{ iface['ipv6'] }} +{% endif %} +{% endfor %} +! +management api http-commands + no protocol https + protocol http + no shutdown +! +end diff --git a/ansible/templates/topo_t0.j2 b/ansible/templates/topo_t0.j2 new file mode 100644 index 00000000000..0393bc21563 --- /dev/null +++ b/ansible/templates/topo_t0.j2 @@ -0,0 +1,86 @@ +topology: + host_interfaces: +{%- for hostif in hostif_list %} + - {{ hostif.port_id }} +{%- endfor %} + disabled_host_interfaces: +{%- for hostif in disabled_hostif_list %} + - {{ hostif.port_id }} +{%- endfor %} +{%- if vm_list | length == 0 %} + VMs: {} +{%- else %} + VMs: +{%- for vm in vm_list %} + {{ vm.name }}: + vlans: + {%- for vlan in vm.vlans %} + - {{ vlan }} + {%- endfor %} + vm_offset: {{ vm.vm_offset }} +{%- endfor %} +{%- endif %} + DUT: + vlan_configs: + default_vlan_config: {{ vlan_group_list[0].name }} +{%- for vlan_group in vlan_group_list %} + {{ vlan_group.name }}: + {%- for vlan in vlan_group.vlans %} + Vlan{{ vlan.id }}: + id: {{ vlan.id }} + intfs: {{ vlan.port_ids }} + prefix: {{ vlan.v4_prefix }} + prefix_v6: {{ vlan.v6_prefix }} + tag: {{ vlan.id }} + {%- endfor %} +{%- endfor %} + +configuration_properties: + common: + dut_asn: {{ dut.asn }} + dut_type: ToRRouter + swrole: leaf + nhipv4: 10.10.246.254 + nhipv6: FC0A::FF + podset_number: 200 + tor_number: 16 + tor_subnet_number: 2 + max_tor_subnet_number: 16 + tor_subnet_size: 128 + spine_asn: 65534 + leaf_asn_start: 64600 + tor_asn_start: 65500 + failure_rate: 0 + +configuration: +{%- for vm in vm_list %} + {{vm.name}}: + properties: + - common + bgp: + asn: {{vm.asn}} + peers: + {{vm.peer_asn}}: + - {{vm.dut_intf_ipv4}} + - {{vm.dut_intf_ipv6}} + interfaces: + Loopback0: + ipv4: {{vm.loopback_ipv4}}/32 + ipv6: {{vm.loopback_ipv6}}/128 + {%- if vm.num_lags > 0 %} + {%- for i in range(1, vm.num_lags + 1) %} + Ethernet{{i}}: + lacp: 1 + {%- endfor %} + Port-Channel1: + ipv4: {{vm.pc_intf_ipv4}}/31 + ipv6: {{vm.pc_intf_ipv6}}/126 + {%- else %} + Ethernet1: + ipv4: {{vm.pc_intf_ipv4}}/31 + ipv6: {{vm.pc_intf_ipv6}}/126 + {%- endif %} + bp_interface: + ipv4: {{vm.bp_ipv4}}/24 + ipv6: {{vm.bp_ipv6}}/64 +{%- endfor %} diff --git a/ansible/templates/topo_t1.j2 b/ansible/templates/topo_t1.j2 new file mode 100644 index 00000000000..b5a2f66880b --- /dev/null +++ b/ansible/templates/topo_t1.j2 @@ -0,0 +1,65 @@ +topology: + VMs: +{%- for vm in vm_list %} + {{ vm.name }}: + vlans: + {%- for vlan_id in vm.vlans %} + - {{ vlan_id }} + {%- endfor %} + vm_offset: {{ vm.vm_offset }} +{%- endfor %} + +configuration_properties: + common: + dut_asn: {{ dut.asn }} + dut_type: LeafRouter + nhipv4: 10.10.246.254 + nhipv6: FC0A::FF + podset_number: 200 + tor_number: 16 + tor_subnet_number: 2 + max_tor_subnet_number: 16 + tor_subnet_size: 128 + spine: + swrole: spine + tor: + swrole: tor + +configuration: +{%- for vm in vm_list %} + {{vm.name}}: + properties: + - common + {%- if vm.role == 't0' %} + - tor + tornum: {{vm.tornum}} + {%- elif vm.role == 't2' %} + - spine + {%- endif %} + bgp: + asn: {{vm.asn}} + peers: + {{vm.peer_asn}}: + - {{vm.dut_intf_ipv4}} + - {{vm.dut_intf_ipv6}} + interfaces: + Loopback0: + ipv4: {{vm.loopback_ipv4}}/32 + ipv6: {{vm.loopback_ipv6}}/128 + {%- if vm.num_lags > 0 %} + {%- for idx in range(vm.vlans|length) %} + Ethernet{{idx+1}}: + lacp: 1 + {%- endfor %} + Port-Channel1: + ipv4: {{vm.pc_intf_ipv4}}/31 + ipv6: {{vm.pc_intf_ipv6}}/126 + {%- else %} + Ethernet1: + ipv4: {{vm.pc_intf_ipv4}}/31 + ipv6: {{vm.pc_intf_ipv6}}/126 + {%- endif %} + bp_interface: + ipv4: {{vm.bp_ipv4}}/22 + ipv6: {{vm.bp_ipv6}}/64 +{%- endfor %} diff --git a/ansible/vars/topo_t0-f2-d40u8.yml b/ansible/vars/topo_t0-f2-d40u8.yml new file mode 100644 index 00000000000..155c3988a57 --- /dev/null +++ b/ansible/vars/topo_t0-f2-d40u8.yml @@ -0,0 +1,423 @@ +topology: + host_interfaces: + - 32 + - 36 + - 60 + - 61 + - 64 + - 65 + - 68 + - 69 + - 72 + - 73 + - 76 + - 77 + - 80 + - 81 + - 84 + - 85 + - 88 + - 89 + - 92 + - 93 + - 96 + - 97 + - 100 + - 101 + - 104 + - 105 + - 108 + - 109 + - 112 + - 113 + - 116 + - 117 + - 120 + - 121 + - 124 + - 125 + - 128 + - 129 + - 144 + - 148 + disabled_host_interfaces: + - 33 + - 34 + - 35 + - 37 + - 38 + - 39 + - 40 + - 41 + - 42 + - 43 + - 44 + - 45 + - 46 + - 47 + - 48 + - 49 + - 50 + - 51 + - 52 + - 53 + - 54 + - 55 + - 56 + - 57 + - 58 + - 59 + - 62 + - 63 + - 66 + - 67 + - 70 + - 71 + - 74 + - 75 + - 78 + - 79 + - 82 + - 83 + - 86 + - 87 + - 90 + - 91 + - 94 + - 95 + - 98 + - 99 + - 102 + - 103 + - 106 + - 107 + - 110 + - 111 + - 114 + - 115 + - 118 + - 119 + - 122 + - 123 + - 126 + - 127 + - 130 + - 131 + - 132 + - 133 + - 134 + - 135 + - 136 + - 137 + - 138 + - 139 + - 140 + - 141 + - 142 + - 143 + - 145 + - 146 + - 147 + - 149 + - 150 + - 151 + - 152 + - 153 + - 154 + - 155 + - 156 + - 157 + - 158 + - 159 + VMs: + ARISTA01T1: + vlans: + - 0 + - 1 + vm_offset: 0 + ARISTA02T1: + vlans: + - 2 + - 3 + vm_offset: 1 + ARISTA03T1: + vlans: + - 4 + - 5 + vm_offset: 2 + ARISTA04T1: + vlans: + - 6 + - 7 + vm_offset: 3 + ARISTA05T1: + vlans: + - 16 + - 17 + vm_offset: 4 + ARISTA06T1: + vlans: + - 18 + - 19 + vm_offset: 5 + ARISTA07T1: + vlans: + - 20 + - 21 + vm_offset: 6 + ARISTA08T1: + vlans: + - 22 + - 23 + vm_offset: 7 + DUT: + vlan_configs: + default_vlan_config: one_vlan_a + one_vlan_a: + Vlan1000: + id: 1000 + intfs: [32, 36, 60, 61, 64, 65, 68, 69, 72, 73, 76, 77, 80, 81, 84, 85, 88, 89, 92, 93, 96, 97, 100, 101, 104, 105, 108, 109, 112, 113, 116, 117, 120, 121, 124, 125, 128, 129, 144, 148] + prefix: 192.168.0.1/21 + prefix_v6: fc02:1000::1/64 + tag: 1000 + two_vlan_a: + Vlan1000: + id: 1000 + intfs: [32, 36, 60, 61, 64, 65, 68, 69, 72, 73, 76, 77, 80, 81, 84, 85, 88, 89, 92, 93] + prefix: 192.168.0.1/22 + prefix_v6: fc02:100::1/64 + tag: 1000 + Vlan1100: + id: 1100 + intfs: [96, 97, 100, 101, 104, 105, 108, 109, 112, 113, 116, 117, 120, 121, 124, 125, 128, 129, 144, 148] + prefix: 192.168.4.1/22 + prefix_v6: fc02:101::1/64 + tag: 1100 + four_vlan_a: + Vlan1000: + id: 1000 + intfs: [32, 36, 60, 61, 64, 65, 68, 69, 72, 73] + prefix: 192.168.0.1/22 + prefix_v6: fc02:100::1/64 + tag: 1000 + Vlan1100: + id: 1100 + intfs: [76, 77, 80, 81, 84, 85, 88, 89, 92, 93] + prefix: 192.168.4.1/22 + prefix_v6: fc02:101::1/64 + tag: 1100 + Vlan1200: + id: 1200 + intfs: [96, 97, 100, 101, 104, 105, 108, 109, 112, 113] + prefix: 192.168.8.1/22 + prefix_v6: fc02:102::1/64 + tag: 1200 + Vlan1300: + id: 1300 + intfs: [116, 117, 120, 121, 124, 125, 128, 129, 144, 148] + prefix: 192.168.12.1/22 + prefix_v6: fc02:103::1/64 + tag: 1300 + +configuration_properties: + common: + dut_asn: 65100 + dut_type: ToRRouter + swrole: leaf + nhipv4: 10.10.246.254 + nhipv6: FC0A::FF + podset_number: 200 + tor_number: 16 + tor_subnet_number: 2 + max_tor_subnet_number: 16 + tor_subnet_size: 128 + spine_asn: 65534 + leaf_asn_start: 64600 + tor_asn_start: 65500 + failure_rate: 0 + +configuration: + ARISTA01T1: + properties: + - common + bgp: + asn: 64600 + peers: + 65100: + - 10.0.0.0 + - fc00::1 + interfaces: + Loopback0: + ipv4: 100.1.0.1/32 + ipv6: 2064:100:0:1::/128 + Ethernet1: + lacp: 1 + Ethernet2: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.1/31 + ipv6: fc00::2/126 + bp_interface: + ipv4: 10.10.246.2/24 + ipv6: fc0a::2/64 + ARISTA02T1: + properties: + - common + bgp: + asn: 64600 + peers: + 65100: + - 10.0.0.4 + - fc00::9 + interfaces: + Loopback0: + ipv4: 100.1.0.3/32 + ipv6: 2064:100:0:3::/128 + Ethernet1: + lacp: 1 + Ethernet2: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.5/31 + ipv6: fc00::a/126 + bp_interface: + ipv4: 10.10.246.4/24 + ipv6: fc0a::4/64 + ARISTA03T1: + properties: + - common + bgp: + asn: 64600 + peers: + 65100: + - 10.0.0.8 + - fc00::11 + interfaces: + Loopback0: + ipv4: 100.1.0.5/32 + ipv6: 2064:100:0:5::/128 + Ethernet1: + lacp: 1 + Ethernet2: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.9/31 + ipv6: fc00::12/126 + bp_interface: + ipv4: 10.10.246.6/24 + ipv6: fc0a::6/64 + ARISTA04T1: + properties: + - common + bgp: + asn: 64600 + peers: + 65100: + - 10.0.0.12 + - fc00::19 + interfaces: + Loopback0: + ipv4: 100.1.0.7/32 + ipv6: 2064:100:0:7::/128 + Ethernet1: + lacp: 1 + Ethernet2: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.13/31 + ipv6: fc00::1a/126 + bp_interface: + ipv4: 10.10.246.8/24 + ipv6: fc0a::8/64 + ARISTA05T1: + properties: + - common + bgp: + asn: 64600 + peers: + 65100: + - 10.0.0.32 + - fc00::41 + interfaces: + Loopback0: + ipv4: 100.1.0.17/32 + ipv6: 2064:100:0:11::/128 + Ethernet1: + lacp: 1 + Ethernet2: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.33/31 + ipv6: fc00::42/126 + bp_interface: + ipv4: 10.10.246.18/24 + ipv6: fc0a::12/64 + ARISTA06T1: + properties: + - common + bgp: + asn: 64600 + peers: + 65100: + - 10.0.0.36 + - fc00::49 + interfaces: + Loopback0: + ipv4: 100.1.0.19/32 + ipv6: 2064:100:0:13::/128 + Ethernet1: + lacp: 1 + Ethernet2: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.37/31 + ipv6: fc00::4a/126 + bp_interface: + ipv4: 10.10.246.20/24 + ipv6: fc0a::14/64 + ARISTA07T1: + properties: + - common + bgp: + asn: 64600 + peers: + 65100: + - 10.0.0.40 + - fc00::51 + interfaces: + Loopback0: + ipv4: 100.1.0.21/32 + ipv6: 2064:100:0:15::/128 + Ethernet1: + lacp: 1 + Ethernet2: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.41/31 + ipv6: fc00::52/126 + bp_interface: + ipv4: 10.10.246.22/24 + ipv6: fc0a::16/64 + ARISTA08T1: + properties: + - common + bgp: + asn: 64600 + peers: + 65100: + - 10.0.0.44 + - fc00::59 + interfaces: + Loopback0: + ipv4: 100.1.0.23/32 + ipv6: 2064:100:0:17::/128 + Ethernet1: + lacp: 1 + Ethernet2: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.45/31 + ipv6: fc00::5a/126 + bp_interface: + ipv4: 10.10.246.24/24 + ipv6: fc0a::18/64 diff --git a/ansible/vars/topo_t1-f2-d10u8.yml b/ansible/vars/topo_t1-f2-d10u8.yml new file mode 100644 index 00000000000..c369322d7be --- /dev/null +++ b/ansible/vars/topo_t1-f2-d10u8.yml @@ -0,0 +1,528 @@ +topology: + VMs: + ARISTA01T0: + vlans: + - 0 + - 1 + vm_offset: 0 + ARISTA02T0: + vlans: + - 2 + - 3 + vm_offset: 1 + ARISTA03T0: + vlans: + - 4 + - 5 + vm_offset: 2 + ARISTA04T0: + vlans: + - 6 + - 7 + vm_offset: 3 + ARISTA05T0: + vlans: + - 8 + - 9 + vm_offset: 4 + ARISTA06T0: + vlans: + - 16 + - 17 + vm_offset: 5 + ARISTA07T0: + vlans: + - 18 + - 19 + vm_offset: 6 + ARISTA08T0: + vlans: + - 20 + - 21 + vm_offset: 7 + ARISTA09T0: + vlans: + - 22 + - 23 + vm_offset: 8 + ARISTA10T0: + vlans: + - 24 + - 25 + vm_offset: 9 + ARISTA01T2: + vlans: + - 56 + vm_offset: 10 + ARISTA02T2: + vlans: + - 58 + vm_offset: 11 + ARISTA03T2: + vlans: + - 60 + vm_offset: 12 + ARISTA04T2: + vlans: + - 62 + vm_offset: 13 + ARISTA05T2: + vlans: + - 64 + vm_offset: 14 + ARISTA06T2: + vlans: + - 66 + vm_offset: 15 + ARISTA07T2: + vlans: + - 68 + vm_offset: 16 + ARISTA08T2: + vlans: + - 70 + vm_offset: 17 + +configuration_properties: + common: + dut_asn: 65100 + dut_type: LeafRouter + nhipv4: 10.10.246.254 + nhipv6: FC0A::FF + podset_number: 200 + tor_number: 16 + tor_subnet_number: 2 + max_tor_subnet_number: 16 + tor_subnet_size: 128 + spine: + swrole: spine + tor: + swrole: tor + +configuration: + ARISTA01T0: + properties: + - common + - tor + tornum: 1 + bgp: + asn: 64001 + peers: + 65100: + - 10.0.0.0 + - fc00::1 + interfaces: + Loopback0: + ipv4: 100.1.0.1/32 + ipv6: 2064:100:0:1::/128 + Ethernet1: + lacp: 1 + Ethernet2: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.1/31 + ipv6: fc00::2/126 + bp_interface: + ipv4: 10.10.246.2/22 + ipv6: fc0a::2/64 + ARISTA02T0: + properties: + - common + - tor + tornum: 2 + bgp: + asn: 64002 + peers: + 65100: + - 10.0.0.4 + - fc00::9 + interfaces: + Loopback0: + ipv4: 100.1.0.3/32 + ipv6: 2064:100:0:3::/128 + Ethernet1: + lacp: 1 + Ethernet2: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.5/31 + ipv6: fc00::a/126 + bp_interface: + ipv4: 10.10.246.4/22 + ipv6: fc0a::4/64 + ARISTA03T0: + properties: + - common + - tor + tornum: 3 + bgp: + asn: 64003 + peers: + 65100: + - 10.0.0.8 + - fc00::11 + interfaces: + Loopback0: + ipv4: 100.1.0.5/32 + ipv6: 2064:100:0:5::/128 + Ethernet1: + lacp: 1 + Ethernet2: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.9/31 + ipv6: fc00::12/126 + bp_interface: + ipv4: 10.10.246.6/22 + ipv6: fc0a::6/64 + ARISTA04T0: + properties: + - common + - tor + tornum: 4 + bgp: + asn: 64004 + peers: + 65100: + - 10.0.0.12 + - fc00::19 + interfaces: + Loopback0: + ipv4: 100.1.0.7/32 + ipv6: 2064:100:0:7::/128 + Ethernet1: + lacp: 1 + Ethernet2: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.13/31 + ipv6: fc00::1a/126 + bp_interface: + ipv4: 10.10.246.8/22 + ipv6: fc0a::8/64 + ARISTA05T0: + properties: + - common + - tor + tornum: 5 + bgp: + asn: 64005 + peers: + 65100: + - 10.0.0.16 + - fc00::21 + interfaces: + Loopback0: + ipv4: 100.1.0.9/32 + ipv6: 2064:100:0:9::/128 + Ethernet1: + lacp: 1 + Ethernet2: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.17/31 + ipv6: fc00::22/126 + bp_interface: + ipv4: 10.10.246.10/22 + ipv6: fc0a::a/64 + ARISTA06T0: + properties: + - common + - tor + tornum: 6 + bgp: + asn: 64006 + peers: + 65100: + - 10.0.0.32 + - fc00::41 + interfaces: + Loopback0: + ipv4: 100.1.0.17/32 + ipv6: 2064:100:0:11::/128 + Ethernet1: + lacp: 1 + Ethernet2: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.33/31 + ipv6: fc00::42/126 + bp_interface: + ipv4: 10.10.246.18/22 + ipv6: fc0a::12/64 + ARISTA07T0: + properties: + - common + - tor + tornum: 7 + bgp: + asn: 64007 + peers: + 65100: + - 10.0.0.36 + - fc00::49 + interfaces: + Loopback0: + ipv4: 100.1.0.19/32 + ipv6: 2064:100:0:13::/128 + Ethernet1: + lacp: 1 + Ethernet2: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.37/31 + ipv6: fc00::4a/126 + bp_interface: + ipv4: 10.10.246.20/22 + ipv6: fc0a::14/64 + ARISTA08T0: + properties: + - common + - tor + tornum: 8 + bgp: + asn: 64008 + peers: + 65100: + - 10.0.0.40 + - fc00::51 + interfaces: + Loopback0: + ipv4: 100.1.0.21/32 + ipv6: 2064:100:0:15::/128 + Ethernet1: + lacp: 1 + Ethernet2: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.41/31 + ipv6: fc00::52/126 + bp_interface: + ipv4: 10.10.246.22/22 + ipv6: fc0a::16/64 + ARISTA09T0: + properties: + - common + - tor + tornum: 9 + bgp: + asn: 64009 + peers: + 65100: + - 10.0.0.44 + - fc00::59 + interfaces: + Loopback0: + ipv4: 100.1.0.23/32 + ipv6: 2064:100:0:17::/128 + Ethernet1: + lacp: 1 + Ethernet2: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.45/31 + ipv6: fc00::5a/126 + bp_interface: + ipv4: 10.10.246.24/22 + ipv6: fc0a::18/64 + ARISTA10T0: + properties: + - common + - tor + tornum: 10 + bgp: + asn: 64010 + peers: + 65100: + - 10.0.0.48 + - fc00::61 + interfaces: + Loopback0: + ipv4: 100.1.0.25/32 + ipv6: 2064:100:0:19::/128 + Ethernet1: + lacp: 1 + Ethernet2: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.49/31 + ipv6: fc00::62/126 + bp_interface: + ipv4: 10.10.246.26/22 + ipv6: fc0a::1a/64 + ARISTA01T2: + properties: + - common + - spine + bgp: + asn: 65200 + peers: + 65100: + - 10.0.0.112 + - fc00::e1 + interfaces: + Loopback0: + ipv4: 100.1.0.57/32 + ipv6: 2064:100:0:39::/128 + Ethernet1: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.113/31 + ipv6: fc00::e2/126 + bp_interface: + ipv4: 10.10.246.58/22 + ipv6: fc0a::3a/64 + ARISTA02T2: + properties: + - common + - spine + bgp: + asn: 65200 + peers: + 65100: + - 10.0.0.116 + - fc00::e9 + interfaces: + Loopback0: + ipv4: 100.1.0.59/32 + ipv6: 2064:100:0:3b::/128 + Ethernet1: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.117/31 + ipv6: fc00::ea/126 + bp_interface: + ipv4: 10.10.246.60/22 + ipv6: fc0a::3c/64 + ARISTA03T2: + properties: + - common + - spine + bgp: + asn: 65200 + peers: + 65100: + - 10.0.0.120 + - fc00::f1 + interfaces: + Loopback0: + ipv4: 100.1.0.61/32 + ipv6: 2064:100:0:3d::/128 + Ethernet1: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.121/31 + ipv6: fc00::f2/126 + bp_interface: + ipv4: 10.10.246.62/22 + ipv6: fc0a::3e/64 + ARISTA04T2: + properties: + - common + - spine + bgp: + asn: 65200 + peers: + 65100: + - 10.0.0.124 + - fc00::f9 + interfaces: + Loopback0: + ipv4: 100.1.0.63/32 + ipv6: 2064:100:0:3f::/128 + Ethernet1: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.125/31 + ipv6: fc00::fa/126 + bp_interface: + ipv4: 10.10.246.64/22 + ipv6: fc0a::40/64 + ARISTA05T2: + properties: + - common + - spine + bgp: + asn: 65200 + peers: + 65100: + - 10.0.0.128 + - fc00::101 + interfaces: + Loopback0: + ipv4: 100.1.0.65/32 + ipv6: 2064:100:0:41::/128 + Ethernet1: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.129/31 + ipv6: fc00::102/126 + bp_interface: + ipv4: 10.10.246.66/22 + ipv6: fc0a::42/64 + ARISTA06T2: + properties: + - common + - spine + bgp: + asn: 65200 + peers: + 65100: + - 10.0.0.132 + - fc00::109 + interfaces: + Loopback0: + ipv4: 100.1.0.67/32 + ipv6: 2064:100:0:43::/128 + Ethernet1: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.133/31 + ipv6: fc00::10a/126 + bp_interface: + ipv4: 10.10.246.68/22 + ipv6: fc0a::44/64 + ARISTA07T2: + properties: + - common + - spine + bgp: + asn: 65200 + peers: + 65100: + - 10.0.0.136 + - fc00::111 + interfaces: + Loopback0: + ipv4: 100.1.0.69/32 + ipv6: 2064:100:0:45::/128 + Ethernet1: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.137/31 + ipv6: fc00::112/126 + bp_interface: + ipv4: 10.10.246.70/22 + ipv6: fc0a::46/64 + ARISTA08T2: + properties: + - common + - spine + bgp: + asn: 65200 + peers: + 65100: + - 10.0.0.140 + - fc00::119 + interfaces: + Loopback0: + ipv4: 100.1.0.71/32 + ipv6: 2064:100:0:47::/128 + Ethernet1: + lacp: 1 + Port-Channel1: + ipv4: 10.0.0.141/31 + ipv6: fc00::11a/126 + bp_interface: + ipv4: 10.10.246.72/22 + ipv6: fc0a::48/64 diff --git a/ansible/veos b/ansible/veos index 071008d928d..6bd9f25775e 100644 --- a/ansible/veos +++ b/ansible/veos @@ -22,6 +22,7 @@ all: - t1-64-lag - t1-64-lag-clet - t1-backend + - t1-f2-d10u8 - t1-isolated-d128 - t1-isolated-d28u1 - t1-isolated-d224u8 @@ -49,6 +50,7 @@ all: - t0-116 - t0-118 - t0-backend + - t0-f2-d40u8 - t0-standalone-32 - t0-standalone-64 - t0-standalone-128