#929 implement first half of multi tenancy with tenant_databases setting

This commit is contained in:
Oliver Gorwits
2022-09-24 19:01:05 +01:00
parent b391f83d60
commit 1d5f3ce316
71 changed files with 355 additions and 205 deletions

View File

@@ -57,12 +57,12 @@ sub get_device {
# in case the management IP of one device is in use on another device,
# we first try to get an exact match for the IP as mgmt interface.
my $alias =
schema('netdisco')->resultset('DeviceIp')->find($ip, $ip)
schema(vars->{'tenant'})->resultset('DeviceIp')->find($ip, $ip)
||
schema('netdisco')->resultset('DeviceIp')->search({alias => $ip})->first;
schema(vars->{'tenant'})->resultset('DeviceIp')->search({alias => $ip})->first;
$ip = $alias->ip if defined $alias;
return schema('netdisco')->resultset('Device')->with_times
return schema(vars->{'tenant'})->resultset('Device')->with_times
->find_or_new({ip => $ip});
}
@@ -82,12 +82,12 @@ sub delete_device {
return 0 if not $device->in_storage;
my $happy = 0;
schema('netdisco')->txn_do(sub {
schema(vars->{'tenant'})->txn_do(sub {
# will delete everything related too...
schema('netdisco')->resultset('Device')
schema(vars->{'tenant'})->resultset('Device')
->search({ ip => $device->ip })->delete({archive_nodes => $archive});
schema('netdisco')->resultset('UserLog')->create({
schema(vars->{'tenant'})->resultset('UserLog')->create({
username => session('logged_in_user'),
userip => scalar eval {request->remote_address},
event => (sprintf "Delete device %s", $device->ip),
@@ -116,11 +116,11 @@ sub renumber_device {
return 0 if not $device->in_storage;
my $happy = 0;
schema('netdisco')->txn_do(sub {
schema(vars->{'tenant'})->txn_do(sub {
$device->renumber($new_ip)
or die "cannot renumber to: $new_ip"; # rollback
schema('netdisco')->resultset('UserLog')->create({
schema(vars->{'tenant'})->resultset('UserLog')->create({
username => session('logged_in_user'),
userip => scalar eval {request->remote_address},
event => (sprintf "Renumber device %s to %s", $ip, $new_ip),

View File

@@ -373,13 +373,13 @@ Nodes without topology information are not included.
sub make_graph {
my $G = Graph::Undirected->new();
my $devices = schema('netdisco')->resultset('Device')
my $devices = schema(vars->{'tenant'})->resultset('Device')
->search({}, { columns => [qw/ip dns location /] });
my $links = schema('netdisco')->resultset('DevicePort')
my $links = schema(vars->{'tenant'})->resultset('DevicePort')
->search({remote_ip => { -not => undef }},
{ columns => [qw/ip remote_ip speed remote_type/]});
my %aliases = map {$_->alias => $_->ip}
schema('netdisco')->resultset('DeviceIp')
schema(vars->{'tenant'})->resultset('DeviceIp')
->search({}, { columns => [qw/ip alias/] })->all;
my %devs = ( map {($_->ip => $_->dns)} $devices->all );

View File

@@ -120,7 +120,7 @@ sub _filter_nbname {
unless ( check_mac( $mac, $ip ) ) {
# Just assume it's the last MAC we saw this IP at.
my $node_ip = schema('netdisco')->resultset('NodeIp')
my $node_ip = schema(vars->{'tenant'})->resultset('NodeIp')
->single( { ip => $ip, -bool => 'active' } );
if ( !defined $node_ip ) {
@@ -158,7 +158,7 @@ sub store_nbt {
my ( $hash_ref, $now ) = @_;
$now ||= 'now()';
schema('netdisco')->resultset('NodeNbt')->update_or_create(
schema(vars->{'tenant'})->resultset('NodeNbt')->update_or_create(
{ mac => $hash_ref->{'mac'},
ip => $hash_ref->{'ip'},
nbname => $hash_ref->{'nbname'},

View File

@@ -175,13 +175,13 @@ sub store_arp {
debug sprintf 'store_arp - mac %s ip %s', $mac->as_ieee, $ip;
schema('netdisco')->txn_do(sub {
my $current = schema('netdisco')->resultset('NodeIp')
schema(vars->{'tenant'})->txn_do(sub {
my $current = schema(vars->{'tenant'})->resultset('NodeIp')
->search(
{ ip => $ip, -bool => 'active'},
{ columns => [qw/mac ip/] })->update({active => \'false'});
schema('netdisco')->resultset('NodeIp')
schema(vars->{'tenant'})->resultset('NodeIp')
->update_or_create(
{
mac => $mac->as_ieee,

View File

@@ -29,7 +29,7 @@ sub _email {
}
sub monitor {
my $monitor = schema('netdisco')->resultset('Virtual::NodeMonitor');
my $monitor = schema(vars->{'tenant'})->resultset('Virtual::NodeMonitor');
while (my $entry = $monitor->next) {
my $body = <<"end_body";

View File

@@ -152,7 +152,7 @@ sub get_port {
# accept either ip or dbic object
$device = get_device($device);
my $port = schema('netdisco')->resultset('DevicePort')
my $port = schema(vars->{'tenant'})->resultset('DevicePort')
->find({ip => $device->ip, port => $portname});
return $port;

View File

@@ -36,7 +36,7 @@ sub get_port_macs {
my $bindarray = [ { sqlt_datatype => "array" }, $fw_mac_list ];
my $macs
= schema('netdisco')->resultset('Virtual::PortMacs')->search({},
= schema(vars->{'tenant'})->resultset('Virtual::PortMacs')->search({},
{ bind => [$bindarray, $bindarray], select => [ 'mac', 'ip' ], group_by => [ 'mac', 'ip' ] } );
my $cursor = $macs->cursor;
while ( my @vals = $cursor->next ) {

View File

@@ -31,7 +31,7 @@ figures.
=cut
sub update_stats {
my $schema = schema('netdisco');
my $schema = schema(vars->{'tenant'});
eval { require SNMP::Info };
my $snmpinfo_ver = ($@ ? 'n/a' : $SNMP::Info::VERSION);
my $postgres_ver = pretty_version($schema->storage->dbh->{pg_server_version}, 2);