]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Add error handling on the frontend 21820/head
authorTiago Melo <tmelo@suse.com>
Fri, 4 May 2018 14:16:51 +0000 (15:16 +0100)
committerTiago Melo <tmelo@suse.com>
Wed, 9 May 2018 09:15:17 +0000 (10:15 +0100)
Now all error notifications are processed on the api-interceptor-service,
removing the need to handle them on every api request.

Signed-off-by: Tiago Melo <tmelo@suse.com>
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-form/rbd-form.component.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-list/rbd-list.component.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-snapshot-form/rbd-snapshot-form.component.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-snapshot-list/rbd-snapshot-list.component.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/enum/components.enum.ts [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/app/shared/models/task-exception.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/api-interceptor.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-manager-message.service.ts

index 5228063ddc304d28f53652af0550bc60949bed39..74919ee9f08f1f8e5794868bf06512f876a49ba7 100644 (file)
@@ -462,9 +462,6 @@ export class RbdFormComponent implements OnInit {
       this.router.navigate(['/block/rbd']);
     }, (resp) => {
       this.rbdForm.setErrors({'cdSubmitButton': true});
-      finishedTask.success = false;
-      finishedTask.exception = resp.error;
-      this.notificationService.notifyTask(finishedTask);
     });
   }
 
@@ -521,9 +518,6 @@ export class RbdFormComponent implements OnInit {
         this.router.navigate(['/block/rbd']);
       }).catch((resp) => {
         this.rbdForm.setErrors({'cdSubmitButton': true});
-        finishedTask.success = false;
-        finishedTask.exception = resp.error;
-        this.notificationService.notifyTask(finishedTask);
       });
   }
 
@@ -556,9 +550,6 @@ export class RbdFormComponent implements OnInit {
         this.router.navigate(['/block/rbd']);
       }, (resp) => {
         this.rbdForm.setErrors({'cdSubmitButton': true});
-        finishedTask.success = false;
-        finishedTask.exception = resp.error;
-        this.notificationService.notifyTask(finishedTask);
       });
   }
 
@@ -608,9 +599,6 @@ export class RbdFormComponent implements OnInit {
         this.router.navigate(['/block/rbd']);
       }).catch((resp) => {
         this.rbdForm.setErrors({'cdSubmitButton': true});
-        finishedTask.success = false;
-        finishedTask.exception = resp.error;
-        this.notificationService.notifyTask(finishedTask);
       });
   }
 
index 41a0c03e59f7b9c91a7ad2da79dfc45d68c8f3a5..fb8a6e4f59eaf90209bf0b821d2d233b982acefd 100644 (file)
@@ -258,9 +258,6 @@ export class RbdListComponent implements OnInit, OnDestroy {
         this.loadImages(null);
       }).catch((resp) => {
         this.modalRef.content.stopLoadingSpinner();
-        finishedTask.success = false;
-        finishedTask.exception = resp.error;
-        this.notificationService.notifyTask(finishedTask);
       });
   }
 
@@ -300,10 +297,6 @@ export class RbdListComponent implements OnInit, OnDestroy {
         }
         this.modalRef.hide();
         this.loadImages(null);
-      }).catch((resp) => {
-        finishedTask.success = false;
-        finishedTask.exception = resp.error;
-        this.notificationService.notifyTask(finishedTask);
       });
   }
 
index 42d19b320fa4cac44b0887c4f14187f1f3df9a77..e18e5bca110c363420e185bec8fc695f1eb65b63 100644 (file)
@@ -74,9 +74,6 @@ export class RbdSnapshotFormComponent implements OnInit {
         this.onSubmit.next(this.snapName);
       }).catch((resp) => {
         this.snapshotForm.setErrors({'cdSubmitButton': true});
-        finishedTask.success = false;
-        finishedTask.exception = resp.error;
-        this.notificationService.notifyTask(finishedTask);
       });
   }
 
@@ -99,9 +96,6 @@ export class RbdSnapshotFormComponent implements OnInit {
         this.onSubmit.next(snapshotName);
       }).catch((resp) => {
         this.snapshotForm.setErrors({'cdSubmitButton': true});
-        finishedTask.success = false;
-        finishedTask.exception = resp.error;
-        this.notificationService.notifyTask(finishedTask);
       });
   }
 
index 4b5abeb17a4852650177b29e65da476c21965b0c..23b6a1298989587075a310f4fdd05225507a23db 100644 (file)
@@ -178,10 +178,6 @@ export class RbdSnapshotListComponent implements OnInit, OnChanges {
           (asyncFinishedTask: FinishedTask) => {
             this.notificationService.notifyTask(asyncFinishedTask);
           });
-      }).catch((resp) => {
-        finishedTask.success = false;
-        finishedTask.exception = resp.error;
-        this.notificationService.notifyTask(finishedTask);
       });
   }
 
@@ -208,9 +204,6 @@ export class RbdSnapshotListComponent implements OnInit, OnChanges {
       })
       .catch((resp) => {
         this.modalRef.content.stopLoadingSpinner();
-        finishedTask.success = false;
-        finishedTask.exception = resp.error;
-        this.notificationService.notifyTask(finishedTask);
       });
   }
 
diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/enum/components.enum.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/enum/components.enum.ts
new file mode 100644 (file)
index 0000000..f5fc998
--- /dev/null
@@ -0,0 +1,6 @@
+export enum Components {
+  cephfs = 'CephFS',
+  rbd = 'RBD',
+  pool = 'Pool',
+  osd = 'OSD'
+}
index 088cbbc19301da61a58ab8610827986f872b7ddb..ba38e4aab0415d43ad4bc3187845e5c7fd151669 100644 (file)
@@ -1,6 +1,9 @@
+import { Task } from './task';
+
 export class TaskException {
   status: number;
-  errno: number;
+  code: number;
   component: string;
   detail: string;
+  task: Task;
 }
index e2a2cee2a6700cb2019f6f7779ba901e12ff3b1b..40fae89b00ae7382fbb0649e429a04b83000c7fe 100644 (file)
@@ -8,11 +8,13 @@ import {
 import { Injectable } from '@angular/core';
 import { Router } from '@angular/router';
 
+import * as _ from 'lodash';
 import 'rxjs/add/observable/throw';
 import 'rxjs/add/operator/catch';
 import { Observable } from 'rxjs/Observable';
 
 import { NotificationType } from '../enum/notification-type.enum';
+import { FinishedTask } from '../models/finished-task';
 import { AuthStorageService } from './auth-storage.service';
 import { NotificationService } from './notification.service';
 
@@ -28,6 +30,24 @@ export class ApiInterceptorService implements HttpInterceptor {
       if (resp instanceof HttpErrorResponse) {
         let showNotification = true;
         switch (resp.status) {
+          case 400:
+            const finishedTask = new FinishedTask();
+
+            const task = resp.error.task;
+            if (_.isPlainObject(task)) {
+              task.metadata.component = task.metadata.component || resp.error.component;
+
+              finishedTask.name = task.name;
+              finishedTask.metadata = task.metadata;
+            } else {
+              finishedTask.metadata = resp.error;
+            }
+
+            finishedTask.success = false;
+            finishedTask.exception = resp.error;
+            this.notificationService.notifyTask(finishedTask);
+            showNotification = false;
+            break;
           case 401:
             this.authStorageService.remove();
             this.router.navigate(['/login']);
@@ -35,9 +55,6 @@ export class ApiInterceptorService implements HttpInterceptor {
           case 404:
             this.router.navigate(['/404']);
             break;
-          case 409:
-            showNotification = false;
-            break;
         }
 
         let timeoutId;
index ab17f01d55965a8de8a5a089d3090ba7e1f41bbf..d563b995d23be0915e7090e3eafec56131f073de 100644 (file)
@@ -1,4 +1,6 @@
 import { Injectable } from '@angular/core';
+
+import { Components } from '../enum/components.enum';
 import { FinishedTask } from '../models/finished-task';
 import { Task } from '../models/task';
 
@@ -130,11 +132,13 @@ export class TaskManagerMessageService {
         return {
         };
       }
-    ),
+    )
   };
 
   defaultMessage = new TaskManagerMessage(
-    (metadata) => 'Unknown Task',
+    (metadata) => {
+      return Components[metadata.component] || metadata.component || 'Unknown Task';
+    },
     (metadata) => 'Task executed successfully',
     () => {
       return {
@@ -151,7 +155,7 @@ export class TaskManagerMessageService {
 
   getErrorMessage(finishedTask: FinishedTask) {
     const taskManagerMessage = this.messages[finishedTask.name] || this.defaultMessage;
-    return taskManagerMessage.error(finishedTask.metadata)[finishedTask.exception.errno] ||
+    return taskManagerMessage.error(finishedTask.metadata)[finishedTask.exception.code] ||
       finishedTask.exception.detail;
   }