For true sdn, We have 2 plugins, 1 for dataplane (switch), 1 for controlplane (controller)
rename: - Frr to EvpnController - Faucet to FaucetController - OvsFaucet to Faucet Signed-off-by: Alexandre Derumier <aderum...@odiso.com> --- PVE/API2/Network/SDN.pm | 4 +- PVE/Network/SDN.pm | 8 +- .../{FrrPlugin.pm => EvpnControllerPlugin.pm} | 4 +- PVE/Network/SDN/FaucetControllerPlugin.pm | 113 +++++++++++++++++ PVE/Network/SDN/FaucetPlugin.pm | 117 ++++++------------ PVE/Network/SDN/Makefile | 2 +- PVE/Network/SDN/OVSFaucetPlugin.pm | 76 ------------ test/documentation.txt | 4 +- 8 files changed, 164 insertions(+), 164 deletions(-) rename PVE/Network/SDN/{FrrPlugin.pm => EvpnControllerPlugin.pm} (99%) create mode 100644 PVE/Network/SDN/FaucetControllerPlugin.pm delete mode 100644 PVE/Network/SDN/OVSFaucetPlugin.pm diff --git a/PVE/API2/Network/SDN.pm b/PVE/API2/Network/SDN.pm index cbd393e..8294cb8 100644 --- a/PVE/API2/Network/SDN.pm +++ b/PVE/API2/Network/SDN.pm @@ -11,9 +11,9 @@ use PVE::Network::SDN::Plugin; use PVE::Network::SDN::VlanPlugin; use PVE::Network::SDN::VxlanPlugin; use PVE::Network::SDN::VnetPlugin; -use PVE::Network::SDN::FrrPlugin; -use PVE::Network::SDN::OVSFaucetPlugin; +use PVE::Network::SDN::FaucetControllerPlugin; use PVE::Network::SDN::FaucetPlugin; +use PVE::Network::SDN::EvpnControllerPlugin; use PVE::Network::SDN::EvpnPlugin; use Storable qw(dclone); diff --git a/PVE/Network/SDN.pm b/PVE/Network/SDN.pm index 8e96084..8e8e637 100644 --- a/PVE/Network/SDN.pm +++ b/PVE/Network/SDN.pm @@ -12,18 +12,18 @@ use PVE::Network::SDN::Plugin; use PVE::Network::SDN::VnetPlugin; use PVE::Network::SDN::VlanPlugin; use PVE::Network::SDN::VxlanPlugin; -use PVE::Network::SDN::FrrPlugin; -use PVE::Network::SDN::OVSFaucetPlugin; use PVE::Network::SDN::FaucetPlugin; +use PVE::Network::SDN::FaucetControllerPlugin; use PVE::Network::SDN::EvpnPlugin; +use PVE::Network::SDN::EvpnControllerPlugin; PVE::Network::SDN::VnetPlugin->register(); PVE::Network::SDN::VlanPlugin->register(); PVE::Network::SDN::VxlanPlugin->register(); -PVE::Network::SDN::FrrPlugin->register(); -PVE::Network::SDN::OVSFaucetPlugin->register(); +PVE::Network::SDN::FaucetControllerPlugin->register(); PVE::Network::SDN::FaucetPlugin->register(); PVE::Network::SDN::EvpnPlugin->register(); +PVE::Network::SDN::EvpnControllerPlugin->register(); PVE::Network::SDN::Plugin->init(); diff --git a/PVE/Network/SDN/FrrPlugin.pm b/PVE/Network/SDN/EvpnControllerPlugin.pm similarity index 99% rename from PVE/Network/SDN/FrrPlugin.pm rename to PVE/Network/SDN/EvpnControllerPlugin.pm index 3410844..b2c9345 100644 --- a/PVE/Network/SDN/FrrPlugin.pm +++ b/PVE/Network/SDN/EvpnControllerPlugin.pm @@ -1,4 +1,4 @@ -package PVE::Network::SDN::FrrPlugin; +package PVE::Network::SDN::EvpnControllerPlugin; use strict; use warnings; @@ -10,7 +10,7 @@ use PVE::JSONSchema qw(get_standard_option); use base('PVE::Network::SDN::Plugin'); sub type { - return 'frr'; + return 'evpncontroller'; } sub plugindata { diff --git a/PVE/Network/SDN/FaucetControllerPlugin.pm b/PVE/Network/SDN/FaucetControllerPlugin.pm new file mode 100644 index 0000000..ee15bdf --- /dev/null +++ b/PVE/Network/SDN/FaucetControllerPlugin.pm @@ -0,0 +1,113 @@ +package PVE::Network::SDN::FaucetControllerPlugin; + +use strict; +use warnings; +use PVE::Network::SDN::Plugin; +use PVE::Tools; +use PVE::INotify; +use PVE::JSONSchema qw(get_standard_option); +use CPAN::Meta::YAML; +use Encode; + +use base('PVE::Network::SDN::Plugin'); + +sub type { + return 'faucetcontroller'; +} + +sub plugindata { + return { + role => 'controller', + }; +} + +sub properties { + return { + }; +} + +# Plugin implementation +sub generate_controller_config { + my ($class, $plugin_config, $router, $id, $uplinks, $config) = @_; + +} + +sub generate_controller_transport_config { + my ($class, $plugin_config, $router, $id, $uplinks, $config) = @_; + + my $dpid = $plugin_config->{'dp-id'}; + my $dphex = printf("%x",$dpid); + + my $transport_config = { + dp_id => $dphex, + hardware => "Open vSwitch", + }; + + $config->{faucet}->{dps}->{$id} = $transport_config; + +} + + +sub generate_controller_vnet_config { + my ($class, $plugin_config, $controller, $transportid, $vnetid, $config) = @_; + + my $mac = $plugin_config->{mac}; + my $ipv4 = $plugin_config->{ipv4}; + my $ipv6 = $plugin_config->{ipv6}; + my $tag = $plugin_config->{tag}; + my $alias = $plugin_config->{alias}; + + my @ips = (); + push @ips, $ipv4 if $ipv4; + push @ips, $ipv6 if $ipv6; + + my $vlan_config = { vid => $tag }; + + $vlan_config->{description} = $alias if $alias; + $vlan_config->{faucet_mac} = $mac if $mac; + $vlan_config->{faucet_vips} = \@ips if scalar @ips > 0; + + $config->{faucet}->{vlans}->{$vnetid} = $vlan_config; + + push(@{$config->{faucet}->{routers}->{$transportid}->{vlans}} , $vnetid); + +} + +sub on_delete_hook { + my ($class, $routerid, $sdn_cfg) = @_; + +} + +sub on_update_hook { + my ($class, $routerid, $sdn_cfg) = @_; + +} + +sub write_controller_config { + my ($class, $plugin_config, $config) = @_; + + my $rawconfig = encode('UTF-8', CPAN::Meta::YAML::Dump($config->{faucet})); + + return if !$rawconfig; + return if !-d "/etc/faucet"; + + my $frr_config_file = "/etc/faucet/faucet.yaml"; + + my $writefh = IO::File->new($frr_config_file,">"); + print $writefh $rawconfig; + $writefh->close(); +} + +sub reload_controller { + my ($class) = @_; + + my $conf_file = "/etc/faucet/faucet.yaml"; + my $bin_path = "/usr/bin/faucet"; + + if (-e $conf_file && -e $bin_path) { + PVE::Tools::run_command(['systemctl', 'reload', 'faucet']); + } +} + +1; + diff --git a/PVE/Network/SDN/FaucetPlugin.pm b/PVE/Network/SDN/FaucetPlugin.pm index fe75efb..9422ee7 100644 --- a/PVE/Network/SDN/FaucetPlugin.pm +++ b/PVE/Network/SDN/FaucetPlugin.pm @@ -2,14 +2,9 @@ package PVE::Network::SDN::FaucetPlugin; use strict; use warnings; -use PVE::Network::SDN::Plugin; -use PVE::Tools; -use PVE::INotify; -use PVE::JSONSchema qw(get_standard_option); -use CPAN::Meta::YAML; -use Encode; +use PVE::Network::SDN::VlanPlugin; -use base('PVE::Network::SDN::Plugin'); +use base('PVE::Network::SDN::VlanPlugin'); sub type { return 'faucet'; @@ -17,97 +12,65 @@ sub type { sub plugindata { return { - role => 'controller', + role => 'transport', }; } sub properties { return { + 'dp-id' => { + type => 'integer', + description => 'Faucet dataplane id', + }, }; } -# Plugin implementation -sub generate_controller_config { - my ($class, $plugin_config, $router, $id, $uplinks, $config) = @_; +sub options { + return { + 'dp-id' => { optional => 0 }, + 'uplink-id' => { optional => 0 }, + 'controller' => { optional => 0 }, + 'vlan-allowed' => { optional => 1 }, + }; } -sub generate_controller_transport_config { - my ($class, $plugin_config, $router, $id, $uplinks, $config) = @_; +# Plugin implementation +sub generate_sdn_config { + my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $uplinks, $config) = @_; + my $mtu = $vnet->{mtu}; + my $uplink = $plugin_config->{'uplink-id'}; my $dpid = $plugin_config->{'dp-id'}; - my $dphex = printf("%x",$dpid); - - my $transport_config = { - dp_id => $dphex, - hardware => "Open vSwitch", - }; - - $config->{faucet}->{dps}->{$id} = $transport_config; - -} - - -sub generate_controller_vnet_config { - my ($class, $plugin_config, $controller, $transportid, $vnetid, $config) = @_; - - my $mac = $plugin_config->{mac}; - my $ipv4 = $plugin_config->{ipv4}; - my $ipv6 = $plugin_config->{ipv6}; - my $tag = $plugin_config->{tag}; - my $alias = $plugin_config->{alias}; + my $dphex = printf("%x",$dpid); #fixme :should be 16characters hex - my @ips = (); - push @ips, $ipv4 if $ipv4; - push @ips, $ipv6 if $ipv6; + my $iface = $uplinks->{$uplink}->{name}; + $iface = "uplink${uplink}" if !$iface; - my $vlan_config = { vid => $tag }; + #tagged interface + my @iface_config = (); + push @iface_config, "ovs_type OVSPort"; + push @iface_config, "ovs_bridge $zoneid"; + push @iface_config, "ovs_mtu $mtu" if $mtu; + push(@{$config->{$iface}}, @iface_config) if !$config->{$iface}; - $vlan_config->{description} = $alias if $alias; - $vlan_config->{faucet_mac} = $mac if $mac; - $vlan_config->{faucet_vips} = \@ips if scalar @ips > 0; + #vnet bridge + @iface_config = (); + push @iface_config, "ovs_port $iface"; + push @iface_config, "ovs_type OVSBridge"; + push @iface_config, "ovs_mtu $mtu" if $mtu; - $config->{faucet}->{vlans}->{$vnetid} = $vlan_config; - - push(@{$config->{faucet}->{routers}->{$transportid}->{vlans}} , $vnetid); - -} + push @iface_config, "ovs_extra set bridge $zoneid other-config:datapath-id=$dphex"; + push @iface_config, "ovs_extra set bridge $zoneid other-config:disable-in-band=true"; + push @iface_config, "ovs_extra set bridge $zoneid fail_mode=secure"; + push @iface_config, "ovs_extra set-controller $vnetid tcp:127.0.0.1:6653"; -sub on_delete_hook { - my ($class, $routerid, $sdn_cfg) = @_; + push(@{$config->{$zoneid}}, @iface_config) if !$config->{$zoneid}; + return $config; } -sub on_update_hook { - my ($class, $routerid, $sdn_cfg) = @_; - -} - -sub write_controller_config { - my ($class, $plugin_config, $config) = @_; - - my $rawconfig = encode('UTF-8', CPAN::Meta::YAML::Dump($config->{faucet})); - - return if !$rawconfig; - return if !-d "/etc/faucet"; - - my $frr_config_file = "/etc/faucet/faucet.yaml"; - - my $writefh = IO::File->new($frr_config_file,">"); - print $writefh $rawconfig; - $writefh->close(); -} - -sub reload_controller { - my ($class) = @_; - - my $conf_file = "/etc/faucet/faucet.yaml"; - my $bin_path = "/usr/bin/faucet"; - - if (-e $conf_file && -e $bin_path) { - PVE::Tools::run_command(['systemctl', 'reload', 'faucet']); - } -} 1; + diff --git a/PVE/Network/SDN/Makefile b/PVE/Network/SDN/Makefile index 4528dcf..ba8f903 100644 --- a/PVE/Network/SDN/Makefile +++ b/PVE/Network/SDN/Makefile @@ -1,4 +1,4 @@ -SOURCES=Plugin.pm VnetPlugin.pm VlanPlugin.pm VxlanPlugin.pm FrrPlugin.pm FaucetPlugin.pm OVSFaucetPlugin.pm EvpnPlugin.pm +SOURCES=Plugin.pm VnetPlugin.pm VlanPlugin.pm VxlanPlugin.pm FaucetControllerPlugin.pm FaucetPlugin.pm EvpnPlugin.pm EvpnControllerPlugin.pm PERL5DIR=${DESTDIR}/usr/share/perl5 diff --git a/PVE/Network/SDN/OVSFaucetPlugin.pm b/PVE/Network/SDN/OVSFaucetPlugin.pm deleted file mode 100644 index 7a665f3..0000000 --- a/PVE/Network/SDN/OVSFaucetPlugin.pm +++ /dev/null @@ -1,76 +0,0 @@ -package PVE::Network::SDN::OVSFaucetPlugin; - -use strict; -use warnings; -use PVE::Network::SDN::VlanPlugin; - -use base('PVE::Network::SDN::VlanPlugin'); - -sub type { - return 'ovsfaucet'; -} - -sub plugindata { - return { - role => 'transport', - }; -} - -sub properties { - return { - 'dp-id' => { - type => 'integer', - description => 'Faucet dataplane id', - }, - }; -} - -sub options { - - return { - 'dp-id' => { optional => 0 }, - 'uplink-id' => { optional => 0 }, - 'controller' => { optional => 0 }, - 'vlan-allowed' => { optional => 1 }, - }; -} - -# Plugin implementation -sub generate_sdn_config { - my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $uplinks, $config) = @_; - - my $mtu = $vnet->{mtu}; - my $uplink = $plugin_config->{'uplink-id'}; - my $dpid = $plugin_config->{'dp-id'}; - my $dphex = printf("%x",$dpid); #fixme :should be 16characters hex - - my $iface = $uplinks->{$uplink}->{name}; - $iface = "uplink${uplink}" if !$iface; - - #tagged interface - my @iface_config = (); - push @iface_config, "ovs_type OVSPort"; - push @iface_config, "ovs_bridge $zoneid"; - push @iface_config, "ovs_mtu $mtu" if $mtu; - push(@{$config->{$iface}}, @iface_config) if !$config->{$iface}; - - #vnet bridge - @iface_config = (); - push @iface_config, "ovs_port $iface"; - push @iface_config, "ovs_type OVSBridge"; - push @iface_config, "ovs_mtu $mtu" if $mtu; - - push @iface_config, "ovs_extra set bridge $zoneid other-config:datapath-id=$dphex"; - push @iface_config, "ovs_extra set bridge $zoneid other-config:disable-in-band=true"; - push @iface_config, "ovs_extra set bridge $zoneid fail_mode=secure"; - push @iface_config, "ovs_extra set-controller $vnetid tcp:127.0.0.1:6653"; - - push(@{$config->{$zoneid}}, @iface_config) if !$config->{$zoneid}; - - return $config; -} - - -1; - - diff --git a/test/documentation.txt b/test/documentation.txt index a0d7a23..3f70987 100644 --- a/test/documentation.txt +++ b/test/documentation.txt @@ -11,8 +11,8 @@ pvesh create /cluster/sdn/ --sdn vxlanmulticastzone --type vxlan --uplink-id 1 - #create a layer2 vxlan unicast transportzone pvesh create /cluster/sdn/ --sdn vxlanunicastzone --type vxlan --uplink-id 1 --unicast-address 192.168.0.1,192.168.0.2,192.168.0.3 -#create a frr controller -pvesh create /cluster/sdn/ --sdn frrrouter1 --type frr --uplink-id 1 --peers 192.168.0.1,192.168.0.2,192.168.0.3 --asn 1234 --gateway-nodes pxnode1,pxnode2 --gateway-external-peers 192.168.0.253,192.168.0.254 +#create an controller +pvesh create /cluster/sdn/ --sdn frrrouter1 --type evpncontroller --uplink-id 1 --peers 192.168.0.1,192.168.0.2,192.168.0.3 --asn 1234 --gateway-nodes pxnode1,pxnode2 --gateway-external-peers 192.168.0.253,192.168.0.254 #create a layer2 vxlan bgpevpn transportzone pvesh create /cluster/sdn/ --sdn layer2evpnzone --type evpn --uplink-id 1 --controller frrrouter1 -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel