Browse Source

Grava dump de dados em yaml apenas em migração corretiva

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.
migracao
Marcio Mazza 2 years ago
parent
commit
419019680c
  1. 27
      sapl/legacy/migracao.py
  2. 51
      sapl/legacy/migracao_dados.py

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

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

Loading…
Cancel
Save