This is an automated email from the ASF dual-hosted git repository.

exceptionfactory pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 77431d2597 NIFI-14645 Toolkit CLI - improve change version for 
versioned PG and PG listing (#10002)
77431d2597 is described below

commit 77431d25971b2bd013007c5c06f646f6b5c803ce
Author: Pierre Villard <[email protected]>
AuthorDate: Wed Jun 11 04:40:32 2025 +0200

    NIFI-14645 Toolkit CLI - improve change version for versioned PG and PG 
listing (#10002)
    
    - Add recursive flag support to PG List command
    - Fix PG Change Version to account for the branch feature
    - Made optional the Flow ID in PG Change All Versions so that it is 
possible to upgrade all versioned flows to the latest available version
    - Fix Upload Bundles command when recursive flag is set
    - Add version control state to Process Groups Result to show if a process 
group is versioned and if yes, what's the associated state
    - Add branch name to Version Control Info Result to show the branch name, 
if any
    
    Signed-off-by: David Handermann <[email protected]>
---
 .../impl/command/nifi/pg/PGChangeAllVersions.java  | 50 ++++++++++++++++------
 .../cli/impl/command/nifi/pg/PGChangeVersion.java  |  3 +-
 .../toolkit/cli/impl/command/nifi/pg/PGList.java   | 18 +++++++-
 .../command/registry/extension/UploadBundles.java  |  2 +-
 .../cli/impl/result/nifi/ProcessGroupsResult.java  |  4 +-
 .../nifi/ProcessGroupsVersionChangeResult.java     |  4 +-
 .../impl/result/nifi/VersionControlInfoResult.java |  2 +
 7 files changed, 63 insertions(+), 20 deletions(-)

diff --git 
a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGChangeAllVersions.java
 
b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGChangeAllVersions.java
index dee471522f..a2e7a19d0f 100644
--- 
a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGChangeAllVersions.java
+++ 
b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGChangeAllVersions.java
@@ -51,10 +51,12 @@ public class PGChangeAllVersions extends 
AbstractNiFiCommand<ProcessGroupsVersio
     public String getDescription() {
         return "Changes the version for all of the controlled process group 
instances for a given flow ID. "
                 + "This can be used to upgrade all the instances of a 
versioned flow to a new version, or "
-                + "revert to a previous version. If no version is specified, 
the latest version will be used. "
-                + "If no process group ID is provided, the root process group 
will be used to recursively "
-                + "search for all instances of the Flow ID. It is possible to 
force the recursive operation "
-                + "and not stop the operation in case the upgrade of a process 
group fails.";
+                + "revert to a previous version. If no flow ID is specified, 
all versioned process groups will "
+                + "be upgraded to the latest version. If a flow ID is 
specified and if no version is specified, "
+                + "the latest version will be used. If no process group ID is 
provided, the root process group "
+                + "will be used to recursively search for all instances of the 
Flow ID (or any process group "
+                + "with versioned control information). It is possible to 
force the recursive operation and not "
+                + "stop the operation in case the upgrade of a process group 
fails.";
     }
 
     @Override
@@ -70,7 +72,7 @@ public class PGChangeAllVersions extends 
AbstractNiFiCommand<ProcessGroupsVersio
             throws NiFiClientException, IOException, MissingOptionException, 
CommandException {
 
         final FlowClient flowClient = client.getFlowClient();
-        final String flowId = getRequiredArg(properties, 
CommandOption.FLOW_ID);
+        final String flowId = getArg(properties, CommandOption.FLOW_ID);
 
         // get the optional id of the parent PG, otherwise fallback to the 
root group
         String parentPgId = getArg(properties, CommandOption.PG_ID);
@@ -86,6 +88,9 @@ public class PGChangeAllVersions extends 
AbstractNiFiCommand<ProcessGroupsVersio
 
         // new version, if specified in the arguments
         String newVersion = getArg(properties, CommandOption.FLOW_VERSION);
+        if (newVersion != null && flowId == null) {
+            throw new CommandException("If a version is specified, then a flow 
ID must also be specified.");
+        }
 
         // force operation, if specified in the arguments
         final boolean forceOperation = 
properties.containsKey(CommandOption.FORCE.getLongName());
@@ -96,21 +101,38 @@ public class PGChangeAllVersions extends 
AbstractNiFiCommand<ProcessGroupsVersio
         for (final ProcessGroupDTO pgDTO : pgList) {
             final VersionControlInformationEntity entity = 
client.getVersionsClient().getVersionControlInfo(pgDTO.getId());
 
-            if (entity.getVersionControlInformation() == null || 
!entity.getVersionControlInformation().getFlowId().equals(flowId)) {
-                continue; // the process group is not version controlled or 
does not match the provided
-                          // Flow ID
-            }
-
-            if (newVersion == null) {
-                newVersion = doPGChangeVersion.getLatestVersion(client, 
entity.getVersionControlInformation());
+            if (entity.getVersionControlInformation() == null || (flowId != 
null && !entity.getVersionControlInformation().getFlowId().equals(flowId))) {
+                // the process group is not version controlled or does not 
match the provided
+                // Flow ID
+                continue;
             }
 
+            final String previousVersion = 
pgDTO.getVersionControlInformation().getVersion();
             processGroups.add(pgDTO);
 
-            final String previousVersion = 
pgDTO.getVersionControlInformation().getVersion();
+            if (newVersion == null || flowId == null) {
+                try {
+                    newVersion = doPGChangeVersion.getLatestVersion(client, 
entity.getVersionControlInformation());
+                } catch (Exception e) {
+                    changeVersionResults.put(pgDTO.getId(), new 
ChangeVersionResult(previousVersion, null, e.getMessage()));
+                    if (forceOperation) {
+                        continue;
+                    } else {
+                        e.printStackTrace();
+                        break;
+                    }
+                }
+            }
+
             if (previousVersion.equals(newVersion)) {
                 changeVersionResults.put(pgDTO.getId(), new 
ChangeVersionResult(newVersion, newVersion, "Process group already at desired 
version"));
-                continue; // Process group already at desired version
+                continue;
+            }
+
+            final String currentState = 
entity.getVersionControlInformation().getState();
+            if (!"STALE".equals(currentState)) {
+                changeVersionResults.put(pgDTO.getId(), new 
ChangeVersionResult(previousVersion, newVersion, "Process group cannot be 
upgraded because current state is " + currentState));
+                continue;
             }
 
             try {
diff --git 
a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGChangeVersion.java
 
b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGChangeVersion.java
index 17cce7e000..02782eed4e 100644
--- 
a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGChangeVersion.java
+++ 
b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGChangeVersion.java
@@ -145,8 +145,9 @@ public class PGChangeVersion extends 
AbstractNiFiCommand<VoidResult> {
         final String registryId = existingVersionControlDTO.getRegistryId();
         final String bucketId = existingVersionControlDTO.getBucketId();
         final String flowId = existingVersionControlDTO.getFlowId();
+        final String branch = existingVersionControlDTO.getBranch();
 
-        final VersionedFlowSnapshotMetadataSetEntity versions = 
flowClient.getVersions(registryId, bucketId, flowId);
+        final VersionedFlowSnapshotMetadataSetEntity versions = 
flowClient.getVersions(registryId, bucketId, flowId, branch);
         if (versions.getVersionedFlowSnapshotMetadataSet() == null || 
versions.getVersionedFlowSnapshotMetadataSet().isEmpty()) {
             throw new NiFiClientException("No versions available");
         }
diff --git 
a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGList.java
 
b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGList.java
index 9203fbb75a..ebcef2ff05 100644
--- 
a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGList.java
+++ 
b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGList.java
@@ -52,6 +52,7 @@ public class PGList extends 
AbstractNiFiCommand<ProcessGroupsResult> {
     @Override
     protected void doInitialize(Context context) {
         addOption(CommandOption.PG_ID.createOption());
+        addOption(CommandOption.RECURSIVE.createOption());
     }
 
     @Override
@@ -59,6 +60,7 @@ public class PGList extends 
AbstractNiFiCommand<ProcessGroupsResult> {
             throws NiFiClientException, IOException {
 
         final FlowClient flowClient = client.getFlowClient();
+        final boolean recursive = 
properties.containsKey(CommandOption.RECURSIVE.getLongName());
 
         // get the optional id of the parent PG, otherwise fallback to the 
root group
         String parentPgId = getArg(properties, CommandOption.PG_ID);
@@ -66,7 +68,21 @@ public class PGList extends 
AbstractNiFiCommand<ProcessGroupsResult> {
             parentPgId = flowClient.getRootGroupId();
         }
 
-        return getList(client, properties, parentPgId);
+        if (recursive) {
+            final List<ProcessGroupDTO> pgList = new ArrayList<>();
+            recursivePGList(pgList, client, properties, parentPgId);
+            return new ProcessGroupsResult(getResultType(properties), pgList);
+        } else {
+            return getList(client, properties, parentPgId);
+        }
+    }
+
+    private void recursivePGList(final List<ProcessGroupDTO> pgList, final 
NiFiClient client, final Properties properties, final String pgId) throws 
NiFiClientException, IOException {
+        final ProcessGroupsResult result = getList(client, properties, pgId);
+        for (ProcessGroupDTO pgDTO : result.getResult()) {
+            pgList.add(pgDTO);
+            recursivePGList(pgList, client, properties, pgDTO.getId());
+        }
     }
 
     public ProcessGroupsResult getList(final NiFiClient client, final 
Properties properties, final String pgID)
diff --git 
a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/registry/extension/UploadBundles.java
 
b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/registry/extension/UploadBundles.java
index b17eedddff..1d2292f719 100644
--- 
a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/registry/extension/UploadBundles.java
+++ 
b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/registry/extension/UploadBundles.java
@@ -66,7 +66,7 @@ public class UploadBundles extends 
AbstractNiFiRegistryCommand<StringResult> {
         final String bucketId = getRequiredArg(properties, 
CommandOption.BUCKET_ID);
         final String bundleDir = getRequiredArg(properties, 
CommandOption.EXT_BUNDLE_DIR);
         final String fileExtension = getArg(properties, 
CommandOption.FILE_EXTENSION);
-        final boolean recursive = 
properties.containsKey(CommandOption.RECURSIVE);
+        final boolean recursive = 
properties.containsKey(CommandOption.RECURSIVE.getLongName());
         final boolean skipSha256 = 
properties.containsKey(CommandOption.SKIP_SHA_256.getLongName());
         final boolean verbose = isVerbose(properties);
 
diff --git 
a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/result/nifi/ProcessGroupsResult.java
 
b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/result/nifi/ProcessGroupsResult.java
index 6986072295..48a488706a 100644
--- 
a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/result/nifi/ProcessGroupsResult.java
+++ 
b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/result/nifi/ProcessGroupsResult.java
@@ -65,6 +65,7 @@ public class ProcessGroupsResult extends 
AbstractWritableResult<List<ProcessGrou
                 .column("Stopped", 7, 7, false)
                 .column("Disabled", 8, 8, false)
                 .column("Invalid", 7, 7, false)
+                .column("Version Control", 36, 36, false)
                 .build();
 
         for (int i = 0; i < processGroups.size(); i++) {
@@ -76,7 +77,8 @@ public class ProcessGroupsResult extends 
AbstractWritableResult<List<ProcessGrou
                     String.valueOf(dto.getRunningCount()),
                     String.valueOf(dto.getStoppedCount()),
                     String.valueOf(dto.getDisabledCount()),
-                    String.valueOf(dto.getInvalidCount())
+                    String.valueOf(dto.getInvalidCount()),
+                    dto.getVersionControlInformation() != null ? 
dto.getVersionControlInformation().getState() : "N/A"
             );
         }
 
diff --git 
a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/result/nifi/ProcessGroupsVersionChangeResult.java
 
b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/result/nifi/ProcessGroupsVersionChangeResult.java
index 5a01ba11e2..45646fd745 100644
--- 
a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/result/nifi/ProcessGroupsVersionChangeResult.java
+++ 
b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/result/nifi/ProcessGroupsVersionChangeResult.java
@@ -64,8 +64,8 @@ public class ProcessGroupsVersionChangeResult extends 
AbstractWritableResult<Lis
                 .column("#", 3, 3, false)
                 .column("Name", 20, 36, true)
                 .column("Id", 36, 36, false)
-                .column("Prev Version", 15, 15, false)
-                .column("New Version", 15, 15, false)
+                .column("Prev Version", 45, 45, false)
+                .column("New Version", 45, 45, false)
                 .column("Message", 100, 100, false)
                 .build();
 
diff --git 
a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/result/nifi/VersionControlInfoResult.java
 
b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/result/nifi/VersionControlInfoResult.java
index 2ad39c1a77..c5a8d2e15f 100644
--- 
a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/result/nifi/VersionControlInfoResult.java
+++ 
b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/result/nifi/VersionControlInfoResult.java
@@ -56,6 +56,7 @@ public class VersionControlInfoResult extends 
AbstractWritableResult<VersionCont
                 .column("Registry", 20, 30, true)
                 .column("Bucket", 20, 30, true)
                 .column("Flow", 20, 30, true)
+                .column("Branch", 20, 30, true)
                 .column("Ver", 3, 3, false)
                 .build();
 
@@ -63,6 +64,7 @@ public class VersionControlInfoResult extends 
AbstractWritableResult<VersionCont
                 dto.getRegistryName(),
                 dto.getBucketName(),
                 dto.getFlowName(),
+                dto.getBranch(),
                 String.valueOf(dto.getVersion())
         );
 

Reply via email to