From 69ecdb190880d0c49e9f0ef92fd53de14cf66720 Mon Sep 17 00:00:00 2001 From: Tom Weininger Date: Thu, 25 Aug 2022 12:47:38 +0200 Subject: [PATCH] Handle feature compatibility of HAProxy server-state-file option https://review.opendev.org/c/openstack/octavia/+/805955 introduced a new feature that requires HAProxy 1.6 or higher to work. This change ensures that with older HAProxy version this feature does not get enabled to avoid errors. Story: 2010254 Task: 46145 Change-Id: Icc7dc9bb22187f908852c20415227574ded347aa --- octavia/common/constants.py | 1 + .../haproxy/combined_listeners/jinja_cfg.py | 4 +- .../combined_listeners/templates/base.j2 | 2 + .../templates/haproxy.cfg.j2 | 2 +- .../combined_listeners/templates/macros.j2 | 4 +- .../api_server/test_haproxy_compatibility.py | 2 - .../combined_listeners/test_jinja_cfg.py | 69 +++++++------------ .../sample_configs/sample_configs_combined.py | 5 +- ...ut-server-state-file-df70e5ac859417e2.yaml | 7 ++ 9 files changed, 43 insertions(+), 53 deletions(-) create mode 100644 releasenotes/notes/fix-haproxy-compatibility-about-server-state-file-df70e5ac859417e2.yaml diff --git a/octavia/common/constants.py b/octavia/common/constants.py index 945aec5ac1..4f8f6f4ed2 100644 --- a/octavia/common/constants.py +++ b/octavia/common/constants.py @@ -804,6 +804,7 @@ AMP_NETNS_SVC_PREFIX = 'amphora-netns' # Amphora Feature Compatibility HTTP_REUSE = 'has_http_reuse' +SERVER_STATE_FILE = 'has_server_state_file' POOL_ALPN = 'has_pool_alpn' INSECURE_FORK = 'requires_insecure_fork' diff --git a/octavia/common/jinja/haproxy/combined_listeners/jinja_cfg.py b/octavia/common/jinja/haproxy/combined_listeners/jinja_cfg.py index 2961b181d7..48b095c48c 100644 --- a/octavia/common/jinja/haproxy/combined_listeners/jinja_cfg.py +++ b/octavia/common/jinja/haproxy/combined_listeners/jinja_cfg.py @@ -103,6 +103,7 @@ class JinjaTemplater(object): # Is it newer than haproxy 1.5? if versionutils.is_compatible("1.6.0", version, same_major=False): feature_compatibility[constants.HTTP_REUSE] = True + feature_compatibility[constants.SERVER_STATE_FILE] = True if versionutils.is_compatible("1.9.0", version, same_major=False): feature_compatibility[constants.POOL_ALPN] = True if int(haproxy_versions[0]) >= 2: @@ -172,7 +173,8 @@ class JinjaTemplater(object): listeners[0].load_balancer.id) state_file_path = '%s/%s/servers-state' % ( self.base_amp_path, - listeners[0].load_balancer.id) + listeners[0].load_balancer.id) if feature_compatibility.get( + constants.SERVER_STATE_FILE) else '' prometheus_listener = False for listener in listeners: if listener.protocol == lib_consts.PROTOCOL_PROMETHEUS: diff --git a/octavia/common/jinja/haproxy/combined_listeners/templates/base.j2 b/octavia/common/jinja/haproxy/combined_listeners/templates/base.j2 index 7399c5859a..adccc235ba 100644 --- a/octavia/common/jinja/haproxy/combined_listeners/templates/base.j2 +++ b/octavia/common/jinja/haproxy/combined_listeners/templates/base.j2 @@ -20,7 +20,9 @@ global log {{ log_http | default('/run/rsyslog/octavia/log', true)}} local{{ user_log_facility }} log {{ log_server | default('/run/rsyslog/octavia/log', true)}} local{{ administrative_log_facility }} notice stats socket {{ sock_path }} mode 0666 level user + {% if state_file %} server-state-file {{ state_file }} + {% endif %} {% if loadbalancer.global_connection_limit is defined %} maxconn {{ loadbalancer.global_connection_limit }} {% endif %} diff --git a/octavia/common/jinja/haproxy/combined_listeners/templates/haproxy.cfg.j2 b/octavia/common/jinja/haproxy/combined_listeners/templates/haproxy.cfg.j2 index 38d6a15f23..000af57789 100644 --- a/octavia/common/jinja/haproxy/combined_listeners/templates/haproxy.cfg.j2 +++ b/octavia/common/jinja/haproxy/combined_listeners/templates/haproxy.cfg.j2 @@ -55,7 +55,7 @@ backend prometheus-exporter-internal {{- frontend_macro(constants, lib_consts, listener, loadbalancer.vip_address, loadbalancer.additional_vips) }} {% for pool in listener.pools if pool.enabled %} - {{- backend_macro(constants, lib_consts, listener, pool, loadbalancer) }} + {{- backend_macro(constants, lib_consts, listener, pool, loadbalancer, state_file) }} {% endfor %} {% endfor %} {% endif %} diff --git a/octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2 b/octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2 index ea4d602d21..a7a6214d42 100644 --- a/octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2 +++ b/octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2 @@ -305,7 +305,7 @@ frontend {{ listener.id }} {% endmacro %} -{% macro backend_macro(constants, lib_consts, listener, pool, loadbalancer) %} +{% macro backend_macro(constants, lib_consts, listener, pool, loadbalancer, state_file) %} backend {{ pool.id }}:{{ listener.id }} {% if pool.proxy_protocol is not none %} mode {{ listener.protocol_mode }} @@ -347,7 +347,9 @@ backend {{ pool.id }}:{{ listener.id }} {% endif %} {% endif %} {% if pool.health_monitor and pool.health_monitor.enabled %} + {% if state_file %} load-server-state-from-file global + {% endif %} timeout check {{ pool.health_monitor.timeout }}s {% if (pool.health_monitor.type == constants.HEALTH_MONITOR_HTTP or pool.health_monitor.type == diff --git a/octavia/tests/unit/amphorae/backends/agent/api_server/test_haproxy_compatibility.py b/octavia/tests/unit/amphorae/backends/agent/api_server/test_haproxy_compatibility.py index 2b5a6ecc57..d92355ee1f 100644 --- a/octavia/tests/unit/amphorae/backends/agent/api_server/test_haproxy_compatibility.py +++ b/octavia/tests/unit/amphorae/backends/agent/api_server/test_haproxy_compatibility.py @@ -31,8 +31,6 @@ class HAProxyCompatTestCase(base.TestCase): " log /run/rsyslog/octavia/log local1 notice\n" " stats socket /var/lib/octavia/sample_loadbalancer_id_1.sock" " mode 0666 level user\n" - " server-state-file /var/lib/octavia/sample_loadbalancer_id_1" - "/servers-state\n" " maxconn {maxconn}\n\n" "defaults\n" " log global\n" diff --git a/octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py b/octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py index fd04f5f4ed..6fe8b0d644 100644 --- a/octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py +++ b/octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py @@ -66,7 +66,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -121,7 +120,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -172,7 +170,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -228,7 +225,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -282,7 +278,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -336,7 +331,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -388,7 +382,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -424,7 +417,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -518,7 +510,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -555,7 +546,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -591,7 +581,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -620,7 +609,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -661,7 +649,6 @@ class TestHaproxyCfg(base.TestCase): " mode tcp\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -698,7 +685,6 @@ class TestHaproxyCfg(base.TestCase): " mode tcp\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option ssl-hello-chk\n" " fullconn {maxconn}\n" @@ -766,7 +752,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option external-check\n" " external-check command /var/lib/octavia/ping-wrapper.sh\n" @@ -810,14 +795,18 @@ class TestHaproxyCfg(base.TestCase): "weight 13 check inter 30s fall 3 rise 2 " "cookie sample_member_id_2\n\n").format( maxconn=constants.HAPROXY_DEFAULT_MAXCONN) - go = (f" maxconn {constants.HAPROXY_DEFAULT_MAXCONN}\n" - " external-check\n insecure-fork-wanted\n\n") + go = ( + " server-state-file /var/lib/octavia/sample_loadbalancer_id_1/" + "servers-state\n" + f" maxconn {constants.HAPROXY_DEFAULT_MAXCONN}\n" + " external-check\n insecure-fork-wanted\n\n") rendered_obj = self.jinja_cfg.render_loadbalancer_obj( sample_configs_combined.sample_amphora_tuple(), [sample_configs_combined.sample_listener_tuple( proto='HTTP', monitor_proto='PING')], feature_compatibility={ - "requires_insecure_fork": True}) + "requires_insecure_fork": True, + constants.SERVER_STATE_FILE: True}) self.assertEqual(sample_configs_combined.sample_base_expected_config( backend=be, global_opts=go), rendered_obj) @@ -858,7 +847,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.1\\r\\nHost:\\ " "testlab.com\n" @@ -936,7 +924,6 @@ class TestHaproxyCfg(base.TestCase): " balance roundrobin\n" " stick-table type ip size 10k\n" " stick on src\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -964,7 +951,6 @@ class TestHaproxyCfg(base.TestCase): " stick-table type string len 64 size 10k\n" " stick store-response res.cook(JSESSIONID)\n" " stick match req.cook(JSESSIONID)\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -1088,7 +1074,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -1105,7 +1090,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /healthmon.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -1127,7 +1111,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -1156,7 +1139,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -1187,7 +1169,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " fullconn {maxconn}\n" " option allbackups\n" @@ -1215,7 +1196,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -1256,7 +1236,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -1296,7 +1275,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -1337,7 +1315,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -1375,7 +1352,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -1409,7 +1385,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -1440,7 +1415,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -1652,7 +1626,7 @@ class TestHaproxyCfg(base.TestCase): defaults=defaults, logging="\n"), rendered_obj) - def test_http_reuse(self): + def test_haproxy_cfg_1_8_vs_1_5(self): j_cfg = jinja_cfg.JinjaTemplater( base_amp_path='/var/lib/octavia', base_crt_dir='/var/lib/octavia/certs') @@ -1660,7 +1634,12 @@ class TestHaproxyCfg(base.TestCase): sample_amphora = sample_configs_combined.sample_amphora_tuple() sample_proxy_listener = sample_configs_combined.sample_listener_tuple( be_proto='PROXY') - # With http-reuse + # With http-reuse and server-state-file + go = ( + " server-state-file /var/lib/octavia/sample_loadbalancer_id_1/" + "servers-state\n" + " maxconn {maxconn}\n\n").format( + maxconn=constants.HAPROXY_DEFAULT_MAXCONN) be = ("backend {pool_id}:{listener_id}\n" " mode http\n" " http-reuse safe\n" @@ -1687,15 +1666,15 @@ class TestHaproxyCfg(base.TestCase): tls_certs=None, haproxy_versions=("1", "8", "1")) self.assertEqual( - sample_configs_combined.sample_base_expected_config(backend=be), + sample_configs_combined.sample_base_expected_config( + global_opts=go, backend=be), rendered_obj) - # Without http-reuse + # Without http-reuse and server-state-file be = ("backend {pool_id}:{listener_id}\n" " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " fullconn {maxconn}\n" " option allbackups\n" @@ -1769,7 +1748,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -1785,7 +1763,6 @@ class TestHaproxyCfg(base.TestCase): " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /healthmon.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -1835,7 +1812,8 @@ class TestHaproxyCfg(base.TestCase): socket_path=mock_socket_path) expected_fc = { - constants.HTTP_REUSE: True + constants.HTTP_REUSE: True, + constants.SERVER_STATE_FILE: True } mock_render_loadbalancer_obj.assert_called_once_with( mock_amp, mock_listeners, tls_certs=mock_tls_certs, @@ -1850,7 +1828,8 @@ class TestHaproxyCfg(base.TestCase): expected_fc = { constants.HTTP_REUSE: True, - constants.POOL_ALPN: True + constants.POOL_ALPN: True, + constants.SERVER_STATE_FILE: True } mock_render_loadbalancer_obj.assert_called_once_with( mock_amp, mock_listeners, tls_certs=mock_tls_certs, @@ -1866,7 +1845,8 @@ class TestHaproxyCfg(base.TestCase): expected_fc = { constants.HTTP_REUSE: True, constants.POOL_ALPN: True, - lib_consts.PROTOCOL_PROMETHEUS: True + lib_consts.PROTOCOL_PROMETHEUS: True, + constants.SERVER_STATE_FILE: True } mock_render_loadbalancer_obj.assert_called_once_with( mock_amp, mock_listeners, tls_certs=mock_tls_certs, @@ -1883,7 +1863,8 @@ class TestHaproxyCfg(base.TestCase): constants.HTTP_REUSE: True, constants.POOL_ALPN: True, lib_consts.PROTOCOL_PROMETHEUS: True, - constants.INSECURE_FORK: True + constants.INSECURE_FORK: True, + constants.SERVER_STATE_FILE: True } mock_render_loadbalancer_obj.assert_called_once_with( mock_amp, mock_listeners, tls_certs=mock_tls_certs, diff --git a/octavia/tests/unit/common/sample_configs/sample_configs_combined.py b/octavia/tests/unit/common/sample_configs/sample_configs_combined.py index 47e68fd72f..c01e26da72 100644 --- a/octavia/tests/unit/common/sample_configs/sample_configs_combined.py +++ b/octavia/tests/unit/common/sample_configs/sample_configs_combined.py @@ -1236,7 +1236,6 @@ def sample_base_expected_config(frontend=None, logging=None, backend=None, " mode http\n" " balance roundrobin\n" " cookie SRV insert indirect nocache\n" - " load-server-state-from-file global\n" " timeout check 31s\n" " option httpchk GET /index.html HTTP/1.0\\r\\n\n" " http-check expect rstatus 418\n" @@ -1270,7 +1269,5 @@ def sample_base_expected_config(frontend=None, logging=None, backend=None, " log /run/rsyslog/octavia/log local0\n" " log /run/rsyslog/octavia/log local1 notice\n" " stats socket /var/lib/octavia/sample_loadbalancer_id_1.sock" - " mode 0666 level user\n" - " server-state-file /var/lib/octavia/sample_loadbalancer_id_1" - "/servers-state\n" + + " mode 0666 level user\n" + global_opts + defaults + peers + frontend + logging + backend) diff --git a/releasenotes/notes/fix-haproxy-compatibility-about-server-state-file-df70e5ac859417e2.yaml b/releasenotes/notes/fix-haproxy-compatibility-about-server-state-file-df70e5ac859417e2.yaml new file mode 100644 index 0000000000..559c10e943 --- /dev/null +++ b/releasenotes/notes/fix-haproxy-compatibility-about-server-state-file-df70e5ac859417e2.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fixed backwards compatibility issue with the feature that preserves HAProxy + server states between reloads. + HAProxy version 1.5 or below do not support this feature, so Octavia + will not to activate it on amphorae with those versions.