This is an automated email from the ASF dual-hosted git repository.
rmerriman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/metron.git
The following commit(s) were added to refs/heads/master by this push:
new 64b0790 METRON-1654 findOne request after an alert patch returns with
the original state of the alert item (merrimanr) closes apache/metron#1344
64b0790 is described below
commit 64b079044f6840fc0bcb1bf9cb665790f37900f4
Author: merrimanr <[email protected]>
AuthorDate: Wed Apr 10 10:58:04 2019 -0500
METRON-1654 findOne request after an alert patch returns with the original
state of the alert item (merrimanr) closes apache/metron#1344
---
.../alert-details/alert-details.component.spec.ts | 36 +++++++++++++--
.../alert-details/alert-details.component.ts | 53 ++++++----------------
.../alerts/alerts-list/alerts-list.component.ts | 31 ++++++-------
.../alerts-list/table-view/table-view.component.ts | 8 ++++
.../alerts-list/tree-view/tree-view.component.ts | 24 +++++-----
.../src/app/service/meta-alert.service.ts | 25 +++++-----
.../src/app/service/update.service.ts | 26 ++++++-----
7 files changed, 108 insertions(+), 95 deletions(-)
diff --git
a/metron-interface/metron-alerts/src/app/alerts/alert-details/alert-details.component.spec.ts
b/metron-interface/metron-alerts/src/app/alerts/alert-details/alert-details.component.spec.ts
index b875613..7800517 100644
---
a/metron-interface/metron-alerts/src/app/alerts/alert-details/alert-details.component.spec.ts
+++
b/metron-interface/metron-alerts/src/app/alerts/alert-details/alert-details.component.spec.ts
@@ -35,10 +35,14 @@ import { By } from '@angular/platform-browser';
import { AlertComment } from './alert-comment';
import { Subject } from 'rxjs';
import { ConfirmationType } from 'app/model/confirmation-type';
+import {CommentAddRemoveRequest} from "../../model/comment-add-remove-request";
+import {AlertSource} from "../../model/alert-source";
+import {of} from "rxjs/index";
describe('AlertDetailsComponent', () => {
let component: AlertDetailsComponent;
let fixture: ComponentFixture<AlertDetailsComponent>;
+ let updateService: UpdateService;
beforeEach(async(() => {
TestBed.configureTestingModule({
@@ -83,14 +87,26 @@ describe('AlertDetailsComponent', () => {
beforeEach(() => {
fixture = TestBed.createComponent(AlertDetailsComponent);
component = fixture.componentInstance;
+ updateService = fixture.debugElement.injector.get(UpdateService);
fixture.detectChanges();
});
it('should delete a comment.', fakeAsync(() => {
+ const responseMock = new AlertSource();
+ responseMock.guid = 'guid';
+ const removeCommentSpy = spyOn(updateService,
'removeComment').and.returnValue(
+ of(responseMock)
+ );
+ const setAlertSpy = spyOn(component, 'setAlert');
+
expect(component).toBeTruthy();
+ component.alertSource = new AlertSource();
+ component.alertSource.guid = 'guid';
+ component.alertSourceType = 'sourceType';
+ const now = Date.now();
component.alertCommentsWrapper = [
new AlertCommentWrapper(
- new AlertComment('lorem ipsum', 'user', Date.now()),
+ new AlertComment('lorem ipsum', 'user', now),
(new Date()).toString()
)
];
@@ -101,8 +117,20 @@ describe('AlertDetailsComponent', () => {
deleteComment.nativeElement.click();
tick(500);
fixture.detectChanges();
- expect(component.alertCommentsWrapper.length).toEqual(0);
- const comments =
fixture.debugElement.queryAll(By.css('[data-qe-id="comment"]'));
- expect(comments.length).toEqual(0);
+
+ const expectedCommentRequest = new CommentAddRemoveRequest();
+ expectedCommentRequest.guid = 'guid';
+ expectedCommentRequest.comment = 'lorem ipsum';
+ expectedCommentRequest.username = 'user';
+ expectedCommentRequest.sensorType = 'sourceType';
+ expectedCommentRequest.timestamp = now;
+
+ const expectedAlertSource = new AlertSource();
+ expectedAlertSource.guid = 'guid';
+
+ expect(removeCommentSpy).toHaveBeenCalledWith(expectedCommentRequest);
+ expect(removeCommentSpy).toHaveBeenCalledTimes(1);
+ expect(setAlertSpy).toHaveBeenCalledWith(expectedAlertSource);
+ expect(setAlertSpy).toHaveBeenCalledTimes(1);
}));
});
diff --git
a/metron-interface/metron-alerts/src/app/alerts/alert-details/alert-details.component.ts
b/metron-interface/metron-alerts/src/app/alerts/alert-details/alert-details.component.ts
index 73458a6..f5c55fa 100644
---
a/metron-interface/metron-alerts/src/app/alerts/alert-details/alert-details.component.ts
+++
b/metron-interface/metron-alerts/src/app/alerts/alert-details/alert-details.component.ts
@@ -98,7 +98,6 @@ export class AlertDetailsComponent implements OnInit {
this.alertCommentStr = '';
this.searchService.getAlert(this.alertSourceType,
this.alertId).subscribe(alertSource => {
this.setAlert(alertSource);
- this.setComments(alertSource['comments'] || []);
});
}
@@ -106,11 +105,9 @@ export class AlertDetailsComponent implements OnInit {
this.alertSource = alertSource;
this.alertSources = (alertSource.metron_alert &&
alertSource.metron_alert.length > 0) ? alertSource.metron_alert : [alertSource];
this.selectedAlertState = this.getAlertState(alertSource['alert_status']);
- }
-
- setComments(alertComments) {
+ let alertComments = alertSource['comments'] || [];
this.alertCommentsWrapper = alertComments.map(alertComment =>
- new AlertCommentWrapper(alertComment, moment(new
Date(alertComment.timestamp)).fromNow()));
+ new AlertCommentWrapper(alertComment, moment(new
Date(alertComment.timestamp)).fromNow()));
}
getAlertState(alertStatus) {
@@ -177,12 +174,8 @@ export class AlertDetailsComponent implements OnInit {
let tAlert = new Alert();
tAlert.source = this.alertSource;
- let previousAlertStatus = this.alertSource['alert_status'];
- this.alertSource['alert_status'] = state;
- this.setAlert(this.alertSource);
- this.updateService.updateAlertState([tAlert], state).subscribe(() => {},
() => {
- this.alertSource['alert_status'] = previousAlertStatus;
- this.setAlert(this.alertSource);
+ this.updateService.updateAlertState([tAlert], state).subscribe(alertSource
=> {
+ this.setAlert(alertSource[0]);
});
}
@@ -200,36 +193,25 @@ export class AlertDetailsComponent implements OnInit {
patchRequest.sensorType = 'metaalert';
patchRequest.patch = [new Patch('add', '/name', this.alertName)];
- let previousName = this.alertSource['name'];
- this.alertSource['name'] = this.alertName;
- this.updateService.patch(patchRequest).subscribe(rep => {
+ this.updateService.patch(patchRequest).subscribe(alertSource => {
+ this.setAlert(alertSource);
this.toggleNameEditor();
}, () => {
- this.alertSource['name'] = previousName;
- this.alertName = previousName;
this.toggleNameEditor();
});
}
}
onAddComment() {
- let newComment = new AlertComment(this.alertCommentStr,
this.authenticationService.getCurrentUserName(), new Date().getTime());
- let alertComments = this.alertCommentsWrapper.map(alertsWrapper =>
alertsWrapper.alertComment);
- alertComments.unshift(newComment);
- this.setComments(alertComments);
let commentRequest = new CommentAddRemoveRequest();
commentRequest.guid = this.alertSource.guid;
commentRequest.comment = this.alertCommentStr;
commentRequest.username = this.authenticationService.getCurrentUserName();
commentRequest.timestamp = new Date().getTime();
commentRequest.sensorType = this.alertSourceType;
- this.updateService.addComment(commentRequest).subscribe(
- () => {},
- () => {
- let previousComments = this.alertCommentsWrapper.map(alertsWrapper
=> alertsWrapper.alertComment)
- .filter(alertComment => alertComment !== newComment);
- this.setComments(previousComments);
- });
+ this.updateService.addComment(commentRequest).subscribe(alertSource => {
+ this.setAlert(alertSource);
+ });
}
patchAlert(patch: Patch, onPatchError) {
@@ -252,20 +234,15 @@ export class AlertDetailsComponent implements OnInit {
const confirmedSubscription =
this.dialogService.launchDialog(commentText).subscribe(action => {
if (action === ConfirmationType.Confirmed) {
- let deletedCommentWrapper = this.alertCommentsWrapper.splice(index,
1)[0];
let commentRequest = new CommentAddRemoveRequest();
commentRequest.guid = this.alertSource.guid;
- commentRequest.comment = deletedCommentWrapper.alertComment.comment;
- commentRequest.username = deletedCommentWrapper.alertComment.username;
- commentRequest.timestamp =
deletedCommentWrapper.alertComment.timestamp;
+ commentRequest.comment =
this.alertCommentsWrapper[index].alertComment.comment;
+ commentRequest.username =
this.alertCommentsWrapper[index].alertComment.username;
+ commentRequest.timestamp =
this.alertCommentsWrapper[index].alertComment.timestamp;
commentRequest.sensorType = this.alertSourceType;
- this.updateService.removeComment(commentRequest).subscribe(
- null,
- () => {
- // add the deleted comment back
- this.alertCommentsWrapper.unshift(deletedCommentWrapper);
- this.alertCommentsWrapper.sort((a, b) =>
b.alertComment.timestamp - a.alertComment.timestamp);
- });
+ this.updateService.removeComment(commentRequest).subscribe(alertSource
=> {
+ this.setAlert(alertSource);
+ });
}
confirmedSubscription.unsubscribe();
});
diff --git
a/metron-interface/metron-alerts/src/app/alerts/alerts-list/alerts-list.component.ts
b/metron-interface/metron-alerts/src/app/alerts/alerts-list/alerts-list.component.ts
index e743359..87c5aaa 100644
---
a/metron-interface/metron-alerts/src/app/alerts/alerts-list/alerts-list.component.ts
+++
b/metron-interface/metron-alerts/src/app/alerts/alerts-list/alerts-list.component.ts
@@ -47,6 +47,7 @@ import { GlobalConfigService } from
'../../service/global-config.service';
import { DialogService } from 'app/service/dialog.service';
import { DialogType } from 'app/model/dialog-type';
import { Utils } from 'app/utils/utils';
+import {AlertSource} from "../../model/alert-source";
@Component({
selector: 'app-alerts-list',
@@ -104,12 +105,15 @@ export class AlertsListComponent implements OnInit,
OnDestroy {
}
addAlertChangedListner() {
- this.metaAlertsService.alertChanged$.subscribe(metaAlertAddRemoveRequest
=> {
- this.updateAlert(META_ALERTS_SENSOR_TYPE,
metaAlertAddRemoveRequest.metaAlertGuid, (metaAlertAddRemoveRequest.alerts ===
null));
+ this.metaAlertsService.alertChanged$.subscribe(alertSource => {
+ if (alertSource['status'] === 'inactive') {
+ this.removeAlert(alertSource)
+ }
+ this.updateAlert(alertSource);
});
- this.alertChangedSubscription =
this.updateService.alertChanged$.subscribe(patchRequest => {
- this.updateAlert(patchRequest.sensorType, patchRequest.guid, false);
+ this.alertChangedSubscription =
this.updateService.alertChanged$.subscribe(alertSource => {
+ this.updateAlert(alertSource);
});
}
@@ -478,20 +482,13 @@ export class AlertsListComponent implements OnInit,
OnDestroy {
this.searchService.interval = this.refreshInterval;
}
- updateAlert(sensorType: string, guid: string, isDelete: boolean) {
- if (isDelete) {
- let alertIndex = -1;
- this.alerts.forEach((alert, index) => {
- alertIndex = (alert.source.guid === guid) ? index : alertIndex;
- });
- this.alerts.splice(alertIndex, 1);
- return;
- }
+ updateAlert(alertSource: AlertSource) {
+ this.alerts.filter(alert => alert.source.guid === alertSource.guid)
+ .map(alert => alert.source = alertSource);
+ }
- this.searchService.getAlert(sensorType, guid).subscribe(alertSource => {
- this.alerts.filter(alert => alert.source.guid === guid)
- .map(alert => alert.source = alertSource);
- });
+ removeAlert(alertSource: AlertSource) {
+ this.alerts = this.alerts.filter(alert => alert.source.guid !==
alertSource.guid);
}
updateSelectedAlertStatus(status: string) {
diff --git
a/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.ts
b/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.ts
index 2190beb..e9d19a1 100644
---
a/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.ts
+++
b/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.ts
@@ -35,6 +35,7 @@ import {GetRequest} from '../../../model/get-request';
import { GlobalConfigService } from '../../../service/global-config.service';
import { DialogService } from '../../../service/dialog.service';
import { ConfirmationType } from 'app/model/confirmation-type';
+import {HttpErrorResponse} from "@angular/common/http";
export enum MetronAlertDisplayState {
COLLAPSE, EXPAND
@@ -277,6 +278,13 @@ export class TableViewComponent implements OnInit,
OnChanges, OnDestroy {
metaAlertAddRemoveRequest.alerts = [new GetRequest(alertToRemove.guid,
alertToRemove[this.globalConfig['source.type.field']], '')];
this.metaAlertService.removeAlertsFromMetaAlert(metaAlertAddRemoveRequest).subscribe(()
=> {
+ }, (res: HttpErrorResponse) => {
+ let message = res.error['message'];
+ this.dialogService
+ .launchDialog(message)
+ .subscribe(action => {
+ this.configSubscription.unsubscribe();
+ })
});
}
diff --git
a/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.ts
b/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.ts
index 19aaa6e..d2c7c8d 100644
---
a/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.ts
+++
b/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.ts
@@ -39,6 +39,7 @@ import { GlobalConfigService } from
'../../../service/global-config.service';
import { DialogService } from '../../../service/dialog.service';
import { DialogType } from 'app/model/dialog-type';
import { ConfirmationType } from 'app/model/confirmation-type';
+import {AlertSource} from "../../../model/alert-source";
@Component({
selector: 'app-tree-view',
@@ -55,7 +56,7 @@ export class TreeViewComponent extends TableViewComponent
implements OnInit, OnC
treeGroupSubscriptionMap: {[key: string]: TreeAlertsSubscription } = {};
alertsChangedSubscription: Subscription;
configSubscription: Subscription;
- dialogService: DialogService
+ dialogService: DialogService;
constructor(searchService: SearchService,
updateService: UpdateService,
@@ -66,8 +67,8 @@ export class TreeViewComponent extends TableViewComponent
implements OnInit, OnC
}
addAlertChangedListner() {
- this.alertsChangedSubscription =
this.updateService.alertChanged$.subscribe(patchRequest => {
- this.updateAlert(patchRequest);
+ this.alertsChangedSubscription =
this.updateService.alertChanged$.subscribe(alertSource => {
+ this.updateAlert(alertSource);
});
}
@@ -436,16 +437,13 @@ export class TreeViewComponent extends TableViewComponent
implements OnInit, OnC
return false;
}
- updateAlert(patchRequest: PatchRequest) {
- this.searchService.getAlert(patchRequest.sensorType,
patchRequest.guid).subscribe(alertSource => {
-
- Object.keys(this.treeGroupSubscriptionMap).forEach(key => {
- let group = this.treeGroupSubscriptionMap[key].group;
- if (group.response && group.response.results &&
group.response.results.length > 0) {
- group.response.results.filter(alert => alert.source.guid ===
patchRequest.guid)
- .map(alert => alert.source = alertSource);
- }
- });
+ updateAlert(alertSource: AlertSource) {
+ Object.keys(this.treeGroupSubscriptionMap).forEach(key => {
+ let group = this.treeGroupSubscriptionMap[key].group;
+ if (group.response && group.response.results &&
group.response.results.length > 0) {
+ group.response.results.filter(alert => alert.source.guid ===
alertSource.guid)
+ .forEach(alert => alert.source = alertSource);
+ }
});
}
}
diff --git
a/metron-interface/metron-alerts/src/app/service/meta-alert.service.ts
b/metron-interface/metron-alerts/src/app/service/meta-alert.service.ts
index 59ea0a7..62589a8 100644
--- a/metron-interface/metron-alerts/src/app/service/meta-alert.service.ts
+++ b/metron-interface/metron-alerts/src/app/service/meta-alert.service.ts
@@ -27,11 +27,12 @@ import { HttpClient } from '@angular/common/http';
import {MetaAlertCreateRequest} from '../model/meta-alert-create-request';
import {MetaAlertAddRemoveRequest} from
'../model/meta-alert-add-remove-request';
import { AppConfigService } from './app-config.service';
+import {AlertSource} from "../model/alert-source";
@Injectable()
export class MetaAlertService {
private _selectedAlerts: Alert[];
- alertChangedSource = new Subject<MetaAlertAddRemoveRequest>();
+ alertChangedSource = new Subject<AlertSource>();
alertChanged$ = this.alertChangedSource.asObservable();
constructor(private http: HttpClient, private appConfigService:
AppConfigService) {
@@ -51,23 +52,25 @@ export class MetaAlertService {
catchError(HttpUtil.handleError));
}
- public addAlertsToMetaAlert(metaAlertAddRemoveRequest:
MetaAlertAddRemoveRequest) {
+ public addAlertsToMetaAlert(metaAlertAddRemoveRequest:
MetaAlertAddRemoveRequest): Observable<AlertSource> {
let url = this.appConfigService.getApiRoot() + '/metaalert/add/alert';
return this.http.post(url, metaAlertAddRemoveRequest).pipe(
catchError(HttpUtil.handleError),
map(result => {
- this.alertChangedSource.next(metaAlertAddRemoveRequest);
- return result;
+ let alertSource = result['document'];
+ this.alertChangedSource.next(alertSource);
+ return alertSource;
}));
}
- public removeAlertsFromMetaAlert(metaAlertAddRemoveRequest:
MetaAlertAddRemoveRequest) {
+ public removeAlertsFromMetaAlert(metaAlertAddRemoveRequest:
MetaAlertAddRemoveRequest): Observable<AlertSource> {
let url = this.appConfigService.getApiRoot() + '/metaalert/remove/alert';
return this.http.post(url, metaAlertAddRemoveRequest).pipe(
catchError(HttpUtil.handleError),
map(result => {
- this.alertChangedSource.next(metaAlertAddRemoveRequest);
- return result;
+ let alertSource = result['document'];
+ this.alertChangedSource.next(alertSource);
+ return alertSource;
}));
}
@@ -76,11 +79,9 @@ export class MetaAlertService {
return this.http.post(url, {}).pipe(
catchError(HttpUtil.handleError),
map(result => {
- let metaAlertAddRemoveRequest = new MetaAlertAddRemoveRequest();
- metaAlertAddRemoveRequest.metaAlertGuid = guid;
- metaAlertAddRemoveRequest.alerts = null;
- this.alertChangedSource.next(metaAlertAddRemoveRequest);
- return result;
+ let alertSource = result['document'];
+ this.alertChangedSource.next(alertSource);
+ return alertSource;
}));
}
}
diff --git a/metron-interface/metron-alerts/src/app/service/update.service.ts
b/metron-interface/metron-alerts/src/app/service/update.service.ts
index 6ce2c73..e14f0a7 100644
--- a/metron-interface/metron-alerts/src/app/service/update.service.ts
+++ b/metron-interface/metron-alerts/src/app/service/update.service.ts
@@ -29,14 +29,15 @@ import {Patch} from '../model/patch';
import { GlobalConfigService } from './global-config.service';
import {CommentAddRemoveRequest} from "../model/comment-add-remove-request";
import { AppConfigService } from './app-config.service';
+import {AlertSource} from "../model/alert-source";
@Injectable()
export class UpdateService {
- alertChangedSource = new Subject<PatchRequest>();
+ alertChangedSource = new Subject<AlertSource>();
alertChanged$ = this.alertChangedSource.asObservable();
sourceType = 'source:type';
- alertCommentChangedSource = new Subject<CommentAddRemoveRequest>();
+ alertCommentChangedSource = new Subject<AlertSource>();
alertCommentChanged$ = this.alertCommentChangedSource.asObservable();
constructor(private http: HttpClient, private globalConfigService:
GlobalConfigService, private appConfigService: AppConfigService) {
@@ -45,39 +46,42 @@ export class UpdateService {
});
}
- public addComment(commentRequest: CommentAddRemoveRequest,
fireChangeListener = true): Observable<{}> {
+ public addComment(commentRequest: CommentAddRemoveRequest,
fireChangeListener = true): Observable<AlertSource> {
let url = this.appConfigService.getApiRoot() + '/update/add/comment';
return this.http.post(url, commentRequest).pipe(
catchError(HttpUtil.handleError),
map(result => {
+ let alertSource = result['document'];
if (fireChangeListener) {
- this.alertCommentChangedSource.next(commentRequest);
+ this.alertCommentChangedSource.next(alertSource);
}
- return result;
+ return alertSource;
}));
}
- public removeComment(commentRequest: CommentAddRemoveRequest,
fireChangeListener = true): Observable<{}> {
+ public removeComment(commentRequest: CommentAddRemoveRequest,
fireChangeListener = true): Observable<AlertSource> {
let url = this.appConfigService.getApiRoot() + '/update/remove/comment';
return this.http.post(url, commentRequest).pipe(
catchError(HttpUtil.handleError),
map(result => {
+ let alertSource = result['document'];
if (fireChangeListener) {
- this.alertCommentChangedSource.next(commentRequest);
+ this.alertCommentChangedSource.next(alertSource);
}
- return result;
+ return alertSource;
}));
}
- public patch(patchRequest: PatchRequest, fireChangeListener = true):
Observable<{}> {
+ public patch(patchRequest: PatchRequest, fireChangeListener = true):
Observable<AlertSource> {
let url = this.appConfigService.getApiRoot() + '/update/patch';
return this.http.patch(url, patchRequest).pipe(
catchError(HttpUtil.handleError),
map(result => {
+ let alertSource = result['document'];
if (fireChangeListener) {
- this.alertChangedSource.next(patchRequest);
+ this.alertChangedSource.next(alertSource);
}
- return result;
+ return alertSource;
}),);
}