[pve-devel] [PATCH qemu-server 6/8] property string update: net*

Wolfgang Bumiller w.bumiller at proxmox.com
Wed Mar 30 12:20:11 CEST 2016


This requires the new 'group' schema mechanism.
---
 PVE/QemuServer.pm | 105 ++++++++++++++++++++++++++++++++----------------------
 1 file changed, 63 insertions(+), 42 deletions(-)

diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index bb8a94d..2d202e3 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -512,10 +512,66 @@ my $nic_model_list = ['rtl8139', 'ne2k_pci', 'e1000',  'pcnet',  'virtio',
 		      'e1000-82540em', 'e1000-82544gc', 'e1000-82545em'];
 my $nic_model_list_txt = join(' ', sort @$nic_model_list);
 
+my $net_fmt = {
+    macaddr => {
+	type => 'string',
+	pattern => qr/[0-9a-f]{2}(?::[0-9a-f]{2}){5}/i,
+	description => "MAC address",
+	format_description => "XX:XX:XX:XX:XX:XX",
+	optional => 1,
+    },
+    model => { alias => 'macaddr', default_key => 1 },
+    (map { $_ => { group => 'model' } } @$nic_model_list),
+    bridge => {
+	type => 'string',
+	description => 'Bridge to attach the network device to.',
+	format_description => 'bridge',
+	optional => 1,
+    },
+    queues => {
+	type => 'integer',
+	minimum => 0, maximum => 16,
+	description => 'Number of packet queues to be used on the device.',
+	format_description => 'number',
+	optional => 1,
+    },
+    rate => {
+	type => 'number',
+	minimum => 0,
+	description => 'Rate limit in mbps as floating point number.',
+	format_description => 'mbps',
+	optional => 1,
+    },
+    tag => {
+	type => 'integer',
+	minimum => 2, maximum => 4094,
+	description => 'VLAN tag to apply to packets on this interface.',
+	format_description => 'vlanid',
+	optional => 1,
+    },
+    trunks => {
+	type => 'string',
+	pattern => qr/\d+(?:-\d+)?(?:;\d+(?:-\d+)?)*/,
+	description => 'VLAN trunks to pass through this interface.',
+	format_description => 'id;id...',
+	optional => 1,
+    },
+    firewall => {
+	type => 'boolean',
+	description => 'Whether this interface should be protected by the firewall.',
+	format_description => '0|1',
+	optional => 1,
+    },
+    link_down => {
+	type => 'boolean',
+	description => 'Whether this interface should be DISconnected (like pulling the plug).',
+	format_description => '0|1',
+	optional => 1,
+    },
+};
 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>][,trunks=<vlanid[;vlanid]>][,firewall=0|1],link_down=0|1]",
     description => <<EODESCR,
 Specify network devices.
 
@@ -1561,54 +1617,19 @@ sub parse_hostpci {
 sub parse_net {
     my ($data) = @_;
 
-    my $res = {};
-
-    foreach my $kvp (split(/,/, $data)) {
-
-	if ($kvp =~ m/^(ne2k_pci|e1000|e1000-82540em|e1000-82544gc|e1000-82545em|rtl8139|pcnet|virtio|ne2k_isa|i82551|i82557b|i82559er|vmxnet3)(=([0-9a-f]{2}(:[0-9a-f]{2}){5}))?$/i) {
-	    my $model = lc($1);
-	    my $mac = defined($3) ? uc($3) : PVE::Tools::random_ether_addr();
-	    $res->{model} = $model;
-	    $res->{macaddr} = $mac;
-	} elsif ($kvp =~ m/^bridge=(\S+)$/) {
-	    $res->{bridge} = $1;
-	} elsif ($kvp =~ m/^queues=(\d+)$/) {
-	    $res->{queues} = $1;
-	} elsif ($kvp =~ m/^rate=(\d+(\.\d+)?)$/) {
-	    $res->{rate} = $1;
-        } elsif ($kvp =~ m/^tag=(\d+)$/) {
-            $res->{tag} = $1;
-        } elsif ($kvp =~ m/^trunks=([0-9;]+)$/) {
-	    $res->{trunks} = $1;
-        } elsif ($kvp =~ m/^firewall=([01])$/) {
-	    $res->{firewall} = $1;
-	} elsif ($kvp =~ m/^link_down=([01])$/) {
-	    $res->{link_down} = $1;
-	} else {
-	    return undef;
-	}
-
+    my $res = eval { PVE::JSONSchema::parse_property_string($net_fmt, $data) };
+    if ($@) {
+	warn $@;
+	return undef;
     }
-
-    return undef if !$res->{model};
-
+    $res->{macaddr} = PVE::Tools::random_ether_addr() if !defined($res->{macaddr});
     return $res;
 }
 
 sub print_net {
     my $net = shift;
 
-    my $res = "$net->{model}";
-    $res .= "=$net->{macaddr}" if $net->{macaddr};
-    $res .= ",bridge=$net->{bridge}" if $net->{bridge};
-    $res .= ",rate=$net->{rate}" if $net->{rate};
-    $res .= ",tag=$net->{tag}" if $net->{tag};
-    $res .= ",trunks=$net->{trunks}" if $net->{trunks};
-    $res .= ",firewall=1" if $net->{firewall};
-    $res .= ",link_down=1" if $net->{link_down};
-    $res .= ",queues=$net->{queues}" if $net->{queues};
-
-    return $res;
+    return PVE::JSONSchema::print_property_string($net, $net_fmt);
 }
 
 sub add_random_macs {
-- 
2.1.4





More information about the pve-devel mailing list