$dev = PVE::Diskmanage::verify_blockdev_path($dev);
PVE::Diskmanage::assert_disk_unused($dev);
- PVE::Storage::assert_sid_unused($name) if $param->{add_storage};
+
+ my $storage_params = {
+ type => 'lvm',
+ vgname => $name,
+ storage => $name,
+ content => 'rootdir,images',
+ shared => 0,
+ nodes => $node,
+ };
+ my $verify_params = [qw(vgname)];
+
+ if ($param->{add_storage}) {
+ PVE::API2::Storage::Config->create_or_update(
+ $name,
+ $node,
+ $storage_params,
+ $verify_params,
+ 1,
+ );
+ }
my $worker = sub {
PVE::Diskmanage::locked_disk_action(sub {
PVE::Diskmanage::assert_disk_unused($dev);
+ die "volume group with name '${name}' already exists on node '${node}'\n"
+ if PVE::Storage::LVMPlugin::lvm_vgs()->{$name};
+
+ if (PVE::Diskmanage::is_partition($dev)) {
+ eval { PVE::Diskmanage::change_parttype($dev, '8E00'); };
+ warn $@ if $@;
+ }
PVE::Storage::LVMPlugin::lvm_create_volume_group($dev, $name);
- # FIXME: Remove once we depend on systemd >= v249.
- # Work around udev bug https://github.com/systemd/systemd/issues/18525 to ensure the
- # udev database is updated.
- eval { run_command(['udevadm', 'trigger', $dev]); };
- warn $@ if $@;
+ PVE::Diskmanage::udevadm_trigger($dev);
if ($param->{add_storage}) {
- my $storage_params = {
- type => 'lvm',
- vgname => $name,
- storage => $name,
- content => 'rootdir,images',
- shared => 0,
- nodes => $node,
+ PVE::API2::Storage::Config->create_or_update(
+ $name,
+ $node,
+ $storage_params,
+ $verify_params,
+ );
+ }
+ });
+ };
+
+ return $rpcenv->fork_worker('lvmcreate', $name, $user, $worker);
+ }});
+
+__PACKAGE__->register_method ({
+ name => 'delete',
+ path => '{name}',
+ method => 'DELETE',
+ proxyto => 'node',
+ protected => 1,
+ permissions => {
+ check => ['perm', '/', ['Sys.Modify', 'Datastore.Allocate']],
+ },
+ description => "Remove an LVM Volume Group.",
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node'),
+ name => get_standard_option('pve-storage-id'),
+ 'cleanup-config' => {
+ description => "Marks associated storage(s) as not available on this node anymore ".
+ "or removes them from the configuration (if configured for this node only).",
+ type => 'boolean',
+ optional => 1,
+ default => 0,
+ },
+ 'cleanup-disks' => {
+ description => "Also wipe disks so they can be repurposed afterwards.",
+ type => 'boolean',
+ optional => 1,
+ default => 0,
+ },
+ },
+ },
+ returns => { type => 'string' },
+ code => sub {
+ my ($param) = @_;
+
+ my $rpcenv = PVE::RPCEnvironment::get();
+ my $user = $rpcenv->get_user();
+
+ my $name = $param->{name};
+ my $node = $param->{node};
+
+ my $worker = sub {
+ PVE::Diskmanage::locked_disk_action(sub {
+ my $vgs = PVE::Storage::LVMPlugin::lvm_vgs(1);
+ die "no such volume group '$name'\n" if !$vgs->{$name};
+
+ PVE::Storage::LVMPlugin::lvm_destroy_volume_group($name);
+
+ my $config_err;
+ if ($param->{'cleanup-config'}) {
+ my $match = sub {
+ my ($scfg) = @_;
+ return $scfg->{type} eq 'lvm' && $scfg->{vgname} eq $name;
};
+ eval { PVE::API2::Storage::Config->cleanup_storages_for_node($match, $node); };
+ warn $config_err = $@ if $@;
+ }
- PVE::API2::Storage::Config->create($storage_params);
+ if ($param->{'cleanup-disks'}) {
+ my $wiped = [];
+ eval {
+ for my $pv ($vgs->{$name}->{pvs}->@*) {
+ my $dev = PVE::Diskmanage::verify_blockdev_path($pv->{name});
+ PVE::Diskmanage::wipe_blockdev($dev);
+ push $wiped->@*, $dev;
+ }
+ };
+ my $err = $@;
+ PVE::Diskmanage::udevadm_trigger($wiped->@*);
+ die "cleanup failed - $err" if $err;
}
+
+ die "config cleanup failed - $config_err" if $config_err;
});
};
- return $rpcenv->fork_worker('lvmcreate', $name, $user, $worker);
+ return $rpcenv->fork_worker('lvmremove', $name, $user, $worker);
}});
1;