Skip to content

Commit

Permalink
Implement clearing and removing PVs
Browse files Browse the repository at this point in the history
  • Loading branch information
vicr123 committed Aug 18, 2023
1 parent 013a552 commit bbad8c6
Show file tree
Hide file tree
Showing 22 changed files with 1,371 additions and 27 deletions.
1 change: 1 addition & 0 deletions application/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ set(SOURCES
diskPanes/lvmdiskpane.h diskPanes/lvmdiskpane.cpp diskPanes/lvmdiskpane.ui

popovers/smartpopover.cpp popovers/smartpopover.ui
popovers/pvremovepopover.h popovers/pvremovepopover.cpp popovers/pvremovepopover.ui
diskpane.cpp diskpane.ui
mainwindow.cpp mainwindow.ui
operations/creatediskimagepopover.cpp operations/creatediskimagepopover.ui
Expand Down
19 changes: 15 additions & 4 deletions application/diskPanes/lvmdiskpane.cpp
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
#include "lvmdiskpane.h"
#include "ui_lvmdiskpane.h"

#include "popovers/pvremovepopover.h"
#include <DriveObjects/diskobject.h>
#include <DriveObjects/partitioninterface.h>
#include <DriveObjects/partitiontableinterface.h>
#include <DriveObjects/physicalvolumeinterface.h>
#include <DriveObjects/volumegroup.h>
#include <diskoperationmanager.h>
#include <partitioninformation.h>
#include <tpopover.h>

struct LvmDiskPanePrivate {
DiskObject* disk;
Expand All @@ -23,8 +25,6 @@ LvmDiskPane::LvmDiskPane(DiskObject* disk, QWidget* parent) :
connect(disk, &DiskObject::interfaceAdded, this, &LvmDiskPane::updateDetails);
connect(disk, &DiskObject::interfaceRemoved, this, &LvmDiskPane::updateDetails);

ui->evictDataButton->setProperty("type", "destructive");

this->updateDetails();
}

Expand All @@ -50,12 +50,12 @@ void LvmDiskPane::updateDetails() {
auto pv = d->disk->interface<PhysicalVolumeInterface>();
if (pv && pv->volumeGroup()) {
ui->lvmDescription->setText(tr("This block is part of the %1 volume group.").arg(QLocale().quoteString(pv->volumeGroup()->name())));
ui->evictDataButton->setVisible(true);
ui->pvSettingsButton->setVisible(true);
ui->viewVgButton->setVisible(true);
ui->attachVgButton->setVisible(false);
} else {
ui->lvmDescription->setText(tr("This block is not part of a volume group."));
ui->evictDataButton->setVisible(false);
ui->pvSettingsButton->setVisible(false);
ui->viewVgButton->setVisible(false);
ui->attachVgButton->setVisible(true);
}
Expand All @@ -68,3 +68,14 @@ int LvmDiskPane::order() const {
void LvmDiskPane::on_attachVgButton_clicked() {
DiskOperationManager::showDiskOperationUi(this->window(), DiskOperationManager::AttachPv, d->disk);
}

void LvmDiskPane::on_pvSettingsButton_clicked() {
auto* jp = new PvRemovePopover(d->disk);
tPopover* popover = new tPopover(jp);
popover->setPopoverWidth(-200);
popover->setPopoverSide(tPopover::Bottom);
connect(jp, &PvRemovePopover::done, popover, &tPopover::dismiss);
connect(popover, &tPopover::dismissed, popover, &tPopover::deleteLater);
connect(popover, &tPopover::dismissed, jp, &PvRemovePopover::deleteLater);
popover->show(this->window());
}
1 change: 1 addition & 0 deletions application/diskPanes/lvmdiskpane.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class LvmDiskPane : public DiskPaneComponent {
int order() const;
private slots:
void on_attachVgButton_clicked();
void on_pvSettingsButton_clicked();
};

#endif // LVMDISKPANE_H
11 changes: 6 additions & 5 deletions application/diskPanes/lvmdiskpane.ui
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<width>499</width>
<height>89</height>
</rect>
</property>
Expand Down Expand Up @@ -79,12 +79,12 @@
</spacer>
</item>
<item>
<widget class="QPushButton" name="evictDataButton">
<widget class="QPushButton" name="pvSettingsButton">
<property name="text">
<string>Relocate Data</string>
<string>Manage Physical Volume</string>
</property>
<property name="icon">
<iconset theme="lvm-pv-evict">
<iconset theme="configure">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
Expand All @@ -102,7 +102,8 @@
<string>Attach to Volume Group</string>
</property>
<property name="icon">
<iconset theme="list-add"/>
<iconset theme="list-add">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
Expand Down
13 changes: 13 additions & 0 deletions application/lvm/lvmpage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,13 @@ LvmPage::LvmPage(QWidget* parent) :
d->vgModel->setShowAddButton(false);
ui->listView->setModel(d->vgModel);

ui->noVgIcon->setPixmap(QIcon::fromTheme("drive-logical-volume").pixmap(QSize(128, 128)));

ui->stackedWidget->setCurrentAnimation(tStackedWidget::Fade);
ui->stackedWidget_2->setCurrentAnimation(tStackedWidget::Lift);

connect(d->vgModel, &VolumeGroupModel::dataChanged, this, &LvmPage::updatePage);
updatePage();
}

LvmPage::~LvmPage() {
Expand All @@ -46,3 +51,11 @@ void LvmPage::on_listView_clicked(const QModelIndex& index) {
ui->stackedWidget_2->setCurrentWidget(vgPage);
}
}

void LvmPage::updatePage() {
if (d->vgModel->rowCount() == 0) {
ui->stackedWidget->setCurrentWidget(ui->noVgsPage);
} else {
ui->stackedWidget->setCurrentWidget(ui->vgListPage);
}
}
2 changes: 2 additions & 0 deletions application/lvm/lvmpage.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ class LvmPage : public QWidget {
private:
Ui::LvmPage* ui;
LvmPagePrivate* d;

void updatePage();
};

#endif // LVMPAGE_H
77 changes: 75 additions & 2 deletions application/lvm/lvmpage.ui
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,10 @@
</property>
<item>
<widget class="tStackedWidget" name="stackedWidget">
<widget class="QWidget" name="page">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="vgListPage">
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>0</number>
Expand Down Expand Up @@ -87,7 +90,77 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="page_2"/>
<widget class="QWidget" name="noVgsPage">
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label">
<property name="font">
<font>
<pointsize>20</pointsize>
</font>
</property>
<property name="text">
<string>No Volume Groups</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="noVgIcon">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string notr="true">TextLabel</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Create an LVM Physical Volume and add it to a new Volume Group to start using LVM</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
Expand Down
100 changes: 100 additions & 0 deletions application/popovers/pvremovepopover.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
#include "pvremovepopover.h"
#include "ui_pvremovepopover.h"

#include <DriveObjects/diskobject.h>
#include <DriveObjects/physicalvolumeinterface.h>
#include <DriveObjects/volumegroup.h>
#include <frisbeeexception.h>
#include <tcontentsizer.h>

struct PvRemovePopoverPrivate {
DiskObject* disk;
};

PvRemovePopover::PvRemovePopover(DiskObject* disk, QWidget* parent) :
QWidget(parent),
ui(new Ui::PvRemovePopover) {
ui->setupUi(this);
d = new PvRemovePopoverPrivate();
d->disk = disk;

new tContentSizer(ui->actionsWidget);
new tContentSizer(ui->relocateDataWidget);
new tContentSizer(ui->removeWidget);
new tContentSizer(ui->doRemoveWidget);

ui->stackedWidget->setCurrentAnimation(tStackedWidget::SlideHorizontal);
ui->removeButton->setProperty("type", "destructive");
ui->removeButton_2->setProperty("type", "destructive");
ui->doRemoveButton->setProperty("type", "destructive");
}

PvRemovePopover::~PvRemovePopover() {
delete d;
delete ui;
}

void PvRemovePopover::on_titleLabel_backButtonClicked() {
emit done();
}

QCoro::Task<> PvRemovePopover::on_doRelocateButton_clicked() {
emit done();

auto disk = d->disk;
auto pv = disk->interface<PhysicalVolumeInterface>();
auto vg = pv->volumeGroup();

co_await disk->lock();

try {
co_await vg->emptyDevice(disk, {});
} catch (FrisbeeException ex) {
}

disk->releaseLock();
}

void PvRemovePopover::on_titleLabel_2_backButtonClicked() {
ui->stackedWidget->setCurrentWidget(ui->settingsPage);
}

void PvRemovePopover::on_relocateButton_clicked() {
ui->stackedWidget->setCurrentWidget(ui->relocatePage);
}

void PvRemovePopover::on_titleLabel_3_backButtonClicked() {
ui->stackedWidget->setCurrentWidget(ui->settingsPage);
}

void PvRemovePopover::on_removeButton_2_clicked() {
ui->stackedWidget->setCurrentWidget(ui->doRemovePage);
}

void PvRemovePopover::on_titleLabel_4_backButtonClicked() {
ui->stackedWidget->setCurrentWidget(ui->removePage);
}

QCoro::Task<> PvRemovePopover::on_doRemoveButton_clicked() {
emit done();

auto disk = d->disk;
auto pv = disk->interface<PhysicalVolumeInterface>();
auto vg = pv->volumeGroup();

co_await disk->lock();

try {
if (pv->size() != pv->freeSize()) {
co_await vg->emptyDevice(disk, {});
}
co_await vg->removeDevice(disk, ui->overwriteSpaceBox->isChecked(), {});
} catch (FrisbeeException ex) {
}

disk->releaseLock();
}

void PvRemovePopover::on_removeButton_clicked() {
ui->stackedWidget->setCurrentWidget(ui->removePage);
}
47 changes: 47 additions & 0 deletions application/popovers/pvremovepopover.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#ifndef PVREMOVEPOPOVER_H
#define PVREMOVEPOPOVER_H

#include <QCoroTask>
#include <QWidget>

namespace Ui {
class PvRemovePopover;
}

class DiskObject;
struct PvRemovePopoverPrivate;
class PvRemovePopover : public QWidget {
Q_OBJECT

public:
explicit PvRemovePopover(DiskObject* disk, QWidget* parent = nullptr);
~PvRemovePopover();

signals:
void done();

private slots:
void on_titleLabel_backButtonClicked();

QCoro::Task<> on_doRelocateButton_clicked();

void on_titleLabel_2_backButtonClicked();

void on_relocateButton_clicked();

void on_titleLabel_3_backButtonClicked();

void on_removeButton_2_clicked();

void on_titleLabel_4_backButtonClicked();

QCoro::Task<> on_doRemoveButton_clicked();

void on_removeButton_clicked();

private:
Ui::PvRemovePopover* ui;
PvRemovePopoverPrivate* d;
};

#endif // PVREMOVEPOPOVER_H
Loading

0 comments on commit bbad8c6

Please sign in to comment.