]> git.proxmox.com Git - qemu-server.git/commitdiff
has_features: also return a list of allowed nodes
authorDietmar Maurer <dietmar@proxmox.com>
Mon, 6 May 2013 06:56:17 +0000 (08:56 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Mon, 6 May 2013 06:56:17 +0000 (08:56 +0200)
This is useful if a feature is restricted to a limited set of nodes.

PVE/API2/Qemu.pm
PVE/QemuServer.pm

index 48ae55bccd200d6e527f504bb452f44a51040605..13263688bc68ea908c45b40dccf8e3d91cd2155f 100644 (file)
@@ -1788,7 +1788,14 @@ __PACKAGE__->register_method({
        },
     },
     returns => {
-        type => 'boolean'
+       type => "object",
+       properties => {
+           hasFeature => { type => 'boolean' },
+           nodes => {  
+               type => 'array',
+               items => { type => 'string' },
+           }
+       },
     },
     code => sub {
        my ($param) = @_;
@@ -1812,9 +1819,13 @@ __PACKAGE__->register_method({
        }
        my $storecfg = PVE::Storage::config();
 
-       my $hasfeature = PVE::QemuServer::has_feature($feature, $conf, $storecfg, $snapname, $running);
-       my $res = $hasfeature ? 1 : 0 ;
-       return $res;
+       my $nodelist = PVE::QemuServer::shared_nodes($conf, $storecfg);
+       my $hasFeature = PVE::QemuServer::has_feature($feature, $conf, $storecfg, $snapname, $running);
+       
+       return {
+           hasFeature => $hasFeature,
+           nodes => [ keys %$nodelist ],
+       }; 
     }});
 
 __PACKAGE__->register_method({
index 2a5c13c0abeb91f3baa23899d5cba280b735c742..4e09f35e9ef8b4c84331ab84e302d6143089a1c4 100644 (file)
@@ -1821,7 +1821,7 @@ sub check_local_resources {
     return $loc_res;
 }
 
-# check is used storages are available on all nodes (use by migrate)
+# check if used storages are available on all nodes (use by migrate)
 sub check_storage_availability {
     my ($storecfg, $conf, $node) = @_;
 
@@ -1840,6 +1840,40 @@ sub check_storage_availability {
    });
 }
 
+# list nodes where all VM images are available (used by has_feature API)
+sub shared_nodes {
+    my ($conf, $storecfg) = @_;
+
+    my $nodelist = PVE::Cluster::get_nodelist();
+    my $nodehash = { map { $_ => 1 } @$nodelist };
+    my $nodename = PVE::INotify::nodename();
+  
+    foreach_drive($conf, sub {
+       my ($ds, $drive) = @_;
+
+       my $volid = $drive->{file};
+       return if !$volid;
+
+       my ($storeid, $volname) = PVE::Storage::parse_volume_id($volid, 1);
+       if ($storeid) {
+           my $scfg = PVE::Storage::storage_config($storecfg, $storeid);
+           if ($scfg->{disable}) {
+               $nodehash = {};
+           } elsif (my $avail = $scfg->{nodes}) {
+               foreach my $node (keys %$nodehash) {
+                   delete $nodehash->{$node} if !$avail->{$node};
+               }
+           } elsif (!$scfg->{shared}) {
+               foreach my $node (keys %$nodehash) {
+                   delete $nodehash->{$node} if $node ne $nodename
+               }
+           }
+       }
+    });
+
+    return $nodehash
+}
+
 sub check_lock {
     my ($conf) = @_;
 
@@ -4442,7 +4476,7 @@ sub snapshot_delete {
 sub has_feature {
     my ($feature, $conf, $storecfg, $snapname, $running) = @_;
 
-    my $err = undef;
+    my $err;
     foreach_drive($conf, sub {
        my ($ds, $drive) = @_;
 
@@ -4451,7 +4485,7 @@ sub has_feature {
        $err = 1 if !PVE::Storage::volume_has_feature($storecfg, $feature, $volid, $snapname, $running);
     });
 
-    return 1 if !$err;
+    return $err ? 0 : 1;
 }
 
 sub template_create {