From 419019680caf200e47f3fc9e3dcc0e7388e568d6 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Fri, 23 Sep 2022 10:54:13 -0300 Subject: [PATCH] =?UTF-8?q?Grava=20dump=20de=20dados=20em=20yaml=20apenas?= =?UTF-8?q?=20em=20migra=C3=A7=C3=A3o=20corretiva?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Efetivamente estamos supondo que não haverá mais migração corretiva. Este era um tipo de migração para fazer merge dos dados de um sapl 3.1 previamente migrado de um sapl 2.5 com uma nova migração (corretiva) do mesmo sapl 2.5. --- sapl/legacy/migracao.py | 27 +++++++++++++++---- sapl/legacy/migracao_dados.py | 51 +++++++++++++++-------------------- 2 files changed, 43 insertions(+), 35 deletions(-) diff --git a/sapl/legacy/migracao.py b/sapl/legacy/migracao.py index 48e36f639..0dd7ddc94 100644 --- a/sapl/legacy/migracao.py +++ b/sapl/legacy/migracao.py @@ -3,7 +3,14 @@ from getpass import getpass import requests from django.core import management -from sapl.legacy.migracao_dados import REPO, TAG_MARCO, gravar_marco, info, migrar_dados +from sapl.legacy.migracao_dados import ( + REPO, + TAG_MARCO, + gerar_backup_postgres, + gravar_marco, + info, + migrar_dados, +) from sapl.legacy.migracao_documentos import migrar_documentos from sapl.legacy.migracao_usuarios import migrar_usuarios from sapl.legacy.scripts.exporta_zope.variaveis_comuns import TAG_ZOPE @@ -27,12 +34,22 @@ def migrar(primeira_migracao=True, apagar_do_legado=False): management.call_command("migrate") migracao_corretiva = not primeira_migracao if migracao_corretiva: - gravar_marco("producao", versiona=False, gera_backup=False) + gravar_marco("producao") fks_orfas = migrar_dados(primeira_migracao, apagar_do_legado) assert not fks_orfas, "Ainda existem FKs órfãs" migrar_usuarios(REPO.working_dir, primeira_migracao) migrar_documentos(REPO, primeira_migracao) - gravar_marco() + if migracao_corretiva: + dir_dados = gravar_marco("dados") + REPO.git.add([dir_dados.name]) + + gerar_backup_postgres() + + # versiona mudanças, se de fato existem + if "master" not in REPO.heads or REPO.index.diff("HEAD"): + REPO.index.commit("Migração concluída") + REPO.git.execute("git tag -f".split() + [TAG_MARCO]) + if migracao_corretiva: sigla = NOME_BANCO_LEGADO[-3:] verifica_diff(sigla) @@ -96,10 +113,10 @@ def scrap_sde(url, usuario, senha=None): def tenta_correcao(): from sapl.legacy.migracao_dados import ocorrencias - gravar_marco("producao", versiona=False, gera_backup=False) + gravar_marco("producao") migrar_dados() assert "fk" not in ocorrencias, "AINDA EXISTEM FKS ORFAS" - gravar_marco(versiona=False, gera_backup=False) + gravar_marco("dados") sigla = NOME_BANCO_LEGADO[-3:] verifica_diff(sigla) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 97cd1c8f4..aca3e0e9b 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -1840,14 +1840,30 @@ yaml.add_constructor("!time", time_constructor) TAG_MARCO = "marco" -def gravar_marco( - nome_dir="dados", pula_se_ja_existe=False, versiona=True, gera_backup=True -): +def gerar_backup_postgres(): + print("Gerando backup do banco... ", end="", flush=True) + arq_backup = DIR_REPO.child("{}.backup".format(NOME_BANCO_LEGADO)) + arq_backup.remove() + backup_cmds = [ + f""" + docker exec postgres pg_dump -U sapl --format custom --blobs --verbose + --file {arq_backup.name} {NOME_BANCO_LEGADO}""", + f"docker cp postgres:{arq_backup.name} {arq_backup}", + f"docker exec postgres rm {arq_backup.name}", + ] + for cmd in backup_cmds: + subprocess.check_output(cmd.split(), stderr=subprocess.DEVNULL) + REPO.git.add([arq_backup.name]) # type: ignore + print("SUCESSO") + + +def gravar_marco(nome_dir, pula_se_ja_existe=False): """Grava um dump de todos os dados como arquivos yaml no repo de marco""" # prepara ou localiza repositorio dir_dados = Path(REPO.working_dir, nome_dir) if pula_se_ja_existe and dir_dados.exists(): - return + return dir_dados + # limpa todo o conteúdo antes dir_dados.rmtree() dir_dados.mkdir() @@ -1873,32 +1889,7 @@ def gravar_marco( # grava valores das seqeunces sequences = dict(sorted(sequences)) Path(dir_dados, "sequences.yaml").write_file(pyaml.dump(sequences)) - - # backup do banco - if gera_backup: - print("Gerando backup do banco... ", end="", flush=True) - arq_backup = DIR_REPO.child("{}.backup".format(NOME_BANCO_LEGADO)) - arq_backup.remove() - backup_cmds = [ - f""" - docker exec postgres pg_dump -U sapl --format custom --blobs --verbose - --file {arq_backup.name} {NOME_BANCO_LEGADO}""", - f"docker cp postgres:{arq_backup.name} {arq_backup}", - f"docker exec postgres rm {arq_backup.name}", - ] - for cmd in backup_cmds: - subprocess.check_output(cmd.split(), stderr=subprocess.DEVNULL) - print("SUCESSO") - - # versiona mudanças - if versiona: - REPO.git.add([dir_dados.name]) - if gera_backup: - REPO.git.add([arq_backup.name]) # type: ignore - if "master" not in REPO.heads or REPO.index.diff("HEAD"): - # se de fato existe mudança - REPO.index.commit(f"Grava marco (em {nome_dir})") - REPO.git.execute("git tag -f".split() + [TAG_MARCO]) + return dir_dados def encode_version(version):