http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/package.json ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/package.json b/metron-interface/metron-alerts/package.json index 423cbc9..2133b74 100644 --- a/metron-interface/metron-alerts/package.json +++ b/metron-interface/metron-alerts/package.json @@ -4,66 +4,71 @@ "license": "Apache-2.0", "angular-cli": {}, "scripts": { - "build": "./node_modules/@angular/cli/bin/ng build -prod", + "build": "./node_modules/@angular/cli/bin/ng build --prod", "start": "ng serve", "lint": "tslint \"src/**/*.ts\"", - "test": "karma start --single-run --browsers ChromeHeadless karma.conf.js", + "test": "ng test --browsers=Chrome", + "testCI": "ng test --watch=false --browsers=ChromeHeadless", "pree2e": "webdriver-manager update", "e2e": "protractor-flake --protractor-path=./node_modules/.bin/protractor --max-attempts=3 -- ./protractor.conf.js" }, "private": true, "dependencies": { - "@angular/common": "^4.0.0", - "@angular/compiler": "^4.0.0", - "@angular/core": "^4.0.0", - "@angular/forms": "^4.0.0", - "@angular/http": "^4.0.0", - "@angular/platform-browser": "^4.0.0", - "@angular/platform-browser-dynamic": "^4.0.0", - "@angular/router": "^4.0.0", + "@angular/common": "^6.1.6", + "@angular/compiler": "^6.1.6", + "@angular/core": "^6.1.6", + "@angular/forms": "^6.1.6", + "@angular/http": "^6.1.6", + "@angular/platform-browser": "^6.1.6", + "@angular/platform-browser-dynamic": "^6.1.6", + "@angular/router": "^6.1.6", + "@types/bootstrap": "^4.1.1", + "@types/jquery": "^3.3.4", "ace-builds": "^1.2.6", + "ajv": "^6.5.1", "bootstrap": "4.0.0-alpha.6", "core-js": "^2.4.1", "font-awesome": "^4.7.0", - "moment": "^2.18.1", - "pikaday-time": "^1.6.1", + "moment": "^2.22.2", "ng2-dragula": "^1.5.0", - "rxjs": "^5.1.0", + "pikaday-time": "^1.6.1", + "puppeteer": "^1.7.0", + "rxjs": "^6.3.0", + "ts-node": "^7.0.0", "web-animations-js": "^2.2.2", - "zone.js": "^0.8.4" + "zone.js": "^0.8.26" }, "devDependencies": { - "@angular/cli": "1.2.4", - "@angular/compiler-cli": "^4.0.0", + "@angular-devkit/build-angular": "~0.6.8", + "@angular/cli": "^6.0.6", + "@angular/compiler-cli": "^6.1.6", "@types/ace": "0.0.32", "@types/es6-promise": "0.0.33", "@types/jasmine": "2.5.38", "@types/moment": "^2.13.0", "@types/node": "~6.0.60", "@types/pikaday-time": "^1.4.2", - "codelyzer": "~2.0.0", - "compression": "1.6.2", - "elementor": "^2.1.0", - "express": "4.15.2", - "http-proxy-middleware": "0.17.4", + "codelyzer": "^4.0.1", + "compression": "^1.7.3", + "express": "^4.16.3", + "http-proxy-middleware": "^0.18.0", "jasmine-core": "~2.5.2", "jasmine-spec-reporter": "~3.2.0", - "karma": "~1.4.1", + "karma": "^3.0.0", "karma-chrome-launcher": "~2.0.0", "karma-cli": "~1.0.1", "karma-coverage-istanbul-reporter": "^0.2.0", "karma-jasmine": "~1.1.0", "karma-jasmine-html-reporter": "^0.2.2", - "node-sass": "^4.5.0", + "node-sass": "^4.9.3", "optimist": "0.6.1", - "protractor": "5.3.0", + "protractor": "^5.4.0", "protractor-flake": "^3.3.0", - "puppeteer": "^1.6.0", - "serve-favicon": "2.4.2", - "serve-static": "1.12.1", + "rxjs-tslint": "^0.1.5", + "serve-favicon": "^2.5.0", + "serve-static": "^1.13.2", "ssh2": "^0.5.5", - "ts-node": "~2.0.0", - "tslint": "~4.5.0", - "typescript": "~2.2.0" + "tslint": "~5.0.0", + "typescript": "~2.9.2" } }
http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/pom.xml ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/pom.xml b/metron-interface/metron-alerts/pom.xml index 593da35..aafcb94 100644 --- a/metron-interface/metron-alerts/pom.xml +++ b/metron-interface/metron-alerts/pom.xml @@ -62,7 +62,7 @@ </execution> <execution> <phase>generate-resources</phase> - <id>ng build</id> + <id>npm run build</id> <goals> <goal>npm</goal> </goals> @@ -72,12 +72,12 @@ </execution> <execution> <phase>test</phase> - <id>npm test</id> + <id>npm testCI</id> <goals> <goal>npm</goal> </goals> <configuration> - <arguments>test</arguments> + <arguments>run testCI</arguments> </configuration> </execution> </executions> http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/protractor.conf.js ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/protractor.conf.js b/metron-interface/metron-alerts/protractor.conf.js index 3d35521..74d90a7 100644 --- a/metron-interface/metron-alerts/protractor.conf.js +++ b/metron-interface/metron-alerts/protractor.conf.js @@ -20,7 +20,7 @@ // https://github.com/angular/protractor/blob/master/docs/referenceConf.js /*global jasmine */ -var SpecReporter = require('jasmine-spec-reporter').SpecReporter; +const { SpecReporter } = require('jasmine-spec-reporter'); exports.config = { allScriptsTimeout: 15000, @@ -54,14 +54,10 @@ exports.config = { defaultTimeoutInterval: 50000, includeStackTrace: true }, - beforeLaunch: function() { - require('ts-node').register({ - project: 'e2e' - }); - }, - onPrepare: function() { + beforeLaunch: function () { require('ts-node/register') }, + onPrepare: function () { - jasmine.getEnv().addReporter(new SpecReporter({spec: {displayStacktrace: true}})); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); return new Promise(function(resolve, reject) { var cleanMetronUpdateTable = require('./e2e/utils/clean_metron_update_table').cleanMetronUpdateTable; http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/scripts/prepend_license_header.sh ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/scripts/prepend_license_header.sh b/metron-interface/metron-alerts/scripts/prepend_license_header.sh index b44d388..d295fa5 100755 --- a/metron-interface/metron-alerts/scripts/prepend_license_header.sh +++ b/metron-interface/metron-alerts/scripts/prepend_license_header.sh @@ -33,7 +33,7 @@ LICENSE_HEADER="/** * limitations under the License. */ " -for file in ./dist/*.js +for file in ./dist/*.{js,css} do if !(grep -Fxq "$LICENSE_HEADER" $file) then http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/scripts/start-dev.sh ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/scripts/start-dev.sh b/metron-interface/metron-alerts/scripts/start-dev.sh index 86814a5..f8b9922 100755 --- a/metron-interface/metron-alerts/scripts/start-dev.sh +++ b/metron-interface/metron-alerts/scripts/start-dev.sh @@ -16,4 +16,4 @@ # limitations under the License. # SCRIPTS_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -$SCRIPTS_ROOT/../node_modules/@angular/cli/bin/ng serve --proxy-config proxy.conf.json --port 4201 $@ +$SCRIPTS_ROOT/../node_modules/@angular/cli/bin/ng serve --proxy-config proxy.conf.json --port 4201 --aot $@ http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/scripts/start-server-for-e2e.sh ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/scripts/start-server-for-e2e.sh b/metron-interface/metron-alerts/scripts/start-server-for-e2e.sh index 36a239c..9c048b7 100755 --- a/metron-interface/metron-alerts/scripts/start-server-for-e2e.sh +++ b/metron-interface/metron-alerts/scripts/start-server-for-e2e.sh @@ -16,4 +16,4 @@ # limitations under the License. # SCRIPTS_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -$SCRIPTS_ROOT/../node_modules/@angular/cli/bin/ng serve -environment e2e --proxy-config proxy.conf.json $@ +$SCRIPTS_ROOT/../node_modules/@angular/cli/bin/ng serve --configuration e2e --proxy-config proxy.conf.json --aot $@ http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/alerts/alert-details/alert-details.component.ts ---------------------------------------------------------------------- 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 2af79a8..0693457 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 @@ -18,7 +18,7 @@ import {Component, OnInit} from '@angular/core'; import {ActivatedRoute, Router} from '@angular/router'; import * as moment from 'moment/moment'; -import {Subscription} from 'rxjs/Rx'; +import {Subscription} from 'rxjs'; import {SearchService} from '../../service/search.service'; import {UpdateService} from '../../service/update.service'; http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/alerts/alerts-list/alerts-list.component.ts ---------------------------------------------------------------------- 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 15a87a4..d5b3c8b 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 @@ -1,3 +1,5 @@ + +import {forkJoin as observableForkJoin} from 'rxjs'; /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -17,7 +19,7 @@ */ import {Component, OnInit, ViewChild, ElementRef, OnDestroy} from '@angular/core'; import {Router, NavigationStart} from '@angular/router'; -import {Observable, Subscription} from 'rxjs/Rx'; +import {Subscription} from 'rxjs'; import {Alert} from '../../model/alert'; import {SearchService} from '../../service/search.service'; @@ -157,7 +159,7 @@ export class AlertsListComponent implements OnInit, OnDestroy { } getAlertColumnNames(resetPaginationForSearch: boolean) { - Observable.forkJoin( + observableForkJoin( this.configureTableService.getTableMetadata(), this.clusterMetaDataService.getDefaultColumns() ).subscribe((response: any) => { http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.spec.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.spec.ts b/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.spec.ts index 46521e6..73dde50 100644 --- a/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.spec.ts +++ b/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.spec.ts @@ -18,7 +18,7 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { Component, Input } from '@angular/core'; -import { HttpModule } from '@angular/http'; +import { HttpClientModule } from '@angular/common/http'; import { TableViewComponent } from './table-view.component'; import { MetronTableDirective } from '../../../shared/metron-table/metron-table.directive'; @@ -42,9 +42,9 @@ describe('TableViewComponent', () => { let fixture: ComponentFixture<TableViewComponent>; beforeEach(async(() => { - // FIXME: mock all the unnecessary dependencies + // FIXME: mock all the unnecessary dependencies TestBed.configureTestingModule({ - imports: [ HttpModule ], + imports: [ HttpClientModule ], providers: [ SearchService, UpdateService, @@ -52,7 +52,7 @@ describe('TableViewComponent', () => { MetaAlertService, MetronDialogBox, ], - declarations: [ + declarations: [ MetronTableDirective, MetronSorterComponent, CenterEllipsesPipe, @@ -62,14 +62,15 @@ describe('TableViewComponent', () => { TableViewComponent, ] }) - .compileComponents() - .then(() => { - fixture = TestBed.createComponent(TableViewComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + .compileComponents(); })); + beforeEach(() => { + fixture = TestBed.createComponent(TableViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + it('should be created', () => { expect(component).toBeTruthy(); }); http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/alerts/alerts-list/table-view/table-view.component.ts ---------------------------------------------------------------------- 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 91cae3e..fd05b69 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 @@ -17,7 +17,7 @@ */ import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, OnInit, OnDestroy } from '@angular/core'; -import { Subscription } from 'rxjs/Rx'; +import { Subscription } from 'rxjs'; import {Pagination} from '../../../model/pagination'; import {SortEvent} from '../../../shared/metron-table/metron-table.directive'; http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-group-data.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-group-data.ts b/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-group-data.ts index ae5cdd3..be46a00 100644 --- a/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-group-data.ts +++ b/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-group-data.ts @@ -15,7 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {Subscription} from 'rxjs/Rx'; +import {Subscription} from 'rxjs'; import {SearchResponse} from '../../../model/search-response'; import {Pagination} from '../../../model/pagination'; import {TREE_SUB_GROUP_SIZE} from '../../../utils/constants'; http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.spec.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.spec.ts b/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.spec.ts index e86714c..9716c53 100644 --- a/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.spec.ts +++ b/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.spec.ts @@ -17,7 +17,7 @@ */ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { HttpModule } from '@angular/http'; +import { HttpClientModule } from '@angular/common/http'; import { TreeViewComponent } from './tree-view.component'; import { AlertSeverityHexagonDirective } from '../../../shared/directives/alert-severity-hexagon.directive'; @@ -39,7 +39,7 @@ describe('TreeViewComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - imports: [ HttpModule ], + imports: [ HttpClientModule ], providers: [ SearchService, UpdateService, @@ -47,7 +47,7 @@ describe('TreeViewComponent', () => { MetaAlertService, MetronDialogBox, ], - declarations: [ + declarations: [ MetronTableDirective, MetronSorterComponent, MetronTablePaginationComponent, http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/alerts/alerts-list/tree-view/tree-view.component.ts ---------------------------------------------------------------------- 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 9a67cf2..ab168aa 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 @@ -17,7 +17,7 @@ */ import { Component, OnInit, OnChanges, SimpleChanges, OnDestroy, Input } from '@angular/core'; -import {Subscription, Observable} from 'rxjs/Rx'; +import {Subscription, Observable} from 'rxjs'; import {TableViewComponent} from '../table-view/table-view.component'; import {SearchResponse} from '../../../model/search-response'; http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/alerts/configure-table/configure-table.component.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/alerts/configure-table/configure-table.component.ts b/metron-interface/metron-alerts/src/app/alerts/configure-table/configure-table.component.ts index 0c0117b..c4cf854 100644 --- a/metron-interface/metron-alerts/src/app/alerts/configure-table/configure-table.component.ts +++ b/metron-interface/metron-alerts/src/app/alerts/configure-table/configure-table.component.ts @@ -17,7 +17,7 @@ */ import { Component, OnInit } from '@angular/core'; import {Router, ActivatedRoute} from '@angular/router'; -import {Observable} from 'rxjs/Rx'; +import {forkJoin as observableForkJoin} from 'rxjs'; import {ConfigureTableService} from '../../service/configure-table.service'; import {ClusterMetaDataService} from '../../service/cluster-metadata.service'; @@ -82,7 +82,7 @@ export class ConfigureTableComponent implements OnInit { } ngOnInit() { - Observable.forkJoin( + observableForkJoin( this.clusterMetaDataService.getDefaultColumns(), this.searchService.getColumnMetaData(), this.configureTableService.getTableMetadata() http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/alerts/meta-alerts/meta-alerts.component.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/alerts/meta-alerts/meta-alerts.component.ts b/metron-interface/metron-alerts/src/app/alerts/meta-alerts/meta-alerts.component.ts index 1c72904..bcead06 100644 --- a/metron-interface/metron-alerts/src/app/alerts/meta-alerts/meta-alerts.component.ts +++ b/metron-interface/metron-alerts/src/app/alerts/meta-alerts/meta-alerts.component.ts @@ -17,7 +17,7 @@ */ import { Component, OnInit, OnDestroy } from '@angular/core'; import {Router} from '@angular/router'; -import { Subscription } from 'rxjs/Rx'; +import { Subscription } from 'rxjs'; import {MetaAlertService} from '../../service/meta-alert.service'; import {UpdateService} from '../../service/update.service'; http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/alerts/saved-searches/saved-searches.component.spec.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/alerts/saved-searches/saved-searches.component.spec.ts b/metron-interface/metron-alerts/src/app/alerts/saved-searches/saved-searches.component.spec.ts index ce878ee..899a2b1 100644 --- a/metron-interface/metron-alerts/src/app/alerts/saved-searches/saved-searches.component.spec.ts +++ b/metron-interface/metron-alerts/src/app/alerts/saved-searches/saved-searches.component.spec.ts @@ -25,7 +25,8 @@ import { ColumnNameTranslatePipe } from '../../shared/pipes/column-name-translat import { Router } from '@angular/router'; import { SaveSearchService } from '../../service/save-search.service'; import { MetronDialogBox } from '../../shared/metron-dialog-box'; -import { Observable } from 'rxjs'; +import { of } from 'rxjs'; + describe('SavedSearchesComponent', () => { let component: SavedSearchesComponent; @@ -36,12 +37,12 @@ describe('SavedSearchesComponent', () => { providers: [ { provide: Router, useValue: {} }, { provide: SaveSearchService, useValue: { - listSavedSearches: jasmine.createSpy('listSavedSearches').and.returnValue(Observable.of([])), - listRecentSearches: jasmine.createSpy('listRecentSearches').and.returnValue(Observable.of([])), + listSavedSearches: jasmine.createSpy('listSavedSearches').and.returnValue(of([])), + listRecentSearches: jasmine.createSpy('listRecentSearches').and.returnValue(of([])), } }, MetronDialogBox ], - declarations: [ + declarations: [ SavedSearchesComponent, CollapseComponent, CenterEllipsesPipe, http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/alerts/saved-searches/saved-searches.component.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/alerts/saved-searches/saved-searches.component.ts b/metron-interface/metron-alerts/src/app/alerts/saved-searches/saved-searches.component.ts index cb21b11..2204179 100644 --- a/metron-interface/metron-alerts/src/app/alerts/saved-searches/saved-searches.component.ts +++ b/metron-interface/metron-alerts/src/app/alerts/saved-searches/saved-searches.component.ts @@ -1,3 +1,4 @@ + /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -17,7 +18,7 @@ */ import { Component, OnInit } from '@angular/core'; import {Router} from '@angular/router'; -import {Observable} from 'rxjs/Rx'; +import {forkJoin as observableForkJoin} from 'rxjs'; import {SaveSearchService} from '../../service/save-search.service'; import {SaveSearch} from '../../model/save-search'; @@ -78,7 +79,7 @@ export class SavedSearchesComponent implements OnInit { } ngOnInit() { - Observable.forkJoin( + observableForkJoin( this.saveSearchService.listSavedSearches(), this.saveSearchService.listRecentSearches() ).subscribe((response: any) => { http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/app-routing.module.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/app-routing.module.ts b/metron-interface/metron-alerts/src/app/app-routing.module.ts index 56ad41c..db6e29f 100644 --- a/metron-interface/metron-alerts/src/app/app-routing.module.ts +++ b/metron-interface/metron-alerts/src/app/app-routing.module.ts @@ -25,7 +25,7 @@ const routes: Routes = [ { path: 'login', loadChildren: 'app/login/login.module#LoginModule', canActivate: [LoginGuard]}, { path: 'alerts-list', loadChildren: 'app/alerts/alerts-list/alerts-list.module#AlertsListModule', canActivate: [AuthGuard]}, { path: 'save-search', loadChildren: 'app/alerts/save-search/save-search.module#SaveSearchModule', canActivate: [AuthGuard]}, - { path: 'saved-searches', loadChildren: 'app/alerts/saved-searches/saved-searches.module.ts#SavedSearchesModule', + { path: 'saved-searches', loadChildren: 'app/alerts/saved-searches/saved-searches.module#SavedSearchesModule', canActivate: [AuthGuard]}, { path: 'pcap', loadChildren: 'app/pcap/pcap.module#PcapModule', canActivate: [AuthGuard] } ]; http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/app.component.spec.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/app.component.spec.ts b/metron-interface/metron-alerts/src/app/app.component.spec.ts index 8eee24a..ce38c22 100644 --- a/metron-interface/metron-alerts/src/app/app.component.spec.ts +++ b/metron-interface/metron-alerts/src/app/app.component.spec.ts @@ -20,7 +20,7 @@ import { TestBed, async, ComponentFixture } from '@angular/core/testing'; import { AppComponent } from './app.component'; import { Component } from '@angular/core'; import { AuthenticationService } from './service/authentication.service'; -import { Observable } from 'rxjs'; +import { of } from 'rxjs'; @Component({ selector: 'router-outlet', template: '' }) class RouterOutletStubComponent {} @@ -32,7 +32,7 @@ describe('AppComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ providers: [ - { provide: AuthenticationService, useValue: { onLoginEvent: Observable.of(true) } } + { provide: AuthenticationService, useValue: { onLoginEvent: of(true) } } ], declarations: [ AppComponent, http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/app.module.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/app.module.ts b/metron-interface/metron-alerts/src/app/app.module.ts index 82b4970..44e2650 100644 --- a/metron-interface/metron-alerts/src/app/app.module.ts +++ b/metron-interface/metron-alerts/src/app/app.module.ts @@ -19,7 +19,7 @@ import { Router } from '@angular/router'; import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; -import { HttpModule } from '@angular/http'; +import {HttpClientModule, HTTP_INTERCEPTORS} from '@angular/common/http'; import { APP_INITIALIZER } from '@angular/core'; import { AppComponent } from './app.component'; @@ -46,6 +46,9 @@ import {MetaAlertService} from './service/meta-alert.service'; import {MetaAlertsModule} from './alerts/meta-alerts/meta-alerts.module'; import {SearchService} from './service/search.service'; import { GlobalConfigService } from './service/global-config.service'; +import { DefaultHeadersInterceptor } from './http-interceptors/default-headers.interceptor'; + + import {PcapModule} from './pcap/pcap.module'; export function initConfig(config: ColumnNamesService) { @@ -59,7 +62,7 @@ export function initConfig(config: ColumnNamesService) { imports: [ BrowserModule, FormsModule, - HttpModule, + HttpClientModule, MetronAlertsRoutingModule, LoginModule, AlertsListModule, @@ -74,6 +77,7 @@ export function initConfig(config: ColumnNamesService) { ], providers: [{ provide: APP_INITIALIZER, useFactory: initConfig, deps: [ColumnNamesService], multi: true }, { provide: DataSource, useClass: ElasticSearchLocalstorageImpl }, + { provide: HTTP_INTERCEPTORS, useClass: DefaultHeadersInterceptor, multi: true }, AuthenticationService, AuthGuard, LoginGuard, http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/http-interceptors/default-headers.interceptor.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/http-interceptors/default-headers.interceptor.ts b/metron-interface/metron-alerts/src/app/http-interceptors/default-headers.interceptor.ts new file mode 100644 index 0000000..589ff6a --- /dev/null +++ b/metron-interface/metron-alerts/src/app/http-interceptors/default-headers.interceptor.ts @@ -0,0 +1,34 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Injectable } from '@angular/core'; +import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest} from '@angular/common/http'; +import { Observable } from 'rxjs'; + +@Injectable() +export class DefaultHeadersInterceptor implements HttpInterceptor { + + intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { + // Clone the request and replace the original headers with + // cloned headers, updated with the authorization. + const authReq = req.clone({ + setHeaders: {'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest'} + }); + return next.handle(authReq); + } + +} http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/login/login.component.spec.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/login/login.component.spec.ts b/metron-interface/metron-alerts/src/app/login/login.component.spec.ts index e02b65f..45f52e8 100644 --- a/metron-interface/metron-alerts/src/app/login/login.component.spec.ts +++ b/metron-interface/metron-alerts/src/app/login/login.component.spec.ts @@ -19,7 +19,7 @@ import { async, inject, TestBed } from '@angular/core/testing'; import { AuthenticationService } from '../service/authentication.service'; import { LoginComponent } from './login.component'; import { ActivatedRoute, Params } from '@angular/router'; -import { Observable } from 'rxjs'; +import { of } from 'rxjs'; class MockAuthenticationService { public login(username: string, password: string, onError): void { @@ -34,7 +34,7 @@ class MockAuthenticationService { } class MockActivedRoutes { - queryParams: Observable<Params> = Observable.of({ + queryParams = of({ sessionExpired: false }) } http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/model/rest-error.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/model/rest-error.ts b/metron-interface/metron-alerts/src/app/model/rest-error.ts index 5daee25..f000c1f 100644 --- a/metron-interface/metron-alerts/src/app/model/rest-error.ts +++ b/metron-interface/metron-alerts/src/app/model/rest-error.ts @@ -16,7 +16,7 @@ * limitations under the License. */ export class RestError { - responseCode: number; + status: number; message: string; - fullMessage: string; + error: string; } http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.ts b/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.ts index 7cc8980..ba89e97 100644 --- a/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.ts +++ b/metron-interface/metron-alerts/src/app/pcap/pcap-filters/pcap-filters.component.ts @@ -22,7 +22,7 @@ import * as moment from 'moment/moment'; import { DEFAULT_START_TIME, DEFAULT_END_TIME, DEFAULT_TIMESTAMP_FORMAT } from '../../utils/constants'; import { PcapRequest } from '../model/pcap.request'; -import { Observable, Subscription } from 'rxjs'; +import { Observable, Subscription, merge } from 'rxjs'; function validateStartDate(formControl: FormControl): ValidationErrors | null { if (!formControl.parent) { @@ -128,7 +128,8 @@ export class PcapFiltersComponent implements OnInit, OnChanges, OnDestroy { subscribeToDateRangeChanges(callback: () => void): Subscription { const startTimeChanges: Observable<string> = this.filterForm.get('startTime').valueChanges; const endTimeChanges: Observable<string> = this.filterForm.get('endTime').valueChanges; - return startTimeChanges.merge(endTimeChanges).subscribe(callback); + const mergedChanges = merge(startTimeChanges, endTimeChanges); + return mergedChanges.subscribe(callback); } forceValidateDateRangeFields() { http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.spec.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.spec.ts b/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.spec.ts index 2ebf884..aa9b799 100644 --- a/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.spec.ts +++ b/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.spec.ts @@ -25,8 +25,7 @@ import { PcapStatusResponse } from '../model/pcap-status-response'; import { PcapPagination } from '../model/pcap-pagination'; import { By } from '../../../../node_modules/@angular/platform-browser'; import { PcapRequest } from '../model/pcap.request'; -import { defer } from 'rxjs/observable/defer'; -import { Observable } from 'rxjs/Observable'; +import { of, defer } from 'rxjs'; import { RestError } from '../../model/rest-error'; @Component({ @@ -82,7 +81,7 @@ describe('PcapPanelComponent', () => { beforeEach(() => { pcapService = TestBed.get(PcapService); pcapService.getRunningJob = jasmine.createSpy('getRunningJob') - .and.returnValue(Observable.of([])); + .and.returnValue(of([])); fixture = TestBed.createComponent(PcapPanelComponent); component = fixture.componentInstance; fixture.detectChanges(); @@ -479,7 +478,7 @@ describe('PcapPanelComponent', () => { ); const restError = new RestError(); - restError.responseCode = 404; + restError.status = 404; pcapService.getPackets = jasmine.createSpy('getPackets').and.returnValue( defer(() => Promise.reject(restError)) ); @@ -509,7 +508,7 @@ describe('PcapPanelComponent', () => { ); const restError = new RestError(); - restError.responseCode = 500; + restError.status = 500; restError.message = 'error message'; pcapService.getPackets = jasmine.createSpy('getPackets').and.returnValue( defer(() => Promise.reject(restError)) http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.ts b/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.ts index 4a017db..5f262e9 100644 --- a/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.ts +++ b/metron-interface/metron-alerts/src/app/pcap/pcap-panel/pcap-panel.component.ts @@ -21,7 +21,7 @@ import { PcapService } from '../service/pcap.service'; import { PcapStatusResponse } from '../model/pcap-status-response'; import { PcapRequest } from '../model/pcap.request'; import { Pdml } from '../model/pdml'; -import { Subscription } from 'rxjs/Rx'; +import { Subscription } from 'rxjs'; import { PcapPagination } from '../model/pcap-pagination'; import { RestError } from '../../model/rest-error'; @@ -113,7 +113,7 @@ export class PcapPanelComponent implements OnInit, OnDestroy { this.pcapService.getPackets(this.queryId, this.pagination.selectedPage).toPromise().then(pdml => { this.pdml = pdml; }, (error: RestError) => { - if (error.responseCode === 404) { + if (error.status === 404) { this.errorMsg = 'No results returned'; } else { this.errorMsg = `Response message: ${error.message}. Something went wrong retrieving pdml results!`; http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/pcap/pcap.module.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/pcap/pcap.module.ts b/metron-interface/metron-alerts/src/app/pcap/pcap.module.ts index 784bc93..a789a8a 100644 --- a/metron-interface/metron-alerts/src/app/pcap/pcap.module.ts +++ b/metron-interface/metron-alerts/src/app/pcap/pcap.module.ts @@ -15,15 +15,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {NgModule} from '@angular/core'; +import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { HttpClientModule } from '@angular/common/http'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { HttpModule } from '@angular/http'; import { routing } from './pcap.routing'; - import { DatePickerModule } from '../shared/date-picker/date-picker.module'; - import { PcapListComponent } from './pcap-list/pcap-list.component'; import { PcapPacketComponent } from './pcap-packet/pcap-packet.component'; import { PcapFiltersComponent } from './pcap-filters/pcap-filters.component'; @@ -37,9 +35,9 @@ import { PcapService } from './service/pcap.service'; routing, CommonModule, FormsModule, + HttpClientModule, ReactiveFormsModule, - HttpModule, - DatePickerModule, + DatePickerModule ], declarations: [ PcapListComponent, @@ -49,7 +47,7 @@ import { PcapService } from './service/pcap.service'; PcapPacketLineComponent, PcapPaginationComponent ], - exports: [ PcapPanelComponent ], - providers: [ PcapService ] + exports: [PcapPanelComponent], + providers: [PcapService] }) export class PcapModule {} http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/pcap/service/pcap.service.spec.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/pcap/service/pcap.service.spec.ts b/metron-interface/metron-alerts/src/app/pcap/service/pcap.service.spec.ts index e7ac5ff..383c047 100644 --- a/metron-interface/metron-alerts/src/app/pcap/service/pcap.service.spec.ts +++ b/metron-interface/metron-alerts/src/app/pcap/service/pcap.service.spec.ts @@ -17,20 +17,16 @@ */ import { TestBed, - inject, fakeAsync, tick, - discardPeriodicTasks + discardPeriodicTasks, + getTestBed } from '@angular/core/testing'; import { - BaseRequestOptions, - HttpModule, - Response, - ResponseOptions, - XHRBackend -} from '@angular/http'; -import { MockBackend } from '@angular/http/testing'; -import { Observable } from 'rxjs/Rx'; + HttpClientTestingModule, + HttpTestingController +} from '@angular/common/http/testing'; +import { of } from 'rxjs'; import { PcapService } from './pcap.service'; import { PcapStatusResponse } from '../model/pcap-status-response'; @@ -40,158 +36,136 @@ import { fakePcapStatusResponse, fakePcapRequest } from '../model/pcap.mock'; const jobId = 'job_1234567890123_4567'; let pdmlJsonMock = fakePdml; +let injector: TestBed; +let pcapService: PcapService; +let mockBackend: HttpTestingController; + pdmlJsonMock['pdml']['packet'].push(fakePacket); describe('PcapService', () => { beforeEach(() => { TestBed.configureTestingModule({ - imports: [HttpModule], - providers: [ - PcapService, - { provide: XHRBackend, useClass: MockBackend }, - MockBackend, - BaseRequestOptions - ] + imports: [HttpClientTestingModule], + providers: [PcapService] }); + injector = getTestBed(); + pcapService = injector.get(PcapService); + mockBackend = injector.get(HttpTestingController); + }); + + afterEach(() => { + mockBackend.verify(); }); + describe('getPackets()', () => { - it('should return an Observable<Response>', inject( - [PcapService, XHRBackend], - (pcapService, mockBackend) => { - let packets; - - mockBackend.connections.subscribe(connection => { - expect(connection.request.url).toMatch( - /\/api\/v1\/pcap\/job_1234567890123_4567\/pdml\?page=1/ - ); - connection.mockRespond( - new Response(new ResponseOptions({ body: pdmlJsonMock })) - ); - }); - pcapService.getPackets(jobId, 1).subscribe(r => (packets = r)); + it('should return an Observable<Pdml>', () => { + let packets; + + pcapService.getPackets(jobId, 1).subscribe(r => { + packets = r; expect(packets).toBeTruthy(); expect(packets.pdml).toBeTruthy(); expect(packets.pdml.packet.length).toBe(1); expect(packets.pdml.packet[0].protos.length).toBe(3); - } - )); + }); + + const req = mockBackend.expectOne( + `/api/v1/pcap/job_1234567890123_4567/pdml?page=1` + ); + expect(req.request.method).toEqual('GET'); + req.flush(pdmlJsonMock); + }); }); describe('pollStatus()', () => { - it('should call getStatus() in intervals', fakeAsync(inject( - [PcapService, XHRBackend], (pcapService, mockBackend) => { - const responseMock: PcapStatusResponse = fakePcapStatusResponse; - const spy = spyOn(pcapService, 'getStatus').and.returnValue( - Observable.of(responseMock) - ); - let response; - - pcapService.pollStatus(jobId).subscribe(r => (response = r)); - tick(4000); - expect(spy.calls.count()).toBe(1); - tick(4000); - expect(spy.calls.count()).toBe(2); - discardPeriodicTasks(); - }) - ) - ); + it('should call getStatus() in intervals', fakeAsync(() => { + const responseMock: PcapStatusResponse = fakePcapStatusResponse; + const spy = spyOn(pcapService, 'getStatus').and.returnValue( + of(responseMock) + ); + let response; + + pcapService.pollStatus(jobId).subscribe(r => (response = r)); + tick(4000); + expect(spy.calls.count()).toBe(1); + tick(4000); + expect(spy.calls.count()).toBe(2); + discardPeriodicTasks(); + })); }); describe('submitRequest()', () => { - it('should return an Observable<PcapStatusResponse>', inject( - [PcapService, XHRBackend], - (pcapService, mockBackend) => { - const request: PcapRequest = fakePcapRequest; - const responseMock: PcapStatusResponse = fakePcapStatusResponse; - let response; - - mockBackend.connections.subscribe(connection => { - expect(connection.request.url).toMatch(/\/api\/v1\/pcap\/fixed/); - connection.mockRespond( - new Response(new ResponseOptions({ body: responseMock })) - ); - }); - - pcapService.submitRequest(request).subscribe(r => (response = r)); + it('should return an Observable<PcapStatusResponse>', () => { + const request: PcapRequest = fakePcapRequest; + const responseMock: PcapStatusResponse = fakePcapStatusResponse; + let response; + + pcapService.submitRequest(request).subscribe(r => { + response = r; expect(response).toBeTruthy(); - } - )); + }); + + const req = mockBackend.expectOne(`/api/v1/pcap/fixed`); + expect(req.request.method).toEqual('POST'); + req.flush(responseMock); + }); }); describe('getStatus()', () => { - it('should return an Observable<PcapStatusResponse>', inject( - [PcapService, XHRBackend], - (pcapService, mockBackend) => { - const responseMock: PcapStatusResponse = fakePcapStatusResponse; - let response; - - mockBackend.connections.subscribe(connection => { - expect(connection.request.url).toMatch( - /\/api\/v1\/pcap\/job_1234567890123_4567/ - ); - connection.mockRespond( - new Response(new ResponseOptions({ body: responseMock })) - ); - }); - - pcapService.getStatus(jobId).subscribe(r => (response = r)); + it('should return an Observable<PcapStatusResponse>', () => { + const responseMock: PcapStatusResponse = fakePcapStatusResponse; + let response; + + pcapService.getStatus(jobId).subscribe(r => { + response = r; expect(response).toBeTruthy(); - } - )); + }); + + const req = mockBackend.expectOne(`/api/v1/pcap/job_1234567890123_4567`); + expect(req.request.method).toEqual('GET'); + req.flush(responseMock); + }); }); describe('getRunningJob()', () => { - it('should return an Observable<PcapStatusResponse>', inject( - [PcapService, XHRBackend], - (pcapService, mockBackend) => { - const responseMock: PcapStatusResponse = fakePcapStatusResponse; - let response; - - mockBackend.connections.subscribe(connection => { - expect(connection.request.url).toMatch( - /\/api\/v1\/pcap\?state=RUNNING/ - ); - connection.mockRespond( - new Response(new ResponseOptions({ body: responseMock })) - ); - }); - - pcapService.getRunningJob().subscribe(r => (response = r)); - expect(response).toBeTruthy(); - } - )); + it('should return an Observable<PcapStatusResponse>', () => { + const responseMock: PcapStatusResponse = fakePcapStatusResponse; + let response; + + pcapService.getRunningJob().subscribe(r => { + response = r; + expect(response).toBeTruthy(); + }); + + const req = mockBackend.expectOne(`/api/v1/pcap?state=RUNNING`); + expect(req.request.method).toEqual('GET'); + req.flush(responseMock); + }); }); describe('getPcapRequest()', () => { - it('should return an Observable<PcapRequest>', inject( - [PcapService, XHRBackend], - (pcapService, mockBackend) => { - const responseMock: PcapRequest = fakePcapRequest; - let response; - - mockBackend.connections.subscribe(connection => { - expect(connection.request.url).toMatch( - /\/api\/v1\/pcap\/job_1234567890123_4567\/config/ - ); - connection.mockRespond( - new Response(new ResponseOptions({ body: responseMock })) - ); - }); - - pcapService.getPcapRequest(jobId).subscribe(r => (response = r)); - expect(response).toBeTruthy(); - } - )); + it('should return an Observable<PcapRequest>', () => { + const responseMock: PcapRequest = fakePcapRequest; + let response; + + pcapService.getPcapRequest(jobId).subscribe(r => { + response = r; + expect(response).toBeTruthy(); + }); + + const req = mockBackend.expectOne( + `/api/v1/pcap/job_1234567890123_4567/config` + ); + expect(req.request.method).toEqual('GET'); + req.flush(responseMock); + }); }); describe('getDownloadUrl()', () => { - it('should return a url with the correct page to download the pdml', inject( - [PcapService], - pcapService => { - expect(pcapService.getDownloadUrl(jobId, 2)).toBe( - `/api/v1/pcap/job_1234567890123_4567/raw?page=2` - ); - } - )); + it('should return a url with the correct page to download the pdml', () => { + expect(pcapService.getDownloadUrl(jobId, 2)).toBe( + `/api/v1/pcap/job_1234567890123_4567/raw?page=2` + ); + }); }); }); http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/pcap/service/pcap.service.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/pcap/service/pcap.service.ts b/metron-interface/metron-alerts/src/app/pcap/service/pcap.service.ts index d4efc42..d6fe767 100644 --- a/metron-interface/metron-alerts/src/app/pcap/service/pcap.service.ts +++ b/metron-interface/metron-alerts/src/app/pcap/service/pcap.service.ts @@ -15,74 +15,79 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {Injectable, NgZone} from '@angular/core'; -import {Observable} from 'rxjs/Rx'; -import {Http, Headers, RequestOptions} from '@angular/http'; -import {HttpUtil} from '../../utils/httpUtil'; +import { Injectable } from '@angular/core'; +import { Observable, interval } from 'rxjs'; +import { map, catchError, switchMap } from 'rxjs/operators'; +import { HttpClient } from '@angular/common/http'; +import { HttpUtil } from '../../utils/httpUtil'; -import 'rxjs/add/operator/map'; -import {PcapRequest} from '../model/pcap.request'; -import {Pdml} from '../model/pdml'; +import { PcapRequest } from '../model/pcap.request'; +import { Pdml } from '../model/pdml'; import { PcapStatusResponse } from '../model/pcap-status-response'; @Injectable() export class PcapService { + private statusInterval = 4; + defaultHeaders = { + 'Content-Type': 'application/json', + 'X-Requested-With': 'XMLHttpRequest' + }; - private statusInterval = 4; - defaultHeaders = {'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest'}; + constructor(private http: HttpClient) {} - constructor(private http: Http, private ngZone: NgZone) { - } - - public pollStatus(id: string): Observable<{}> { - return Observable.interval(this.statusInterval * 1000).switchMap(() => { + public pollStatus(id: string): Observable<{}> { + return interval(this.statusInterval * 1000).pipe( + switchMap(() => { return this.getStatus(id); - }); - } + }) + ); + } - public submitRequest(pcapRequest: PcapRequest): Observable<PcapStatusResponse> { - return this.http.post('/api/v1/pcap/fixed', pcapRequest, new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .map(HttpUtil.extractData) - .catch(HttpUtil.handleError); - } + public submitRequest( + pcapRequest: PcapRequest + ): Observable<PcapStatusResponse> { + return this.http.post('/api/v1/pcap/fixed', pcapRequest).pipe( + map(HttpUtil.extractData), + catchError(HttpUtil.handleError) + ); + } - public getStatus(id: string): Observable<PcapStatusResponse> { - return this.http.get(`/api/v1/pcap/${id}`, - new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .map(HttpUtil.extractData) - .catch(HttpUtil.handleError); - } + public getStatus(id: string): Observable<PcapStatusResponse> { + return this.http.get(`/api/v1/pcap/${id}`).pipe( + map(HttpUtil.extractData), + catchError(HttpUtil.handleError) + ); + } - public getRunningJob(): Observable<PcapStatusResponse[]> { - return this.http.get(`/api/v1/pcap?state=RUNNING`, - new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .map(HttpUtil.extractData) - .catch(HttpUtil.handleError); - } + public getRunningJob(): Observable<PcapStatusResponse[]> { + return this.http.get(`/api/v1/pcap?state=RUNNING`).pipe( + map(HttpUtil.extractData), + catchError(HttpUtil.handleError) + ); + } - public getPackets(id: string, pageId: number): Observable<Pdml> { - return this.http.get(`/api/v1/pcap/${id}/pdml?page=${pageId}`, new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .map(HttpUtil.extractData) - .catch(HttpUtil.handleError); - } + public getPackets(id: string, pageId: number): Observable<Pdml> { + return this.http.get(`/api/v1/pcap/${id}/pdml?page=${pageId}`).pipe( + map(HttpUtil.extractData), + catchError(HttpUtil.handleError) + ); + } - public getPcapRequest(id: string): Observable<PcapRequest> { - return this.http.get(`/api/v1/pcap/${id}/config`, - new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .map(HttpUtil.extractData) - .catch(HttpUtil.handleError); - } + public getPcapRequest(id: string): Observable<PcapRequest> { + return this.http.get(`/api/v1/pcap/${id}/config`).pipe( + map(HttpUtil.extractData), + catchError(HttpUtil.handleError) + ); + } - public getDownloadUrl(id: string, pageId: number) { - return `/api/v1/pcap/${id}/raw?page=${pageId}`; - } + public getDownloadUrl(id: string, pageId: number) { + return `/api/v1/pcap/${id}/raw?page=${pageId}`; + } - public cancelQuery(queryId: string) { - return this.http - .delete(`/api/v1/pcap/kill/${queryId}`, new RequestOptions({ - headers: new Headers(this.defaultHeaders), - })) - .catch(HttpUtil.handleError); - } -} \ No newline at end of file + public cancelQuery(queryId: string) { + return this.http + .delete(`/api/v1/pcap/kill/${queryId}`) + .pipe(catchError(HttpUtil.handleError)); + } +} http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/service/alerts.service.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/service/alerts.service.ts b/metron-interface/metron-alerts/src/app/service/alerts.service.ts index 56939d8..3a329ab 100644 --- a/metron-interface/metron-alerts/src/app/service/alerts.service.ts +++ b/metron-interface/metron-alerts/src/app/service/alerts.service.ts @@ -16,21 +16,20 @@ * limitations under the License. */ import {Injectable} from '@angular/core'; -import {Observable} from 'rxjs/Rx'; +import {Observable} from 'rxjs'; +import { catchError } from 'rxjs/operators'; import {Alert} from '../model/alert'; -import {Http, Headers, RequestOptions} from '@angular/http'; +import { HttpClient } from '@angular/common/http'; import {HttpUtil} from '../utils/httpUtil'; +import { RestError } from '../model/rest-error'; @Injectable() export class AlertsService { - defaultHeaders = {'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest'}; + constructor(private http: HttpClient) {} - constructor(private http: Http) { - } - - public escalate(alerts: Alert[]): Observable<null> { - return this.http.post('/api/v1/alerts/ui/escalate', alerts, new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .catch(HttpUtil.handleError); + public escalate(alerts: Alert[]): Observable<Object | RestError> { + return this.http.post('/api/v1/alerts/ui/escalate', alerts).pipe( + catchError(HttpUtil.handleError)); } } http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/service/authentication.service.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/service/authentication.service.ts b/metron-interface/metron-alerts/src/app/service/authentication.service.ts index 33beb31..ad81b94 100644 --- a/metron-interface/metron-alerts/src/app/service/authentication.service.ts +++ b/metron-interface/metron-alerts/src/app/service/authentication.service.ts @@ -1,3 +1,4 @@ + /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -15,10 +16,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {Injectable, EventEmitter} from '@angular/core'; -import {Http, Headers, RequestOptions, Response} from '@angular/http'; +import { Injectable } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; import {Router} from '@angular/router'; -import {Observable} from 'rxjs/Observable'; +import { ReplaySubject } from 'rxjs'; import { GlobalConfigService } from './global-config.service'; import { DataSource } from './data-source'; @@ -29,10 +30,10 @@ export class AuthenticationService { private currentUser: string = AuthenticationService.USER_NOT_VERIFIED; loginUrl = '/api/v1/user'; logoutUrl = '/logout'; - defaultHeaders = {'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest'}; - onLoginEvent: EventEmitter<boolean> = new EventEmitter<boolean>(); + onLoginEvent: ReplaySubject<boolean> = new ReplaySubject<boolean>(); + $onLoginEvent = this.onLoginEvent.asObservable(); - constructor(private http: Http, + constructor(private http: HttpClient, private router: Router, private globalConfigService: GlobalConfigService, private dataSource: DataSource) { @@ -40,27 +41,26 @@ export class AuthenticationService { } public init() { - this.getCurrentUser(new RequestOptions({headers: new Headers(this.defaultHeaders)})).subscribe((response: Response) => { - this.currentUser = response.text(); + this.getCurrentUser({responseType: 'text'}).subscribe((response) => { + this.currentUser = response.toString(); if (this.currentUser) { - this.onLoginEvent.emit(true); + this.onLoginEvent.next(true); this.dataSource.getDefaultAlertTableColumnNames(); } }, error => { - this.onLoginEvent.emit(false); + this.onLoginEvent.next(false); }); } public login(username: string, password: string, onError): void { - let loginHeaders: Headers = new Headers(this.defaultHeaders); - loginHeaders.append('authorization', 'Basic ' + btoa(username + ':' + password)); - let loginOptions: RequestOptions = new RequestOptions({headers: loginHeaders}); - this.getCurrentUser(loginOptions).subscribe((response: Response) => { - this.currentUser = response.text(); - this.router.navigateByUrl('/alerts-list'); - this.onLoginEvent.emit(true); - this.globalConfigService.get(); - this.dataSource.getDefaultAlertTableColumnNames(); + let credentials = btoa(username + ':' + password); + this.getCurrentUser({ headers: new HttpHeaders({'Authorization': `Basic ${credentials}`}), responseType: 'text' }) + .subscribe((response) => { + this.currentUser = response.toString(); + this.router.navigateByUrl('/alerts-list'); + this.onLoginEvent.next(true); + this.globalConfigService.get(); + this.dataSource.getDefaultAlertTableColumnNames(); }, error => { onError(error); @@ -68,9 +68,9 @@ export class AuthenticationService { } public logout(): void { - this.http.post(this.logoutUrl, {}, new RequestOptions({headers: new Headers(this.defaultHeaders)})).subscribe(response => { + this.http.post(this.logoutUrl, {}).subscribe(response => { this.currentUser = AuthenticationService.USER_NOT_VERIFIED; - this.onLoginEvent.emit(false); + this.onLoginEvent.next(false); this.router.navigateByUrl('/login'); }, error => { @@ -85,7 +85,7 @@ export class AuthenticationService { } } - public getCurrentUser(options: RequestOptions): Observable<Response> { + public getCurrentUser(options?: {}) { return this.http.get(this.loginUrl, options); } http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/service/cluster-metadata.service.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/service/cluster-metadata.service.ts b/metron-interface/metron-alerts/src/app/service/cluster-metadata.service.ts index ffd4ec1..2a85700 100644 --- a/metron-interface/metron-alerts/src/app/service/cluster-metadata.service.ts +++ b/metron-interface/metron-alerts/src/app/service/cluster-metadata.service.ts @@ -16,20 +16,15 @@ * limitations under the License. */ import {Injectable} from '@angular/core'; -import {Observable} from 'rxjs/Rx'; -import {Http} from '@angular/http'; - +import {Observable} from 'rxjs'; import {ColumnMetadata} from '../model/column-metadata'; import {DataSource} from './data-source'; @Injectable() export class ClusterMetaDataService { - defaultHeaders: {'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest'}; - constructor(private http: Http, - private dataSource: DataSource) { - } + constructor(private dataSource: DataSource) {} getDefaultColumns(): Observable<ColumnMetadata[]> { return this.dataSource.getDefaultAlertTableColumnNames(); http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/service/column-names.service.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/service/column-names.service.ts b/metron-interface/metron-alerts/src/app/service/column-names.service.ts index e289ca2..d270fd8 100644 --- a/metron-interface/metron-alerts/src/app/service/column-names.service.ts +++ b/metron-interface/metron-alerts/src/app/service/column-names.service.ts @@ -16,8 +16,7 @@ * limitations under the License. */ import {Injectable} from '@angular/core'; -import {Observable} from 'rxjs/Rx'; -import {Http} from '@angular/http'; +import {Observable} from 'rxjs'; import {ColumnNames} from '../model/column-names'; import {DataSource} from './data-source'; @@ -58,8 +57,7 @@ export class ColumnNamesService { }); } - constructor(private http: Http, - private dataSource: DataSource) {} + constructor(private dataSource: DataSource) {} list(): Promise<ColumnNames[]> { return this.dataSource.getAlertTableColumnNames().toPromise(); http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/service/configure-table.service.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/service/configure-table.service.ts b/metron-interface/metron-alerts/src/app/service/configure-table.service.ts index 5c8f49d..a9309ea 100644 --- a/metron-interface/metron-alerts/src/app/service/configure-table.service.ts +++ b/metron-interface/metron-alerts/src/app/service/configure-table.service.ts @@ -16,9 +16,8 @@ * limitations under the License. */ import {Injectable} from '@angular/core'; -import {Observable} from 'rxjs/Rx'; -import {Http} from '@angular/http'; -import {Subject} from 'rxjs/Subject'; +import {Observable} from 'rxjs'; +import { Subject } from 'rxjs'; import {ColumnMetadata} from '../model/column-metadata'; import {TableMetadata} from '../model/table-metadata'; import {DataSource} from './data-source'; @@ -29,8 +28,7 @@ export class ConfigureTableService { private tableChangedSource = new Subject<string>(); tableChanged$ = this.tableChangedSource.asObservable(); - constructor(private http: Http, - private dataSource: DataSource) {} + constructor(private dataSource: DataSource) {} fireTableChanged() { this.tableChangedSource.next('table changed'); http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/service/data-source.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/service/data-source.ts b/metron-interface/metron-alerts/src/app/service/data-source.ts index f6d6cc0..70423eb 100644 --- a/metron-interface/metron-alerts/src/app/service/data-source.ts +++ b/metron-interface/metron-alerts/src/app/service/data-source.ts @@ -15,9 +15,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {Observable} from 'rxjs/Rx'; +import {Observable} from 'rxjs'; import {Injectable} from '@angular/core'; -import {Http} from '@angular/http'; +import { HttpClient } from '@angular/common/http'; import {ColumnMetadata} from '../model/column-metadata'; import {ColumnNames} from '../model/column-names'; import {TableMetadata} from '../model/table-metadata'; @@ -25,9 +25,8 @@ import {SaveSearch} from '../model/save-search'; @Injectable() export abstract class DataSource { - defaultHeaders: {'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest'}; - constructor(protected http: Http) {} + constructor(protected http: HttpClient) {} // Calls to fetch default alert table column names and all the field names across all indexes abstract getDefaultAlertTableColumnNames(): Observable<ColumnMetadata[]> http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/service/elasticsearch-localstorage-impl.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/service/elasticsearch-localstorage-impl.ts b/metron-interface/metron-alerts/src/app/service/elasticsearch-localstorage-impl.ts index fd4843a..6fd4107 100644 --- a/metron-interface/metron-alerts/src/app/service/elasticsearch-localstorage-impl.ts +++ b/metron-interface/metron-alerts/src/app/service/elasticsearch-localstorage-impl.ts @@ -1,3 +1,7 @@ + +import {throwError as observableThrowError} from 'rxjs'; + +import {catchError, map, onErrorResumeNext} from 'rxjs/operators'; /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -15,8 +19,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {Observable} from 'rxjs/Rx'; -import {Headers, RequestOptions} from '@angular/http'; +import {Observable} from 'rxjs'; import { Injectable } from '@angular/core'; import {HttpUtil} from '../utils/httpUtil'; import {DataSource} from './data-source'; @@ -33,6 +36,7 @@ import {SaveSearch} from '../model/save-search'; import {SearchResponse} from '../model/search-response'; import {SearchRequest} from '../model/search-request'; import {AlertSource} from '../model/alert-source'; +import { RestError } from '../model/rest-error'; @Injectable() export class ElasticSearchLocalstorageImpl extends DataSource { @@ -56,21 +60,21 @@ export class ElasticSearchLocalstorageImpl extends DataSource { let request: any = JSON.parse(JSON.stringify(searchRequest)); request.query = { query_string: { query: searchRequest.query } }; - return this.http.post(url, request, new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .map(HttpUtil.extractData) - .map(ElasticsearchUtils.extractAlertsData) - .catch(HttpUtil.handleError) - .onErrorResumeNext(); + return this.http.post(url, request).pipe( + map(HttpUtil.extractData), + map(ElasticsearchUtils.extractAlertsData), + catchError(HttpUtil.handleError), + onErrorResumeNext()); } getAlert(sourceType: string, alertId: string): Observable<AlertSource> { - return Observable.throw('Method not implemented in ElasticSearchLocalstorageImpl'); + return observableThrowError('Method not implemented in ElasticSearchLocalstorageImpl'); } updateAlertState(request: any): Observable<{}> { - return this.http.post('/search/_bulk', request, new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .map(HttpUtil.extractData) - .catch(HttpUtil.handleError); + return this.http.post('/search/_bulk', request).pipe( + map(HttpUtil.extractData), + catchError(HttpUtil.handleError)); } getDefaultAlertTableColumnNames(): Observable<ColumnMetadata[]> { @@ -80,12 +84,12 @@ export class ElasticSearchLocalstorageImpl extends DataSource { }); } - getAllFieldNames(): Observable<ColumnMetadata[]> { + getAllFieldNames(): Observable<RestError | ColumnMetadata[]> { let url = '_cluster/state'; - return this.http.get(url, new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .map(HttpUtil.extractData) - .map(ElasticsearchUtils.extractColumnNameData) - .catch(HttpUtil.handleError); + return this.http.get(url).pipe( + map(HttpUtil.extractData), + map(ElasticsearchUtils.extractColumnNameData), + catchError(HttpUtil.handleError)); } getAlertTableColumnNames(): Observable<ColumnNames[]> { http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/service/global-config.service.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/service/global-config.service.ts b/metron-interface/metron-alerts/src/app/service/global-config.service.ts index c80d65a..14ec3f3 100644 --- a/metron-interface/metron-alerts/src/app/service/global-config.service.ts +++ b/metron-interface/metron-alerts/src/app/service/global-config.service.ts @@ -1,3 +1,5 @@ + +import {catchError, map} from 'rxjs/operators'; /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -15,28 +17,27 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {Injectable, Inject} from '@angular/core'; -import {Http, Headers, RequestOptions, Response, ResponseOptions} from '@angular/http'; -import {Observable} from 'rxjs/Observable'; +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; import {HttpUtil} from '../utils/httpUtil'; @Injectable() export class GlobalConfigService { url = 'api/v1/global/config'; - defaultHeaders = {'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest'}; private globalConfig = {}; - constructor(private http: Http) {} + constructor(private http: HttpClient) {} public get(): Observable<{}> { - return this.http.get(this.url , new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .map((res: Response): any => { - let body = res.json(); + return this.http.get(this.url).pipe( + map((res): any => { + let body = res; let globalConfig = this.setDefaults(body); return globalConfig || {}; - }) - .catch(HttpUtil.handleError); + }), + catchError(HttpUtil.handleError)); } private setDefaults(globalConfig) { http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/service/meta-alert.service.ts ---------------------------------------------------------------------- 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 c9bb26d..c1b7a5b 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 @@ -1,3 +1,5 @@ + +import {map, catchError} from 'rxjs/operators'; /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -16,16 +18,12 @@ * limitations under the License. */ import {Injectable} from '@angular/core'; -import {Headers, RequestOptions} from '@angular/http'; -import {Subject} from 'rxjs/Subject'; -import {Observable} from 'rxjs/Rx'; -import 'rxjs/add/observable/interval'; -import 'rxjs/add/operator/switchMap'; -import 'rxjs/add/operator/onErrorResumeNext'; +import {Subject} from 'rxjs'; +import {Observable} from 'rxjs'; import {HttpUtil} from '../utils/httpUtil'; import {Alert} from '../model/alert'; -import {Http} from '@angular/http'; +import { HttpClient } from '@angular/common/http'; import {MetaAlertCreateRequest} from '../model/meta-alert-create-request'; import {MetaAlertAddRemoveRequest} from '../model/meta-alert-add-remove-request'; @@ -34,9 +32,8 @@ export class MetaAlertService { private _selectedAlerts: Alert[]; alertChangedSource = new Subject<MetaAlertAddRemoveRequest>(); alertChanged$ = this.alertChangedSource.asObservable(); - defaultHeaders = {'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest'}; - constructor(private http: Http) { + constructor(private http: HttpClient) { } get selectedAlerts(): Alert[] { @@ -49,40 +46,40 @@ export class MetaAlertService { public create(metaAlertCreateRequest: MetaAlertCreateRequest): Observable<{}> { let url = '/api/v1/metaalert/create'; - return this.http.post(url, metaAlertCreateRequest, new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .catch(HttpUtil.handleError); + return this.http.post(url, metaAlertCreateRequest).pipe( + catchError(HttpUtil.handleError)); } public addAlertsToMetaAlert(metaAlertAddRemoveRequest: MetaAlertAddRemoveRequest) { let url = '/api/v1/metaalert/add/alert'; - return this.http.post(url, metaAlertAddRemoveRequest, new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .catch(HttpUtil.handleError) - .map(result => { + return this.http.post(url, metaAlertAddRemoveRequest).pipe( + catchError(HttpUtil.handleError), + map(result => { this.alertChangedSource.next(metaAlertAddRemoveRequest); return result; - }); + })); } public removeAlertsFromMetaAlert(metaAlertAddRemoveRequest: MetaAlertAddRemoveRequest) { let url = '/api/v1/metaalert/remove/alert'; - return this.http.post(url, metaAlertAddRemoveRequest, new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .catch(HttpUtil.handleError) - .map(result => { + return this.http.post(url, metaAlertAddRemoveRequest).pipe( + catchError(HttpUtil.handleError), + map(result => { this.alertChangedSource.next(metaAlertAddRemoveRequest); return result; - }); + })); } public updateMetaAlertStatus(guid: string, status: string) { let url = `/api/v1/metaalert/update/status/${guid}/${status}`; - return this.http.post(url, {}, new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .catch(HttpUtil.handleError) - .map(result => { + 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; - }); + })); } } http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/service/save-search.service.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/service/save-search.service.ts b/metron-interface/metron-alerts/src/app/service/save-search.service.ts index dba03c2..9fa1891 100644 --- a/metron-interface/metron-alerts/src/app/service/save-search.service.ts +++ b/metron-interface/metron-alerts/src/app/service/save-search.service.ts @@ -16,9 +16,8 @@ * limitations under the License. */ import {Injectable, } from '@angular/core'; -import {Observable} from 'rxjs/Rx'; -import {Http} from '@angular/http'; -import {Subject} from 'rxjs/Subject'; +import {Observable} from 'rxjs'; +import { Subject } from 'rxjs'; import {QueryBuilder} from '../alerts/alerts-list/query-builder'; import {SaveSearch} from '../model/save-search'; import {ColumnMetadata} from '../model/column-metadata'; @@ -33,8 +32,7 @@ export class SaveSearchService { private loadSavedSearch = new Subject<SaveSearch>(); loadSavedSearch$ = this.loadSavedSearch.asObservable(); - constructor(private http: Http, - private dataSource: DataSource) {} + constructor(private dataSource: DataSource) {} deleteRecentSearch(saveSearch: SaveSearch): Observable<{}> { return this.dataSource.deleteRecentSearch(saveSearch); http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/service/search.service.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/service/search.service.ts b/metron-interface/metron-alerts/src/app/service/search.service.ts index 1e97e96..7e88966 100644 --- a/metron-interface/metron-alerts/src/app/service/search.service.ts +++ b/metron-interface/metron-alerts/src/app/service/search.service.ts @@ -15,19 +15,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {Http, Headers, RequestOptions} from '@angular/http'; +import { HttpClient } from '@angular/common/http'; import {Injectable, NgZone} from '@angular/core'; -import {Observable} from 'rxjs/Rx'; -import 'rxjs/add/observable/interval'; -import 'rxjs/add/operator/switchMap'; -import 'rxjs/add/operator/onErrorResumeNext'; - +import {Observable} from 'rxjs'; +import { map, onErrorResumeNext, catchError, switchMap } from 'rxjs/operators'; +import { interval as observableInterval } from 'rxjs'; import {HttpUtil} from '../utils/httpUtil'; import {SearchResponse} from '../model/search-response'; import {SearchRequest} from '../model/search-request'; import {AlertSource} from '../model/alert-source'; import {GroupRequest} from '../model/group-request'; import {GroupResult} from '../model/group-result'; +import { RestError } from '../model/rest-error'; import {INDEXES} from '../utils/constants'; import {ColumnMetadata} from '../model/column-metadata'; import {QueryBuilder} from '../alerts/alerts-list/query-builder'; @@ -36,9 +35,8 @@ import {QueryBuilder} from '../alerts/alerts-list/query-builder'; export class SearchService { interval = 80000; - defaultHeaders = {'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest'}; - private static extractColumnNameDataFromRestApi(res: Response): ColumnMetadata[] { + private static extractColumnNameDataFromRestApi(res): ColumnMetadata[] { let response: any = res || {}; let processedKeys: string[] = []; let columnMetadatas: ColumnMetadata[] = []; @@ -53,49 +51,49 @@ export class SearchService { return columnMetadatas; } - constructor(private http: Http, + constructor(private http: HttpClient, private ngZone: NgZone) { } groups(groupRequest: GroupRequest): Observable<GroupResult> { let url = '/api/v1/search/group'; - return this.http.post(url, groupRequest, new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .map(HttpUtil.extractData) - .catch(HttpUtil.handleError) - .onErrorResumeNext(); + return this.http.post(url, groupRequest).pipe( + map(HttpUtil.extractData), + catchError(HttpUtil.handleError), + onErrorResumeNext()); } public getAlert(sourceType: string, alertId: string): Observable<AlertSource> { let url = '/api/v1/search/findOne'; let requestSchema = { guid: alertId, sensorType: sourceType}; - return this.http.post(url, requestSchema, new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .map(HttpUtil.extractData) - .catch(HttpUtil.handleError) - .onErrorResumeNext(); + return this.http.post(url, requestSchema).pipe( + map(HttpUtil.extractData), + catchError(HttpUtil.handleError), + onErrorResumeNext()); } - public getColumnMetaData(): Observable<ColumnMetadata[]> { + public getColumnMetaData(): Observable<RestError | ColumnMetadata[]> { let url = '/api/v1/search/column/metadata'; - return this.http.post(url, INDEXES, new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .map(HttpUtil.extractData) - .map(SearchService.extractColumnNameDataFromRestApi) - .catch(HttpUtil.handleError); + return this.http.post(url, INDEXES).pipe( + map(HttpUtil.extractData), + map(SearchService.extractColumnNameDataFromRestApi), + catchError(HttpUtil.handleError)); } public pollSearch(queryBuilder: QueryBuilder): Observable<SearchResponse> { return this.ngZone.runOutsideAngular(() => { return this.ngZone.run(() => { - return Observable.interval(this.interval * 1000).switchMap(() => { + return observableInterval(this.interval * 1000).pipe(switchMap(() => { return this.search(queryBuilder.searchRequest); - }); + })); }); }); } public search(searchRequest: SearchRequest): Observable<SearchResponse> { let url = '/api/v1/search/search'; - return this.http.post(url, searchRequest, new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .map(HttpUtil.extractData) - .catch(HttpUtil.handleError) - .onErrorResumeNext(); + return this.http.post(url, searchRequest).pipe( + map(HttpUtil.extractData), + catchError(HttpUtil.handleError), + onErrorResumeNext()); } } http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/service/update.service.ts ---------------------------------------------------------------------- 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 3a18fc2..448d475 100644 --- a/metron-interface/metron-alerts/src/app/service/update.service.ts +++ b/metron-interface/metron-alerts/src/app/service/update.service.ts @@ -16,16 +16,13 @@ * limitations under the License. */ import {Injectable} from '@angular/core'; -import {Headers, RequestOptions} from '@angular/http'; -import {Subject} from 'rxjs/Subject'; -import {Observable} from 'rxjs/Rx'; -import 'rxjs/add/observable/interval'; -import 'rxjs/add/operator/switchMap'; -import 'rxjs/add/operator/onErrorResumeNext'; +import { HttpClient } from '@angular/common/http'; +import {Observable} from 'rxjs'; +import { forkJoin as observableForkJoin, Subject } from 'rxjs'; +import { catchError, map } from 'rxjs/operators'; import {HttpUtil} from '../utils/httpUtil'; import {Alert} from '../model/alert'; -import {Http} from '@angular/http'; import {PatchRequest} from '../model/patch-request'; import {Utils} from '../utils/utils'; import {Patch} from '../model/patch'; @@ -35,15 +32,13 @@ import {CommentAddRemoveRequest} from "../model/comment-add-remove-request"; @Injectable() export class UpdateService { - defaultHeaders = {'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest'}; - alertChangedSource = new Subject<PatchRequest>(); alertChanged$ = this.alertChangedSource.asObservable(); sourceType = 'source:type'; alertCommentChangedSource = new Subject<CommentAddRemoveRequest>(); alertCommentChanged$ = this.alertCommentChangedSource.asObservable(); - constructor(private http: Http, private globalConfigService: GlobalConfigService) { + constructor(private http: HttpClient, private globalConfigService: GlobalConfigService) { this.globalConfigService.get().subscribe((config: {}) => { this.sourceType = config['source.type.field']; }); @@ -51,38 +46,38 @@ export class UpdateService { public addComment(commentRequest: CommentAddRemoveRequest, fireChangeListener = true): Observable<{}> { let url = '/api/v1/update/add/comment'; - return this.http.post(url, commentRequest, new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .catch(HttpUtil.handleError) - .map(result => { + return this.http.post(url, commentRequest).pipe( + catchError(HttpUtil.handleError), + map(result => { if (fireChangeListener) { this.alertCommentChangedSource.next(commentRequest); } return result; - }); + })); } public removeComment(commentRequest: CommentAddRemoveRequest, fireChangeListener = true): Observable<{}> { let url = '/api/v1/update/remove/comment'; - return this.http.post(url, commentRequest, new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .catch(HttpUtil.handleError) - .map(result => { + return this.http.post(url, commentRequest).pipe( + catchError(HttpUtil.handleError), + map(result => { if (fireChangeListener) { this.alertCommentChangedSource.next(commentRequest); } return result; - }); + })); } public patch(patchRequest: PatchRequest, fireChangeListener = true): Observable<{}> { let url = '/api/v1/update/patch'; - return this.http.patch(url, patchRequest, new RequestOptions({headers: new Headers(this.defaultHeaders)})) - .catch(HttpUtil.handleError) - .map(result => { + return this.http.patch(url, patchRequest).pipe( + catchError(HttpUtil.handleError), + map(result => { if (fireChangeListener) { this.alertChangedSource.next(patchRequest); } return result; - }); + }),); } public updateAlertState(alerts: Alert[], state: string, fireChangeListener = true): Observable<{}> { @@ -97,6 +92,6 @@ export class UpdateService { for (let patchRequest of patchRequests) { patchObservables.push(this.patch(patchRequest, fireChangeListener)); } - return Observable.forkJoin(patchObservables); + return observableForkJoin(patchObservables); } } http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/shared/auth-guard.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/shared/auth-guard.ts b/metron-interface/metron-alerts/src/app/shared/auth-guard.ts index 66c27cf..3271853 100644 --- a/metron-interface/metron-alerts/src/app/shared/auth-guard.ts +++ b/metron-interface/metron-alerts/src/app/shared/auth-guard.ts @@ -22,7 +22,7 @@ import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { AuthenticationService } from '../service/authentication.service'; @Injectable() http://git-wip-us.apache.org/repos/asf/metron/blob/33792c24/metron-interface/metron-alerts/src/app/shared/index.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/src/app/shared/index.ts b/metron-interface/metron-alerts/src/app/shared/index.ts deleted file mode 100644 index a0ff001..0000000 --- a/metron-interface/metron-alerts/src/app/shared/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -