Skip to main content

About ResourceDefinition

Class nifiapi.properties.ResourceDefinition

The ResourceDefinition class is used to define and manage external resources that processors interact with, such as files, databases, or APIs. It specifies the characteristics and configuration parameters required to access these resources, ensuring they are properly set up and validated before use.

The ResourceDefinition can be supplied as the value of an optional resource_definition parameter in a PropertyDescriptor class.

Parameters

NameTypeDescription
allow_multipleBoolean; Default FalseThe value can contain a comma separated list of entries
allow_fileBoolean; Default TrueThe value of a property must be a valid file path
allow_directoryBoolean; Default FalseThe value of a property must be a valid directory path
allow_urlBoolean; Default FalseThe value of a property must be a valid URL
allow_textBoolean; Default FalseThe value of a property must be a valid UTF-8 encoded string

e.g.:

from nifiapi.properties import (
PropertyDescriptor,
ResourceDefinition
)

PROPERTY = PropertyDescriptor(
name="Property A",
description='''
Property with Resource Definition.
''',
required=True,
resource_definition=ResourceDefinition(allow_file=True)
)
danger

Note that allow_file parameter is set to True by default, and should be explicitly disabled if not needed.

ResourceDefinition(allow_file=False, allow_url=True)

allow_file

The input value of a property must represent a path to an existing and accessible file. If a relative path is given, it will be evaluated in relation to the NiFi root directory.

Example of a failed file resource validation:
Failed allow_file resource validation

allow_directory

The input value of a property must represent a path to an existing and accessible directory. If a relative path is given, it will be evaluated in relation to the NiFi root directory.

allow_text

The input value of a property must be a UTF-8 encoded string.

Allowing Multiple Resource Types

It is possible to define a resource that expects a combination of definitions, as ResourceDefinition parameters are not mutually exclusive.

Example of a property accepting a list of directories or files:

from nifiapi.properties import (
PropertyDescriptor,
ResourceDefinition
)

PROPERTY = PropertyDescriptor(
name="Property A",
description='''
Property with Resource Definition.
''',
required=True,
resource_definition=ResourceDefinition(
allow_multiple=True,
allow_file=True,
allow_directory=True
)
)

Accessing Resource Reference

Defined resources can be accessed using an instance of the ProcessContext class, which is supplied to the onSchedule, onStopped, or transform methods.

e.g.:

from nifiapi.flowfiletransform import (
FlowFileTransform,
FlowFileTransformResult,
)
from nifiapi.properties import (
ProcessContext,
PropertyDescriptor,
ResourceDefinition
)


class Processor(FlowFileTransform):

(...)

RESOURCE = PropertyDescriptor(
name="File Resource",
description='''
This property accepts a file resource reference.
''',
required=True,
resource_definition=ResourceDefinition(allow_file=True)
)
MULTI_RESOURCE = PropertyDescriptor(
name="Multiple File Resources",
description='''
This property accepts a comma-separated list of file
resource references.
''',
required=True,
resource_definition=ResourceDefinition(
allow_file=True,
allow_multiple=True,
)
)

(...)

def transform(
self, context: ProcessContext, flow_file
) -> FlowFileTransformResult:
'''
Parameters:
context (ProcessContext)
descriptor (PropertyDescriptor)

Returns:
List(Dict)
'''
# Accessing a singluar resource
resource = context.getProperty(self.RESOURCE)\
.asResource()

# Accessing a collection of resources
collection = context.getProperty(self.MULTI_RESOURCE)\
.asResources()

return FlowFileTransformResult("success")