Re: [pve-devel] [PATCH] Add to config the nic flag link_down=[0|1] also enable nic link if the Flag is set in the config. we use to verify the result the qemu extension get_link_status from or pachtes

2015-01-20 Thread Dietmar Maurer

applied, modified for new hotplug implementation:

https://git.proxmox.com/?p=qemu-server.git;a=commitdiff;h=25088687fe81c2d2671c6d0a0380f6c555f6ab4a




___
pve-devel mailing list
pve-devel@pve.proxmox.com
http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


[pve-devel] [PATCH] Add to config the nic flag link_down=[0|1] also enable nic link if the Flag is set in the config. we use to verify the result the qemu extension get_link_status from or pachtes.

2014-12-22 Thread Wolfgang Link

Signed-off-by: Wolfgang Link wolfg...@linksystems.org
---
 PVE/API2/Qemu.pm  |   57 +++--
 PVE/QemuServer.pm |   22 -
 2 files changed, 76 insertions(+), 3 deletions(-)

diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index 066726d..f3fe3e6 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -849,9 +849,36 @@ my $vmconfig_update_net = sub {
 
if(($newnet-{bridge} ne $oldnet-{bridge}) || ($newnet-{tag} 
ne $oldnet-{tag}) || ($newnet-{firewall} ne $oldnet-{firewall})){
PVE::Network::tap_unplug($iface);
-   PVE::Network::tap_plug($iface, $newnet-{bridge}, 
$newnet-{tag}, $newnet-{firewall});
+   PVE::Network::tap_plug($iface, $newnet-{bridge}, 
$newnet-{tag});
}
 
+   my $verify_link_status = sub {
+   my ($expected, $vmid) = @_;
+   my $nic_status;
+   eval {
+   my %param = (name = $opt); 
+   $nic_status = PVE::QemuServer::vm_mon_cmd($vmid, 
get_link_status,%param);
+   };
+   die $@ if $@;
+   die chagning nic status dosn't work! if $expected != 
$nic_status;
+   };
+
+   if($newnet-{link_down}){
+   eval {
+   my %param = (name = $opt, up = \0);
+   PVE::QemuServer::vm_mon_cmd($vmid, set_link,%param);
+   };
+   die $@ if $@;
+   $verify_link_status(0,$vmid);
+   }
+   if($oldnet-{link_down}  !$newnet-{link_down}){
+   eval {
+   my %param = (name = $opt, up = \1);
+   PVE::QemuServer::vm_mon_cmd($vmid, set_link,%param);
+   };
+   die $@ if $@;
+   $verify_link_status(1,$vmid);
+   }
}else{
#if bridge/nat mode change, we try to hot-unplug
die error hot-unplug $opt for update if 
!PVE::QemuServer::vm_deviceunplug($vmid, $conf, $opt);
@@ -982,7 +1009,7 @@ my $update_vm_api  = sub {
my $running = PVE::QemuServer::check_running($vmid);
 
foreach my $opt (keys %$param) { # add/change
-
+   
$conf = PVE::QemuServer::load_config($vmid); # update/reload
 
next if $conf-{$opt}  ($param-{$opt} eq $conf-{$opt}); # 
skip if nothing changed
@@ -1646,11 +1673,37 @@ __PACKAGE__-register_method({
my $realcmd = sub {
my $upid = shift;
 
+   my $conf = PVE::QemuServer::load_config($vmid);
+
syslog('info', start VM $vmid: $upid\n);
 
PVE::QemuServer::vm_start($storecfg, $vmid, $stateuri, 
$skiplock, $migratedfrom, undef,
  $machine, $spice_ticket);
 
+   foreach my $nic (keys %$conf){
+
+   if($nic =~  m/^net\d+$/){
+
+   my $nicconf= PVE::QemuServer::parse_net($conf-{$nic});
+
+   if($nicconf-{link_down}){
+
+   eval {
+   my %param = (name = $nic, up = \0);
+   PVE::QemuServer::vm_mon_cmd($vmid, 
set_link,%param);
+   };
+   die $@ if $@;
+
+   my $nic_status;
+   eval {
+   my %param = (name = $nic); 
+   $nic_status = 
PVE::QemuServer::vm_mon_cmd($vmid, get_link_status,%param);
+   };
+   warn $@ if $@;
+   warn Error Link from $nic is not Down if 
$nic_status != 0; 
+   }   
+   }
+   }
return;
};
 
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 4840c73..7d8d863 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -510,7 +510,7 @@ my $nic_model_list_txt = join(' ', sort @$nic_model_list);
 my $netdesc = {
 optional = 1,
 type = 'string', format = 'pve-qm-net',
-typetext = MODEL=XX:XX:XX:XX:XX:XX 
[,bridge=dev][,queues=nbqueues][,rate=mbps][,tag=vlanid][,firewall=0|1],
+typetext = MODEL=XX:XX:XX:XX:XX:XX 
[,bridge=dev][,queues=nbqueues][,rate=mbps][,tag=vlanid][,firewall=0|1][,link_down=0|1],
 description = EODESCR,
 Specify network devices.
 
@@ -1378,6 +1378,8 @@ sub parse_net {
 $res-{tag} = $1;
 } elsif ($kvp =~ m/^firewall=(\d+)$/) {
$res-{firewall} = $1;
+   } elsif ($kvp =~ m/^link_down=(\d+)$/) {
+   $res-{link_down} = $1;
} else {
return undef;
}
@@ -1398,6 +1400,7 @@ sub print_net {
 $res .= ,rate=$net-{rate} if $net-{rate};
 $res .= ,tag=$net-{tag} if