Support Questions

Find answers, ask questions, and share your expertise

start/stop processor via nifi api

avatar
Rising Star

Hi,

I'm trying to start and stop processors via the nifi api version 1.0.0. I'm getting status code 409 returned and the message is "afb7dcf1-0157-1000-9450-ea0931a67e0f is not stopped."

I have read previous articles about the optimistic locking and I am supplying the version and client id but I'm still getting this error. Any ideas? Here is a snippet of my python code:

process_group = nifiapi.find_process_group(process_group_name)
if process_group is None:
    return None
processors = nifiapi.get_processors_by_pg(process_group["id"])
if processors is None:
    return None
for processor in processors['processors']:
    processor["revision"]["clientId"] = str(uuid.uuid4())
    processor["status"]["runStatus"] = "STOPPED"
    logging.debug("Updating processor: {}".format(json.dumps(processor)))
    nifiapi.update_processor(processor) # this makes the put request
1 ACCEPTED SOLUTION

avatar
Rising Star

ok I figured it out. Since I was taking the processor object returned from my 'get' call and just modifying a few fields, it thought I was trying to do an update on the object. You cannot do this while it is running so that was the error message. I modified my request to only contain the minimum number of fields (i think) to stop the processor. I'm still unclear whether I need to set status.runStatus and/or component.state to STOPPED to get what I want as they both seem to indicate the same thing. Anyway, the below request works:

modified_processor = {
    'revision': {
        'version': processor["revision"]["version"],
        'clientId': str(uuid.uuid4())
    },
    'status': {
        'runStatus': status
    },
    'component': {
        'id': processor['id'],
        'state': status
    },
    'id' : processor['id']
}

View solution in original post

17 REPLIES 17

avatar
Rising Star

ok I figured it out. Since I was taking the processor object returned from my 'get' call and just modifying a few fields, it thought I was trying to do an update on the object. You cannot do this while it is running so that was the error message. I modified my request to only contain the minimum number of fields (i think) to stop the processor. I'm still unclear whether I need to set status.runStatus and/or component.state to STOPPED to get what I want as they both seem to indicate the same thing. Anyway, the below request works:

modified_processor = {
    'revision': {
        'version': processor["revision"]["version"],
        'clientId': str(uuid.uuid4())
    },
    'status': {
        'runStatus': status
    },
    'component': {
        'id': processor['id'],
        'state': status
    },
    'id' : processor['id']
}

avatar
Super Collaborator

It gave JSON syntax error, with double quotes - worked fine.

{ "revision": { "version": 8, "clientId": "test" }, "status": { "runStatus": "RUNNING" }, "component": { "id": "8bb725ef-0158-1000-478b-da5903184807", "state": "RUNNING" }, "id": "8bb725ef-0158-1000-478b-da5903184807" }

But sometimes the GET request gets timed out - is the nifi-api service reliable?

avatar

@ Frank Maritato Is there a way to start and stop processors using nifi - api??

Can you please elaborate with the endpoints to start/stop processors?

avatar
Rising Star

Sure! The endpoint for updating a processor is a PUT request against /processors/[processor_id] where you would post json similar to what I have above. The runStatus should be either "STOPPED" or "RUNNING". You have to include the clientId or the version in the request. The 'component' field is also required. I discovered all this by reading the code since there really isn't a user guide on how to use these endpoints.

As part of my script, I was getting to the list of processors by the name of the process group. So my flow is:

GET /flow/search_results?q=[process_group_name]

Then I get a list of processors for that group with:

GET /process-groups/[process_group_id]/processors

I loop through each of those results with the PUT request I mentioned above. Hope this helps!

avatar

Thanks for the reply @Frank Maritato

I tried using Put request against /processors/"processor_id" and the json is

{ "component":{ "id":"5444685a-0158-1000-0407-0bd70a8688ef" }, "status":{ "runStatus":"STOPPED" } }.

But got an error saying "Revision must be specified." What is Revision? Also , you specified that clientID or version should be included. Can you please define these? and/or From where we can get these values?

Thanks

avatar
Rising Star

You will need to do a Get on that processor first. The revision/version is contained in that json and you just pass it thru for your Put request.

GET /processors/{id}

returning json will have something like this:

{
  "status": { ... },
  "component": { ... },
  "revision": {
    "version": 1
  }
}

So you would just take that whole revision element and add it to your Put payload.

clientId is any string that identifies your tool/app. In my example above, I was just generating a random uuid.

Hope this helps!

avatar

@Frank Maritato Thanks for the Information.

avatar

@Frank Maritato I am trying to start a processor group.Here is the command

curl -i -X PUT -H 'Content-Type:application/json' -d '{"component": {"id":"<processorgroup_id>","parentGroupId":"<parentgroup_id>","state":"RUNNING"},"revision": {"clientId":"<client_id>","version": 2}}' http://hostname:port/nifi-api/process-groups/>

I am facing:

HTTP/1.1 400 Bad Request Date: Tue, 20 Dec 2016 06:43:43 GMT Content-Type: text/plain Transfer-Encoding: chunked Server: Jetty(9.3.9.v20160517) Message body is malformed. Unable to map into expected format.

is there any issue in above api request??

avatar
Rising Star

@Gayathri Rajendran My processor update json looks like this:

{
  "status": {
    "runStatus": "RUNNING"
  },
  "component": {
    "state": "RUNNING",
    "id": "01571000-f7fb-1da4-7d70-b6be89100354"
  },
  "id": "01571000-f7fb-1da4-7d70-b6be89100354",
  "revision": {
    "version": 1,
    "clientId": "c4cd2dc5-a57f-4025-aa4b-7e29118ce795"
  }
}

You may need to add the separate "status" object in there. Also, I've never specified a parentGroupId so I'm not sure if that is necessary.

Lastly, you may need to add a -H 'Accept:application/json' to your curl command as well.

Hope this helps!