package App::Netdisco::DB::Result::Virtual::PortUtilization; use strict; use warnings; use base 'DBIx::Class::Core'; __PACKAGE__->table_class('DBIx::Class::ResultSource::View'); # NOTE this query is in `git grep 'THREE PLACES'` __PACKAGE__->table('port_utilization'); __PACKAGE__->result_source_instance->is_virtual(1); __PACKAGE__->result_source_instance->view_definition(< ?::interval) ) THEN 1 WHEN ( dp.type != 'propVirtual' AND dp.up_admin = 'up' AND dp.up != 'up' 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 ( 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 ); __PACKAGE__->add_columns( 'dns' => { data_type => 'text', }, 'ip' => { data_type => 'inet', }, 'port_count' => { data_type => 'integer', }, 'ports_in_use' => { data_type => 'integer', }, 'ports_shutdown' => { data_type => 'integer', }, 'ports_free' => { data_type => 'integer', }, ); 1;