[pve-devel] [PATCH lxc] consistent interface names and live network update
Wolfgang Bumiller
w.bumiller at proxmox.com
Thu Aug 6 15:47:40 CEST 2015
That was supposed to be [PATCH pve-container]
On Thu, Aug 06, 2015 at 03:46:47PM +0200, Wolfgang Bumiller wrote:
> veth${vmid}.${id} looks like a vlan device, with qemu we use
> tap${vmid}i${id}, so it makes sense to use an 'i' for
> containers, too.
>
> Fixed update_net to work with the new configuration method,
> it still expected the old configuration hash and errored
> when trying to change the network interface configuration
> of a running continer.
> ---
> src/PVE/LXC.pm | 74 +++++++++++++++++++++++++++++----------------------------
> src/lxcnetaddbr | 2 +-
> 2 files changed, 39 insertions(+), 37 deletions(-)
>
> diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm
> index ad751ff..ff24696 100644
> --- a/src/PVE/LXC.pm
> +++ b/src/PVE/LXC.pm
> @@ -873,7 +873,7 @@ sub update_lxc_config {
> my $d = PVE::LXC::parse_lxc_network($conf->{$k});
> $netcount++;
> $raw .= "lxc.network.type = veth\n";
> - $raw .= "lxc.network.veth.pair = veth$vmid.$ind\n";
> + $raw .= "lxc.network.veth.pair = veth${vmid}i${ind}\n";
> $raw .= "lxc.network.hwaddr = $d->{hwaddr}\n" if defined($d->{hwaddr});
> $raw .= "lxc.network.name = $d->{name}\n" if defined($d->{name});
> $raw .= "lxc.network.mtu = $d->{mtu}\n" if defined($d->{mtu});
> @@ -940,7 +940,7 @@ sub update_pct_config {
> delete $conf->{$opt};
> next if !$running;
> my $netid = $1;
> - PVE::Network::veth_delete("veth${vmid}.$netid");
> + PVE::Network::veth_delete("veth${vmid}i$netid");
> } else {
> die "implement me"
> }
> @@ -1082,49 +1082,57 @@ my $safe_string_ne = sub {
> sub update_net {
> my ($vmid, $conf, $opt, $newnet, $netid, $rootdir) = @_;
>
> - my $veth = $newnet->{'veth.pair'};
> - my $vethpeer = $veth . "p";
> + if ($newnet->{type} ne 'veth') {
> + # for when there are physical interfaces
> + die "cannot update interface of type $newnet->{type}";
> + }
> +
> + my $veth = "veth${vmid}i${netid}";
> my $eth = $newnet->{name};
>
> - if ($conf->{$opt}) {
> - if (&$safe_string_ne($conf->{$opt}->{hwaddr}, $newnet->{hwaddr}) ||
> - &$safe_string_ne($conf->{$opt}->{name}, $newnet->{name})) {
> + if (my $oldnetcfg = $conf->{$opt}) {
> + my $oldnet = parse_lxc_network($oldnetcfg);
> +
> + if (&$safe_string_ne($oldnet->{hwaddr}, $newnet->{hwaddr}) ||
> + &$safe_string_ne($oldnet->{name}, $newnet->{name})) {
>
> - PVE::Network::veth_delete($veth);
> + PVE::Network::veth_delete($veth);
> delete $conf->{$opt};
> PVE::LXC::write_config($vmid, $conf);
>
> - hotplug_net($vmid, $conf, $opt, $newnet);
> + hotplug_net($vmid, $conf, $opt, $newnet, $netid);
>
> - } elsif (&$safe_string_ne($conf->{$opt}->{bridge}, $newnet->{bridge}) ||
> - &$safe_num_ne($conf->{$opt}->{tag}, $newnet->{tag}) ||
> - &$safe_num_ne($conf->{$opt}->{firewall}, $newnet->{firewall})) {
> + } elsif (&$safe_string_ne($oldnet->{bridge}, $newnet->{bridge}) ||
> + &$safe_num_ne($oldnet->{tag}, $newnet->{tag}) ||
> + &$safe_num_ne($oldnet->{firewall}, $newnet->{firewall})) {
>
> - if ($conf->{$opt}->{bridge}){
> + if ($oldnet->{bridge}) {
> PVE::Network::tap_unplug($veth);
> - delete $conf->{$opt}->{bridge};
> - delete $conf->{$opt}->{tag};
> - delete $conf->{$opt}->{firewall};
> + foreach (qw(bridge tag firewall)) {
> + delete $oldnet->{$_};
> + }
> + $conf->{$opt} = print_lxc_network($oldnet);
> PVE::LXC::write_config($vmid, $conf);
> }
>
> - PVE::Network::tap_plug($veth, $newnet->{bridge}, $newnet->{tag}, $newnet->{firewall});
> - $conf->{$opt}->{bridge} = $newnet->{bridge} if $newnet->{bridge};
> - $conf->{$opt}->{tag} = $newnet->{tag} if $newnet->{tag};
> - $conf->{$opt}->{firewall} = $newnet->{firewall} if $newnet->{firewall};
> + PVE::Network::tap_plug($veth, $newnet->{bridge}, $newnet->{tag}, $newnet->{firewall});
> + foreach (qw(bridge tag firewall)) {
> + $oldnet->{$_} = $newnet->{$_} if $newnet->{$_};
> + }
> + $conf->{$opt} = print_lxc_network($oldnet);
> PVE::LXC::write_config($vmid, $conf);
> }
> } else {
> - hotplug_net($vmid, $conf, $opt, $newnet);
> + hotplug_net($vmid, $conf, $opt, $newnet, $netid);
> }
>
> update_ipconfig($vmid, $conf, $opt, $eth, $newnet, $rootdir);
> }
>
> sub hotplug_net {
> - my ($vmid, $conf, $opt, $newnet) = @_;
> + my ($vmid, $conf, $opt, $newnet, $netid) = @_;
>
> - my $veth = $newnet->{'veth.pair'};
> + my $veth = "veth${vmid}i${netid}";
> my $vethpeer = $veth . "p";
> my $eth = $newnet->{name};
>
> @@ -1139,18 +1147,11 @@ sub hotplug_net {
> $cmd = ['lxc-attach', '-n', $vmid, '-s', 'NETWORK', '--', '/sbin/ip', 'link', 'set', $eth ,'up' ];
> PVE::Tools::run_command($cmd);
>
> - $conf->{$opt}->{type} = 'veth';
> - $conf->{$opt}->{bridge} = $newnet->{bridge} if $newnet->{bridge};
> - $conf->{$opt}->{tag} = $newnet->{tag} if $newnet->{tag};
> - $conf->{$opt}->{firewall} = $newnet->{firewall} if $newnet->{firewall};
> - $conf->{$opt}->{hwaddr} = $newnet->{hwaddr} if $newnet->{hwaddr};
> - $conf->{$opt}->{name} = $newnet->{name} if $newnet->{name};
> - $conf->{$opt}->{'veth.pair'} = $newnet->{'veth.pair'} if $newnet->{'veth.pair'};
> -
> - delete $conf->{$opt}->{ip} if $conf->{$opt}->{ip};
> - delete $conf->{$opt}->{ip6} if $conf->{$opt}->{ip6};
> - delete $conf->{$opt}->{gw} if $conf->{$opt}->{gw};
> - delete $conf->{$opt}->{gw6} if $conf->{$opt}->{gw6};
> + my $done = { type => 'veth' };
> + foreach (qw(bridge tag firewall hwaddr name)) {
> + $done->{$_} = $newnet->{$_} if $newnet->{$_};
> + }
> + $conf->{$opt} = print_lxc_network($done);
>
> PVE::LXC::write_config($vmid, $conf);
> }
> @@ -1160,7 +1161,7 @@ sub update_ipconfig {
>
> my $lxc_setup = PVE::LXCSetup->new($conf, $rootdir);
>
> - my $optdata = $conf->{$opt};
> + my $optdata = parse_lxc_network($conf->{$opt});
> my $deleted = [];
> my $added = [];
> my $nscmd = sub {
> @@ -1249,6 +1250,7 @@ sub update_ipconfig {
> delete $optdata->{$property};
> }
> }
> + $conf->{$opt} = print_lxc_network($optdata);
> PVE::LXC::write_config($vmid, $conf);
> $lxc_setup->setup_network($conf);
> };
> diff --git a/src/lxcnetaddbr b/src/lxcnetaddbr
> index d830f9c..a87bf52 100755
> --- a/src/lxcnetaddbr
> +++ b/src/lxcnetaddbr
> @@ -25,7 +25,7 @@ die "missing iface parameter\n" if !$iface;
> my $conf = PVE::LXC::load_config($vmid);
>
> my $netconf;
> -if ($iface =~ m/^veth(\d+)\.(\d+)$/) {
> +if ($iface =~ m/^veth(\d+)i(\d+)$/) {
> die "got unexpected interface name '$iface'\n" if $1 ne $vmid;
> $netconf = $conf->{"net$2"};
> }
> --
> 2.1.4
>
>
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
>
More information about the pve-devel
mailing list