From 295e14530e4e1f3c1ae86032962d048ff3259597 Mon Sep 17 00:00:00 2001 From: Caio Carvalho Date: Tue, 26 Jun 2018 00:38:52 -0300 Subject: [PATCH] [partition] Adding resizing, deactivating and removing procedures for LVM VGs. --- src/modules/partition/CMakeLists.txt | 4 + .../partition/core/PartitionCoreModule.cpp | 116 ++++++++++++++++-- .../partition/core/PartitionCoreModule.h | 11 ++ .../partition/gui/CreateVolumeGroupDialog.cpp | 9 +- .../partition/gui/CreateVolumeGroupDialog.h | 4 +- src/modules/partition/gui/PartitionPage.cpp | 80 +++++++++++- src/modules/partition/gui/PartitionPage.h | 3 + src/modules/partition/gui/PartitionPage.ui | 54 ++++++-- .../partition/gui/ResizeVolumeGroupDialog.cpp | 62 ++++++++++ .../partition/gui/ResizeVolumeGroupDialog.h | 40 ++++++ .../partition/gui/VolumeGroupBaseDialog.cpp | 24 ++-- .../partition/gui/VolumeGroupBaseDialog.h | 8 +- .../jobs/DeactivateVolumeGroupJob.cpp | 69 +++++++++++ .../partition/jobs/DeactivateVolumeGroupJob.h | 40 ++++++ .../partition/jobs/RemoveVolumeGroupJob.cpp | 66 ++++++++++ .../partition/jobs/RemoveVolumeGroupJob.h | 40 ++++++ .../partition/jobs/ResizeVolumeGroupJob.cpp | 101 +++++++++++++++ .../partition/jobs/ResizeVolumeGroupJob.h | 48 ++++++++ 18 files changed, 738 insertions(+), 41 deletions(-) create mode 100644 src/modules/partition/gui/ResizeVolumeGroupDialog.cpp create mode 100644 src/modules/partition/gui/ResizeVolumeGroupDialog.h create mode 100644 src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp create mode 100644 src/modules/partition/jobs/DeactivateVolumeGroupJob.h create mode 100644 src/modules/partition/jobs/RemoveVolumeGroupJob.cpp create mode 100644 src/modules/partition/jobs/RemoveVolumeGroupJob.h create mode 100644 src/modules/partition/jobs/ResizeVolumeGroupJob.cpp create mode 100644 src/modules/partition/jobs/ResizeVolumeGroupJob.h diff --git a/src/modules/partition/CMakeLists.txt b/src/modules/partition/CMakeLists.txt index 874440177..bfc967f3d 100644 --- a/src/modules/partition/CMakeLists.txt +++ b/src/modules/partition/CMakeLists.txt @@ -51,6 +51,7 @@ if ( KPMcore_FOUND ) gui/PartitionSplitterWidget.cpp gui/PartitionViewStep.cpp gui/PrettyRadioButton.cpp + gui/ResizeVolumeGroupDialog.cpp gui/ScanningDialog.cpp gui/ReplaceWidget.cpp gui/VolumeGroupBaseDialog.cpp @@ -59,11 +60,14 @@ if ( KPMcore_FOUND ) jobs/CreatePartitionJob.cpp jobs/CreatePartitionTableJob.cpp jobs/CreateVolumeGroupJob.cpp + jobs/DeactivateVolumeGroupJob.cpp jobs/DeletePartitionJob.cpp jobs/FillGlobalStorageJob.cpp jobs/FormatPartitionJob.cpp jobs/PartitionJob.cpp + jobs/RemoveVolumeGroupJob.cpp jobs/ResizePartitionJob.cpp + jobs/ResizeVolumeGroupJob.cpp jobs/SetPartitionFlagsJob.cpp UI gui/ChoicePage.ui diff --git a/src/modules/partition/core/PartitionCoreModule.cpp b/src/modules/partition/core/PartitionCoreModule.cpp index 9646d31cd..e82c7c64d 100644 --- a/src/modules/partition/core/PartitionCoreModule.cpp +++ b/src/modules/partition/core/PartitionCoreModule.cpp @@ -34,10 +34,13 @@ #include "jobs/CreatePartitionJob.h" #include "jobs/CreatePartitionTableJob.h" #include "jobs/CreateVolumeGroupJob.h" +#include "jobs/DeactivateVolumeGroupJob.h" #include "jobs/DeletePartitionJob.h" #include "jobs/FillGlobalStorageJob.h" #include "jobs/FormatPartitionJob.h" +#include "jobs/RemoveVolumeGroupJob.h" #include "jobs/ResizePartitionJob.h" +#include "jobs/ResizeVolumeGroupJob.h" #include "jobs/SetPartitionFlagsJob.h" #include "Typedefs.h" @@ -65,6 +68,7 @@ PartitionCoreModule::DeviceInfo::DeviceInfo( Device* _device ) : device( _device ) , partitionModel( new PartitionModel ) , immutableDevice( new Device( *_device ) ) + , isAvailable( true ) {} PartitionCoreModule::DeviceInfo::~DeviceInfo() @@ -298,6 +302,48 @@ PartitionCoreModule::createVolumeGroup( QString &vgName, refresh(); } +void +PartitionCoreModule::resizeVolumeGroup( LvmDevice *device, QVector< const Partition* >& pvList ) +{ + DeviceInfo* deviceInfo = infoForDevice( device ); + Q_ASSERT( deviceInfo ); + + ResizeVolumeGroupJob* job = new ResizeVolumeGroupJob( device, pvList ); + + deviceInfo->jobs << Calamares::job_ptr( job ); + + refresh(); +} + +void +PartitionCoreModule::deactivateVolumeGroup( LvmDevice *device ) +{ + DeviceInfo* deviceInfo = infoForDevice( device ); + Q_ASSERT( deviceInfo ); + + deviceInfo->isAvailable = false; + + DeactivateVolumeGroupJob* job = new DeactivateVolumeGroupJob( device ); + + // DeactivateVolumeGroupJob needs to be immediately called + job->exec(); + + refresh(); +} + +void +PartitionCoreModule::removeVolumeGroup( LvmDevice *device ) +{ + DeviceInfo* deviceInfo = infoForDevice( device ); + Q_ASSERT( deviceInfo ); + + RemoveVolumeGroupJob* job = new RemoveVolumeGroupJob( device ); + + deviceInfo->jobs << Calamares::job_ptr( job ); + + refresh(); +} + void PartitionCoreModule::deletePartition( Device* device, Partition* partition ) { @@ -596,16 +642,40 @@ PartitionCoreModule::scanForLVMPVs() { m_lvmPVs.clear(); - QList< Device* > devices; + QList< Device* > physicalDevices; + QList< LvmDevice* > vgDevices; for ( DeviceInfo* deviceInfo : m_deviceInfos ) - devices << deviceInfo->device.data(); + { + if ( deviceInfo->device.data()->type() == Device::Type::Disk_Device) + physicalDevices << deviceInfo->device.data(); + else if ( deviceInfo->device.data()->type() == Device::Type::LVM_Device ) + { + LvmDevice* device = dynamic_cast(deviceInfo->device.data()); - LvmDevice::scanSystemLVM( devices ); + // Restoring physical volume list + device->physicalVolumes().clear(); + + vgDevices << device; + } + } + + // Update LVM::pvList + LvmDevice::scanSystemLVM( physicalDevices ); for ( auto p : LVM::pvList ) + { m_lvmPVs << p.partition().data(); + for ( LvmDevice* device : vgDevices ) + if ( p.vgName() == device->name() ) + { + // Adding scanned VG to PV list + device->physicalVolumes() << p.partition(); + break; + } + } + for ( DeviceInfo* d : m_deviceInfos ) { for ( auto job : d->jobs ) @@ -693,21 +763,26 @@ PartitionCoreModule::revertAllDevices() for ( auto it = m_deviceInfos.begin(); it != m_deviceInfos.end(); ) { // In new VGs device info, there will be always a CreateVolumeGroupJob as the first job in jobs list - if ( dynamic_cast( ( *it )->device.data() ) && !( *it )->jobs.empty() ) + if ( dynamic_cast( ( *it )->device.data() ) ) { - CreateVolumeGroupJob* vgJob = dynamic_cast( ( *it )->jobs[0].data() ); + ( *it )->isAvailable = true; - if ( vgJob ) + if ( !( *it )->jobs.empty() ) { - vgJob->undoPreview(); + CreateVolumeGroupJob* vgJob = dynamic_cast( ( *it )->jobs[0].data() ); - ( *it )->forgetChanges(); + if ( vgJob ) + { + vgJob->undoPreview(); - m_deviceModel->removeDevice( ( *it )->device.data() ); + ( *it )->forgetChanges(); - it = m_deviceInfos.erase( it ); + m_deviceModel->removeDevice( ( *it )->device.data() ); - continue; + it = m_deviceInfos.erase( it ); + + continue; + } } } @@ -736,8 +811,13 @@ PartitionCoreModule::revertDevice( Device* dev ) m_deviceModel->swapDevice( dev, newDev ); QList< Device* > devices; - foreach ( auto info, m_deviceInfos ) - devices.append( info->device.data() ); + for ( auto info : m_deviceInfos ) + { + if ( info->device.data()->type() != Device::Type::Disk_Device ) + continue; + else + devices.append( info->device.data() ); + } m_bootLoaderModel->init( devices ); @@ -777,6 +857,16 @@ PartitionCoreModule::isDirty() return m_isDirty; } +bool +PartitionCoreModule::isVGdeactivated( LvmDevice *device ) +{ + for ( DeviceInfo* deviceInfo : m_deviceInfos ) + if ( device == deviceInfo->device.data() && !deviceInfo->isAvailable ) + return true; + + return false; +} + QList< PartitionCoreModule::SummaryInfo > PartitionCoreModule::createSummaryInfo() const { diff --git a/src/modules/partition/core/PartitionCoreModule.h b/src/modules/partition/core/PartitionCoreModule.h index cedda391d..d61311c8a 100644 --- a/src/modules/partition/core/PartitionCoreModule.h +++ b/src/modules/partition/core/PartitionCoreModule.h @@ -114,6 +114,12 @@ public: void createVolumeGroup( QString &vgName, QVector< const Partition* > pvList, qint32 peSize ); + void resizeVolumeGroup( LvmDevice* device, QVector< const Partition* >& pvList ); + + void deactivateVolumeGroup( LvmDevice* device ); + + void removeVolumeGroup( LvmDevice* device ); + void deletePartition( Device* device, Partition* partition ); void formatPartition( Device* device, Partition* partition ); @@ -160,6 +166,8 @@ public: bool isDirty(); // true if there are pending changes, otherwise false + bool isVGdeactivated( LvmDevice* device ); + /** * To be called when a partition has been altered, but only for changes * which do not affect its size, because changes which affect the partition size @@ -198,6 +206,9 @@ private: const QScopedPointer< Device > immutableDevice; QList< Calamares::job_ptr > jobs; + // To check if LVM VGs are deactivated + bool isAvailable; + void forgetChanges(); bool isDirty() const; }; diff --git a/src/modules/partition/gui/CreateVolumeGroupDialog.cpp b/src/modules/partition/gui/CreateVolumeGroupDialog.cpp index f1ed32551..fe5c40be8 100644 --- a/src/modules/partition/gui/CreateVolumeGroupDialog.cpp +++ b/src/modules/partition/gui/CreateVolumeGroupDialog.cpp @@ -28,13 +28,16 @@ CreateVolumeGroupDialog::CreateVolumeGroupDialog( QString& vgName, QVector< const Partition* >& selectedPVs, QVector< const Partition* > pvList, - qint32& peSize, + qint64& pSize, QWidget* parent ) - : VolumeGroupBaseDialog( vgName, pvList, peSize, parent ) + : VolumeGroupBaseDialog( vgName, pvList, parent ) , m_selectedPVs( selectedPVs ) + , m_peSize( pSize ) { setWindowTitle( "Create Volume Group" ); + peSize()->setValue( pSize ); + vgType()->setEnabled( false ); } @@ -46,7 +49,7 @@ CreateVolumeGroupDialog::accept() m_selectedPVs << checkedItems(); - qint32& pe = peSizeValue(); + qint64& pe = m_peSize; pe = peSize()->value(); QDialog::accept(); diff --git a/src/modules/partition/gui/CreateVolumeGroupDialog.h b/src/modules/partition/gui/CreateVolumeGroupDialog.h index eb2ced137..b0d5b874c 100644 --- a/src/modules/partition/gui/CreateVolumeGroupDialog.h +++ b/src/modules/partition/gui/CreateVolumeGroupDialog.h @@ -27,13 +27,15 @@ public: CreateVolumeGroupDialog( QString& vgName, QVector< const Partition* >& selectedPVs, QVector< const Partition* > pvList, - qint32& peSize, + qint64& pSize, QWidget* parent ); void accept() override; private: QVector< const Partition* >& m_selectedPVs; + + qint64& m_peSize; }; #endif // CREATEVOLUMEGROUPDIALOG_H diff --git a/src/modules/partition/gui/PartitionPage.cpp b/src/modules/partition/gui/PartitionPage.cpp index 550e356c0..ada6cc15b 100644 --- a/src/modules/partition/gui/PartitionPage.cpp +++ b/src/modules/partition/gui/PartitionPage.cpp @@ -30,6 +30,7 @@ #include "gui/CreatePartitionDialog.h" #include "gui/CreateVolumeGroupDialog.h" #include "gui/EditExistingPartitionDialog.h" +#include "gui/ResizeVolumeGroupDialog.h" #include "gui/ScanningDialog.h" #include "ui_PartitionPage.h" @@ -43,6 +44,8 @@ // KPMcore #include #include +#include +#include // Qt #include @@ -101,6 +104,9 @@ PartitionPage::PartitionPage( PartitionCoreModule* core, QWidget* parent ) connect( m_ui->partitionTreeView, &QAbstractItemView::doubleClicked, this, &PartitionPage::onPartitionViewActivated ); connect( m_ui->revertButton, &QAbstractButton::clicked, this, &PartitionPage::onRevertClicked ); connect( m_ui->newVolumeGroupButton, &QAbstractButton::clicked, this, &PartitionPage::onNewVolumeGroupClicked ); + connect( m_ui->resizeVolumeGroupButton, &QAbstractButton::clicked, this, &PartitionPage::onResizeVolumeGroupClicked ); + connect( m_ui->deactivateVolumeGroupButton, &QAbstractButton::clicked, this, &PartitionPage::onDeactivateVolumeGroupClicked ); + connect( m_ui->removeVolumeGroupButton, &QAbstractButton::clicked, this, &PartitionPage::onRemoveVolumeGroupClicked ); connect( m_ui->newPartitionTableButton, &QAbstractButton::clicked, this, &PartitionPage::onNewPartitionTableClicked ); connect( m_ui->createButton, &QAbstractButton::clicked, this, &PartitionPage::onCreateClicked ); connect( m_ui->editButton, &QAbstractButton::clicked, this, &PartitionPage::onEditClicked ); @@ -121,7 +127,8 @@ PartitionPage::~PartitionPage() void PartitionPage::updateButtons() { - bool create = false, createTable = false, edit = false, del = false; + bool create = false, createTable = false, edit = false, del = false, currentDeviceIsVG = false, isDeactivable = false; + bool isRemovable = false, isVGdeactivated = false; QModelIndex index = m_ui->partitionTreeView->currentIndex(); if ( index.isValid() ) @@ -152,12 +159,28 @@ PartitionPage::updateButtons() QModelIndex deviceIndex = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 ); if ( m_core->deviceModel()->deviceForIndex( deviceIndex )->type() != Device::Type::LVM_Device ) createTable = true; + else + { + currentDeviceIsVG = true; + + LvmDevice* lvmDevice = dynamic_cast(m_core->deviceModel()->deviceForIndex( deviceIndex )); + + isDeactivable = DeactivateVolumeGroupOperation::isDeactivatable( lvmDevice ); + isRemovable = RemoveVolumeGroupOperation::isRemovable( lvmDevice ); + + isVGdeactivated = m_core->isVGdeactivated( lvmDevice ); + + m_ui->revertButton->setEnabled( isVGdeactivated ); + } } m_ui->createButton->setEnabled( create ); m_ui->editButton->setEnabled( edit ); m_ui->deleteButton->setEnabled( del ); m_ui->newPartitionTableButton->setEnabled( createTable ); + m_ui->resizeVolumeGroupButton->setEnabled( currentDeviceIsVG && !isVGdeactivated ); + m_ui->deactivateVolumeGroupButton->setEnabled( currentDeviceIsVG && isDeactivable && !isVGdeactivated ); + m_ui->removeVolumeGroupButton->setEnabled( currentDeviceIsVG && isRemovable ); } void @@ -188,7 +211,7 @@ PartitionPage::onNewVolumeGroupClicked() { QString vgName; QVector< const Partition* > selectedPVs; - qint32 peSize = 4; + qint64 peSize = 4; QVector< const Partition* > availablePVs; @@ -238,6 +261,59 @@ PartitionPage::onNewVolumeGroupClicked() delete dlg; } +void +PartitionPage::onResizeVolumeGroupClicked() +{ + QModelIndex deviceIndex = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 ); + LvmDevice* device = dynamic_cast< LvmDevice* >( m_core->deviceModel()->deviceForIndex( deviceIndex ) ); + + Q_ASSERT( device && device->type() == Device::Type::LVM_Device ); + + QVector< const Partition* > availablePVs; + QVector< const Partition* > selectedPVs; + + for ( const Partition* p : m_core->lvmPVs() ) + if ( !m_core->isInVG( p ) ) + availablePVs << p; + + QPointer< ResizeVolumeGroupDialog > dlg = new ResizeVolumeGroupDialog( device, + availablePVs, + selectedPVs, + this ); + + if ( dlg->exec() == QDialog::Accepted ) + m_core->resizeVolumeGroup( device, selectedPVs ); + + delete dlg; +} + +void +PartitionPage::onDeactivateVolumeGroupClicked() +{ + QModelIndex deviceIndex = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 ); + LvmDevice* device = dynamic_cast< LvmDevice* >( m_core->deviceModel()->deviceForIndex( deviceIndex ) ); + + Q_ASSERT( device && device->type() == Device::Type::LVM_Device ); + + m_core->deactivateVolumeGroup( device ); + + updateFromCurrentDevice(); + + PartitionModel* model = m_core->partitionModelForDevice( device ); + model->update(); +} + +void +PartitionPage::onRemoveVolumeGroupClicked() +{ + QModelIndex deviceIndex = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 ); + LvmDevice* device = dynamic_cast< LvmDevice* >( m_core->deviceModel()->deviceForIndex( deviceIndex ) ); + + Q_ASSERT( device && device->type() == Device::Type::LVM_Device ); + + m_core->removeVolumeGroup( device ); +} + void PartitionPage::onCreateClicked() { diff --git a/src/modules/partition/gui/PartitionPage.h b/src/modules/partition/gui/PartitionPage.h index ef6eeea15..f4ce330dd 100644 --- a/src/modules/partition/gui/PartitionPage.h +++ b/src/modules/partition/gui/PartitionPage.h @@ -51,6 +51,9 @@ private: void updateButtons(); void onNewPartitionTableClicked(); void onNewVolumeGroupClicked(); + void onResizeVolumeGroupClicked(); + void onDeactivateVolumeGroupClicked(); + void onRemoveVolumeGroupClicked(); void onCreateClicked(); void onEditClicked(); void onDeleteClicked(); diff --git a/src/modules/partition/gui/PartitionPage.ui b/src/modules/partition/gui/PartitionPage.ui index 2b3d568cf..612bff7ba 100644 --- a/src/modules/partition/gui/PartitionPage.ui +++ b/src/modules/partition/gui/PartitionPage.ui @@ -6,7 +6,7 @@ 0 0 - 655 + 684 304 @@ -88,13 +88,6 @@ - - - - New Volume Group - - - @@ -131,6 +124,51 @@ + + + + + + New Volume Group + + + + + + + Resize Volume Group + + + + + + + Deactivate Volume Group + + + + + + + Remove Volume Group + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + diff --git a/src/modules/partition/gui/ResizeVolumeGroupDialog.cpp b/src/modules/partition/gui/ResizeVolumeGroupDialog.cpp new file mode 100644 index 000000000..b3173096d --- /dev/null +++ b/src/modules/partition/gui/ResizeVolumeGroupDialog.cpp @@ -0,0 +1,62 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "ResizeVolumeGroupDialog.h" + +#include "gui/ListPhysicalVolumeWidgetItem.h" + +#include +#include + +#include +#include +#include +#include + +ResizeVolumeGroupDialog::ResizeVolumeGroupDialog( LvmDevice *device, + QVector< const Partition* > availablePVs, + QVector< const Partition* >& selectedPVs, + QWidget* parent ) + : VolumeGroupBaseDialog( device->name(), device->physicalVolumes(), parent ) + , m_selectedPVs( selectedPVs ) +{ + setWindowTitle( "Resize Volume Group" ); + + for ( int i = 0; i < pvList()->count(); i++ ) + pvList()->item(i)->setCheckState( Qt::Checked ); + + for ( const Partition* p : availablePVs ) + pvList()->addItem( new ListPhysicalVolumeWidgetItem( p, false ) ); + + peSize()->setValue( device->peSize() / Capacity::unitFactor(Capacity::Unit::Byte, Capacity::Unit::MiB) ); + + vgName()->setEnabled( false ); + peSize()->setEnabled( false ); + vgType()->setEnabled( false ); + + setUsedSizeValue( device->allocatedPE() * device->peSize() ); + setLVQuantity( device->partitionTable()->children().count() ); +} + +void +ResizeVolumeGroupDialog::accept() +{ + m_selectedPVs << checkedItems(); + + QDialog::accept(); +} diff --git a/src/modules/partition/gui/ResizeVolumeGroupDialog.h b/src/modules/partition/gui/ResizeVolumeGroupDialog.h new file mode 100644 index 000000000..1d6015329 --- /dev/null +++ b/src/modules/partition/gui/ResizeVolumeGroupDialog.h @@ -0,0 +1,40 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef RESIZEVOLUMEGROUPDIALOG_H +#define RESIZEVOLUMEGROUPDIALOG_H + +#include "gui/VolumeGroupBaseDialog.h" + +class LvmDevice; + +class ResizeVolumeGroupDialog : public VolumeGroupBaseDialog +{ +public: + ResizeVolumeGroupDialog( LvmDevice *device, + QVector< const Partition* > availablePVs, + QVector< const Partition* >& selectedPVs, + QWidget* parent ); + + void accept() override; + +private: + QVector< const Partition* >& m_selectedPVs; +}; + +#endif // RESIZEVOLUMEGROUPDIALOG_H diff --git a/src/modules/partition/gui/VolumeGroupBaseDialog.cpp b/src/modules/partition/gui/VolumeGroupBaseDialog.cpp index e5da2c0ad..a727fe42a 100644 --- a/src/modules/partition/gui/VolumeGroupBaseDialog.cpp +++ b/src/modules/partition/gui/VolumeGroupBaseDialog.cpp @@ -32,12 +32,10 @@ VolumeGroupBaseDialog::VolumeGroupBaseDialog( QString& vgName, QVector< const Partition* > pvList, - qint32& peSize, QWidget *parent ) : QDialog(parent) , ui(new Ui::VolumeGroupBaseDialog) , m_vgNameValue(vgName) - , m_peSizeValue(peSize) , m_totalSizeValue(0) , m_usedSizeValue(0) { @@ -53,8 +51,6 @@ VolumeGroupBaseDialog::VolumeGroupBaseDialog( QString& vgName, ui->vgName->setValidator( new QRegularExpressionValidator( re, this ) ); ui->vgName->setText( m_vgNameValue ); - ui->peSize->setValue( m_peSizeValue ); - updateOkButton(); updateTotalSize(); @@ -111,6 +107,20 @@ VolumeGroupBaseDialog::updateOkButton() ui->peSize->value() > 0); } +void +VolumeGroupBaseDialog::setUsedSizeValue( qint64 usedSize ) +{ + m_usedSizeValue = usedSize; + + ui->usedSize->setText( Capacity::formatByteSize(m_usedSizeValue) ); +} + +void +VolumeGroupBaseDialog::setLVQuantity( qint32 lvQuantity ) +{ + ui->lvQuantity->setText( QString::number( lvQuantity ) ); +} + void VolumeGroupBaseDialog::updateTotalSize() { @@ -143,12 +153,6 @@ VolumeGroupBaseDialog::vgNameValue() const return m_vgNameValue; } -qint32& -VolumeGroupBaseDialog::peSizeValue() const -{ - return m_peSizeValue; -} - QLineEdit* VolumeGroupBaseDialog::vgName() const { diff --git a/src/modules/partition/gui/VolumeGroupBaseDialog.h b/src/modules/partition/gui/VolumeGroupBaseDialog.h index 0b4a48372..e6011ce62 100644 --- a/src/modules/partition/gui/VolumeGroupBaseDialog.h +++ b/src/modules/partition/gui/VolumeGroupBaseDialog.h @@ -39,13 +39,16 @@ class VolumeGroupBaseDialog : public QDialog public: explicit VolumeGroupBaseDialog( QString& vgName, QVector< const Partition* > pvList, - qint32& peSize, QWidget* parent = nullptr ); ~VolumeGroupBaseDialog(); protected: virtual void updateOkButton(); + void setUsedSizeValue( qint64 usedSize ); + + void setLVQuantity( qint32 lvQuantity ); + void updateTotalSize(); void updateTotalSectors(); @@ -56,8 +59,6 @@ protected: QString& vgNameValue() const; - qint32& peSizeValue() const; - QLineEdit* vgName() const; QComboBox* vgType() const; @@ -72,7 +73,6 @@ private: Ui::VolumeGroupBaseDialog* ui; QString& m_vgNameValue; - qint32& m_peSizeValue; qint64 m_totalSizeValue; qint64 m_usedSizeValue; diff --git a/src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp b/src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp new file mode 100644 index 000000000..f772b3e5a --- /dev/null +++ b/src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp @@ -0,0 +1,69 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "DeactivateVolumeGroupJob.h" + +#include +#include +#include + +DeactivateVolumeGroupJob::DeactivateVolumeGroupJob( LvmDevice* device ) + : m_device( device ) +{ + +} + +QString +DeactivateVolumeGroupJob::prettyName() const +{ + return tr( "Deactivate volume group named %1." ) + .arg( m_device->name() ); +} + +QString +DeactivateVolumeGroupJob::prettyDescription() const +{ + return tr( "Deactivate volume group named %1." ) + .arg( m_device->name() ); +} + +QString +DeactivateVolumeGroupJob::prettyStatusMessage() const +{ + return tr( "Deactivate volume group named %1." ) + .arg( m_device->name() ); +} + +Calamares::JobResult +DeactivateVolumeGroupJob::exec() +{ + Report report( nullptr ); + + DeactivateVolumeGroupOperation op( *m_device ); + + op.setStatus( Operation::OperationStatus::StatusRunning ); + + QString message = tr( "The installer failed to deactivate a volume group named %1." ).arg( m_device->name() ); + if ( op.execute( report ) ) + { + op.preview(); + return Calamares::JobResult::ok(); + } + + return Calamares::JobResult::error(message, report.toText()); +} diff --git a/src/modules/partition/jobs/DeactivateVolumeGroupJob.h b/src/modules/partition/jobs/DeactivateVolumeGroupJob.h new file mode 100644 index 000000000..5b59c2c4f --- /dev/null +++ b/src/modules/partition/jobs/DeactivateVolumeGroupJob.h @@ -0,0 +1,40 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef DEACTIVATEVOLUMEGROUPJOB_H +#define DEACTIVATEVOLUMEGROUPJOB_H + +#include "Job.h" + +class LvmDevice; + +class DeactivateVolumeGroupJob : public Calamares::Job +{ +public: + DeactivateVolumeGroupJob( LvmDevice* device ); + + QString prettyName() const override; + QString prettyDescription() const override; + QString prettyStatusMessage() const override; + Calamares::JobResult exec() override; + +private: + LvmDevice* m_device; +}; + +#endif // DEACTIVATEVOLUMEGROUPJOB_H diff --git a/src/modules/partition/jobs/RemoveVolumeGroupJob.cpp b/src/modules/partition/jobs/RemoveVolumeGroupJob.cpp new file mode 100644 index 000000000..69b510754 --- /dev/null +++ b/src/modules/partition/jobs/RemoveVolumeGroupJob.cpp @@ -0,0 +1,66 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "RemoveVolumeGroupJob.h" + +#include +#include +#include + +RemoveVolumeGroupJob::RemoveVolumeGroupJob( LvmDevice* device ) + : m_device( device ) +{ + +} + +QString +RemoveVolumeGroupJob::prettyName() const +{ + return tr( "Remove Volume Group named %1." ) + .arg( m_device->name() ); +} + +QString +RemoveVolumeGroupJob::prettyDescription() const +{ + return tr( "Remove Volume Group named %1.") + .arg( m_device->name() ); +} + +QString +RemoveVolumeGroupJob::prettyStatusMessage() const +{ + return tr( "Remove Volume Group named %1." ) + .arg( m_device->name() ); +} + +Calamares::JobResult +RemoveVolumeGroupJob::exec() +{ + Report report( nullptr ); + + RemoveVolumeGroupOperation op( *m_device ); + + op.setStatus( Operation::OperationStatus::StatusRunning ); + + QString message = tr( "The installer failed to remove a volume group named '%1'." ).arg( m_device->name() ); + if ( op.execute( report ) ) + return Calamares::JobResult::ok(); + + return Calamares::JobResult::error(message, report.toText()); +} diff --git a/src/modules/partition/jobs/RemoveVolumeGroupJob.h b/src/modules/partition/jobs/RemoveVolumeGroupJob.h new file mode 100644 index 000000000..426dde7fb --- /dev/null +++ b/src/modules/partition/jobs/RemoveVolumeGroupJob.h @@ -0,0 +1,40 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef REMOVEVOLUMEGROUPJOB_H +#define REMOVEVOLUMEGROUPJOB_H + +#include + +class LvmDevice; + +class RemoveVolumeGroupJob : public Calamares::Job +{ +public: + RemoveVolumeGroupJob( LvmDevice* device ); + + QString prettyName() const override; + QString prettyDescription() const override; + QString prettyStatusMessage() const override; + Calamares::JobResult exec() override; + +private: + LvmDevice* m_device; +}; + +#endif // REMOVEVOLUMEGROUPJOB_H diff --git a/src/modules/partition/jobs/ResizeVolumeGroupJob.cpp b/src/modules/partition/jobs/ResizeVolumeGroupJob.cpp new file mode 100644 index 000000000..bc7ef264d --- /dev/null +++ b/src/modules/partition/jobs/ResizeVolumeGroupJob.cpp @@ -0,0 +1,101 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "ResizeVolumeGroupJob.h" + +// KPMcore +#include +#include +#include +#include + +ResizeVolumeGroupJob::ResizeVolumeGroupJob( LvmDevice* device, QVector< const Partition* >& partitionList ) + : m_device( device ) + , m_partitionList( partitionList ) +{ + +} + +QString +ResizeVolumeGroupJob::prettyName() const +{ + return tr( "Resize volume group named %1 from %2 to %3." ) + .arg( m_device->name() ) + .arg( currentPartitions() ) + .arg( targetPartitions() ); +} + +QString +ResizeVolumeGroupJob::prettyDescription() const +{ + return tr( "Resize volume group named %1 from %2 to %3." ) + .arg( m_device->name() ) + .arg( currentPartitions() ) + .arg( targetPartitions() ); +} + +QString +ResizeVolumeGroupJob::prettyStatusMessage() const +{ + return tr( "Resize volume group named %1 from %2 to %3." ) + .arg( m_device->name() ) + .arg( currentPartitions() ) + .arg( targetPartitions() ); +} + +Calamares::JobResult +ResizeVolumeGroupJob::exec() +{ + Report report( nullptr ); + + ResizeVolumeGroupOperation op( *m_device, m_partitionList ); + + op.setStatus( Operation::OperationStatus::StatusRunning ); + + QString message = tr( "The installer failed to resize a volume group named '%1'." ).arg( m_device->name() ); + if ( op.execute( report ) ) + return Calamares::JobResult::ok(); + + return Calamares::JobResult::error( message, report.toText() ); +} + +QString +ResizeVolumeGroupJob::currentPartitions() const +{ + QString result; + + for ( const Partition *p : m_device->physicalVolumes() ) + result += p->deviceNode() + ", "; + + result.chop(2); + + return result; +} + +QString +ResizeVolumeGroupJob::targetPartitions() const +{ + QString result; + + for ( const Partition *p : m_partitionList ) + result += p->deviceNode() + ", "; + + result.chop(2); + + return result; +} diff --git a/src/modules/partition/jobs/ResizeVolumeGroupJob.h b/src/modules/partition/jobs/ResizeVolumeGroupJob.h new file mode 100644 index 000000000..380bee416 --- /dev/null +++ b/src/modules/partition/jobs/ResizeVolumeGroupJob.h @@ -0,0 +1,48 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef RESIZEVOLUMEGROUPJOB_H +#define RESIZEVOLUMEGROUPJOB_H + +#include + +#include + +class LvmDevice; +class Partition; + +class ResizeVolumeGroupJob : public Calamares::Job +{ +public: + ResizeVolumeGroupJob( LvmDevice* device, QVector< const Partition* >& partitionList ); + + QString prettyName() const override; + QString prettyDescription() const override; + QString prettyStatusMessage() const override; + Calamares::JobResult exec() override; + +private: + QString currentPartitions() const; + QString targetPartitions() const; + +private: + LvmDevice* m_device; + QVector< const Partition* > m_partitionList; +}; + +#endif // RESIZEVOLUMEGROUPJOB_H