publik_dump: add invalidate_source and validate_target to prevent redondant cron job

This commit is contained in:
Nicolas Roche 2022-04-29 12:32:31 +02:00
parent 703d280d63
commit 839f5ee8d9
4 changed files with 174 additions and 7 deletions

62
publik-dump/README Normal file
View File

@ -0,0 +1,62 @@
La procédure de migration est la suivante :
* Récupérer le mot de passe w.c.s. de connexion à la base de donnée
Il faut récupérer le mot de passe sur la source,
https://demarches-ac-versailles.test.entrouvert.org/backoffice/settings/postgresql
puis récupérer le mot de passe via l'inspecteur
* Récupérer les identifiant de connexion à la base de donnée et le dsn sentry sur wcs-olap
Il faut récupérer ces information sur la cible, dans les fichiers wcs-olap.ini des instances déjà migrées.
* Recopier le certificat
* Redireger vers une page de travaux (pas encore possible en recette)
* Jouer une première fois le scripts pour cibler la bon noeud
(Le script doit être lancé sur le noeud où les crons ne sont pas désactivés)
publik_dump/publik_dump.py tenantinfo node2.test.saas.entrouvert.org hobo-ac-versailles.test.entrouvert.org --update
* Invalider les tenants (pour ne pas avoir les cron qui se jouent sur les 2 instances)
publik_dump/publik_dump.py invalidate_source node2.test.saas.entrouvert.org hobo-ac-versailles.test.entrouvert.org
* Dump (tenant + base de donnée)
publik_dump/publik_dump.py dump node2.test.saas.entrouvert.org hobo-ac-versailles.test.entrouvert.org
* Restore
publik_dump/publik_dump.py restore node2.test.saas.entrouvert.org hobo-ac-versailles.test.entrouvert.org --target node1.test-hds.saas.entrouvert --dbtarget sql3.test-hds.saas.entrouvert
* Mise à jour des identifiant de connexion à la base de donnée config.pck sur w.c.s.
scp publik_dump/adapt_wcs_config.py wcs.node1.test-hds.saas.entrouvert:.
ssh wcs.node1.test-hds.saas.entrouvert
sudo -u wcs ./adapt_wcs_config.py /var/lib/wcs/demarches-ac-versailles.test.entrouvert.org/config.pck --host test-hds.saas.entrouvert.clusters.entrouvert.org --password XXX
* Mise à jour des identifiant de connexion à la base de donnée et du dsn sentry sur wcs-olap
ssh bijoe.node1.test-hds.saas.entrouvert
vi /var/lib/bijoe/tenants/statistiques-ac-versailles.test.entrouvert.org/wcs-olap.ini
...
pg_dsn = dbname='bijoe' host='test-hds.saas.entrouvert.clusters.entrouvert.org' password='yaingohqu4haeF0K'
[sentry]
dsn = https://39e69f265d6d41adbba9cbdd9f1d4573@sentry.entrouvert.org/6
environment = test
...
* Rejouer les migrations Passerelle
ssh passerelle.node1.test-hds.saas.entrouvert
sudo -u passerelle passerelle-manage migrate_schemas -v2
* Valider les tenants cibles
publik_dump/publik_dump.py validate_target node2.test.saas.entrouvert.org hobo-ac-versailles.test.entrouvert.org --target node1.test-hds.saas.entrouvert
* Modifier les DNS
* Retirer la redirection haproxy du SaaS

View File

@ -6,7 +6,7 @@ from hobo.multitenant.middleware import TenantMiddleware
from django.db import connection
tenant = connection.get_tenant()
services = [{"name": "hobo", "url": tenant.domain_url, "schema": tenant.schema_name}]
services = []
for service in AVAILABLE_SERVICES:
for site in service.objects.all():

View File

@ -80,6 +80,7 @@ class PublikDump():
if not len(tenants) == 1:
raise(Exception('tenant not found'))
tenant = tenants[0]
import pdb; pdb.set_trace()
for service in tenant['services']:
service.update(self.parse_service(service))
@ -165,16 +166,39 @@ class PublikDump():
% (dump_file, self.dbtarget, service["database"])
)
def invalidate_tenant(self):
def invalidate_source_tenant(self):
tenant = self.get_tenant_info()
for service in tenant['services']:
bpath = "%s/%s" % (service['path'], service['url'])
self.run('ssh %s.%s sudo mv %s %s.invalid' % (service['name'], self.host, bpath, bpath))
def validate_source_tenant(self):
tenant = self.get_tenant_info()
for service in tenant['services']:
bpath = "%s/%s" % (service['path'], service['url'])
self.run('ssh %s.%s sudo mv %s.invalid %s' % (service['name'], self.host, bpath, bpath))
def invalidate_target_tenant(self):
tenant = self.get_tenant_info()
for service in tenant['services']:
bpath = "%s/%s" % (service['path'], service['url'])
self.run('ssh %s.%s sudo mv %s %s.invalid' % (service['name'], self.target, bpath, bpath))
def validate_target_tenant(self):
tenant = self.get_tenant_info()
for service in tenant['services']:
bpath = "%s/%s" % (service['path'], service['url'])
self.run('ssh %s.%s sudo mv %s.invalid %s' % (service['name'], self.target, bpath, bpath))
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("action", default="dump", choices=["tenantinfo", "tenanturls", "dump", "restore", "invalidate"])
parser.add_argument("action", default="dump", choices=[
"tenantinfo", "tenanturls",
"invalidate_source", "validate_source",
"dump", "restore",
"invalidate_target", "validate_target",
])
parser.add_argument("host", help="origin host")
parser.add_argument("hobo_tenant", help="hobo tenant url")
parser.add_argument("--update", action="store_true")
@ -193,11 +217,21 @@ if __name__ == "__main__":
print(json.dumps(publik_dump.get_tenant_info(), indent=4))
elif args.action == "tenanturls":
print(' '.join([x['url'] for x in publik_dump.get_tenant_info()['services']]))
elif args.action == "invalidate_source":
publik_dump.invalidate_source_tenant()
elif args.action == "validate_source":
publik_dump.validate_source_tenant()
elif args.action == "dump":
publik_dump.dump_tenant_databases()
publik_dump.dump_tenant_files()
elif args.action == "restore":
assert(publik_dump.target)
assert(publik_dump.dbtarget)
publik_dump.restore_tenant_files()
publik_dump.restore_tenant_databases()
elif args.action == "invalidate":
publik_dump.invalidate_tenant()
elif args.action == "invalidate_target":
assert(publik_dump.target)
publik_dump.invalidate_target_tenant()
elif args.action == "validate_target":
assert(publik_dump.target)
publik_dump.validate_target_tenant()

View File

@ -354,8 +354,8 @@ def test_restore_tenant_database(mocked_tenant_info, mocked_run, publik_dump):
@mock.patch('publik_dump.publik_dump.subprocess.run')
@mock.patch('publik_dump.publik_dump.PublikDump.get_tenant_info', return_value=TENANT_INFO)
def test_invalidate_tenant(mocked_tenant_info, mocked_run, publik_dump):
publik_dump.invalidate_tenant()
def test_invalidate_source_tenant(mocked_tenant_info, mocked_run, publik_dump):
publik_dump.invalidate_source_tenant()
assert len(mocked_run.mock_calls) == 9
# hobo
@ -373,3 +373,74 @@ def test_invalidate_tenant(mocked_tenant_info, mocked_run, publik_dump):
'ssh wcs.node2.test.saas.entrouvert.org'\
' sudo mv /var/lib/wcs/demarches-eurelien.test.entrouvert.org'\
' /var/lib/wcs/demarches-eurelien.test.entrouvert.org.invalid'
@mock.patch('publik_dump.publik_dump.subprocess.run')
@mock.patch('publik_dump.publik_dump.PublikDump.get_tenant_info', return_value=TENANT_INFO)
def test_validate_source_tenant(mocked_tenant_info, mocked_run, publik_dump):
publik_dump.validate_source_tenant()
assert len(mocked_run.mock_calls) == 9
# hobo
assert mocked_run.mock_calls[0][1][0] == \
'ssh hobo.node2.test.saas.entrouvert.org'\
' sudo mv /var/lib/hobo/tenants/hobo-eurelien.test.entrouvert.org.invalid'\
' /var/lib/hobo/tenants/hobo-eurelien.test.entrouvert.org'
# authentic
assert mocked_run.mock_calls[1][1][0] == \
'ssh authentic.node2.test.saas.entrouvert.org'\
' sudo mv /var/lib/authentic2-multitenant/tenants/connexion-eurelien.test.entrouvert.org.invalid'\
' /var/lib/authentic2-multitenant/tenants/connexion-eurelien.test.entrouvert.org'
# wcs
assert mocked_run.mock_calls[2][1][0] == \
'ssh wcs.node2.test.saas.entrouvert.org'\
' sudo mv /var/lib/wcs/demarches-eurelien.test.entrouvert.org.invalid'\
' /var/lib/wcs/demarches-eurelien.test.entrouvert.org'
@mock.patch('publik_dump.publik_dump.subprocess.run')
@mock.patch('publik_dump.publik_dump.PublikDump.get_tenant_info', return_value=TENANT_INFO)
def test_invalidate_target_tenant(mocked_tenant_info, mocked_run, publik_dump):
publik_dump.target = TARGET
publik_dump.invalidate_target_tenant()
assert len(mocked_run.mock_calls) == 9
# hobo
assert mocked_run.mock_calls[0][1][0] == \
'ssh hobo.node1.test-hds.saas.entrouvert' \
' sudo mv /var/lib/hobo/tenants/hobo-eurelien.test.entrouvert.org' \
' /var/lib/hobo/tenants/hobo-eurelien.test.entrouvert.org.invalid'
# authentic
assert mocked_run.mock_calls[1][1][0] == \
'ssh authentic.node1.test-hds.saas.entrouvert' \
' sudo mv /var/lib/authentic2-multitenant/tenants/connexion-eurelien.test.entrouvert.org'\
' /var/lib/authentic2-multitenant/tenants/connexion-eurelien.test.entrouvert.org.invalid'
# wcs
assert mocked_run.mock_calls[2][1][0] == \
'ssh wcs.node1.test-hds.saas.entrouvert' \
' sudo mv /var/lib/wcs/demarches-eurelien.test.entrouvert.org'\
' /var/lib/wcs/demarches-eurelien.test.entrouvert.org.invalid'
@mock.patch('publik_dump.publik_dump.subprocess.run')
@mock.patch('publik_dump.publik_dump.PublikDump.get_tenant_info', return_value=TENANT_INFO)
def test_validate_target_tenant(mocked_tenant_info, mocked_run, publik_dump):
publik_dump.target = TARGET
publik_dump.validate_target_tenant()
assert len(mocked_run.mock_calls) == 9
# hobo
assert mocked_run.mock_calls[0][1][0] == \
'ssh hobo.node1.test-hds.saas.entrouvert' \
' sudo mv /var/lib/hobo/tenants/hobo-eurelien.test.entrouvert.org.invalid' \
' /var/lib/hobo/tenants/hobo-eurelien.test.entrouvert.org'
# authentic
assert mocked_run.mock_calls[1][1][0] == \
'ssh authentic.node1.test-hds.saas.entrouvert' \
' sudo mv /var/lib/authentic2-multitenant/tenants/connexion-eurelien.test.entrouvert.org.invalid'\
' /var/lib/authentic2-multitenant/tenants/connexion-eurelien.test.entrouvert.org'
# wcs
assert mocked_run.mock_calls[2][1][0] == \
'ssh wcs.node1.test-hds.saas.entrouvert' \
' sudo mv /var/lib/wcs/demarches-eurelien.test.entrouvert.org.invalid'\
' /var/lib/wcs/demarches-eurelien.test.entrouvert.org'