...

Text file src/github.com/datawire/ambassador/v2/python/tests/kat/t_logservice.py

Documentation: github.com/datawire/ambassador/v2/python/tests/kat

     1from typing import Generator, Literal, Tuple, Union
     2
     3from abstract_tests import ALSGRPC, HTTP, AmbassadorTest, Node, ServiceType
     4from ambassador import Config
     5from kat.harness import Query
     6
     7
     8class LogServiceTest(AmbassadorTest):
     9    target: ServiceType
    10    specified_protocol_version: Literal["v2", "v3", "default"]
    11    expected_protocol_version: Literal["v2", "v3"]
    12    als: ServiceType
    13
    14    @classmethod
    15    def variants(cls) -> Generator[Node, None, None]:
    16        for protocol_version in ["v2", "v3", "default"]:
    17            yield cls(protocol_version, name="{self.specified_protocol_version}")
    18
    19    def init(self, protocol_version: Literal["v2", "v3", "default"]):
    20        self.target = HTTP()
    21        self.specified_protocol_version = protocol_version
    22        self.expected_protocol_version = "v2" if protocol_version == "default" else protocol_version
    23        if Config.envoy_api_version == "V2" and self.expected_protocol_version == "v3":
    24            self.skip_node = True
    25        self.als = ALSGRPC()
    26
    27    def config(self) -> Generator[Union[str, Tuple[Node, str]], None, None]:
    28        yield self, self.format(
    29            """
    30---
    31apiVersion: getambassador.io/v3alpha1
    32kind: LogService
    33name: custom-http-logging
    34service: {self.als.path.fqdn}
    35grpc: true
    36driver: http
    37driver_config:
    38  additional_log_headers:
    39    - header_name: "included-on-all"
    40    - header_name: "not-included-on-trailer"
    41      during_trailer: false
    42    - header_name: "not-included on resp-trail"
    43      during_trailer: false
    44      during_response: false
    45    - header_name: "not-anywhere"
    46      during_trailer: false
    47      during_response: false
    48      during_request: false
    49flush_interval_time: 1
    50flush_interval_byte_size: 1
    51"""
    52        ) + (
    53            ""
    54            if self.specified_protocol_version == "default"
    55            else f"protocol_version: '{self.specified_protocol_version}'"
    56        )
    57        yield self, self.format(
    58            """
    59---
    60apiVersion: getambassador.io/v3alpha1
    61kind: Mapping
    62name:  accesslog_target_mapping
    63hostname: "*"
    64prefix: /target/
    65service: {self.target.path.fqdn}
    66"""
    67        )
    68
    69    def queries(self):
    70        yield Query(f"http://{self.als.path.fqdn}/logs", method="DELETE", phase=1)
    71        yield Query(self.url("target/foo"), phase=2)
    72        yield Query(self.url("target/bar"), phase=3)
    73        yield Query(f"http://{self.als.path.fqdn}/logs", phase=4)
    74
    75    def check(self):
    76        logs = self.results[3].json
    77        expkey = f"als{self.expected_protocol_version}-http"
    78        assert logs[expkey]
    79        for key in ["alsv2-http", "alsv2-tcp", "alsv3-http", "alsv3-tcp"]:
    80            if key == expkey:
    81                continue
    82            assert not logs[key]
    83
    84        assert len(logs[expkey]) == 2
    85        assert logs[expkey][0]["request"]["original_path"] == "/target/foo"
    86        assert logs[expkey][1]["request"]["original_path"] == "/target/bar"
    87
    88
    89class LogServiceLongServiceNameTest(AmbassadorTest):
    90    target: ServiceType
    91    als: ServiceType
    92
    93    def init(self):
    94        self.target = HTTP()
    95        self.als = ALSGRPC()
    96
    97    def manifests(self) -> str:
    98        return (
    99            self.format(
   100                """
   101---
   102kind: Service
   103apiVersion: v1
   104metadata:
   105  name: logservicelongservicename-longnamewithnearly60characters
   106spec:
   107  selector:
   108    backend: {self.als.path.k8s}
   109  ports:
   110  - name: http
   111    protocol: TCP
   112    port: 80
   113    targetPort: 8080
   114  - name: https
   115    protocol: TCP
   116    port: 443
   117    targetPort: 8443
   118"""
   119            )
   120            + super().manifests()
   121        )
   122
   123    def config(self) -> Generator[Union[str, Tuple[Node, str]], None, None]:
   124        yield self, self.format(
   125            """
   126---
   127apiVersion: getambassador.io/v3alpha1
   128kind: LogService
   129name: custom-http-logging
   130service: logservicelongservicename-longnamewithnearly60characters
   131grpc: true
   132driver: http
   133driver_config:
   134  additional_log_headers:
   135    - header_name: "included-on-all"
   136    - header_name: "not-included-on-trailer"
   137      during_trailer: false
   138    - header_name: "not-included on resp-trail"
   139      during_trailer: false
   140      during_response: false
   141    - header_name: "not-anywhere"
   142      during_trailer: false
   143      during_response: false
   144      during_request: false
   145flush_interval_time: 1
   146flush_interval_byte_size: 1
   147      """
   148        )
   149        yield self, self.format(
   150            """
   151---
   152apiVersion: getambassador.io/v3alpha1
   153kind: Mapping
   154name:  accesslog_target_mapping
   155hostname: "*"
   156prefix: /target/
   157service: {self.target.path.fqdn}
   158"""
   159        )
   160
   161    def queries(self):
   162        yield Query(f"http://{self.als.path.fqdn}/logs", method="DELETE", phase=1)
   163        yield Query(self.url("target/foo"), phase=2)
   164        yield Query(self.url("target/bar"), phase=3)
   165        yield Query(f"http://{self.als.path.fqdn}/logs", phase=4)
   166
   167    def check(self):
   168        logs = self.results[3].json
   169        assert logs["alsv2-http"]
   170        assert not logs["alsv2-tcp"]
   171        assert not logs["alsv3-http"]
   172        assert not logs["alsv3-tcp"]
   173
   174        assert len(logs["alsv2-http"]) == 2
   175        assert logs["alsv2-http"][0]["request"]["original_path"] == "/target/foo"
   176        assert logs["alsv2-http"][1]["request"]["original_path"] == "/target/bar"

View as plain text