• Jérome Perrin's avatar
    testUpgradeInstanceWithOldDataFs: dump without a valid connection string · 8310e4e4
    Jérome Perrin authored
    This dump was made with a connection string on 127.0.0.1, which must be
    causing erros in logs:
    
        2020-04-09 09:35:02.699 CRITICAL ERP5Site Automatic migration of core tools failed
        Traceback (most recent call last):
          File "erp5/product/ERP5Type/dynamic/portal_type_class.py", line 456, in synchronizeDynamicModules
            portal.portal_activities.initialize()
          File "erp5/product/CMFActivity/ActivityTool.py", line 694, in initialize
            activity.initialize(self, clear=False)
          File "erp5/product/CMFActivity/Activity/SQLBase.py", line 173, in initialize
            db = activity_tool.getSQLConnection()
          File "erp5/product/CMFActivity/ActivityTool.py", line 674, in getSQLConnection
            return self.aq_inner.aq_parent.cmf_activity_sql_connection()
          File "eggs/Products.ZSQLMethods-2.13.5-py2.7.egg/Shared/DC/ZRDB/Connection.py", line 194, in __call__
            self.connect(s)
          File "erp5/product/ERP5Type/tests/ERP5TypeTestCase.py", line 926, in connect
            return original_ZMySQLDA_connect(self, *args, **kw)
          File "erp5/product/ZMySQLDA/DA.py", line 156, in connect
            connection = pool[self._p_jar] = DB(s)
          File "erp5/product/ZMySQLDA/db.py", line 229, in __init__
            self._forceReconnection()
          File "erp5/product/ZMySQLDA/db.py", line 316, in _forceReconnection
            self.db = MySQLdb.connect(**self._kw_args)
          File "develop-eggs/mysqlclient-1.3.12-py2.7-linux-x86_64.egg/MySQLdb/__init__.py", line 86, in Connect
            return Connection(*args, **kwargs)
          File "develop-eggs/mysqlclient-1.3.12-py2.7-linux-x86_64.egg/MySQLdb/connections.py", line 204, in __init__
            super(Connection, self).__init__(*args, **kwargs2)
        OperationalError: (2002, "Can't connect to MySQL server on '127.0.0.1' (115)")
    
    We first thought about using a connection string that would work on test
    node, something like:
    
        erp5_test_0@erp5-catalog-0:2099 testuser_0 testpassword0
    
    but since testnodes share mysql connections, this would be wrong if for
    exemple this testnode was affected with erp5_test_1 and another test
    node was already running with erp5_test0.
    
    Instead, we use another approach, the reference Data.fs uses a marker
    string as connection string and before running test, the testnode
    rewrite the Data.fs to replace the marker string by the actual
    connection string. Because ZODB file storage is simple, we can just
    replace string in the database file, as long as the replacement string
    have the same length as the replaced string.
    
    Dump was produced this way:
    
        runUnitTest --save --erp5_sql_connection_string 'erp5_test_0@erp5-catalog-0:2099               testuser_0 testpassword0' --portal_id=erp5 testUpgradeInstanceWithOldDataFs
        python3 rewrite_data_fs.py
    8310e4e4