all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Alexandre Derumier <aderumier@odiso.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH v2 qemu-server 1/9] add ipam module
Date: Mon, 12 Jul 2021 00:46:59 +0200	[thread overview]
Message-ID: <20210711224707.63089-2-aderumier@odiso.com> (raw)
In-Reply-To: <20210711224707.63089-1-aderumier@odiso.com>

Signed-off-by: Alexandre Derumier <aderumier@odiso.com>
---
 PVE/QemuServer/Ipam.pm  | 141 ++++++++++++++++++++++++++++++++++++++++
 PVE/QemuServer/Makefile |   1 +
 2 files changed, 142 insertions(+)
 create mode 100644 PVE/QemuServer/Ipam.pm

diff --git a/PVE/QemuServer/Ipam.pm b/PVE/QemuServer/Ipam.pm
new file mode 100644
index 0000000..202474c
--- /dev/null
+++ b/PVE/QemuServer/Ipam.pm
@@ -0,0 +1,141 @@
+package PVE::QemuServer::Ipam;
+
+use strict;
+use warnings;
+
+my $have_sdn;
+eval {
+    require PVE::Network::SDN::Zones;
+    $have_sdn = 1;
+};
+
+sub is_static_ip {
+    my ($ip) = @_;
+
+    return 1 if $ip !~ m/(dhcp|manual|auto)$/;
+}
+
+
+sub ip_has_changed {
+    my ($version, $net, $oldnet) = @_;
+
+    my $ipfield = $version == 4 ? "ip" : "ip6";
+    my $ip = $net->{$ipfield};
+    my $oldip = $oldnet->{$ipfield};
+
+    return 1 if !$oldip && $ip;
+    return 1 if !$ip && $oldip;
+    return 1 if $ip && $oldip && $ip ne $oldip;
+    return 1 if !$oldnet->{bridge} || !$net->{bridge} || $oldnet->{bridge} ne $net->{bridge};
+}
+
+sub add_net_ip {
+    my ($version, $net, $hostname, $description, $skipdns) = @_;
+
+    my $bridge = $net->{bridge};
+    my $mac = $net->{hwaddr};
+    my $ipfield = $version == 4 ? "ip" : "ip6";
+    my $ip = $net->{$ipfield};
+    my $subnets = PVE::Network::SDN::Vnets::get_subnets($bridge);
+    return if !keys %{$subnets};
+
+    eval {
+        if (!$ip) {
+	print"add_find_free\n";
+
+            my $next_free_ip = PVE::Network::SDN::Vnets::get_next_free_cidr($bridge, $hostname, $mac, $description, $version, $skipdns);
+            $net->{$ipfield} = $next_free_ip if $next_free_ip;
+        } elsif (is_static_ip($ip)) {
+	print"add_cidr $ip\n";
+	    PVE::Network::SDN::Vnets::add_cidr($bridge, $ip, $hostname, $mac, $description, $skipdns);
+        }
+    };
+    if ($@) {
+        die $@;
+    }
+}
+
+sub update_net_ip {
+    my ($version, $net, $hostname, $oldhostname, $description, $skipdns) = @_;
+
+    my $bridge = $net->{bridge};
+    my $mac = $net->{hwaddr};
+    my $ipfield = $version == 4 ? "ip" : "ip6";
+    my $ip = $net->{$ipfield};
+
+    return if !$ip || !is_static_ip($ip);
+
+    my $subnets = PVE::Network::SDN::Vnets::get_subnets($bridge);
+    return if !keys %{$subnets};
+
+    eval {
+	#update ip attributes if no ip address change
+	print"update_cidr $ip\n";
+	PVE::Network::SDN::Vnets::update_cidr($bridge, $ip, $hostname, $oldhostname, $mac, $description, $skipdns);
+    };
+    if ($@) {
+        die $@;
+    }
+}
+
+
+sub update_net_gateway {
+    my ($version, $net) = @_;
+
+    my $bridge = $net->{bridge};
+    my $netip = $version == 4 ? $net->{ip} : $net->{ip6};
+    my $gwfield = $version == 4 ? "gw" : "gw6";
+
+    return if (!$netip || !is_static_ip($netip));
+
+    my $subnets = PVE::Network::SDN::Vnets::get_subnets($bridge);
+    return if !keys %{$subnets};
+
+    #update gateway
+    my ($ip, $mask) = split(/\//, $netip);
+    my ($subnetid, $subnet) = PVE::Network::SDN::Subnets::find_ip_subnet($ip, $mask, $subnets);
+    my $gw = $subnet->{gateway} if $subnet->{gateway};
+    $net->{$gwfield} = $gw if $gw;
+
+}
+
+sub delete_net_ip {
+    my ($version, $net, $hostname, $skipdns) = @_;
+
+    return if !$have_sdn;
+
+    my $bridge = $net->{bridge};
+    my $ip = $version == 4 ? $net->{ip} : $net->{ip6};
+
+    return if !$ip || !is_static_ip($ip);
+
+    my $subnets = PVE::Network::SDN::Vnets::get_subnets($bridge);
+    return if !keys %{$subnets};
+
+    eval {
+	print"del_cidr $ip\n";
+
+        PVE::Network::SDN::Vnets::del_cidr($bridge, $ip, $hostname, $skipdns);
+    };
+    warn $@ if $@;
+}
+
+sub is_ip_referenced {
+    my ($version, $nets, $net, $skipsnap, $checkcurrent) = @_;
+
+    if ($checkcurrent) {
+        foreach my $opt (keys %{$nets->{current}}) {
+            return 1 if !ip_has_changed($version, $net, $nets->{current}->{$opt});
+        }
+    }
+
+    foreach my $snapname (keys %{$nets->{snapshots}}) {
+        next if $skipsnap && $skipsnap eq $snapname;
+        my $snapnets = $nets->{snapshots}->{$snapname};
+        foreach my $opt (keys %{$snapnets}) {
+            return 1 if !ip_has_changed($version, $net, $snapnets->{$opt});
+        }
+    }
+}
+
+1;
\ No newline at end of file
diff --git a/PVE/QemuServer/Makefile b/PVE/QemuServer/Makefile
index e4ed184..0292383 100644
--- a/PVE/QemuServer/Makefile
+++ b/PVE/QemuServer/Makefile
@@ -11,6 +11,7 @@ SOURCES=PCI.pm		\
 	CPUConfig.pm	\
 	CGroup.pm	\
 	Drive.pm	\
+	Ipam.pm		\
 
 .PHONY: install
 install: ${SOURCES}
-- 
2.30.2




  reply	other threads:[~2021-07-11 22:47 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-11 22:46 [pve-devel] [PATCH v2 qemu-server 0/9] RFC: sdn: add ipam support Alexandre Derumier
2021-07-11 22:46 ` Alexandre Derumier [this message]
2021-07-11 22:47 ` [pve-devel] [PATCH v2 qemu-server 2/9] add print_ipconfig Alexandre Derumier
2021-07-11 22:47 ` [pve-devel] [PATCH v2 qemu-server 3/9] add ip options to netdescr Alexandre Derumier
2021-07-11 22:47 ` [pve-devel] [PATCH v2 qemu-server 4/9] ipam : add update/delete support Alexandre Derumier
2021-07-11 22:47 ` [pve-devel] [PATCH v2 qemu-server 5/9] ipam : add revert ip support Alexandre Derumier
2021-07-11 22:47 ` [pve-devel] [PATCH v2 qemu-server 6/9] ipam : add snapshot rollback support Alexandre Derumier
2021-07-11 22:47 ` [pve-devel] [PATCH v2 qemu-server 7/9] ipam : add snaphot delete support Alexandre Derumier
2021-07-11 22:47 ` [pve-devel] [PATCH v2 qemu-server 8/9] ipam : add create vm support Alexandre Derumier
2021-07-11 22:47 ` [pve-devel] [PATCH v2 qemu-server 9/9] ipam : add destroy " Alexandre Derumier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210711224707.63089-2-aderumier@odiso.com \
    --to=aderumier@odiso.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal