You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by am...@apache.org on 2017/11/22 11:17:15 UTC
[20/50] [abbrv] ambari git commit: AMBARI-22429 Log Search UI:
implement logout. (Istvan Tobias via ababiichuk)
AMBARI-22429 Log Search UI: implement logout. (Istvan Tobias via ababiichuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/7428e51d
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/7428e51d
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/7428e51d
Branch: refs/heads/branch-feature-AMBARI-22008
Commit: 7428e51d8e3759edf5248762f0a257a46cc053a5
Parents: 4fa9ac5
Author: Istvan Tobias <to...@gmail.com>
Authored: Tue Nov 14 00:31:01 2017 +0200
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Tue Nov 14 00:31:01 2017 +0200
----------------------------------------------------------------------
.../ambari-logsearch-web/src/app/app.module.ts | 4 +-
.../src/app/components/app.component.spec.ts | 4 +-
.../dropdown-button.component.spec.ts | 4 +-
.../dropdown-list.component.spec.ts | 4 +-
.../filter-button.component.spec.ts | 4 +-
.../filter-dropdown.component.spec.ts | 4 +-
.../login-form/login-form.component.spec.ts | 7 +-
.../login-form/login-form.component.ts | 34 +++--
.../menu-button/menu-button.component.spec.ts | 4 +-
.../timezone-picker.component.spec.ts | 4 +-
.../components/top-menu/top-menu.component.ts | 3 +-
.../ambari-logsearch-web/src/app/mock-data.ts | 3 +-
.../src/app/services/auth.service.spec.ts | 132 +++++++++++++++++++
.../src/app/services/auth.service.ts | 123 +++++++++++++++++
.../services/component-actions.service.spec.ts | 4 +-
.../app/services/component-actions.service.ts | 20 ++-
.../src/assets/i18n/en.json | 1 +
17 files changed, 328 insertions(+), 31 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/7428e51d/ambari-logsearch/ambari-logsearch-web/src/app/app.module.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/app.module.ts b/ambari-logsearch/ambari-logsearch-web/src/app/app.module.ts
index 37f3a49..805f8e2 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/app.module.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/app.module.ts
@@ -53,6 +53,7 @@ import {ComponentsService} from '@app/services/storage/components.service';
import {ServiceLogsFieldsService} from '@app/services/storage/service-logs-fields.service';
import {AuditLogsFieldsService} from '@app/services/storage/audit-logs-fields.service';
import {TabsService} from '@app/services/storage/tabs.service';
+import {AuthService} from '@app/services/auth.service';
import {reducer} from '@app/services/storage/reducers.service';
import {AppComponent} from '@app/components/app.component';
@@ -185,7 +186,8 @@ export function getXHRBackend(injector: Injector, browser: BrowserXhr, xsrf: XSR
provide: XHRBackend,
useFactory: getXHRBackend,
deps: [Injector, BrowserXhr, XSRFStrategy, ResponseOptions]
- }
+ },
+ AuthService
],
bootstrap: [AppComponent],
entryComponents: [NodeBarComponent],
http://git-wip-us.apache.org/repos/asf/ambari/blob/7428e51d/ambari-logsearch/ambari-logsearch-web/src/app/components/app.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/app.component.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/app.component.spec.ts
index 490e058..bae05ce 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/app.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/app.component.spec.ts
@@ -53,9 +53,9 @@ describe('AppComponent', () => {
}).compileComponents();
}));
- it('should create the app', async(() => {
+ it('should create the app', () => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.debugElement.componentInstance;
expect(app).toBeTruthy();
- }));
+ });
});
http://git-wip-us.apache.org/repos/asf/ambari/blob/7428e51d/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-button/dropdown-button.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-button/dropdown-button.component.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-button/dropdown-button.component.spec.ts
index bd41c04..fc42e3c 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-button/dropdown-button.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-button/dropdown-button.component.spec.ts
@@ -36,6 +36,7 @@ import {UtilsService} from '@app/services/utils.service';
import {ComponentActionsService} from '@app/services/component-actions.service';
import {HttpClientService} from '@app/services/http-client.service';
import {LogsContainerService} from '@app/services/logs-container.service';
+import {AuthService} from '@app/services/auth.service';
import {DropdownButtonComponent} from './dropdown-button.component';
@@ -90,7 +91,8 @@ describe('DropdownButtonComponent', () => {
provide: HttpClientService,
useValue: httpClient
},
- LogsContainerService
+ LogsContainerService,
+ AuthService
],
schemas: [NO_ERRORS_SCHEMA]
})
http://git-wip-us.apache.org/repos/asf/ambari/blob/7428e51d/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-list/dropdown-list.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-list/dropdown-list.component.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-list/dropdown-list.component.spec.ts
index ac2fa84..63824cb 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-list/dropdown-list.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/dropdown-list/dropdown-list.component.spec.ts
@@ -36,6 +36,7 @@ import {ComponentGeneratorService} from '@app/services/component-generator.servi
import {LogsContainerService} from '@app/services/logs-container.service';
import {HttpClientService} from '@app/services/http-client.service';
import {ComponentActionsService} from '@app/services/component-actions.service';
+import {AuthService} from '@app/services/auth.service';
import {DropdownListComponent} from './dropdown-list.component';
@@ -91,7 +92,8 @@ describe('DropdownListComponent', () => {
ClustersService,
ComponentsService,
ServiceLogsTruncatedService,
- TabsService
+ TabsService,
+ AuthService
]
})
.compileComponents();
http://git-wip-us.apache.org/repos/asf/ambari/blob/7428e51d/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-button/filter-button.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-button/filter-button.component.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-button/filter-button.component.spec.ts
index f9ae154..6a9aca5 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-button/filter-button.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-button/filter-button.component.spec.ts
@@ -36,6 +36,7 @@ import {ComponentActionsService} from '@app/services/component-actions.service';
import {UtilsService} from '@app/services/utils.service';
import {HttpClientService} from '@app/services/http-client.service';
import {LogsContainerService} from '@app/services/logs-container.service';
+import {AuthService} from '@app/services/auth.service';
import {FilterButtonComponent} from './filter-button.component';
@@ -90,7 +91,8 @@ describe('FilterButtonComponent', () => {
provide: HttpClientService,
useValue: httpClient
},
- LogsContainerService
+ LogsContainerService,
+ AuthService
],
schemas: [NO_ERRORS_SCHEMA]
})
http://git-wip-us.apache.org/repos/asf/ambari/blob/7428e51d/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-dropdown/filter-dropdown.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-dropdown/filter-dropdown.component.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-dropdown/filter-dropdown.component.spec.ts
index f9192f4..8293ba0 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-dropdown/filter-dropdown.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/filter-dropdown/filter-dropdown.component.spec.ts
@@ -35,6 +35,7 @@ import {UtilsService} from '@app/services/utils.service';
import {ComponentActionsService} from '@app/services/component-actions.service';
import {LogsContainerService} from '@app/services/logs-container.service';
import {HttpClientService} from '@app/services/http-client.service';
+import {AuthService} from '@app/services/auth.service';
import {FilterDropdownComponent} from './filter-dropdown.component';
@@ -109,7 +110,8 @@ describe('FilterDropdownComponent', () => {
{
provide: HttpClientService,
useValue: httpClient
- }
+ },
+ AuthService
],
schemas: [NO_ERRORS_SCHEMA]
})
http://git-wip-us.apache.org/repos/asf/ambari/blob/7428e51d/ambari-logsearch/ambari-logsearch-web/src/app/components/login-form/login-form.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/login-form/login-form.component.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/login-form/login-form.component.spec.ts
index fb5c2a0..ac9f3a8 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/login-form/login-form.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/login-form/login-form.component.spec.ts
@@ -22,6 +22,7 @@ import {TranslationModules} from '@app/test-config.spec';
import {StoreModule} from '@ngrx/store';
import {AppStateService, appState} from '@app/services/storage/app-state.service';
import {HttpClientService} from '@app/services/http-client.service';
+import {AuthService} from '@app/services/auth.service';
import {LoginFormComponent} from './login-form.component';
@@ -58,7 +59,8 @@ describe('LoginFormComponent', () => {
{
provide: HttpClientService,
useValue: httpClient
- }
+ },
+ AuthService
]
})
.compileComponents();
@@ -101,9 +103,6 @@ describe('LoginFormComponent', () => {
expect(component.isLoginAlertDisplayed).toEqual(test.isLoginAlertDisplayed);
});
- it('isLoginInProgress', () => {
- expect(component.isLoginInProgress).toEqual(false);
- });
});
});
http://git-wip-us.apache.org/repos/asf/ambari/blob/7428e51d/ambari-logsearch/ambari-logsearch-web/src/app/components/login-form/login-form.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/login-form/login-form.component.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/login-form/login-form.component.ts
index 2bc45404..39a4975 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/login-form/login-form.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/login-form/login-form.component.ts
@@ -17,9 +17,10 @@
*/
import {Component} from '@angular/core';
+import {Response} from '@angular/http';
import 'rxjs/add/operator/finally';
-import {HttpClientService} from '@app/services/http-client.service';
import {AppStateService} from '@app/services/storage/app-state.service';
+import {AuthService} from '@app/services/auth.service';
@Component({
selector: 'login-form',
@@ -28,7 +29,7 @@ import {AppStateService} from '@app/services/storage/app-state.service';
})
export class LoginFormComponent {
- constructor(private httpClient: HttpClientService, private appState: AppStateService) {
+ constructor(private authService: AuthService, private appState: AppStateService) {
appState.getParameter('isLoginInProgress').subscribe(value => this.isLoginInProgress = value);
}
@@ -40,20 +41,25 @@ export class LoginFormComponent {
isLoginInProgress: boolean;
- private setIsAuthorized(value: boolean): void {
- this.appState.setParameters({
- isAuthorized: value,
- isLoginInProgress: false
- });
- this.isLoginAlertDisplayed = !value;
- }
+ /**
+ * Handling the response from the login action. Actually the goal only to show or hide the login error alert.
+ * When it gets error response it shows.
+ * @param {Response} resp
+ */
+ private onLoginError = (resp: Response): void => {
+ this.isLoginAlertDisplayed = true;
+ };
+ /**
+ * Handling the response from the login action. Actually the goal only to show or hide the login error alert.
+ * When it gets success response it hides.
+ * @param {Response} resp
+ */
+ private onLoginSuccess = (resp: Response): void => {
+ this.isLoginAlertDisplayed = false;
+ };
login() {
- this.appState.setParameter('isLoginInProgress', true);
- this.httpClient.postFormData('login', {
- username: this.username,
- password: this.password
- }).subscribe(() => this.setIsAuthorized(true), () => this.setIsAuthorized(false));
+ this.authService.login(this.username,this.password).subscribe(this.onLoginSuccess, this.onLoginError);
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/7428e51d/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.spec.ts
index 71bbf67..3836e7a 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/menu-button/menu-button.component.spec.ts
@@ -35,6 +35,7 @@ import {TabsService, tabs} from '@app/services/storage/tabs.service';
import {ComponentActionsService} from '@app/services/component-actions.service';
import {HttpClientService} from '@app/services/http-client.service';
import {LogsContainerService} from '@app/services/logs-container.service';
+import {AuthService} from '@app/services/auth.service';
import {MenuButtonComponent} from './menu-button.component';
@@ -88,7 +89,8 @@ describe('MenuButtonComponent', () => {
provide: HttpClientService,
useValue: httpClient
},
- LogsContainerService
+ LogsContainerService,
+ AuthService
],
schemas: [NO_ERRORS_SCHEMA]
})
http://git-wip-us.apache.org/repos/asf/ambari/blob/7428e51d/ambari-logsearch/ambari-logsearch-web/src/app/components/timezone-picker/timezone-picker.component.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/timezone-picker/timezone-picker.component.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/timezone-picker/timezone-picker.component.spec.ts
index 0e4c8a8..ab56589 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/timezone-picker/timezone-picker.component.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/timezone-picker/timezone-picker.component.spec.ts
@@ -34,6 +34,7 @@ import {TabsService, tabs} from '@app/services/storage/tabs.service';
import {ComponentActionsService} from '@app/services/component-actions.service';
import {HttpClientService} from '@app/services/http-client.service';
import {LogsContainerService} from '@app/services/logs-container.service';
+import {AuthService} from '@app/services/auth.service';
import {TimeZoneAbbrPipe} from '@app/pipes/timezone-abbr.pipe';
import {ModalComponent} from '@app/components/modal/modal.component';
@@ -93,7 +94,8 @@ describe('TimeZonePickerComponent', () => {
provide: HttpClientService,
useValue: httpClient
},
- LogsContainerService
+ LogsContainerService,
+ AuthService
],
})
.compileComponents();
http://git-wip-us.apache.org/repos/asf/ambari/blob/7428e51d/ambari-logsearch/ambari-logsearch-web/src/app/components/top-menu/top-menu.component.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/components/top-menu/top-menu.component.ts b/ambari-logsearch/ambari-logsearch-web/src/app/components/top-menu/top-menu.component.ts
index 05c1a62..91f27e8 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/components/top-menu/top-menu.component.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/components/top-menu/top-menu.component.ts
@@ -36,7 +36,8 @@ export class TopMenuComponent {
label: 'Options'
},
{
- label: 'Logout'
+ label: 'authorization.logout',
+ action: 'logout'
}
]
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/7428e51d/ambari-logsearch/ambari-logsearch-web/src/app/mock-data.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/mock-data.ts b/ambari-logsearch/ambari-logsearch-web/src/app/mock-data.ts
index 4325f5b..147efef 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/mock-data.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/mock-data.ts
@@ -20,6 +20,7 @@ import * as moment from 'moment';
export const mockData = {
login: {},
+ logout: {},
api: {
v1: {
audit: {
@@ -1064,4 +1065,4 @@ export const mockData = {
}
}
}
-};
\ No newline at end of file
+};
http://git-wip-us.apache.org/repos/asf/ambari/blob/7428e51d/ambari-logsearch/ambari-logsearch-web/src/app/services/auth.service.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/services/auth.service.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/services/auth.service.spec.ts
new file mode 100644
index 0000000..a465c10
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/services/auth.service.spec.ts
@@ -0,0 +1,132 @@
+/**
+ * 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 {TestBed, inject} from '@angular/core/testing';
+import {HttpModule} from '@angular/http';
+import {Observable} from 'rxjs/Observable';
+import {StoreModule} from '@ngrx/store';
+import {AppStateService, appState} from '@app/services/storage/app-state.service';
+import {AuthService} from '@app/services/auth.service';
+import {HttpClientService} from '@app/services/http-client.service';
+
+describe('AuthService', () => {
+
+ let successResponse = {
+ type: 'default',
+ ok: true,
+ url: '/',
+ status: 200,
+ statusText: 'OK',
+ bytesLoaded: 100,
+ totalBytes: 100,
+ headers: null
+ };
+ let errorResponse = {
+ type: 'error',
+ ok: false,
+ url: '/',
+ status: 401,
+ statusText: 'ERROR',
+ bytesLoaded: 100,
+ totalBytes: 100,
+ headers: null
+ };
+ let currentResponse = successResponse;
+ let httpServiceStub;
+ let authService: AuthService;
+
+ beforeEach(() => {
+ // Note: We add delay to help the isLoginInProgress test case.
+ httpServiceStub = {
+ postFormData: function () {
+ return Observable.create(observer => {
+ observer.next(currentResponse);
+ }).delay(1000);
+ },
+ post: function () {
+ return Observable.create(observer => {
+ observer.next(currentResponse);
+ }).delay(1000);
+ },
+ get: function () {
+ return Observable.create(observer => {
+ observer.next(currentResponse);
+ }).delay(1000);
+ }
+ };
+ TestBed.configureTestingModule({
+ imports: [
+ HttpModule,
+ StoreModule.provideStore({
+ appState
+ })
+ ],
+ providers: [
+ AuthService,
+ AppStateService,
+ {provide: HttpClientService, useValue: httpServiceStub}
+ ]
+ });
+ authService = TestBed.get(AuthService);
+ });
+
+ it('should create service', inject([AuthService], (service: AuthService) => {
+ expect(service).toBeTruthy();
+ }));
+
+ it('should set the isAuthorized state to true in appState when the login is success', inject(
+ [AppStateService],
+ (appStateService: AppStateService) => {
+ currentResponse = successResponse;
+ authService.login('test', 'test')
+ .subscribe(() => {
+ appStateService.getParameter('isAuthorized').subscribe((value) => {
+ expect(value).toBe(true);
+ });
+ }, (value) => {
+ throw value;
+ });
+ }
+ ));
+
+
+ it('should set the isAuthorized state to false in appState when the login is failed', inject(
+ [AppStateService],
+ (appStateService: AppStateService) => {
+ currentResponse = errorResponse;
+ authService.login('test', 'test')
+ .subscribe(() => {
+ appStateService.getParameter('isAuthorized').subscribe((value) => {
+ expect(value).toBe(false);
+ });
+ });
+ }
+ ));
+
+ it('should set the isLoginInProgress state to true when the login started.', inject(
+ [AppStateService],
+ (appStateService: AppStateService) => {
+ currentResponse = successResponse;
+ authService.login('test', 'test');
+ appStateService.getParameter('isLoginInProgress').subscribe((value) => {
+ expect(value).toBe(true);
+ });
+ }
+ ));
+
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/7428e51d/ambari-logsearch/ambari-logsearch-web/src/app/services/auth.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/services/auth.service.ts b/ambari-logsearch/ambari-logsearch-web/src/app/services/auth.service.ts
new file mode 100644
index 0000000..8785ce2
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/services/auth.service.ts
@@ -0,0 +1,123 @@
+/**
+ * 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 {Response} from '@angular/http';
+
+import {Observable} from 'rxjs/Observable';
+
+import {HttpClientService} from '@app/services/http-client.service';
+import {AppStateService} from '@app/services/storage/app-state.service';
+
+/**
+ * This service meant to be a single place where the authorization should happen.
+ */
+@Injectable()
+export class AuthService {
+
+ constructor(private httpClient: HttpClientService, private appState: AppStateService) {}
+
+ /**
+ * The single entry point to request a login action.
+ * @param {string} username
+ * @param {string} password
+ * @returns {Observable<Response>}
+ */
+ login(username: string, password: string): Observable<Response> {
+ this.setLoginInProgressAppState(true);
+ let obs = this.httpClient.postFormData('login', {
+ username: username,
+ password: password
+ });
+ obs.subscribe(
+ (resp: Response) => this.onLoginResponse(resp),
+ (resp: Response) => this.onLoginError(resp)
+ );
+ return obs;
+ }
+
+ /**
+ * The single unique entry point to request a logout action
+ * @returns {Observable<boolean | Error>}
+ */
+ logout(): Observable<Response> {
+ let obs = this.httpClient.get('logout');
+ obs.subscribe(
+ (resp: Response) => this.onLogoutResponse(resp),
+ (resp: Response) => this.onLogoutError(resp)
+ );
+ return obs;
+ }
+
+ /**
+ * Set the isLoginInProgress state in AppState. The reason behind create a function for this is that we set this app
+ * state from two different places so let's do always the same way.
+ * @param {boolean} state the new value of the isLoginInProgress app state.
+ */
+ private setLoginInProgressAppState(state: boolean) {
+ this.appState.setParameter('isLoginInProgress', state);
+ }
+
+ /**
+ * Set the isAuthorized state in AppState. The reason behind create a function for this is that we set this app
+ * state from two different places so let's do always the same way.
+ * @param {boolean} state The new value of the isAuthorized app state.
+ */
+ private setAuthorizedAppState(state: boolean) {
+ this.appState.setParameter('isAuthorized', state);
+ }
+
+ /**
+ * Handling the login success response. The goal is to set the authorized property of the appState.
+ * @param resp
+ */
+ private onLoginResponse(resp: Response): void {
+ if (resp && resp.ok) {
+ this.setLoginInProgressAppState(false);
+ this.setAuthorizedAppState(resp.ok);
+ }
+ }
+
+ /**
+ * Handling the login error response. The goal is to set the authorized property correctly of the appState.
+ * @ToDo decide if we should have a loginError app state.
+ * @param {Reponse} resp
+ */
+ private onLoginError(resp: Response): void {
+ this.setLoginInProgressAppState(false);
+ this.setAuthorizedAppState(false);
+ }
+
+ /**
+ * Handling the logout success response. The goal is to set the authorized property of the appState.
+ * @param {Response} resp
+ */
+ private onLogoutResponse(resp: Response): void {
+ if (resp && resp.ok) {
+ this.setAuthorizedAppState(false);
+ }
+ }
+
+ /**
+ * Handling the logout error response.
+ * @ToDo decide if we should create a logoutError app state or not
+ * @param {Response} resp
+ */
+ private onLogoutError(resp: Response): void {}
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/7428e51d/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.spec.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.spec.ts b/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.spec.ts
index 6f54e65..6d43ff1 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.spec.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.spec.ts
@@ -32,6 +32,7 @@ import {ServiceLogsTruncatedService, serviceLogsTruncated} from '@app/services/s
import {TabsService, tabs} from '@app/services/storage/tabs.service';
import {HttpClientService} from '@app/services/http-client.service';
import {LogsContainerService} from '@app/services/logs-container.service';
+import {AuthService} from '@app/services/auth.service';
import {ComponentActionsService} from './component-actions.service';
@@ -81,7 +82,8 @@ describe('ComponentActionsService', () => {
provide: HttpClientService,
useValue: httpClient
},
- LogsContainerService
+ LogsContainerService,
+ AuthService
]
});
});
http://git-wip-us.apache.org/repos/asf/ambari/blob/7428e51d/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.ts
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.ts b/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.ts
index 73fc94c..e796183 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.ts
+++ b/ambari-logsearch/ambari-logsearch-web/src/app/services/component-actions.service.ts
@@ -21,6 +21,7 @@ import {AppSettingsService} from '@app/services/storage/app-settings.service';
import {TabsService} from '@app/services/storage/tabs.service';
import {CollectionModelService} from '@app/classes/models/store';
import {LogsContainerService} from '@app/services/logs-container.service';
+import {AuthService} from '@app/services/auth.service';
import {ServiceLog} from '@app/classes/models/service-log';
import {ListItem} from '@app/classes/list-item';
@@ -29,7 +30,8 @@ export class ComponentActionsService {
constructor(
private appSettings: AppSettingsService, private tabsStorage: TabsService,
- private logsContainer: LogsContainerService
+ private logsContainer: LogsContainerService,
+ private authService: AuthService
) {
}
@@ -134,4 +136,20 @@ export class ComponentActionsService {
isExclude: true
});
+ /**
+ * Request a login action from the AuthService
+ * @param {string} username
+ * @param {string} password
+ */
+ login(username: string, password: string): void {
+ this.authService.login(username, password);
+ }
+
+ /**
+ * Request a logout action from AuthService
+ */
+ logout(): void {
+ this.authService.logout();
+ }
+
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/7428e51d/ambari-logsearch/ambari-logsearch-web/src/assets/i18n/en.json
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-web/src/assets/i18n/en.json b/ambari-logsearch/ambari-logsearch-web/src/assets/i18n/en.json
index 16b4b32..b214a4f 100644
--- a/ambari-logsearch/ambari-logsearch-web/src/assets/i18n/en.json
+++ b/ambari-logsearch/ambari-logsearch-web/src/assets/i18n/en.json
@@ -10,6 +10,7 @@
"modal.apply": "Apply",
"modal.close": "Close",
+ "authorization.logout": "Logout",
"authorization.name": "Username",
"authorization.password": "Password",
"authorization.signIn": "Sign In",