You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metron.apache.org by sa...@apache.org on 2019/06/17 09:48:56 UTC

[metron] branch master updated: METRON-2092 [UI] Config UI does not require you to set a grok timestamp field by default (ruffle1986 via sardell) closes apache/metron#1393

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

sardell pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/metron.git


The following commit(s) were added to refs/heads/master by this push:
     new 9621ec7  METRON-2092 [UI] Config UI does not require you to set a grok timestamp field by default (ruffle1986 via sardell) closes apache/metron#1393
9621ec7 is described below

commit 9621ec7dbd740e0fe37d12f283b4e7a7e0f0178f
Author: ruffle1986 <ft...@gmail.com>
AuthorDate: Mon Jun 17 11:48:21 2019 +0200

    METRON-2092 [UI] Config UI does not require you to set a grok timestamp field by default (ruffle1986 via sardell) closes apache/metron#1393
---
 .../src/app/model/sensor-parser-config.ts             |  2 ++
 .../sensor-parser-config.component.html               |  8 +++++++-
 .../sensor-parser-config.component.spec.ts            | 19 ++++++++++++++++++-
 .../sensor-parser-config.component.ts                 | 17 ++++++++---------
 4 files changed, 35 insertions(+), 11 deletions(-)

diff --git a/metron-interface/metron-config/src/app/model/sensor-parser-config.ts b/metron-interface/metron-config/src/app/model/sensor-parser-config.ts
index a2cd4ae..d83ef31 100644
--- a/metron-interface/metron-config/src/app/model/sensor-parser-config.ts
+++ b/metron-interface/metron-config/src/app/model/sensor-parser-config.ts
@@ -35,11 +35,13 @@ export class SensorParserConfig {
   errorWriterNumTasks: number;
   spoutConfig: {};
   stormConfig: {};
+  timestampField: string;
 
   constructor() {
     this.parserConfig = {};
     this.fieldTransformations = [];
     this.spoutConfig = {};
     this.stormConfig = {};
+    this.timestampField = 'timestamp';
   }
 }
diff --git a/metron-interface/metron-config/src/app/sensors/sensor-parser-config/sensor-parser-config.component.html b/metron-interface/metron-config/src/app/sensors/sensor-parser-config/sensor-parser-config.component.html
index b4bdd92..c85d376 100644
--- a/metron-interface/metron-config/src/app/sensors/sensor-parser-config/sensor-parser-config.component.html
+++ b/metron-interface/metron-config/src/app/sensors/sensor-parser-config/sensor-parser-config.component.html
@@ -71,7 +71,7 @@
                 </div>
 
                 <div class="form-group" [ngClass]="{'panel-selected': showGrokValidator }" *ngIf="isGrokParser(sensorParserConfig)" >
-                    <label attr.for="grokStatement">GROK STATEMENT</label>
+                    <label attr.for="grokStatement">GROK STATEMENT *</label>
                     <div  class="input-group" [attr.disabled]="!sensorNameValid || !parserClassValid">
                         <input type="text" class="form-control" formControlName="grokStatement"  [(ngModel)]="this.grokStatement" readonly>
                         <span class="input-group-btn">
@@ -83,6 +83,12 @@
                     </div>
                 </div>
 
+                <div class="form-group" *ngIf="isGrokParser(sensorParserConfig)" data-qe-id="timestamp-field">
+                    <label attr.for="timestampField">TIMESTAMP *</label>
+                    <input type="text" class="form-control" name="timestampField" formControlName="timestampField" [(ngModel)]="sensorParserConfig.timestampField">
+                    <label *ngIf="!sensorParserConfig.timestampField"><span class="warning-text">Field is required. </span></label>
+                </div>
+
                 <div class="form-group" [ngClass]="{'panel-selected': showFieldSchema }" >
                     <label attr.for="fieldSchema">SCHEMA</label>
                     <div  class="input-group" [attr.disabled]="!isConfigValid()">
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 ff1a812..228125d 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
@@ -583,7 +583,7 @@ describe('Component: SensorParserConfig', () => {
     );
     component.createForms();
 
-    expect(Object.keys(component.sensorConfigForm.controls).length).toEqual(16);
+    expect(Object.keys(component.sensorConfigForm.controls).length).toEqual(17);
     expect(
       Object.keys(component.transformsValidationForm.controls).length
     ).toEqual(2);
@@ -1118,4 +1118,21 @@ describe('Component: SensorParserConfig', () => {
 
     expect(component.showAdvancedParserConfiguration).toEqual(false);
   }));
+
+  it('should be timestamp by default', () => {
+    expect(component.sensorParserConfig.timestampField).toEqual('timestamp');
+  });
+
+  it('should be invalid if timestamp field is empty', () => {
+    component.sensorNameValid = true;
+    component.kafkaTopicValid = true;
+    component.parserClassValid = true;
+    component.grokStatement = 'grokStatement';
+    component.sensorParserConfig = new SensorParserConfig();
+    component.sensorParserConfig.parserClassName = 'org.apache.metron.parsers.GrokParser'
+    component.sensorParserConfig.timestampField = '';
+    expect(component.isConfigValid()).toEqual(false);
+    component.sensorParserConfig.timestampField = 'timestamp';
+    expect(component.isConfigValid()).toEqual(true);
+  });
 });
diff --git a/metron-interface/metron-config/src/app/sensors/sensor-parser-config/sensor-parser-config.component.ts b/metron-interface/metron-config/src/app/sensors/sensor-parser-config/sensor-parser-config.component.ts
index bb59de5..31ef9c0 100644
--- a/metron-interface/metron-config/src/app/sensors/sensor-parser-config/sensor-parser-config.component.ts
+++ b/metron-interface/metron-config/src/app/sensors/sensor-parser-config/sensor-parser-config.component.ts
@@ -210,6 +210,10 @@ export class SensorParserConfigComponent implements OnInit {
       this.sensorParserConfig.parserClassName,
       Validators.required
     );
+    group['timestampField'] = new FormControl(
+      this.sensorParserConfig.timestampField,
+      Validators.required
+    );
     group['grokStatement'] = new FormControl(this.grokStatement);
     group['transforms'] = new FormControl(
       this.sensorParserConfig['transforms']
@@ -325,7 +329,7 @@ export class SensorParserConfigComponent implements OnInit {
   }
 
   isGrokStatementValid(): boolean {
-    return this.grokStatement !== undefined && Object.keys(this.grokStatement).length > 0;
+    return !!this.grokStatement;
   }
 
   isConfigValid() {
@@ -333,7 +337,8 @@ export class SensorParserConfigComponent implements OnInit {
     return this.sensorNameValid &&
             this.kafkaTopicValid &&
             this.parserClassValid &&
-            (!isGrokParser || this.isGrokStatementValid());
+            (!isGrokParser || this.isGrokStatementValid()) &&
+            (!isGrokParser || !!this.sensorParserConfig.timestampField);
   }
 
   getKafkaStatus() {
@@ -464,13 +469,7 @@ export class SensorParserConfigComponent implements OnInit {
   }
 
   isGrokParser(sensorParserConfig: SensorParserConfig): boolean {
-    if (sensorParserConfig && sensorParserConfig.parserClassName) {
-      return (
-        sensorParserConfig.parserClassName ===
-        'org.apache.metron.parsers.GrokParser'
-      );
-    }
-    return false;
+    return sensorParserConfig && sensorParserConfig.parserClassName === 'org.apache.metron.parsers.GrokParser';
   }
 
   getTransformationCount(): number {