Search code examples
apache-flink

Apache Flink Rest-Client Jar-Upload not working


I am struggling to automatically deploy new Flink jobs within our CI/CD workflows by using the Flink rest-api (which may be found here in the flink Github repository).

Documentation only says that that jar upload may be achieved by using /jars/upload, but not how exactly a valid rest request has to be build (which Headers, which Body type, which Authorization, which Method and so on).

So I took a look at the Flink dashboard code of flink/flink-runtime-web project on Github and searched for the implementation they used to upload a jar and - Yippie! Its implemented by calling the rest-api I am trying to use (using POST as method). After that I tried to figure out with Postman which is correct way to send requests using different Content-Type headers and Body types, but none of them worked for me now.

I would have filed a ticket directly to the flink project, but could not find any reference to their ticket system.

So the basic Question here is:

  • How do I have to call the rest endpoint /jars/upload to successfully upload a file?

Solution

  • I've run into the same issue and solved it by looking at the network request in chrome when uploading a jar with the web UI.

    The request must

    • Use multipart upload
    • The field name must be jarfile
    • The multi part content must include the file Content-Type as well (otherwise you'll get a 500 from Flink complaining about the missing header)

    Here is a python script using requests that does the upload

    upload = requests.post(                                                                                               
        base_url + "/jars/upload",                                                                                        
        files={
            "jarfile": (
                os.path.basename(path), 
                open(path, "rb"), 
                "application/x-java-archive"
             )
        }
    )