]> git.proxmox.com Git - pve-network.git/blob - PVE/Network/SDN/Vnets.pm
api: generate 'running-config' state instead of version increase on apply
[pve-network.git] / PVE / Network / SDN / Vnets.pm
1 package PVE::Network::SDN::Vnets;
2
3 use strict;
4 use warnings;
5
6 use PVE::Cluster qw(cfs_read_file cfs_write_file cfs_lock_file);
7 use Net::IP;
8 use PVE::Network::SDN::Subnets;
9
10 use PVE::Network::SDN::VnetPlugin;
11 PVE::Network::SDN::VnetPlugin->register();
12 PVE::Network::SDN::VnetPlugin->init();
13
14 sub sdn_vnets_config {
15 my ($cfg, $id, $noerr) = @_;
16
17 die "no sdn vnet ID specified\n" if !$id;
18
19 my $scfg = $cfg->{ids}->{$id};
20 die "sdn vnet '$id' does not exist\n" if (!$noerr && !$scfg);
21
22 return $scfg;
23 }
24
25 sub config {
26 return cfs_read_file("sdn/vnets.cfg");
27 }
28
29 sub write_config {
30 my ($cfg) = @_;
31
32 cfs_write_file("sdn/vnets.cfg", $cfg);
33 }
34
35 sub sdn_vnets_ids {
36 my ($cfg) = @_;
37
38 return keys %{$cfg->{ids}};
39 }
40
41 sub complete_sdn_vnet {
42 my ($cmdname, $pname, $cvalue) = @_;
43
44 my $cfg = PVE::Network::SDN::Vnets::config();
45
46 return $cmdname eq 'add' ? [] : [ PVE::Network::SDN::Vnets::sdn_vnet_ids($cfg) ];
47 }
48
49 sub get_vnet {
50 my ($vnetid, $running) = @_;
51
52 my $cfg = {};
53 if($running) {
54 my $cfg = PVE::Network::SDN::config();
55 $cfg = $cfg->{vnets};
56 } else {
57 $cfg = PVE::Network::SDN::Vnets::config();
58 }
59
60 my $vnet = PVE::Network::SDN::Vnets::sdn_vnets_config($cfg, $vnetid, 1);
61
62 return $vnet;
63 }
64
65 sub get_subnets {
66 my ($vnetid) = @_;
67
68 my $subnets = {};
69 my $subnets_cfg = PVE::Network::SDN::Subnets::config();
70 foreach my $subnetid (sort keys %{$subnets_cfg->{ids}}) {
71 my $subnet = $subnets_cfg->{ids}->{$subnetid};
72 next if !$subnet->{vnet} || $subnet->{vnet} ne $vnetid;
73 $subnets->{$subnetid} = $subnet;
74 }
75 return $subnets;
76
77 }
78
79 sub get_next_free_ip {
80 my ($vnetid, $hostname, $ipversion) = @_;
81
82 $ipversion = 4 if !$ipversion;
83 my $subnets = PVE::Network::SDN::Vnets::get_subnets($vnetid, 1);
84 my $ip = undef;
85 my $subnetcount = 0;
86
87 foreach my $subnetid (sort keys %{$subnets}) {
88 my $subnet = $subnets->{$subnetid};
89 my ($network, $mask) = split(/-/, $subnetid);
90
91 next if $ipversion != Net::IP::ip_get_version($network);
92 $subnetcount++;
93 if ($subnet->{ipam}) {
94 eval {
95 $ip = PVE::Network::SDN::Subnets::next_free_ip($subnetid, $subnet, $hostname);
96 };
97 warn $@ if $@;
98 }
99 last if $ip;
100 }
101 die "can't find any free ip" if !$ip && $subnetcount > 0;
102
103 return $ip;
104 }
105
106 sub add_ip {
107 my ($vnetid, $cidr, $hostname) = @_;
108
109 my $subnets = PVE::Network::SDN::Vnets::get_subnets($vnetid, 1);
110
111 my ($ip, $mask) = split(/\//, $cidr);
112 my ($subnetid, $subnet) = PVE::Network::SDN::Subnets::find_ip_subnet($ip, $subnets);
113
114 PVE::Network::SDN::Subnets::add_ip($subnetid, $subnet, $ip, $hostname);
115 }
116
117 sub del_ip {
118 my ($vnetid, $cidr, $hostname) = @_;
119
120 my $subnets = PVE::Network::SDN::Vnets::get_subnets($vnetid, 1);
121
122 my ($ip, $mask) = split(/\//, $cidr);
123 my ($subnetid, $subnet) = PVE::Network::SDN::Subnets::find_ip_subnet($ip, $subnets);
124
125 PVE::Network::SDN::Subnets::del_ip($subnetid, $subnet, $ip, $hostname);
126 }
127
128 1;