From af2c268347032a2ecbdffa82f98987fea473ce59 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Mon, 21 Aug 2023 00:05:17 -0700 Subject: [PATCH] Spawning platform fix --- salt/channel/server.py | 1 - salt/crypt.py | 2 +- salt/master.py | 10 +---- tests/pytests/scenarios/cluster/conftest.py | 38 +++++++++++++++++++ .../scenarios/cluster/test_basic_cluster.py | 16 +++++++- 5 files changed, 55 insertions(+), 12 deletions(-) diff --git a/salt/channel/server.py b/salt/channel/server.py index 4f84b826b38..93f50c6f60c 100644 --- a/salt/channel/server.py +++ b/salt/channel/server.py @@ -19,7 +19,6 @@ import salt.crypt import salt.master import salt.payload import salt.transport.frame -import salt.transport.ipc import salt.utils.channel import salt.utils.event import salt.utils.files diff --git a/salt/crypt.py b/salt/crypt.py index d8637941270..de342b84beb 100644 --- a/salt/crypt.py +++ b/salt/crypt.py @@ -1612,7 +1612,7 @@ class Crypticle: self.serial = serial @classmethod - def generate_key_string(cls, key_size=192): + def generate_key_string(cls, key_size=192, **kwargs): key = os.urandom(key_size // 8 + cls.SIG_SIZE) b64key = base64.b64encode(key) b64key = b64key.decode("utf-8") diff --git a/salt/master.py b/salt/master.py index 93015149224..e2881d718c8 100644 --- a/salt/master.py +++ b/salt/master.py @@ -749,21 +749,15 @@ class Master(SMaster): "reload": cluster_keygen, } - # Wrap generate_key_string to ignore remove keyward arg. - def master_keygen(*args, **kwargs): - return salt.crypt.Crypticle.generate_key_string() - SMaster.secrets["aes"] = { "secret": multiprocessing.Array( ctypes.c_char, - salt.utils.stringutils.to_bytes( - salt.crypt.Crypticle.generate_key_string() - ), + salt.utils.stringutils.to_bytes(salt.crypt.Crypticle.generate_key_string()), ), "serial": multiprocessing.Value( ctypes.c_longlong, lock=False # We'll use the lock from 'secret' ), - "reload": master_keygen, + "reload": salt.crypt.Crypticle.generate_key_string, } log.info("Creating master process manager") diff --git a/tests/pytests/scenarios/cluster/conftest.py b/tests/pytests/scenarios/cluster/conftest.py index 6a7f5482e2f..26d1a1fd7a6 100644 --- a/tests/pytests/scenarios/cluster/conftest.py +++ b/tests/pytests/scenarios/cluster/conftest.py @@ -41,6 +41,7 @@ def cluster_master_1(request, salt_factories, cluster_pki_path, cluster_cache_pa "cluster_id": "master_cluster", "cluster_peers": [ "127.0.0.2", + "127.0.0.3", ], "cluster_pki_dir": str(cluster_pki_path), "cache_dir": str(cluster_cache_path), @@ -74,6 +75,7 @@ def cluster_master_2(salt_factories, cluster_master_1): "cluster_id": "master_cluster", "cluster_peers": [ "127.0.0.1", + "127.0.0.3", ], "cluster_pki_dir": cluster_master_1.config["cluster_pki_dir"], "cache_dir": cluster_master_1.config["cache_dir"], @@ -95,6 +97,42 @@ def cluster_master_2(salt_factories, cluster_master_1): yield factory +@pytest.fixture +def cluster_master_3(salt_factories, cluster_master_1): + if salt.utils.platform.is_darwin() or salt.utils.platform.is_freebsd(): + subprocess.check_output(["ifconfig", "lo0", "alias", "127.0.0.3", "up"]) + + config_defaults = { + "open_mode": True, + "transport": cluster_master_1.config["transport"], + } + config_overrides = { + "interface": "127.0.0.3", + "cluster_id": "master_cluster", + "cluster_peers": [ + "127.0.0.1", + "127.0.0.2", + ], + "cluster_pki_dir": cluster_master_1.config["cluster_pki_dir"], + "cache_dir": cluster_master_1.config["cache_dir"], + } + + # Use the same ports for both masters, they are binding to different interfaces + for key in ( + "ret_port", + "publish_port", + ): + config_overrides[key] = cluster_master_1.config[key] + factory = salt_factories.salt_master_daemon( + "127.0.0.3", + defaults=config_defaults, + overrides=config_overrides, + extra_cli_arguments_after_first_start_failure=["--log-level=info"], + ) + with factory.started(start_timeout=120): + yield factory + + # # @pytest.fixture(scope="package") # def cluster_master_2_salt_cli(cluster_master_2): diff --git a/tests/pytests/scenarios/cluster/test_basic_cluster.py b/tests/pytests/scenarios/cluster/test_basic_cluster.py index 0886bc98de2..5f496e40015 100644 --- a/tests/pytests/scenarios/cluster/test_basic_cluster.py +++ b/tests/pytests/scenarios/cluster/test_basic_cluster.py @@ -10,7 +10,8 @@ def test_basic_cluster_setup( ret = cli1.run("config.get", "cache_dir") assert str(cluster_cache_path) == ret.stdout ret = cli1.run("config.get", "cluster_peers") - assert ["127.0.0.2"] == ret.data + ret.data.sort() + assert ["127.0.0.2", "127.0.0.3"] == ret.data cli2 = cluster_master_2.salt_run_cli(timeout=120) ret = cli2.run("config.get", "cluster_pki_dir") @@ -18,8 +19,11 @@ def test_basic_cluster_setup( ret = cli2.run("config.get", "cache_dir") assert str(cluster_cache_path) == ret.stdout ret = cli2.run("config.get", "cluster_peers") - assert ["127.0.0.1"] == ret.data + ret.data.sort() + assert ["127.0.0.1", "127.0.0.3"] == ret.data + # Check for shared keys. Note: The third master 127.0.0.3 was never + # started. peers_path = cluster_pki_path / "peers" unexpected = False found = [] @@ -62,3 +66,11 @@ def test_basic_cluster_minion_1_from_master_2( cli = cluster_master_2.salt_cli(timeout=120) ret = cli.run("test.ping", minion_tgt="cluster-minion-1") assert ret.data is True + + +def test_basic_cluster_minion_1_from_master_3( + cluster_master_1, cluster_master_2, cluster_master_3, cluster_minion_1 +): + cli = cluster_master_3.salt_cli(timeout=120) + ret = cli.run("test.ping", minion_tgt="cluster-minion-1") + assert ret.data is True