def container_ip_remove(container_name, ip, interface): """ Add an IP address to an existing Calico networked container. :param container_name: The name of the container. :param ip: The IP to add :param interface: The name of the interface in the container. :return: None """ address = IPAddress(ip) # The netns manipulations must be done as root. enforce_root() pool = get_pool_or_exit(address) info = get_container_info_or_exit(container_name) container_id = info["Id"] # Check the container is actually running. if not info["State"]["Running"]: print "%s is not currently running." % container_name sys.exit(1) # Check that the container is already networked try: endpoint = client.get_endpoint(hostname=hostname, orchestrator_id=ORCHESTRATOR_ID, workload_id=container_id) if address.version == 4: nets = endpoint.ipv4_nets else: nets = endpoint.ipv6_nets if not IPNetwork(address) in nets: print "IP address is not assigned to container. Aborting." sys.exit(1) except KeyError: print "Container is unknown to Calico." sys.exit(1) try: nets.remove(IPNetwork(address)) client.update_endpoint(endpoint) except (KeyError, ValueError): print "Error updating datastore. Aborting." sys.exit(1) try: container_pid = info["State"]["Pid"] netns.remove_ip_from_ns_veth(container_pid, address, interface) except CalledProcessError: print "Error updating networking in container. Aborting." sys.exit(1) client.unassign_address(pool, ip) print "IP %s removed from %s" % (ip, container_name)
def container_ip_remove(container_id, ip, interface): """ Add an IP address to an existing Calico networked container. :param container_id: The namespace path or container_id of the container. :param ip: The IP to add :param interface: The name of the interface in the container. :return: None """ address = IPAddress(ip) # The netns manipulations must be done as root. enforce_root() pool = get_pool_or_exit(address) if container_id.startswith("/") and os.path.exists(container_id): # The ID is a path. Don't do any docker lookups workload_id = escape_etcd(container_id) namespace = netns.Namespace(container_id) orchestrator_id = NAMESPACE_ORCHESTRATOR_ID else: info = get_container_info_or_exit(container_id) workload_id = info["Id"] namespace = netns.PidNamespace(info["State"]["Pid"]) orchestrator_id = DOCKER_ORCHESTRATOR_ID # Check the container is actually running. if not info["State"]["Running"]: print "%s is not currently running." % container_id sys.exit(1) # Check that the container is already networked try: endpoint = client.get_endpoint(hostname=hostname, orchestrator_id=orchestrator_id, workload_id=workload_id) if address.version == 4: nets = endpoint.ipv4_nets else: nets = endpoint.ipv6_nets if not IPNetwork(address) in nets: print "IP address is not assigned to container. Aborting." sys.exit(1) except KeyError: print "Container is unknown to Calico." sys.exit(1) try: nets.remove(IPNetwork(address)) client.update_endpoint(endpoint) except (KeyError, ValueError): print "Error updating datastore. Aborting." sys.exit(1) try: netns.remove_ip_from_ns_veth(namespace, address, interface) except CalledProcessError: print "Error updating networking in container. Aborting." sys.exit(1) client.release_ips({address}) print "IP %s removed from %s" % (ip, container_id)
def container_ip_remove(container_id, ip, interface): """ Add an IP address to an existing Calico networked container. :param container_id: The namespace path or container_id of the container. :param ip: The IP to add :param interface: The name of the interface in the container. :return: None """ address = IPAddress(ip) # The netns manipulations must be done as root. enforce_root() pool = get_pool_or_exit(address) if container_id.startswith("/") and os.path.exists(container_id): # The ID is a path. Don't do any docker lookups workload_id = escape_etcd(container_id) namespace = netns.Namespace(container_id) orchestrator_id = NAMESPACE_ORCHESTRATOR_ID else: info = get_container_info_or_exit(container_id) workload_id = info["Id"] namespace = netns.PidNamespace(info["State"]["Pid"]) orchestrator_id = DOCKER_ORCHESTRATOR_ID # Check the container is actually running. if not info["State"]["Running"]: print "%s is not currently running." % container_id sys.exit(1) # Check that the container is already networked try: endpoint = client.get_endpoint(hostname=hostname, orchestrator_id=orchestrator_id, workload_id=workload_id) if address.version == 4: nets = endpoint.ipv4_nets else: nets = endpoint.ipv6_nets if not IPNetwork(address) in nets: print "IP address is not assigned to container. Aborting." sys.exit(1) except KeyError: print "Container is unknown to Calico." sys.exit(1) try: nets.remove(IPNetwork(address)) client.update_endpoint(endpoint) except (KeyError, ValueError): print "Error updating datastore. Aborting." sys.exit(1) try: netns.remove_ip_from_ns_veth(namespace, address, interface) except CalledProcessError: print "Error updating networking in container. Aborting." sys.exit(1) client.unassign_address(pool, address) print "IP %s removed from %s" % (ip, container_id)