From 9bead27fe3b967aa891919052954b5eddc38a021 Mon Sep 17 00:00:00 2001 From: Charles de Beauchesne Date: Mon, 23 Sep 2024 15:31:24 +0200 Subject: [PATCH 01/18] External processing : initial poc --- .../test_external_processing.py | 15 +++++++++++++++ utils/_context/_scenarios/external_processing.py | 15 +++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 tests/external_processing/test_external_processing.py create mode 100644 utils/_context/_scenarios/external_processing.py diff --git a/tests/external_processing/test_external_processing.py b/tests/external_processing/test_external_processing.py new file mode 100644 index 00000000000..c163a20516b --- /dev/null +++ b/tests/external_processing/test_external_processing.py @@ -0,0 +1,15 @@ +from utils import weblog, interfaces + +@scenarios.external_processing +class Test_ExternalProcessing: + def setup_main(self): + self.r = weblog.get("/mock", params={"status_code": 200}, proxy="http:envoy:10000") + + def test_main(self): + assert self.r.status_code == 200 + + traces = interfaces.library.get_traces() + + assert len(traces) == 1 + # test whatever you like + assert traces[0]["request"]["url"] == "http://envoy:10000/mock?status_code=200" \ No newline at end of file diff --git a/utils/_context/_scenarios/external_processing.py b/utils/_context/_scenarios/external_processing.py new file mode 100644 index 00000000000..552fa9bd53f --- /dev/null +++ b/utils/_context/_scenarios/external_processing.py @@ -0,0 +1,15 @@ +from .endtoend import EndToEndScenario + +class ExternalProcessingScenario(EndToEndScenario): + def __init__(self, name, description, ): + super().__init__(name, description) + + # start envoyproxy/emvoy + # start dummy http app on weblog port + # start system-tests proxy + # start agent + # start service extension + # with agent url threw system-tests proxy + + # need + # ./build.sh golang -i weblog -w service-extension From dca504a4116067d47b98212f683a8823a404e41d Mon Sep 17 00:00:00 2001 From: Flavien Darche Date: Tue, 1 Oct 2024 17:31:54 +0100 Subject: [PATCH 02/18] add envoy config file + basic http mock python server + update comment doc --- tests/external_processing/docker-compose.yml | 37 +++++++++ tests/external_processing/envoy.yaml | 76 +++++++++++++++++++ tests/external_processing/server.py | 42 ++++++++++ .../_scenarios/external_processing.py | 13 +++- 4 files changed, 165 insertions(+), 3 deletions(-) create mode 100644 tests/external_processing/docker-compose.yml create mode 100644 tests/external_processing/envoy.yaml create mode 100644 tests/external_processing/server.py diff --git a/tests/external_processing/docker-compose.yml b/tests/external_processing/docker-compose.yml new file mode 100644 index 00000000000..5df6b74fbfa --- /dev/null +++ b/tests/external_processing/docker-compose.yml @@ -0,0 +1,37 @@ +services: + envoy: + image: envoyproxy/envoy:v1.31-latest + container_name: envoy + ports: + - "8080:8080" + volumes: + - ./envoy.yaml:/etc/envoy/envoy.yaml + depends_on: + - webserver + - extproc + networks: + - app-network + + webserver: + build: + context: ./webserver + container_name: webserver + ports: + - "7777:7777" + networks: + - app-network + + extproc: + image: ghcr.io/datadog/dd-trace-go/service-extensions-callout:latest + container_name: extproc + ports: + - "443:443" + - "80:80" + networks: + - app-network + environment: + - DD_APPSEC_ENABLED=true + +networks: + app-network: + driver: bridge diff --git a/tests/external_processing/envoy.yaml b/tests/external_processing/envoy.yaml new file mode 100644 index 00000000000..2829e6db6e8 --- /dev/null +++ b/tests/external_processing/envoy.yaml @@ -0,0 +1,76 @@ +static_resources: + listeners: + - name: listener_0 + address: + socket_address: + address: 0.0.0.0 + port_value: 8080 + filter_chains: + - filters: + - name: envoy.filters.network.http_connection_manager + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager + stat_prefix: ingress_http + codec_type: AUTO + route_config: + name: local_route + virtual_hosts: + - name: backend + domains: + - "*" + routes: + - match: + prefix: "/" + route: + cluster: web_service + http_filters: + - name: envoy.filters.http.ext_proc + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor + grpc_service: + envoy_grpc: + cluster_name: ext_proc_cluster + timeout: 0.25s + - name: envoy.filters.http.router + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router + clusters: + - name: web_service + connect_timeout: 0.25s + type: STRICT_DNS + lb_policy: ROUND_ROBIN + load_assignment: + cluster_name: web_service + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: webserver + port_value: 7777 + + - name: ext_proc_cluster + connect_timeout: 0.25s + type: STRICT_DNS + lb_policy: ROUND_ROBIN + http2_protocol_options: {} + transport_socket: + name: envoy.transport_sockets.tls + typed_config: + "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext + sni: extproc + load_assignment: + cluster_name: ext_proc_cluster + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: extproc + port_value: 443 +admin: + access_log_path: "/tmp/admin_access.log" + address: + socket_address: + address: 0.0.0.0 + port_value: 8001 diff --git a/tests/external_processing/server.py b/tests/external_processing/server.py new file mode 100644 index 00000000000..f0b8a2dc76a --- /dev/null +++ b/tests/external_processing/server.py @@ -0,0 +1,42 @@ +from http.server import HTTPServer, BaseHTTPRequestHandler +from urllib.parse import urlparse, parse_qs +import json + +class MockHandler(BaseHTTPRequestHandler): + def do_GET(self): + self.route_request() + + def do_POST(self): + self.route_request() + + def route_request(self): + parsed_path = urlparse(self.path) + if parsed_path.path == '/mock': + self.handle_mock() + elif parsed_path.path == '/': + self.send_response(200) + self.end_headers() + self.wfile.write(b'Hello, world!\n') + else: + self.send_response(404) + self.end_headers() + self.wfile.write(b'Not Found\n') + + def handle_mock(self): + content_length = int(self.headers.get('Content-Length', 0)) + body = self.rfile.read(content_length) + body_params = json.loads(body) + + status_code = int(body_params.get('status_code', 200)) # default to 200 + response_body = body_params.get('body', 'Ok!') # default to 'Ok!' + + self.send_response(status_code) + for key, value in body_params.get('headers', {}).items(): + self.send_header(key, value) + self.end_headers() + self.wfile.write(response_body.encode()) + +if __name__ == '__main__': + server = HTTPServer(('0.0.0.0', 7777), MockHandler) + print('Starting server at http://0.0.0.0:7777') + server.serve_forever() diff --git a/utils/_context/_scenarios/external_processing.py b/utils/_context/_scenarios/external_processing.py index 552fa9bd53f..bfcf460d263 100644 --- a/utils/_context/_scenarios/external_processing.py +++ b/utils/_context/_scenarios/external_processing.py @@ -4,12 +4,19 @@ class ExternalProcessingScenario(EndToEndScenario): def __init__(self, name, description, ): super().__init__(name, description) - # start envoyproxy/emvoy + # start envoyproxy/envoy:v1.31-latest⁠ + # -> envoy.yaml configuration in tests/external_processing/envoy.yaml + # start dummy http app on weblog port + # -> server.py in tests/external_processing/server.py + # start system-tests proxy # start agent # start service extension # with agent url threw system-tests proxy - # need - # ./build.sh golang -i weblog -w service-extension + # service extension image: + # https://github.com/DataDog/dd-trace-go/pkgs/container/dd-trace-go%2Fservice-extensions-callout + # Version: + # tag: dev + # base: latest/v*.*.* From 2f33394f9307fd863b958124279279804764059d Mon Sep 17 00:00:00 2001 From: Charles de Beauchesne Date: Wed, 2 Oct 2024 11:13:43 +0200 Subject: [PATCH 03/18] Containers and scenario skeleton --- .github/workflows/ci.yml | 2 +- .github/workflows/run-external-processing.yml | 66 +++++++++++++++++++ .github/workflows/system-tests.yml | 10 +++ .../test_external_processing.py | 5 +- utils/_context/_scenarios/__init__.py | 3 + utils/_context/_scenarios/core.py | 2 + .../_scenarios/external_processing.py | 32 +++++++-- utils/_context/containers.py | 38 +++++++++++ 8 files changed, 150 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/run-external-processing.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b2f4e0c2d68..b974ad09545 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -106,7 +106,7 @@ jobs: with: library: ${{ matrix.library }} scenarios: ${{ needs.scenarios.outputs.scenarios }} - scenarios_groups: ${{ needs.scenarios.outputs.scenarios_groups }} + scenarios_groups: external-processing # DO NOT MERGE ${{ needs.scenarios.outputs.scenarios_groups }} binaries_artifact: ${{ matrix.version == 'dev' && format('binaries_dev_{0}', matrix.library) || '' }} ci_environment: ${{ matrix.version }} build_python_base_images: ${{ contains(github.event.pull_request.labels.*.name, 'build-python-base-images') }} diff --git a/.github/workflows/run-external-processing.yml b/.github/workflows/run-external-processing.yml new file mode 100644 index 00000000000..22395d46ad5 --- /dev/null +++ b/.github/workflows/run-external-processing.yml @@ -0,0 +1,66 @@ +name: External-processing tests + +on: + workflow_call: + inputs: + ci_environment: + description: "Which CI environment is running the tests, used for FPD" + default: 'custom' + required: false + type: string + build_proxy_image: + description: "Shall we build proxy image" + default: false + required: false + type: boolean + +env: + REGISTRY: ghcr.io + + +jobs: + graphql: + runs-on: + group: "APM Larger Runners" + + env: + SYSTEM_TESTS_REPORT_ENVIRONMENT: ${{ inputs.ci_environment }} + SYSTEM_TESTS_REPORT_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + repository: 'DataDog/system-tests' + - name: Install runner + uses: ./.github/actions/install_runner + + - name: Log in to the Container registry + if: ${{ inputs.library == 'ruby' }} + run: echo ${{ secrets.GITHUB_TOKEN }} | docker login ${{ env.REGISTRY }} -u ${{ github.actor }} --password-stdin + + - name: Build proxy image + if: inputs.build_proxy_image + run: ./build.sh -i proxy + - name: Pull images + uses: ./.github/actions/pull_images + with: + library: golang + weblog: golang-dummy + scenarios: '["EXTERNAL_PROCESSING"]' + + - name: Run EXTERNAL_PROCESSING scenario + run: ./run.sh EXTERNAL_PROCESSING + env: + DD_API_KEY: ${{ secrets.DD_API_KEY }} + + - name: Compress logs + id: compress_logs + if: always() && steps.build.outcome == 'success' + run: tar -czvf artifact.tar.gz $(ls | grep logs) + - name: Upload artifact + if: always() && steps.compress_logs.outcome == 'success' + uses: actions/upload-artifact@v4 + with: + name: logs_graphql_golang_golang-dummy_${{ inputs.ci_environment }} + path: artifact.tar.gz \ No newline at end of file diff --git a/.github/workflows/system-tests.yml b/.github/workflows/system-tests.yml index ec5f5a0418c..583d45246fd 100644 --- a/.github/workflows/system-tests.yml +++ b/.github/workflows/system-tests.yml @@ -143,3 +143,13 @@ jobs: with: library: ${{ inputs.library }} weblogs: ${{ needs.compute_parameters.outputs.dockerssi_weblogs }} + + external-processing: + needs: + - compute_parameters + if: ${{ needs.compute_parameters.outputs.externalprocessing_scenarios != '[]' && inputs.binaries_artifact == '' && inputs.library == 'golang' }} + uses: ./.github/workflows/run-external-processing.yml + secrets: inherit + with: + build_proxy_image: ${{ inputs.build_proxy_image }} + ci_environment: ${{ inputs.ci_environment }} diff --git a/tests/external_processing/test_external_processing.py b/tests/external_processing/test_external_processing.py index c163a20516b..7b339ccbffa 100644 --- a/tests/external_processing/test_external_processing.py +++ b/tests/external_processing/test_external_processing.py @@ -1,4 +1,5 @@ -from utils import weblog, interfaces +from utils import weblog, interfaces, scenarios + @scenarios.external_processing class Test_ExternalProcessing: @@ -12,4 +13,4 @@ def test_main(self): assert len(traces) == 1 # test whatever you like - assert traces[0]["request"]["url"] == "http://envoy:10000/mock?status_code=200" \ No newline at end of file + assert traces[0]["request"]["url"] == "http://envoy:10000/mock?status_code=200" diff --git a/utils/_context/_scenarios/__init__.py b/utils/_context/_scenarios/__init__.py index c5e41de0fc9..96a20809d8e 100644 --- a/utils/_context/_scenarios/__init__.py +++ b/utils/_context/_scenarios/__init__.py @@ -16,6 +16,7 @@ from .auto_injection import InstallerAutoInjectionScenario from .k8s_lib_injection import KubernetesScenario, WeblogInjectionScenario from .docker_ssi import DockerSSIScenario +from .external_processing import ExternalProcessingScenario update_environ_with_local_env() @@ -733,6 +734,8 @@ def all_endtoend_scenarios(test_object): scenario_groups=[ScenarioGroup.APPSEC], ) + external_processing = ExternalProcessingScenario("EXTERNAL_PROCESSING") + def get_all_scenarios() -> list[Scenario]: result = [] diff --git a/utils/_context/_scenarios/core.py b/utils/_context/_scenarios/core.py index 8b8b8205154..3266f15ab8b 100644 --- a/utils/_context/_scenarios/core.py +++ b/utils/_context/_scenarios/core.py @@ -23,6 +23,7 @@ class ScenarioGroup(Enum): ONBOARDING = "onboarding" DOCKER_SSI = "docker-ssi" ESSENTIALS = "essentials" + EXTERNAL_PROCESSING = "external-processing" VALID_GITHUB_WORKFLOWS = { @@ -34,6 +35,7 @@ class ScenarioGroup(Enum): "parametric", "testthetest", "dockerssi", + "externalprocessing", } diff --git a/utils/_context/_scenarios/external_processing.py b/utils/_context/_scenarios/external_processing.py index bfcf460d263..4dad2dcf0c1 100644 --- a/utils/_context/_scenarios/external_processing.py +++ b/utils/_context/_scenarios/external_processing.py @@ -1,8 +1,22 @@ -from .endtoend import EndToEndScenario +from utils._context.containers import DummyServerContainer, ExternalProcessingContainer, EnvoyContainer +from .endtoend import DockerScenario, ScenarioGroup -class ExternalProcessingScenario(EndToEndScenario): - def __init__(self, name, description, ): - super().__init__(name, description) + +class ExternalProcessingScenario(DockerScenario): + def __init__(self, name): + super().__init__( + name, + doc="Envoy + external processing", + github_workflow="externalprocessing", + scenario_groups=[ScenarioGroup.END_TO_END, ScenarioGroup.EXTERNAL_PROCESSING], + use_proxy=True, + ) + + self._external_processing_container = ExternalProcessingContainer(self.host_log_folder) + + self._required_containers.append(self._external_processing_container) + self._required_containers.append(EnvoyContainer(self.host_log_folder)) + self._required_containers.append(DummyServerContainer(self.host_log_folder)) # start envoyproxy/envoy:v1.31-latest⁠ # -> envoy.yaml configuration in tests/external_processing/envoy.yaml @@ -16,7 +30,15 @@ def __init__(self, name, description, ): # with agent url threw system-tests proxy # service extension image: - # https://github.com/DataDog/dd-trace-go/pkgs/container/dd-trace-go%2Fservice-extensions-callout + # https://github.com/DataDog/dd-trace-go/pkgs/container/dd-trace-go%2Fservice-extensions-callout # Version: # tag: dev # base: latest/v*.*.* + + @property + def weblog_variant(self): + return "golang-dummy" + + @property + def library(self): + return self._external_processing_container.library diff --git a/utils/_context/containers.py b/utils/_context/containers.py index ac00f549fde..6299c515229 100644 --- a/utils/_context/containers.py +++ b/utils/_context/containers.py @@ -1079,3 +1079,41 @@ def get_env(self, env_var): """Get env variables from the container """ env = self.image.env | self.environment return env.get(env_var) + + +class DummyServerContainer(TestedContainer): + def __init__(self, host_log_folder) -> None: + super().__init__( + image_name="jasonrm/dummy-server:latest", + name="dummy-server", + host_log_folder=host_log_folder, + ports={"8080": ("127.0.0.1", 8080)}, + healthcheck={"test": "wget http://localhost:8080", "retries": 10,}, + ) + + +class EnvoyContainer(TestedContainer): + def __init__(self, host_log_folder) -> None: + super().__init__( + image_name="envoyproxy/envoy:v1.31-latest", + name="envoy", + host_log_folder=host_log_folder, + # ports={"8080": ("127.0.0.1", 8080)}, + # healthcheck={"test": "wget http://localhost:8080", "retries": 10,}, + ) + + +class ExternalProcessingContainer(TestedContainer): + def __init__(self, host_log_folder) -> None: + super().__init__( + image_name="ghcr.io/datadog/dd-trace-go/service-extensions-callout:latest", + name="extproc", + host_log_folder=host_log_folder, + environment={"DD_APPSEC_ENABLED": "true"} + # ports={"8080": ("127.0.0.1", 8080)}, + # healthcheck={"test": "wget http://localhost:8080", "retries": 10,}, + ) + + @property + def library(self) -> LibraryVersion: + return LibraryVersion("golang", "0.0.0") # TODO From 5973fcaa86db2cbc9e40148c8220037edc9d425c Mon Sep 17 00:00:00 2001 From: Flavien Darche Date: Wed, 2 Oct 2024 17:31:01 +0100 Subject: [PATCH 04/18] Configure Envoy and ExtProc Containers + Update envoy conf --- tests/external_processing/envoy.yaml | 6 +++--- utils/_context/containers.py | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/external_processing/envoy.yaml b/tests/external_processing/envoy.yaml index 2829e6db6e8..ebcfaa88436 100644 --- a/tests/external_processing/envoy.yaml +++ b/tests/external_processing/envoy.yaml @@ -4,7 +4,7 @@ static_resources: address: socket_address: address: 0.0.0.0 - port_value: 8080 + port_value: 80 filter_chains: - filters: - name: envoy.filters.network.http_connection_manager @@ -47,7 +47,7 @@ static_resources: address: socket_address: address: webserver - port_value: 7777 + port_value: 8080 - name: ext_proc_cluster connect_timeout: 0.25s @@ -73,4 +73,4 @@ admin: address: socket_address: address: 0.0.0.0 - port_value: 8001 + port_value: 9901 diff --git a/utils/_context/containers.py b/utils/_context/containers.py index 2b9dfe08610..1c1c2267265 100644 --- a/utils/_context/containers.py +++ b/utils/_context/containers.py @@ -1079,7 +1079,6 @@ def __init__(self, host_log_folder) -> None: image_name="jasonrm/dummy-server:latest", name="dummy-server", host_log_folder=host_log_folder, - ports={"8080": ("127.0.0.1", 8080)}, healthcheck={"test": "wget http://localhost:8080", "retries": 10,}, ) @@ -1090,8 +1089,9 @@ def __init__(self, host_log_folder) -> None: image_name="envoyproxy/envoy:v1.31-latest", name="envoy", host_log_folder=host_log_folder, - # ports={"8080": ("127.0.0.1", 8080)}, - # healthcheck={"test": "wget http://localhost:8080", "retries": 10,}, + volumes={f"./envoy.yaml": {"bind": "/etc/envoy/envoy.yaml", "mode": "ro",}}, + ports={"80": ("127.0.0.1", 80), "9901": ("127.0.0.1", 9901)}, + healthcheck={"test": "wget http://localhost:9901/ready", "retries": 10,}, ) @@ -1102,8 +1102,8 @@ def __init__(self, host_log_folder) -> None: name="extproc", host_log_folder=host_log_folder, environment={"DD_APPSEC_ENABLED": "true"} - # ports={"8080": ("127.0.0.1", 8080)}, - # healthcheck={"test": "wget http://localhost:8080", "retries": 10,}, + ports={"80": ("127.0.0.1", 8080), "443": ("127.0.0.1", 443)}, + healthcheck={"test": "wget http://localhost:8080/", "retries": 10,}, ) @property From 6c5e96ced8730f5640ee2df8782b5ac568b74c62 Mon Sep 17 00:00:00 2001 From: Charles de Beauchesne Date: Thu, 3 Oct 2024 12:58:43 +0200 Subject: [PATCH 05/18] Fix typos --- utils/_context/containers.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/utils/_context/containers.py b/utils/_context/containers.py index 1c1c2267265..316c3ff6352 100644 --- a/utils/_context/containers.py +++ b/utils/_context/containers.py @@ -1089,9 +1089,9 @@ def __init__(self, host_log_folder) -> None: image_name="envoyproxy/envoy:v1.31-latest", name="envoy", host_log_folder=host_log_folder, - volumes={f"./envoy.yaml": {"bind": "/etc/envoy/envoy.yaml", "mode": "ro",}}, - ports={"80": ("127.0.0.1", 80), "9901": ("127.0.0.1", 9901)}, - healthcheck={"test": "wget http://localhost:9901/ready", "retries": 10,}, + volumes={"./tests/external_processing/envoy.yaml": {"bind": "/etc/envoy/envoy.yaml", "mode": "ro",}}, + ports={"80": ("127.0.0.1", 8080), "9901": ("127.0.0.1", 9901)}, + # healthcheck={"test": "wget http://localhost:9901/ready", "retries": 10,}, # no wget on envoy ) @@ -1101,9 +1101,9 @@ def __init__(self, host_log_folder) -> None: image_name="ghcr.io/datadog/dd-trace-go/service-extensions-callout:latest", name="extproc", host_log_folder=host_log_folder, - environment={"DD_APPSEC_ENABLED": "true"} - ports={"80": ("127.0.0.1", 8080), "443": ("127.0.0.1", 443)}, - healthcheck={"test": "wget http://localhost:8080/", "retries": 10,}, + environment={"DD_APPSEC_ENABLED": "true"}, + ports={"80": ("127.0.0.1", 8081), "443": ("127.0.0.1", 8443)}, + healthcheck={"test": "wget http://localhost:80/", "retries": 10,}, ) @property From 7edaced4fed51635b1523eaee097bdab2bede283 Mon Sep 17 00:00:00 2001 From: Charles de Beauchesne Date: Thu, 3 Oct 2024 13:16:55 +0200 Subject: [PATCH 06/18] Connect library version to healtcheck --- utils/_context/containers.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/utils/_context/containers.py b/utils/_context/containers.py index 316c3ff6352..363988f39ba 100644 --- a/utils/_context/containers.py +++ b/utils/_context/containers.py @@ -1096,16 +1096,23 @@ def __init__(self, host_log_folder) -> None: class ExternalProcessingContainer(TestedContainer): + library: LibraryVersion + def __init__(self, host_log_folder) -> None: super().__init__( - image_name="ghcr.io/datadog/dd-trace-go/service-extensions-callout:latest", + image_name="ghcr.io/datadog/dd-trace-go/service-extensions-callout:dev", name="extproc", host_log_folder=host_log_folder, environment={"DD_APPSEC_ENABLED": "true"}, ports={"80": ("127.0.0.1", 8081), "443": ("127.0.0.1", 8443)}, - healthcheck={"test": "wget http://localhost:80/", "retries": 10,}, + healthcheck={"test": "wget -qO- http://localhost:80/", "retries": 10,}, ) - @property - def library(self) -> LibraryVersion: - return LibraryVersion("golang", "0.0.0") # TODO + def post_start(self): + with open(self.healthcheck_log_file, mode="r", encoding="utf-8") as f: + data = json.load(f) + lib = data["library"] + + self.library = LibraryVersion(lib["language"], lib["version"]) + + logger.stdout(f"Library: {self.library}") From 2983b4b7c148693df69f5397633dbfa1cabc9c5e Mon Sep 17 00:00:00 2001 From: Charles de Beauchesne Date: Thu, 3 Oct 2024 13:45:21 +0200 Subject: [PATCH 07/18] Ability to check prod/dev --- .github/workflows/run-external-processing.yml | 5 ++--- .github/workflows/system-tests.yml | 2 +- utils/_context/containers.py | 9 ++++++++- utils/scripts/load-binary.sh | 3 +++ 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/.github/workflows/run-external-processing.yml b/.github/workflows/run-external-processing.yml index 22395d46ad5..67f7af05a61 100644 --- a/.github/workflows/run-external-processing.yml +++ b/.github/workflows/run-external-processing.yml @@ -36,7 +36,6 @@ jobs: uses: ./.github/actions/install_runner - name: Log in to the Container registry - if: ${{ inputs.library == 'ruby' }} run: echo ${{ secrets.GITHUB_TOKEN }} | docker login ${{ env.REGISTRY }} -u ${{ github.actor }} --password-stdin - name: Build proxy image @@ -62,5 +61,5 @@ jobs: if: always() && steps.compress_logs.outcome == 'success' uses: actions/upload-artifact@v4 with: - name: logs_graphql_golang_golang-dummy_${{ inputs.ci_environment }} - path: artifact.tar.gz \ No newline at end of file + name: logs_externalprocessing_golang_golang-dummy_${{ inputs.ci_environment }} + path: artifact.tar.gz diff --git a/.github/workflows/system-tests.yml b/.github/workflows/system-tests.yml index 583d45246fd..2918654c912 100644 --- a/.github/workflows/system-tests.yml +++ b/.github/workflows/system-tests.yml @@ -147,7 +147,7 @@ jobs: external-processing: needs: - compute_parameters - if: ${{ needs.compute_parameters.outputs.externalprocessing_scenarios != '[]' && inputs.binaries_artifact == '' && inputs.library == 'golang' }} + if: ${{ needs.compute_parameters.outputs.externalprocessing_scenarios != '[]' inputs.library == 'golang' }} uses: ./.github/workflows/run-external-processing.yml secrets: inherit with: diff --git a/utils/_context/containers.py b/utils/_context/containers.py index 363988f39ba..e77f00fa876 100644 --- a/utils/_context/containers.py +++ b/utils/_context/containers.py @@ -1099,8 +1099,14 @@ class ExternalProcessingContainer(TestedContainer): library: LibraryVersion def __init__(self, host_log_folder) -> None: + try: + with open("binaries/golang-service-extensions-callout-image", "r", encoding="utf-8") as f: + image = f.read().strip() + except FileNotFoundError: + image = "ghcr.io/datadog/dd-trace-go/service-extensions-callout:latest" + super().__init__( - image_name="ghcr.io/datadog/dd-trace-go/service-extensions-callout:dev", + image_name=image, name="extproc", host_log_folder=host_log_folder, environment={"DD_APPSEC_ENABLED": "true"}, @@ -1116,3 +1122,4 @@ def post_start(self): self.library = LibraryVersion(lib["language"], lib["version"]) logger.stdout(f"Library: {self.library}") + logger.stdout(f"Image: {self.image.name}") diff --git a/utils/scripts/load-binary.sh b/utils/scripts/load-binary.sh index 9e104faf2d5..743f23bb545 100755 --- a/utils/scripts/load-binary.sh +++ b/utils/scripts/load-binary.sh @@ -197,6 +197,9 @@ elif [ "$TARGET" = "golang" ]; then echo "Using gopkg.in/DataDog/dd-trace-go.v1@main" echo "gopkg.in/DataDog/dd-trace-go.v1@main" > golang-load-from-go-get + echo "Using ghcr.io/datadog/dd-trace-go/service-extensions-callout:dev" + echo "ghcr.io/datadog/dd-trace-go/service-extensions-callout:dev" > golang-service-extensions-callout-image + elif [ "$TARGET" = "cpp" ]; then assert_version_is_dev # get_circleci_artifact "gh/DataDog/dd-opentracing-cpp" "build_test_deploy" "build" "TBD" From a91d1c7d10e4fa901890642fabede342eb7488e7 Mon Sep 17 00:00:00 2001 From: Charles de Beauchesne Date: Thu, 3 Oct 2024 18:00:06 +0200 Subject: [PATCH 08/18] Remove useless files --- tests/external_processing/docker-compose.yml | 37 ----------------- tests/external_processing/server.py | 42 -------------------- 2 files changed, 79 deletions(-) delete mode 100644 tests/external_processing/docker-compose.yml delete mode 100644 tests/external_processing/server.py diff --git a/tests/external_processing/docker-compose.yml b/tests/external_processing/docker-compose.yml deleted file mode 100644 index 5df6b74fbfa..00000000000 --- a/tests/external_processing/docker-compose.yml +++ /dev/null @@ -1,37 +0,0 @@ -services: - envoy: - image: envoyproxy/envoy:v1.31-latest - container_name: envoy - ports: - - "8080:8080" - volumes: - - ./envoy.yaml:/etc/envoy/envoy.yaml - depends_on: - - webserver - - extproc - networks: - - app-network - - webserver: - build: - context: ./webserver - container_name: webserver - ports: - - "7777:7777" - networks: - - app-network - - extproc: - image: ghcr.io/datadog/dd-trace-go/service-extensions-callout:latest - container_name: extproc - ports: - - "443:443" - - "80:80" - networks: - - app-network - environment: - - DD_APPSEC_ENABLED=true - -networks: - app-network: - driver: bridge diff --git a/tests/external_processing/server.py b/tests/external_processing/server.py deleted file mode 100644 index f0b8a2dc76a..00000000000 --- a/tests/external_processing/server.py +++ /dev/null @@ -1,42 +0,0 @@ -from http.server import HTTPServer, BaseHTTPRequestHandler -from urllib.parse import urlparse, parse_qs -import json - -class MockHandler(BaseHTTPRequestHandler): - def do_GET(self): - self.route_request() - - def do_POST(self): - self.route_request() - - def route_request(self): - parsed_path = urlparse(self.path) - if parsed_path.path == '/mock': - self.handle_mock() - elif parsed_path.path == '/': - self.send_response(200) - self.end_headers() - self.wfile.write(b'Hello, world!\n') - else: - self.send_response(404) - self.end_headers() - self.wfile.write(b'Not Found\n') - - def handle_mock(self): - content_length = int(self.headers.get('Content-Length', 0)) - body = self.rfile.read(content_length) - body_params = json.loads(body) - - status_code = int(body_params.get('status_code', 200)) # default to 200 - response_body = body_params.get('body', 'Ok!') # default to 'Ok!' - - self.send_response(status_code) - for key, value in body_params.get('headers', {}).items(): - self.send_header(key, value) - self.end_headers() - self.wfile.write(response_body.encode()) - -if __name__ == '__main__': - server = HTTPServer(('0.0.0.0', 7777), MockHandler) - print('Starting server at http://0.0.0.0:7777') - server.serve_forever() From 87176b5a5ea5975b0f15c2ce1382e4e1b661fd75 Mon Sep 17 00:00:00 2001 From: Charles de Beauchesne Date: Thu, 3 Oct 2024 18:01:05 +0200 Subject: [PATCH 09/18] Fix CI --- .github/workflows/system-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/system-tests.yml b/.github/workflows/system-tests.yml index 2918654c912..a726f3a6722 100644 --- a/.github/workflows/system-tests.yml +++ b/.github/workflows/system-tests.yml @@ -147,7 +147,7 @@ jobs: external-processing: needs: - compute_parameters - if: ${{ needs.compute_parameters.outputs.externalprocessing_scenarios != '[]' inputs.library == 'golang' }} + if: ${{ needs.compute_parameters.outputs.externalprocessing_scenarios != '[]' && inputs.library == 'golang' }} uses: ./.github/workflows/run-external-processing.yml secrets: inherit with: From c68de4b2b55c4a99dbb8296644e11d92b8dd4c8b Mon Sep 17 00:00:00 2001 From: Charles de Beauchesne Date: Fri, 4 Oct 2024 18:47:10 +0200 Subject: [PATCH 10/18] infra conf --- docs/scenarios/external_processing.md | 0 tests/external_processing/envoy.yaml | 2 +- utils/_context/containers.py | 8 +++++--- 3 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 docs/scenarios/external_processing.md diff --git a/docs/scenarios/external_processing.md b/docs/scenarios/external_processing.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/external_processing/envoy.yaml b/tests/external_processing/envoy.yaml index ebcfaa88436..14c558f1fee 100644 --- a/tests/external_processing/envoy.yaml +++ b/tests/external_processing/envoy.yaml @@ -46,7 +46,7 @@ static_resources: - endpoint: address: socket_address: - address: webserver + address: http-app port_value: 8080 - name: ext_proc_cluster diff --git a/utils/_context/containers.py b/utils/_context/containers.py index e77f00fa876..929ec2383d1 100644 --- a/utils/_context/containers.py +++ b/utils/_context/containers.py @@ -1077,7 +1077,7 @@ class DummyServerContainer(TestedContainer): def __init__(self, host_log_folder) -> None: super().__init__( image_name="jasonrm/dummy-server:latest", - name="dummy-server", + name="http-app", host_log_folder=host_log_folder, healthcheck={"test": "wget http://localhost:8080", "retries": 10,}, ) @@ -1085,12 +1085,15 @@ def __init__(self, host_log_folder) -> None: class EnvoyContainer(TestedContainer): def __init__(self, host_log_folder) -> None: + + from utils import weblog + super().__init__( image_name="envoyproxy/envoy:v1.31-latest", name="envoy", host_log_folder=host_log_folder, volumes={"./tests/external_processing/envoy.yaml": {"bind": "/etc/envoy/envoy.yaml", "mode": "ro",}}, - ports={"80": ("127.0.0.1", 8080), "9901": ("127.0.0.1", 9901)}, + ports={"80": ("127.0.0.1", weblog.port)}, # healthcheck={"test": "wget http://localhost:9901/ready", "retries": 10,}, # no wget on envoy ) @@ -1110,7 +1113,6 @@ def __init__(self, host_log_folder) -> None: name="extproc", host_log_folder=host_log_folder, environment={"DD_APPSEC_ENABLED": "true"}, - ports={"80": ("127.0.0.1", 8081), "443": ("127.0.0.1", 8443)}, healthcheck={"test": "wget -qO- http://localhost:80/", "retries": 10,}, ) From 70496cddeb7eeb8d23f61c0f0eca376dd61da89a Mon Sep 17 00:00:00 2001 From: Charles de Beauchesne Date: Fri, 4 Oct 2024 19:10:23 +0200 Subject: [PATCH 11/18] agent/proxy --- tests/external_processing/envoy.yaml | 14 ++++++++------ .../test_external_processing.py | 4 ++-- utils/_context/_scenarios/external_processing.py | 10 ++++++++-- utils/_context/containers.py | 2 +- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/tests/external_processing/envoy.yaml b/tests/external_processing/envoy.yaml index 14c558f1fee..95fa7cca2aa 100644 --- a/tests/external_processing/envoy.yaml +++ b/tests/external_processing/envoy.yaml @@ -68,9 +68,11 @@ static_resources: socket_address: address: extproc port_value: 443 -admin: - access_log_path: "/tmp/admin_access.log" - address: - socket_address: - address: 0.0.0.0 - port_value: 9901 + +# used for health checking +# admin: +# access_log_path: "/tmp/admin_access.log" +# address: +# socket_address: +# address: 0.0.0.0 +# port_value: 9901 diff --git a/tests/external_processing/test_external_processing.py b/tests/external_processing/test_external_processing.py index 7b339ccbffa..1206ac4095d 100644 --- a/tests/external_processing/test_external_processing.py +++ b/tests/external_processing/test_external_processing.py @@ -4,12 +4,12 @@ @scenarios.external_processing class Test_ExternalProcessing: def setup_main(self): - self.r = weblog.get("/mock", params={"status_code": 200}, proxy="http:envoy:10000") + self.r = weblog.get("/mock", params={"status_code": 200}) def test_main(self): assert self.r.status_code == 200 - traces = interfaces.library.get_traces() + traces = list(interfaces.library.get_traces()) assert len(traces) == 1 # test whatever you like diff --git a/utils/_context/_scenarios/external_processing.py b/utils/_context/_scenarios/external_processing.py index 4dad2dcf0c1..207c05052c3 100644 --- a/utils/_context/_scenarios/external_processing.py +++ b/utils/_context/_scenarios/external_processing.py @@ -1,4 +1,4 @@ -from utils._context.containers import DummyServerContainer, ExternalProcessingContainer, EnvoyContainer +from utils._context.containers import DummyServerContainer, ExternalProcessingContainer, EnvoyContainer, AgentContainer from .endtoend import DockerScenario, ScenarioGroup @@ -12,10 +12,16 @@ def __init__(self, name): use_proxy=True, ) + self._agent_container = AgentContainer(self.host_log_folder) self._external_processing_container = ExternalProcessingContainer(self.host_log_folder) + self._envoy_container = EnvoyContainer(self.host_log_folder) + self._agent_container.depends_on.append(self.proxy_container) + self._external_processing_container.depends_on.append(self.proxy_container) + + self._required_containers.append(self._agent_container) self._required_containers.append(self._external_processing_container) - self._required_containers.append(EnvoyContainer(self.host_log_folder)) + self._required_containers.append(self._envoy_container) self._required_containers.append(DummyServerContainer(self.host_log_folder)) # start envoyproxy/envoy:v1.31-latest⁠ diff --git a/utils/_context/containers.py b/utils/_context/containers.py index 929ec2383d1..9e4359706a0 100644 --- a/utils/_context/containers.py +++ b/utils/_context/containers.py @@ -1112,7 +1112,7 @@ def __init__(self, host_log_folder) -> None: image_name=image, name="extproc", host_log_folder=host_log_folder, - environment={"DD_APPSEC_ENABLED": "true"}, + environment={"DD_APPSEC_ENABLED": "true", "DD_AGENT_HOST": "proxy", "DD_TRACE_AGENT_PORT": 8126,}, healthcheck={"test": "wget -qO- http://localhost:80/", "retries": 10,}, ) From 7975d05430a81b2148e9988aad4e27662c26f348 Mon Sep 17 00:00:00 2001 From: Charles de Beauchesne Date: Fri, 4 Oct 2024 19:18:07 +0200 Subject: [PATCH 12/18] Create interface folder --- utils/_context/_scenarios/external_processing.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/utils/_context/_scenarios/external_processing.py b/utils/_context/_scenarios/external_processing.py index 207c05052c3..e68a33edd74 100644 --- a/utils/_context/_scenarios/external_processing.py +++ b/utils/_context/_scenarios/external_processing.py @@ -41,9 +41,21 @@ def __init__(self, name): # tag: dev # base: latest/v*.*.* + def _create_interface_folders(self): + self._create_log_subfolder("interfaces/agent") + self._create_log_subfolder("interfaces/library") + + def get_warmups(self) -> list: + warmups = super().get_warmups() + + if not self.replay: + warmups.insert(0, self._create_interface_folders) + + return warmups + @property def weblog_variant(self): - return "golang-dummy" + return "external-processing" @property def library(self): From 93ca95f884a4ea31f089f028f00308a78896cba5 Mon Sep 17 00:00:00 2001 From: Charles de Beauchesne Date: Fri, 4 Oct 2024 19:42:06 +0200 Subject: [PATCH 13/18] poc! --- .github/workflows/run-external-processing.yml | 2 +- .../test_external_processing.py | 7 +- utils/_context/_scenarios/endtoend.py | 56 ++++++++-------- .../_scenarios/external_processing.py | 64 ++++++++++++++++++- 4 files changed, 96 insertions(+), 33 deletions(-) diff --git a/.github/workflows/run-external-processing.yml b/.github/workflows/run-external-processing.yml index 67f7af05a61..482979ea4bf 100644 --- a/.github/workflows/run-external-processing.yml +++ b/.github/workflows/run-external-processing.yml @@ -47,7 +47,7 @@ jobs: library: golang weblog: golang-dummy scenarios: '["EXTERNAL_PROCESSING"]' - + - name: Run EXTERNAL_PROCESSING scenario run: ./run.sh EXTERNAL_PROCESSING env: diff --git a/tests/external_processing/test_external_processing.py b/tests/external_processing/test_external_processing.py index 1206ac4095d..4ea2542b446 100644 --- a/tests/external_processing/test_external_processing.py +++ b/tests/external_processing/test_external_processing.py @@ -9,8 +9,7 @@ def setup_main(self): def test_main(self): assert self.r.status_code == 200 - traces = list(interfaces.library.get_traces()) + interfaces.library.assert_trace_exists(self.r) - assert len(traces) == 1 - # test whatever you like - assert traces[0]["request"]["url"] == "http://envoy:10000/mock?status_code=200" + for _, span in interfaces.library.get_root_spans(request=self.r): + assert span["meta"]["http.url"] == "http://localhost:7777/mock?status_code=200" diff --git a/utils/_context/_scenarios/endtoend.py b/utils/_context/_scenarios/endtoend.py index cc284ee71c0..d1525b495c1 100644 --- a/utils/_context/_scenarios/endtoend.py +++ b/utils/_context/_scenarios/endtoend.py @@ -106,6 +106,30 @@ def get_container_by_dd_integration_name(self, name): return container return None + def _start_interfaces_watchdog(self, interfaces): + class Event(FileSystemEventHandler): + def __init__(self, interface) -> None: + super().__init__() + self.interface = interface + + def _ingest(self, event): + if event.is_directory: + return + + self.interface.ingest_file(event.src_path) + + on_modified = _ingest + on_created = _ingest + + # lot of issue using the default OS dependant notifiers (not working on WSL, reaching some inotify watcher + # limits on Linux) -> using the good old bare polling system + observer = PollingObserver() + + for interface in interfaces: + observer.schedule(Event(interface), path=interface._log_folder) + + observer.start() + def get_warmups(self): warmups = super().get_warmups() @@ -306,41 +330,19 @@ def _create_interface_folders(self): for container in self.buddies: self._create_log_subfolder(f"interfaces/{container.interface.name}") - def _start_interface_watchdog(self): + def _start_interfaces_watchdog(self, _=None): from utils import interfaces - class Event(FileSystemEventHandler): - def __init__(self, interface) -> None: - super().__init__() - self.interface = interface - - def _ingest(self, event): - if event.is_directory: - return - - self.interface.ingest_file(event.src_path) - - on_modified = _ingest - on_created = _ingest - - # lot of issue using the default OS dependant notifiers (not working on WSL, reaching some inotify watcher - # limits on Linux) -> using the good old bare polling system - observer = PollingObserver() - - observer.schedule(Event(interfaces.library), path=f"{self.host_log_folder}/interfaces/library") - observer.schedule(Event(interfaces.agent), path=f"{self.host_log_folder}/interfaces/agent") - - for container in self.buddies: - observer.schedule(Event(container.interface), path=container.interface._log_folder) - - observer.start() + super()._start_interfaces_watchdog( + [interfaces.library, interfaces.agent] + [container.interface for container in self.buddies] + ) def get_warmups(self): warmups = super().get_warmups() if not self.replay: warmups.insert(0, self._create_interface_folders) - warmups.insert(1, self._start_interface_watchdog) + warmups.insert(1, self._start_interfaces_watchdog) warmups.append(self._get_weblog_system_info) warmups.append(self._wait_for_app_readiness) diff --git a/utils/_context/_scenarios/external_processing.py b/utils/_context/_scenarios/external_processing.py index e68a33edd74..f96c11fd82e 100644 --- a/utils/_context/_scenarios/external_processing.py +++ b/utils/_context/_scenarios/external_processing.py @@ -1,4 +1,8 @@ +import pytest + from utils._context.containers import DummyServerContainer, ExternalProcessingContainer, EnvoyContainer, AgentContainer +from utils.tools import logger + from .endtoend import DockerScenario, ScenarioGroup @@ -15,6 +19,7 @@ def __init__(self, name): self._agent_container = AgentContainer(self.host_log_folder) self._external_processing_container = ExternalProcessingContainer(self.host_log_folder) self._envoy_container = EnvoyContainer(self.host_log_folder) + self._http_app_container = DummyServerContainer(self.host_log_folder) self._agent_container.depends_on.append(self.proxy_container) self._external_processing_container.depends_on.append(self.proxy_container) @@ -22,7 +27,7 @@ def __init__(self, name): self._required_containers.append(self._agent_container) self._required_containers.append(self._external_processing_container) self._required_containers.append(self._envoy_container) - self._required_containers.append(DummyServerContainer(self.host_log_folder)) + self._required_containers.append(self._http_app_container) # start envoyproxy/envoy:v1.31-latest⁠ # -> envoy.yaml configuration in tests/external_processing/envoy.yaml @@ -45,14 +50,71 @@ def _create_interface_folders(self): self._create_log_subfolder("interfaces/agent") self._create_log_subfolder("interfaces/library") + def _start_interfaces_watchdog(self, _=None): + from utils import interfaces + + super()._start_interfaces_watchdog([interfaces.library, interfaces.agent]) + + def _wait_for_app_readiness(self): + from utils import interfaces # import here to avoid circular import + + logger.debug("Wait for app readiness") + + if not interfaces.library.ready.wait(40): + pytest.exit("Nothing received from external processing", 1) + logger.debug("Library ready") + + if not interfaces.agent.ready.wait(40): + pytest.exit("Datadog agent not ready", 1) + logger.debug("Agent ready") + def get_warmups(self) -> list: warmups = super().get_warmups() if not self.replay: warmups.insert(0, self._create_interface_folders) + warmups.insert(1, self._start_interfaces_watchdog) + warmups.append(self._wait_for_app_readiness) return warmups + def post_setup(self): + try: + self._wait_and_stop_containers() + finally: + self.close_targets() + + def _wait_and_stop_containers(self): + from utils import interfaces + + if self.replay: + logger.terminal.write_sep("-", "Load all data from logs") + logger.terminal.flush() + + interfaces.library.load_data_from_logs() + interfaces.library.check_deserialization_errors() + + interfaces.agent.load_data_from_logs() + interfaces.agent.check_deserialization_errors() + + else: + self._wait_interface(interfaces.library, 5) + + self._http_app_container.stop() + self._envoy_container.stop() + self._external_processing_container.stop() + + interfaces.library.check_deserialization_errors() + + self._agent_container.stop() + interfaces.agent.check_deserialization_errors() + + def _wait_interface(self, interface, timeout): + logger.terminal.write_sep("-", f"Wait for {interface} ({timeout}s)") + logger.terminal.flush() + + interface.wait(timeout) + @property def weblog_variant(self): return "external-processing" From 7f148427988b45263edc06f8d2a2a48b74ad701c Mon Sep 17 00:00:00 2001 From: Charles de Beauchesne Date: Fri, 4 Oct 2024 19:44:06 +0200 Subject: [PATCH 14/18] Doc --- docs/scenarios/external_processing.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/scenarios/external_processing.md b/docs/scenarios/external_processing.md index e69de29bb2d..2646668dbdd 100644 --- a/docs/scenarios/external_processing.md +++ b/docs/scenarios/external_processing.md @@ -0,0 +1,17 @@ +```mermaid +flowchart LR +%% Nodes + A("Test runner") + B("Envoy") + C("External Processing") + D("HTTP app") + E("Proxy") + F("Agent") + G("Backend") + +%% Edge connections between nodes + A --> B --> D + B --> C --> B + C --> E --> F --> G + %% D -- Mermaid js --> I --> J +``` \ No newline at end of file From bfd80f475cd9dea4142f895b4b098f171ad754f0 Mon Sep 17 00:00:00 2001 From: Charles de Beauchesne Date: Mon, 7 Oct 2024 11:09:17 +0200 Subject: [PATCH 15/18] Fix CI --- .github/workflows/ci.yml | 2 +- tests/external_processing/test_external_processing.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3240d112e92..f624dab5fda 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -109,7 +109,7 @@ jobs: with: library: ${{ matrix.library }} scenarios: ${{ needs.scenarios.outputs.scenarios }} - scenarios_groups: external-processing # DO NOT MERGE ${{ needs.scenarios.outputs.scenarios_groups }} + scenarios_groups: ${{ needs.scenarios.outputs.scenarios_groups }} binaries_artifact: ${{ matrix.version == 'dev' && format('binaries_dev_{0}', matrix.library) || '' }} ci_environment: ${{ matrix.version }} build_python_base_images: ${{ contains(github.event.pull_request.labels.*.name, 'build-python-base-images') }} diff --git a/tests/external_processing/test_external_processing.py b/tests/external_processing/test_external_processing.py index 4ea2542b446..8afaca34279 100644 --- a/tests/external_processing/test_external_processing.py +++ b/tests/external_processing/test_external_processing.py @@ -1,6 +1,7 @@ -from utils import weblog, interfaces, scenarios +from utils import weblog, interfaces, scenarios, features +@features.not_reported # it's just a POC. We'll need to figure out how we want to see results in FPD @scenarios.external_processing class Test_ExternalProcessing: def setup_main(self): From 9d769c2b5c6ebe7bddf7fd9ec8633b1d45416c3f Mon Sep 17 00:00:00 2001 From: Charles de Beauchesne Date: Mon, 7 Oct 2024 13:48:22 +0200 Subject: [PATCH 16/18] Fix CI --- .github/workflows/run-external-processing.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/run-external-processing.yml b/.github/workflows/run-external-processing.yml index 482979ea4bf..eea01b2a5fc 100644 --- a/.github/workflows/run-external-processing.yml +++ b/.github/workflows/run-external-processing.yml @@ -19,7 +19,7 @@ env: jobs: - graphql: + external-processing: runs-on: group: "APM Larger Runners" @@ -38,9 +38,6 @@ jobs: - name: Log in to the Container registry run: echo ${{ secrets.GITHUB_TOKEN }} | docker login ${{ env.REGISTRY }} -u ${{ github.actor }} --password-stdin - - name: Build proxy image - if: inputs.build_proxy_image - run: ./build.sh -i proxy - name: Pull images uses: ./.github/actions/pull_images with: @@ -48,6 +45,13 @@ jobs: weblog: golang-dummy scenarios: '["EXTERNAL_PROCESSING"]' + - name: Build proxy image + if: inputs.build_proxy_image + run: ./build.sh -i proxy + + - name: Build agent image + run: ./build.sh -i agent + - name: Run EXTERNAL_PROCESSING scenario run: ./run.sh EXTERNAL_PROCESSING env: From c8868ed13da5b42833536507432b834570b348ae Mon Sep 17 00:00:00 2001 From: Charles de Beauchesne Date: Mon, 7 Oct 2024 13:48:50 +0200 Subject: [PATCH 17/18] Add binaries artifact to WF process --- .github/workflows/run-external-processing.yml | 12 ++++++++++++ .github/workflows/system-tests.yml | 1 + 2 files changed, 13 insertions(+) diff --git a/.github/workflows/run-external-processing.yml b/.github/workflows/run-external-processing.yml index eea01b2a5fc..1bdc5c23dab 100644 --- a/.github/workflows/run-external-processing.yml +++ b/.github/workflows/run-external-processing.yml @@ -3,6 +3,11 @@ name: External-processing tests on: workflow_call: inputs: + binaries_artifact: + description: "Artifact name containing the binaries to test" + default: '' + required: false + type: string ci_environment: description: "Which CI environment is running the tests, used for FPD" default: 'custom' @@ -38,6 +43,13 @@ jobs: - name: Log in to the Container registry run: echo ${{ secrets.GITHUB_TOKEN }} | docker login ${{ env.REGISTRY }} -u ${{ github.actor }} --password-stdin + - name: Get binaries artifact + if : ${{ inputs.binaries_artifact != '' }} + uses: actions/download-artifact@v4 + with: + name: ${{ inputs.binaries_artifact }} + path: binaries/ + - name: Pull images uses: ./.github/actions/pull_images with: diff --git a/.github/workflows/system-tests.yml b/.github/workflows/system-tests.yml index a726f3a6722..a8b4eb2b6bc 100644 --- a/.github/workflows/system-tests.yml +++ b/.github/workflows/system-tests.yml @@ -153,3 +153,4 @@ jobs: with: build_proxy_image: ${{ inputs.build_proxy_image }} ci_environment: ${{ inputs.ci_environment }} + binaries_artifact: ${{ inputs.binaries_artifact }} From 788450b396faa9b0bd542a1f5224c2b0b85c4dee Mon Sep 17 00:00:00 2001 From: Charles de Beauchesne Date: Mon, 7 Oct 2024 15:52:29 +0200 Subject: [PATCH 18/18] So far, external processing not working on released lib --- .github/workflows/system-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/system-tests.yml b/.github/workflows/system-tests.yml index a8b4eb2b6bc..9b9406b6a02 100644 --- a/.github/workflows/system-tests.yml +++ b/.github/workflows/system-tests.yml @@ -147,7 +147,7 @@ jobs: external-processing: needs: - compute_parameters - if: ${{ needs.compute_parameters.outputs.externalprocessing_scenarios != '[]' && inputs.library == 'golang' }} + if: ${{ needs.compute_parameters.outputs.externalprocessing_scenarios != '[]' && inputs.library == 'golang' && inputs.binaries_artifact != ''}} uses: ./.github/workflows/run-external-processing.yml secrets: inherit with: