def node_remove(remove_endpoints, host): """ Remove a node from the Calico network. :param remove_endpoints: Whether the endpoint data should be forcibly removed. :param host: The hostname of the host whose node will be removed, or None if removing this host's node. :return: None. """ host_to_remove = host or hostname if host_to_remove == hostname and ( _container_running("calico-node") or _container_running("calico-libnetwork")): print_paragraph("The node cannot be removed while it is running. " "Please run 'calicoctl node stop' to stop the node " "before removing it.") sys.exit(1) endpoints = client.get_endpoints(hostname=host_to_remove) if endpoints and not remove_endpoints: print_paragraph("The node has active Calico endpoints so can't be " "deleted. Force with --remove-endpoints") print_paragraph("Note that forcible removing the node may leave some " "workloads in an indeterminate networked state. If " "this is in error, you may restart the node using the " "'calicoctl node' command and clean up the workloads " "in the normal way.") sys.exit(1) # Remove the veths, and release all IPs associated with the endpoints. To # release the IPs, we construct a set of all IP addresses across all # endpoints (this assumes the endpoint nets are all single IPs). ips = set() for endpoint in endpoints: remove_veth(endpoint.name) ips |= {net.ip for net in endpoint.ipv4_nets} ips |= {net.ip for net in endpoint.ipv6_nets} client.release_ips(ips) # Remove the IPAM host data. client.remove_ipam_host(host_to_remove) # If the host had an IPIP tunnel address, release it back to the IPAM pool # so that we don't leak it when we delete the config. raw_addr = client.get_per_host_config(host_to_remove, "IpInIpTunnelAddr") try: ip_addr = IPAddress(raw_addr) client.release_ips({ip_addr}) except (AddrFormatError, ValueError, TypeError): pass client.remove_per_host_config(host_to_remove, "IpInIpTunnelAddr") client.remove_host(host_to_remove) print "Node configuration removed"
def node_remove(remove_endpoints, host): """ Remove a node from the Calico network. :param remove_endpoints: Whether the endpoint data should be forcibly removed. :param host: The hostname of the host whose node will be removed, or None if removing this host's node. :return: None. """ host_to_remove = host or hostname if host_to_remove == hostname and (_container_running("calico-node") or _container_running("calico-libnetwork")): print_paragraph("The node cannot be removed while it is running. " "Please run 'calicoctl node stop' to stop the node " "before removing it.") sys.exit(1) endpoints = client.get_endpoints(hostname=host_to_remove) if endpoints and not remove_endpoints: print_paragraph("The node has active Calico endpoints so can't be " "deleted. Force with --remove-endpoints") print_paragraph("Note that forcible removing the node may leave some " "workloads in an indeterminate networked state. If " "this is in error, you may restart the node using the " "'calicoctl node' command and clean up the workloads " "in the normal way.") sys.exit(1) # Remove the veths, and release all IPs associated with the endpoints. To # release the IPs, we construct a set of all IP addresses across all # endpoints (this assumes the endpoint nets are all single IPs). ips = set() for endpoint in endpoints: remove_veth(endpoint.name) ips |= {net.ip for net in endpoint.ipv4_nets} ips |= {net.ip for net in endpoint.ipv6_nets} client.release_ips(ips) # Remove the IPAM host data. client.remove_ipam_host(host_to_remove) # If the host had an IPIP tunnel address, release it back to the IPAM pool # so that we don't leak it when we delete the config. raw_addr = client.get_per_host_config(host_to_remove, "IpInIpTunnelAddr") try: ip_addr = IPAddress(raw_addr) client.release_ips({ip_addr}) except (AddrFormatError, ValueError, TypeError): pass client.remove_per_host_config(host_to_remove, "IpInIpTunnelAddr") client.remove_host(host_to_remove) print "Node configuration removed"