From 6380a4292ddb39b23f6e57ea0d000bf00a8879e0 Mon Sep 17 00:00:00 2001 From: vinay sharma Date: Wed, 9 Feb 2022 15:44:12 +0530 Subject: [PATCH] STALWART-31 Show migration acknowledgement on server details page (#6670) * added changes for the show migration status Signed-off-by: Vinay Sharma * added some UI changes to show the error message Signed-off-by: Vinay Sharma * added some changes to change the tooltip position Signed-off-by: Vinay Sharma * added changes for the preview screen * added some css changes Signed-off-by: Vinay Sharma * added changes to fix the sonar cloud issue Signed-off-by: Vinay Sharma * added review comment changes Signed-off-by: Vinay Sharma --- .../automate-gateway/gateway/services.go | 2 +- .../app/entities/servers/server.actions.ts | 31 +++++- .../app/entities/servers/server.effects.ts | 23 +++- .../src/app/entities/servers/server.model.ts | 9 ++ .../app/entities/servers/server.reducer.ts | 22 +++- .../app/entities/servers/server.requests.ts | 6 +- .../app/entities/servers/server.selectors.ts | 10 ++ .../chef-server-details.component.html | 78 +++++++++++--- .../chef-server-details.component.scss | 101 +++++++++++++++--- .../chef-server-details.component.ts | 96 ++++++++++++++++- .../automate-ui/src/assets/img/completed.png | Bin 0 -> 14992 bytes .../automate-ui/src/assets/img/failed.png | Bin 0 -> 46305 bytes 12 files changed, 339 insertions(+), 39 deletions(-) create mode 100644 components/automate-ui/src/assets/img/completed.png create mode 100644 components/automate-ui/src/assets/img/failed.png diff --git a/components/automate-gateway/gateway/services.go b/components/automate-gateway/gateway/services.go index 84b237504c8..d24634000ba 100644 --- a/components/automate-gateway/gateway/services.go +++ b/components/automate-gateway/gateway/services.go @@ -976,7 +976,7 @@ func (s *Server) UploadZipFile(w http.ResponseWriter, r *http.Request) { var cType, fileName, serverId string var content bytes.Buffer file, metaData, err := r.FormFile("file") - serverId = r.FormValue("serverId") + serverId = r.FormValue("server_id") if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) diff --git a/components/automate-ui/src/app/entities/servers/server.actions.ts b/components/automate-ui/src/app/entities/servers/server.actions.ts index 29e41a178d2..f0ddbc3dafb 100644 --- a/components/automate-ui/src/app/entities/servers/server.actions.ts +++ b/components/automate-ui/src/app/entities/servers/server.actions.ts @@ -1,7 +1,7 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Action } from '@ngrx/store'; -import { Server , User, WebUIKey } from './server.model'; +import { MigrationStatus, Server , User, WebUIKey } from './server.model'; import { ValidateWebUIKeyResponse } from './server.requests'; export enum ServerActionTypes { @@ -29,7 +29,10 @@ export enum ServerActionTypes { VALIDATE_WEB_UI_KEY = 'SERVER::VALIDATE_WEB_UI_KEY', VALIDATE_WEB_UI_KEY_SUCCESS = 'SERVER::VALIDATE_WEB_UI_KEY::SUCCESS', VALIDATE_WEB_UI_KEY_SUCCESS_NOT= 'SERVER::VALIDATE_WEB_UI_KEY::SUCCESS_NOT', - VALIDATE_WEB_UI_KEY_FAILURE = 'SERVER::VALIDATE_WEB_UI_KEY::FAILURE' + VALIDATE_WEB_UI_KEY_FAILURE = 'SERVER::VALIDATE_WEB_UI_KEY::FAILURE', + GET_MIGRATION_STATUS = 'SERVER::GET_MIGRATION_STATUS', + GET_MIGRATION_STATUS_SUCCESS = 'SERVER::GET_MIGRATION_STATUS::SUCCESS', + GET_MIGRATION_STATUS_FAILURE = 'SERVER::GET_MIGRATION_STATUS::FAILURE' } @@ -199,6 +202,24 @@ export class ValidateWebUIKeyFailure implements Action { constructor(public payload: HttpErrorResponse) { } } +export class GetMigrationStatus implements Action { + readonly type = ServerActionTypes.GET_MIGRATION_STATUS; + + constructor(public payload: string) { } +} + +export class GetMigrationStatusSuccess implements Action { + readonly type = ServerActionTypes.GET_MIGRATION_STATUS_SUCCESS; + + constructor(public payload: MigrationStatus) { } +} + +export class GetMigrationStatusFailure implements Action { + readonly type = ServerActionTypes.GET_MIGRATION_STATUS_FAILURE; + + constructor(public payload: HttpErrorResponse) { } +} + export type ServerActions = | GetServers | GetServersSuccess @@ -224,4 +245,8 @@ export type ServerActions = | ValidateWebUIKey | ValidateWebUIKeySuccess | ValidateWebUIKeySuccessNot - | ValidateWebUIKeyFailure; + | ValidateWebUIKeyFailure + | GetMigrationStatus + | GetMigrationStatusSuccess + | GetMigrationStatusFailure; + diff --git a/components/automate-ui/src/app/entities/servers/server.effects.ts b/components/automate-ui/src/app/entities/servers/server.effects.ts index 920fbfa0719..8624f70fbcb 100644 --- a/components/automate-ui/src/app/entities/servers/server.effects.ts +++ b/components/automate-ui/src/app/entities/servers/server.effects.ts @@ -36,7 +36,10 @@ import { ValidateWebUIKey, ValidateWebUIKeySuccess, ValidateWebUIKeyFailure, - ValidateWebUIKeySuccessNot + ValidateWebUIKeySuccessNot, + GetMigrationStatus, + GetMigrationStatusSuccess, + GetMigrationStatusFailure } from './server.actions'; import { @@ -251,4 +254,22 @@ export class ServerEffects { message: `Could not validated Web UI Key ${msg || payload.error}.` }); }))); + + GetMigrationStatus$ = createEffect(() => this.actions$.pipe( + ofType(ServerActionTypes.GET_MIGRATION_STATUS), + mergeMap(({ payload }: GetMigrationStatus) => + this.requests.getMigrationStatus(payload).pipe( + map((resp) => new GetMigrationStatusSuccess(resp)), + catchError((error: HttpErrorResponse) => + observableOf(new GetMigrationStatusFailure(error))))))); + + GetMigrationStatusFailure$ = createEffect(() => this.actions$.pipe( + ofType(ServerActionTypes.GET_MIGRATION_STATUS_FAILURE), + map(({ payload }: GetMigrationStatusFailure) => { + const msg = payload.error.error; + return new CreateNotification({ + type: Type.error, + message: `Could not update Migration status: ${msg || payload.error}.` + }); + }))); } diff --git a/components/automate-ui/src/app/entities/servers/server.model.ts b/components/automate-ui/src/app/entities/servers/server.model.ts index 106b725a289..08ce960b5b7 100644 --- a/components/automate-ui/src/app/entities/servers/server.model.ts +++ b/components/automate-ui/src/app/entities/servers/server.model.ts @@ -5,6 +5,9 @@ export interface Server { ip_address: string; orgs_count?: number; webui_key?: string; + migration_id?: string; + migration_type?: string; + migration_status?: string; } export interface User { @@ -21,3 +24,9 @@ export interface WebUIKey { id: string; webui_key: string; } + +export interface MigrationStatus { + migration_id: string; + migration_type: string; + migration_status: string; +} diff --git a/components/automate-ui/src/app/entities/servers/server.reducer.ts b/components/automate-ui/src/app/entities/servers/server.reducer.ts index 2ddc07f713c..8a93f226d77 100644 --- a/components/automate-ui/src/app/entities/servers/server.reducer.ts +++ b/components/automate-ui/src/app/entities/servers/server.reducer.ts @@ -3,7 +3,7 @@ import { HttpErrorResponse } from '@angular/common/http'; import { pipe, set, unset } from 'lodash/fp'; import { EntityStatus } from 'app/entities/entities'; import { ServerActionTypes, ServerActions } from './server.actions'; -import { Server, User } from './server.model'; +import { MigrationStatus, Server, User } from './server.model'; import { ValidateWebUIKeyResponse } from './server.requests'; export interface ServerEntityState extends EntityState { @@ -18,6 +18,8 @@ export interface ServerEntityState extends EntityState { updateWebUIKeyStatus: EntityStatus; getvalidateWebUIKeyStatus: ValidateWebUIKeyResponse; validateWebUIKeyStatus: EntityStatus; + getMigrationStatus: MigrationStatus; + migrationStatus: EntityStatus; } const GET_ALL_STATUS = 'getAllStatus'; @@ -29,6 +31,7 @@ const DELETE_STATUS = 'deleteStatus'; const GET_USERS_STATUS = 'getUsersStatus'; const UPDATE_WEB_UI_KEY_STATUS = 'updateWebUIKeyStatus'; const VALIDATE_WEB_UI_KEY_STATUS = 'validateWebUIKeyStatus'; +const GET_MIGRATION_STATUS = 'migrationStatus'; export const serverEntityAdapter: EntityAdapter = createEntityAdapter(); @@ -44,7 +47,9 @@ export const ServerEntityInitialState: ServerEntityState = getUsersStatus: EntityStatus.notLoaded, updateWebUIKeyStatus: EntityStatus.notLoaded, getvalidateWebUIKeyStatus: null, - validateWebUIKeyStatus: EntityStatus.notLoaded + validateWebUIKeyStatus: EntityStatus.notLoaded, + getMigrationStatus: null, + migrationStatus: EntityStatus.notLoaded }); export function serverEntityReducer( @@ -170,6 +175,19 @@ export function serverEntityReducer( case ServerActionTypes.VALIDATE_WEB_UI_KEY_FAILURE: return set(VALIDATE_WEB_UI_KEY_STATUS, EntityStatus.loadingFailure, state); + + case ServerActionTypes.GET_MIGRATION_STATUS: + return set(GET_MIGRATION_STATUS, EntityStatus.loading, state); + + case ServerActionTypes.GET_MIGRATION_STATUS_SUCCESS: + return pipe( + set(GET_MIGRATION_STATUS, EntityStatus.loadingSuccess), + set('getMigrationStatus', action.payload || {}) + )(state) as ServerEntityState; + + case ServerActionTypes.GET_MIGRATION_STATUS_FAILURE: + return set(GET_MIGRATION_STATUS, EntityStatus.loadingFailure, state); + } return state; diff --git a/components/automate-ui/src/app/entities/servers/server.requests.ts b/components/automate-ui/src/app/entities/servers/server.requests.ts index 8acaf30c442..c7c7259c1d6 100644 --- a/components/automate-ui/src/app/entities/servers/server.requests.ts +++ b/components/automate-ui/src/app/entities/servers/server.requests.ts @@ -4,7 +4,7 @@ import { Observable } from 'rxjs'; import { mapKeys, snakeCase } from 'lodash/fp'; import { environment as env } from 'environments/environment'; -import { Server, User, WebUIKey } from './server.model'; +import { MigrationStatus, Server, User, WebUIKey } from './server.model'; import { CreateServerPayload, ServerSuccessPayload } from './server.actions'; export interface ServersResponse { @@ -64,4 +64,8 @@ export class ServerRequests { return this.http.post (`${env.infra_proxy_url}/servers/validate`, payload); } + + public getMigrationStatus(migration_id: string): Observable { + return this.http.get(`${env.infra_proxy_url}/servers/migrations/status/${migration_id}`); + } } diff --git a/components/automate-ui/src/app/entities/servers/server.selectors.ts b/components/automate-ui/src/app/entities/servers/server.selectors.ts index 88b20b1b232..3bef9c7553b 100644 --- a/components/automate-ui/src/app/entities/servers/server.selectors.ts +++ b/components/automate-ui/src/app/entities/servers/server.selectors.ts @@ -71,3 +71,13 @@ export const validateWebUIKeyStatus = createSelector( serverState, (state) => state.validateWebUIKeyStatus ); + +export const getMigrationStatus = createSelector( + serverState, + (state) => state.getMigrationStatus +); + +export const migrationStatus = createSelector( + serverState, + (state) => state.migrationStatus +); diff --git a/components/automate-ui/src/app/modules/infra-proxy/chef-server-details/chef-server-details.component.html b/components/automate-ui/src/app/modules/infra-proxy/chef-server-details/chef-server-details.component.html index 63566d19671..3bb6e2f27b0 100644 --- a/components/automate-ui/src/app/modules/infra-proxy/chef-server-details/chef-server-details.component.html +++ b/components/automate-ui/src/app/modules/infra-proxy/chef-server-details/chef-server-details.component.html @@ -10,16 +10,20 @@
+

CHEF SERVER INFORMATION

- {{ server?.name }}
  • FQDN - {{ server?.fqdn }} + {{ server?.fqdn }}
  • IP Address - {{ server?.ip_address }} + {{ server?.ip_address === '' ? '--' : server?.ip_address }} +
  • +
  • + +
@@ -27,20 +31,66 @@
  • Web UI Key - Validating... - Valid - warning - Invalid - - Update + + Validating... + Valid + warning + Invalid + + Update +
  • - Org & User last synced - Thu, Feb 04, 12:00:00 UTC + last sync date + Thu, Feb 04, 12:00:00 UTC +
  • +
  • + Last Migration Status + + + info + Completed + + + + + + warning + Migration failed, migration step not completed! + + info + Failed + + + + Sync In Progress + + + + + + {{stepsCompleted}} Steps Completed + Click to Preview + + + Loading.... + --
diff --git a/components/automate-ui/src/app/modules/infra-proxy/chef-server-details/chef-server-details.component.scss b/components/automate-ui/src/app/modules/infra-proxy/chef-server-details/chef-server-details.component.scss index 0dcaac0ba2f..a5ccee60efe 100644 --- a/components/automate-ui/src/app/modules/infra-proxy/chef-server-details/chef-server-details.component.scss +++ b/components/automate-ui/src/app/modules/infra-proxy/chef-server-details/chef-server-details.component.scss @@ -18,15 +18,35 @@ chef-page-header { padding: 0 1em; &.first { - width: 33%; + width: 39%; + + .heading { + display: inline-block; + font-weight: bold; + width: 30%; + } + + .server-entity-value { + width: 70%; + } } &.middle { - width: 40%; + width: 46%; + + .heading { + display: inline-block; + font-weight: bold; + width: 30%; + } + + .server-entity-value { + width: 70%; + } } &.last { - width: 25%; + width: 14%; } .meta-head { @@ -44,19 +64,13 @@ chef-page-header { li { display: flex; margin-bottom: 15px; - height: 50px; + height: 20px; span { font-size: 14px; line-height: 21px; letter-spacing: 0.2px; - &.heading { - display: inline-block; - font-weight: bold; - width: 50%; - } - &.webUIKeyStatus { text-transform: uppercase; } @@ -72,16 +86,16 @@ chef-page-header { } img { - margin: 2.5px 5.5px 0px 0px; + margin: 2.5px 1.5px -2px 0px; width: 14px; - height: 13.5px; + height: 12.5px; } } } .sync-button { float: right; - margin-bottom: 0; + margin-bottom: 62px; .img-inline { width: 17px; @@ -231,3 +245,64 @@ img { } } +.circular-chart { + display: inline-block; + width: 30px; + justify-content: space-around ; +} + +.circle-bg { + fill: none; + stroke: #eee; + stroke-width: 3.8; +} + +.circle { + fill: none; + stroke-width: 2.8; + stroke-linecap: round; + animation: progress 1s ease-out forwards; +} + +@keyframes progress { + 0% { + stroke-dasharray: 0 100; + } +} + +.circular-chart.blue .circle { + stroke: #3864F1; +} + +.svg-block { + display: flex; + height: 30px; + align-items: center; + gap: 10px; +} + +.status-icon-completed { + position: absolute; + margin-top: 0px; +} + +.status-icon-failed { + position: absolute; + margin-top: 0px; +} + +.preview-link { + cursor: pointer; +} + +.tooltip { + --tooltip-color: #F9DBEA; + left: 1395.05px; + top: 280.766px; + font-size: 10px; + color: #ba1e6a; +} + +.chef-server-info-text { + margin-left: 14px; +} diff --git a/components/automate-ui/src/app/modules/infra-proxy/chef-server-details/chef-server-details.component.ts b/components/automate-ui/src/app/modules/infra-proxy/chef-server-details/chef-server-details.component.ts index 3f02179bf48..4c16a437161 100644 --- a/components/automate-ui/src/app/modules/infra-proxy/chef-server-details/chef-server-details.component.ts +++ b/components/automate-ui/src/app/modules/infra-proxy/chef-server-details/chef-server-details.component.ts @@ -3,7 +3,7 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { MatOptionSelectionChange } from '@angular/material/core/option'; import { Router } from '@angular/router'; import { Store } from '@ngrx/store'; -import { Subject, combineLatest } from 'rxjs'; +import { Subject, combineLatest, interval } from 'rxjs'; import { filter, pluck, takeUntil } from 'rxjs/operators'; import { identity, isNil } from 'lodash/fp'; import { HttpStatus } from 'app/types/types'; @@ -20,11 +20,14 @@ import { getUsersStatus, updateWebUIKey, validateWebUIKeyStatus, - getValidateWebUIKeyStatus + getValidateWebUIKeyStatus, + migrationStatus, + getMigrationStatus } from 'app/entities/servers/server.selectors'; -import { Server, WebUIKey } from 'app/entities/servers/server.model'; +import { MigrationStatus, Server, WebUIKey } from 'app/entities/servers/server.model'; import { + GetMigrationStatus, GetServer, UpdateServer, UpdateWebUIKey, @@ -91,6 +94,32 @@ export class ChefServerDetailsComponent implements OnInit, OnDestroy { public uploadZipForm: FormGroup; public isUploaded = false; public migrationID: string; + public migrationStatus: MigrationStatus; + public migrationStatusPercentage: number; + public stepsCompleted: string; + public totalMigrationSteps = 13; + public migrationStepValue: number; + public migrationfailed = false; + public migrationCompleted = false; + public migrationInProgress = false; + public migrationLoading = true; + public migrationStarted = false; + public migrationIsInPreview = false; + public migrationSteps: Record = { + 1: 'Migration started', + 2: 'Upload of zip file', + 3: 'Unzip of zip file', + 4: 'Parsing of orgs file', + 5: 'Parsing of users file', + 6: 'Parsing of user association file', + 7: 'Parsing of user permissions file', + 8: 'Creating Preview', + 9: 'Migration of organization', + 10: 'Migration of users', + 11: 'Association of users to orgs', + 12: 'Migrating user permissions', + 13: 'Migration Completed' + }; @ViewChild('upload', { static: false }) upload: SyncOrgUsersSliderComponent; @@ -199,6 +228,11 @@ export class ChefServerDetailsComponent implements OnInit, OnDestroy { this.orgsListLoading = false; this.closeCreateModal(); this.isServerLoaded = true; + this.migrationLoading = false; + if (this.server.migration_id !== '') { + this.migrationStarted = true; + this.getMigrationStatus(this.server.migration_id); + } }); combineLatest([ @@ -282,11 +316,17 @@ export class ChefServerDetailsComponent implements OnInit, OnDestroy { } }); - setTimeout(() => { + setTimeout(() => { if (this.isServerLoaded) { this.validateWebUIKey(this.server); } }, 1000); + + interval(50000).subscribe(() => { + if (this.migrationStarted) { + this.getMigrationStatus(this.server.migration_id); + } + }); } ngOnDestroy(): void { @@ -363,6 +403,52 @@ export class ChefServerDetailsComponent implements OnInit, OnDestroy { }); } + // get migration status + private getMigrationStatus(migration_id: string): void { + this.store.dispatch(new GetMigrationStatus(migration_id)); + combineLatest([ + this.store.select(migrationStatus), + this.store.select(getMigrationStatus) + ]).pipe(takeUntil(this.isDestroyed)) + .subscribe(([migrationSt, getMigrationState]) => { + if (migrationSt === EntityStatus.loadingSuccess && !isNil(getMigrationState)) { + this.migrationStatus = getMigrationState; + const migration_type = this.migrationStatus.migration_type; + const migration_status = this.migrationStatus.migration_status; + if (migration_status === 'Completed' ) { + this.migrationStepValue = this.getKeyByValue(this.migrationSteps, migration_type); + this.migrationStatusPercentage = + Number((this.migrationStepValue / this.totalMigrationSteps) * 100); + this.migrationInProgress = true; + this.migrationLoading = false; + if (this.migrationStatusPercentage.toFixed(0) === '100') { + this.migrationCompleted = true; + this.migrationInProgress = false; + } + this.stepsCompleted = this.migrationStepValue.toFixed(0) + '/' + '13'; + if (migration_type === 'Creating Preview') { + this.migrationIsInPreview = true; + } + } else { + this.migrationfailed = true; + } + } + }); + } + + public getKeyByValue(object: Record, value: string) { + return Number(Object.keys(object).find(key => + object[key] === value)); + } + + public currentMigrationProcess() { + return `${this.migrationStatusPercentage.toFixed(0)}, 100`; + } + + public currentMigrationPercent() { + return this.migrationStatusPercentage.toFixed(0); + } + saveServer(): void { this.saveSuccessful = false; this.saveInProgress = true; @@ -400,5 +486,7 @@ export class ChefServerDetailsComponent implements OnInit, OnDestroy { formData: formData }; this.store.dispatch(new UploadZip( uploadZipPayload )); + this.migrationStarted = true; + this.getMigrationStatus(this.server.migration_id); } } diff --git a/components/automate-ui/src/assets/img/completed.png b/components/automate-ui/src/assets/img/completed.png new file mode 100644 index 0000000000000000000000000000000000000000..8b2528ac5c999922e1877eda7c5a1ea1cd0c447f GIT binary patch literal 14992 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 lsfNo}N&NN$PF?-|#c&5D|G-k!$t>x$*RQp=O