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):