[pve-devel] [PATCH] pve-storage autocompletion

Alen Grizonic a.grizonic at proxmox.com
Wed Sep 30 13:04:53 CEST 2015


---
 PVE/API2/Storage/Config.pm  |  4 ++-
 PVE/API2/Storage/Content.pm | 43 ++++++++++++++++++++++---------
 PVE/API2/Storage/Status.pm  | 29 ++++++++++++++-------
 PVE/CLI/pvesm.pm            |  3 +++
 PVE/Storage.pm              | 62 +++++++++++++++++++++++++++++++++++++--------
 5 files changed, 109 insertions(+), 32 deletions(-)

diff --git a/PVE/API2/Storage/Config.pm b/PVE/API2/Storage/Config.pm
index e5c57ee..b9fdc0e 100755
--- a/PVE/API2/Storage/Config.pm
+++ b/PVE/API2/Storage/Config.pm
@@ -229,7 +229,9 @@ __PACKAGE__->register_method ({
     parameters => {
     	additionalProperties => 0,
 	properties => { 
-	    storage => get_standard_option('pve-storage-id'),
+	    storage => get_standard_option('pve-storage-id', {
+                completion => \&PVE::Storage::complete_storage,
+            }),
 	},
     },
     returns => { type => 'null' },
diff --git a/PVE/API2/Storage/Content.pm b/PVE/API2/Storage/Content.pm
index 63dc0a4..792d491 100644
--- a/PVE/API2/Storage/Content.pm
+++ b/PVE/API2/Storage/Content.pm
@@ -31,17 +31,20 @@ __PACKAGE__->register_method ({
     	additionalProperties => 0,
 	properties => { 
 	    node => get_standard_option('pve-node'),
-	    storage => get_standard_option('pve-storage-id'),
+	    storage => get_standard_option('pve-storage-id', {
+		completion => \&PVE::Storage::complete_storage_enabled,
+	    }),
 	    content => { 
 		description => "Only list content of this type.",
+		completion => \&PVE::Storage::complete_content,
 		type => 'string', format => 'pve-storage-content',
 		optional => 1,
 	    },
-	    vmid => get_standard_option
-		('pve-vmid', { 
-		    description => "Only list images for this VM",
-		    optional => 1,		
-		 }),
+	    vmid => get_standard_option('pve-vmid', {
+		description => "Only list images for this VM",
+		completion => \&PVE::Cluster::complete_vmid,
+		optional => 1,
+	    }),
 	},
     },
     returns => {
@@ -225,10 +228,16 @@ __PACKAGE__->register_method ({
     	additionalProperties => 0,
 	properties => { 
 	    node => get_standard_option('pve-node'),
-	    storage => get_standard_option('pve-storage-id', { optional => 1 }),
+            storage => get_standard_option('pve-storage-id', {
+		completion => \&PVE::Storage::complete_storage_enabled,
+		type => 'string',
+		optional => 1,
+            }),
 	    volume => {
 		description => "Volume identifier",
-		type => 'string', 
+		completion => \&PVE::Storage::complete_volume,
+		type => 'string',
+		maxLength => 128,
 	    },
 	},
     },
@@ -273,10 +282,15 @@ __PACKAGE__->register_method ({
     	additionalProperties => 0,
 	properties => { 
 	    node => get_standard_option('pve-node'),
-	    storage => get_standard_option('pve-storage-id', { optional => 1}),
+	    storage => get_standard_option('pve-storage-id', {
+		completion => \&PVE::Storage::complete_storage_enabled,
+		optional => 1,
+	    }),
 	    volume => {
 		description => "Volume identifier",
-		type => 'string', 
+		completion => \&PVE::Storage::complete_volume,
+		type => 'string',
+		maxLength => 128,
 	    },
 	},
     },
@@ -315,10 +329,15 @@ __PACKAGE__->register_method ({
     	additionalProperties => 0,
 	properties => { 
 	    node => get_standard_option('pve-node'),
-	    storage => get_standard_option('pve-storage-id', { optional => 1}),
+	    storage => get_standard_option('pve-storage-id', {
+		completion => \&PVE::Storage::complete_storage_enabled,
+		optional => 1,
+	    }),
 	    volume => {
 		description => "Source volume identifier",
-		type => 'string', 
+		completion => \&PVE::Storage::complete_volume,
+		type => 'string',
+		maxLength => 128,
 	    },
 	    target => {
 		description => "Target volume identifier",
diff --git a/PVE/API2/Storage/Status.pm b/PVE/API2/Storage/Status.pm
index e04e184..bd363b1 100644
--- a/PVE/API2/Storage/Status.pm
+++ b/PVE/API2/Storage/Status.pm
@@ -40,14 +40,15 @@ __PACKAGE__->register_method ({
     	additionalProperties => 0,
 	properties => {
 	    node => get_standard_option('pve-node'),
-	    storage => get_standard_option
-		('pve-storage-id', {
-		    description => "Only list status for  specified storage",
-		    optional => 1,
-		 }),
+	    storage => get_standard_option('pve-storage-id', {
+		description => "Only list status for  specified storage",
+		completion => \&PVE::Storage::complete_storage_enabled,
+		optional => 1,
+	    }),
 	    content => { 
 		description => "Only list stores which support this content type.",
 		type => 'string', format => 'pve-storage-content-list',
+		completion => \&PVE::Storage::complete_content,
 		optional => 1,
 	    },
 	    enabled => {
@@ -59,6 +60,7 @@ __PACKAGE__->register_method ({
 	    target => get_standard_option('pve-node', {
 		description => "If target is different to 'node', we only lists shared storages which " .
 		    "content is accessible on this 'node' and the specified 'target' node.",
+		completion => \&PVE::Cluster::get_nodelist,
 		optional => 1,
 	    }),
 	},
@@ -129,7 +131,10 @@ __PACKAGE__->register_method ({
     	additionalProperties => 0,
 	properties => {
 	    node => get_standard_option('pve-node'),
-	    storage => get_standard_option('pve-storage-id'),
+            storage => get_standard_option('pve-storage-id', {
+                description => "Only list status forspecified storage",
+                completion => \&PVE::Storage::complete_storage_enabled,
+	     }),
 	},
     },
     returns => {
@@ -206,7 +211,9 @@ __PACKAGE__->register_method ({
     	additionalProperties => 0,
 	properties => {
 	    node => get_standard_option('pve-node'),
-	    storage => get_standard_option('pve-storage-id'),
+	    storage => get_standard_option('pve-storage-id', {
+		completion => \&PVE::Storage::complete_storage_enabled,
+	    }),
 	    timeframe => {
 		description => "Specify the time frame you are interested in.",
 		type => 'string',
@@ -253,7 +260,9 @@ __PACKAGE__->register_method ({
     	additionalProperties => 0,
 	properties => {
 	    node => get_standard_option('pve-node'),
-	    storage => get_standard_option('pve-storage-id'),
+	    storage => get_standard_option('pve-storage-id', {
+		completion => \&PVE::Storage::complete_storage_enabled,
+            }),
 	    timeframe => {
 		description => "Specify the time frame you are interested in.",
 		type => 'string',
@@ -297,7 +306,9 @@ __PACKAGE__->register_method ({
     	additionalProperties => 0,
 	properties => {
 	    node => get_standard_option('pve-node'),
-	    storage => get_standard_option('pve-storage-id'),
+	    storage => get_standard_option('pve-storage-id', {
+                completion => \&PVE::Storage::complete_storage_enabled,
+            }),
 	    content => { 
 		description => "Content type.",
 		type => 'string', format => 'pve-storage-content',
diff --git a/PVE/CLI/pvesm.pm b/PVE/CLI/pvesm.pm
index bb122ce..2522742 100755
--- a/PVE/CLI/pvesm.pm
+++ b/PVE/CLI/pvesm.pm
@@ -34,6 +34,9 @@ __PACKAGE__->register_method ({
 	    volume => {
 		description => "Volume identifier",
 		type => 'string', format => 'pve-volume-id',
+		completion => \&PVE::Storage::complete_volume,
+                type => 'string',
+                maxLength => 128,
 	    },
 	},
     },
diff --git a/PVE/Storage.pm b/PVE/Storage.pm
index c27e9cf..d75189b 100755
--- a/PVE/Storage.pm
+++ b/PVE/Storage.pm
@@ -1169,23 +1169,65 @@ sub foreach_volid {
 
 # bash completion helper
 
+sub complete_content {
+    my ($cmdname, $pname, $cvalue) = @_;
+
+    my @ctypes = qw(images vztmpl iso backup);
+
+    push(@ctypes, 'rootdir') if ($cmdname eq 'add' || $cmdname eq 'status');
+
+    return [@ctypes];
+}
+
+sub complete_volume {
+    my ($cmdname, $pname, $cvalue) = @_;
+
+    my $data;
+    my $vollist = [];
+
+    my $cfg = PVE::Storage::config();
+    my $storage = complete_storage_enabled();
+
+    my $foreach_volume = sub {
+	my $sid = shift;
+	foreach my $volume (@{$data->{$sid}}) {
+	    push @$vollist, $volume->{volid};
+	}
+    };
+
+    foreach my $sid (@$storage) {
+	$data = PVE::Storage::vdisk_list ($cfg, $sid);
+	&$foreach_volume($sid);
+	$data = PVE::Storage::template_list ($cfg, $sid, 'iso');
+	&$foreach_volume($sid);
+	$data = PVE::Storage::template_list ($cfg, $sid, 'vztmpl');
+	&$foreach_volume($sid);
+	$data = PVE::Storage::template_list ($cfg, $sid, 'vztmpl');
+	&$foreach_volume($sid);
+    }
+
+    return $vollist;
+}
+
 sub complete_storage {
-   my ($cmdname, $pname, $cvalue) = @_;
+    my ($cmdname, $pname, $cvalue) = @_;
+
+    my $cfg = PVE::Storage::config();
 
-   return  $cmdname eq 'add' ? [] : [ PVE::Storage::storage_ids() ];
+    return  $cmdname eq 'add' ? [] : [ PVE::Storage::storage_ids($cfg) ];
 }
 
 sub complete_storage_enabled {
-   my ($cmdname, $pname, $cvalue) = @_;
+    my ($cmdname, $pname, $cvalue) = @_;
 
-   my $res = [];
+    my $res = [];
 
-   my $cfg = PVE::Storage::config();
-   foreach my $sid (keys %{$cfg->{ids}}) {
-       next if !storage_check_enabled($cfg, $sid, undef, 1);
-       push @$res, $sid;
-   }
-   return $res;
+    my $cfg = PVE::Storage::config();
+    foreach my $sid (keys %{$cfg->{ids}}) {
+	next if !storage_check_enabled($cfg, $sid, undef, 1);
+	push @$res, $sid;
+    }
+    return $res;
 }
 
 1;
-- 
2.1.4




More information about the pve-devel mailing list