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

rfellows 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 2cd4624825 NIFI-13299: (#8894)
2cd4624825 is described below

commit 2cd462482567e6be13cbee71b80d942933f0b68f
Author: Matt Gilman <[email protected]>
AuthorDate: Wed May 29 16:23:15 2024 -0400

    NIFI-13299: (#8894)
    
    - Adding min validators where appropriate.
    
    This closes #8894
---
 .../create-connection.component.html               | 60 +++++++++++++++++++---
 .../create-connection.component.ts                 |  5 +-
 .../edit-connection/edit-connection.component.html |  3 +-
 .../edit-connection/edit-connection.component.ts   |  5 +-
 .../edit-processor/edit-processor.component.html   |  3 +-
 .../edit-processor/edit-processor.component.ts     | 50 +++++++++++++++---
 .../relationship-settings.component.html           |  5 +-
 7 files changed, 113 insertions(+), 18 deletions(-)

diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/create-connection/create-connection.component.html
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/create-connection/create-connection.component.html
index 2626d70b1c..f06a5111f4 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/create-connection/create-connection.component.html
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/create-connection/create-connection.component.html
@@ -100,20 +100,45 @@
                             </div>
                             <div>
                                 <mat-form-field>
-                                    <mat-label>FlowFile Expiration</mat-label>
+                                    <mat-label>
+                                        FlowFile Expiration
+                                        <i
+                                            class="fa fa-info-circle"
+                                            nifiTooltip
+                                            [tooltipComponentType]="TextTip"
+                                            tooltipInputData="The maximum 
amount of time an object may be in the flow before it will be automatically 
aged out of the flow."></i>
+                                    </mat-label>
                                     <input matInput 
formControlName="flowFileExpiration" type="text" />
                                 </mat-form-field>
                             </div>
                             <div class="flex gap-x-2">
                                 <div class="w-full">
                                     <mat-form-field>
-                                        <mat-label>Back Pressure Object 
Threshold</mat-label>
-                                        <input matInput 
formControlName="backPressureObjectThreshold" type="number" />
+                                        <mat-label>
+                                            Back Pressure Object Threshold
+                                            <i
+                                                class="fa fa-info-circle"
+                                                nifiTooltip
+                                                
[tooltipComponentType]="TextTip"
+                                                tooltipInputData="The maximum 
number of objects that can be queued before back pressure is applied. Must be a 
non-negative integer."></i>
+                                        </mat-label>
+                                        <input
+                                            matInput
+                                            
formControlName="backPressureObjectThreshold"
+                                            type="number"
+                                            min="0" />
                                     </mat-form-field>
                                 </div>
                                 <div class="w-full">
                                     <mat-form-field>
-                                        <mat-label>Size Threshold</mat-label>
+                                        <mat-label>
+                                            Size Threshold
+                                            <i
+                                                class="fa fa-info-circle"
+                                                nifiTooltip
+                                                
[tooltipComponentType]="TextTip"
+                                                tooltipInputData="The maximum 
data size of objects that can be queued before back pressure is applied."></i>
+                                        </mat-label>
                                         <input matInput 
formControlName="backPressureDataSizeThreshold" type="text" />
                                     </mat-form-field>
                                 </div>
@@ -121,7 +146,14 @@
                             <div class="flex gap-x-2">
                                 <div class="w-full">
                                     <mat-form-field>
-                                        <mat-label>Load Balance 
Strategy</mat-label>
+                                        <mat-label>
+                                            Load Balance Strategy
+                                            <i
+                                                class="fa fa-info-circle"
+                                                nifiTooltip
+                                                
[tooltipComponentType]="TextTip"
+                                                tooltipInputData="How to load 
balance the data in this Connection across the nodes in the cluster."></i>
+                                        </mat-label>
                                         <mat-select
                                             
formControlName="loadBalanceStrategy"
                                             
(selectionChange)="loadBalanceChanged($event.value)">
@@ -141,7 +173,14 @@
                                 @if (loadBalancePartitionAttributeRequired) {
                                     <div class="w-full">
                                         <mat-form-field>
-                                            <mat-label>Attribute 
Name</mat-label>
+                                            <mat-label>
+                                                Attribute Name
+                                                <i
+                                                    class="fa fa-info-circle"
+                                                    nifiTooltip
+                                                    
[tooltipComponentType]="TextTip"
+                                                    tooltipInputData="The 
FlowFile Attribute to use for determining which node a FlowFile will go 
to."></i>
+                                            </mat-label>
                                             <input matInput 
formControlName="partitionAttribute" type="text" />
                                         </mat-form-field>
                                     </div>
@@ -150,7 +189,14 @@
                             @if (loadBalanceCompressionRequired) {
                                 <div>
                                     <mat-form-field>
-                                        <mat-label>Load Balance 
Compression</mat-label>
+                                        <mat-label>
+                                            Load Balance Compression
+                                            <i
+                                                class="fa fa-info-circle"
+                                                nifiTooltip
+                                                
[tooltipComponentType]="TextTip"
+                                                tooltipInputData="Whether or 
not data should be compressed when being transferred between nodes in the 
cluster."></i>
+                                        </mat-label>
                                         <mat-select 
formControlName="compression">
                                             @for (option of 
loadBalanceCompressionStrategies; track option) {
                                                 <mat-option
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/create-connection/create-connection.component.ts
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/create-connection/create-connection.component.ts
index fd0f9cc2c9..c9f70ff4c4 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/create-connection/create-connection.component.ts
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/create-connection/create-connection.component.ts
@@ -152,7 +152,10 @@ export class CreateConnection extends CloseOnEscapeDialog {
         this.createConnectionForm = this.formBuilder.group({
             name: new FormControl(''),
             flowFileExpiration: new 
FormControl(dialogRequest.defaults.flowfileExpiration, Validators.required),
-            backPressureObjectThreshold: new 
FormControl(dialogRequest.defaults.objectThreshold, Validators.required),
+            backPressureObjectThreshold: new 
FormControl(dialogRequest.defaults.objectThreshold, [
+                Validators.required,
+                Validators.min(0)
+            ]),
             backPressureDataSizeThreshold: new FormControl(
                 dialogRequest.defaults.dataSizeThreshold,
                 Validators.required
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/edit-connection/edit-connection.component.html
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/edit-connection/edit-connection.component.html
index d836a2a159..0f8f1a575a 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/edit-connection/edit-connection.component.html
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/edit-connection/edit-connection.component.html
@@ -135,12 +135,13 @@
                                             class="fa fa-info-circle"
                                             nifiTooltip
                                             [tooltipComponentType]="TextTip"
-                                            tooltipInputData="The maximum 
number of objects that can be queued before back pressure is applied."></i>
+                                            tooltipInputData="The maximum 
number of objects that can be queued before back pressure is applied. Must be a 
non-negative integer."></i>
                                     </mat-label>
                                     <input
                                         matInput
                                         
formControlName="backPressureObjectThreshold"
                                         type="number"
+                                        min="0"
                                         [readonly]="connectionReadonly || 
sourceReadonly || destinationReadonly" />
                                 </mat-form-field>
                             </div>
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/edit-connection/edit-connection.component.ts
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/edit-connection/edit-connection.component.ts
index 87de6ec284..20fb3b118c 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/edit-connection/edit-connection.component.ts
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/connection/edit-connection/edit-connection.component.ts
@@ -264,7 +264,10 @@ export class EditConnectionComponent extends TabbedDialog {
         this.editConnectionForm = this.formBuilder.group({
             name: new FormControl(connection.name),
             flowFileExpiration: new FormControl(connection.flowFileExpiration, 
Validators.required),
-            backPressureObjectThreshold: new 
FormControl(connection.backPressureObjectThreshold, Validators.required),
+            backPressureObjectThreshold: new 
FormControl(connection.backPressureObjectThreshold, [
+                Validators.required,
+                Validators.min(0)
+            ]),
             backPressureDataSizeThreshold: new FormControl(
                 connection.backPressureDataSizeThreshold,
                 Validators.required
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.html
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.html
index 1574f57510..ac8c23d9b7 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.html
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.html
@@ -151,7 +151,7 @@
                                             class="fa fa-info-circle"
                                             nifiTooltip
                                             [tooltipComponentType]="TextTip"
-                                            tooltipInputData="The number of 
tasks that should be concurrently scheduled for this processor."></i>
+                                            tooltipInputData="The number of 
tasks that should be concurrently scheduled for this processor. Must be an 
integer greater than 0."></i>
                                     </mat-label>
                                     <input
                                         matInput
@@ -159,6 +159,7 @@
                                         (change)="concurrentTasksChanged()"
                                         name="concurrentTasks"
                                         type="number"
+                                        min="1"
                                         [readonly]="readonly" />
                                 </mat-form-field>
                             </div>
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.ts
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.ts
index b435ecc61b..4a272c0012 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.ts
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/edit-processor.component.ts
@@ -17,7 +17,16 @@
 
 import { Component, EventEmitter, Inject, Input, Output } from '@angular/core';
 import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
-import { AbstractControl, FormBuilder, FormControl, FormGroup, 
ReactiveFormsModule, Validators } from '@angular/forms';
+import {
+    AbstractControl,
+    FormBuilder,
+    FormControl,
+    FormGroup,
+    ReactiveFormsModule,
+    ValidationErrors,
+    ValidatorFn,
+    Validators
+} from '@angular/forms';
 import { MatInputModule } from '@angular/material/input';
 import { MatCheckboxModule } from '@angular/material/checkbox';
 import { MatButtonModule } from '@angular/material/button';
@@ -226,14 +235,14 @@ export class EditProcessor extends TabbedDialog {
             yieldDuration: new 
FormControl(request.entity.component.config.yieldDuration, Validators.required),
             bulletinLevel: new 
FormControl(request.entity.component.config.bulletinLevel, Validators.required),
             schedulingStrategy: new FormControl(this.schedulingStrategy, 
Validators.required),
-            concurrentTasks: new FormControl(concurrentTasks, 
Validators.required),
+            concurrentTasks: new FormControl(concurrentTasks, 
[Validators.required, Validators.min(1)]),
             schedulingPeriod: new FormControl(schedulingPeriod, 
Validators.required),
             executionNode: new 
FormControl(request.entity.component.config.executionNode, Validators.required),
             properties: new FormControl({ value: properties, disabled: 
this.readonly }),
-            relationshipConfiguration: new FormControl(
-                { value: relationshipConfiguration, disabled: this.readonly },
-                Validators.required
-            ),
+            relationshipConfiguration: new FormControl({ value: 
relationshipConfiguration, disabled: this.readonly }, [
+                Validators.required,
+                this.relationshipConfigurationValidator()
+            ]),
             comments: new FormControl(request.entity.component.config.comments)
         });
 
@@ -245,6 +254,35 @@ export class EditProcessor extends TabbedDialog {
         }
     }
 
+    private relationshipConfigurationValidator(): ValidatorFn {
+        return (control: AbstractControl): ValidationErrors | null => {
+            const relationshipConfiguration: RelationshipConfiguration = 
control.value;
+            const retried: string[] = relationshipConfiguration.relationships
+                .filter((relationship) => relationship.retry)
+                .map((relationship) => relationship.name);
+
+            if (retried.length > 0) {
+                let hasErrors = false;
+                const errors: ValidationErrors = {};
+
+                if (relationshipConfiguration.retryCount == null || 
relationshipConfiguration.retryCount < 0) {
+                    errors['invalidRetry'] = true;
+                    hasErrors = true;
+                }
+                if 
(this.nifiCommon.isBlank(relationshipConfiguration.maxBackoffPeriod)) {
+                    errors['invalidBackoff'] = true;
+                    hasErrors = true;
+                }
+
+                if (hasErrors) {
+                    return errors;
+                }
+            }
+
+            return null;
+        };
+    }
+
     supportsBatching(): boolean {
         return this.request.entity.component.supportsBatching == true;
     }
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/relationship-settings/relationship-settings.component.html
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/relationship-settings/relationship-settings.component.html
index 7d63cc8472..7e80e7122c 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/relationship-settings/relationship-settings.component.html
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/processor/edit-processor/relationship-settings/relationship-settings.component.html
@@ -71,14 +71,16 @@
                                 class="fa fa-info-circle"
                                 nifiTooltip
                                 [tooltipComponentType]="TextTip"
-                                tooltipInputData="For relationships set to 
retry, this number indicates how many times a FlowFile will attempt to 
reprocess before it is routed elsewhere."></i>
+                                tooltipInputData="For relationships set to 
retry, this number indicates how many times a FlowFile will attempt to 
reprocess before it is routed elsewhere. Must be a non-negative integer."></i>
                         </mat-label>
                         <input
                             matInput
                             [(ngModel)]="retryCount"
                             type="number"
+                            min="0"
                             name="retryCount"
                             (keyup)="handleChanged()"
+                            [required]="true"
                             [readonly]="isDisabled" />
                     </mat-form-field>
                 </div>
@@ -115,6 +117,7 @@
                             [(ngModel)]="maxBackoffPeriod"
                             type="text"
                             (keyup)="handleChanged()"
+                            [required]="true"
                             [readonly]="isDisabled" />
                     </mat-form-field>
                 </div>

Reply via email to