def create_veth(endpoint): """ Create the veth, and configure the MAC address (since libnetwork does not do this). :param endpoint: The Endpoint being configured. """ # Create the veth pair. netns.create_veth(endpoint.name, endpoint.temp_interface_name) # Set the mac as libnetwork doesn't do this for us. netns.set_veth_mac(endpoint.temp_interface_name, endpoint.mac)
def join(): json_data = request.get_json(force=True) app.logger.debug("Join JSON=%s", json_data) endpoint_id = json_data["EndpointID"] app.logger.info("Joining endpoint %s", endpoint_id) network_id = json_data["NetworkID"] network_data = client.get_network(network_id) ipv4_gateway = "" if network_data and "IPv4Data" in network_data.keys(): ipv4_gateway = str(IPNetwork(network_data["IPv4Data"][0]["Gateway"]).ip) # The host interface name matches the name given when creating the endpoint # during CreateEndpoint host_interface_name = generate_cali_interface_name(IF_PREFIX, endpoint_id) # The temporary interface name is what gets passed to libnetwork. # Libnetwork renames the interface using the DstPrefix (e.g. cali0) temp_interface_name = generate_cali_interface_name("tmp", endpoint_id) try: # Create the veth pair. netns.create_veth(host_interface_name, temp_interface_name) # Set the mac as libnetwork doesn't do this for us (even if we return # it on the CreateNetwork) netns.set_veth_mac(temp_interface_name, FIXED_MAC) except CalledProcessError as e: # Failed to create or configure the veth, ensure veth is removed. remove_veth(host_interface_name) raise e return_json = { "InterfaceName": {"SrcName": temp_interface_name, "DstPrefix": IF_PREFIX}, "Gateway": ipv4_gateway, # Leave gateway empty to trigger auto-gateway behaviour } app.logger.debug("Join Response JSON=%s", return_json) return jsonify(return_json)
def join(): json_data = request.get_json(force=True) app.logger.debug("Join JSON=%s", json_data) endpoint_id = json_data["EndpointID"] app.logger.info("Joining endpoint %s", endpoint_id) # The host interface name matches the name given when creating the endpoint # during CreateEndpoint host_interface_name = generate_cali_interface_name(IF_PREFIX, endpoint_id) # The temporary interface name is what gets passed to libnetwork. # Libnetwork renames the interface using the DstPrefix (e.g. cali0) temp_interface_name = generate_cali_interface_name("tmp", endpoint_id) try: # Create the veth pair. netns.create_veth(host_interface_name, temp_interface_name) # Set the mac as libnetwork doesn't do this for us (even if we return # it on the CreateNetwork) netns.set_veth_mac(temp_interface_name, FIXED_MAC) except CalledProcessError as e: # Failed to create or configure the veth, ensure veth is removed. remove_veth(host_interface_name) raise e return_json = { "InterfaceName": { "SrcName": temp_interface_name, "DstPrefix": IF_PREFIX }, "Gateway": "", # Leave gateway empty to trigger auto-gateway behaviour } app.logger.debug("Join Response JSON=%s", return_json) return jsonify(return_json)
def join(): json_data = request.get_json(force=True) app.logger.debug("Join JSON=%s", json_data) network_id = json_data["NetworkID"] endpoint_id = json_data["EndpointID"] app.logger.info("Joining endpoint %s", endpoint_id) # The host interface name matches the name given when creating the endpoint # during CreateEndpoint host_interface_name = generate_cali_interface_name(IF_PREFIX, endpoint_id) # The temporary interface name is what gets passed to libnetwork. # Libnetwork renames the interface using the DstPrefix (e.g. cali0) temp_interface_name = generate_cali_interface_name("tmp", endpoint_id) try: # Create the veth pair. netns.create_veth(host_interface_name, temp_interface_name) # Set the mac as libnetwork doesn't do this for us (even if we return # it on the CreateNetwork) netns.set_veth_mac(temp_interface_name, FIXED_MAC) except CalledProcessError as e: # Failed to create or configure the veth, ensure veth is removed. remove_veth(host_interface_name) raise e # Initialise our response data. json_response = { "InterfaceName": { "SrcName": temp_interface_name, "DstPrefix": IF_PREFIX, } } # Extract relevant data from the Network data. network_data = get_network_data(network_id) gateway_ip4, _ = get_gateway_pool_from_network_data(network_data, 4) gateway_ip6, _ = get_gateway_pool_from_network_data(network_data, 6) if (gateway_ip4 and is_using_calico_ipam(gateway_ip4)) or \ (gateway_ip6 and is_using_calico_ipam(gateway_ip6)): # One of the network gateway addresses indicate that we are using # Calico IPAM driver. In this case we setup routes using the gateways # configured on the endpoint (which will be our host IPs). app.logger.debug("Using Calico IPAM driver, configure gateway and " "static routes to the host") static_routes = [] if gateway_ip4: json_response["Gateway"] = DUMMY_IPV4_NEXTHOP static_routes.append({ "Destination": DUMMY_IPV4_NEXTHOP + "/32", "RouteType": 1, # 1 = CONNECTED "NextHop": "" }) if gateway_ip6: # Here, we'll report the link local address of the host's cali interface to libnetwork # as our IPv6 gateway. IPv6 link local addresses are automatically assigned to interfaces # when they are brought up. Unfortunately, the container link must be up as well. So # bring it up now # TODO: create_veth should already bring up both links bring_up_interface(temp_interface_name) # Then extract the link local address that was just assigned to our host's interface next_hop_6 = get_ipv6_link_local(host_interface_name) json_response["GatewayIPv6"] = next_hop_6 static_routes.append({ "Destination": str(IPNetwork(next_hop_6)), "RouteType": 1, # 1 = CONNECTED "NextHop": "" }) json_response["StaticRoutes"] = static_routes else: # We are not using Calico IPAM driver, so configure blank gateways to # set up auto-gateway behavior. app.logger.debug("Not using Calico IPAM driver") json_response["Gateway"] = "" json_response["GatewayIPv6"] = "" app.logger.debug("Join Response JSON=%s", json_response) return jsonify(json_response)
def join(): json_data = request.get_json(force=True) app.logger.debug("Join JSON=%s", json_data) network_id = json_data["NetworkID"] endpoint_id = json_data["EndpointID"] app.logger.info("Joining endpoint %s", endpoint_id) # The host interface name matches the name given when creating the endpoint # during CreateEndpoint host_interface_name = generate_cali_interface_name(IF_PREFIX, endpoint_id) # The temporary interface name is what gets passed to libnetwork. # Libnetwork renames the interface using the DstPrefix (e.g. cali0) temp_interface_name = generate_cali_interface_name("tmp", endpoint_id) try: # Create the veth pair. netns.create_veth(host_interface_name, temp_interface_name) # Set the mac as libnetwork doesn't do this for us (even if we return # it on the CreateNetwork) netns.set_veth_mac(temp_interface_name, FIXED_MAC) except CalledProcessError as e: # Failed to create or configure the veth, ensure veth is removed. remove_veth(host_interface_name) raise e # Initialise our response data. json_response = { "InterfaceName": { "SrcName": temp_interface_name, "DstPrefix": IF_PREFIX, } } # Extract relevant data from the Network data. network_data = get_network_data(network_id) gateway_ip4, _ = get_gateway_pool_from_network_data(network_data, 4) gateway_ip6, _ = get_gateway_pool_from_network_data(network_data, 6) if (gateway_ip4 and is_using_calico_ipam(gateway_ip4)) or \ (gateway_ip6 and is_using_calico_ipam(gateway_ip6)): # One of the network gateway addresses indicate that we are using # Calico IPAM driver. In this case we setup routes using the gateways # configured on the endpoint (which will be our host IPs). app.logger.debug("Using Calico IPAM driver, configure gateway and " "static routes to the host") ep = client.get_endpoint(hostname=hostname, orchestrator_id=ORCHESTRATOR_ID, workload_id=CONTAINER_NAME, endpoint_id=endpoint_id) static_routes = [] if ep.ipv4_gateway: json_response["Gateway"] = str(ep.ipv4_gateway) static_routes.append({ "Destination": str(IPNetwork(ep.ipv4_gateway)), "RouteType": 1, # 1 = CONNECTED "NextHop": "" }) if ep.ipv6_gateway: json_response["GatewayIPv6"] = str(ep.ipv6_gateway) static_routes.append({ "Destination": str(IPNetwork(ep.ipv6_gateway)), "RouteType": 1, # 1 = CONNECTED "NextHop": "" }) json_response["StaticRoutes"] = static_routes else: # We are not using Calico IPAM driver, so configure blank gateways to # set up auto-gateway behavior. app.logger.debug("Not using Calico IPAM driver") json_response["Gateway"] = "" json_response["GatewayIPv6"] = "" app.logger.debug("Join Response JSON=%s", json_response) return jsonify(json_response)
def join(): json_data = request.get_json(force=True) app.logger.debug("Join JSON=%s", json_data) network_id = json_data["NetworkID"] endpoint_id = json_data["EndpointID"] app.logger.info("Joining endpoint %s", endpoint_id) # The host interface name matches the name given when creating the endpoint # during CreateEndpoint host_interface_name = generate_cali_interface_name(IF_PREFIX, endpoint_id) # The temporary interface name is what gets passed to libnetwork. # Libnetwork renames the interface using the DstPrefix (e.g. cali0) temp_interface_name = generate_cali_interface_name("tmp", endpoint_id) try: # Create the veth pair. netns.create_veth(host_interface_name, temp_interface_name) # Set the mac as libnetwork doesn't do this for us (even if we return # it on the CreateNetwork) netns.set_veth_mac(temp_interface_name, FIXED_MAC) except CalledProcessError as e: # Failed to create or configure the veth, ensure veth is removed. remove_veth(host_interface_name) raise e # Initialise our response data. json_response = { "InterfaceName": { "SrcName": temp_interface_name, "DstPrefix": "eth", } } # Extract relevant data from the Network data. network_data = get_network_data(network_id) gateway_ip4, _ = get_gateway_pool_from_network_data(network_data, 4) gateway_ip6, _ = get_gateway_pool_from_network_data(network_data, 6) if (gateway_ip4 and is_using_calico_ipam(gateway_ip4)) or \ (gateway_ip6 and is_using_calico_ipam(gateway_ip6)): # One of the network gateway addresses indicate that we are using # Calico IPAM driver. In this case we setup routes using the gateways # configured on the endpoint (which will be our host IPs). app.logger.debug("Using Calico IPAM driver, configure gateway and " "static routes to the host") static_routes = [] if gateway_ip4: json_response["Gateway"] = DUMMY_IPV4_NEXTHOP static_routes.append({ "Destination": DUMMY_IPV4_NEXTHOP + "/32", "RouteType": 1, # 1 = CONNECTED "NextHop": "" }) if gateway_ip6: # Here, we'll report the link local address of the host's cali interface to libnetwork # as our IPv6 gateway. IPv6 link local addresses are automatically assigned to interfaces # when they are brought up. Unfortunately, the container link must be up as well. So # bring it up now # TODO: create_veth should already bring up both links bring_up_interface(temp_interface_name) # Then extract the link local address that was just assigned to our host's interface next_hop_6 = get_next_hop_6(host_interface_name) json_response["GatewayIPv6"] = next_hop_6 static_routes.append({ "Destination": str(IPNetwork(next_hop_6)), "RouteType": 1, # 1 = CONNECTED "NextHop": "" }) json_response["StaticRoutes"] = static_routes else: # We are not using Calico IPAM driver, so configure blank gateways to # set up auto-gateway behavior. app.logger.debug("Not using Calico IPAM driver") json_response["Gateway"] = "" json_response["GatewayIPv6"] = "" app.logger.debug("Join Response JSON=%s", json_response) return jsonify(json_response)