8

I have multiple nifi servers that I would like to be able to POST templates to via the REST interface from a script

The "/controller/templates" endpoint appears to be the proper REST endpoint to support POSTing an arbitrary template to my Nifi installation. enter image description here The "snippetId" field is what is confusing me, how do I determine "The id of the snippet whose contents will comprise the template"? Does anyone have an example of how I can upload a template "test.xml" to my server without having to use the UI?

Josh Harrison
  • 434
  • 1
  • 6
  • 18

6 Answers6

5

The API has moved in 1.0 to:

POST /process-groups/{id}/templates/upload

Example, using Python's requests library:

res = requests.post( "{hostname}/nifi-api/process-groups/{destination_process_group}/templates/upload".format( **args ), 
    files={"template": open( file_path, 'rb')} )
RyanWilcox
  • 13,890
  • 1
  • 36
  • 60
Stephane Maarek
  • 5,202
  • 9
  • 46
  • 87
4

The provided documentation is somewhat confusing, and the solution I worked out was derived from the nifi api deploy groovy script at https://github.com/aperepel/nifi-api-deploy

Ultimately, to POST a template directly, you can use the following in Python requests

requests.post("%s/nifi-api/controller/templates"%(url,), files={"template":open(filename, 'rb')})

Where filename is the filename of your template and url is the path to your nifi instance. I haven't figured it out in curl directly but this should hopefully get folks with a similar question started!

Edit: Note that you also can't upload a template with the same name as an existing template. Make sure to delete your existing template before attempting to re-upload. Using the untangle library to parse the XML of the template, the following script works just fine:

import untangle, sys, requests

def deploy_template(filename, url):
    p = untangle.parse(filename)
    new_template_name=p.template.name.cdata
    r=requests.get("%s/nifi-api/controller/templates"%(url,), headers={"Accept":"application/json"})

    for each in r.json()["templates"]:
        if each["name"]==new_template_name:
            requests.delete(each["uri"])
    requests.post("%s/nifi-api/controller/templates"%(url,), files={"template":open(filename, 'rb')})

if __name__=="__main__":
    deploy_template(sys.argv[1], sys.argv[2])
Josh Harrison
  • 434
  • 1
  • 6
  • 18
3

If you want to POST a template to NiFi via cURL you can use the following command:

curl -iv -F template=@my_nifi_template.xml -X POST  http://nifi-host:nifi-port/nifi-api/controller/templates

This will add the template to the NiFi instance with the same name that the template was given when it was generated.

And the -iv is optional - It's just there for debugging purposes.

zac
  • 353
  • 1
  • 9
2

You can use Nifi Api to upload a template, to do that follow these two steps:

1. Get a token from Nifi Api:

token=$(curl -k -X POST --negotiate -u : https://nifi_hostname:port/nifi-api/access/kerberos)

2. Upload the template file using the token:

curl -k -F template=@template_file.xml -X POST https://nifi_hostname:port/nifi-api/process-groups/Process_group_id/templates/upload -H "Authorization: Bearer $token"
S.Bao
  • 191
  • 1
  • 6
1

The documentation can be confusing because that endpoint is overloaded and the documentation tool only generates doc for one of them (see NIFI-1113). There is an email thread that addresses the import of a template using curl, so between the above answer and the email thread, hopefully you can find the approach that works for you.

mattyb
  • 11,693
  • 15
  • 20
1

I've implemented a full Python client for doing this in NiPyApi
Key functions for templates are:

 [
    "list_all_templates", "get_template_by_name", "deploy_template",
    "upload_template", "create_pg_snippet", "create_template",
    "delete_template", "export_template", 'get_template'
]

The client supports NiFi-1.1.2 - 1.7.1 currently, and NiFi-Registry (which is a lot better than templates for flow deployment)

Chaffelson
  • 1,249
  • 9
  • 20