Migration

Big Bang / One shot

  • Tous les problèmes remontent en même temps
  • Les sources d’erreurs sont très dures à investiguer
  • Pas de retour possible en arrière, car perte des modifications effectuées depuis le moment où la bascule a été lancée
  • On risque de reproduire l’existant sans faire mieux à cause de la course imposée par le Time-to-Market (TTM)

 

Migration progressive

web/app.php


try {
    // Try to handle the request from within Symfony
    $response = $kernel->handle($sfRequest, HttpKernelInterface::MASTER_REQUEST, false);
} catch (NotFoundHttpException $e) {
    // handle legacy
    $legacyHandler = $kernel->getContainer()->get('legacy.handler');

    if (!$response = $legacyHandler->parse($sfRequest)) {
        $legacyHandler->bootLegacy();
        $logger = $kernel->getContainer()->get('logger');
        $kernel->getContainer()->get('session')->save();
        try {
            require_once $legacyHandler->getLegacyPath();
            $response = $legacyHandler->handleResponse();
        } catch (\Exception $e) {
            // In case we have an error in the legacy, we want to be able to
            // have a nice error page instead of a blank page.
            $response = $legacyHandler->handleException($e, $sfRequest);
        }
    }
}
theodo_evolution_legacy_wrapper:
    root_dir: '%kernel.root_dir%/../legacy'
    kernel:
        id: theodo_evolution_legacy_wrapper.legacy_kernel.symfony14
        options:
            application: frontend
            environment: '%kernel.environment%'
            debug:       '%kernel.debug%'

Points vigilence

  • die/exit dans le code Legacy
  • Usage de variable globales dans le code Legacy
  • Contenu session -> TheodoEvolutionSessionBundle
  • Vie de la session
  • Authentification / Authorisation
  • Transactions SQL
  • Response headers du legacy

Sens de la migration 

  • Déplacement du code legacy vers nouvelle version
  • Branchement du legacy sur la nouvelle version
  • Le code legacy peut appeler la nouvelle version mais jamais l'inverse

Migration des données

  • Implementer si besoin une double écriture (Listener sur nouvelle APP génère des données dans la base légacy)
  • Commencer la migration par les entités "satelite"
  • Commencer par migrer les producteurs de donnés avant les consommateurs

Tips

  • Inject le logger dans le legacy
    • Logger toutes les requêtes SQL
  • Inject le container dans le legacy
  • Reverse engineering Doctrine
    • Attentions au tinyInt => bool

deck

By Jérémy DERUSSÉ