From 839f5ee8d9330d51338560bd88119de518585199 Mon Sep 17 00:00:00 2001 From: Nicolas ROCHE Date: Fri, 29 Apr 2022 12:32:31 +0200 Subject: [PATCH] publik_dump: add invalidate_source and validate_target to prevent redondant cron job --- publik-dump/README | 62 ++++++++++++++++++++ publik-dump/publik_dump/list_tenants.py | 2 +- publik-dump/publik_dump/publik_dump.py | 42 ++++++++++++-- publik-dump/tests/test_publik_dump.py | 75 ++++++++++++++++++++++++- 4 files changed, 174 insertions(+), 7 deletions(-) create mode 100644 publik-dump/README diff --git a/publik-dump/README b/publik-dump/README new file mode 100644 index 0000000..366b255 --- /dev/null +++ b/publik-dump/README @@ -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 \ No newline at end of file diff --git a/publik-dump/publik_dump/list_tenants.py b/publik-dump/publik_dump/list_tenants.py index af1b450..fb2543d 100644 --- a/publik-dump/publik_dump/list_tenants.py +++ b/publik-dump/publik_dump/list_tenants.py @@ -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(): diff --git a/publik-dump/publik_dump/publik_dump.py b/publik-dump/publik_dump/publik_dump.py index 4ad559a..fe3e07d 100755 --- a/publik-dump/publik_dump/publik_dump.py +++ b/publik-dump/publik_dump/publik_dump.py @@ -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() diff --git a/publik-dump/tests/test_publik_dump.py b/publik-dump/tests/test_publik_dump.py index ce242e8..0daa03d 100644 --- a/publik-dump/tests/test_publik_dump.py +++ b/publik-dump/tests/test_publik_dump.py @@ -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'