]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: cephfs remove subvolume group 53017/head
authorPedro Gonzalez Gomez <pegonzal@redhat.com>
Wed, 16 Aug 2023 05:52:05 +0000 (07:52 +0200)
committerPedro Gonzalez Gomez <pegonzal@redhat.com>
Wed, 16 Aug 2023 10:45:26 +0000 (12:45 +0200)
Fixes: https://tracker.ceph.com/issues/62452
Signed-off-by: Pedro Gonzalez Gomez <pegonzal@redhat.com>
src/pybind/mgr/dashboard/controllers/cephfs.py
src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-subvolume-group/cephfs-subvolume-group.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-subvolume-group/cephfs-subvolume-group.component.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-subvolume-list/cephfs-subvolume-list.component.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/cephfs-subvolume-group.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-message.service.ts
src/pybind/mgr/dashboard/openapi.yaml

index 6995b18244ebfd7cd053c1a25cc63a9bea2e2cf4..1b8296445fafe1bb87e22a023f7fd7ac8835b769 100644 (file)
@@ -700,3 +700,13 @@ class CephFSSubvolumeGroups(RESTController):
                 f'Failed to update subvolume group {group_name}: {err}'
             )
         return f'Subvolume group {group_name} updated successfully'
+
+    def delete(self, vol_name: str, group_name: str):
+        error_code, _, err = mgr.remote(
+            'volumes', '_cmd_fs_subvolumegroup_rm', None, {
+                'vol_name': vol_name, 'group_name': group_name})
+        if error_code != 0:
+            raise DashboardException(
+                f'Failed to delete subvolume group {group_name}: {err}'
+            )
+        return f'Subvolume group {group_name} removed successfully'
index b36bd2cb0900088f81867a5831bcfb95d37dbb67..b9a3856ef8af3d252149150e1e94b4203108261a 100644 (file)
@@ -2,6 +2,9 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
 
 import { CephfsSubvolumeGroupComponent } from './cephfs-subvolume-group.component';
 import { HttpClientTestingModule } from '@angular/common/http/testing';
+import { ToastrModule } from 'ngx-toastr';
+import { RouterTestingModule } from '@angular/router/testing';
+import { SharedModule } from '~/app/shared/shared.module';
 
 describe('CephfsSubvolumeGroupComponent', () => {
   let component: CephfsSubvolumeGroupComponent;
@@ -10,7 +13,7 @@ describe('CephfsSubvolumeGroupComponent', () => {
   beforeEach(async () => {
     await TestBed.configureTestingModule({
       declarations: [CephfsSubvolumeGroupComponent],
-      imports: [HttpClientTestingModule]
+      imports: [HttpClientTestingModule, SharedModule, ToastrModule.forRoot(), RouterTestingModule]
     }).compileComponents();
   });
 
index b7ca08fb9471d2d1e3e22143c8978fe096cdce1c..54de10d77ba138b978c5e8b285a204b79d9bf6ff 100644 (file)
@@ -15,6 +15,9 @@ import { ActionLabelsI18n } from '~/app/shared/constants/app.constants';
 import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
 import { ModalService } from '~/app/shared/services/modal.service';
 import { Permissions } from '~/app/shared/models/permissions';
+import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { FinishedTask } from '~/app/shared/models/finished-task';
+import { TaskWrapperService } from '~/app/shared/services/task-wrapper.service';
 
 @Component({
   selector: 'cd-cephfs-subvolume-group',
@@ -55,7 +58,8 @@ export class CephfsSubvolumeGroupComponent implements OnInit {
     private cephfsSubvolumeGroup: CephfsSubvolumeGroupService,
     private actionLabels: ActionLabelsI18n,
     private modalService: ModalService,
-    private authStorageService: AuthStorageService
+    private authStorageService: AuthStorageService,
+    private taskWrapper: TaskWrapperService
   ) {
     this.permissions = this.authStorageService.getPermissions();
   }
@@ -111,6 +115,12 @@ export class CephfsSubvolumeGroupComponent implements OnInit {
         permission: 'update',
         icon: Icons.edit,
         click: () => this.openModal(true)
+      },
+      {
+        name: this.actionLabels.REMOVE,
+        permission: 'delete',
+        icon: Icons.destroy,
+        click: () => this.removeSubVolumeModal()
       }
     ];
 
@@ -151,4 +161,18 @@ export class CephfsSubvolumeGroupComponent implements OnInit {
       { size: 'lg' }
     );
   }
+
+  removeSubVolumeModal() {
+    const name = this.selection.first().name;
+    this.modalService.show(CriticalConfirmationModalComponent, {
+      itemDescription: 'subvolume group',
+      itemNames: [name],
+      actionDescription: 'remove',
+      submitActionObservable: () =>
+        this.taskWrapper.wrapTaskAroundCall({
+          task: new FinishedTask('cephfs/subvolume/group/remove', { subvolumegroupName: name }),
+          call: this.cephfsSubvolumeGroup.remove(this.fsName, name)
+        })
+    });
+  }
 }
index 25b5ef14a58cc94467bad000cff1759ef376d25f..c9ff01e2ddd9a9b9a58263487838f91cfb4096de 100644 (file)
@@ -121,6 +121,12 @@ export class CephfsSubvolumeListComponent implements OnInit, OnChanges {
             { size: 'lg' }
           )
       },
+      {
+        name: this.actionLabels.EDIT,
+        permission: 'update',
+        icon: Icons.edit,
+        click: () => this.openModal(true)
+      },
       {
         name: this.actionLabels.REMOVE,
         permission: 'delete',
index 642f4609f3d00944b8131f98ef984d454650bcb7..db7fcfacd597e0ea49041b6d725747043d553be0 100644 (file)
@@ -67,4 +67,13 @@ export class CephfsSubvolumeGroupService {
       size: size
     });
   }
+
+  remove(volName: string, groupName: string) {
+    return this.http.delete(`${this.baseURL}/${volName}`, {
+      params: {
+        group_name: groupName
+      },
+      observe: 'response'
+    });
+  }
 }
index eb4ae7651f7257b9d39698bdc82e2a585f9b6085..023a1529fa746e4f147cb985d0893fa866217ba9 100644 (file)
@@ -373,6 +373,9 @@ export class TaskMessageService {
     ),
     'cephfs/subvolume/group/edit': this.newTaskMessage(this.commonOperations.update, (metadata) =>
       this.subvolumegroup(metadata)
+    ),
+    'cephfs/subvolume/group/remove': this.newTaskMessage(this.commonOperations.remove, (metadata) =>
+      this.subvolumegroup(metadata)
     )
   };
 
index aa797ae703ca8965d79c2a474b5f5f1bece48c80..d4d416d882c85a089a5b31c84c7f1d521d6b0b0c 100644 (file)
@@ -1739,6 +1739,42 @@ paths:
       tags:
       - CephfsSubvolumeGroup
   /api/cephfs/subvolume/group/{vol_name}:
+    delete:
+      parameters:
+      - in: path
+        name: vol_name
+        required: true
+        schema:
+          type: string
+      - in: query
+        name: group_name
+        required: true
+        schema:
+          type: string
+      responses:
+        '202':
+          content:
+            application/vnd.ceph.api.v1.0+json:
+              type: object
+          description: Operation is still executing. Please check the task queue.
+        '204':
+          content:
+            application/vnd.ceph.api.v1.0+json:
+              type: object
+          description: Resource deleted.
+        '400':
+          description: Operation exception. Please check the response body for details.
+        '401':
+          description: Unauthenticated access. Please login first.
+        '403':
+          description: Unauthorized access. Please check your permissions.
+        '500':
+          description: Unexpected error. Please check the response body for the stack
+            trace.
+      security:
+      - jwt: []
+      tags:
+      - CephfsSubvolumeGroup
     get:
       parameters:
       - in: path