fixed only free ports in device ports view (showing free ports TODO)
This commit is contained in:
@@ -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
|
||||
|
||||
54
lib/App/Netdisco/DB/Result/Virtual/LastNode.pm
Normal file
54
lib/App/Netdisco/DB/Result/Virtual/LastNode.pm
Normal 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;
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user