summaryrefslogtreecommitdiff
path: root/src/PVE/API2/Network/SDN/Zones
diff options
context:
space:
mode:
Diffstat (limited to 'src/PVE/API2/Network/SDN/Zones')
-rw-r--r--src/PVE/API2/Network/SDN/Zones/Content.pm85
-rw-r--r--src/PVE/API2/Network/SDN/Zones/Makefile8
-rw-r--r--src/PVE/API2/Network/SDN/Zones/Status.pm111
3 files changed, 204 insertions, 0 deletions
diff --git a/src/PVE/API2/Network/SDN/Zones/Content.pm b/src/PVE/API2/Network/SDN/Zones/Content.pm
new file mode 100644
index 0000000..66f49df
--- /dev/null
+++ b/src/PVE/API2/Network/SDN/Zones/Content.pm
@@ -0,0 +1,85 @@
+package PVE::API2::Network::SDN::Zones::Content;
+
+use strict;
+use warnings;
+use Data::Dumper;
+
+use PVE::SafeSyslog;
+use PVE::Cluster;
+use PVE::INotify;
+use PVE::Exception qw(raise_param_exc);
+use PVE::RPCEnvironment;
+use PVE::RESTHandler;
+use PVE::JSONSchema qw(get_standard_option);
+use PVE::Network::SDN;
+
+use base qw(PVE::RESTHandler);
+
+__PACKAGE__->register_method ({
+ name => 'index',
+ path => '',
+ method => 'GET',
+ description => "List zone content.",
+ permissions => {
+ check => ['perm', '/sdn/zones/{zone}', ['SDN.Audit'], any => 1],
+ },
+ protected => 1,
+ proxyto => 'node',
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node'),
+ zone => get_standard_option('pve-sdn-zone-id', {
+ completion => \&PVE::Network::SDN::Zones::complete_sdn_zone,
+ }),
+ },
+ },
+ returns => {
+ type => 'array',
+ items => {
+ type => "object",
+ properties => {
+ vnet => {
+ description => "Vnet identifier.",
+ type => 'string',
+ },
+ status => {
+ description => "Status.",
+ type => 'string',
+ optional => 1,
+ },
+ statusmsg => {
+ description => "Status details",
+ type => 'string',
+ optional => 1,
+ },
+ },
+ },
+ links => [ { rel => 'child', href => "{vnet}" } ],
+ },
+ code => sub {
+ my ($param) = @_;
+
+ my $rpcenv = PVE::RPCEnvironment::get();
+
+ my $authuser = $rpcenv->get_user();
+
+ my $zoneid = $param->{zone};
+
+ my $res = [];
+
+ my ($zone_status, $vnet_status) = PVE::Network::SDN::status();
+
+ foreach my $id (keys %{$vnet_status}) {
+ if ($vnet_status->{$id}->{zone} eq $zoneid) {
+ my $item->{vnet} = $id;
+ $item->{status} = $vnet_status->{$id}->{'status'};
+ $item->{statusmsg} = $vnet_status->{$id}->{'statusmsg'};
+ push @$res,$item;
+ }
+ }
+
+ return $res;
+ }});
+
+1;
diff --git a/src/PVE/API2/Network/SDN/Zones/Makefile b/src/PVE/API2/Network/SDN/Zones/Makefile
new file mode 100644
index 0000000..9b0a42b
--- /dev/null
+++ b/src/PVE/API2/Network/SDN/Zones/Makefile
@@ -0,0 +1,8 @@
+SOURCES=Status.pm Content.pm
+
+
+PERL5DIR=${DESTDIR}/usr/share/perl5
+
+.PHONY: install
+install:
+ for i in ${SOURCES}; do install -D -m 0644 $$i ${PERL5DIR}/PVE/API2/Network/SDN/Zones/$$i; done
diff --git a/src/PVE/API2/Network/SDN/Zones/Status.pm b/src/PVE/API2/Network/SDN/Zones/Status.pm
new file mode 100644
index 0000000..17de68f
--- /dev/null
+++ b/src/PVE/API2/Network/SDN/Zones/Status.pm
@@ -0,0 +1,111 @@
+package PVE::API2::Network::SDN::Zones::Status;
+
+use strict;
+use warnings;
+
+use File::Path;
+use File::Basename;
+use PVE::Tools;
+use PVE::INotify;
+use PVE::Cluster;
+use PVE::API2::Network::SDN::Zones::Content;
+use PVE::RESTHandler;
+use PVE::RPCEnvironment;
+use PVE::JSONSchema qw(get_standard_option);
+use PVE::Exception qw(raise_param_exc);
+
+use base qw(PVE::RESTHandler);
+
+__PACKAGE__->register_method ({
+ subclass => "PVE::API2::Network::SDN::Zones::Content",
+ path => '{zone}/content',
+});
+
+__PACKAGE__->register_method ({
+ name => 'index',
+ path => '',
+ method => 'GET',
+ description => "Get status for all zones.",
+ permissions => {
+ description => "Only list entries where you have 'SDN.Audit'",
+ user => 'all',
+ },
+ protected => 1,
+ proxyto => 'node',
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node')
+ },
+ },
+ returns => {
+ type => 'array',
+ items => {
+ type => "object",
+ properties => {
+ zone => get_standard_option('pve-sdn-zone-id'),
+ status => {
+ description => "Status of zone",
+ type => 'string',
+ enum => ['available', 'pending', 'error'],
+ },
+ },
+ },
+ links => [ { rel => 'child', href => "{zone}" } ],
+ },
+ code => sub {
+ my ($param) = @_;
+
+ my $rpcenv = PVE::RPCEnvironment::get();
+ my $authuser = $rpcenv->get_user();
+
+ my $localnode = PVE::INotify::nodename();
+
+ my $res = [];
+
+ my ($zone_status, $vnet_status) = PVE::Network::SDN::status();
+
+ foreach my $id (sort keys %{$zone_status}) {
+ my $item->{zone} = $id;
+ $item->{status} = $zone_status->{$id}->{'status'};
+ push @$res, $item;
+ }
+
+ return $res;
+ }});
+
+__PACKAGE__->register_method ({
+ name => 'diridx',
+ path => '{zone}',
+ method => 'GET',
+ description => "",
+ permissions => {
+ check => ['perm', '/sdn/zones/{zone}', ['SDN.Audit'], any => 1],
+ },
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node'),
+ zone => get_standard_option('pve-sdn-zone-id'),
+ },
+ },
+ returns => {
+ type => 'array',
+ items => {
+ type => "object",
+ properties => {
+ subdir => { type => 'string' },
+ },
+ },
+ links => [ { rel => 'child', href => "{subdir}" } ],
+ },
+ code => sub {
+ my ($param) = @_;
+ my $res = [
+ { subdir => 'content' },
+ ];
+
+ return $res;
+ }});
+
+1;