1#[allow(unused_imports)]
6mod prelude {
7 pub use kube::CustomResource;
8 pub use typed_builder::TypedBuilder;
9 pub use schemars::JsonSchema;
10 pub use serde::{Serialize, Deserialize};
11 pub use std::collections::BTreeMap;
12 pub use k8s_openapi::apimachinery::pkg::util::intstr::IntOrString;
13}
14use self::prelude::*;
15
16#[derive(CustomResource, Serialize, Deserialize, Clone, Debug, TypedBuilder, Default, PartialEq, JsonSchema)]
18#[kube(group = "traefik.io", version = "v1alpha1", kind = "IngressRoute", plural = "ingressroutes")]
19#[kube(namespaced)]
20#[kube(derive="Default")]
21#[kube(derive="PartialEq")]
22pub struct IngressRouteSpec {
23 #[serde(default, skip_serializing_if = "Option::is_none", rename = "entryPoints")]
28 #[builder(default, setter(strip_option))]
29 pub entry_points: Option<Vec<String>>,
30 #[builder(default)]
32 pub routes: Vec<IngressRouteRoutes>,
33 #[serde(default, skip_serializing_if = "Option::is_none")]
36 #[builder(default, setter(strip_option))]
37 pub tls: Option<IngressRouteTls>,
38}
39
40#[derive(Serialize, Deserialize, Clone, Debug, TypedBuilder, Default, PartialEq, JsonSchema)]
42pub struct IngressRouteRoutes {
43 #[serde(default, skip_serializing_if = "Option::is_none")]
47 #[builder(default, setter(strip_option))]
48 pub kind: Option<IngressRouteRoutesKind>,
49 #[serde(rename = "match")]
52 pub r#match: String,
53 #[serde(default, skip_serializing_if = "Option::is_none")]
56 #[builder(default, setter(strip_option))]
57 pub middlewares: Option<Vec<IngressRouteRoutesMiddlewares>>,
58 #[serde(default, skip_serializing_if = "Option::is_none")]
61 #[builder(default, setter(strip_option))]
62 pub observability: Option<IngressRouteRoutesObservability>,
63 #[serde(default, skip_serializing_if = "Option::is_none")]
66 #[builder(default, setter(strip_option))]
67 pub priority: Option<i64>,
68 #[serde(default, skip_serializing_if = "Option::is_none")]
71 #[builder(default, setter(strip_option))]
72 pub services: Option<Vec<IngressRouteRoutesServices>>,
73 #[serde(default, skip_serializing_if = "Option::is_none")]
76 #[builder(default, setter(strip_option))]
77 pub syntax: Option<String>,
78}
79
80#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
82pub enum IngressRouteRoutesKind {
83 Rule,
84}
85
86#[derive(Serialize, Deserialize, Clone, Debug, TypedBuilder, Default, PartialEq, JsonSchema)]
88pub struct IngressRouteRoutesMiddlewares {
89 pub name: String,
91 #[serde(default, skip_serializing_if = "Option::is_none")]
93 #[builder(default, setter(strip_option))]
94 pub namespace: Option<String>,
95}
96
97#[derive(Serialize, Deserialize, Clone, Debug, TypedBuilder, Default, PartialEq, JsonSchema)]
100pub struct IngressRouteRoutesObservability {
101 #[serde(default, skip_serializing_if = "Option::is_none", rename = "accessLogs")]
102 #[builder(default, setter(strip_option))]
103 pub access_logs: Option<bool>,
104 #[serde(default, skip_serializing_if = "Option::is_none")]
105 #[builder(default, setter(strip_option))]
106 pub metrics: Option<bool>,
107 #[serde(default, skip_serializing_if = "Option::is_none")]
108 #[builder(default, setter(strip_option))]
109 pub tracing: Option<bool>,
110}
111
112#[derive(Serialize, Deserialize, Clone, Debug, TypedBuilder, Default, PartialEq, JsonSchema)]
114pub struct IngressRouteRoutesServices {
115 #[serde(default, skip_serializing_if = "Option::is_none", rename = "healthCheck")]
117 #[builder(default, setter(strip_option))]
118 pub health_check: Option<IngressRouteRoutesServicesHealthCheck>,
119 #[serde(default, skip_serializing_if = "Option::is_none")]
121 #[builder(default, setter(strip_option))]
122 pub kind: Option<IngressRouteRoutesServicesKind>,
123 pub name: String,
126 #[serde(default, skip_serializing_if = "Option::is_none")]
128 #[builder(default, setter(strip_option))]
129 pub namespace: Option<String>,
130 #[serde(default, skip_serializing_if = "Option::is_none", rename = "nativeLB")]
135 #[builder(default, setter(strip_option))]
136 pub native_lb: Option<bool>,
137 #[serde(default, skip_serializing_if = "Option::is_none", rename = "nodePortLB")]
142 #[builder(default, setter(strip_option))]
143 pub node_port_lb: Option<bool>,
144 #[serde(default, skip_serializing_if = "Option::is_none", rename = "passHostHeader")]
147 #[builder(default, setter(strip_option))]
148 pub pass_host_header: Option<bool>,
149 #[serde(default, skip_serializing_if = "Option::is_none")]
152 #[builder(default, setter(strip_option))]
153 pub port: Option<IntOrString>,
154 #[serde(default, skip_serializing_if = "Option::is_none", rename = "responseForwarding")]
156 #[builder(default, setter(strip_option))]
157 pub response_forwarding: Option<IngressRouteRoutesServicesResponseForwarding>,
158 #[serde(default, skip_serializing_if = "Option::is_none")]
161 #[builder(default, setter(strip_option))]
162 pub scheme: Option<String>,
163 #[serde(default, skip_serializing_if = "Option::is_none", rename = "serversTransport")]
167 #[builder(default, setter(strip_option))]
168 pub servers_transport: Option<String>,
169 #[serde(default, skip_serializing_if = "Option::is_none")]
172 #[builder(default, setter(strip_option))]
173 pub sticky: Option<IngressRouteRoutesServicesSticky>,
174 #[serde(default, skip_serializing_if = "Option::is_none")]
177 #[builder(default, setter(strip_option))]
178 pub strategy: Option<String>,
179 #[serde(default, skip_serializing_if = "Option::is_none")]
182 #[builder(default, setter(strip_option))]
183 pub weight: Option<i64>,
184}
185
186#[derive(Serialize, Deserialize, Clone, Debug, TypedBuilder, Default, PartialEq, JsonSchema)]
188pub struct IngressRouteRoutesServicesHealthCheck {
189 #[serde(default, skip_serializing_if = "Option::is_none", rename = "followRedirects")]
192 #[builder(default, setter(strip_option))]
193 pub follow_redirects: Option<bool>,
194 #[serde(default, skip_serializing_if = "Option::is_none")]
196 #[builder(default, setter(strip_option))]
197 pub headers: Option<BTreeMap<String, String>>,
198 #[serde(default, skip_serializing_if = "Option::is_none")]
200 #[builder(default, setter(strip_option))]
201 pub hostname: Option<String>,
202 #[serde(default, skip_serializing_if = "Option::is_none")]
205 #[builder(default, setter(strip_option))]
206 pub interval: Option<IntOrString>,
207 #[serde(default, skip_serializing_if = "Option::is_none")]
209 #[builder(default, setter(strip_option))]
210 pub method: Option<String>,
211 #[serde(default, skip_serializing_if = "Option::is_none")]
215 #[builder(default, setter(strip_option))]
216 pub mode: Option<String>,
217 #[serde(default, skip_serializing_if = "Option::is_none")]
219 #[builder(default, setter(strip_option))]
220 pub path: Option<String>,
221 #[serde(default, skip_serializing_if = "Option::is_none")]
223 #[builder(default, setter(strip_option))]
224 pub port: Option<i64>,
225 #[serde(default, skip_serializing_if = "Option::is_none")]
227 #[builder(default, setter(strip_option))]
228 pub scheme: Option<String>,
229 #[serde(default, skip_serializing_if = "Option::is_none")]
231 #[builder(default, setter(strip_option))]
232 pub status: Option<i64>,
233 #[serde(default, skip_serializing_if = "Option::is_none")]
236 #[builder(default, setter(strip_option))]
237 pub timeout: Option<IntOrString>,
238}
239
240#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
242pub enum IngressRouteRoutesServicesKind {
243 Service,
244 TraefikService,
245}
246
247#[derive(Serialize, Deserialize, Clone, Debug, TypedBuilder, Default, PartialEq, JsonSchema)]
249pub struct IngressRouteRoutesServicesResponseForwarding {
250 #[serde(default, skip_serializing_if = "Option::is_none", rename = "flushInterval")]
256 #[builder(default, setter(strip_option))]
257 pub flush_interval: Option<String>,
258}
259
260#[derive(Serialize, Deserialize, Clone, Debug, TypedBuilder, Default, PartialEq, JsonSchema)]
263pub struct IngressRouteRoutesServicesSticky {
264 #[serde(default, skip_serializing_if = "Option::is_none")]
266 #[builder(default, setter(strip_option))]
267 pub cookie: Option<IngressRouteRoutesServicesStickyCookie>,
268}
269
270#[derive(Serialize, Deserialize, Clone, Debug, TypedBuilder, Default, PartialEq, JsonSchema)]
272pub struct IngressRouteRoutesServicesStickyCookie {
273 #[serde(default, skip_serializing_if = "Option::is_none", rename = "httpOnly")]
275 #[builder(default, setter(strip_option))]
276 pub http_only: Option<bool>,
277 #[serde(default, skip_serializing_if = "Option::is_none", rename = "maxAge")]
281 #[builder(default, setter(strip_option))]
282 pub max_age: Option<i64>,
283 #[serde(default, skip_serializing_if = "Option::is_none")]
285 #[builder(default, setter(strip_option))]
286 pub name: Option<String>,
287 #[serde(default, skip_serializing_if = "Option::is_none")]
291 #[builder(default, setter(strip_option))]
292 pub path: Option<String>,
293 #[serde(default, skip_serializing_if = "Option::is_none", rename = "sameSite")]
296 #[builder(default, setter(strip_option))]
297 pub same_site: Option<String>,
298 #[serde(default, skip_serializing_if = "Option::is_none")]
300 #[builder(default, setter(strip_option))]
301 pub secure: Option<bool>,
302}
303
304#[derive(Serialize, Deserialize, Clone, Debug, TypedBuilder, Default, PartialEq, JsonSchema)]
307pub struct IngressRouteTls {
308 #[serde(default, skip_serializing_if = "Option::is_none", rename = "certResolver")]
312 #[builder(default, setter(strip_option))]
313 pub cert_resolver: Option<String>,
314 #[serde(default, skip_serializing_if = "Option::is_none")]
317 #[builder(default, setter(strip_option))]
318 pub domains: Option<Vec<IngressRouteTlsDomains>>,
319 #[serde(default, skip_serializing_if = "Option::is_none")]
323 #[builder(default, setter(strip_option))]
324 pub options: Option<IngressRouteTlsOptions>,
325 #[serde(default, skip_serializing_if = "Option::is_none", rename = "secretName")]
327 #[builder(default, setter(strip_option))]
328 pub secret_name: Option<String>,
329 #[serde(default, skip_serializing_if = "Option::is_none")]
332 #[builder(default, setter(strip_option))]
333 pub store: Option<IngressRouteTlsStore>,
334}
335
336#[derive(Serialize, Deserialize, Clone, Debug, TypedBuilder, Default, PartialEq, JsonSchema)]
338pub struct IngressRouteTlsDomains {
339 #[serde(default, skip_serializing_if = "Option::is_none")]
341 #[builder(default, setter(strip_option))]
342 pub main: Option<String>,
343 #[serde(default, skip_serializing_if = "Option::is_none")]
345 #[builder(default, setter(strip_option))]
346 pub sans: Option<Vec<String>>,
347}
348
349#[derive(Serialize, Deserialize, Clone, Debug, TypedBuilder, Default, PartialEq, JsonSchema)]
353pub struct IngressRouteTlsOptions {
354 pub name: String,
357 #[serde(default, skip_serializing_if = "Option::is_none")]
360 #[builder(default, setter(strip_option))]
361 pub namespace: Option<String>,
362}
363
364#[derive(Serialize, Deserialize, Clone, Debug, TypedBuilder, Default, PartialEq, JsonSchema)]
367pub struct IngressRouteTlsStore {
368 pub name: String,
371 #[serde(default, skip_serializing_if = "Option::is_none")]
374 #[builder(default, setter(strip_option))]
375 pub namespace: Option<String>,
376}
377