1. Write the Python object "switches" to YAML format 2. Transform "switches" so that it contains only "cisco" switches 3. Use the standard ipaddress module to get the last host address in the network "172.16.0.0/28" 4. Parse "dhcp_snooping_table" into a list of dictionaries of the form: dhcp_snooping_table_parsed = [ { "mac": "00:E9:BC:3F:A6:50", "ip": "100.1.1.6", "interface": "FastEthernet0/20", }, { "mac": "00:E9:22:11:A6:50", "ip": "100.1.1.7", "interface": "FastEthernet0/21", } ] 5. Write a class "NetworkSubnet" that has 2 methods: - get_subnet - returns the first available subnet of the specified length as an IPv4Network object - show_network_pool - returns a list of available subnets ```python from ipaddress import IPv4Network class NetworkSubnet: def __init__(self, aggregate_network: str): ... def get_subnet(self, length: int) -> IPv4Network: ... def show_network_pool(self) -> list[IPv4Network]: ... net = NetworkSubnet(aggregate_network="172.16.0.0/24") net_1 = net.get_subnet(length=26) print(f"{net_1=}") net_1=IPv4Network('172.16.0.0/26') print(net.get_subnet(length=25)) 172.16.0.128/25 print(net.get_subnet(length=30)) 172.16.0.64/30 print(net.show_network_pool()) [IPv4Network('172.16.0.64/30'), IPv4Network('172.16.0.72/29'), IPv4Network('172.16.0.80/28'), IPv4Network('172.16.0.96/27')] ```
sobes.tech AI
Answer from AI
python import yaml from ipaddress import ip_network, IPv4Network
1. Write Python object "switches" to YAML
switches = [ {"vendor": "cisco", "model": "2960"}, {"vendor": "juniper", "model": "ex2200"}, {"vendor": "cisco", "model": "3750"}, ]
with open("switches.yaml", "w") as f: yaml.dump(switches, f)
2. Keep only cisco switches
cisco_switches = [sw for sw in switches if sw["vendor"] == "cisco"]
3. Get the last host address in the network 172.16.0.0/28
network = ip_network("172.16.0.0/28") last_host = list(network.hosts())[-1]
4. Parse dhcp_snooping_table
dhcp_snooping_table = """ 00:E9:BC:3F:A6:50 100.1.1.6 FastEthernet0/20 00:E9:22:11:A6:50 100.1.1.7 FastEthernet0/21 """
dhcp_snooping_table_parsed = [] for line in dhcp_snooping_table.strip().splitlines(): mac, ip, interface = line.split() dhcp_snooping_table_parsed.append({"mac": mac, "ip": ip, "interface": interface})
5. NetworkSubnet class
class NetworkSubnet: def init(self, aggregate_network: str): self.aggregate = ip_network(aggregate_network) self.available_subnets = [self.aggregate]
def get_subnet(self, length: int) -> IPv4Network:
for i, subnet in enumerate(self.available_subnets):
if subnet.prefixlen <= length:
# Split the subnet into smaller ones
subnets = list(subnet.subnets(new_prefix=length))
# Take the first subnet
chosen = subnets[0]
# Update the pool of available subnets
self.available_subnets.pop(i)
self.available_subnets.extend(subnets[1:])
self.available_subnets.sort(key=lambda x: int(x.network_address))
return chosen
raise ValueError("No available subnets of the required length")
def show_network_pool(self) -> list[IPv4Network]:
return self.available_subnets
Example usage
net = NetworkSubnet(aggregate_network="172.16.0.0/24") net_1 = net.get_subnet(length=26) print(f"{net_1=}") # 172.16.0.0/26 print(net.get_subnet(length=25)) # 172.16.0.64/25 print(net.get_subnet(length=30)) # 172.16.0.192/30 print(net.show_network_pool()) # Remaining subnets