summaryrefslogtreecommitdiffstats
path: root/packaging/dag/test_command.py
diff options
context:
space:
mode:
Diffstat (limited to 'packaging/dag/test_command.py')
-rw-r--r--packaging/dag/test_command.py128
1 files changed, 128 insertions, 0 deletions
diff --git a/packaging/dag/test_command.py b/packaging/dag/test_command.py
new file mode 100644
index 000000000..2418d142e
--- /dev/null
+++ b/packaging/dag/test_command.py
@@ -0,0 +1,128 @@
+import click
+import asyncio
+import sys
+import pathlib
+import dagger
+import uuid
+import httpx
+
+from nd import Distribution, NetdataInstaller, FeatureFlags, Endpoint, AgentContext
+
+
+def run_async(func):
+ def wrapper(*args, **kwargs):
+ return asyncio.run(func(*args, **kwargs))
+
+ return wrapper
+
+
+@run_async
+async def simple_test():
+ config = dagger.Config(log_output=sys.stdout)
+
+ async with dagger.Connection(config) as client:
+ platform = dagger.Platform("linux/x86_64")
+ distro = Distribution("debian10")
+
+ repo_root = pathlib.Path("/netdata")
+ prefix_path = pathlib.Path("/opt/netdata")
+ installer = NetdataInstaller(
+ platform, distro, repo_root, prefix_path, FeatureFlags.DBEngine
+ )
+
+ api_key = uuid.uuid4()
+
+ #
+ # parent
+ #
+ parent_endpoint = Endpoint("parent1", 22000)
+ parent_ctx = AgentContext(
+ client, platform, distro, installer, parent_endpoint, api_key, True
+ )
+ parent_cmd = installer.prefix / "usr/sbin/netdata"
+ parent_args = [
+ parent_cmd.as_posix(),
+ "-D",
+ "-i",
+ "0.0.0.0",
+ "-p",
+ str(parent_endpoint.port),
+ ]
+
+ parent_ctr = parent_ctx.build_container()
+ parent_ctr = parent_ctr.with_exec(parent_args)
+ parent_svc = parent_ctr.as_service()
+
+ #
+ # child
+ #
+ child_endpoint = Endpoint("child1", 21000)
+ child_ctx = AgentContext(
+ client, platform, distro, installer, child_endpoint, api_key, False
+ )
+ child_ctx.add_parent(parent_ctx)
+ child_cmd = installer.prefix / "usr/sbin/netdata"
+ child_args = [
+ child_cmd.as_posix(),
+ "-D",
+ "-i",
+ "0.0.0.0",
+ "-p",
+ str(child_endpoint.port),
+ ]
+
+ child_ctr = child_ctx.build_container()
+ child_ctr = child_ctr.with_service_binding(parent_endpoint.hostname, parent_svc)
+ child_ctr = child_ctr.with_exec(child_args)
+ child_svc = child_ctr.as_service()
+
+ #
+ # endpoints
+ #
+ parent_tunnel, child_tunnel = await asyncio.gather(
+ client.host().tunnel(parent_svc, native=True).start(),
+ client.host().tunnel(child_svc, native=True).start(),
+ )
+
+ parent_endpoint, child_endpoint = await asyncio.gather(
+ parent_tunnel.endpoint(),
+ child_tunnel.endpoint(),
+ )
+
+ await asyncio.sleep(10)
+
+ #
+ # run tests
+ #
+
+ async with httpx.AsyncClient() as http:
+ resp = await http.get(f"http://{parent_endpoint}/api/v1/info")
+
+ #
+ # Check that the child was connected
+ #
+ jd = resp.json()
+ assert (
+ "hosts-available" in jd
+ ), "Could not find 'host-available' key in api/v1/info"
+ assert jd["hosts-available"] == 2, "Child did not connect to parent"
+
+ #
+ # Check bearer protection
+ #
+ forbidden_urls = [
+ f"http://{parent_endpoint}/api/v2/bearer_protection",
+ f"http://{parent_endpoint}/api/v2/bearer_get_token",
+ ]
+
+ for url in forbidden_urls:
+ async with httpx.AsyncClient() as http:
+ resp = await http.get(url)
+ assert (
+ resp.status_code == httpx.codes.UNAVAILABLE_FOR_LEGAL_REASONS
+ ), "Bearer protection is broken"
+
+
+@click.command(help="Run a simple parent/child test")
+def test():
+ simple_test()