publik_dump: add invalidate_source and validate_target to prevent redondant cron job
This commit is contained in:
parent
703d280d63
commit
839f5ee8d9
|
@ -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
|
|
@ -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():
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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'
|
||||
|
|
Loading…
Reference in New Issue