From 503680d5b20ab1be0e72d8eeec27edd3323bc06d Mon Sep 17 00:00:00 2001 From: Joshua Boniface Date: Wed, 3 Oct 2018 19:23:46 -0400 Subject: [PATCH] Add better handling of listing leases and handling static reservations --- cli-client/pvc.py | 69 ++++++++++++++++++++--------- client-common/client_lib/network.py | 54 ++++++++++------------ 2 files changed, 71 insertions(+), 52 deletions(-) diff --git a/cli-client/pvc.py b/cli-client/pvc.py index a657f4c4..1cba0019 100755 --- a/cli-client/pvc.py +++ b/cli-client/pvc.py @@ -740,11 +740,39 @@ def net_dhcp(): """ pass +############################################################################### +# pvc network dhcp list +############################################################################### +@click.command(name='list', short_help='List active DHCP leases.') +@click.argument( + 'net' +) +@click.argument( + 'limit', default=None, required=False +) +def net_dhcp_list(net, limit): + """ + List all DHCP leases in virtual network NET; optionally only match elements matching regex LIMIT; NET can be either a VNI or description. + """ + + zk_conn = pvc_common.startZKConnection(zk_host) + retcode, retmsg = pvc_network.get_list_dhcp(zk_conn, net, limit, only_static=False) + cleanup(retcode, retmsg, zk_conn) ############################################################################### -# pvc network dhcp add +# pvc network dhcp static ############################################################################### -@click.command(name='add', short_help='Add a static DHCP lease to a virtual network.') +@click.group(name='static', short_help='Manage DHCP static reservations in a PVC virtual network.', context_settings=CONTEXT_SETTINGS) +def net_dhcp_static(): + """ + Manage host DHCP static reservations of a VXLAN network in the PVC cluster. + """ + pass + +############################################################################### +# pvc network dhcp static add +############################################################################### +@click.command(name='add', short_help='Add a DHCP static reservation.') @click.argument( 'net' ) @@ -757,9 +785,9 @@ def net_dhcp(): @click.argument( 'macaddr' ) -def net_dhcp_add(net, ipaddr, macaddr, hostname): +def net_dhcp_static_add(net, ipaddr, macaddr, hostname): """ - Add a new static DHCP lease of IP address IPADDR with hostname HOSTNAME for MAC address MACADDR to virtual network NET; NET can be either a VNI or description. + Add a new DHCP static reservation of IP address IPADDR with hostname HOSTNAME for MAC address MACADDR to virtual network NET; NET can be either a VNI or description. """ zk_conn = pvc_common.startZKConnection(zk_host) @@ -767,45 +795,41 @@ def net_dhcp_add(net, ipaddr, macaddr, hostname): cleanup(retcode, retmsg, zk_conn) ############################################################################### -# pvc network dhcp remove +# pvc network dhcp static remove ############################################################################### -@click.command(name='remove', short_help='Remove a DHCP lease from a virtual network.') +@click.command(name='remove', short_help='Remove a DHCP static reservation.') @click.argument( 'net' ) @click.argument( - 'lease' + 'reservation' ) -def net_dhcp_remove(net, lease): +def net_dhcp_static_remove(net, reservation): """ - Remove a DHCP lease LEASE from virtual network NET; LEASE can be either a MAC address, an IP address, or a hostname; NET can be either a VNI or description. + Remove a DHCP static reservation RESERVATION from virtual network NET; RESERVATION can be either a MAC address, an IP address, or a hostname; NET can be either a VNI or description. """ zk_conn = pvc_common.startZKConnection(zk_host) - retcode, retmsg = pvc_network.remove_dhcp_lease(zk_conn, net, lease) + retcode, retmsg = pvc_network.remove_dhcp_reservation(zk_conn, net, reservation) cleanup(retcode, retmsg, zk_conn) ############################################################################### -# pvc network dhcp list +# pvc network dhcp static list ############################################################################### -@click.command(name='list', short_help='List DHCP lease objects.') -@click.option( - '-s', '--static', 'only_static', is_flag=True, default=False, - help='Show only static leases.' -) +@click.command(name='list', short_help='List DHCP static reservations.') @click.argument( 'net' ) @click.argument( 'limit', default=None, required=False ) -def net_dhcp_list(net, limit, only_static): +def net_dhcp_static_list(net, limit): """ - List all DHCP leases in virtual network NET; optionally only match elements matching regex LIMIT; NET can be either a VNI or description. + List all DHCP static reservations in virtual network NET; optionally only match elements matching regex LIMIT; NET can be either a VNI or description. """ zk_conn = pvc_common.startZKConnection(zk_host) - retcode, retmsg = pvc_network.get_list_dhcp_leases(zk_conn, net, limit, only_static=only_static) + retcode, retmsg = pvc_network.get_list_dhcp(zk_conn, net, limit, only_static=True) cleanup(retcode, retmsg, zk_conn) ############################################################################### @@ -918,9 +942,12 @@ cli_network.add_command(net_list) cli_network.add_command(net_dhcp) cli_network.add_command(net_acl) -net_dhcp.add_command(net_dhcp_add) -net_dhcp.add_command(net_dhcp_remove) net_dhcp.add_command(net_dhcp_list) +net_dhcp.add_command(net_dhcp_static) + +net_dhcp_static.add_command(net_dhcp_static_add) +net_dhcp_static.add_command(net_dhcp_static_remove) +net_dhcp_static.add_command(net_dhcp_static_list) cli.add_command(cli_node) cli.add_command(cli_router) diff --git a/client-common/client_lib/network.py b/client-common/client_lib/network.py index cd56dd55..5f8aecf5 100644 --- a/client-common/client_lib/network.py +++ b/client-common/client_lib/network.py @@ -106,13 +106,8 @@ def getNetworkDHCPLeases(zk_conn, vni): return sorted(dhcp_leases) def getNetworkDHCPReservations(zk_conn, vni): - # Get a list of VNIs by listing the children of /networks//dhcp_leases - dhcp_reservations = [] - dhcp_leases = getNetworkDHCPLeases(zk_conn, vni) - for lease in dhcp_leases: - timestamp = zkhandler.readdata(zk_conn, '/networks/{}/dhcp_leases/{}'.format (vni, lease)) - if timestamp == 'static': - dhcp_reservations.append(lease) + # Get a list of DHCP reservations by listing the children of /networks//dhcp_reservations + dhcp_reservations = zk_conn.get_children('/networks/{}/dhcp_reservations'.format(vni)) return sorted(dhcp_reservations) def getNetworkFirewallRules(zk_conn, vni): @@ -132,7 +127,10 @@ def getNetworkInformation(zk_conn, vni): def getDHCPLeaseInformation(zk_conn, vni, mac_address): hostname = zkhandler.readdata(zk_conn, '/networks/{}/dhcp_leases/{}/hostname'.format(vni, mac_address)) ip_address = zkhandler.readdata(zk_conn, '/networks/{}/dhcp_leases/{}/ipaddr'.format(vni, mac_address)) - timestamp = zkhandler.readdata(zk_conn, '/networks/{}/dhcp_leases/{}'.format(vni, mac_address)) + try: + timestamp = zkhandler.readdata(zk_conn, '/networks/{}/dhcp_leases/{}/expiry'.format(vni, mac_address)) + except: + timestamp = 'static' return hostname, ip_address, mac_address, timestamp def formatNetworkInformation(zk_conn, vni, long_output): @@ -423,6 +421,7 @@ def add_network(zk_conn, vni, description, domain, ip_network, ip_gateway, dhcp_ '/networks/{}/dhcp_start'.format(vni): dhcp_start, '/networks/{}/dhcp_end'.format(vni): dhcp_end, '/networks/{}/dhcp_leases'.format(vni): '', + '/networks/{}/dhcp_reservations'.format(vni): '', '/networks/{}/firewall_rules'.format(vni): '' }) @@ -558,14 +557,18 @@ def get_list(zk_conn, limit): return True, '' -def get_list_dhcp_leases(zk_conn, network, limit, only_static=False): +def get_list_dhcp(zk_conn, network, limit, only_static=False): # Validate and obtain alternate passed value net_vni = getNetworkVNI(zk_conn, network) if net_vni == None: return False, 'ERROR: Could not find network "{}" in the cluster!'.format(network) - dhcp_leases_list = [] - full_dhcp_leases_list = getNetworkDHCPLeases(zk_conn, net_vni) + dhcp_list = [] + + if only_static: + full_dhcp_list = getNetworkDHCPReservations(zk_conn, net_vni) + else: + full_dhcp_list = getNetworkDHCPLeases(zk_conn, net_vni) if limit: try: @@ -578,31 +581,20 @@ def get_list_dhcp_leases(zk_conn, network, limit, only_static=False): return False, 'Regex Error: {}'.format(e) - for lease in full_dhcp_leases_list: + for lease in full_dhcp_list: valid_lease = False - if only_static: - lease_timestamp = zkhandler.readdata(zk_conn, '/networks/{}/dhcp_leases/{}'.format(net_vni, lease)) - if lease_timestamp == 'static': - if limit: - if re.match(limit, lease) != None: - valid_lease = True - if re.match(limit, lease) != None: - valid_lease = True - else: - valid_lease = True - else: - if limit: - if re.match(limit, lease) != None: - valid_lease = True - if re.match(limit, lease) != None: - valid_lease = True - else: + if limit: + if re.match(limit, lease) != None: valid_lease = True + if re.match(limit, lease) != None: + valid_lease = True + else: + valid_lease = True if valid_lease: - dhcp_leases_list.append(lease) + dhcp_list.append(lease) - output_string = formatDHCPLeaseList(zk_conn, net_vni, dhcp_leases_list) + output_string = formatDHCPLeaseList(zk_conn, net_vni, dhcp_list) click.echo(output_string) return True, ''