fixed only free ports in device ports view (showing free ports TODO)

This commit is contained in:
Oliver Gorwits
2019-08-20 11:13:52 +01:00
parent 22302114cb
commit d45745dd1d
3 changed files with 66 additions and 28 deletions

View File

@@ -250,24 +250,13 @@ The JOIN is of type "LEFT" in case there isn't any such node.
=cut
__PACKAGE__->belongs_to( last_node => 'App::Netdisco::DB::Result::Node',
sub {
my $args = shift;
return {
"$args->{foreign_alias}.mac" => { '=' =>
$args->{self_resultsource}->schema->resultset('Node')->search({
switch => { -ident => "$args->{self_alias}.ip"},
port => { -ident => "$args->{self_alias}.port"}
},{
rows => 1,
order_by => { -desc => ['time_last'] },
columns => 'mac',
alias => 'lastnodesub'
})->as_query
}
};
},
{ join_type => 'LEFT' },
__PACKAGE__->belongs_to(
last_node => 'App::Netdisco::DB::Result::Virtual::LastNode', {
'foreign.switch' => 'self.ip',
'foreign.port' => 'self.port',
}, {
join_type => 'LEFT',
}
);
=head2 vlans

View File

@@ -0,0 +1,54 @@
package App::Netdisco::DB::Result::Virtual::LastNode;
use strict;
use warnings;
use base 'DBIx::Class::Core';
__PACKAGE__->table_class('DBIx::Class::ResultSource::View');
__PACKAGE__->table('last_node');
__PACKAGE__->result_source_instance->is_virtual(1);
__PACKAGE__->result_source_instance->view_definition(<<ENDSQL
SELECT DISTINCT ON (switch, port) * FROM node
ORDER BY switch, port, time_last desc
ENDSQL
);
__PACKAGE__->add_columns(
"mac",
{ data_type => "macaddr", is_nullable => 0 },
"switch",
{ data_type => "inet", is_nullable => 0 },
"port",
{ data_type => "text", is_nullable => 0 },
"active",
{ data_type => "boolean", is_nullable => 1 },
"oui",
{ data_type => "varchar", is_nullable => 1, size => 8 },
"time_first",
{
data_type => "timestamp",
default_value => \"current_timestamp",
is_nullable => 1,
original => { default_value => \"now()" },
},
"time_recent",
{
data_type => "timestamp",
default_value => \"current_timestamp",
is_nullable => 1,
original => { default_value => \"now()" },
},
"time_last",
{
data_type => "timestamp",
default_value => \"current_timestamp",
is_nullable => 1,
original => { default_value => \"now()" },
},
"vlan",
{ data_type => "text", is_nullable => 0, default_value => '0' },
);
1;

View File

@@ -23,22 +23,17 @@ __PACKAGE__->result_source_instance->view_definition(<<ENDSQL
AND (last_node.time_last IS NULL OR (age(now(), last_node.time_last)) > ?::interval) )
THEN 1
WHEN ( dp.type != 'propVirtual' AND dp.up_admin = 'up' AND dp.up != 'up'
AND (last_node.time_last IS NULL OR
(age(now(), to_timestamp(extract(epoch from d.last_discover) - (d.uptime - dp.lastchange)/100)) > ?::interval)) )
AND (age(now(), to_timestamp(extract(epoch from d.last_discover) - (d.uptime - dp.lastchange)/100)) > ?::interval) )
THEN 1
ELSE 0
END) as ports_free
FROM device d
LEFT JOIN device_port dp
ON d.ip = dp.ip
LEFT JOIN node last_node
ON last_node.mac = (
SELECT lastnodesub.mac
FROM node lastnodesub
WHERE port = dp.port AND switch = dp.ip
ORDER BY time_last DESC
LIMIT '1'
)
LEFT JOIN
( SELECT DISTINCT ON (switch, port) * FROM node
ORDER BY switch, port, time_last desc ) AS last_node
ON dp.port = last_node.port AND dp.ip = last_node.switch
GROUP BY d.dns, d.ip
ORDER BY d.dns, d.ip
ENDSQL