...
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