use crate::*;
#[derive(
Clone,
Debug,
Default,
kube::CustomResource,
serde::Deserialize,
serde::Serialize,
schemars::JsonSchema,
)]
#[kube(
group = "gateway.networking.k8s.io",
version = "v1beta1",
kind = "HTTPRoute",
root = "HttpRoute",
status = "HttpRouteStatus",
namespaced
)]
pub struct HttpRouteSpec {
#[serde(flatten)]
pub inner: CommonRouteSpec,
pub hostnames: Option<Vec<Hostname>>,
pub rules: Option<Vec<HttpRouteRule>>,
}
#[derive(
Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize, schemars::JsonSchema,
)]
#[serde(rename_all = "camelCase")]
pub struct HttpRouteRule {
pub matches: Option<Vec<HttpRouteMatch>>,
pub filters: Option<Vec<HttpRouteFilter>>,
pub backend_refs: Option<Vec<HttpBackendRef>>,
}
#[derive(
Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize, schemars::JsonSchema,
)]
#[serde(rename_all = "camelCase")]
pub struct HttpRouteMatch {
pub path: Option<HttpPathMatch>,
pub headers: Option<Vec<HttpHeaderMatch>>,
pub query_params: Option<Vec<HttpQueryParamMatch>>,
pub method: Option<HttpMethod>,
}
#[derive(
Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize, schemars::JsonSchema,
)]
#[serde(tag = "type", rename_all = "PascalCase")]
pub enum HttpPathMatch {
Exact { value: String },
PathPrefix { value: String },
RegularExpression { value: String },
}
pub type HttpHeaderName = String;
#[derive(
Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize, schemars::JsonSchema,
)]
#[serde(tag = "type", rename_all = "PascalCase")]
pub enum HttpHeaderMatch {
#[serde(rename_all = "camelCase")]
Exact { name: HttpHeaderName, value: String },
#[serde(rename_all = "camelCase")]
RegularExpression {
name: HttpHeaderName,
value: String,
},
}
#[derive(
Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize, schemars::JsonSchema,
)]
#[serde(tag = "type", rename_all = "PascalCase")]
pub enum HttpQueryParamMatch {
#[serde(rename_all = "camelCase")]
Exact { name: String, value: String },
#[serde(rename_all = "camelCase")]
RegularExpression { name: String, value: String },
}
pub type HttpMethod = String;
#[derive(
Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize, schemars::JsonSchema,
)]
#[serde(tag = "type", rename_all = "PascalCase")]
pub enum HttpRouteFilter {
#[serde(rename_all = "camelCase")]
RequestHeaderModifier {
request_header_modifier: HttpRequestHeaderFilter,
},
#[serde(rename_all = "camelCase")]
ResponseHeaderModifier {
response_header_modifier: HttpRequestHeaderFilter,
},
#[serde(rename_all = "camelCase")]
RequestMirror {
request_mirror: HttpRequestMirrorFilter,
},
#[serde(rename_all = "camelCase")]
RequestRedirect {
request_redirect: HttpRequestRedirectFilter,
},
#[serde(rename_all = "camelCase")]
URLRewrite { url_rewrite: HttpUrlRewriteFilter },
#[serde(rename_all = "camelCase")]
ExtensionRef { extension_ref: LocalObjectReference },
}
#[derive(
Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize, schemars::JsonSchema,
)]
pub struct HttpRequestHeaderFilter {
pub set: Option<Vec<HttpHeader>>,
pub add: Option<Vec<HttpHeader>>,
pub remove: Option<Vec<String>>,
}
#[derive(
Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize, schemars::JsonSchema,
)]
pub struct HttpHeader {
pub name: HttpHeaderName,
pub value: String,
}
#[derive(
Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize, schemars::JsonSchema,
)]
#[serde(tag = "type", rename_all = "PascalCase")]
pub enum HttpPathModifier {
#[serde(rename_all = "camelCase")]
ReplaceFullPath { replace_full_path: String },
#[serde(rename_all = "camelCase")]
ReplacePrefixMatch { replace_prefix_match: String },
}
#[derive(
Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize, schemars::JsonSchema,
)]
#[serde(rename_all = "camelCase")]
pub struct HttpRequestRedirectFilter {
pub scheme: Option<String>,
pub hostname: Option<PreciseHostname>,
pub path: Option<HttpPathModifier>,
pub port: Option<PortNumber>,
pub status_code: Option<u16>,
}
#[derive(
Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize, schemars::JsonSchema,
)]
pub struct HttpUrlRewriteFilter {
pub hostname: Option<PreciseHostname>,
pub path: Option<HttpPathModifier>,
}
#[derive(
Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize, schemars::JsonSchema,
)]
#[serde(rename_all = "camelCase")]
pub struct HttpRequestMirrorFilter {
pub backend_ref: BackendObjectReference,
}
#[derive(
Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize, schemars::JsonSchema,
)]
#[serde(rename_all = "camelCase")]
pub struct HttpBackendRef {
#[serde(flatten)]
pub backend_ref: Option<BackendRef>,
pub filters: Option<Vec<HttpRouteFilter>>,
}
#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
pub struct HttpRouteStatus {
#[serde(flatten)]
pub inner: RouteStatus,
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_deserialize_http_route() {
let test_json = r#"{
"apiVersion":"gateway.networking.k8s.io/v1beta1",
"kind":"HTTPRoute",
"metadata":{"name":"route_name"},
"spec":{
"parentRefs":null,
"hostnames":null,
"rules":[{
"matches":null,
"filters":[{
"type":"URLRewrite",
"urlRewrite":{
"hostname":null,
"path":{
"type":"ReplacePrefixMatch",
"replacePrefixMatch":"/"
}
}
}],
"backendRefs":null
}]}}"#;
let route: Result<HttpRoute, _> = serde_json::from_str(test_json);
assert!(route.is_ok());
}
}