use PVE::Network::SDN::VxlanPlugin;
use PVE::Network::SDN::VnetPlugin;
use PVE::Network::SDN::FrrPlugin;
+use PVE::Network::SDN::OVSFaucetPlugin;
+use PVE::Network::SDN::FaucetPlugin;
+
use Storable qw(dclone);
use PVE::JSONSchema qw(get_standard_option);
use PVE::RPCEnvironment;
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;
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::FaucetPlugin->register();
PVE::Network::SDN::Plugin->init();
$controller_plugin->generate_controller_transport_config($plugin_config, $controller, $id, $uplinks, $config);
}
}
+ } elsif ($role eq 'vnet') {
+ my $transportid = $plugin_config->{transportzone};
+ if ($transportid) {
+ my $transport = $sdn_cfg->{ids}->{$transportid};
+ if ($transport) {
+ my $controllerid = $transport->{controller};
+ if ($controllerid) {
+ my $controller = $sdn_cfg->{ids}->{$controllerid};
+ if ($controller) {
+ my $controller_plugin = PVE::Network::SDN::Plugin->lookup($controller->{type});
+ $controller_plugin->generate_controller_vnet_config($plugin_config, $controller, $transportid, $id, $config);
+ }
+ }
+ }
+ }
}
}
--- /dev/null
+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 base('PVE::Network::SDN::Plugin');
+
+sub type {
+ return 'faucet';
+}
+
+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();
+}
+
+1;
+
-SOURCES=Plugin.pm VnetPlugin.pm VlanPlugin.pm VxlanPlugin.pm FrrPlugin.pm
+SOURCES=Plugin.pm VnetPlugin.pm VlanPlugin.pm VxlanPlugin.pm FrrPlugin.pm FaucetPlugin.pm OVSFaucetPlugin.pm
PERL5DIR=${DESTDIR}/usr/share/perl5
--- /dev/null
+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;
+
+
die "please implement inside plugin";
}
+sub generate_controller_vnet_config {
+ my ($class, $plugin_config, $controller, $transportid, $vnetid, $config) = @_;
+
+}
+
sub write_controller_config {
my ($class, $plugin_config, $config) = @_;