import * as _ from 'lodash';
import { BsModalService } from 'ngx-bootstrap/modal';
import { TabsModule } from 'ngx-bootstrap/tabs';
+import { ToastrModule } from 'ngx-toastr';
import { EMPTY, of } from 'rxjs';
import {
import { OsdService } from '../../../../shared/api/osd.service';
import { ConfirmationModalComponent } from '../../../../shared/components/confirmation-modal/confirmation-modal.component';
import { CriticalConfirmationModalComponent } from '../../../../shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { FormModalComponent } from '../../../../shared/components/form-modal/form-modal.component';
import { TableActionsComponent } from '../../../../shared/datatable/table-actions/table-actions.component';
import { CdTableAction } from '../../../../shared/models/cd-table-action';
import { CdTableSelection } from '../../../../shared/models/cd-table-selection';
const setFakeSelection = () => {
// Default data and selection
- const selection = [{ id: 1 }];
- const data = [{ id: 1 }];
+ const selection = [{ id: 1, tree: { device_class: 'ssd' } }];
+ const data = [{ id: 1, tree: { device_class: 'ssd' } }];
// Table data and selection
component.selection = new CdTableSelection();
HttpClientTestingModule,
PerformanceCounterModule,
TabsModule.forRoot(),
+ ToastrModule.forRoot(),
CephModule,
ReactiveFormsModule,
RouterTestingModule,
const createOsd = (n: number) => ({
in: 'in',
up: 'up',
+ tree: {
+ device_class: 'ssd'
+ },
stats_history: {
op_out_bytes: [[n, n], [n * 2, n * 2]],
op_in_bytes: [[n * 3, n * 3], [n * 4, n * 4]]
'create,update,delete': {
actions: [
'Create',
+ 'Edit',
'Scrub',
'Deep Scrub',
'Reweight',
'Purge',
'Destroy'
],
- primary: { multiple: 'Scrub', executing: 'Scrub', single: 'Scrub', no: 'Create' }
+ primary: { multiple: 'Scrub', executing: 'Edit', single: 'Edit', no: 'Create' }
},
'create,update': {
- actions: ['Create', 'Scrub', 'Deep Scrub', 'Reweight', 'Mark Out', 'Mark In', 'Mark Down'],
- primary: { multiple: 'Scrub', executing: 'Scrub', single: 'Scrub', no: 'Create' }
+ actions: [
+ 'Create',
+ 'Edit',
+ 'Scrub',
+ 'Deep Scrub',
+ 'Reweight',
+ 'Mark Out',
+ 'Mark In',
+ 'Mark Down'
+ ],
+ primary: { multiple: 'Scrub', executing: 'Edit', single: 'Edit', no: 'Create' }
},
'create,delete': {
actions: ['Create', 'Mark Lost', 'Purge', 'Destroy'],
},
'update,delete': {
actions: [
+ 'Edit',
'Scrub',
'Deep Scrub',
'Reweight',
'Purge',
'Destroy'
],
- primary: { multiple: 'Scrub', executing: 'Scrub', single: 'Scrub', no: 'Scrub' }
+ primary: { multiple: 'Scrub', executing: 'Edit', single: 'Edit', no: 'Edit' }
},
update: {
- actions: ['Scrub', 'Deep Scrub', 'Reweight', 'Mark Out', 'Mark In', 'Mark Down'],
- primary: { multiple: 'Scrub', executing: 'Scrub', single: 'Scrub', no: 'Scrub' }
+ actions: ['Edit', 'Scrub', 'Deep Scrub', 'Reweight', 'Mark Out', 'Mark In', 'Mark Down'],
+ primary: { multiple: 'Scrub', executing: 'Edit', single: 'Edit', no: 'Edit' }
},
delete: {
actions: ['Mark Lost', 'Purge', 'Destroy'],
expectOpensModal('Reweight', OsdReweightModalComponent);
});
+ it('opens the form modal', () => {
+ expectOpensModal('Edit', FormModalComponent);
+ });
+
it('opens all confirmation modals', () => {
const modalClass = ConfirmationModalComponent;
expectOpensModal('Mark Out', modalClass);
import { OsdService } from '../../../../shared/api/osd.service';
import { ConfirmationModalComponent } from '../../../../shared/components/confirmation-modal/confirmation-modal.component';
import { CriticalConfirmationModalComponent } from '../../../../shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { FormModalComponent } from '../../../../shared/components/form-modal/form-modal.component';
import { ActionLabelsI18n } from '../../../../shared/constants/app.constants';
import { TableComponent } from '../../../../shared/datatable/table/table.component';
import { CellTemplate } from '../../../../shared/enum/cell-template.enum';
import { Icons } from '../../../../shared/enum/icons.enum';
+import { NotificationType } from '../../../../shared/enum/notification-type.enum';
import { CdTableAction } from '../../../../shared/models/cd-table-action';
import { CdTableColumn } from '../../../../shared/models/cd-table-column';
import { CdTableSelection } from '../../../../shared/models/cd-table-selection';
import { Permissions } from '../../../../shared/models/permissions';
import { DimlessBinaryPipe } from '../../../../shared/pipes/dimless-binary.pipe';
import { AuthStorageService } from '../../../../shared/services/auth-storage.service';
+import { NotificationService } from '../../../../shared/services/notification.service';
import { URLBuilderService } from '../../../../shared/services/url-builder.service';
import { OsdFlagsModalComponent } from '../osd-flags-modal/osd-flags-modal.component';
import { OsdPgScrubModalComponent } from '../osd-pg-scrub-modal/osd-pg-scrub-modal.component';
private modalService: BsModalService,
private i18n: I18n,
private urlBuilder: URLBuilderService,
- public actionLabels: ActionLabelsI18n
+ public actionLabels: ActionLabelsI18n,
+ public notificationService: NotificationService
) {
this.permissions = this.authStorageService.getPermissions();
this.tableActions = [
routerLink: () => this.urlBuilder.getCreate(),
canBePrimary: (selection: CdTableSelection) => !selection.hasSelection
},
+ {
+ name: this.actionLabels.EDIT,
+ permission: 'update',
+ icon: Icons.edit,
+ click: () => this.editAction()
+ },
{
name: this.actionLabels.SCRUB,
permission: 'update',
});
}
+ editAction() {
+ const selectedOsd = _.filter(this.osds, ['id', this.selection.first().id]).pop();
+
+ this.modalService.show(FormModalComponent, {
+ initialState: {
+ titleText: this.i18n('Edit OSD: {{id}}', {
+ id: selectedOsd.id
+ }),
+ fields: [
+ {
+ type: 'inputText',
+ name: 'deviceClass',
+ value: selectedOsd.tree.device_class,
+ label: this.i18n('Device class'),
+ required: true
+ }
+ ],
+ submitButtonText: this.i18n('Edit OSD'),
+ onSubmit: (values) => {
+ this.osdService.update(selectedOsd.id, values.deviceClass).subscribe(() => {
+ this.notificationService.show(
+ NotificationType.success,
+ this.i18n('Updated OSD "{{id}}"', {
+ id: selectedOsd.id
+ })
+ );
+ this.getOsdList();
+ });
+ }
+ }
+ });
+ }
+
scrubAction(deep) {
if (!this.hasOsdSelected) {
return;