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 import requests
from django.core import management 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_documentos import migrar_documentos
from sapl.legacy.migracao_usuarios import migrar_usuarios from sapl.legacy.migracao_usuarios import migrar_usuarios
from sapl.legacy.scripts.exporta_zope.variaveis_comuns import TAG_ZOPE 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") management.call_command("migrate")
migracao_corretiva = not primeira_migracao migracao_corretiva = not primeira_migracao
if migracao_corretiva: if migracao_corretiva:
gravar_marco("producao", versiona=False, gera_backup=False) gravar_marco("producao")
fks_orfas = migrar_dados(primeira_migracao, apagar_do_legado) fks_orfas = migrar_dados(primeira_migracao, apagar_do_legado)
assert not fks_orfas, "Ainda existem FKs órfãs" assert not fks_orfas, "Ainda existem FKs órfãs"
migrar_usuarios(REPO.working_dir, primeira_migracao) migrar_usuarios(REPO.working_dir, primeira_migracao)
migrar_documentos(REPO, 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: if migracao_corretiva:
sigla = NOME_BANCO_LEGADO[-3:] sigla = NOME_BANCO_LEGADO[-3:]
verifica_diff(sigla) verifica_diff(sigla)
@ -96,10 +113,10 @@ def scrap_sde(url, usuario, senha=None):
def tenta_correcao(): def tenta_correcao():
from sapl.legacy.migracao_dados import ocorrencias from sapl.legacy.migracao_dados import ocorrencias
gravar_marco("producao", versiona=False, gera_backup=False) gravar_marco("producao")
migrar_dados() migrar_dados()
assert "fk" not in ocorrencias, "AINDA EXISTEM FKS ORFAS" assert "fk" not in ocorrencias, "AINDA EXISTEM FKS ORFAS"
gravar_marco(versiona=False, gera_backup=False) gravar_marco("dados")
sigla = NOME_BANCO_LEGADO[-3:] sigla = NOME_BANCO_LEGADO[-3:]
verifica_diff(sigla) verifica_diff(sigla)

51
sapl/legacy/migracao_dados.py

@ -1840,14 +1840,30 @@ yaml.add_constructor("!time", time_constructor)
TAG_MARCO = "marco" TAG_MARCO = "marco"
def gravar_marco( def gerar_backup_postgres():
nome_dir="dados", pula_se_ja_existe=False, versiona=True, gera_backup=True 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""" """Grava um dump de todos os dados como arquivos yaml no repo de marco"""
# prepara ou localiza repositorio # prepara ou localiza repositorio
dir_dados = Path(REPO.working_dir, nome_dir) dir_dados = Path(REPO.working_dir, nome_dir)
if pula_se_ja_existe and dir_dados.exists(): if pula_se_ja_existe and dir_dados.exists():
return return dir_dados
# limpa todo o conteúdo antes # limpa todo o conteúdo antes
dir_dados.rmtree() dir_dados.rmtree()
dir_dados.mkdir() dir_dados.mkdir()
@ -1873,32 +1889,7 @@ def gravar_marco(
# grava valores das seqeunces # grava valores das seqeunces
sequences = dict(sorted(sequences)) sequences = dict(sorted(sequences))
Path(dir_dados, "sequences.yaml").write_file(pyaml.dump(sequences)) Path(dir_dados, "sequences.yaml").write_file(pyaml.dump(sequences))
return dir_dados
# 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])
def encode_version(version): def encode_version(version):

Loading…
Cancel
Save