123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- 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()
|