]>
git.proxmox.com Git - pve-network.git/blob - PVE/Network/SDN/SubnetPlugin.pm
1 package PVE
::Network
::SDN
::SubnetPlugin
;
6 use PVE
::Cluster
qw(cfs_read_file cfs_write_file cfs_lock_file);
7 use base
qw(PVE::SectionConfig);
8 use PVE
::JSONSchema
qw(get_standard_option);
9 use PVE
::Exception
qw(raise raise_param_exc);
10 use Net
::Subnet
qw(subnet_matcher);
11 use PVE
::Network
::SDN
::Vnets
;
12 use PVE
::Network
::SDN
::Ipams
;
14 PVE
::Cluster
::cfs_register_file
('sdn/subnets.cfg',
15 sub { __PACKAGE__-
>parse_config(@_); },
16 sub { __PACKAGE__-
>write_config(@_); });
18 PVE
::JSONSchema
::register_standard_option
('pve-sdn-subnet-id', {
19 description
=> "The SDN subnet object identifier.",
20 type
=> 'string', format
=> 'pve-sdn-subnet-id',
24 PVE
::JSONSchema
::register_format
('pve-sdn-subnet-id', \
&parse_sdn_subnet_id
);
25 sub parse_sdn_subnet_id
{
26 my ($id, $noerr) = @_;
28 my $cidr = $id =~ s/-/\//r
;
30 if (!(PVE
::JSONSchema
::pve_verify_cidrv4
($cidr, 1) ||
31 PVE
::JSONSchema
::pve_verify_cidrv6
($cidr, 1)))
33 return undef if $noerr;
34 die "value does not look like a valid CIDR network\n";
42 subnet
=> get_standard_option
('pve-sdn-subnet-id',
43 { completion
=> \
&PVE
::Network
::SDN
::Subnets
::complete_sdn_subnet
}),
59 description
=> "associated vnet",
62 type
=> 'string', format
=> 'ip',
63 description
=> "Subnet Gateway: Will be assign on vnet for layer3 zones",
67 description
=> "enable masquerade for this subnet if pve-firewall",
69 # #cloudinit, dhcp options
72 # description => "static routes [network=<network>:gateway=<ip>,network=<network>:gateway=<ip>,... ]",
76 description
=> "dns api server",
80 description
=> "reverse dns api server",
83 type
=> 'string', format
=> 'dns-name',
84 description
=> "dns domain zone ex: mydomain.com",
87 type
=> 'string', format
=> 'dns-name',
88 description
=> "reverse dns zone ex: 0.168.192.in-addr.arpa",
91 type
=> 'string', format
=> 'dns-name',
92 description
=> "dns domain zone prefix ex: 'adm' -> <hostname>.adm.mydomain.com",
96 description
=> "use a specific ipam",
103 vnet
=> { optional
=> 0 },
104 gateway
=> { optional
=> 1 },
105 # routes => { optional => 1 },
106 snat
=> { optional
=> 1 },
107 dns
=> { optional
=> 1 },
108 reversedns
=> { optional
=> 1 },
109 dnszone
=> { optional
=> 1 },
110 reversednszone
=> { optional
=> 1 },
111 dnszoneprefix
=> { optional
=> 1 },
112 ipam
=> { optional
=> 0 },
117 my ($class, $subnetid, $subnet, $old_subnet) = @_;
119 my $cidr = $subnetid =~ s/-/\//r
;
120 my $subnet_matcher = subnet_matcher
($cidr);
122 my $vnetid = $subnet->{vnet
};
123 my $gateway = $subnet->{gateway
};
124 my $ipam = $subnet->{ipam
};
125 my $dns = $subnet->{dns
};
126 my $dnszone = $subnet->{dnszone
};
127 my $reversedns = $subnet->{reversedns
};
128 my $reversednszone = $subnet->{reversednszone
};
130 my $old_gateway = $old_subnet->{gateway
} if $old_subnet;
133 my $vnet = PVE
::Network
::SDN
::Vnets
::get_vnet
($vnetid);
134 raise_param_exc
({ vnet
=> "$vnetid don't exist"}) if !$vnet;
137 my ($ip, $mask) = split(/\//, $cidr);
138 #for /32 pointopoint, we allow gateway outside the subnet
139 raise_param_exc
({ gateway
=> "$gateway is not in subnet $subnetid"}) if $gateway && !$subnet_matcher->($gateway) && $mask != 32;
141 raise_param_exc
({ dns
=> "missing dns provider"}) if $dnszone && !$dns;
142 raise_param_exc
({ dnszone
=> "missing dns zone"}) if $dns && !$dnszone;
143 raise_param_exc
({ reversedns
=> "missing dns provider"}) if $reversednszone && !$reversedns;
144 raise_param_exc
({ reversednszone
=> "missing dns zone"}) if $reversedns && !$reversednszone;
145 raise_param_exc
({ reversedns
=> "missing forward dns zone"}) if $reversednszone && !$dnszone;
148 my $ipam_cfg = PVE
::Network
::SDN
::Ipams
::config
();
149 my $plugin_config = $ipam_cfg->{ids
}->{$ipam};
150 raise_param_exc
({ ipam
=> "$ipam not existing"}) if !$plugin_config;
151 my $plugin = PVE
::Network
::SDN
::Ipams
::Plugin-
>lookup($plugin_config->{type
});
152 $plugin->add_subnet($plugin_config, $subnetid, $subnet);
155 if (!defined($gateway) && $old_gateway) {
157 PVE
::Network
::SDN
::Subnets
::del_ip
($subnetid, $old_subnet, $old_gateway);
161 if(!$old_gateway || $gateway && $gateway ne $old_gateway) {
162 PVE
::Network
::SDN
::Subnets
::add_ip
($subnetid, $subnet, $gateway);
165 #delete old ip after update
166 if($gateway && $old_gateway && $gateway ne $old_gateway) {
168 PVE
::Network
::SDN
::Subnets
::del_ip
($subnetid, $old_subnet, $old_gateway);
176 my ($class, $subnetid, $subnet_cfg, $vnet_cfg) = @_;