Skip to content

Commit

Permalink
[NIFI-13034] Change Component Version (apache#8653)
Browse files Browse the repository at this point in the history
* [NIFI-13034] - Change Processor version

* Change controller service version

* Change version of reporting task and flow analysis rule

* add missing license header

* fix for updating parameter context when in clustered mode.

* review feedback - collapse 2 actions for opening change component version into 1

* update DocumentedType comparison logic

This closes apache#8653
  • Loading branch information
rfellows authored Apr 17, 2024
1 parent 5eccc4c commit 20ec806
Show file tree
Hide file tree
Showing 34 changed files with 799 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,21 +22,24 @@ import { CanvasState } from '../state';
import {
centerSelectedComponents,
deleteComponents,
downloadFlow,
enterProcessGroup,
getParameterContextsAndOpenGroupComponentsDialog,
goToRemoteProcessGroup,
leaveProcessGroup,
moveComponents,
moveToFront,
navigateToAdvancedProcessorUi,
navigateToComponent,
navigateToControllerServicesForProcessGroup,
navigateToAdvancedProcessorUi,
navigateToEditComponent,
navigateToEditCurrentProcessGroup,
navigateToManageComponentPolicies,
navigateToManageRemotePorts,
navigateToProvenanceForComponent,
navigateToQueueListing,
navigateToViewStatusHistoryForComponent,
openChangeProcessorVersionDialog,
openChangeVersionDialogRequest,
openCommitLocalChangesDialogRequest,
openForceCommitLocalChangesDialogRequest,
Expand All @@ -51,9 +54,7 @@ import {
startCurrentProcessGroup,
stopComponents,
stopCurrentProcessGroup,
stopVersionControlRequest,
downloadFlow,
moveToFront
stopVersionControlRequest
} from '../state/flow/flow.actions';
import { ComponentType } from '../../../state/shared';
import {
Expand Down Expand Up @@ -970,14 +971,24 @@ export class CanvasContextMenu implements ContextMenuDefinitionProvider {
}
},
{
condition: (selection: any) => {
// TODO - canChangeProcessorVersion
return false;
condition: (selection: d3.Selection<any, any, any, any>) => {
return this.canvasUtils.canChangeProcessorVersion(selection);
},
clazz: 'fa fa-exchange',
text: 'Change version',
action: () => {
// TODO - changeVersion
action: (selection: d3.Selection<any, any, any, any>) => {
const data = selection.datum();
this.store.dispatch(
openChangeProcessorVersionDialog({
request: {
id: data.component.id,
uri: data.uri,
revision: data.revision,
type: data.component.type,
bundle: data.component.bundle
}
})
);
}
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1712,6 +1712,33 @@ export class CanvasUtils {
return false;
}

/**
* Determines whether the current selection is a processor with more than one version.
*
* @argument {d3.Selection} selection The selection
* @returns {boolean}
*/
public canChangeProcessorVersion(selection: d3.Selection<any, any, any, any>): boolean {
if (selection.size() !== 1) {
return false;
}

if (!this.canRead(selection) || !this.canModify(selection)) {
return false;
}

if (this.isProcessor(selection)) {
const data = selection.datum();
const supportsModification = !(
data.status.aggregateSnapshot.runStatus === 'Running' ||
data.status.aggregateSnapshot.activeThreadCount > 0
);

return supportsModification && data.component.multipleVersionsAvailable;
}
return false;
}

public canMoveToFront(selection: d3.Selection<any, any, any, any>): boolean {
// ensure the correct number of components are selected
if (selection.size() !== 1) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import {
CreateControllerServiceRequest,
DisableControllerServiceDialogRequest,
EditControllerServiceDialogRequest,
FetchComponentVersionsRequest,
SetEnableControllerServiceDialogRequest
} from '../../../../state/shared';

Expand Down Expand Up @@ -121,3 +122,8 @@ export const selectControllerService = createAction(
'[Controller Services] Select Controller Service',
props<{ request: SelectControllerServiceRequest }>()
);

export const openChangeControllerServiceVersionDialog = createAction(
`[Controller Services] Open Change Controller Service Version Dialog`,
props<{ request: FetchComponentVersionsRequest }>()
);
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import { EditControllerService } from '../../../../ui/common/controller-service/
import {
ComponentType,
ControllerServiceReferencingComponent,
OpenChangeComponentVersionDialogRequest,
EditControllerServiceDialogRequest,
UpdateControllerServiceRequest
} from '../../../../state/shared';
Expand All @@ -49,6 +50,8 @@ import { ErrorHelper } from '../../../../service/error-helper.service';
import { HttpErrorResponse } from '@angular/common/http';
import { ParameterHelperService } from '../../service/parameter-helper.service';
import { LARGE_DIALOG, SMALL_DIALOG, XL_DIALOG } from '../../../../index';
import { ExtensionTypesService } from '../../../../service/extension-types.service';
import { ChangeComponentVersionDialog } from '../../../../ui/common/change-component-version-dialog/change-component-version-dialog';

@Injectable()
export class ControllerServicesEffects {
Expand All @@ -61,7 +64,8 @@ export class ControllerServicesEffects {
private dialog: MatDialog,
private router: Router,
private propertyTableHelperService: PropertyTableHelperService,
private parameterHelperService: ParameterHelperService
private parameterHelperService: ParameterHelperService,
private extensionTypesService: ExtensionTypesService
) {}

loadControllerServices$ = createEffect(() =>
Expand Down Expand Up @@ -551,6 +555,58 @@ export class ControllerServicesEffects {
{ dispatch: false }
);

openChangeControllerServiceVersionDialog$ = createEffect(
() =>
this.actions$.pipe(
ofType(ControllerServicesActions.openChangeControllerServiceVersionDialog),
map((action) => action.request),
switchMap((request) =>
from(
this.extensionTypesService.getControllerServiceVersionsForType(request.type, request.bundle)
).pipe(
map(
(response) =>
({
fetchRequest: request,
componentVersions: response.controllerServiceTypes
}) as OpenChangeComponentVersionDialogRequest
),
tap({
error: (errorResponse: HttpErrorResponse) => {
this.store.dispatch(ErrorActions.snackBarError({ error: errorResponse.error }));
}
})
)
),
tap((request) => {
const dialogRequest = this.dialog.open(ChangeComponentVersionDialog, {
...LARGE_DIALOG,
data: request
});

dialogRequest.componentInstance.changeVersion.pipe(take(1)).subscribe((newVersion) => {
this.store.dispatch(
ControllerServicesActions.configureControllerService({
request: {
id: request.fetchRequest.id,
uri: request.fetchRequest.uri,
payload: {
component: {
bundle: newVersion.bundle,
id: request.fetchRequest.id
},
revision: request.fetchRequest.revision
}
}
})
);
dialogRequest.close();
});
})
),
{ dispatch: false }
);

private getRouteForReference(reference: ControllerServiceReferencingComponent): string[] {
if (reference.referenceType == 'ControllerService') {
if (reference.groupId == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ import {
VersionControlInformationEntity
} from './index';
import { StatusHistoryRequest } from '../../../../state/status-history';
import { FetchComponentVersionsRequest } from '../../../../state/shared';

const CANVAS_PREFIX = '[Canvas]';

Expand Down Expand Up @@ -769,3 +770,8 @@ export const downloadFlow = createAction(
);

export const moveToFront = createAction(`${CANVAS_PREFIX} Move To Front`, props<{ request: MoveToFrontRequest }>());

export const openChangeProcessorVersionDialog = createAction(
`${CANVAS_PREFIX} Open Change Processor Version Dialog`,
props<{ request: FetchComponentVersionsRequest }>()
);
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ import {
BucketEntity,
ComponentType,
isDefinedAndNotNull,
OpenChangeComponentVersionDialogRequest,
RegistryClientEntity,
VersionedFlowEntity,
VersionedFlowSnapshotMetadataEntity
Expand Down Expand Up @@ -116,6 +117,8 @@ import { ChangeVersionDialog } from '../../ui/canvas/items/flow/change-version-d
import { ChangeVersionProgressDialog } from '../../ui/canvas/items/flow/change-version-progress-dialog/change-version-progress-dialog';
import { LocalChangesDialog } from '../../ui/canvas/items/flow/local-changes-dialog/local-changes-dialog';
import { ClusterConnectionService } from '../../../../service/cluster-connection.service';
import { ExtensionTypesService } from '../../../../service/extension-types.service';
import { ChangeComponentVersionDialog } from '../../../../ui/common/change-component-version-dialog/change-component-version-dialog';

@Injectable()
export class FlowEffects {
Expand All @@ -134,7 +137,8 @@ export class FlowEffects {
private router: Router,
private dialog: MatDialog,
private propertyTableHelperService: PropertyTableHelperService,
private parameterHelperService: ParameterHelperService
private parameterHelperService: ParameterHelperService,
private extensionTypesService: ExtensionTypesService
) {}

reloadFlow$ = createEffect(() =>
Expand Down Expand Up @@ -3199,4 +3203,55 @@ export class FlowEffects {
})
)
);

openChangeProcessorVersionDialog$ = createEffect(
() =>
this.actions$.pipe(
ofType(FlowActions.openChangeProcessorVersionDialog),
map((action) => action.request),
switchMap((request) =>
from(this.extensionTypesService.getProcessorVersionsForType(request.type, request.bundle)).pipe(
map(
(response) =>
({
fetchRequest: request,
componentVersions: response.processorTypes
}) as OpenChangeComponentVersionDialogRequest
),
tap({
error: (errorResponse: HttpErrorResponse) => {
this.store.dispatch(FlowActions.flowSnackbarError({ error: errorResponse.error }));
}
})
)
),
tap((request) => {
const dialogRequest = this.dialog.open(ChangeComponentVersionDialog, {
...LARGE_DIALOG,
data: request
});

dialogRequest.componentInstance.changeVersion.pipe(take(1)).subscribe((newVersion) => {
this.store.dispatch(
FlowActions.updateProcessor({
request: {
id: request.fetchRequest.id,
uri: request.fetchRequest.uri,
type: ComponentType.Processor,
payload: {
component: {
bundle: newVersion.bundle,
id: request.fetchRequest.id
},
revision: request.fetchRequest.revision
}
}
})
);
dialogRequest.close();
});
})
),
{ dispatch: false }
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ <h3 class="text-xl bold primary-color">Controller Services</h3>
(enableControllerService)="enableControllerService($event)"
(disableControllerService)="disableControllerService($event)"
(viewStateControllerService)="viewStateControllerService($event)"
(changeControllerServiceVersion)="changeControllerServiceVersion($event)"
(deleteControllerService)="deleteControllerService($event)"></controller-service-table>
</div>
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import {
loadControllerServices,
navigateToAdvancedServiceUi,
navigateToEditService,
openChangeControllerServiceVersionDialog,
openConfigureControllerServiceDialog,
openDisableControllerServiceDialog,
openEnableControllerServiceDialog,
Expand Down Expand Up @@ -228,6 +229,20 @@ export class ControllerServices implements OnInit, OnDestroy {
);
}

changeControllerServiceVersion(entity: ControllerServiceEntity): void {
this.store.dispatch(
openChangeControllerServiceVersionDialog({
request: {
id: entity.id,
bundle: entity.component.bundle,
uri: entity.uri,
type: entity.component.type,
revision: entity.revision
}
})
);
}

deleteControllerService(entity: ControllerServiceEntity): void {
this.store.dispatch(
promptControllerServiceDeletion({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ export class EditParameterContext {
const payload: any = {
revision: this.client.getRevision(pc),
disconnectedNodeAcknowledged: this.clusterConnectionService.isDisconnectionAcknowledged(),
id: pc.id,
component: {
id: pc.id,
name: this.editParameterContextForm.get('name')?.value,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,15 @@ import {
CreateFlowAnalysisRuleSuccess,
DeleteFlowAnalysisRuleRequest,
DeleteFlowAnalysisRuleSuccess,
EditFlowAnalysisRuleDialogRequest,
LoadFlowAnalysisRulesResponse,
SelectFlowAnalysisRuleRequest,
DisableFlowAnalysisRuleRequest,
DisableFlowAnalysisRuleSuccess,
EditFlowAnalysisRuleDialogRequest,
EnableFlowAnalysisRuleRequest,
EnableFlowAnalysisRuleSuccess,
DisableFlowAnalysisRuleSuccess
LoadFlowAnalysisRulesResponse,
SelectFlowAnalysisRuleRequest
} from './index';
import { FetchComponentVersionsRequest } from '../../../../state/shared';

export const resetFlowAnalysisRulesState = createAction('[Flow Analysis Rules] Reset Flow Analysis Rules State');

Expand Down Expand Up @@ -126,3 +127,8 @@ export const selectFlowAnalysisRule = createAction(
'[Flow Analysis Rules] Select Flow Analysis Rule',
props<{ request: SelectFlowAnalysisRuleRequest }>()
);

export const openChangeFlowAnalysisRuleVersionDialog = createAction(
`[Flow Analysis Rules] Open Change Flow Analysis Rule Version Dialog`,
props<{ request: FetchComponentVersionsRequest }>()
);
Loading

0 comments on commit 20ec806

Please sign in to comment.