|
| 1 | + |
| 2 | +from box import Box |
| 3 | + |
| 4 | +from netsim.augment import links |
| 5 | +from netsim.data import get_new_box |
| 6 | + |
| 7 | +_config_name = 'kind' |
| 8 | +_execute_after = ['node.clone', 'fabric'] |
| 9 | + |
| 10 | +def setup_kind_cluster(node: Box, topology: Box) -> None: |
| 11 | + k_workers = node.get('kind.workers',0) |
| 12 | + node.clab['startup-config'] = f'node_files/{node.name}/initial' |
| 13 | + kind_name = node.name |
| 14 | + k_nodes = [f'{kind_name}-control-plane'] |
| 15 | + if k_workers > 0: |
| 16 | + k_nodes.append(f'{kind_name}-worker') |
| 17 | + for extra_worker in range(2,k_workers + 1): |
| 18 | + k_nodes.append(f'{kind_name}-worker{extra_worker}') |
| 19 | + |
| 20 | + for kn_name in k_nodes: |
| 21 | + kn_data = topology.nodes[kn_name] |
| 22 | + kn_data.device = 'kind-node' |
| 23 | + kn_data.name = kn_name |
| 24 | + kn_data.interfaces = [] |
| 25 | + kn_data.clab.kind = "ext-container" |
| 26 | + kn_data.clab.name = kn_name |
| 27 | + for attr in ('provider','routing','box'): |
| 28 | + if attr in node: |
| 29 | + kn_data[attr] = node[attr] |
| 30 | + |
| 31 | + link_index = 0 |
| 32 | + while link_index < len(topology.links): |
| 33 | + l_data = topology.links[link_index] |
| 34 | + iflist = l_data.interfaces |
| 35 | + kind_ifidx = -1 |
| 36 | + for (if_idx,if_data) in enumerate(iflist): |
| 37 | + if if_data.node == kind_name: |
| 38 | + kind_ifidx = if_idx |
| 39 | + break |
| 40 | + |
| 41 | + if kind_ifidx < 0: |
| 42 | + link_index += 1 |
| 43 | + continue |
| 44 | + |
| 45 | + if len(iflist) != 2 or l_data.get('type') in ['lan','stub']: |
| 46 | + for kn_name in k_nodes: |
| 47 | + iflist.append(iflist[kind_ifidx] + {'node': kn_name}) |
| 48 | + iflist.pop(kind_ifidx) |
| 49 | + else: |
| 50 | + topology.links.pop(link_index) |
| 51 | + for (kn_idx,kn_name) in enumerate(k_nodes): |
| 52 | + kn_link = get_new_box(l_data) |
| 53 | + kn_link.interfaces[kind_ifidx].node = kn_name |
| 54 | + kn_link._linkname = l_data._linkname + f'[{kn_idx + 1}]' |
| 55 | + kn_link.linkindex = links.get_next_linkindex(topology) |
| 56 | + topology.links.append(kn_link) |
| 57 | + link_index += 1 |
| 58 | + |
| 59 | +""" |
| 60 | +topology_expand - expand nodes with a 'kind' attribute into KinD clusters |
| 61 | +""" |
| 62 | +def pre_node_transform(topology: Box) -> None: |
| 63 | + for node in list(topology.nodes.values()): |
| 64 | + if node.device != 'kind': |
| 65 | + continue |
| 66 | + setup_kind_cluster(node,topology) |
0 commit comments