You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metron.apache.org by rm...@apache.org on 2017/10/02 19:38:15 UTC

metron git commit: METRON-1204 UI does not time out after being idle, but stops functioning (merrimanr) closes apache/metron#771

Repository: metron
Updated Branches:
  refs/heads/master 7b6a3da6d -> 2fbb98e7d


METRON-1204 UI does not time out after being idle, but stops functioning (merrimanr) closes apache/metron#771


Project: http://git-wip-us.apache.org/repos/asf/metron/repo
Commit: http://git-wip-us.apache.org/repos/asf/metron/commit/2fbb98e7
Tree: http://git-wip-us.apache.org/repos/asf/metron/tree/2fbb98e7
Diff: http://git-wip-us.apache.org/repos/asf/metron/diff/2fbb98e7

Branch: refs/heads/master
Commit: 2fbb98e7da670b0f9170648cf0b8bfe259e7e65f
Parents: 7b6a3da
Author: merrimanr <me...@gmail.com>
Authored: Mon Oct 2 14:38:02 2017 -0500
Committer: merrimanr <me...@apache.org>
Committed: Mon Oct 2 14:38:02 2017 -0500

----------------------------------------------------------------------
 .../src/app/login/login.component.ts            | 10 ++-
 .../metron-alerts/src/app/utils/httpUtil.ts     |  3 +-
 .../src/app/login/login.component.spec.ts       | 66 +++++++++++++++-----
 .../src/app/login/login.component.ts            |  8 ++-
 .../metron-config/src/app/login/login.module.ts |  7 ++-
 .../src/app/login/login.routing.ts              |  3 +-
 .../sensor-parser-config-readonly.component.ts  |  2 +-
 .../metron-config/src/app/util/httpUtil.ts      |  5 +-
 8 files changed, 77 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metron/blob/2fbb98e7/metron-interface/metron-alerts/src/app/login/login.component.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/login/login.component.ts b/metron-interface/metron-alerts/src/app/login/login.component.ts
index 877e05b..1d6c24f 100644
--- a/metron-interface/metron-alerts/src/app/login/login.component.ts
+++ b/metron-interface/metron-alerts/src/app/login/login.component.ts
@@ -17,6 +17,7 @@
  */
 import { Component } from '@angular/core';
 import { AuthenticationService } from '../service/authentication.service';
+import { ActivatedRoute } from '@angular/router';
 
 @Component({
   selector: 'metron-alerts-login',
@@ -27,9 +28,14 @@ export class LoginComponent {
 
   user: string;
   password: string;
-  loginFailure = '';
+  loginFailure: string = '';
 
-  constructor(private authenticationService: AuthenticationService) {
+  constructor(private authenticationService: AuthenticationService, private activatedRoute: ActivatedRoute) {
+    this.activatedRoute.queryParams.subscribe(params => {
+      if (params['sessionExpired'] === 'true') {
+        this.loginFailure = 'Session has expired';
+      }
+    });
   }
 
   login(): void {

http://git-wip-us.apache.org/repos/asf/metron/blob/2fbb98e7/metron-interface/metron-alerts/src/app/utils/httpUtil.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-alerts/src/app/utils/httpUtil.ts b/metron-interface/metron-alerts/src/app/utils/httpUtil.ts
index 89d309f..dfcb61f 100644
--- a/metron-interface/metron-alerts/src/app/utils/httpUtil.ts
+++ b/metron-interface/metron-alerts/src/app/utils/httpUtil.ts
@@ -36,8 +36,7 @@ export class HttpUtil {
     // We'd also dig deeper into the error to get a better message
     let restError: RestError;
     if (res.status === 401) {
-      restError = res.json();
-      window.location.pathname = '/login';
+      window.location.assign('/login?sessionExpired=true');
     } else if (res.status !== 404) {
       restError = res.json();
     } else {

http://git-wip-us.apache.org/repos/asf/metron/blob/2fbb98e7/metron-interface/metron-config/src/app/login/login.component.spec.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-config/src/app/login/login.component.spec.ts b/metron-interface/metron-config/src/app/login/login.component.spec.ts
index 0cf3554..5ad285a 100644
--- a/metron-interface/metron-config/src/app/login/login.component.spec.ts
+++ b/metron-interface/metron-config/src/app/login/login.component.spec.ts
@@ -15,9 +15,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import {async, inject, TestBed} from '@angular/core/testing';
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
 import {AuthenticationService} from '../service/authentication.service';
 import {LoginComponent} from './login.component';
+import {Observable}     from 'rxjs/Observable';
+import {ActivatedRoute, Params} from '@angular/router';
+import {LoginModule} from './login.module';
+import {APP_CONFIG, METRON_REST_CONFIG} from '../app.config';
 
 class MockAuthenticationService {
 
@@ -32,34 +36,64 @@ class MockAuthenticationService {
   }
 }
 
+class MockActivatedRoute {
+  queryParams: Observable<Params> = Observable.create(observer => {
+    observer.complete();
+  });
+
+  setSessionExpired() {
+    this.queryParams = Observable.create(observer => {
+      observer.next({'sessionExpired': 'true'});
+      observer.complete();
+    });
+  }
+}
+
 describe('LoginComponent', () => {
 
+  let component: LoginComponent;
+  let fixture: ComponentFixture<LoginComponent>;
+  let activatedRoute: MockActivatedRoute;
+
   beforeEach(async(() => {
     TestBed.configureTestingModule({
+      imports: [LoginModule],
       providers: [
-        LoginComponent,
-        {provide: AuthenticationService, useClass: MockAuthenticationService}
+        {provide: ActivatedRoute, useClass: MockActivatedRoute},
+        {provide: AuthenticationService, useClass: MockAuthenticationService},
+        {provide: APP_CONFIG, useValue: METRON_REST_CONFIG}
       ]
-    })
-      .compileComponents();
+    }).compileComponents()
+    .then(() => {
+      fixture = TestBed.createComponent(LoginComponent);
+      component = fixture.componentInstance;
+      activatedRoute = fixture.debugElement.injector.get(ActivatedRoute);
+    });
 
   }));
 
-  it('can instantiate login component', inject([LoginComponent], (loginComponent: LoginComponent) => {
-      expect(loginComponent instanceof LoginComponent).toBe(true);
+  it('should create an instance', async(() => {
+    expect(component).toBeDefined();
   }));
 
-  it('can instantiate login component', inject([LoginComponent], (loginComponent: LoginComponent) => {
-    loginComponent.user = 'success';
-    loginComponent.password = 'success';
-    loginComponent.login();
-    expect(loginComponent.loginFailure).toEqual('');
+  it('can instantiate login component', async(() => {
+    component.user = 'success';
+    component.password = 'success';
+    component.login();
+    expect(component.loginFailure).toEqual('');
+
+    component.user = 'failure';
+    component.password = 'failure';
+    component.login();
+    expect(component.loginFailure).toEqual('Login failed for failure');
+
+  }));
 
-    loginComponent.user = 'failure';
-    loginComponent.password = 'failure';
-    loginComponent.login();
-    expect(loginComponent.loginFailure).toEqual('Login failed for failure');
+  it('can handle sessionExpired', async(() => {
+    activatedRoute.setSessionExpired();
+    let sessionExpiredComponent = TestBed.createComponent(LoginComponent).componentInstance;
 
+    expect(sessionExpiredComponent.loginFailure).toEqual('Session has expired');
   }));
 
 });

http://git-wip-us.apache.org/repos/asf/metron/blob/2fbb98e7/metron-interface/metron-config/src/app/login/login.component.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-config/src/app/login/login.component.ts b/metron-interface/metron-config/src/app/login/login.component.ts
index cdd672a..bc3cf1a 100644
--- a/metron-interface/metron-config/src/app/login/login.component.ts
+++ b/metron-interface/metron-config/src/app/login/login.component.ts
@@ -17,6 +17,7 @@
  */
 import { Component } from '@angular/core';
 import { AuthenticationService } from '../service/authentication.service';
+import { ActivatedRoute } from '@angular/router';
 
 @Component({
   selector: 'metron-config-login',
@@ -29,7 +30,12 @@ export class LoginComponent {
   password: string;
   loginFailure: string = '';
 
-  constructor(private authenticationService: AuthenticationService) {
+  constructor(private authenticationService: AuthenticationService, private activatedRoute: ActivatedRoute) {
+    this.activatedRoute.queryParams.subscribe(params => {
+      if (params['sessionExpired'] === 'true') {
+        this.loginFailure = 'Session has expired';
+      }
+    });
   }
 
   login(): void {

http://git-wip-us.apache.org/repos/asf/metron/blob/2fbb98e7/metron-interface/metron-config/src/app/login/login.module.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-config/src/app/login/login.module.ts b/metron-interface/metron-config/src/app/login/login.module.ts
index 6efd125..bdc5640 100644
--- a/metron-interface/metron-config/src/app/login/login.module.ts
+++ b/metron-interface/metron-config/src/app/login/login.module.ts
@@ -16,9 +16,12 @@
  * limitations under the License.
  */
 import { NgModule } from '@angular/core';
-import {routing} from "./login.routing";
+import {routing} from './login.routing';
+import {LoginComponent} from './login.component';
+import {SharedModule} from '../shared/shared.module';
 
 @NgModule ({
-  imports: [ routing ]
+  imports: [ routing, SharedModule ],
+  declarations: [ LoginComponent ]
 })
 export class LoginModule { }

http://git-wip-us.apache.org/repos/asf/metron/blob/2fbb98e7/metron-interface/metron-config/src/app/login/login.routing.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-config/src/app/login/login.routing.ts b/metron-interface/metron-config/src/app/login/login.routing.ts
index 7d2d22e..e0f1be8 100644
--- a/metron-interface/metron-config/src/app/login/login.routing.ts
+++ b/metron-interface/metron-config/src/app/login/login.routing.ts
@@ -17,8 +17,7 @@
  */
 import { ModuleWithProviders }  from '@angular/core';
 import { RouterModule } from '@angular/router';
-import {LoginComponent} from "./login.component";
-
+import { LoginComponent } from './login.component';
 
 export const routing: ModuleWithProviders = RouterModule.forChild([
   { path: '', component: LoginComponent}

http://git-wip-us.apache.org/repos/asf/metron/blob/2fbb98e7/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 7edc2c5..b2cfef1 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
@@ -145,7 +145,7 @@ export class SensorParserConfigReadonlyComponent implements OnInit {
 
   getTopologyStatus(key: string): string {
     if (key === 'latency') {
-      return this.topologyStatus.latency >= 0? (this.topologyStatus.latency + 's') : '-';
+      return this.topologyStatus.latency >= 0 ? (this.topologyStatus.latency + 's') : '-';
     } else if (key === 'throughput') {
       return this.topologyStatus.throughput >= 0 ? ((Math.round(this.topologyStatus.throughput * 100) / 100) + 'kb/s') : '-';
     } else if (key === 'emitted') {

http://git-wip-us.apache.org/repos/asf/metron/blob/2fbb98e7/metron-interface/metron-config/src/app/util/httpUtil.ts
----------------------------------------------------------------------
diff --git a/metron-interface/metron-config/src/app/util/httpUtil.ts b/metron-interface/metron-config/src/app/util/httpUtil.ts
index a93e66e..dfcb61f 100644
--- a/metron-interface/metron-config/src/app/util/httpUtil.ts
+++ b/metron-interface/metron-config/src/app/util/httpUtil.ts
@@ -18,6 +18,7 @@
 import {Response} from '@angular/http';
 import {Observable}     from 'rxjs/Observable';
 import {RestError} from '../model/rest-error';
+
 export class HttpUtil {
 
   public static extractString(res: Response): string {
@@ -34,7 +35,9 @@ export class HttpUtil {
     // In a real world app, we might use a remote logging infrastructure
     // We'd also dig deeper into the error to get a better message
     let restError: RestError;
-    if (res.status !== 404) {
+    if (res.status === 401) {
+      window.location.assign('/login?sessionExpired=true');
+    } else if (res.status !== 404) {
       restError = res.json();
     } else {
       restError = new RestError();