|
|
|
|
@ -35,27 +35,20 @@ class DataGatewayUpgradeTests(unittest.TestCase):
|
|
|
|
|
)
|
|
|
|
|
docker.chmod(0o755)
|
|
|
|
|
self.environment = os.environ.copy()
|
|
|
|
|
self.environment.update(
|
|
|
|
|
{
|
|
|
|
|
"PATH": str(bin_dir) + os.pathsep + self.environment["PATH"],
|
|
|
|
|
"HDSTACK": "2",
|
|
|
|
|
"HDSTACK_BASEID": "23400",
|
|
|
|
|
"FREEDMR_GATEWAY_APRS_LOGIN_CALL": "M0ABC",
|
|
|
|
|
"FREEDMR_GATEWAY_APRS_PASSCODE": "12345",
|
|
|
|
|
"FREEDMR_GATEWAY_FBP_KEY": "private-key",
|
|
|
|
|
}
|
|
|
|
|
self.environment["PATH"] = (
|
|
|
|
|
str(bin_dir) + os.pathsep + self.environment["PATH"]
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def run_upgrade(self, *arguments, environment=None):
|
|
|
|
|
def run_upgrade(self, *arguments):
|
|
|
|
|
return subprocess.run(
|
|
|
|
|
[str(SCRIPT), "--config-dir", str(self.config_dir), *arguments],
|
|
|
|
|
check=False,
|
|
|
|
|
capture_output=True,
|
|
|
|
|
text=True,
|
|
|
|
|
env=environment or self.environment,
|
|
|
|
|
env=self.environment,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def test_migrates_legacy_service_and_builds_hdstack_relationships(self):
|
|
|
|
|
def test_migrates_using_values_from_config_and_compose(self):
|
|
|
|
|
result = self.run_upgrade("--yes")
|
|
|
|
|
|
|
|
|
|
self.assertEqual(result.returncode, 0, result.stderr)
|
|
|
|
|
@ -65,7 +58,6 @@ class DataGatewayUpgradeTests(unittest.TestCase):
|
|
|
|
|
self.assertTrue(parser.getboolean("DATA-GATEWAY", "ENABLED"))
|
|
|
|
|
self.assertEqual(parser.get("DATA-GATEWAY", "MODE"), "OPENBRIDGE")
|
|
|
|
|
self.assertEqual(parser.getint("DATA-GATEWAY", "PROTO_VER"), 5)
|
|
|
|
|
self.assertEqual(parser.get("DATA-GATEWAY", "PASSPHRASE"), "private-key")
|
|
|
|
|
self.assertEqual(
|
|
|
|
|
parser.get("DATA-GATEWAY", "TARGET_IP"),
|
|
|
|
|
"freedmr-data-gateway",
|
|
|
|
|
@ -76,23 +68,51 @@ class DataGatewayUpgradeTests(unittest.TestCase):
|
|
|
|
|
self.assertNotIn(" D-APRS:\n", compose)
|
|
|
|
|
self.assertIn(" data-gateway:\n", compose)
|
|
|
|
|
self.assertIn(" freedmrmonitor2:\n", compose)
|
|
|
|
|
self.assertIn("FREEDMR_GATEWAY_APRS_LOGIN_CALL: 'M0OLD'", compose)
|
|
|
|
|
self.assertIn("FREEDMR_GATEWAY_APRS_PASSCODE: '54321'", compose)
|
|
|
|
|
|
|
|
|
|
relationships = self._relationships(compose)
|
|
|
|
|
self.assertEqual([item["link_id"] for item in relationships], ["hdstack-1", "hdstack-2"])
|
|
|
|
|
self.assertEqual([item["bind_port"] for item in relationships], [62031, 62032])
|
|
|
|
|
self.assertEqual([item["peer_port"] for item in relationships], [62041, 62042])
|
|
|
|
|
self.assertEqual(
|
|
|
|
|
[item["link_id"] for item in relationships],
|
|
|
|
|
["hdstack-1", "hdstack-2"],
|
|
|
|
|
)
|
|
|
|
|
self.assertEqual(
|
|
|
|
|
[item["bind_port"] for item in relationships],
|
|
|
|
|
[62031, 62032],
|
|
|
|
|
)
|
|
|
|
|
self.assertEqual(
|
|
|
|
|
[item["peer_port"] for item in relationships],
|
|
|
|
|
[62041, 62042],
|
|
|
|
|
)
|
|
|
|
|
self.assertEqual(
|
|
|
|
|
[item["peer_network_id"] for item in relationships],
|
|
|
|
|
[23401, 23402],
|
|
|
|
|
)
|
|
|
|
|
self.assertTrue(all(item["key"] == "private-key" for item in relationships))
|
|
|
|
|
self.assertEqual(len(list(self.config_dir.glob("freedmr.cfg.before-data-gateway.*"))), 1)
|
|
|
|
|
self.assertEqual(len(list(self.config_dir.glob("docker-compose.yml.before-data-gateway.*"))), 1)
|
|
|
|
|
generated_key = parser.get("DATA-GATEWAY", "PASSPHRASE")
|
|
|
|
|
self.assertRegex(generated_key, r"^[0-9a-f]{20}$")
|
|
|
|
|
self.assertTrue(all(item["key"] == generated_key for item in relationships))
|
|
|
|
|
self.assertEqual(
|
|
|
|
|
len(list(self.config_dir.glob("freedmr.cfg.before-data-gateway.*"))),
|
|
|
|
|
1,
|
|
|
|
|
)
|
|
|
|
|
self.assertEqual(
|
|
|
|
|
len(
|
|
|
|
|
list(
|
|
|
|
|
self.config_dir.glob(
|
|
|
|
|
"docker-compose.yml.before-data-gateway.*"
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
1,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def test_single_worker_uses_main_server_id(self):
|
|
|
|
|
environment = self.environment.copy()
|
|
|
|
|
environment["HDSTACK"] = "1"
|
|
|
|
|
self.compose.write_text(
|
|
|
|
|
COMPOSE.replace("- HDSTACK=2", "- HDSTACK=1"),
|
|
|
|
|
encoding="utf-8",
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
result = self.run_upgrade("--yes", environment=environment)
|
|
|
|
|
result = self.run_upgrade("--yes")
|
|
|
|
|
|
|
|
|
|
self.assertEqual(result.returncode, 0, result.stderr)
|
|
|
|
|
relationships = self._relationships(self.compose.read_text(encoding="utf-8"))
|
|
|
|
|
@ -100,40 +120,45 @@ class DataGatewayUpgradeTests(unittest.TestCase):
|
|
|
|
|
self.assertEqual(relationships[0]["peer_network_id"], 23400)
|
|
|
|
|
self.assertEqual(relationships[0]["direct_source_server_id"], 23400)
|
|
|
|
|
|
|
|
|
|
def test_reuses_legacy_credentials_and_explicit_compose_hdstack(self):
|
|
|
|
|
def test_reads_three_worker_base_id_from_compose(self):
|
|
|
|
|
self.compose.write_text(
|
|
|
|
|
COMPOSE.replace(
|
|
|
|
|
" image: freedmr:test\n",
|
|
|
|
|
" image: freedmr:test\n"
|
|
|
|
|
" environment:\n"
|
|
|
|
|
" - HDSTACK=3\n"
|
|
|
|
|
" - HDSTACK_BASEID=24500\n",
|
|
|
|
|
COMPOSE.replace("- HDSTACK=2", "- HDSTACK=3").replace(
|
|
|
|
|
"- HDSTACK_BASEID=23400",
|
|
|
|
|
"- HDSTACK_BASEID=24500",
|
|
|
|
|
),
|
|
|
|
|
encoding="utf-8",
|
|
|
|
|
)
|
|
|
|
|
environment = self.environment.copy()
|
|
|
|
|
for name in (
|
|
|
|
|
"HDSTACK",
|
|
|
|
|
"HDSTACK_BASEID",
|
|
|
|
|
"FREEDMR_GATEWAY_APRS_LOGIN_CALL",
|
|
|
|
|
"FREEDMR_GATEWAY_APRS_PASSCODE",
|
|
|
|
|
):
|
|
|
|
|
environment.pop(name)
|
|
|
|
|
|
|
|
|
|
result = self.run_upgrade("--yes", environment=environment)
|
|
|
|
|
result = self.run_upgrade("--yes")
|
|
|
|
|
|
|
|
|
|
self.assertEqual(result.returncode, 0, result.stderr)
|
|
|
|
|
compose = self.compose.read_text(encoding="utf-8")
|
|
|
|
|
self.assertIn("FREEDMR_GATEWAY_APRS_LOGIN_CALL: 'M0OLD'", compose)
|
|
|
|
|
self.assertIn("FREEDMR_GATEWAY_APRS_PASSCODE: '54321'", compose)
|
|
|
|
|
relationships = self._relationships(compose)
|
|
|
|
|
relationships = self._relationships(self.compose.read_text(encoding="utf-8"))
|
|
|
|
|
self.assertEqual(len(relationships), 3)
|
|
|
|
|
self.assertEqual(
|
|
|
|
|
[item["peer_network_id"] for item in relationships],
|
|
|
|
|
[24501, 24502, 24503],
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def test_replaces_existing_disabled_gateway_section_once(self):
|
|
|
|
|
def test_omitted_hdstack_uses_current_cpu_derived_default(self):
|
|
|
|
|
self.compose.write_text(
|
|
|
|
|
COMPOSE.replace(" - HDSTACK=2\n", ""),
|
|
|
|
|
encoding="utf-8",
|
|
|
|
|
)
|
|
|
|
|
cpu_count = int(
|
|
|
|
|
subprocess.check_output(
|
|
|
|
|
["getconf", "_NPROCESSORS_ONLN"],
|
|
|
|
|
text=True,
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
expected = max(1, min(5, cpu_count - 1))
|
|
|
|
|
|
|
|
|
|
result = self.run_upgrade("--yes")
|
|
|
|
|
|
|
|
|
|
self.assertEqual(result.returncode, 0, result.stderr)
|
|
|
|
|
relationships = self._relationships(self.compose.read_text(encoding="utf-8"))
|
|
|
|
|
self.assertEqual(len(relationships), expected)
|
|
|
|
|
|
|
|
|
|
def test_reuses_existing_non_placeholder_gateway_key(self):
|
|
|
|
|
self.config.write_text(CONFIG_WITH_GATEWAY, encoding="utf-8")
|
|
|
|
|
|
|
|
|
|
result = self.run_upgrade("--yes")
|
|
|
|
|
@ -141,9 +166,20 @@ class DataGatewayUpgradeTests(unittest.TestCase):
|
|
|
|
|
self.assertEqual(result.returncode, 0, result.stderr)
|
|
|
|
|
updated = self.config.read_text(encoding="utf-8")
|
|
|
|
|
self.assertEqual(updated.count("[DATA-GATEWAY]"), 1)
|
|
|
|
|
self.assertNotIn("PASSPHRASE: old-key", updated)
|
|
|
|
|
self.assertIn("PASSPHRASE: private-key", updated)
|
|
|
|
|
self.assertIn("PASSPHRASE: old-key", updated)
|
|
|
|
|
self.assertIn("PORT: 63041", updated)
|
|
|
|
|
self.assertIn("TARGET_PORT: 63031", updated)
|
|
|
|
|
self.assertIn("[SYSTEM]\nMODE: MASTER", updated)
|
|
|
|
|
relationships = self._relationships(self.compose.read_text(encoding="utf-8"))
|
|
|
|
|
self.assertTrue(all(item["key"] == "old-key" for item in relationships))
|
|
|
|
|
self.assertEqual(
|
|
|
|
|
[item["bind_port"] for item in relationships],
|
|
|
|
|
[63031, 63032],
|
|
|
|
|
)
|
|
|
|
|
self.assertEqual(
|
|
|
|
|
[item["peer_port"] for item in relationships],
|
|
|
|
|
[63041, 63042],
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def test_dry_run_validates_without_modifying_or_backing_up(self):
|
|
|
|
|
original_config = self.config.read_bytes()
|
|
|
|
|
@ -223,7 +259,9 @@ DATA_GATEWAY: False
|
|
|
|
|
[DATA-GATEWAY]
|
|
|
|
|
MODE: OPENBRIDGE
|
|
|
|
|
ENABLED: False
|
|
|
|
|
PORT: 63041
|
|
|
|
|
PASSPHRASE: old-key
|
|
|
|
|
TARGET_PORT: 63031
|
|
|
|
|
PROTO_VER: 5
|
|
|
|
|
|
|
|
|
|
[D-APRS]
|
|
|
|
|
@ -240,6 +278,9 @@ services:
|
|
|
|
|
freedmr:
|
|
|
|
|
container_name: freedmr
|
|
|
|
|
image: freedmr:test
|
|
|
|
|
environment:
|
|
|
|
|
- HDSTACK=2
|
|
|
|
|
- HDSTACK_BASEID=23400
|
|
|
|
|
networks:
|
|
|
|
|
app_net:
|
|
|
|
|
ipv4_address: 172.16.238.10
|
|
|
|
|
|