[#199] Missing schema changes when user has no permissions on DB

This fixes many glitches with the schema deployment:
- silently ignoring real failure modes such as user not having
correct permissions on the DB
- a couple of broken upgrade steps
- adds --reset so schema can be fully redeployed
This commit is contained in:
Oliver Gorwits
2015-02-04 21:43:44 +00:00
parent fe612df578
commit e99f5ee410
8 changed files with 78 additions and 11 deletions

View File

@@ -1,3 +1,9 @@
2.031003 - 2015-02-04
[BUG FIXES]
* [#199] Missing schema changes when user has no permissions on DB
2.031002 - 2015-02-04
[BUG FIXES]

View File

@@ -50,15 +50,20 @@ netdisco-db-deploy - Database deployment for Netdisco
This script upgrades or initialises a Netdisco database schema.
~netdisco/bin/netdisco-db-deploy [--reset]
This script connects to the database and runs without user interaction. If
there's no Nedisco schema, it is deployed. If there's an unversioned schema
then versioning is added, and updates applied. Otherwise only necessary
updates are applied to an already versioned schema.
Pre-existing requirements are that there be a database table created and a
user with rights to create tables in that database. Both the table and user
name must match those configured in your environment YAML file (default
C<~/environments/deployment.yml>).
Simply run this script, which connects to the database and runs without user
interaction. If there's no Nedisco schema, it is deployed. If there's an
unversioned schema then versioning is added, and updates applied. Otherwise
only necessary updates are applied to an already versioned schema.
If you wish to force the redeployment of all database configuration, pass the
C<--reset> argument on the command line.
=head1 VERSIONS
@@ -74,7 +79,11 @@ Version 2 is the "classic" Netdisco database schema as of Netdisco 1.1
=item *
Version 5 (and onwards) adds patches for Netdisco 1.2
Versions 5 to 16 add patches for Netdisco 1.2
=item *
Version 17 onwards deploys schema upgrades for Netdisco 2
=back
@@ -82,6 +91,15 @@ Version 5 (and onwards) adds patches for Netdisco 1.2
my $schema = schema('netdisco');
if (scalar @ARGV and $ARGV[0] and $ARGV[0] eq '--reset') {
$schema->storage->dbh_do(
sub {
my ($storage, $dbh, @args) = @_;
$dbh->do('DROP TABLE dbix_class_schema_versions');
},
);
}
# installs the dbix_class_schema_versions table with version "1"
# which corresponds to an empty schema
if (not $schema->get_db_version) {
@@ -112,8 +130,9 @@ for (my $i = $db_version; $i < $target_version; $i++) {
$schema->upgrade_single_step($i, $i + 1);
}
catch {
$schema->_set_db_version({version => $i + 1});
}
warn "Error: $_"
if $_ !~ m/(does not exist|already exists)/;
};
}
exit 0;

View File

@@ -11,7 +11,7 @@ __PACKAGE__->load_namespaces(
);
our # try to hide from kwalitee
$VERSION = 39; # schema version used for upgrades, keep as integer
$VERSION = 40; # schema version used for upgrades, keep as integer
use Path::Class;
use File::Basename;

View File

@@ -1,5 +1,7 @@
BEGIN;
ALTER TABLE admin DROP CONSTRAINT IF EXISTS admin_pkey;
ALTER TABLE admin ADD PRIMARY KEY (job);
COMMIT;

View File

@@ -12,6 +12,4 @@
BEGIN;
DELETE n1.* FROM node n1 INNER JOIN (SELECT mac, switch, port from node GROUP BY mac, switch, port HAVING count(*) > 1) n2 ON n1.mac = n2.mac AND n1.switch = n2.switch AND n1.port = n2.port AND n1.vlan = '0';
COMMIT;

View File

@@ -0,0 +1,17 @@
-- clean up node table where vlan = 0 and vlan = <another number>
--
-- DELETE n1.*
-- FROM node n1 INNER JOIN
-- (SELECT mac, switch, port from node
-- GROUP BY mac, switch, port
-- HAVING count(*) > 1) n2
-- ON n1.mac = n2.mac
-- AND n1.switch = n2.switch
-- AND n1.port = n2.port
-- AND n1.vlan = '0';
BEGIN;
DELETE FROM node AS n1 USING (SELECT mac, switch, port from node GROUP BY mac, switch, port HAVING count(*) > 1) n2 WHERE n1.mac = n2.mac AND n1.switch = n2.switch AND n1.port = n2.port AND n1.vlan = '0';
COMMIT;

View File

@@ -177,6 +177,13 @@ following commands into a shell script and call it nightly from C<cron>:
This will keep 30 days of backups. You don't need to stop Netdisco during the
backup.
=head1 Database Schema Redeployment
The database schema can be fully redeployed (even over an existing
installation, in a safe way) using the following command:
~netdisco/bin/netdisco-db-deploy --reset
=head1 Further Reading...
Other ways to run and host the web application can be found in the

View File

@@ -36,7 +36,25 @@ but they are backwards compatible.
=back
=head1 2.031000
=head1 2.031003
=head2 Health Advice
This release will I<once again> remove from the database spurious Node
(workstation, printer, etc) entries on vlan 0, which were causing dupliate
entries in the web interface. We advise that you back up the database prior to
upgrade:
/usr/bin/pg_dump -F p --create -f netdisco-pgsql.dump netdisco
=head2 General Notices
=head1 2.031003
The database schema can be fully redeployed (even over an existing
installation, in a safe way) using the following command:
~netdisco/bin/netdisco-db-deploy --reset
=head2 General Notices