Author: bbende
Date: Thu Jun 21 18:18:06 2018
New Revision: 1834040
URL: http://svn.apache.org/viewvc?rev=1834040&view=rev
Log:
Updating nifi-registry-docs for 0.2.0 release
Added:
nifi/site/trunk/docs/nifi-registry-docs/html/getting-started.html
nifi/site/trunk/docs/nifi-registry-docs/html/images/ABCD_flow_changes.png
(with props)
nifi/site/trunk/docs/nifi-registry-docs/html/images/ABCD_flow_in_test_bucket.png
(with props)
nifi/site/trunk/docs/nifi-registry-docs/html/images/ABCD_flow_saved.png
(with props)
nifi/site/trunk/docs/nifi-registry-docs/html/images/ABCD_process_group_menu.png
(with props)
nifi/site/trunk/docs/nifi-registry-docs/html/images/ABCD_save_flow_version_2.png
(with props)
nifi/site/trunk/docs/nifi-registry-docs/html/images/ABCD_version_2.png
(with props)
nifi/site/trunk/docs/nifi-registry-docs/html/images/changed_flow_options.png
(with props)
nifi/site/trunk/docs/nifi-registry-docs/html/images/controller-settings-selection.png
(with props)
nifi/site/trunk/docs/nifi-registry-docs/html/images/drag_process_group.png
(with props)
nifi/site/trunk/docs/nifi-registry-docs/html/images/empty_registry.png
(with props)
nifi/site/trunk/docs/nifi-registry-docs/html/images/iconLocallyModified.png
(with props)
nifi/site/trunk/docs/nifi-registry-docs/html/images/iconUpToDate.png
(with props)
nifi/site/trunk/docs/nifi-registry-docs/html/images/import_ABCD_version_2.png
(with props)
nifi/site/trunk/docs/nifi-registry-docs/html/images/import_flow_from_registry.png
(with props)
nifi/site/trunk/docs/nifi-registry-docs/html/images/local_registry.png
(with props)
nifi/site/trunk/docs/nifi-registry-docs/html/images/new_test_bucket.png
(with props)
nifi/site/trunk/docs/nifi-registry-docs/html/images/save_ABCD_flow_dialog.png
(with props)
nifi/site/trunk/docs/nifi-registry-docs/html/images/test_bucket.png (with
props)
nifi/site/trunk/docs/nifi-registry-docs/html/images/test_bucket_dialog.png
(with props)
nifi/site/trunk/docs/nifi-registry-docs/html/images/two_ABCD_flows.png
(with props)
Modified:
nifi/site/trunk/docs/nifi-registry-docs/html/administration-guide.html
nifi/site/trunk/docs/nifi-registry-docs/html/user-guide.html
nifi/site/trunk/docs/nifi-registry-docs/index.html
nifi/site/trunk/docs/nifi-registry-docs/rest-api/index.html
Modified: nifi/site/trunk/docs/nifi-registry-docs/html/administration-guide.html
URL:
http://svn.apache.org/viewvc/nifi/site/trunk/docs/nifi-registry-docs/html/administration-guide.html?rev=1834040&r1=1834039&r2=1834040&view=diff
==============================================================================
--- nifi/site/trunk/docs/nifi-registry-docs/html/administration-guide.html
(original)
+++ nifi/site/trunk/docs/nifi-registry-docs/html/administration-guide.html Thu
Jun 21 18:18:06 2018
@@ -464,7 +464,7 @@ body.book #toc,body.book #preamble,body.
<li><a
href="administration-guide.html#kerberos_identity_provider">Kerberos</a></li>
</ul>
</li>
-<li><a
href="administration-guide.html#multi-tenant-authorization">Authorization</a>
+<li><a href="administration-guide.html#authorization">Authorization</a>
<ul class="sectlevel2">
<li><a href="administration-guide.html#authorizer-configuration">Authorizer
Configuration</a></li>
<li><a href="administration-guide.html#authorizers-setup">Authorizers.xml
Setup</a></li>
@@ -493,6 +493,14 @@ body.book #toc,body.book #preamble,body.
<li><a href="administration-guide.html#kerberos_properties">Kerberos
Properties</a></li>
</ul>
</li>
+<li><a href="administration-guide.html#persistence-providers">Persistence
Providers</a>
+<ul class="sectlevel2">
+<li><a
href="administration-guide.html#filesystemflowpersistenceprovider">FileSystemFlowPersistenceProvider</a></li>
+<li><a
href="administration-guide.html#gitflowpersistenceprovider">GitFlowPersistenceProvider</a></li>
+<li><a
href="administration-guide.html#switching-from-other-persistence-provider">Switching
from other Persistence Provider</a></li>
+<li><a
href="administration-guide.html#data-model-version-of-serialized-flow-snapshots">Data
model version of serialized Flow snapshots</a></li>
+</ul>
+</li>
</ul>
</div>
</div>
@@ -506,8 +514,26 @@ body.book #toc,body.book #preamble,body.
<div class="ulist">
<ul>
<li>
-<p>Requires Java 8, newer than 1.8.0_45</p>
+<p>Requires Java Development Kit (JDK) 8, newer than 1.8.0_45</p>
</li>
+</ul>
+</div>
+<div class="admonitionblock warning">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-warning" title="Warning"></i>
+</td>
+<td class="content">
+When running Registry with only a JRE you may encounter the following error as
Flyway (database migration tool) attempts to utilize a resource from the
JDK:<br>
+<br>
+ java.lang.RuntimeException:
org.springframework.beans.factory.BeanCreationException: Error creating bean
with name 'flywayInitializer' defined in class path resource
[org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]:
Invocation of init method failed; nested exception is
org.flywaydb.core.api.FlywayException: Validate failed: Detected failed
migration to version 1.3 (DropBucketItemNameUniqueness)
+</td>
+</tr>
+</table>
+</div>
+<div class="ulist">
+<ul>
<li>
<p>Supported Operating Systems:</p>
<div class="ulist">
@@ -583,7 +609,7 @@ body.book #toc,body.book #preamble,body.
<p>service nifi-registry start</p>
</li>
<li>
-<p>service nifi-regsitry stop</p>
+<p>service nifi-registry stop</p>
</li>
<li>
<p>service nifi-registry status</p>
@@ -723,20 +749,20 @@ NiFi Registry does not perform user auth
Alternatively, a secured NiFi Registry can be configured to authenticate users
via username/password.</p>
</div>
<div class="paragraph">
-<p>Username/password authentication is performed by an <em>Identity
Provider</em>. The Identity Provider is a pluggable mechanism for
+<p>Username/password authentication is performed by an 'Identity Provider'.
The Identity Provider is a pluggable mechanism for
authenticating users via their username/password. Which Identity Provider to
use is configured in the <em>nifi-registry.properties</em> file.
Currently NiFi Registry offers Identity Providers for LDAP and Kerberos.</p>
</div>
<div class="paragraph">
-<p>Identity Providers are configured using two properties in the
<em>nifi-registry.properties</em> file:</p>
+<p>Identity Providers are configured using two properties in the
'nifi-registry.properties' file:</p>
</div>
<div class="ulist">
<ul>
<li>
-<p>The
<code>nifi.registry.security.identity.providers.configuration.file</code>
property specifies the configuration file where identity providers are defined.
By default, the <em>identity-providers.xml</em> file located in the root
installation conf directory is selected.</p>
+<p>The
<code>nifi.registry.security.identity.providers.configuration.file</code>
property specifies the configuration file where identity providers are defined.
By default, the 'identity-providers.xml' file located in the root installation
conf directory is selected.</p>
</li>
<li>
-<p>The <code>nifi.registry.security.identity.provider</code> property
indicates which of the configured identity providers in the
<em>identity-providers.xml</em> file to use. By default, this property is not
configured meaning that username/password must be explicitly enabled.</p>
+<p>The <code>nifi.registry.security.identity.provider</code> property
indicates which of the configured identity providers in the
'identity-providers.xml' file to use. By default, this property is not
configured meaning that username/password must be explicitly enabled.</p>
</li>
</ul>
</div>
@@ -886,7 +912,7 @@ NiFi Registry can only be configured to
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>User
Search Filter</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter for
searching for users against the <em>User Search Base</em>. (i.e.
sAMAccountName={0}). The user specified name is inserted into
<em>{0}</em>.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Filter for
searching for users against the 'User Search Base'. (i.e. sAMAccountName={0}).
The user specified name is inserted into '{0}'.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>Identity Strategy</code></p></td>
@@ -955,24 +981,24 @@ compatibility. USE_DN will use the full
</div>
</div>
<div class="sect1">
-<h2 id="multi-tenant-authorization"><a class="anchor"
href="administration-guide.html#multi-tenant-authorization"></a>Authorization</h2>
+<h2 id="authorization"><a class="anchor"
href="administration-guide.html#authorization"></a>Authorization</h2>
<div class="sectionbody">
<div class="paragraph">
<p>After you have configured NiFi Registry to run securely and with an
authentication mechanism, you must configure who has access to the system and
their level of access.
-This is done by defining policies that give users and groups permissions to
perform a particular action. These policies are defined in an
<em>authorizer</em>.</p>
+This is done by defining policies that give users and groups permissions to
perform a particular action. These policies are defined in an 'authorizer'.</p>
</div>
<div class="sect2">
<h3 id="authorizer-configuration"><a class="anchor"
href="administration-guide.html#authorizer-configuration"></a>Authorizer
Configuration</h3>
<div class="paragraph">
-<p>An <em>authorizer</em> manages known users and their access policies.
Authorizers are configured using two properties in the
<em>nifi-registry.properties</em> file:</p>
+<p>An 'authorizer' manages known users and their access policies. Authorizers
are configured using two properties in the 'nifi-registry.properties' file:</p>
</div>
<div class="ulist">
<ul>
<li>
-<p>The <code>nifi.registry.security.authorizers.configuration.file</code>
property specifies the configuration file where authorizers are defined. By
default, the <em>authorizers.xml</em> file located in the root installation
conf directory is selected.</p>
+<p>The <code>nifi.registry.security.authorizers.configuration.file</code>
property specifies the configuration file where authorizers are defined. By
default, the 'authorizers.xml' file located in the root installation conf
directory is selected.</p>
</li>
<li>
-<p>The <code>nifi.registry.security.authorizer</code> property indicates which
of the configured authorizers in the <em>authorizers.xml</em> file to use.</p>
+<p>The <code>nifi.registry.security.authorizer</code> property indicates which
of the configured authorizers in the 'authorizers.xml' file to use.</p>
</li>
</ul>
</div>
@@ -980,7 +1006,7 @@ This is done by defining policies that g
<div class="sect2">
<h3 id="authorizers-setup"><a class="anchor"
href="administration-guide.html#authorizers-setup"></a>Authorizers.xml
Setup</h3>
<div class="paragraph">
-<p>The <em>authorizers.xml</em> file is used to define and configure available
authorizers. The default authorizer is the StandardManagedAuthorizer. The
managed authorizer is comprised of a UserGroupProvider
+<p>The 'authorizers.xml' file is used to define and configure available
authorizers. The default authorizer is the StandardManagedAuthorizer. The
managed authorizer is comprised of a UserGroupProvider
and a AccessPolicyProvider. The users, group, and access policies will be
loaded and optionally configured through these providers. The managed
authorizer will make all access decisions based on
these provided users, groups, and access policies.</p>
</div>
@@ -994,7 +1020,7 @@ these provided users, groups, and access
<ul>
<li>
<p>Users File - The file where the FileUserGroupProvider stores users and
groups.
-By default, <em>users.xml</em> in the <em>conf</em> directory is chosen.</p>
+By default, 'users.xml' in the 'conf' directory is chosen.</p>
</li>
<li>
<p>Initial User Identity - The identity of a user or system to seed an empty
Users File.
@@ -1084,13 +1110,16 @@ This will sync users and groups from a d
<p>User Search Scope - Search scope for searching users (ONE_LEVEL, OBJECT, or
SUBTREE). Required if searching users.</p>
</li>
<li>
-<p>User Search Filter - Filter for searching for users against the <em>User
Search Base</em> (i.e. (memberof=cn=team1,ou=groups,o=nifi) ). Optional.</p>
+<p>User Search Filter - Filter for searching for users against the 'User
Search Base' (i.e. (memberof=cn=team1,ou=groups,o=nifi) ). Optional.</p>
</li>
<li>
<p>User Identity Attribute - Attribute to use to extract user identity (i.e.
cn). Optional. If not set, the entire DN is used.</p>
</li>
<li>
-<p>User Group Name Attribute - Attribute to use to define group membership
(i.e. memberof). Optional. If not set group membership will not be calculated
through the users. Will rely on group membership being defined through Group
Member Attribute if set.</p>
+<p>User Group Name Attribute - Attribute to use to define group membership
(i.e. memberof). Optional. If not set group membership will not be calculated
through the users. Will rely on group membership being defined through 'Group
Member Attribute' if set. The value of this property is the name of the
attribute in the user LDAP entry that associates them with a group. The value
of that user attribute could be a dn or group name for instance. What value is
expected is configured in the 'User Group Name Attribute - Referenced Group
Attribute'.</p>
+</li>
+<li>
+<p>User Group Name Attribute - Referenced Group Attribute - If blank, the
value of the attribute defined in 'User Group Name Attribute' is expected to be
the full dn of the group. If not blank, this property will define the attribute
of the group LDAP entry that the value of the attribute defined in 'User Group
Name Attribute' is referencing (i.e. name). Use of this property requires that
'Group Search Base' is also configured.</p>
</li>
<li>
<p>Group Search Base - Base DN for searching for groups (i.e.
ou=groups,o=nifi). Required to search groups.</p>
@@ -1102,13 +1131,16 @@ This will sync users and groups from a d
<p>Group Search Scope - Search scope for searching groups (ONE_LEVEL, OBJECT,
or SUBTREE). Required if searching groups.</p>
</li>
<li>
-<p>Group Search Filter - Filter for searching for groups against the <em>Group
Search Base</em>. Optional.</p>
+<p>Group Search Filter - Filter for searching for groups against the 'Group
Search Base'. Optional.</p>
</li>
<li>
<p>Group Name Attribute - Attribute to use to extract group name (i.e. cn).
Optional. If not set, the entire DN is used.</p>
</li>
<li>
-<p>Group Member Attribute - Group Member Attribute - Attribute to use to
define group membership (i.e. member). Optional. If not set group membership
will not be calculated through the groups. Will rely on group member being
defined through User Group Name Attribute if set.</p>
+<p>Group Member Attribute - Attribute to use to define group membership (i.e.
member). Optional. If not set group membership will not be calculated through
the groups. Will rely on group membership being defined through 'User Group
Name Attribute' if set. The value of this property is the name of the attribute
in the group LDAP entry that associates them with a user. The value of that
group attribute could be a dn or memberUid for instance. What value is expected
is configured in the 'Group Member Attribute - Referenced User Attribute'.
(i.e. member: cn=User 1,ou=users,o=nifi vs. memberUid: user1)</p>
+</li>
+<li>
+<p>Group Member Attribute - Referenced User Attribute - If blank, the value of
the attribute defined in 'Group Member Attribute' is expected to be the full dn
of the user. If not blank, this property will define the attribute of the user
LDAP entry that the value of the attribute defined in 'Group Member Attribute'
is referencing (i.e. uid). Use of this property requires that 'User Search
Base' is also configured. (i.e. member: cn=User 1,ou=users,o=nifi vs.
memberUid: user1)</p>
</li>
</ul>
</div>
@@ -1149,7 +1181,7 @@ The default AccessPolicyProvider is the
</li>
<li>
<p>Authorizations File - The file where the FileAccessPolicyProvider will
store policies.
-By default, <em>authorizations.xml</em> in the <em>conf</em> directory is
chosen.</p>
+By default, 'authorizations.xml' in the 'conf' directory is chosen.</p>
</li>
<li>
<p>Initial Admin Identity - The identity of an initial admin user that will be
granted access to the UI and given the ability to create additional users,
groups, and policies.
@@ -1186,13 +1218,13 @@ Changes to the configured Initial Admin
<div class="sect3">
<h4 id="initial-admin-identity"><a class="anchor"
href="administration-guide.html#initial-admin-identity"></a>Initial Admin
Identity (New NiFi Registry Instance)</h4>
<div class="paragraph">
-<p>If you are setting up a secured NiFi Registry instance for the first time,
you must manually designate an âInitial Admin Identityâ in the
<em>authorizers.xml</em> file.
+<p>If you are setting up a secured NiFi Registry instance for the first time,
you must manually designate an âInitial Admin Identityâ in the
'authorizers.xml' file.
This initial admin user is granted access to the UI and given the ability to
create additional users, groups, and policies.
The value of this property could be a certificate DN , LDAP identity (DN or
username), or a Kerberos principal.
If you are the NiFi Registry administrator, add yourself as the âInitial
Admin Identityâ.</p>
</div>
<div class="paragraph">
-<p>Here is an example LDAP entry using the name John Smith:</p>
+<p>Here is an example certificate DN entry using the name John Smith:</p>
</div>
<div class="listingblock">
<div class="content">
@@ -1255,8 +1287,8 @@ If you are the NiFi Registry administrat
</div>
</div>
<div class="paragraph">
-<p>After you have edited and saved the <em>authorizers.xml</em> file, restart
NiFi Registry.
-The <em>users.xml</em> and <em>authorizations.xml</em> files will be created,
and the âInitial Admin Identityâ user and administrative policies are added
during start up.
+<p>After you have edited and saved the 'authorizers.xml' file, restart NiFi
Registry.
+The 'users.xml' and 'authorizations.xml' files will be created, and the
âInitial Admin Identityâ user and administrative policies are added during
start up.
Once NiFi Registry starts, the âInitial Admin Identityâ user is able to
access the UI and begin managing users, groups, and policies.</p>
</div>
<div class="admonitionblock note">
@@ -1345,6 +1377,7 @@ member: cn=User 2,ou=users,o=nifi</pre>
<property name="User Search Filter"></property>
<property name="User Identity Attribute">cn</property>
<property name="User Group Name Attribute"></property>
+ <property name="User Group Name Attribute - Referenced Group
Attribute"></property>
<property name="Group Search
Base">ou=groups,o=nifi</property>
<property name="Group Object Class">groupOfNames</property>
@@ -1352,6 +1385,7 @@ member: cn=User 2,ou=users,o=nifi</pre>
<property name="Group Search Filter"></property>
<property name="Group Name Attribute">cn</property>
<property name="Group Member Attribute">member</property>
+ <property name="Group Member Attribute - Referenced User
Attribute"></property>
</userGroupProvider>
<accessPolicyProvider>
@@ -1372,7 +1406,7 @@ member: cn=User 2,ou=users,o=nifi</pre>
</div>
</div>
<div class="paragraph">
-<p>The <em>Initial Admin Identity</em> value would have loaded from the cn of
the User 1 entry based on the <em>User Identity Attribute</em> value.</p>
+<p>The 'Initial Admin Identity' value would have loaded from the cn of the
User 1 entry based on the 'User Identity Attribute' value.</p>
</div>
<div class="paragraph">
<p>Here is an example composite implementation loading users and groups from
LDAP and a local file. Group membership will be driven through
@@ -1422,6 +1456,7 @@ the member attribute of each group. The
<property name="User Search Filter"></property>
<property name="User Identity Attribute">cn</property>
<property name="User Group Name Attribute"></property>
+ <property name="User Group Name Attribute - Referenced Group
Attribute"></property>
<property name="Group Search
Base">ou=groups,o=nifi</property>
<property name="Group Object Class">groupOfNames</property>
@@ -1429,6 +1464,7 @@ the member attribute of each group. The
<property name="Group Search Filter"></property>
<property name="Group Name Attribute">cn</property>
<property name="Group Member Attribute">member</property>
+ <property name="Group Member Attribute - Referenced User
Attribute"></property>
</userGroupProvider>
<userGroupProvider>
@@ -1457,9 +1493,9 @@ the member attribute of each group. The
</div>
</div>
<div class="paragraph">
-<p>In this example, the users and groups are loaded from LDAP but the servers
are managed in a local file. The <em>Initial Admin Identity</em> value came
-from an attribute in a LDAP entry based on the <em>User Identity
Attribute</em>. The <em>NiFi Identity</em> values are established in the local
file using the
-<em>Initial User Identity</em> properties.</p>
+<p>In this example, the users and groups are loaded from LDAP but the servers
are managed in a local file. The 'Initial Admin Identity' value came
+from an attribute in a LDAP entry based on the 'User Identity Attribute'. The
'NiFi Identity' values are established in the local file using the
+'Initial User Identity' properties.</p>
</div>
</div>
</div>
@@ -1497,7 +1533,7 @@ assume you have downloaded the binary fo
</div>
<div class="listingblock">
<div class="content">
-<pre>./bin/encrypt-config nifi-registry [options]</pre>
+<pre>./bin/encrypt-config --nifiRegistry [options]</pre>
</div>
</div>
<div class="ulist">
@@ -1547,7 +1583,7 @@ assume you have downloaded the binary fo
</ul>
</div>
<div class="paragraph">
-<p>As an example of how the tool works, assuming that you have installed the
tool on a machine supporting 256-bit encryption and with the following existing
values in the <em>nifi-registry.properties</em> file:</p>
+<p>As an example of how the tool works, assuming that you have installed the
tool on a machine supporting 256-bit encryption and with the following existing
values in the 'nifi-registry.properties' file:</p>
</div>
<div class="listingblock">
<div class="content">
@@ -1573,7 +1609,7 @@ nifi.registry.security.truststorePasswd=
</div>
</div>
<div class="paragraph">
-<p>As a result, the <em>nifi-registry.properties</em> file is overwritten with
protected properties and sibling encryption identifiers
(<code>aes/gcm/256</code>, the currently supported algorithm):</p>
+<p>As a result, the 'nifi-registry.properties' file is overwritten with
protected properties and sibling encryption identifiers
(<code>aes/gcm/256</code>, the currently supported algorithm):</p>
</div>
<div class="listingblock">
<div class="content">
@@ -1590,7 +1626,7 @@ nifi.registry.security.truststorePasswd=
</div>
</div>
<div class="paragraph">
-<p>When applied to <em>identity-providers.xml</em> or
<em>authorizers.xml</em>, the property elements are updated with an
<code>encryption</code> attribute. For example:</p>
+<p>When applied to 'identity-providers.xml' or 'authorizers.xml', the property
elements are updated with an <code>encryption</code> attribute. For example:</p>
</div>
<div class="listingblock">
<div class="content">
@@ -1609,7 +1645,7 @@ nifi.registry.security.truststorePasswd=
</div>
</div>
<div class="paragraph">
-<p>Additionally, the <em>bootstrap.conf</em> file is updated with the
encryption key as follows:</p>
+<p>Additionally, the 'bootstrap.conf' file is updated with the encryption key
as follows:</p>
</div>
<div class="listingblock">
<div class="content">
@@ -1622,15 +1658,15 @@ nifi.registry.bootstrap.sensitive.key=01
To encrypt additional properties, specify them as comma-separated values in
the <code>nifi.registry.sensitive.props.additional.keys</code> property.</p>
</div>
<div class="paragraph">
-<p>If the <em>nifi-registry.properties</em> file already has valid protected
values and you wish to protect additional values using the
-same master key already present in your <em>bootstrap.conf</em>, then run the
tool without specifying a new key:</p>
+<p>If the 'nifi-registry.properties' file already has valid protected values
and you wish to protect additional values using the
+same master key already present in your 'bootstrap.conf', then run the tool
without specifying a new key:</p>
</div>
<div class="listingblock">
<div class="content">
<pre># bootstrap.conf already contains master key property
# nifi-registy.properties has been updated for
nifi.registry.sensitive.props.additional.keys=...
-./bin/encrypt-config.sh nifi-registry -b bootstrap.conf -r
nifi-registry.properties</pre>
+./bin/encrypt-config.sh --nifiRegistry -b bootstrap.conf -r
nifi-registry.properties</pre>
</div>
</div>
</div>
@@ -1639,7 +1675,7 @@ same master key already present in your
<div class="paragraph">
<p>In order to change the key used to encrypt the sensitive values, provide
the new key or password using the <code>-k</code> or <code>-p</code> flags as
usual,
and provide the existing key or password using <code>--old-key</code> or
<code>--old-password</code> respectively. This will allow the toolkit to
decrypt the
-existing values and re-encrypt them, and update <em>bootstrap.conf</em> with
the new key. Only one of the key or password needs to be specified
+existing values and re-encrypt them, and update 'bootstrap.conf' with the new
key. Only one of the key or password needs to be specified
for each phase (old vs. new), and any combination is sufficient:</p>
</div>
<div class="ulist">
@@ -1686,7 +1722,7 @@ for each phase (old vs. new), and any co
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p
class="tableblock">run.as</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The
username to run NiFi Registry as. For instance, if NiFi Registry should be run
as the <em>nifi_registry</em> user, setting this value to
<em>nifi_registry</em> will cause the NiFi Registry Process to be run as the
<em>nifi_registry</em> user. This property is ignored on Windows. For Linux,
the specified user may require sudo permissions.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The
username to run NiFi Registry as. For instance, if NiFi Registry should be run
as the 'nifi_registry' user, setting this value to 'nifi_registry' will cause
the NiFi Registry Process to be run as the 'nifi_registry' user. This property
is ignored on Windows. For Linux, the specified user may require sudo
permissions.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p
class="tableblock">lib.dir</p></td>
@@ -1722,7 +1758,7 @@ That way all context paths are passed th
</li>
<li>
<p>If NiFi Registry is running securely, any proxy needs to be authorized to
proxy user requests. These can be configured in the NiFi Registry UI through the
-Users administration section, by selecting <em>Proxy</em> for the given user.
Once these permissions are in place, proxies can begin proxying user requests.
+Users administration section, by selecting 'Proxy' for the given user. Once
these permissions are in place, proxies can begin proxying user requests.
The end user identity must be relayed in a HTTP header. For example, if the
end user sent a request to the proxy, the proxy must authenticate the user.
Following
this the proxy can send the request to NiFi Registry. In this request an HTTP
header should be added as follows.</p>
</li>
@@ -1775,7 +1811,7 @@ Please refer the documentation of the pr
<div class="paragraph">
<p>NiFi Registry can be configured to use Kerberos SPNEGO (or "Kerberos
Service") for authentication. In this scenario, users will hit the REST
endpoint <code>/access/token/kerberos</code>
and the server will respond with a <code>401</code> status code and the
challenge response header <code>WWW-Authenticate: Negotiate</code>. This
communicates to the browser to use the GSS-API
-and load the user’s Kerberos ticket and provide it as a Base64-encoded
header value in the subsequent request. It will be of the form
<code>Authorization: Negotiate YII...</code>.
+and load the user’s Kerberos ticket and provide it as a Base64-encoded
header value in the subsequent request. It will be of the form
<code>Authorization: Negotiate YII…​</code>.
NiFi Registry will attempt to validate this ticket with the KDC. If it is
successful, the user’s <em>principal</em> will be returned as the
identity, and the flow will follow
login/credential authentication, in that a JWT will be issued in the response
to prevent the unnecessary overhead of Kerberos authentication on every
subsequent request.
If the ticket cannot be validated, it will return with the appropriate error
response code. The user will then be able to provide their Kerberos credentials
to the login
@@ -1797,13 +1833,13 @@ Check the case sensitivity of the servic
</li>
<li>
<p>Browsers have varying levels of restriction when dealing with SPNEGO
negotiations.
-Some will provide the local Kerberos ticket to any domain that requests it,
while others whitelist the trusted domains. See <a
href="http://docs.spring.io/autorepo/docs/spring-security-kerberos/1.0.2.BUILD-SNAPSHOT/reference/htmlsingle/#browserspnegoconfig">Spring
Security Kerberos - Reference Documentation: Appendix E. Configure browsers
for SPNEGO Negotiation</a> for common browsers.</p>
+Some will provide the local Kerberos ticket to any domain that requests it,
while others whitelist the trusted domains. See <a
href="http://docs.spring.io/autorepo/docs/spring-security-kerberos/1.0.2.BUILD-SNAPSHOT/reference/htmlsingle/#browserspnegoconfig"
target="_blank">Spring Security Kerberos - Reference Documentation: Appendix
E. Configure browsers for SPNEGO Negotiation</a> for common browsers.</p>
</li>
<li>
<p>Some browsers (legacy IE) do not support recent encryption algorithms such
as AES, and are restricted to legacy algorithms (DES). This should be noted
when generating keytabs.</p>
</li>
<li>
-<p>The KDC must be configured and a service principal defined for NiFi and a
keytab exported. Comprehensive instructions for Kerberos server configuration
and administration are beyond the scope of this document (see <a
href="http://web.mit.edu/kerberos/krb5-current/doc/admin/index.html">MIT
Kerberos Admin Guide</a>), but an example is below:</p>
+<p>The KDC must be configured and a service principal defined for NiFi and a
keytab exported. Comprehensive instructions for Kerberos server configuration
and administration are beyond the scope of this document (see <a
href="http://web.mit.edu/kerberos/krb5-current/doc/admin/index.html"
target="_blank">MIT Kerberos Admin Guide</a>), but an example is below:</p>
</li>
<li>
<p>Kerberos tickets may use AES encryption with keys up to 256-bits in length,
and therefore unlimited strength encryption policies may be required for the
Jave Runtime Environment (JRE) used for NiFi Registry when Kerberos SPNEGO is
configured.</p>
@@ -1965,7 +2001,7 @@ Security Configuration section of this A
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p
class="tableblock">nifi.registry.security.identity.providers.configuration.file</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">This is
the location of the file that specifies how username/password authentication is
performed. This file is only considered if
<code>nifi.registry.security.identity.provider</code> is configured with a
provider identifier. The default value is
./conf/identity-providers.xml.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">This is
the location of the file that specifies how username/password authentication is
performed. This file is only considered if
<code>nifi.registry.security.identity.provider</code> is configured with a
provider identifier. The default value is
<code>./conf/identity-providers.xml</code>.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p
class="tableblock">nifi.registry.security.identity.provider</p></td>
@@ -1978,7 +2014,7 @@ Security Configuration section of this A
<h3 id="providers-properties"><a class="anchor"
href="administration-guide.html#providers-properties"></a>Providers
Properties</h3>
<div class="paragraph">
<p>These properties pertain to flow persistence providers. NiFi Registry uses
a pluggable flow persistence provider to store the
-content of the flows saved to the registry. NiFi Registry provides the
<code>FileSystemFlowPersistenceProvider</code>.</p>
+content of the flows saved to the registry. For further details on persistence
providers, refer <a
href="administration-guide.html#persistence-providers">Persistence
Providers</a>.</p>
</div>
<table class="tableblock frame-all grid-all spread">
<colgroup>
@@ -2002,6 +2038,9 @@ content of the flows saved to the regist
<div class="paragraph">
<p>These properties define the settings for the Registry database, which keeps
track of metadata about buckets and all items stored in buckets.</p>
</div>
+<div class="paragraph">
+<p>The 0.1.0 release leveraged an embedded H2 database that was configured via
the following properties:</p>
+</div>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 50%;">
@@ -2022,6 +2061,64 @@ content of the flows saved to the regist
</tr>
</tbody>
</table>
+<div class="paragraph">
+<p>The 0.2.0 release introduced a more flexible approach which allows
leveraging an external database. This new approach
+is configured via the following properties:</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><strong>Property</strong></p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><strong>Description</strong></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p
class="tableblock">nifi.registry.db.url</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The full
JDBC connection string. The default value will specify a new H2 database in the
same location as the previous one. For example,
'jdbc:h2:./database/nifi-registry-primary;'.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p
class="tableblock">nifi.registry.db.driver.class</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The class
name of the JDBC driver. The default value is 'org.h2.Driver'.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p
class="tableblock">nifi.registry.db.driver.directory</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">An
optional directory containing one or more JARs to add to the classpath. If not
specified, it is assumed that the driver JAR is already on the classpath by
copying it to the lib directory. The H2 driver is bundled with Registry so it
is not necessary to do anything for the default case.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p
class="tableblock">nifi.registry.db.driver.username</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The
username for the database. The default value is 'nifireg'.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p
class="tableblock">nifi.registry.db.driver.password</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The
password for the database. The default value is 'nifireg'.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p
class="tableblock">nifi.registry.db.driver.maxConnections</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The max
number of connections for the connection pool. The default value is
'5'.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p
class="tableblock">nifi.registry.db.sql.debug</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Whether or
not enable debug logging for SQL statements. The default value is
'false'.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+When upgrading from 0.1.0 to a future version, if 'nifi.registry.db.directory'
remains populated, the application will
+attempt to migrate the data from the original database to the new database
specified with the new properties. This will only
+happen the first time the application starts with the new database properties.
+</td>
+</tr>
+</table>
+</div>
</div>
<div class="sect2">
<h3 id="extension-directories"><a class="anchor"
href="administration-guide.html#extension-directories"></a>Extension
Directories</h3>
@@ -2097,10 +2194,290 @@ Providing 2 total locations, including <
</div>
</div>
</div>
+<div class="sect1">
+<h2 id="persistence-providers"><a class="anchor"
href="administration-guide.html#persistence-providers"></a>Persistence
Providers</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>NiFi Registry uses a pluggable flow persistence provider to store the
content of the flows saved to the registry. NiFi Registry provides <code><a
href="administration-guide.html#filesystemflowpersistenceprovider">FileSystemFlowPersistenceProvider</a></code>
and <code><a
href="administration-guide.html#gitflowpersistenceprovider">GitFlowPersistenceProvider</a></code>.</p>
+</div>
+<div class="paragraph">
+<p>Each persistence provider has its own configuration parameters, those can
be configured in a XML file specified in <a
href="administration-guide.html#providers-properties">nifi-registry.properties</a>.</p>
+</div>
+<div class="paragraph">
+<p>The XML configuration file looks like below. It has a
<code>flowPersistenceProvider</code> element in which qualified class name of a
persistence provider implementation and its configuration properties are
defined. See following sections for available configurations for each
provider.</p>
+</div>
+<div class="listingblock">
+<div class="title">Example providers.xml</div>
+<div class="content">
+<pre class="highlight"><code class="language-xml" data-lang="xml"><?xml
version="1.0" encoding="UTF-8" standalone="yes"?>
+<providers>
+
+ <flowPersistenceProvider>
+ <class>persistence-provider-qualified-class-name</class>
+ <property name="property-1">property-value-1</property>
+ <property name="property-2">property-value-2</property>
+ <property name="property-n">property-value-n</property>
+ </flowPersistenceProvider>
+
+</providers></code></pre>
+</div>
+</div>
+<div class="sect2">
+<h3 id="filesystemflowpersistenceprovider"><a class="anchor"
href="administration-guide.html#filesystemflowpersistenceprovider"></a>FileSystemFlowPersistenceProvider</h3>
+<div class="paragraph">
+<p>FileSystemFlowPersistenceProvider simply stores serialized Flow contents
into <code>{bucket-id}/{flow-id}/{version}</code> directories.</p>
+</div>
+<div class="paragraph">
+<p>Example of persisted files:</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>Flow Storage Directory/
+âââ {bucket-id}/
+â âââ {flow-id}/
+â âââ {version}/{version}.snapshot
+âââ d1beba88-32e9-45d1-bfe9-057cc41f7ce8/
+ âââ 219cf539-427f-43be-9294-0644fb07ca63/
+ âââ 1/1.snapshot
+ âââ 2/2.snapshot</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Qualified class name:
<code>org.apache.nifi.registry.provider.flow.FileSystemFlowPersistenceProvider</code></p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><strong>Property</strong></p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><strong>Description</strong></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Flow
Storage Directory</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">REQUIRED:
File system path for a directory where flow contents files are persisted to. If
the directory does not exist when NiFi Registry starts, it will be created. If
the directory exists, it must be readable and writable from NiFi
Registry.</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="gitflowpersistenceprovider"><a class="anchor"
href="administration-guide.html#gitflowpersistenceprovider"></a>GitFlowPersistenceProvider</h3>
+<div class="paragraph">
+<p>GitFlowPersistenceProvider stores flow contents under a Git directory.</p>
+</div>
+<div class="paragraph">
+<p>In contrast to FileSystemFlowPersistenceProvider, this provider uses human
friendly Bucket and Flow names so that those files can be accessed by external
tools. However, it is NOT supported to modify stored files outside of NiFi
Registry. Persisted files are only read when NiFi Registry starts up.</p>
+</div>
+<div class="paragraph">
+<p>Buckets are represented as directories and Flow contents are stored as
files in a Bucket directory they belong to. Flow snapshot histories are managed
as Git commits, meaning only the latest version of Buckets and Flows exist in
the Git directory. Old versions are retrieved from Git commit histories.</p>
+</div>
+<div class="literalblock">
+<div class="title">Example persisted files</div>
+<div class="content">
+<pre>Flow Storage Directory/
+âââ .git/
+âââ Bucket_A/
+â âââ bucket.yml
+â âââ Flow_1.snapshot
+â âââ Flow_2.snapshot
+âââ Bucket_B/
+ âââ bucket.yml
+ âââ Flow_4.snapshot</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Each Bucket directory contains a YAML file named <code>bucket.yml</code>.
The file manages links from NiFi Registry Bucket and Flow IDs to actual
directory and file names. When NiFi Registry starts, this provider reads
through Git commit histories and lookup these <code>bucket.yml</code> files to
restore Buckets and Flows for each snapshot version.</p>
+</div>
+<div class="listingblock">
+<div class="title">Example bucket.yml</div>
+<div class="content">
+<pre class="highlight"><code class="language-yml" data-lang="yml">layoutVer: 1
+bucketId: d1beba88-32e9-45d1-bfe9-057cc41f7ce8
+flows:
+ 219cf539-427f-43be-9294-0644fb07ca63: {ver: 7, file: Flow_1.snapshot}
+ 22cccb6c-3011-4493-a996-611f8f112969: {ver: 3, file:
Flow_2.snapshot}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Qualified class name:
<code>org.apache.nifi.registry.provider.flow.git.GitFlowPersistenceProvider</code></p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><strong>Property</strong></p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><strong>Description</strong></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Flow
Storage Directory</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">REQUIRED:
File system path for a directory where flow contents files are persisted to.
The directory must exist when NiFi registry starts. Also must be initialized as
a Git directory. See <a
href="administration-guide.html#initialize-git-directory">Initialize Git
directory</a> for detail.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Remote To
Push</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">When a new
flow snapshot is created, this persistence provider updated files in the
specified Git directory, then create a commit to the local repository. If
<code>Remote To Push</code> is defined, it also pushes to the specified remote
repository. E.g. 'origin'. To define more detailed remote spec such as branch
names, use <code>Refspec</code>. See <a
href="https://git-scm.com/book/en/v2/Git-Internals-The-Refspec"
class="bare">https://git-scm.com/book/en/v2/Git-Internals-The-Refspec</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Remote
Access User</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">This user
name is used to make push requests to the remote repository when <code>Remote
To Push</code> is enabled, and the remote repository is accessed by HTTP
protocol. If SSH is used, user authentication is done with SSH keys.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Remote
Access Password</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Used with
<code>Remote Access User</code>.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="sect3">
+<h4 id="initialize-git-directory"><a class="anchor"
href="administration-guide.html#initialize-git-directory"></a>Initialize Git
directory</h4>
+<div class="paragraph">
+<p>In order to use GitFlowPersistenceRepository, you need to prepare a Git
directory on the local file system. You can do so by initializing a directory
with <code>git init</code> command, or clone an existing Git project from a
remote Git repository by <code>git clone</code> command.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Git init command
+<a href="https://git-scm.com/docs/git-init"
class="bare">https://git-scm.com/docs/git-init</a></p>
+</li>
+<li>
+<p>Git clone command
+<a href="https://git-scm.com/docs/git-clone"
class="bare">https://git-scm.com/docs/git-clone</a></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="git-user-configuration"><a class="anchor"
href="administration-guide.html#git-user-configuration"></a>Git user
configuration</h4>
+<div class="paragraph">
+<p>This persistence provider uses preconfigured Git user name and user email
address when it creates Git commits. NiFi Registry user name is added to commit
messages.</p>
+</div>
+<div class="literalblock">
+<div class="title">Example commit</div>
+<div class="content">
+<pre>commit 774d4bd125f2b1200f0a5ee1f1e9fedc6a415e83
+Author: git-user <[email protected]>
+Date: Tue May 8 14:30:31 2018 +0900
+
+ Commit message.
+
+ By NiFi Registry user: nifi-registry-user-1</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>You can configure Git user name and email address by <code>git
config</code> command.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Git config command
+<a href="https://git-scm.com/docs/git-config"
class="bare">https://git-scm.com/docs/git-config</a></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="git-user-authentication"><a class="anchor"
href="administration-guide.html#git-user-authentication"></a>Git user
authentication</h4>
+<div class="paragraph">
+<p>By default, this persistence repository only create commits to local
repository. No user authentication is needed to do so. However, if 'Commit To
Push' is enabled, user authentication to the remote Git repository is
required.</p>
+</div>
+<div class="paragraph">
+<p>If the remote repository is accessed by HTTP, then username and password
for authentication can be configured in the providers XML configuration
file.</p>
+</div>
+<div class="paragraph">
+<p>When SSH is used, SSH keys are used to identify a Git user. In order to
pick the right key to a remote server, the SSH configuration file
<code>${USER_HOME}/.ssh/config</code> is used. The SSH configuration file can
contain multiple <code>Host</code> entries to specify a key file to login to a
remote Git server. The <code>Host</code> must much with the target remote Git
server hostname.</p>
+</div>
+<div class="literalblock">
+<div class="title">example SSH config file</div>
+<div class="content">
+<pre>Host git.example.com
+ HostName git.example.com
+ IdentityFile ~/.ssh/id_rsa
+
+Host github.com
+ HostName github.com
+ IdentityFile ~/.ssh/key-for-github
+
+Host bitbucket.org
+ HostName bitbucket.org
+ IdentityFile ~/.ssh/key-for-bitbucket</pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="switching-from-other-persistence-provider"><a class="anchor"
href="administration-guide.html#switching-from-other-persistence-provider"></a>Switching
from other Persistence Provider</h3>
+<div class="paragraph">
+<p>In order to switch Persistence Provider to use, it is necessary to reset
NiFi Registry.
+For example, to switch from FileSystemFlowPersistenceProvider to
GitFlowPersistenceProvider, follow these steps:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>Stop version control on all ProcessGroups in NiFi</p>
+</li>
+<li>
+<p>Stop NiFi Registry</p>
+</li>
+<li>
+<p>Move the H2 DB (specified as <code>nifi.registry.db.directory</code> in
nifi-registry.properties) and 'Flow Storage Directory' for
FileSystemFlowPersistenceProvider directories somewhere for back up</p>
+</li>
+<li>
+<p>Configure GitFlowPersistenceProvider provider in providers.xml</p>
+</li>
+<li>
+<p>Start NiFi Registry</p>
+</li>
+<li>
+<p>Recreate any buckets</p>
+</li>
+<li>
+<p>Start version control on all ProcessGroups again</p>
+</li>
+</ol>
+</div>
+</div>
+<div class="sect2">
+<h3 id="data-model-version-of-serialized-flow-snapshots"><a class="anchor"
href="administration-guide.html#data-model-version-of-serialized-flow-snapshots"></a>Data
model version of serialized Flow snapshots</h3>
+<div class="paragraph">
+<p>Serialized Flow snapshots saved by these persistence providers have
versions, so that the data format and schema can evolve over time. Data model
version update is done automatically by NiFi Registry when it reads and stores
each Flow content.</p>
+</div>
+<div class="paragraph">
+<p>Here is the data model version histories:</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 33%;">
+<col style="width: 33%;">
+<col style="width: 33%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><strong>Data model version</strong></p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><strong>Since NiFi Registry</strong></p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><strong>Description</strong></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock">0.2</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">JSON
formatted text file. The root object contains header and Flow content
object.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">1</p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock">0.1</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Binary
format having header bytes at the beginning followed by Flow content
represented as XML.</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
</div>
<div id="footer">
<div id="footer-text">
-Last updated 2017-12-28 12:45:10 -05:00
+Last updated 2018-06-16 08:37:12 -04:00
</div>
</div>
</body>