<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>question Re: nipyapi canvas.list_all_processors lists only processors in sub processorgroup in Archives of Support Questions (Read Only)</title>
    <link>https://community.cloudera.com/t5/Archives-of-Support-Questions/nipyapi-canvas-list-all-processors-lists-only-processors-in/m-p/239034#M85526</link>
    <description>&lt;P&gt;Hi &lt;A rel="user" href="https://community.cloudera.com/users/2662/dchaffey.html" nodeid="2662"&gt;@Dan Chaffelson&lt;/A&gt; thanks for the quick response &lt;/P&gt;&lt;P&gt;here is my code , this is just a POC so it may seems somewhat unstructured, just a playground  &lt;/P&gt;&lt;PRE&gt;

	import os
	import sys
	import getpass
	import json
	import smtplib
	from nipyapi import nifi, config, templates, canvas
	from config import ConfigIni


	# Disable urllib3 certificate warnings
	from requests.packages.urllib3 import disable_warnings
	disable_warnings()




	class NifiInstance:
		""" The NifiInstance class facilitating easy to use
		methods utilizing the NiPyApi (https://github.com/Chaffelson/nipyapi)
		wrapper library.


		Arguments:
			url         (str): Nifi host url, defaults to environment variable `NIFI_HOST`.
			username    (str): Nifi username, defaults to environment variable `NIFI_USERNAME`.
			password    (str): Nifi password, defaults to environment variable `NIFI_PASSWORD`.
			verify_ssl  (bool): Whether to verify SSL connection - UNUSED as of now.


		"""


		def __init__(self, url=None, username=None, password=None, verify_ssl=False):
			config.nifi_config.host = self._get_url(url)
			config.nifi_config.verify_ssl = verify_ssl
			config.nifi_config.username = username
			self._authenticate(username, password)




		def _get_url(self, url):
			if not url:
				try:
					url = os.environ['NIFI_HOST']
				except KeyError:
					url = input('Nifi host: ')
			if not '/nifi-api' in url:
				if not url[-1] == '/':
					url = url + '/'
				url = url + 'nifi-api'
			return url




		def _authenticate(self, username=None, password=None):
			if not username:
				try:
					config.nifi_config.username = os.environ['NIFI_USERNAME']
				except KeyError:
					config.nifi_config.username = input('Username: ')


			if not password:
				try:
					password = os.environ['NIFI_PASSWORD']
				except KeyError:
					password = getpass.getpass('Password: ')


			access_token = None
			try:
				access_token = nifi.AccessApi().create_access_token(username=config.nifi_config.username,password=password)            
			except nifi.rest.ApiException as e:
				print('Exception when calling AccessApi-&amp;gt;create_access_token: %s\n'.format(e))


			config.nifi_config.api_key[username] = access_token
			config.nifi_config.api_client = nifi.ApiClient(header_name='Authorization', header_value='Bearer {}'.format(access_token))        


		def list_processors_in_processorgroup(self,pg_id=None):
			listen = canvas.list_all_processors(pg_id)
			#jlisten= json.loads(listen)
			for item in listen:
				#print (str(item.id))
				print (str(item.status.name))


		
		
		def processor_status(self,p_id=None):
			pro=canvas.get_processor(p_id, 'id')
			return pro.status.run_status
		
	#get urls and froups to list from ini file. 
	start_init = ConfigIni('c:/temp/nipyapi/monitor.ini')
	#groups are returned as list of groups 
	groups= start_init.get_group_id()
	url = start_init.get_url()


	n = NifiInstance(url, 'myuser','mypassword')


	#test list_all_processor 
	test=canvas.list_all_processors('5b641351-34d0-3def-a376-7824fbe9cc0f')


	for item in test:
				print (str(item .id))


&lt;BR /&gt;&lt;/PRE&gt;&lt;P&gt;my nipyapi version is &lt;/P&gt;&lt;P&gt;C:\Temp\nipyapi (nipyapi) λ pip freeze | grep nipyapi nipyapi==0.11.0 C:\Temp\nipyapi&lt;/P&gt;</description>
    <pubDate>Fri, 14 Dec 2018 14:44:37 GMT</pubDate>
    <dc:creator>simon_jespersen</dc:creator>
    <dc:date>2018-12-14T14:44:37Z</dc:date>
    <item>
      <title>nipyapi canvas.list_all_processors lists only processors in sub processorgroup</title>
      <link>https://community.cloudera.com/t5/Archives-of-Support-Questions/nipyapi-canvas-list-all-processors-lists-only-processors-in/m-p/239032#M85524</link>
      <description>&lt;P&gt;Hi &lt;/P&gt;&lt;P&gt;I need to extract my processors for at particular Processor Group with id = 5b641351-34d0-3def-a376-7824fbe9cc0f &lt;/P&gt;&lt;P&gt;This Processor Group contains 10 processors and another Processor Group with 5 Processors &lt;/P&gt;&lt;P&gt;when i want to extract the Processors i only get the 5 processors from my "sub" Processor-Group &lt;/P&gt;&lt;PRE&gt;test=canvas.list_all_processors('5b641351-34d0-3def-a376-7824fbe9cc0f')
for item in test:
            print (str(item.id)) &lt;/PRE&gt;&lt;P&gt;result &lt;/P&gt;&lt;PRE&gt;(nipyapi) λ python main.py
c7aad022-0ab3-353f-90cb-0999781d6309
7287c6b0-c9a8-3436-9902-52fb806e7c42
d3bd0289-490a-389c-ba90-c27c48a1e453
fb278074-6249-3aeb-88f8-d3bee857be76&lt;/PRE&gt;&lt;P&gt;I was expecting a list of 10 processors id's for the Processor-Group i call canvas.list_all_processors with, &lt;/P&gt;&lt;P&gt;It seems that it takes the deepest processor-group within the Processor-Group given in the argument. &lt;/P&gt;&lt;P&gt;It this work by design ? and is there another way to get the processors from top down within the group asked upon. &lt;/P&gt;&lt;P&gt;&lt;A rel="user" href="https://community.cloudera.com/users/2662/dchaffey.html" nodeid="2662"&gt;@Dan Chaffelson&lt;/A&gt; &lt;/P&gt;</description>
      <pubDate>Thu, 13 Dec 2018 23:06:53 GMT</pubDate>
      <guid>https://community.cloudera.com/t5/Archives-of-Support-Questions/nipyapi-canvas-list-all-processors-lists-only-processors-in/m-p/239032#M85524</guid>
      <dc:creator>simon_jespersen</dc:creator>
      <dc:date>2018-12-13T23:06:53Z</dc:date>
    </item>
    <item>
      <title>Re: nipyapi canvas.list_all_processors lists only processors in sub processorgroup</title>
      <link>https://community.cloudera.com/t5/Archives-of-Support-Questions/nipyapi-canvas-list-all-processors-lists-only-processors-in/m-p/239033#M85525</link>
      <description>&lt;P&gt;Hi Simon - definitely sounds like a bug to me. Can you please share the NiPyApi version you are using and the script you are using?&lt;/P&gt;</description>
      <pubDate>Fri, 14 Dec 2018 04:43:23 GMT</pubDate>
      <guid>https://community.cloudera.com/t5/Archives-of-Support-Questions/nipyapi-canvas-list-all-processors-lists-only-processors-in/m-p/239033#M85525</guid>
      <dc:creator>dchaffey</dc:creator>
      <dc:date>2018-12-14T04:43:23Z</dc:date>
    </item>
    <item>
      <title>Re: nipyapi canvas.list_all_processors lists only processors in sub processorgroup</title>
      <link>https://community.cloudera.com/t5/Archives-of-Support-Questions/nipyapi-canvas-list-all-processors-lists-only-processors-in/m-p/239034#M85526</link>
      <description>&lt;P&gt;Hi &lt;A rel="user" href="https://community.cloudera.com/users/2662/dchaffey.html" nodeid="2662"&gt;@Dan Chaffelson&lt;/A&gt; thanks for the quick response &lt;/P&gt;&lt;P&gt;here is my code , this is just a POC so it may seems somewhat unstructured, just a playground  &lt;/P&gt;&lt;PRE&gt;

	import os
	import sys
	import getpass
	import json
	import smtplib
	from nipyapi import nifi, config, templates, canvas
	from config import ConfigIni


	# Disable urllib3 certificate warnings
	from requests.packages.urllib3 import disable_warnings
	disable_warnings()




	class NifiInstance:
		""" The NifiInstance class facilitating easy to use
		methods utilizing the NiPyApi (https://github.com/Chaffelson/nipyapi)
		wrapper library.


		Arguments:
			url         (str): Nifi host url, defaults to environment variable `NIFI_HOST`.
			username    (str): Nifi username, defaults to environment variable `NIFI_USERNAME`.
			password    (str): Nifi password, defaults to environment variable `NIFI_PASSWORD`.
			verify_ssl  (bool): Whether to verify SSL connection - UNUSED as of now.


		"""


		def __init__(self, url=None, username=None, password=None, verify_ssl=False):
			config.nifi_config.host = self._get_url(url)
			config.nifi_config.verify_ssl = verify_ssl
			config.nifi_config.username = username
			self._authenticate(username, password)




		def _get_url(self, url):
			if not url:
				try:
					url = os.environ['NIFI_HOST']
				except KeyError:
					url = input('Nifi host: ')
			if not '/nifi-api' in url:
				if not url[-1] == '/':
					url = url + '/'
				url = url + 'nifi-api'
			return url




		def _authenticate(self, username=None, password=None):
			if not username:
				try:
					config.nifi_config.username = os.environ['NIFI_USERNAME']
				except KeyError:
					config.nifi_config.username = input('Username: ')


			if not password:
				try:
					password = os.environ['NIFI_PASSWORD']
				except KeyError:
					password = getpass.getpass('Password: ')


			access_token = None
			try:
				access_token = nifi.AccessApi().create_access_token(username=config.nifi_config.username,password=password)            
			except nifi.rest.ApiException as e:
				print('Exception when calling AccessApi-&amp;gt;create_access_token: %s\n'.format(e))


			config.nifi_config.api_key[username] = access_token
			config.nifi_config.api_client = nifi.ApiClient(header_name='Authorization', header_value='Bearer {}'.format(access_token))        


		def list_processors_in_processorgroup(self,pg_id=None):
			listen = canvas.list_all_processors(pg_id)
			#jlisten= json.loads(listen)
			for item in listen:
				#print (str(item.id))
				print (str(item.status.name))


		
		
		def processor_status(self,p_id=None):
			pro=canvas.get_processor(p_id, 'id')
			return pro.status.run_status
		
	#get urls and froups to list from ini file. 
	start_init = ConfigIni('c:/temp/nipyapi/monitor.ini')
	#groups are returned as list of groups 
	groups= start_init.get_group_id()
	url = start_init.get_url()


	n = NifiInstance(url, 'myuser','mypassword')


	#test list_all_processor 
	test=canvas.list_all_processors('5b641351-34d0-3def-a376-7824fbe9cc0f')


	for item in test:
				print (str(item .id))


&lt;BR /&gt;&lt;/PRE&gt;&lt;P&gt;my nipyapi version is &lt;/P&gt;&lt;P&gt;C:\Temp\nipyapi (nipyapi) λ pip freeze | grep nipyapi nipyapi==0.11.0 C:\Temp\nipyapi&lt;/P&gt;</description>
      <pubDate>Fri, 14 Dec 2018 14:44:37 GMT</pubDate>
      <guid>https://community.cloudera.com/t5/Archives-of-Support-Questions/nipyapi-canvas-list-all-processors-lists-only-processors-in/m-p/239034#M85526</guid>
      <dc:creator>simon_jespersen</dc:creator>
      <dc:date>2018-12-14T14:44:37Z</dc:date>
    </item>
    <item>
      <title>Re: nipyapi canvas.list_all_processors lists only processors in sub processorgroup</title>
      <link>https://community.cloudera.com/t5/Archives-of-Support-Questions/nipyapi-canvas-list-all-processors-lists-only-processors-in/m-p/239035#M85527</link>
      <description>&lt;P style="margin-left: 40px;"&gt;Hi &lt;A rel="user" href="https://community.cloudera.com/users/16412/simonjespersen.html" nodeid="16412"&gt;@Simon Jespersen&lt;/A&gt;  I believe I have reproduced your error with the following pytest code/output.&lt;BR /&gt;I think it is interesting that it works when the parent is the root canvas, but not sub processor groups - probably my recursion code is poor, I will try to fix this quickly.&lt;/P&gt;&lt;P style="margin-left: 40px;"&gt;Edit: Resolved, the updated function is below if you want to inspect it yourself, I also took a moment to leverage the new 'descendants' calls to speed it up on newer versions. I'll push this into the code base once full testing is complete.&lt;/P&gt;&lt;PRE&gt;def test_list_nested_processors(regress_nifi, fix_pg, fix_proc):
        pg_1 = fix_pg.generate(
            parent_pg=canvas.get_process_group(canvas.get_root_pg_id(), 'id')
        )
        pg_2 = fix_pg.generate(parent_pg=pg_1)
        root_proc_1 = fix_proc.generate()
        pg_1_proc_1 = fix_proc.generate(parent_pg=pg_1)
        pg_1_proc_2 = fix_proc.generate(parent_pg=pg_1)
        pg_2_proc_1 = fix_proc.generate(parent_pg=pg_2)
        pg_2_proc_2 = fix_proc.generate(parent_pg=pg_2)
        pg_2_proc_3 = fix_proc.generate(parent_pg=pg_2)
        pg_2_proc_4 = fix_proc.generate(parent_pg=pg_2)
        r1 = canvas.list_all_processors('root')
        assert len(r1) == 7
        r2 = canvas.list_all_processors(pg_1.id)
&amp;gt;       assert len(r2) == 6
E       AssertionError: assert 4 == 6




def list_all_processors(pg_id='root'):
    """
    Returns a flat list of all Processors under the provided Process Group


    Args:
        pg_id (str): The UUID of the Process Group to start from, defaults to
            the Canvas root


    Returns:
         list[ProcessorEntity]
    """
    assert isinstance(pg_id, six.string_types), "pg_id should be a string"


    if nipyapi.utils.check_version('1.2.0') == -1:
        targets = nipyapi.nifi.ProcessGroupsApi().get_processors(
            id=pg_id,
            include_descendant_groups=True
        )
        return targets.processors
    else:
        out = []
        # list of child process groups
        pg_ids = [x.id for x in list_all_process_groups(pg_id)]
        # if not root, include the parent pg in the target list
        # root is a special case that is included if targeted by
        # list_all_process_groups
        if pg_id == 'root' or pg_id == get_root_pg_id():
            pass
        else:
            pg_ids.append(pg_id)
        # process target list
        for this_pg_id in pg_ids:
            procs = nipyapi.nifi.ProcessGroupsApi().get_processors(this_pg_id)
            if procs.processors:
                out += procs.processors
        return out



&lt;/PRE&gt;</description>
      <pubDate>Sun, 16 Dec 2018 04:40:13 GMT</pubDate>
      <guid>https://community.cloudera.com/t5/Archives-of-Support-Questions/nipyapi-canvas-list-all-processors-lists-only-processors-in/m-p/239035#M85527</guid>
      <dc:creator>dchaffey</dc:creator>
      <dc:date>2018-12-16T04:40:13Z</dc:date>
    </item>
    <item>
      <title>Re: nipyapi canvas.list_all_processors lists only processors in sub processorgroup</title>
      <link>https://community.cloudera.com/t5/Archives-of-Support-Questions/nipyapi-canvas-list-all-processors-lists-only-processors-in/m-p/239036#M85528</link>
      <description>&lt;P&gt;Thats great news thank you Dan. &lt;/P&gt;</description>
      <pubDate>Tue, 18 Dec 2018 15:32:45 GMT</pubDate>
      <guid>https://community.cloudera.com/t5/Archives-of-Support-Questions/nipyapi-canvas-list-all-processors-lists-only-processors-in/m-p/239036#M85528</guid>
      <dc:creator>simon_jespersen</dc:creator>
      <dc:date>2018-12-18T15:32:45Z</dc:date>
    </item>
  </channel>
</rss>

