http://git-wip-us.apache.org/repos/asf/metron/blob/8bf3b6ec/metron-interface/metron-config/src/app/sensors/sensor-parser-config-readonly/sensor-parser-config-readonly.component.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-config/src/app/sensors/sensor-parser-config-readonly/sensor-parser-config-readonly.component.ts b/metron-interface/metron-config/src/app/sensors/sensor-parser-config-readonly/sensor-parser-config-readonly.component.ts index 5db6d45..2904ef5 100644 --- a/metron-interface/metron-config/src/app/sensors/sensor-parser-config-readonly/sensor-parser-config-readonly.component.ts +++ b/metron-interface/metron-config/src/app/sensors/sensor-parser-config-readonly/sensor-parser-config-readonly.component.ts @@ -15,23 +15,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {Component, OnInit} from '@angular/core'; -import {KafkaService} from '../../service/kafka.service'; -import {Router, ActivatedRoute} from '@angular/router'; -import {KafkaTopic} from '../../model/kafka-topic'; -import {MetronAlerts} from '../../shared/metron-alerts'; -import {SensorParserConfigService} from '../../service/sensor-parser-config.service'; -import {StormService} from '../../service/storm.service'; -import {TopologyStatus} from '../../model/topology-status'; -import {SensorParserConfigHistoryService} from '../../service/sensor-parser-config-history.service'; -import {SensorParserConfigHistory} from '../../model/sensor-parser-config-history'; -import {SensorEnrichmentConfigService} from '../../service/sensor-enrichment-config.service'; -import {SensorEnrichmentConfig} from '../../model/sensor-enrichment-config'; -import {RiskLevelRule} from '../../model/risk-level-rule'; -import {HdfsService} from '../../service/hdfs.service'; -import {RestError} from '../../model/rest-error'; -import {GrokValidationService} from '../../service/grok-validation.service'; -import {SensorParserConfig} from '../../model/sensor-parser-config'; +import { Component, OnInit } from '@angular/core'; +import { KafkaService } from '../../service/kafka.service'; +import { Router, ActivatedRoute } from '@angular/router'; +import { KafkaTopic } from '../../model/kafka-topic'; +import { MetronAlerts } from '../../shared/metron-alerts'; +import { SensorParserConfigService } from '../../service/sensor-parser-config.service'; +import { StormService } from '../../service/storm.service'; +import { TopologyStatus } from '../../model/topology-status'; +import { SensorParserConfigHistoryService } from '../../service/sensor-parser-config-history.service'; +import { SensorParserConfigHistory } from '../../model/sensor-parser-config-history'; +import { SensorEnrichmentConfigService } from '../../service/sensor-enrichment-config.service'; +import { SensorEnrichmentConfig } from '../../model/sensor-enrichment-config'; +import { RiskLevelRule } from '../../model/risk-level-rule'; +import { HdfsService } from '../../service/hdfs.service'; +import { RestError } from '../../model/rest-error'; +import { GrokValidationService } from '../../service/grok-validation.service'; +import { SensorParserConfig } from '../../model/sensor-parser-config'; @Component({ selector: 'metron-config-sensor-parser-readonly', @@ -39,7 +39,6 @@ import {SensorParserConfig} from '../../model/sensor-parser-config'; styleUrls: ['sensor-parser-config-readonly.component.scss'] }) export class SensorParserConfigReadonlyComponent implements OnInit { - selectedSensorName: string; startStopInProgress: boolean = false; kafkaTopic: KafkaTopic = new KafkaTopic(); @@ -47,78 +46,149 @@ export class SensorParserConfigReadonlyComponent implements OnInit { sensorParserConfig: SensorParserConfig = new SensorParserConfig(); topologyStatus: TopologyStatus = new TopologyStatus(); sensorEnrichmentConfig: SensorEnrichmentConfig = new SensorEnrichmentConfig(); - grokStatement: string = ''; + grokStatement = {}; transformsConfigKeys: string[] = []; transformsConfigMap: {} = {}; rules: RiskLevelRule[] = []; transformLinkText = 'show more'; threatTriageLinkText = 'show more'; - editViewMetaData: {label?: string, value?: string, type?: string, model?: string, boldTitle?: boolean}[] = [ - {type: 'SEPARATOR', model: '', value: ''}, - {label: 'PARSER', model: 'sensorParserConfigHistory', value: 'parserClassName'}, - {label: 'LAST UPDATED', model: 'sensorParserConfigHistory', value: 'modifiedByDate'}, - {label: 'LAST EDITOR', model: 'sensorParserConfigHistory', value: 'modifiedBy'}, - {label: 'STATE', model: 'topologyStatus', value: 'sensorStatus'}, - {label: 'ORIGINATOR', model: 'sensorParserConfigHistory', value: 'createdBy'}, - {label: 'CREATION DATE', model: 'sensorParserConfigHistory', value: 'createdDate'}, - - {type: 'SPACER', model: '', value: ''}, - - {label: 'STORM', model: 'topologyStatus', value: 'status', boldTitle: true}, - {label: 'LATENCY', model: 'topologyStatus', value: 'latency'}, - {label: 'THROUGHPUT', model: 'topologyStatus', value: 'throughput'}, - {label: 'EMITTED(10 MIN)', model: 'topologyStatus', value: 'emitted'}, - {label: 'ACKED(10 MIN)', model: 'topologyStatus', value: 'acked'}, - {label: 'NUM WORKERS', model: 'sensorParserConfig', value: 'numWorkers'}, - {label: 'NUM ACKERS', model: 'sensorParserConfig', value: 'numAckers'}, - {label: 'SPOUT PARALLELISM', model: 'sensorParserConfig', value: 'spoutParallelism'}, - {label: 'SPOUT NUM TASKS', model: 'sensorParserConfig', value: 'spoutNumTasks'}, - {label: 'PARSER PARALLELISM', model: 'sensorParserConfig', value: 'parserParallelism'}, - {label: 'PARSER NUM TASKS', model: 'sensorParserConfig', value: 'parserNumTasks'}, - {label: 'ERROR WRITER PARALLELISM', model: 'sensorParserConfig', value: 'errorWriterParallelism'}, - {label: 'ERROR NUM TASKS', model: 'sensorParserConfig', value: 'errorWriterNumTasks'}, - - {type: 'SPACER', model: '', value: ''}, - - {label: 'KAFKA', model: 'kafkaTopic', value: 'currentKafkaStatus', boldTitle: true}, - {label: 'PARTITONS', model: 'kafkaTopic', value: 'numPartitions'}, - {label: 'REPLICATION FACTOR', model: 'kafkaTopic', value: 'replicationFactor'}, - {type: 'SEPARATOR', model: '', value: ''}, - - {label: '', model: 'grokStatement', value: 'grokPattern'}, - - {type: 'TITLE', model: '', value: 'Schema'}, - {label: '', model: 'transforms', value: ''}, - {type: 'SEPARATOR', model: '', value: ''}, - - {type: 'TITLE', model: '', value: 'Threat Triage Rules'}, - {label: '', model: 'threatTriageRules', value: ''} - + editViewMetaData: { + label?: string; + value?: string; + type?: string; + model?: string; + boldTitle?: boolean; + }[] = [ + { type: 'SEPARATOR', model: '', value: '' }, + { + label: 'PARSER', + model: 'sensorParserConfigHistory', + value: 'parserClassName' + }, + { + label: 'LAST UPDATED', + model: 'sensorParserConfigHistory', + value: 'modifiedByDate' + }, + { + label: 'LAST EDITOR', + model: 'sensorParserConfigHistory', + value: 'modifiedBy' + }, + { label: 'STATE', model: 'topologyStatus', value: 'sensorStatus' }, + { + label: 'ORIGINATOR', + model: 'sensorParserConfigHistory', + value: 'createdBy' + }, + { + label: 'CREATION DATE', + model: 'sensorParserConfigHistory', + value: 'createdDate' + }, + + { type: 'SPACER', model: '', value: '' }, + + { + label: 'STORM', + model: 'topologyStatus', + value: 'status', + boldTitle: true + }, + { label: 'LATENCY', model: 'topologyStatus', value: 'latency' }, + { label: 'THROUGHPUT', model: 'topologyStatus', value: 'throughput' }, + { label: 'EMITTED(10 MIN)', model: 'topologyStatus', value: 'emitted' }, + { label: 'ACKED(10 MIN)', model: 'topologyStatus', value: 'acked' }, + { label: 'NUM WORKERS', model: 'sensorParserConfig', value: 'numWorkers' }, + { label: 'NUM ACKERS', model: 'sensorParserConfig', value: 'numAckers' }, + { + label: 'SPOUT PARALLELISM', + model: 'sensorParserConfig', + value: 'spoutParallelism' + }, + { + label: 'SPOUT NUM TASKS', + model: 'sensorParserConfig', + value: 'spoutNumTasks' + }, + { + label: 'PARSER PARALLELISM', + model: 'sensorParserConfig', + value: 'parserParallelism' + }, + { + label: 'PARSER NUM TASKS', + model: 'sensorParserConfig', + value: 'parserNumTasks' + }, + { + label: 'ERROR WRITER PARALLELISM', + model: 'sensorParserConfig', + value: 'errorWriterParallelism' + }, + { + label: 'ERROR NUM TASKS', + model: 'sensorParserConfig', + value: 'errorWriterNumTasks' + }, + + { type: 'SPACER', model: '', value: '' }, + + { + label: 'KAFKA', + model: 'kafkaTopic', + value: 'currentKafkaStatus', + boldTitle: true + }, + { label: 'PARTITONS', model: 'kafkaTopic', value: 'numPartitions' }, + { + label: 'REPLICATION FACTOR', + model: 'kafkaTopic', + value: 'replicationFactor' + }, + { type: 'SEPARATOR', model: '', value: '' }, + + { label: '', model: 'grokStatement', value: 'grokPattern' }, + + { type: 'TITLE', model: '', value: 'Schema' }, + { label: '', model: 'transforms', value: '' }, + { type: 'SEPARATOR', model: '', value: '' }, + + { type: 'TITLE', model: '', value: 'Threat Triage Rules' }, + { label: '', model: 'threatTriageRules', value: '' } ]; - constructor(private sensorParserConfigHistoryService: SensorParserConfigHistoryService, - private sensorParserConfigService: SensorParserConfigService, - private sensorEnrichmentService: SensorEnrichmentConfigService, - private stormService: StormService, - private kafkaService: KafkaService, - private hdfsService: HdfsService, - private grokValidationService: GrokValidationService, - private activatedRoute: ActivatedRoute, private router: Router, - private metronAlerts: MetronAlerts) { - } + constructor( + private sensorParserConfigHistoryService: SensorParserConfigHistoryService, + private sensorParserConfigService: SensorParserConfigService, + private sensorEnrichmentService: SensorEnrichmentConfigService, + private stormService: StormService, + private kafkaService: KafkaService, + private hdfsService: HdfsService, + private grokValidationService: GrokValidationService, + private activatedRoute: ActivatedRoute, + private router: Router, + private metronAlerts: MetronAlerts + ) {} getSensorInfo(): void { - this.sensorParserConfigHistoryService.get(this.selectedSensorName).subscribe( - (results: SensorParserConfigHistory) => { + this.sensorParserConfigHistoryService + .get(this.selectedSensorName) + .subscribe((results: SensorParserConfigHistory) => { this.sensorParserConfigHistory = results; this.sensorParserConfig = this.sensorParserConfigHistory.config; this.setGrokStatement(); this.setTransformsConfigKeys(); - let items = this.sensorParserConfigHistory.config.parserClassName.split('.'); - this.sensorParserConfigHistory['parserClassName'] = items[items.length - 1].replace('Basic', '').replace('Parser', ''); - + let items = this.sensorParserConfigHistory.config.parserClassName.split( + '.' + ); + this.sensorParserConfigHistory['parserClassName'] = items[ + items.length - 1 + ] + .replace('Basic', '') + .replace('Parser', ''); }); } @@ -129,40 +199,57 @@ export class SensorParserConfigReadonlyComponent implements OnInit { }, error => { this.topologyStatus.status = 'Stopped'; - }); + } + ); } getKafkaData(): void { this.kafkaService.get(this.selectedSensorName).subscribe( (results: KafkaTopic) => { this.kafkaTopic = results; - this.kafkaService.sample(this.selectedSensorName).subscribe((sampleData: string) => { - this.kafkaTopic['currentKafkaStatus'] = (sampleData && sampleData.length > 0) ? 'Emitting' : 'Not Emitting'; - }, - error => { - this.kafkaTopic['currentKafkaStatus'] = 'Not Emitting'; - }); - }, error => { - this.kafkaTopic['currentKafkaStatus'] = 'No Kafka Topic'; - }); + this.kafkaService.sample(this.selectedSensorName).subscribe( + (sampleData: string) => { + this.kafkaTopic['currentKafkaStatus'] = + sampleData && sampleData.length > 0 ? 'Emitting' : 'Not Emitting'; + }, + error => { + this.kafkaTopic['currentKafkaStatus'] = 'Not Emitting'; + } + ); + }, + error => { + this.kafkaTopic['currentKafkaStatus'] = 'No Kafka Topic'; + } + ); } getEnrichmentData() { - this.sensorEnrichmentService.get(this.selectedSensorName).subscribe((sensorEnrichmentConfig) => { - this.sensorEnrichmentConfig = sensorEnrichmentConfig; - this.rules = sensorEnrichmentConfig.threatIntel.triageConfig.riskLevelRules; - }); + this.sensorEnrichmentService + .get(this.selectedSensorName) + .subscribe(sensorEnrichmentConfig => { + this.sensorEnrichmentConfig = sensorEnrichmentConfig; + this.rules = + sensorEnrichmentConfig.threatIntel.triageConfig.riskLevelRules; + }); } getTopologyStatus(key: string): string { if (key === 'latency') { - return this.topologyStatus.latency >= 0 ? (this.topologyStatus.latency + 's') : '-'; + return this.topologyStatus.latency >= 0 + ? this.topologyStatus.latency + 'ms' + : '-'; } else if (key === 'throughput') { - return this.topologyStatus.throughput >= 0 ? ((Math.round(this.topologyStatus.throughput * 100) / 100) + 'kb/s') : '-'; + return this.topologyStatus.throughput >= 0 + ? Math.round(this.topologyStatus.throughput * 100) / 100 + 'kb/s' + : '-'; } else if (key === 'emitted') { - return this.topologyStatus.emitted >= 0 ? (this.topologyStatus.emitted + '') : '-'; + return this.topologyStatus.emitted >= 0 + ? this.topologyStatus.emitted + '' + : '-'; } else if (key === 'acked') { - return this.topologyStatus.acked >= 0 ? (this.topologyStatus.acked + '') : '-'; + return this.topologyStatus.acked >= 0 + ? this.topologyStatus.acked + '' + : '-'; } else if (key === 'sensorStatus') { if (this.topologyStatus.status === 'ACTIVE') { return 'Enabled'; @@ -173,7 +260,7 @@ export class SensorParserConfigReadonlyComponent implements OnInit { } } else if (key === 'status') { if (this.topologyStatus.status === 'ACTIVE') { - return 'Running'; + return 'Running'; } else if (this.topologyStatus.status === 'INACTIVE') { return 'Disabled'; } else { @@ -201,27 +288,43 @@ export class SensorParserConfigReadonlyComponent implements OnInit { } setGrokStatement() { - if (this.sensorParserConfigHistory.config && this.sensorParserConfigHistory.config.parserConfig) { + if ( + this.sensorParserConfigHistory.config && + this.sensorParserConfigHistory.config.parserConfig + ) { let path = this.sensorParserConfigHistory.config.parserConfig['grokPath']; if (path) { - this.hdfsService.read(path).subscribe(contents => { - this.grokStatement = contents; - }, (hdfsError: RestError) => { - this.grokValidationService.getStatement(path).subscribe(contents => { + this.hdfsService.read(path).subscribe( + contents => { this.grokStatement = contents; - }, (grokError: RestError) => { - this.metronAlerts.showErrorMessage('Could not find grok statement in HDFS or classpath at ' + path); - }); - }); + }, + (hdfsError: RestError) => { + this.grokValidationService.getStatement(path).subscribe( + contents => { + this.grokStatement = contents; + }, + (grokError: RestError) => { + this.metronAlerts.showErrorMessage( + 'Could not find grok statement in HDFS or classpath at ' + + path + ); + } + ); + } + ); } } } setTransformsConfigKeys() { - if (this.sensorParserConfigHistory.config && this.sensorParserConfigHistory.config.fieldTransformations && - this.sensorParserConfigHistory.config.fieldTransformations.length > 0) { + if ( + this.sensorParserConfigHistory.config && + this.sensorParserConfigHistory.config.fieldTransformations && + this.sensorParserConfigHistory.config.fieldTransformations.length > 0 + ) { this.transformsConfigKeys = []; - for (let transforms of this.sensorParserConfigHistory.config.fieldTransformations) { + for (let transforms of this.sensorParserConfigHistory.config + .fieldTransformations) { if (transforms.config) { for (let key of Object.keys(transforms.config)) { if (this.transformsConfigKeys.indexOf(key) === -1) { @@ -237,10 +340,14 @@ export class SensorParserConfigReadonlyComponent implements OnInit { } getTransformsOutput(): string { - if (this.sensorParserConfigHistory.config && this.sensorParserConfigHistory.config.fieldTransformations && - this.sensorParserConfigHistory.config.fieldTransformations.length > 0) { + if ( + this.sensorParserConfigHistory.config && + this.sensorParserConfigHistory.config.fieldTransformations && + this.sensorParserConfigHistory.config.fieldTransformations.length > 0 + ) { let output = []; - for (let transforms of this.sensorParserConfigHistory.config.fieldTransformations) { + for (let transforms of this.sensorParserConfigHistory.config + .fieldTransformations) { if (transforms.output) { output = output.concat(transforms.output); } @@ -260,14 +367,17 @@ export class SensorParserConfigReadonlyComponent implements OnInit { } onEditSensor() { - this.router.navigateByUrl('/sensors(dialog:sensors-config/' + this.selectedSensorName + ')'); + this.router.navigateByUrl( + '/sensors(dialog:sensors-config/' + this.selectedSensorName + ')' + ); } onStartSensor() { this.toggleStartStopInProgress(); let name = this.selectedSensorName; - this.stormService.startParser(name).subscribe(result => { + this.stormService.startParser(name).subscribe( + result => { this.metronAlerts.showSuccessMessage('Started sensor ' + name); this.toggleStartStopInProgress(); this.getData(); @@ -275,14 +385,16 @@ export class SensorParserConfigReadonlyComponent implements OnInit { error => { this.metronAlerts.showErrorMessage('Unable to start sensor ' + name); this.toggleStartStopInProgress(); - }); + } + ); } onStopSensor() { this.toggleStartStopInProgress(); let name = this.selectedSensorName; - this.stormService.stopParser(name).subscribe(result => { + this.stormService.stopParser(name).subscribe( + result => { this.metronAlerts.showSuccessMessage('Stopped sensor ' + name); this.toggleStartStopInProgress(); this.getData(); @@ -290,14 +402,16 @@ export class SensorParserConfigReadonlyComponent implements OnInit { error => { this.metronAlerts.showErrorMessage('Unable to stop sensor ' + name); this.toggleStartStopInProgress(); - }); + } + ); } onEnableSensor() { this.toggleStartStopInProgress(); let name = this.selectedSensorName; - this.stormService.activateParser(name).subscribe(result => { + this.stormService.activateParser(name).subscribe( + result => { this.metronAlerts.showSuccessMessage('Enabled sensor ' + name); this.toggleStartStopInProgress(); this.getData(); @@ -305,14 +419,16 @@ export class SensorParserConfigReadonlyComponent implements OnInit { error => { this.metronAlerts.showErrorMessage('Unable to enabled sensor ' + name); this.toggleStartStopInProgress(); - }); + } + ); } onDisableSensor() { this.toggleStartStopInProgress(); let name = this.selectedSensorName; - this.stormService.deactivateParser(name).subscribe(result => { + this.stormService.deactivateParser(name).subscribe( + result => { this.metronAlerts.showSuccessMessage('Disabled sensor ' + name); this.toggleStartStopInProgress(); this.getData(); @@ -320,14 +436,16 @@ export class SensorParserConfigReadonlyComponent implements OnInit { error => { this.metronAlerts.showErrorMessage('Unable to disable sensor ' + name); this.toggleStartStopInProgress(); - }); + } + ); } onDeleteSensor() { this.toggleStartStopInProgress(); let name = this.selectedSensorName; - this.sensorParserConfigService.deleteSensorParserConfig(name).subscribe(result => { + this.sensorParserConfigService.deleteSensorParserConfig(name).subscribe( + result => { this.metronAlerts.showSuccessMessage('Deleted sensor ' + name); this.toggleStartStopInProgress(); this.sensorParserConfigService.dataChangedSource.next([name]); @@ -336,7 +454,8 @@ export class SensorParserConfigReadonlyComponent implements OnInit { error => { this.metronAlerts.showErrorMessage('Unable to delete sensor ' + name); this.toggleStartStopInProgress(); - }); + } + ); } toggleStartStopInProgress() { @@ -356,28 +475,42 @@ export class SensorParserConfigReadonlyComponent implements OnInit { } toggleTransformLink() { - return this.transformLinkText = (this.transformLinkText === 'show more') ? 'show less' : 'show more'; + return (this.transformLinkText = + this.transformLinkText === 'show more' ? 'show less' : 'show more'); } toggleThreatTriageLink() { - return this.threatTriageLinkText = (this.threatTriageLinkText === 'show more') ? 'show less' : 'show more'; + return (this.threatTriageLinkText = + this.threatTriageLinkText === 'show more' ? 'show less' : 'show more'); } isStartHidden() { - return (this.topologyStatus.status === 'ACTIVE' || this.topologyStatus.status === 'INACTIVE'); + return ( + this.topologyStatus.status === 'ACTIVE' || + this.topologyStatus.status === 'INACTIVE' + ); } isStopHidden() { - return ((this.topologyStatus.status === 'KILLED' || this.topologyStatus.status === 'Stopped')); + return ( + this.topologyStatus.status === 'KILLED' || + this.topologyStatus.status === 'Stopped' + ); } isEnableHidden() { - return (this.topologyStatus.status === 'ACTIVE' || this.topologyStatus.status === 'KILLED' - || this.topologyStatus.status === 'Stopped'); + return ( + this.topologyStatus.status === 'ACTIVE' || + this.topologyStatus.status === 'KILLED' || + this.topologyStatus.status === 'Stopped' + ); } isDisableHidden() { - return (this.topologyStatus.status === 'INACTIVE' || this.topologyStatus.status === 'KILLED' - || this.topologyStatus.status === 'Stopped'); + return ( + this.topologyStatus.status === 'INACTIVE' || + this.topologyStatus.status === 'KILLED' || + this.topologyStatus.status === 'Stopped' + ); } }
http://git-wip-us.apache.org/repos/asf/metron/blob/8bf3b6ec/metron-interface/metron-config/src/app/sensors/sensor-parser-config/sensor-parser-config.component.spec.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-config/src/app/sensors/sensor-parser-config/sensor-parser-config.component.spec.ts b/metron-interface/metron-config/src/app/sensors/sensor-parser-config/sensor-parser-config.component.spec.ts index d5f3d67..06927f4 100644 --- a/metron-interface/metron-config/src/app/sensors/sensor-parser-config/sensor-parser-config.component.spec.ts +++ b/metron-interface/metron-config/src/app/sensors/sensor-parser-config/sensor-parser-config.component.spec.ts @@ -15,36 +15,38 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {async, ComponentFixture, TestBed} from '@angular/core/testing'; -import {Inject} from '@angular/core'; -import {Observable} from 'rxjs/Observable'; -import {Router, ActivatedRoute, Params} from '@angular/router'; -import {Http, RequestOptions, Response, ResponseOptions} from '@angular/http'; -import {SensorParserConfigComponent, Pane, KafkaStatus} from './sensor-parser-config.component'; -import {StellarService} from '../../service/stellar.service'; -import {SensorParserConfigService} from '../../service/sensor-parser-config.service'; -import {KafkaService} from '../../service/kafka.service'; -import {KafkaTopic} from '../../model/kafka-topic'; -import {GrokValidationService} from '../../service/grok-validation.service'; -import {MetronAlerts} from '../../shared/metron-alerts'; -import {SensorParserConfig} from '../../model/sensor-parser-config'; -import {ParseMessageRequest} from '../../model/parse-message-request'; -import {SensorParserContext} from '../../model/sensor-parser-context'; -import {AuthenticationService} from '../../service/authentication.service'; -import {FieldTransformer} from '../../model/field-transformer'; -import {SensorParserConfigModule} from './sensor-parser-config.module'; -import {SensorEnrichmentConfigService} from '../../service/sensor-enrichment-config.service'; -import {SensorEnrichmentConfig} from '../../model/sensor-enrichment-config'; -import {APP_CONFIG, METRON_REST_CONFIG} from '../../app.config'; -import {IAppConfig} from '../../app.config.interface'; -import {SensorIndexingConfigService} from '../../service/sensor-indexing-config.service'; -import {IndexingConfigurations} from '../../model/sensor-indexing-config'; -import '../../rxjs-operators'; -import 'rxjs/add/observable/of'; -import {HdfsService} from '../../service/hdfs.service'; -import {RestError} from '../../model/rest-error'; -import {RiskLevelRule} from '../../model/risk-level-rule'; - +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { Inject } from '@angular/core'; +import { Observable, throwError } from 'rxjs'; +import { Router, ActivatedRoute, Params } from '@angular/router'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { + SensorParserConfigComponent, + Pane, + KafkaStatus +} from './sensor-parser-config.component'; +import { StellarService } from '../../service/stellar.service'; +import { SensorParserConfigService } from '../../service/sensor-parser-config.service'; +import { KafkaService } from '../../service/kafka.service'; +import { KafkaTopic } from '../../model/kafka-topic'; +import { GrokValidationService } from '../../service/grok-validation.service'; +import { MetronAlerts } from '../../shared/metron-alerts'; +import { SensorParserConfig } from '../../model/sensor-parser-config'; +import { ParseMessageRequest } from '../../model/parse-message-request'; +import { SensorParserContext } from '../../model/sensor-parser-context'; +import { AuthenticationService } from '../../service/authentication.service'; +import { FieldTransformer } from '../../model/field-transformer'; +import { SensorParserConfigModule } from './sensor-parser-config.module'; +import { SensorEnrichmentConfigService } from '../../service/sensor-enrichment-config.service'; +import { SensorEnrichmentConfig } from '../../model/sensor-enrichment-config'; +import { APP_CONFIG, METRON_REST_CONFIG } from '../../app.config'; +import { IAppConfig } from '../../app.config.interface'; +import { SensorIndexingConfigService } from '../../service/sensor-indexing-config.service'; +import { IndexingConfigurations } from '../../model/sensor-indexing-config'; +import { of } from 'rxjs'; +import { HdfsService } from '../../service/hdfs.service'; +import { RestError } from '../../model/rest-error'; +import { RiskLevelRule } from '../../model/risk-level-rule'; class MockRouter { navigateByUrl(url: string) {} @@ -57,7 +59,7 @@ class MockActivatedRoute { setNameForTest(name: string) { this.name = name; this.params = Observable.create(observer => { - observer.next({id: this.name}); + observer.next({ id: this.name }); observer.complete(); }); } @@ -70,15 +72,21 @@ class MockSensorParserConfigService extends SensorParserConfigService { private postedSensorParserConfig: SensorParserConfig; private throwError: boolean; - constructor(private http2: Http, @Inject(APP_CONFIG) private config2: IAppConfig) { + constructor( + private http2: HttpClient, + @Inject(APP_CONFIG) private config2: IAppConfig + ) { super(http2, config2); } - public post(name: string, sensorParserConfig: SensorParserConfig): Observable<SensorParserConfig> { + public post( + name: string, + sensorParserConfig: SensorParserConfig + ): Observable<SensorParserConfig> { if (this.throwError) { let error = new RestError(); error.message = 'SensorParserConfig post error'; - return Observable.throw(error); + return throwError(error); } this.postedSensorParserConfig = sensorParserConfig; return Observable.create(observer => { @@ -106,21 +114,26 @@ class MockSensorParserConfigService extends SensorParserConfigService { public getAvailableParsers(): Observable<{}> { return Observable.create(observer => { observer.next({ - 'Bro': 'org.apache.metron.parsers.bro.BasicBroParser', - 'Grok': 'org.apache.metron.parsers.GrokParser' + Bro: 'org.apache.metron.parsers.bro.BasicBroParser', + Grok: 'org.apache.metron.parsers.GrokParser' }); observer.complete(); }); } - public parseMessage(parseMessageRequest: ParseMessageRequest): Observable<{}> { + public parseMessage( + parseMessageRequest: ParseMessageRequest + ): Observable<{}> { return Observable.create(observer => { observer.next(this.parsedMessage); observer.complete(); }); } - public setSensorParserConfig(name: string, sensorParserConfig: SensorParserConfig) { + public setSensorParserConfig( + name: string, + sensorParserConfig: SensorParserConfig + ) { this.name = name; this.sensorParserConfig = sensorParserConfig; } @@ -144,15 +157,21 @@ class MockSensorIndexingConfigService extends SensorIndexingConfigService { private sensorIndexingConfig: IndexingConfigurations; private throwError: boolean; - constructor(private http2: Http, @Inject(APP_CONFIG) private config2: IAppConfig) { + constructor( + private http2: HttpClient, + @Inject(APP_CONFIG) private config2: IAppConfig + ) { super(http2, config2); } - public post(name: string, sensorIndexingConfig: IndexingConfigurations): Observable<IndexingConfigurations> { + public post( + name: string, + sensorIndexingConfig: IndexingConfigurations + ): Observable<IndexingConfigurations> { if (this.throwError) { let error = new RestError(); error.message = 'IndexingConfigurations post error'; - return Observable.throw(error); + return throwError(error); } this.postedIndexingConfigurations = sensorIndexingConfig; return Observable.create(observer => { @@ -165,7 +184,7 @@ class MockSensorIndexingConfigService extends SensorIndexingConfigService { if (this.sensorIndexingConfig === null) { let error = new RestError(); error.message = 'IndexingConfigurations get error'; - return Observable.throw(error); + return throwError(error); } return Observable.create(observer => { if (name === this.name) { @@ -193,9 +212,12 @@ class MockKafkaService extends KafkaService { private name: string; private kafkaTopic: KafkaTopic; private kafkaTopicForPost: KafkaTopic; - private sampleData = {'key1': 'value1', 'key2': 'value2'}; + private sampleData = { key1: 'value1', key2: 'value2' }; - constructor(private http2: Http, @Inject(APP_CONFIG) private config2: IAppConfig) { + constructor( + private http2: HttpClient, + @Inject(APP_CONFIG) private config2: IAppConfig + ) { super(http2, config2); } @@ -211,7 +233,7 @@ class MockKafkaService extends KafkaService { public sample(name: string): Observable<string> { if (this.sampleData === null) { - return Observable.throw(new RestError()); + return throwError(new RestError()); } return Observable.create(observer => { if (name === this.name) { @@ -223,7 +245,7 @@ class MockKafkaService extends KafkaService { public get(name: string): Observable<KafkaTopic> { if (this.kafkaTopic === null) { - return Observable.throw(new RestError()); + return throwError(new RestError()); } return Observable.create(observer => { if (name === this.name) { @@ -249,11 +271,13 @@ class MockKafkaService extends KafkaService { } class MockGrokValidationService extends GrokValidationService { - private path: string; private contents: string; - constructor(private http2: Http, @Inject(APP_CONFIG) private config2: IAppConfig) { + constructor( + private http2: HttpClient, + @Inject(APP_CONFIG) private config2: IAppConfig + ) { super(http2, config2); } @@ -265,21 +289,22 @@ class MockGrokValidationService extends GrokValidationService { public list(): Observable<string[]> { return Observable.create(observer => { observer.next({ - 'BASE10NUM': '(?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+)))', - 'BASE16FLOAT': '\\b(?<![0-9A-Fa-f.])(?:[+-]?(?:0x)?(?:(?:[0-9A-Fa-f]+(?:\\.[0-9A-Fa-f]*)?)|(?:\\.[0-9A-Fa-f]+)))\\b', - 'BASE16NUM': '(?<![0-9A-Fa-f])(?:[+-]?(?:0x)?(?:[0-9A-Fa-f]+))', - 'CISCOMAC': '(?:(?:[A-Fa-f0-9]{4}\\.){2}[A-Fa-f0-9]{4})', - 'COMMONMAC': '(?:(?:[A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2})', - 'DATA': '.*?' + BASE10NUM: + '(?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+)))', + BASE16FLOAT: + '\\b(?<![0-9A-Fa-f.])(?:[+-]?(?:0x)?(?:(?:[0-9A-Fa-f]+(?:\\.[0-9A-Fa-f]*)?)|(?:\\.[0-9A-Fa-f]+)))\\b', + BASE16NUM: '(?<![0-9A-Fa-f])(?:[+-]?(?:0x)?(?:[0-9A-Fa-f]+))', + CISCOMAC: '(?:(?:[A-Fa-f0-9]{4}\\.){2}[A-Fa-f0-9]{4})', + COMMONMAC: '(?:(?:[A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2})', + DATA: '.*?' }); observer.complete(); }); } - public getStatement(path: string): Observable<string> { if (this.contents === null) { - return Observable.throw('Error'); + return throwError('Error'); } return Observable.create(observer => { if (path === this.path) { @@ -296,7 +321,10 @@ class MockHdfsService extends HdfsService { private contents: string; private postedContents: string; - constructor(private http2: Http, @Inject(APP_CONFIG) private config2: IAppConfig) { + constructor( + private http2: HttpClient, + @Inject(APP_CONFIG) private config2: IAppConfig + ) { super(http2, config2); } @@ -312,7 +340,7 @@ class MockHdfsService extends HdfsService { public list(path: string): Observable<string[]> { if (this.fileList === null) { - return Observable.throw('Error'); + return throwError('Error'); } return Observable.create(observer => { if (path === this.path) { @@ -324,7 +352,7 @@ class MockHdfsService extends HdfsService { public read(path: string): Observable<string> { if (this.contents === null) { - return Observable.throw('Error'); + return throwError('Error'); } return Observable.create(observer => { if (path === this.path) { @@ -338,7 +366,7 @@ class MockHdfsService extends HdfsService { if (this.contents === null) { let error = new RestError(); error.message = 'HDFS post Error'; - return Observable.throw(error); + return throwError(error); } this.postedContents = contents; return Observable.create(observer => { @@ -347,7 +375,7 @@ class MockHdfsService extends HdfsService { }); } - public deleteFile(path: string): Observable<Response> { + public deleteFile(path: string): Observable<HttpResponse<{}>> { return Observable.create(observer => { observer.next({}); observer.complete(); @@ -360,29 +388,35 @@ class MockHdfsService extends HdfsService { } class MockAuthenticationService extends AuthenticationService { - - constructor(private http2: Http, private router2: Router, @Inject(APP_CONFIG) private config2: IAppConfig) { + constructor( + private http2: HttpClient, + private router2: Router, + @Inject(APP_CONFIG) private config2: IAppConfig + ) { super(http2, router2, config2); } - public getCurrentUser(options: RequestOptions): Observable<Response> { - let responseOptions: ResponseOptions = new ResponseOptions(); - responseOptions.body = 'user'; - let response: Response = new Response(responseOptions); - return Observable.of(response); - }; + public getCurrentUser(options: {}): Observable<HttpResponse<{}>> { + let responseOptions: {} = { body: 'user' }; + let response: HttpResponse<{}> = new HttpResponse(responseOptions); + return of(response); + } } class MockTransformationValidationService extends StellarService { - private transformationValidationResult: any; private transformationValidationForValidate: SensorParserContext; - constructor(private http2: Http, @Inject(APP_CONFIG) private config2: IAppConfig) { + constructor( + private http2: HttpClient, + @Inject(APP_CONFIG) private config2: IAppConfig + ) { super(http2, config2); } - public setTransformationValidationResultForTest(transformationValidationResult: any): void { + public setTransformationValidationResultForTest( + transformationValidationResult: any + ): void { this.transformationValidationResult = transformationValidationResult; } @@ -405,7 +439,10 @@ export class MockSensorEnrichmentConfigService { private postedSensorEnrichmentConfig: SensorEnrichmentConfig; private throwError: boolean; - public setSensorEnrichmentConfig(name: string, sensorEnrichmentConfig: SensorEnrichmentConfig) { + public setSensorEnrichmentConfig( + name: string, + sensorEnrichmentConfig: SensorEnrichmentConfig + ) { this.name = name; this.sensorEnrichmentConfig = sensorEnrichmentConfig; } @@ -414,7 +451,7 @@ export class MockSensorEnrichmentConfigService { if (this.sensorEnrichmentConfig === null) { let error = new RestError(); error.message = 'SensorEnrichmentConfig get error'; - return Observable.throw(error); + return throwError(error); } return Observable.create(observer => { if (name === this.name) { @@ -424,14 +461,17 @@ export class MockSensorEnrichmentConfigService { }); } - public post(name: string, sensorEnrichmentConfig: SensorEnrichmentConfig): Observable<SensorEnrichmentConfig> { + public post( + name: string, + sensorEnrichmentConfig: SensorEnrichmentConfig + ): Observable<SensorEnrichmentConfig> { if (this.throwError) { let error = new RestError(); error.message = 'SensorEnrichmentConfig post error'; - return Observable.throw(error); + return throwError(error); } this.postedSensorEnrichmentConfig = sensorEnrichmentConfig; - return Observable.create(observer => { + return Observable.create(observer => { observer.next(sensorEnrichmentConfig); observer.complete(); }); @@ -447,7 +487,6 @@ export class MockSensorEnrichmentConfigService { } describe('Component: SensorParserConfig', () => { - let component: SensorParserConfigComponent; let fixture: ComponentFixture<SensorParserConfigComponent>; let sensorParserConfigService: MockSensorParserConfigService; @@ -462,97 +501,106 @@ describe('Component: SensorParserConfig', () => { let router: MockRouter; let squidSensorParserConfig: any = { - 'parserClassName': 'org.apache.metron.parsers.GrokParser', - 'sensorTopic': 'squid', - 'parserConfig': { - 'grokPath': '/apps/metron/patterns/squid', - 'patternLabel': 'SQUID_DELIMITED', - 'timestampField': 'timestamp' + parserClassName: 'org.apache.metron.parsers.GrokParser', + sensorTopic: 'squid', + parserConfig: { + grokPath: '/apps/metron/patterns/squid', + patternLabel: 'SQUID_DELIMITED', + timestampField: 'timestamp' }, - 'fieldTransformations': [ + fieldTransformations: [ { - 'input': [], - 'output': ['full_hostname', 'domain_without_subdomains', 'hostname'], - 'transformation': 'STELLAR', - 'config': { - 'full_hostname': 'URL_TO_HOST(url)', - 'domain_without_subdomains': 'DOMAIN_REMOVE_SUBDOMAINS(full_hostname)' + input: [], + output: ['full_hostname', 'domain_without_subdomains', 'hostname'], + transformation: 'STELLAR', + config: { + full_hostname: 'URL_TO_HOST(url)', + domain_without_subdomains: 'DOMAIN_REMOVE_SUBDOMAINS(full_hostname)' } } - ], + ] }; let squidSensorEnrichmentConfig = { - 'enrichment': { - 'fieldMap': { - 'geo': ['ip_dst_addr'], - 'host': ['ip_dst_addr'], - 'whois': [], - 'stellar': { 'config': { 'group1': {} }} + enrichment: { + fieldMap: { + geo: ['ip_dst_addr'], + host: ['ip_dst_addr'], + whois: [], + stellar: { config: { group1: {} } } }, - 'fieldToTypeMap': {}, 'config': {} + fieldToTypeMap: {}, + config: {} }, - 'threatIntel': { - 'threatIntel': { - 'fieldMap': { 'hbaseThreatIntel': ['ip_dst_addr'] }, - 'fieldToTypeMap': { 'ip_dst_addr': ['malicious_ip'] } + threatIntel: { + threatIntel: { + fieldMap: { hbaseThreatIntel: ['ip_dst_addr'] }, + fieldToTypeMap: { ip_dst_addr: ['malicious_ip'] } } } }; let squidIndexingConfigurations = { - 'hdfs': { - 'index': 'squid', - 'batchSize': 5, - 'enabled': true + hdfs: { + index: 'squid', + batchSize: 5, + enabled: true }, - 'elasticsearch': { - 'index': 'squid', - 'batchSize': 10, - 'enabled': true - }, - 'solr': { - 'index': 'squid', - 'batchSize': 1, - 'enabled': false + elasticsearch: { + index: 'squid', + batchSize: 10, + enabled: true }, + solr: { + index: 'squid', + batchSize: 1, + enabled: false + } }; beforeEach(async(() => { - TestBed.configureTestingModule({ imports: [SensorParserConfigModule], providers: [ MetronAlerts, - {provide: Http}, - {provide: SensorParserConfigService, useClass: MockSensorParserConfigService}, - {provide: SensorIndexingConfigService, useClass: MockSensorIndexingConfigService}, - {provide: KafkaService, useClass: MockKafkaService}, - {provide: HdfsService, useClass: MockHdfsService}, - {provide: GrokValidationService, useClass: MockGrokValidationService}, - {provide: StellarService, useClass: MockTransformationValidationService}, - {provide: ActivatedRoute, useClass: MockActivatedRoute}, - {provide: Router, useClass: MockRouter}, - {provide: AuthenticationService, useClass: MockAuthenticationService}, - {provide: SensorEnrichmentConfigService, useClass: MockSensorEnrichmentConfigService}, - {provide: APP_CONFIG, useValue: METRON_REST_CONFIG} + { provide: HttpClient }, + { + provide: SensorParserConfigService, + useClass: MockSensorParserConfigService + }, + { + provide: SensorIndexingConfigService, + useClass: MockSensorIndexingConfigService + }, + { provide: KafkaService, useClass: MockKafkaService }, + { provide: HdfsService, useClass: MockHdfsService }, + { provide: GrokValidationService, useClass: MockGrokValidationService }, + { + provide: StellarService, + useClass: MockTransformationValidationService + }, + { provide: ActivatedRoute, useClass: MockActivatedRoute }, + { provide: Router, useClass: MockRouter }, + { provide: AuthenticationService, useClass: MockAuthenticationService }, + { + provide: SensorEnrichmentConfigService, + useClass: MockSensorEnrichmentConfigService + }, + { provide: APP_CONFIG, useValue: METRON_REST_CONFIG } ] - }).compileComponents() - .then(() => { - fixture = TestBed.createComponent(SensorParserConfigComponent); - component = fixture.componentInstance; - sensorParserConfigService = fixture.debugElement.injector.get(SensorParserConfigService); - sensorIndexingConfigService = fixture.debugElement.injector.get(SensorIndexingConfigService); - transformationValidationService = fixture.debugElement.injector.get(StellarService); - kafkaService = fixture.debugElement.injector.get(KafkaService); - hdfsService = fixture.debugElement.injector.get(HdfsService); - grokValidationService = fixture.debugElement.injector.get(GrokValidationService); - sensorEnrichmentConfigService = fixture.debugElement.injector.get(SensorEnrichmentConfigService); - activatedRoute = fixture.debugElement.injector.get(ActivatedRoute); - metronAlerts = fixture.debugElement.injector.get(MetronAlerts); - router = fixture.debugElement.injector.get(Router); - }); - + }); + fixture = TestBed.createComponent(SensorParserConfigComponent); + component = fixture.componentInstance; + sensorParserConfigService = TestBed.get(SensorParserConfigService); + sensorIndexingConfigService = TestBed.get(SensorIndexingConfigService); + transformationValidationService = TestBed.get(StellarService); + kafkaService = TestBed.get(KafkaService); + hdfsService = TestBed.get(HdfsService); + grokValidationService = TestBed.get(GrokValidationService); + sensorEnrichmentConfigService = TestBed.get(SensorEnrichmentConfigService); + activatedRoute = TestBed.get(ActivatedRoute); + metronAlerts = TestBed.get(MetronAlerts); + router = TestBed.get(Router); })); it('should create an instance of SensorParserConfigComponent', async(() => { @@ -578,11 +626,16 @@ describe('Component: SensorParserConfig', () => { })); it('should createForms', async(() => { - component.sensorParserConfig = Object.assign(new SensorParserConfig(), squidSensorParserConfig); + component.sensorParserConfig = Object.assign( + new SensorParserConfig(), + squidSensorParserConfig + ); component.createForms(); expect(Object.keys(component.sensorConfigForm.controls).length).toEqual(16); - expect(Object.keys(component.transformsValidationForm.controls).length).toEqual(2); + expect( + Object.keys(component.transformsValidationForm.controls).length + ).toEqual(2); expect(component.showAdvancedParserConfiguration).toEqual(true); component.sensorParserConfig.parserConfig = {}; @@ -596,8 +649,8 @@ describe('Component: SensorParserConfig', () => { it('should getAvailableParsers', async(() => { component.getAvailableParsers(); expect(component.availableParsers).toEqual({ - 'Bro': 'org.apache.metron.parsers.bro.BasicBroParser', - 'Grok': 'org.apache.metron.parsers.GrokParser' + Bro: 'org.apache.metron.parsers.bro.BasicBroParser', + Grok: 'org.apache.metron.parsers.GrokParser' }); expect(component.availableParserNames).toEqual(['Bro', 'Grok']); @@ -605,57 +658,95 @@ describe('Component: SensorParserConfig', () => { })); it('should init', async(() => { - sensorParserConfigService.setSensorParserConfig('squid', squidSensorParserConfig); + sensorParserConfigService.setSensorParserConfig( + 'squid', + squidSensorParserConfig + ); component.init('new'); let expectedSensorParserConfig = new SensorParserConfig(); - expectedSensorParserConfig.parserClassName = 'org.apache.metron.parsers.GrokParser'; + expectedSensorParserConfig.parserClassName = + 'org.apache.metron.parsers.GrokParser'; expect(component.sensorParserConfig).toEqual(expectedSensorParserConfig); - expect(component.sensorEnrichmentConfig).toEqual(new SensorEnrichmentConfig()); - expect(component.indexingConfigurations).toEqual(new IndexingConfigurations()); + expect(component.sensorEnrichmentConfig).toEqual( + new SensorEnrichmentConfig() + ); + expect(component.indexingConfigurations).toEqual( + new IndexingConfigurations() + ); expect(component.editMode).toEqual(false); expect(component.currentSensors).toEqual(['squid']); spyOn(component, 'getKafkaStatus'); - let sensorParserConfig = Object.assign(new SensorParserConfig(), squidSensorParserConfig); - sensorParserConfigService.setSensorParserConfig('squid', sensorParserConfig); - sensorEnrichmentConfigService.setSensorEnrichmentConfig('squid', - Object.assign(new SensorEnrichmentConfig(), squidSensorEnrichmentConfig)); - sensorIndexingConfigService.setSensorIndexingConfig('squid', - Object.assign(new IndexingConfigurations(), squidIndexingConfigurations)); - hdfsService.setContents('/apps/metron/patterns/squid', 'SQUID_DELIMITED grok statement'); + let sensorParserConfig = Object.assign( + new SensorParserConfig(), + squidSensorParserConfig + ); + sensorParserConfigService.setSensorParserConfig( + 'squid', + sensorParserConfig + ); + sensorEnrichmentConfigService.setSensorEnrichmentConfig( + 'squid', + Object.assign(new SensorEnrichmentConfig(), squidSensorEnrichmentConfig) + ); + sensorIndexingConfigService.setSensorIndexingConfig( + 'squid', + Object.assign(new IndexingConfigurations(), squidIndexingConfigurations) + ); + hdfsService.setContents( + '/apps/metron/patterns/squid', + 'SQUID_DELIMITED grok statement' + ); component.init('squid'); - expect(component.sensorParserConfig).toEqual(Object.assign(new SensorParserConfig(), squidSensorParserConfig)); + expect(component.sensorParserConfig).toEqual( + Object.assign(new SensorParserConfig(), squidSensorParserConfig) + ); expect(component.sensorNameValid).toEqual(true); expect(component.getKafkaStatus).toHaveBeenCalled(); expect(component.showAdvancedParserConfiguration).toEqual(true); expect(component.grokStatement).toEqual('SQUID_DELIMITED grok statement'); expect(component.patternLabel).toEqual('SQUID_DELIMITED'); - expect(component.sensorEnrichmentConfig).toEqual(Object.assign(new SensorEnrichmentConfig(), squidSensorEnrichmentConfig)); - expect(component.indexingConfigurations).toEqual(Object.assign(new IndexingConfigurations(), squidIndexingConfigurations)); + expect(component.sensorEnrichmentConfig).toEqual( + Object.assign(new SensorEnrichmentConfig(), squidSensorEnrichmentConfig) + ); + expect(component.indexingConfigurations).toEqual( + Object.assign(new IndexingConfigurations(), squidIndexingConfigurations) + ); component.sensorParserConfig.parserConfig['grokPath'] = '/patterns/squid'; hdfsService.setContents('/patterns/squid', null); - grokValidationService.setContents('/patterns/squid', 'SQUID grok statement from classpath'); + grokValidationService.setContents( + '/patterns/squid', + 'SQUID grok statement from classpath' + ); component.init('squid'); - expect(component.grokStatement).toEqual('SQUID grok statement from classpath'); + expect(component.grokStatement).toEqual( + 'SQUID grok statement from classpath' + ); spyOn(metronAlerts, 'showErrorMessage'); sensorEnrichmentConfigService.setSensorEnrichmentConfig('squid', null); component.init('squid'); - expect(metronAlerts.showErrorMessage).toHaveBeenCalledWith('SensorEnrichmentConfig get error'); + expect(metronAlerts.showErrorMessage).toHaveBeenCalledWith( + 'SensorEnrichmentConfig get error' + ); sensorIndexingConfigService.setSensorIndexingConfig('squid', null); component.init('squid'); - expect(metronAlerts.showErrorMessage).toHaveBeenCalledWith('IndexingConfigurations get error'); + expect(metronAlerts.showErrorMessage).toHaveBeenCalledWith( + 'IndexingConfigurations get error' + ); grokValidationService.setContents('/patterns/squid', null); component.init('squid'); - expect(metronAlerts.showErrorMessage).toHaveBeenCalledWith('Could not find grok statement in HDFS or classpath at /patterns/squid'); + expect(metronAlerts.showErrorMessage).toHaveBeenCalledWith( + 'Could not find grok statement in HDFS or classpath at /patterns/squid' + ); sensorParserConfig = new SensorParserConfig(); sensorParserConfig.sensorTopic = 'bro'; @@ -722,12 +813,14 @@ describe('Component: SensorParserConfig', () => { expect(component.hidePane).not.toHaveBeenCalled(); expect(component.isConfigValid).toHaveBeenCalled(); - component.sensorParserConfig.parserClassName = 'org.apache.metron.parsers.GrokParser'; + component.sensorParserConfig.parserClassName = + 'org.apache.metron.parsers.GrokParser'; component.onParserTypeChange(); expect(component.parserClassValid).toEqual(true); expect(component.hidePane).not.toHaveBeenCalled(); - component.sensorParserConfig.parserClassName = 'org.apache.metron.parsers.bro.BasicBroParser'; + component.sensorParserConfig.parserClassName = + 'org.apache.metron.parsers.bro.BasicBroParser'; component.onParserTypeChange(); expect(component.hidePane).toHaveBeenCalledWith(Pane.GROK); @@ -759,7 +852,8 @@ describe('Component: SensorParserConfig', () => { component.isConfigValid(); expect(component.configValid).toEqual(true); - component.sensorParserConfig.parserClassName = 'org.apache.metron.parsers.GrokParser'; + component.sensorParserConfig.parserClassName = + 'org.apache.metron.parsers.GrokParser'; component.isConfigValid(); expect(component.configValid).toEqual(false); @@ -796,8 +890,12 @@ describe('Component: SensorParserConfig', () => { it('should getTransforms', async(() => { expect(component.getTransforms()).toEqual('0 Transformations Applied'); - component.sensorParserConfig.fieldTransformations.push(Object.assign(new FieldTransformer(), {'output': ['field1', 'field2']})); - component.sensorParserConfig.fieldTransformations.push(Object.assign(new FieldTransformer(), {'output': ['field3']})); + component.sensorParserConfig.fieldTransformations.push( + Object.assign(new FieldTransformer(), { output: ['field1', 'field2'] }) + ); + component.sensorParserConfig.fieldTransformations.push( + Object.assign(new FieldTransformer(), { output: ['field3'] }) + ); expect(component.getTransforms()).toEqual('3 Transformations Applied'); @@ -809,15 +907,21 @@ describe('Component: SensorParserConfig', () => { component.onSaveGrokStatement('grok statement'); expect(component.grokStatement).toEqual('grok statement'); - expect(component.sensorParserConfig.parserConfig['grokPath']).toEqual('/apps/metron/patterns/squid'); + expect(component.sensorParserConfig.parserConfig['grokPath']).toEqual( + '/apps/metron/patterns/squid' + ); component.sensorParserConfig.parserConfig['grokPath'] = '/patterns/squid'; component.onSaveGrokStatement('grok statement'); - expect(component.sensorParserConfig.parserConfig['grokPath']).toEqual('/apps/metron/patterns/squid'); + expect(component.sensorParserConfig.parserConfig['grokPath']).toEqual( + '/apps/metron/patterns/squid' + ); component.sensorParserConfig.parserConfig['grokPath'] = '/custom/grok/path'; component.onSaveGrokStatement('grok statement'); - expect(component.sensorParserConfig.parserConfig['grokPath']).toEqual('/custom/grok/path'); + expect(component.sensorParserConfig.parserConfig['grokPath']).toEqual( + '/custom/grok/path' + ); fixture.destroy(); })); @@ -825,7 +929,9 @@ describe('Component: SensorParserConfig', () => { it('should onSavePatternLabel', async(() => { component.onSavePatternLabel('PATTERN_LABEL'); expect(component.patternLabel).toEqual('PATTERN_LABEL'); - expect(component.sensorParserConfig.parserConfig['patternLabel']).toEqual('PATTERN_LABEL'); + expect(component.sensorParserConfig.parserConfig['patternLabel']).toEqual( + 'PATTERN_LABEL' + ); fixture.destroy(); })); @@ -842,15 +948,17 @@ describe('Component: SensorParserConfig', () => { it('should save sensor configuration', async(() => { let fieldTransformer = Object.assign(new FieldTransformer(), { - 'input': [], - 'output': ['url_host'], - 'transformation': 'MTL', - 'config': {'url_host': 'TO_LOWER(URL_TO_HOST(url))'} + input: [], + output: ['url_host'], + transformation: 'MTL', + config: { url_host: 'TO_LOWER(URL_TO_HOST(url))' } }); let sensorParserConfigSave: SensorParserConfig = new SensorParserConfig(); sensorParserConfigSave.sensorTopic = 'squid'; - sensorParserConfigSave.parserClassName = 'org.apache.metron.parsers.GrokParser'; - sensorParserConfigSave.parserConfig['grokPath'] = '/apps/metron/patterns/squid'; + sensorParserConfigSave.parserClassName = + 'org.apache.metron.parsers.GrokParser'; + sensorParserConfigSave.parserConfig['grokPath'] = + '/apps/metron/patterns/squid'; sensorParserConfigSave.fieldTransformations = [fieldTransformer]; activatedRoute.setNameForTest('new'); sensorParserConfigService.setThrowError(true); @@ -859,93 +967,114 @@ describe('Component: SensorParserConfig', () => { spyOn(metronAlerts, 'showErrorMessage'); component.sensorParserConfig.sensorTopic = 'squid'; - component.sensorParserConfig.parserClassName = 'org.apache.metron.parsers.GrokParser'; - component.sensorParserConfig.parserConfig['grokPath'] = '/apps/metron/patterns/squid'; + component.sensorParserConfig.parserClassName = + 'org.apache.metron.parsers.GrokParser'; + component.sensorParserConfig.parserConfig['grokPath'] = + '/apps/metron/patterns/squid'; component.sensorParserConfig.fieldTransformations = [fieldTransformer]; component.onSave(); - expect(metronAlerts.showErrorMessage['calls'].mostRecent().args[0]) - .toEqual('Unable to save sensor config: SensorParserConfig post error'); - - component.sensorEnrichmentConfig = Object.assign(new SensorEnrichmentConfig(), squidSensorEnrichmentConfig); - component.indexingConfigurations = Object.assign(new IndexingConfigurations(), squidIndexingConfigurations); + expect(metronAlerts.showErrorMessage['calls'].mostRecent().args[0]).toEqual( + 'Unable to save sensor config: SensorParserConfig post error' + ); + + component.sensorEnrichmentConfig = Object.assign( + new SensorEnrichmentConfig(), + squidSensorEnrichmentConfig + ); + component.indexingConfigurations = Object.assign( + new IndexingConfigurations(), + squidIndexingConfigurations + ); sensorParserConfigService.setThrowError(false); - hdfsService.setContents('/apps/metron/patterns/squid', 'SQUID grok statement'); + hdfsService.setContents( + '/apps/metron/patterns/squid', + 'SQUID grok statement' + ); component.grokStatement = 'SQUID grok statement'; component.onSave(); - expect(sensorParserConfigService.getPostedSensorParserConfig()).toEqual(sensorParserConfigSave); - expect(sensorEnrichmentConfigService.getPostedSensorEnrichmentConfig()) - .toEqual(Object.assign(new SensorEnrichmentConfig(), squidSensorEnrichmentConfig)); - expect(sensorIndexingConfigService.getPostedIndexingConfigurations()) - .toEqual(Object.assign(new IndexingConfigurations(), squidIndexingConfigurations)); + expect(sensorParserConfigService.getPostedSensorParserConfig()).toEqual( + sensorParserConfigSave + ); + expect( + sensorEnrichmentConfigService.getPostedSensorEnrichmentConfig() + ).toEqual( + Object.assign(new SensorEnrichmentConfig(), squidSensorEnrichmentConfig) + ); + expect( + sensorIndexingConfigService.getPostedIndexingConfigurations() + ).toEqual( + Object.assign(new IndexingConfigurations(), squidIndexingConfigurations) + ); expect(hdfsService.getPostedContents()).toEqual('SQUID grok statement'); hdfsService.setContents('/apps/metron/patterns/squid', null); component.onSave(); - expect(metronAlerts.showErrorMessage['calls'].mostRecent().args[0]).toEqual('HDFS post Error'); + expect(metronAlerts.showErrorMessage['calls'].mostRecent().args[0]).toEqual( + 'HDFS post Error' + ); sensorEnrichmentConfigService.setThrowError(true); component.onSave(); - expect(metronAlerts.showErrorMessage['calls'].mostRecent().args[0]) - .toEqual('Created Sensor parser config but unable to save enrichment configuration: SensorEnrichmentConfig post error'); + expect(metronAlerts.showErrorMessage['calls'].mostRecent().args[0]).toEqual( + 'Created Sensor parser config but unable to save enrichment configuration: SensorEnrichmentConfig post error' + ); sensorIndexingConfigService.setThrowError(true); component.onSave(); - expect(metronAlerts.showErrorMessage['calls'].mostRecent().args[0]) - .toEqual('Created Sensor parser config but unable to save indexing configuration: IndexingConfigurations post error'); + expect(metronAlerts.showErrorMessage['calls'].mostRecent().args[0]).toEqual( + 'Created Sensor parser config but unable to save indexing configuration: IndexingConfigurations post error' + ); fixture.destroy(); })); it('should getTransformationCount', async(() => { - let transforms = - [ + let transforms = [ Object.assign(new FieldTransformer(), { - 'input': [ - 'method' - ], - 'output': null, - 'transformation': 'REMOVE', - 'config': { - 'condition': 'exists(method) and method == "foo"' + input: ['method'], + output: null, + transformation: 'REMOVE', + config: { + condition: 'exists(method) and method == "foo"' } }), Object.assign(new FieldTransformer(), { - 'input': [], - 'output': [ - 'method', - 'status_code', - 'url' - ], - 'transformation': 'STELLAR', - 'config': { - 'method': 'TO_UPPER(method)', - 'status_code': 'TO_LOWER(code)', - 'url': 'TO_STRING(TRIM(url))' + input: [], + output: ['method', 'status_code', 'url'], + transformation: 'STELLAR', + config: { + method: 'TO_UPPER(method)', + status_code: 'TO_LOWER(code)', + url: 'TO_STRING(TRIM(url))' } }) ]; - - expect(component.getTransformationCount()).toEqual(0); fixture.componentInstance.sensorParserConfig.fieldTransformations = transforms; expect(component.getTransformationCount()).toEqual(3); - fixture.componentInstance.sensorParserConfig.fieldTransformations = [transforms[0]]; + fixture.componentInstance.sensorParserConfig.fieldTransformations = [ + transforms[0] + ]; expect(component.getTransformationCount()).toEqual(0); fixture.destroy(); })); it('should getEnrichmentCount', async(() => { - - component.sensorEnrichmentConfig.enrichment.fieldMap['geo'] = ['ip_src_addr', 'ip_dst_addr']; - component.sensorEnrichmentConfig.enrichment.fieldToTypeMap['hbaseenrichment'] = ['ip_src_addr', 'ip_dst_addr']; + component.sensorEnrichmentConfig.enrichment.fieldMap['geo'] = [ + 'ip_src_addr', + 'ip_dst_addr' + ]; + component.sensorEnrichmentConfig.enrichment.fieldToTypeMap[ + 'hbaseenrichment' + ] = ['ip_src_addr', 'ip_dst_addr']; expect(component.getEnrichmentCount()).toEqual(4); @@ -953,8 +1082,9 @@ describe('Component: SensorParserConfig', () => { })); it('should getThreatIntelCount', async(() => { - - component.sensorEnrichmentConfig.threatIntel.fieldToTypeMap['hbaseenrichment'] = ['ip_src_addr', 'ip_dst_addr']; + component.sensorEnrichmentConfig.threatIntel.fieldToTypeMap[ + 'hbaseenrichment' + ] = ['ip_src_addr', 'ip_dst_addr']; expect(component.getThreatIntelCount()).toEqual(2); @@ -962,10 +1092,22 @@ describe('Component: SensorParserConfig', () => { })); it('should getRuleCount', async(() => { - let rule1 = Object.assign(new RiskLevelRule(), {'name': 'rule1', 'rule': 'some rule', 'score': 50}); - let rule2 = Object.assign(new RiskLevelRule(), {'name': 'rule2', 'rule': 'some other rule', 'score': 80}); - component.sensorEnrichmentConfig.threatIntel.triageConfig.riskLevelRules.push(rule1); - component.sensorEnrichmentConfig.threatIntel.triageConfig.riskLevelRules.push(rule2); + let rule1 = Object.assign(new RiskLevelRule(), { + name: 'rule1', + rule: 'some rule', + score: 50 + }); + let rule2 = Object.assign(new RiskLevelRule(), { + name: 'rule2', + rule: 'some other rule', + score: 80 + }); + component.sensorEnrichmentConfig.threatIntel.triageConfig.riskLevelRules.push( + rule1 + ); + component.sensorEnrichmentConfig.threatIntel.triageConfig.riskLevelRules.push( + rule2 + ); expect(component.getRuleCount()).toEqual(2); @@ -973,7 +1115,6 @@ describe('Component: SensorParserConfig', () => { })); it('should showPane', async(() => { - component.showPane(Pane.GROK); expect(component.showGrokValidator).toEqual(true); expect(component.showFieldSchema).toEqual(false); @@ -993,7 +1134,6 @@ describe('Component: SensorParserConfig', () => { })); it('should hidePane', async(() => { - component.hidePane(Pane.GROK); expect(component.showGrokValidator).toEqual(false); expect(component.showFieldSchema).toEqual(false); @@ -1033,7 +1173,9 @@ describe('Component: SensorParserConfig', () => { component.onRawJsonChanged(); - expect(component.sensorFieldSchema.createFieldSchemaRows).toHaveBeenCalled(); + expect( + component.sensorFieldSchema.createFieldSchemaRows + ).toHaveBeenCalled(); fixture.destroy(); })); @@ -1045,5 +1187,4 @@ describe('Component: SensorParserConfig', () => { fixture.destroy(); })); - });