[pve-devel] [PATCH manager 01/11] copy Scan.pm from pve-storage
Dominik Csapak
d.csapak at proxmox.com
Thu Nov 15 15:30:47 CET 2018
this will be used for the api endpoints in the future
as PVE::API2::Scan instead of PVE::API2::Storage::Scan
since it will contain endpoints to other modules
(like qemu-server for pci/usb scanning)
Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
PVE/API2/Scan.pm | 425 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 425 insertions(+)
create mode 100644 PVE/API2/Scan.pm
diff --git a/PVE/API2/Scan.pm b/PVE/API2/Scan.pm
new file mode 100644
index 00000000..4ff023e2
--- /dev/null
+++ b/PVE/API2/Scan.pm
@@ -0,0 +1,425 @@
+package PVE::API2::Storage::Scan;
+
+use strict;
+use warnings;
+
+use PVE::SafeSyslog;
+use PVE::Storage;
+use PVE::Storage::LVMPlugin;
+use HTTP::Status qw(:constants);
+use PVE::JSONSchema qw(get_standard_option);
+
+use PVE::RESTHandler;
+
+use base qw(PVE::RESTHandler);
+
+__PACKAGE__->register_method ({
+ name => 'index',
+ path => '',
+ method => 'GET',
+ description => "Index of available scan methods",
+ permissions => {
+ user => 'all',
+ },
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node'),
+ },
+ },
+ returns => {
+ type => 'array',
+ items => {
+ type => "object",
+ properties => { method => { type => 'string'} },
+ },
+ links => [ { rel => 'child', href => "{method}" } ],
+ },
+ code => sub {
+ my ($param) = @_;
+
+ my $res = [
+ { method => 'lvm' },
+ { method => 'iscsi' },
+ { method => 'nfs' },
+ { method => 'glusterfs' },
+ { method => 'usb' },
+ { method => 'zfs' },
+ { method => 'cifs' },
+ ];
+
+ return $res;
+ }});
+
+__PACKAGE__->register_method ({
+ name => 'zfsscan',
+ path => 'zfs',
+ method => 'GET',
+ description => "Scan zfs pool list on local node.",
+ protected => 1,
+ proxyto => "node",
+ permissions => {
+ check => ['perm', '/storage', ['Datastore.Allocate']],
+ },
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node'),
+ },
+ },
+ returns => {
+ type => 'array',
+ items => {
+ type => "object",
+ properties => {
+ pool => {
+ description => "ZFS pool name.",
+ type => 'string',
+ },
+ },
+ },
+ },
+ code => sub {
+ my ($param) = @_;
+
+ return PVE::Storage::scan_zfs();
+ }});
+
+__PACKAGE__->register_method ({
+ name => 'nfsscan',
+ path => 'nfs',
+ method => 'GET',
+ description => "Scan remote NFS server.",
+ protected => 1,
+ proxyto => "node",
+ permissions => {
+ check => ['perm', '/storage', ['Datastore.Allocate']],
+ },
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node'),
+ server => {
+ description => "The server address (name or IP).",
+ type => 'string', format => 'pve-storage-server',
+ },
+ },
+ },
+ returns => {
+ type => 'array',
+ items => {
+ type => "object",
+ properties => {
+ path => {
+ description => "The exported path.",
+ type => 'string',
+ },
+ options => {
+ description => "NFS export options.",
+ type => 'string',
+ },
+ },
+ },
+ },
+ code => sub {
+ my ($param) = @_;
+
+ my $server = $param->{server};
+ my $res = PVE::Storage::scan_nfs($server);
+
+ my $data = [];
+ foreach my $k (keys %$res) {
+ push @$data, { path => $k, options => $res->{$k} };
+ }
+ return $data;
+ }});
+
+__PACKAGE__->register_method ({
+ name => 'cifsscan',
+ path => 'cifs',
+ method => 'GET',
+ description => "Scan remote CIFS server.",
+ protected => 1,
+ proxyto => "node",
+ permissions => {
+ check => ['perm', '/storage', ['Datastore.Allocate']],
+ },
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node'),
+ server => {
+ description => "The server address (name or IP).",
+ type => 'string', format => 'pve-storage-server',
+ },
+ username => {
+ description => "User name.",
+ type => 'string',
+ optional => 1,
+ },
+ password => {
+ description => "User password.",
+ type => 'string',
+ optional => 1,
+ },
+ domain => {
+ description => "SMB domain (Workgroup).",
+ type => 'string',
+ optional => 1,
+ },
+ },
+ },
+ returns => {
+ type => 'array',
+ items => {
+ type => "object",
+ properties => {
+ share => {
+ description => "The cifs share name.",
+ type => 'string',
+ },
+ description => {
+ description => "Descriptive text from server.",
+ type => 'string',
+ },
+ },
+ },
+ },
+ code => sub {
+ my ($param) = @_;
+
+ my $server = $param->{server};
+
+ my $username = $param->{username};
+ my $password = $param->{password};
+ my $domain = $param->{domain};
+
+ my $res = PVE::Storage::scan_cifs($server, $username, $password, $domain);
+
+ my $data = [];
+ foreach my $k (keys %$res) {
+ next if $k =~ m/NT_STATUS_/;
+ push @$data, { share => $k, description => $res->{$k} };
+ }
+
+ return $data;
+ }});
+
+# Note: GlusterFS currently does not have an equivalent of showmount.
+# As workaround, we simply use nfs showmount.
+# see http://www.gluster.org/category/volumes/
+
+__PACKAGE__->register_method ({
+ name => 'glusterfsscan',
+ path => 'glusterfs',
+ method => 'GET',
+ description => "Scan remote GlusterFS server.",
+ protected => 1,
+ proxyto => "node",
+ permissions => {
+ check => ['perm', '/storage', ['Datastore.Allocate']],
+ },
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node'),
+ server => {
+ description => "The server address (name or IP).",
+ type => 'string', format => 'pve-storage-server',
+ },
+ },
+ },
+ returns => {
+ type => 'array',
+ items => {
+ type => "object",
+ properties => {
+ volname => {
+ description => "The volume name.",
+ type => 'string',
+ },
+ },
+ },
+ },
+ code => sub {
+ my ($param) = @_;
+
+ my $server = $param->{server};
+ my $res = PVE::Storage::scan_nfs($server);
+
+ my $data = [];
+ foreach my $path (keys %$res) {
+ if ($path =~ m!^/([^\s/]+)$!) {
+ push @$data, { volname => $1 };
+ }
+ }
+ return $data;
+ }});
+
+__PACKAGE__->register_method ({
+ name => 'iscsiscan',
+ path => 'iscsi',
+ method => 'GET',
+ description => "Scan remote iSCSI server.",
+ protected => 1,
+ proxyto => "node",
+ permissions => {
+ check => ['perm', '/storage', ['Datastore.Allocate']],
+ },
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node'),
+ portal => {
+ description => "The iSCSI portal (IP or DNS name with optional port).",
+ type => 'string', format => 'pve-storage-portal-dns',
+ },
+ },
+ },
+ returns => {
+ type => 'array',
+ items => {
+ type => "object",
+ properties => {
+ target => {
+ description => "The iSCSI target name.",
+ type => 'string',
+ },
+ portal => {
+ description => "The iSCSI portal name.",
+ type => 'string',
+ },
+ },
+ },
+ },
+ code => sub {
+ my ($param) = @_;
+
+ my $res = PVE::Storage::scan_iscsi($param->{portal});
+
+ my $data = [];
+ foreach my $k (keys %$res) {
+ push @$data, { target => $k, portal => join(',', @{$res->{$k}}) };
+ }
+
+ return $data;
+ }});
+
+__PACKAGE__->register_method ({
+ name => 'lvmscan',
+ path => 'lvm',
+ method => 'GET',
+ description => "List local LVM volume groups.",
+ protected => 1,
+ proxyto => "node",
+ permissions => {
+ check => ['perm', '/storage', ['Datastore.Allocate']],
+ },
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node'),
+ },
+ },
+ returns => {
+ type => 'array',
+ items => {
+ type => "object",
+ properties => {
+ vg => {
+ description => "The LVM logical volume group name.",
+ type => 'string',
+ },
+ },
+ },
+ },
+ code => sub {
+ my ($param) = @_;
+
+ my $res = PVE::Storage::LVMPlugin::lvm_vgs();
+ return PVE::RESTHandler::hash_to_array($res, 'vg');
+ }});
+
+__PACKAGE__->register_method ({
+ name => 'lvmthinscan',
+ path => 'lvmthin',
+ method => 'GET',
+ description => "List local LVM Thin Pools.",
+ protected => 1,
+ proxyto => "node",
+ permissions => {
+ check => ['perm', '/storage', ['Datastore.Allocate']],
+ },
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node'),
+ vg => {
+ type => 'string',
+ pattern => '[a-zA-Z0-9\.\+\_][a-zA-Z0-9\.\+\_\-]+', # see lvm(8) manpage
+ maxLength => 100,
+ },
+ },
+ },
+ returns => {
+ type => 'array',
+ items => {
+ type => "object",
+ properties => {
+ lv => {
+ description => "The LVM Thin Pool name (LVM logical volume).",
+ type => 'string',
+ },
+ },
+ },
+ },
+ code => sub {
+ my ($param) = @_;
+
+ return PVE::Storage::LvmThinPlugin::list_thinpools($param->{vg});
+ }});
+
+__PACKAGE__->register_method ({
+ name => 'usbscan',
+ path => 'usb',
+ method => 'GET',
+ description => "List local USB devices.",
+ protected => 1,
+ proxyto => "node",
+ permissions => {
+ check => ['perm', '/', ['Sys.Modify']],
+ },
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node'),
+ },
+ },
+ returns => {
+ type => 'array',
+ items => {
+ type => "object",
+ properties => {
+ busnum => { type => 'integer'},
+ devnum => { type => 'integer'},
+ port => { type => 'integer'},
+ usbpath => { type => 'string', optional => 1},
+ level => { type => 'integer'},
+ class => { type => 'integer'},
+ vendid => { type => 'string'},
+ prodid => { type => 'string'},
+ speed => { type => 'string'},
+
+ product => { type => 'string', optional => 1 },
+ serial => { type => 'string', optional => 1 },
+ manufacturer => { type => 'string', optional => 1 },
+ },
+ },
+ },
+ code => sub {
+ my ($param) = @_;
+
+ return PVE::Storage::scan_usb();
+ }});
+
+1;
--
2.11.0
More information about the pve-devel
mailing list