k8s_crds_cert_manager/
clusterissuers.rs

1// WARNING: generated by kopium - manual changes will be overwritten
2// kopium command: kopium -f clusterissuers.yml --schema=derived --docs -b --derive=Default --derive=PartialEq --smart-derive-elision
3// kopium version: 0.21.2
4
5#[allow(unused_imports)]
6mod prelude {
7    pub use k8s_openapi::apimachinery::pkg::apis::meta::v1::Condition;
8    pub use k8s_openapi::apimachinery::pkg::util::intstr::IntOrString;
9    pub use kube_derive::CustomResource;
10    #[cfg(feature = "schemars")]
11    pub use schemars::JsonSchema;
12    pub use serde::{Deserialize, Serialize};
13    pub use std::collections::BTreeMap;
14    #[cfg(feature = "builder")]
15    pub use typed_builder::TypedBuilder;
16}
17use self::prelude::*;
18
19/// Desired state of the ClusterIssuer resource.
20#[derive(CustomResource, Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
21#[cfg_attr(feature = "builder", derive(TypedBuilder))]
22#[cfg_attr(feature = "schemars", derive(JsonSchema))]
23#[cfg_attr(not(feature = "schemars"), kube(schema = "disabled"))]
24#[kube(
25    group = "cert-manager.io",
26    version = "v1",
27    kind = "ClusterIssuer",
28    plural = "clusterissuers"
29)]
30#[kube(status = "ClusterIssuerStatus")]
31#[kube(derive = "Default")]
32#[kube(derive = "PartialEq")]
33pub struct ClusterIssuerSpec {
34    /// ACME configures this issuer to communicate with a RFC8555 (ACME) server
35    /// to obtain signed x509 certificates.
36    #[serde(default, skip_serializing_if = "Option::is_none")]
37    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
38    pub acme: Option<ClusterIssuerAcme>,
39    /// CA configures this issuer to sign certificates using a signing CA keypair
40    /// stored in a Secret resource.
41    /// This is used to build internal PKIs that are managed by cert-manager.
42    #[serde(default, skip_serializing_if = "Option::is_none")]
43    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
44    pub ca: Option<ClusterIssuerCa>,
45    /// SelfSigned configures this issuer to 'self sign' certificates using the
46    /// private key used to create the CertificateRequest object.
47    #[serde(
48        default,
49        skip_serializing_if = "Option::is_none",
50        rename = "selfSigned"
51    )]
52    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
53    pub self_signed: Option<ClusterIssuerSelfSigned>,
54    /// Vault configures this issuer to sign certificates using a HashiCorp Vault
55    /// PKI backend.
56    #[serde(default, skip_serializing_if = "Option::is_none")]
57    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
58    pub vault: Option<ClusterIssuerVault>,
59    /// Venafi configures this issuer to sign certificates using a Venafi TPP
60    /// or Venafi Cloud policy zone.
61    #[serde(default, skip_serializing_if = "Option::is_none")]
62    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
63    pub venafi: Option<ClusterIssuerVenafi>,
64}
65
66/// ACME configures this issuer to communicate with a RFC8555 (ACME) server
67/// to obtain signed x509 certificates.
68#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
69#[cfg_attr(feature = "builder", derive(TypedBuilder))]
70#[cfg_attr(feature = "schemars", derive(JsonSchema))]
71pub struct ClusterIssuerAcme {
72    /// Base64-encoded bundle of PEM CAs which can be used to validate the certificate
73    /// chain presented by the ACME server.
74    /// Mutually exclusive with SkipTLSVerify; prefer using CABundle to prevent various
75    /// kinds of security vulnerabilities.
76    /// If CABundle and SkipTLSVerify are unset, the system certificate bundle inside
77    /// the container is used to validate the TLS connection.
78    #[serde(default, skip_serializing_if = "Option::is_none", rename = "caBundle")]
79    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
80    pub ca_bundle: Option<String>,
81    /// Enables or disables generating a new ACME account key.
82    /// If true, the Issuer resource will *not* request a new account but will expect
83    /// the account key to be supplied via an existing secret.
84    /// If false, the cert-manager system will generate a new ACME account key
85    /// for the Issuer.
86    /// Defaults to false.
87    #[serde(
88        default,
89        skip_serializing_if = "Option::is_none",
90        rename = "disableAccountKeyGeneration"
91    )]
92    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
93    pub disable_account_key_generation: Option<bool>,
94    /// Email is the email address to be associated with the ACME account.
95    /// This field is optional, but it is strongly recommended to be set.
96    /// It will be used to contact you in case of issues with your account or
97    /// certificates, including expiry notification emails.
98    /// This field may be updated after the account is initially registered.
99    #[serde(default, skip_serializing_if = "Option::is_none")]
100    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
101    pub email: Option<String>,
102    /// Enables requesting a Not After date on certificates that matches the
103    /// duration of the certificate. This is not supported by all ACME servers
104    /// like Let's Encrypt. If set to true when the ACME server does not support
105    /// it, it will create an error on the Order.
106    /// Defaults to false.
107    #[serde(
108        default,
109        skip_serializing_if = "Option::is_none",
110        rename = "enableDurationFeature"
111    )]
112    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
113    pub enable_duration_feature: Option<bool>,
114    /// ExternalAccountBinding is a reference to a CA external account of the ACME
115    /// server.
116    /// If set, upon registration cert-manager will attempt to associate the given
117    /// external account credentials with the registered ACME account.
118    #[serde(
119        default,
120        skip_serializing_if = "Option::is_none",
121        rename = "externalAccountBinding"
122    )]
123    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
124    pub external_account_binding: Option<ClusterIssuerAcmeExternalAccountBinding>,
125    /// PreferredChain is the chain to use if the ACME server outputs multiple.
126    /// PreferredChain is no guarantee that this one gets delivered by the ACME
127    /// endpoint.
128    /// For example, for Let's Encrypt's DST cross-sign you would use:
129    /// "DST Root CA X3" or "ISRG Root X1" for the newer Let's Encrypt root CA.
130    /// This value picks the first certificate bundle in the combined set of
131    /// ACME default and alternative chains that has a root-most certificate with
132    /// this value as its issuer's commonname.
133    #[serde(
134        default,
135        skip_serializing_if = "Option::is_none",
136        rename = "preferredChain"
137    )]
138    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
139    pub preferred_chain: Option<String>,
140    /// PrivateKey is the name of a Kubernetes Secret resource that will be used to
141    /// store the automatically generated ACME account private key.
142    /// Optionally, a `key` may be specified to select a specific entry within
143    /// the named Secret resource.
144    /// If `key` is not specified, a default of `tls.key` will be used.
145    #[serde(rename = "privateKeySecretRef")]
146    pub private_key_secret_ref: ClusterIssuerAcmePrivateKeySecretRef,
147    /// Profile allows requesting a certificate profile from the ACME server.
148    /// Supported profiles are listed by the server's ACME directory URL.
149    #[serde(default, skip_serializing_if = "Option::is_none")]
150    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
151    pub profile: Option<String>,
152    /// Server is the URL used to access the ACME server's 'directory' endpoint.
153    /// For example, for Let's Encrypt's staging endpoint, you would use:
154    /// "https://acme-staging-v02.api.letsencrypt.org/directory".
155    /// Only ACME v2 endpoints (i.e. RFC 8555) are supported.
156    pub server: String,
157    /// INSECURE: Enables or disables validation of the ACME server TLS certificate.
158    /// If true, requests to the ACME server will not have the TLS certificate chain
159    /// validated.
160    /// Mutually exclusive with CABundle; prefer using CABundle to prevent various
161    /// kinds of security vulnerabilities.
162    /// Only enable this option in development environments.
163    /// If CABundle and SkipTLSVerify are unset, the system certificate bundle inside
164    /// the container is used to validate the TLS connection.
165    /// Defaults to false.
166    #[serde(
167        default,
168        skip_serializing_if = "Option::is_none",
169        rename = "skipTLSVerify"
170    )]
171    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
172    pub skip_tls_verify: Option<bool>,
173    /// Solvers is a list of challenge solvers that will be used to solve
174    /// ACME challenges for the matching domains.
175    /// Solver configurations must be provided in order to obtain certificates
176    /// from an ACME server.
177    /// For more information, see: https://cert-manager.io/docs/configuration/acme/
178    #[serde(default, skip_serializing_if = "Option::is_none")]
179    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
180    pub solvers: Option<Vec<ClusterIssuerAcmeSolvers>>,
181}
182
183/// ExternalAccountBinding is a reference to a CA external account of the ACME
184/// server.
185/// If set, upon registration cert-manager will attempt to associate the given
186/// external account credentials with the registered ACME account.
187#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
188#[cfg_attr(feature = "builder", derive(TypedBuilder))]
189#[cfg_attr(feature = "schemars", derive(JsonSchema))]
190pub struct ClusterIssuerAcmeExternalAccountBinding {
191    /// Deprecated: keyAlgorithm field exists for historical compatibility
192    /// reasons and should not be used. The algorithm is now hardcoded to HS256
193    /// in golang/x/crypto/acme.
194    #[serde(
195        default,
196        skip_serializing_if = "Option::is_none",
197        rename = "keyAlgorithm"
198    )]
199    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
200    pub key_algorithm: Option<ClusterIssuerAcmeExternalAccountBindingKeyAlgorithm>,
201    /// keyID is the ID of the CA key that the External Account is bound to.
202    #[serde(rename = "keyID")]
203    pub key_id: String,
204    /// keySecretRef is a Secret Key Selector referencing a data item in a Kubernetes
205    /// Secret which holds the symmetric MAC key of the External Account Binding.
206    /// The `key` is the index string that is paired with the key data in the
207    /// Secret and should not be confused with the key data itself, or indeed with
208    /// the External Account Binding keyID above.
209    /// The secret key stored in the Secret **must** be un-padded, base64 URL
210    /// encoded data.
211    #[serde(rename = "keySecretRef")]
212    pub key_secret_ref: ClusterIssuerAcmeExternalAccountBindingKeySecretRef,
213}
214
215/// ExternalAccountBinding is a reference to a CA external account of the ACME
216/// server.
217/// If set, upon registration cert-manager will attempt to associate the given
218/// external account credentials with the registered ACME account.
219#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
220#[cfg_attr(feature = "schemars", derive(JsonSchema))]
221pub enum ClusterIssuerAcmeExternalAccountBindingKeyAlgorithm {
222    #[serde(rename = "HS256")]
223    Hs256,
224    #[serde(rename = "HS384")]
225    Hs384,
226    #[serde(rename = "HS512")]
227    Hs512,
228}
229
230/// keySecretRef is a Secret Key Selector referencing a data item in a Kubernetes
231/// Secret which holds the symmetric MAC key of the External Account Binding.
232/// The `key` is the index string that is paired with the key data in the
233/// Secret and should not be confused with the key data itself, or indeed with
234/// the External Account Binding keyID above.
235/// The secret key stored in the Secret **must** be un-padded, base64 URL
236/// encoded data.
237#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
238#[cfg_attr(feature = "builder", derive(TypedBuilder))]
239#[cfg_attr(feature = "schemars", derive(JsonSchema))]
240pub struct ClusterIssuerAcmeExternalAccountBindingKeySecretRef {
241    /// The key of the entry in the Secret resource's `data` field to be used.
242    /// Some instances of this field may be defaulted, in others it may be
243    /// required.
244    #[serde(default, skip_serializing_if = "Option::is_none")]
245    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
246    pub key: Option<String>,
247    /// Name of the resource being referred to.
248    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
249    pub name: String,
250}
251
252/// PrivateKey is the name of a Kubernetes Secret resource that will be used to
253/// store the automatically generated ACME account private key.
254/// Optionally, a `key` may be specified to select a specific entry within
255/// the named Secret resource.
256/// If `key` is not specified, a default of `tls.key` will be used.
257#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
258#[cfg_attr(feature = "builder", derive(TypedBuilder))]
259#[cfg_attr(feature = "schemars", derive(JsonSchema))]
260pub struct ClusterIssuerAcmePrivateKeySecretRef {
261    /// The key of the entry in the Secret resource's `data` field to be used.
262    /// Some instances of this field may be defaulted, in others it may be
263    /// required.
264    #[serde(default, skip_serializing_if = "Option::is_none")]
265    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
266    pub key: Option<String>,
267    /// Name of the resource being referred to.
268    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
269    pub name: String,
270}
271
272/// An ACMEChallengeSolver describes how to solve ACME challenges for the issuer it is part of.
273/// A selector may be provided to use different solving strategies for different DNS names.
274/// Only one of HTTP01 or DNS01 must be provided.
275#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
276#[cfg_attr(feature = "builder", derive(TypedBuilder))]
277#[cfg_attr(feature = "schemars", derive(JsonSchema))]
278pub struct ClusterIssuerAcmeSolvers {
279    /// Configures cert-manager to attempt to complete authorizations by
280    /// performing the DNS01 challenge flow.
281    #[serde(default, skip_serializing_if = "Option::is_none")]
282    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
283    pub dns01: Option<ClusterIssuerAcmeSolversDns01>,
284    /// Configures cert-manager to attempt to complete authorizations by
285    /// performing the HTTP01 challenge flow.
286    /// It is not possible to obtain certificates for wildcard domain names
287    /// (e.g., `*.example.com`) using the HTTP01 challenge mechanism.
288    #[serde(default, skip_serializing_if = "Option::is_none")]
289    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
290    pub http01: Option<ClusterIssuerAcmeSolversHttp01>,
291    /// Selector selects a set of DNSNames on the Certificate resource that
292    /// should be solved using this challenge solver.
293    /// If not specified, the solver will be treated as the 'default' solver
294    /// with the lowest priority, i.e. if any other solver has a more specific
295    /// match, it will be used instead.
296    #[serde(default, skip_serializing_if = "Option::is_none")]
297    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
298    pub selector: Option<ClusterIssuerAcmeSolversSelector>,
299}
300
301/// Configures cert-manager to attempt to complete authorizations by
302/// performing the DNS01 challenge flow.
303#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
304#[cfg_attr(feature = "builder", derive(TypedBuilder))]
305#[cfg_attr(feature = "schemars", derive(JsonSchema))]
306pub struct ClusterIssuerAcmeSolversDns01 {
307    /// Use the 'ACME DNS' (https://github.com/joohoi/acme-dns) API to manage
308    /// DNS01 challenge records.
309    #[serde(default, skip_serializing_if = "Option::is_none", rename = "acmeDNS")]
310    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
311    pub acme_dns: Option<ClusterIssuerAcmeSolversDns01AcmeDns>,
312    /// Use the Akamai DNS zone management API to manage DNS01 challenge records.
313    #[serde(default, skip_serializing_if = "Option::is_none")]
314    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
315    pub akamai: Option<ClusterIssuerAcmeSolversDns01Akamai>,
316    /// Use the Microsoft Azure DNS API to manage DNS01 challenge records.
317    #[serde(default, skip_serializing_if = "Option::is_none", rename = "azureDNS")]
318    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
319    pub azure_dns: Option<ClusterIssuerAcmeSolversDns01AzureDns>,
320    /// Use the Google Cloud DNS API to manage DNS01 challenge records.
321    #[serde(default, skip_serializing_if = "Option::is_none", rename = "cloudDNS")]
322    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
323    pub cloud_dns: Option<ClusterIssuerAcmeSolversDns01CloudDns>,
324    /// Use the Cloudflare API to manage DNS01 challenge records.
325    #[serde(default, skip_serializing_if = "Option::is_none")]
326    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
327    pub cloudflare: Option<ClusterIssuerAcmeSolversDns01Cloudflare>,
328    /// CNAMEStrategy configures how the DNS01 provider should handle CNAME
329    /// records when found in DNS zones.
330    #[serde(
331        default,
332        skip_serializing_if = "Option::is_none",
333        rename = "cnameStrategy"
334    )]
335    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
336    pub cname_strategy: Option<ClusterIssuerAcmeSolversDns01CnameStrategy>,
337    /// Use the DigitalOcean DNS API to manage DNS01 challenge records.
338    #[serde(default, skip_serializing_if = "Option::is_none")]
339    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
340    pub digitalocean: Option<ClusterIssuerAcmeSolversDns01Digitalocean>,
341    /// Use RFC2136 ("Dynamic Updates in the Domain Name System") (https://datatracker.ietf.org/doc/rfc2136/)
342    /// to manage DNS01 challenge records.
343    #[serde(default, skip_serializing_if = "Option::is_none")]
344    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
345    pub rfc2136: Option<ClusterIssuerAcmeSolversDns01Rfc2136>,
346    /// Use the AWS Route53 API to manage DNS01 challenge records.
347    #[serde(default, skip_serializing_if = "Option::is_none")]
348    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
349    pub route53: Option<ClusterIssuerAcmeSolversDns01Route53>,
350    /// Configure an external webhook based DNS01 challenge solver to manage
351    /// DNS01 challenge records.
352    #[serde(default, skip_serializing_if = "Option::is_none")]
353    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
354    pub webhook: Option<ClusterIssuerAcmeSolversDns01Webhook>,
355}
356
357/// Use the 'ACME DNS' (https://github.com/joohoi/acme-dns) API to manage
358/// DNS01 challenge records.
359#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
360#[cfg_attr(feature = "builder", derive(TypedBuilder))]
361#[cfg_attr(feature = "schemars", derive(JsonSchema))]
362pub struct ClusterIssuerAcmeSolversDns01AcmeDns {
363    /// A reference to a specific 'key' within a Secret resource.
364    /// In some instances, `key` is a required field.
365    #[serde(rename = "accountSecretRef")]
366    pub account_secret_ref: ClusterIssuerAcmeSolversDns01AcmeDnsAccountSecretRef,
367    pub host: String,
368}
369
370/// A reference to a specific 'key' within a Secret resource.
371/// In some instances, `key` is a required field.
372#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
373#[cfg_attr(feature = "builder", derive(TypedBuilder))]
374#[cfg_attr(feature = "schemars", derive(JsonSchema))]
375pub struct ClusterIssuerAcmeSolversDns01AcmeDnsAccountSecretRef {
376    /// The key of the entry in the Secret resource's `data` field to be used.
377    /// Some instances of this field may be defaulted, in others it may be
378    /// required.
379    #[serde(default, skip_serializing_if = "Option::is_none")]
380    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
381    pub key: Option<String>,
382    /// Name of the resource being referred to.
383    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
384    pub name: String,
385}
386
387/// Use the Akamai DNS zone management API to manage DNS01 challenge records.
388#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
389#[cfg_attr(feature = "builder", derive(TypedBuilder))]
390#[cfg_attr(feature = "schemars", derive(JsonSchema))]
391pub struct ClusterIssuerAcmeSolversDns01Akamai {
392    /// A reference to a specific 'key' within a Secret resource.
393    /// In some instances, `key` is a required field.
394    #[serde(rename = "accessTokenSecretRef")]
395    pub access_token_secret_ref: ClusterIssuerAcmeSolversDns01AkamaiAccessTokenSecretRef,
396    /// A reference to a specific 'key' within a Secret resource.
397    /// In some instances, `key` is a required field.
398    #[serde(rename = "clientSecretSecretRef")]
399    pub client_secret_secret_ref: ClusterIssuerAcmeSolversDns01AkamaiClientSecretSecretRef,
400    /// A reference to a specific 'key' within a Secret resource.
401    /// In some instances, `key` is a required field.
402    #[serde(rename = "clientTokenSecretRef")]
403    pub client_token_secret_ref: ClusterIssuerAcmeSolversDns01AkamaiClientTokenSecretRef,
404    #[serde(rename = "serviceConsumerDomain")]
405    pub service_consumer_domain: String,
406}
407
408/// A reference to a specific 'key' within a Secret resource.
409/// In some instances, `key` is a required field.
410#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
411#[cfg_attr(feature = "builder", derive(TypedBuilder))]
412#[cfg_attr(feature = "schemars", derive(JsonSchema))]
413pub struct ClusterIssuerAcmeSolversDns01AkamaiAccessTokenSecretRef {
414    /// The key of the entry in the Secret resource's `data` field to be used.
415    /// Some instances of this field may be defaulted, in others it may be
416    /// required.
417    #[serde(default, skip_serializing_if = "Option::is_none")]
418    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
419    pub key: Option<String>,
420    /// Name of the resource being referred to.
421    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
422    pub name: String,
423}
424
425/// A reference to a specific 'key' within a Secret resource.
426/// In some instances, `key` is a required field.
427#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
428#[cfg_attr(feature = "builder", derive(TypedBuilder))]
429#[cfg_attr(feature = "schemars", derive(JsonSchema))]
430pub struct ClusterIssuerAcmeSolversDns01AkamaiClientSecretSecretRef {
431    /// The key of the entry in the Secret resource's `data` field to be used.
432    /// Some instances of this field may be defaulted, in others it may be
433    /// required.
434    #[serde(default, skip_serializing_if = "Option::is_none")]
435    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
436    pub key: Option<String>,
437    /// Name of the resource being referred to.
438    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
439    pub name: String,
440}
441
442/// A reference to a specific 'key' within a Secret resource.
443/// In some instances, `key` is a required field.
444#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
445#[cfg_attr(feature = "builder", derive(TypedBuilder))]
446#[cfg_attr(feature = "schemars", derive(JsonSchema))]
447pub struct ClusterIssuerAcmeSolversDns01AkamaiClientTokenSecretRef {
448    /// The key of the entry in the Secret resource's `data` field to be used.
449    /// Some instances of this field may be defaulted, in others it may be
450    /// required.
451    #[serde(default, skip_serializing_if = "Option::is_none")]
452    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
453    pub key: Option<String>,
454    /// Name of the resource being referred to.
455    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
456    pub name: String,
457}
458
459/// Use the Microsoft Azure DNS API to manage DNS01 challenge records.
460#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
461#[cfg_attr(feature = "builder", derive(TypedBuilder))]
462#[cfg_attr(feature = "schemars", derive(JsonSchema))]
463pub struct ClusterIssuerAcmeSolversDns01AzureDns {
464    /// Auth: Azure Service Principal:
465    /// The ClientID of the Azure Service Principal used to authenticate with Azure DNS.
466    /// If set, ClientSecret and TenantID must also be set.
467    #[serde(default, skip_serializing_if = "Option::is_none", rename = "clientID")]
468    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
469    pub client_id: Option<String>,
470    /// Auth: Azure Service Principal:
471    /// A reference to a Secret containing the password associated with the Service Principal.
472    /// If set, ClientID and TenantID must also be set.
473    #[serde(
474        default,
475        skip_serializing_if = "Option::is_none",
476        rename = "clientSecretSecretRef"
477    )]
478    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
479    pub client_secret_secret_ref:
480        Option<ClusterIssuerAcmeSolversDns01AzureDnsClientSecretSecretRef>,
481    /// name of the Azure environment (default AzurePublicCloud)
482    #[serde(default, skip_serializing_if = "Option::is_none")]
483    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
484    pub environment: Option<ClusterIssuerAcmeSolversDns01AzureDnsEnvironment>,
485    /// name of the DNS zone that should be used
486    #[serde(
487        default,
488        skip_serializing_if = "Option::is_none",
489        rename = "hostedZoneName"
490    )]
491    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
492    pub hosted_zone_name: Option<String>,
493    /// Auth: Azure Workload Identity or Azure Managed Service Identity:
494    /// Settings to enable Azure Workload Identity or Azure Managed Service Identity
495    /// If set, ClientID, ClientSecret and TenantID must not be set.
496    #[serde(
497        default,
498        skip_serializing_if = "Option::is_none",
499        rename = "managedIdentity"
500    )]
501    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
502    pub managed_identity: Option<ClusterIssuerAcmeSolversDns01AzureDnsManagedIdentity>,
503    /// resource group the DNS zone is located in
504    #[serde(rename = "resourceGroupName")]
505    pub resource_group_name: String,
506    /// ID of the Azure subscription
507    #[serde(rename = "subscriptionID")]
508    pub subscription_id: String,
509    /// Auth: Azure Service Principal:
510    /// The TenantID of the Azure Service Principal used to authenticate with Azure DNS.
511    /// If set, ClientID and ClientSecret must also be set.
512    #[serde(default, skip_serializing_if = "Option::is_none", rename = "tenantID")]
513    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
514    pub tenant_id: Option<String>,
515}
516
517/// Auth: Azure Service Principal:
518/// A reference to a Secret containing the password associated with the Service Principal.
519/// If set, ClientID and TenantID must also be set.
520#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
521#[cfg_attr(feature = "builder", derive(TypedBuilder))]
522#[cfg_attr(feature = "schemars", derive(JsonSchema))]
523pub struct ClusterIssuerAcmeSolversDns01AzureDnsClientSecretSecretRef {
524    /// The key of the entry in the Secret resource's `data` field to be used.
525    /// Some instances of this field may be defaulted, in others it may be
526    /// required.
527    #[serde(default, skip_serializing_if = "Option::is_none")]
528    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
529    pub key: Option<String>,
530    /// Name of the resource being referred to.
531    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
532    pub name: String,
533}
534
535/// Use the Microsoft Azure DNS API to manage DNS01 challenge records.
536#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
537#[cfg_attr(feature = "schemars", derive(JsonSchema))]
538pub enum ClusterIssuerAcmeSolversDns01AzureDnsEnvironment {
539    AzurePublicCloud,
540    AzureChinaCloud,
541    AzureGermanCloud,
542    #[serde(rename = "AzureUSGovernmentCloud")]
543    AzureUsGovernmentCloud,
544}
545
546/// Auth: Azure Workload Identity or Azure Managed Service Identity:
547/// Settings to enable Azure Workload Identity or Azure Managed Service Identity
548/// If set, ClientID, ClientSecret and TenantID must not be set.
549#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
550#[cfg_attr(feature = "builder", derive(TypedBuilder))]
551#[cfg_attr(feature = "schemars", derive(JsonSchema))]
552pub struct ClusterIssuerAcmeSolversDns01AzureDnsManagedIdentity {
553    /// client ID of the managed identity, cannot be used at the same time as resourceID
554    #[serde(default, skip_serializing_if = "Option::is_none", rename = "clientID")]
555    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
556    pub client_id: Option<String>,
557    /// resource ID of the managed identity, cannot be used at the same time as clientID
558    /// Cannot be used for Azure Managed Service Identity
559    #[serde(
560        default,
561        skip_serializing_if = "Option::is_none",
562        rename = "resourceID"
563    )]
564    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
565    pub resource_id: Option<String>,
566    /// tenant ID of the managed identity, cannot be used at the same time as resourceID
567    #[serde(default, skip_serializing_if = "Option::is_none", rename = "tenantID")]
568    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
569    pub tenant_id: Option<String>,
570}
571
572/// Use the Google Cloud DNS API to manage DNS01 challenge records.
573#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
574#[cfg_attr(feature = "builder", derive(TypedBuilder))]
575#[cfg_attr(feature = "schemars", derive(JsonSchema))]
576pub struct ClusterIssuerAcmeSolversDns01CloudDns {
577    /// HostedZoneName is an optional field that tells cert-manager in which
578    /// Cloud DNS zone the challenge record has to be created.
579    /// If left empty cert-manager will automatically choose a zone.
580    #[serde(
581        default,
582        skip_serializing_if = "Option::is_none",
583        rename = "hostedZoneName"
584    )]
585    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
586    pub hosted_zone_name: Option<String>,
587    pub project: String,
588    /// A reference to a specific 'key' within a Secret resource.
589    /// In some instances, `key` is a required field.
590    #[serde(
591        default,
592        skip_serializing_if = "Option::is_none",
593        rename = "serviceAccountSecretRef"
594    )]
595    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
596    pub service_account_secret_ref:
597        Option<ClusterIssuerAcmeSolversDns01CloudDnsServiceAccountSecretRef>,
598}
599
600/// A reference to a specific 'key' within a Secret resource.
601/// In some instances, `key` is a required field.
602#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
603#[cfg_attr(feature = "builder", derive(TypedBuilder))]
604#[cfg_attr(feature = "schemars", derive(JsonSchema))]
605pub struct ClusterIssuerAcmeSolversDns01CloudDnsServiceAccountSecretRef {
606    /// The key of the entry in the Secret resource's `data` field to be used.
607    /// Some instances of this field may be defaulted, in others it may be
608    /// required.
609    #[serde(default, skip_serializing_if = "Option::is_none")]
610    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
611    pub key: Option<String>,
612    /// Name of the resource being referred to.
613    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
614    pub name: String,
615}
616
617/// Use the Cloudflare API to manage DNS01 challenge records.
618#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
619#[cfg_attr(feature = "builder", derive(TypedBuilder))]
620#[cfg_attr(feature = "schemars", derive(JsonSchema))]
621pub struct ClusterIssuerAcmeSolversDns01Cloudflare {
622    /// API key to use to authenticate with Cloudflare.
623    /// Note: using an API token to authenticate is now the recommended method
624    /// as it allows greater control of permissions.
625    #[serde(
626        default,
627        skip_serializing_if = "Option::is_none",
628        rename = "apiKeySecretRef"
629    )]
630    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
631    pub api_key_secret_ref: Option<ClusterIssuerAcmeSolversDns01CloudflareApiKeySecretRef>,
632    /// API token used to authenticate with Cloudflare.
633    #[serde(
634        default,
635        skip_serializing_if = "Option::is_none",
636        rename = "apiTokenSecretRef"
637    )]
638    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
639    pub api_token_secret_ref: Option<ClusterIssuerAcmeSolversDns01CloudflareApiTokenSecretRef>,
640    /// Email of the account, only required when using API key based authentication.
641    #[serde(default, skip_serializing_if = "Option::is_none")]
642    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
643    pub email: Option<String>,
644}
645
646/// API key to use to authenticate with Cloudflare.
647/// Note: using an API token to authenticate is now the recommended method
648/// as it allows greater control of permissions.
649#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
650#[cfg_attr(feature = "builder", derive(TypedBuilder))]
651#[cfg_attr(feature = "schemars", derive(JsonSchema))]
652pub struct ClusterIssuerAcmeSolversDns01CloudflareApiKeySecretRef {
653    /// The key of the entry in the Secret resource's `data` field to be used.
654    /// Some instances of this field may be defaulted, in others it may be
655    /// required.
656    #[serde(default, skip_serializing_if = "Option::is_none")]
657    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
658    pub key: Option<String>,
659    /// Name of the resource being referred to.
660    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
661    pub name: String,
662}
663
664/// API token used to authenticate with Cloudflare.
665#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
666#[cfg_attr(feature = "builder", derive(TypedBuilder))]
667#[cfg_attr(feature = "schemars", derive(JsonSchema))]
668pub struct ClusterIssuerAcmeSolversDns01CloudflareApiTokenSecretRef {
669    /// The key of the entry in the Secret resource's `data` field to be used.
670    /// Some instances of this field may be defaulted, in others it may be
671    /// required.
672    #[serde(default, skip_serializing_if = "Option::is_none")]
673    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
674    pub key: Option<String>,
675    /// Name of the resource being referred to.
676    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
677    pub name: String,
678}
679
680/// Configures cert-manager to attempt to complete authorizations by
681/// performing the DNS01 challenge flow.
682#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
683#[cfg_attr(feature = "schemars", derive(JsonSchema))]
684pub enum ClusterIssuerAcmeSolversDns01CnameStrategy {
685    None,
686    Follow,
687}
688
689/// Use the DigitalOcean DNS API to manage DNS01 challenge records.
690#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
691#[cfg_attr(feature = "builder", derive(TypedBuilder))]
692#[cfg_attr(feature = "schemars", derive(JsonSchema))]
693pub struct ClusterIssuerAcmeSolversDns01Digitalocean {
694    /// A reference to a specific 'key' within a Secret resource.
695    /// In some instances, `key` is a required field.
696    #[serde(rename = "tokenSecretRef")]
697    pub token_secret_ref: ClusterIssuerAcmeSolversDns01DigitaloceanTokenSecretRef,
698}
699
700/// A reference to a specific 'key' within a Secret resource.
701/// In some instances, `key` is a required field.
702#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
703#[cfg_attr(feature = "builder", derive(TypedBuilder))]
704#[cfg_attr(feature = "schemars", derive(JsonSchema))]
705pub struct ClusterIssuerAcmeSolversDns01DigitaloceanTokenSecretRef {
706    /// The key of the entry in the Secret resource's `data` field to be used.
707    /// Some instances of this field may be defaulted, in others it may be
708    /// required.
709    #[serde(default, skip_serializing_if = "Option::is_none")]
710    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
711    pub key: Option<String>,
712    /// Name of the resource being referred to.
713    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
714    pub name: String,
715}
716
717/// Use RFC2136 ("Dynamic Updates in the Domain Name System") (https://datatracker.ietf.org/doc/rfc2136/)
718/// to manage DNS01 challenge records.
719#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
720#[cfg_attr(feature = "builder", derive(TypedBuilder))]
721#[cfg_attr(feature = "schemars", derive(JsonSchema))]
722pub struct ClusterIssuerAcmeSolversDns01Rfc2136 {
723    /// The IP address or hostname of an authoritative DNS server supporting
724    /// RFC2136 in the form host:port. If the host is an IPv6 address it must be
725    /// enclosed in square brackets (e.g [2001:db8::1]) ; port is optional.
726    /// This field is required.
727    pub nameserver: String,
728    /// Protocol to use for dynamic DNS update queries. Valid values are (case-sensitive) ``TCP`` and ``UDP``; ``UDP`` (default).
729    #[serde(default, skip_serializing_if = "Option::is_none")]
730    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
731    pub protocol: Option<ClusterIssuerAcmeSolversDns01Rfc2136Protocol>,
732    /// The TSIG Algorithm configured in the DNS supporting RFC2136. Used only
733    /// when ``tsigSecretSecretRef`` and ``tsigKeyName`` are defined.
734    /// Supported values are (case-insensitive): ``HMACMD5`` (default),
735    /// ``HMACSHA1``, ``HMACSHA256`` or ``HMACSHA512``.
736    #[serde(
737        default,
738        skip_serializing_if = "Option::is_none",
739        rename = "tsigAlgorithm"
740    )]
741    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
742    pub tsig_algorithm: Option<String>,
743    /// The TSIG Key name configured in the DNS.
744    /// If ``tsigSecretSecretRef`` is defined, this field is required.
745    #[serde(
746        default,
747        skip_serializing_if = "Option::is_none",
748        rename = "tsigKeyName"
749    )]
750    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
751    pub tsig_key_name: Option<String>,
752    /// The name of the secret containing the TSIG value.
753    /// If ``tsigKeyName`` is defined, this field is required.
754    #[serde(
755        default,
756        skip_serializing_if = "Option::is_none",
757        rename = "tsigSecretSecretRef"
758    )]
759    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
760    pub tsig_secret_secret_ref: Option<ClusterIssuerAcmeSolversDns01Rfc2136TsigSecretSecretRef>,
761}
762
763/// Use RFC2136 ("Dynamic Updates in the Domain Name System") (https://datatracker.ietf.org/doc/rfc2136/)
764/// to manage DNS01 challenge records.
765#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
766#[cfg_attr(feature = "schemars", derive(JsonSchema))]
767pub enum ClusterIssuerAcmeSolversDns01Rfc2136Protocol {
768    #[serde(rename = "TCP")]
769    Tcp,
770    #[serde(rename = "UDP")]
771    Udp,
772}
773
774/// The name of the secret containing the TSIG value.
775/// If ``tsigKeyName`` is defined, this field is required.
776#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
777#[cfg_attr(feature = "builder", derive(TypedBuilder))]
778#[cfg_attr(feature = "schemars", derive(JsonSchema))]
779pub struct ClusterIssuerAcmeSolversDns01Rfc2136TsigSecretSecretRef {
780    /// The key of the entry in the Secret resource's `data` field to be used.
781    /// Some instances of this field may be defaulted, in others it may be
782    /// required.
783    #[serde(default, skip_serializing_if = "Option::is_none")]
784    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
785    pub key: Option<String>,
786    /// Name of the resource being referred to.
787    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
788    pub name: String,
789}
790
791/// Use the AWS Route53 API to manage DNS01 challenge records.
792#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
793#[cfg_attr(feature = "builder", derive(TypedBuilder))]
794#[cfg_attr(feature = "schemars", derive(JsonSchema))]
795pub struct ClusterIssuerAcmeSolversDns01Route53 {
796    /// The AccessKeyID is used for authentication.
797    /// Cannot be set when SecretAccessKeyID is set.
798    /// If neither the Access Key nor Key ID are set, we fall-back to using env
799    /// vars, shared credentials file or AWS Instance metadata,
800    /// see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials
801    #[serde(
802        default,
803        skip_serializing_if = "Option::is_none",
804        rename = "accessKeyID"
805    )]
806    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
807    pub access_key_id: Option<String>,
808    /// The SecretAccessKey is used for authentication. If set, pull the AWS
809    /// access key ID from a key within a Kubernetes Secret.
810    /// Cannot be set when AccessKeyID is set.
811    /// If neither the Access Key nor Key ID are set, we fall-back to using env
812    /// vars, shared credentials file or AWS Instance metadata,
813    /// see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials
814    #[serde(
815        default,
816        skip_serializing_if = "Option::is_none",
817        rename = "accessKeyIDSecretRef"
818    )]
819    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
820    pub access_key_id_secret_ref: Option<ClusterIssuerAcmeSolversDns01Route53AccessKeyIdSecretRef>,
821    /// Auth configures how cert-manager authenticates.
822    #[serde(default, skip_serializing_if = "Option::is_none")]
823    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
824    pub auth: Option<ClusterIssuerAcmeSolversDns01Route53Auth>,
825    /// If set, the provider will manage only this zone in Route53 and will not do a lookup using the route53:ListHostedZonesByName api call.
826    #[serde(
827        default,
828        skip_serializing_if = "Option::is_none",
829        rename = "hostedZoneID"
830    )]
831    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
832    pub hosted_zone_id: Option<String>,
833    /// Override the AWS region.
834    ///
835    /// Route53 is a global service and does not have regional endpoints but the
836    /// region specified here (or via environment variables) is used as a hint to
837    /// help compute the correct AWS credential scope and partition when it
838    /// connects to Route53. See:
839    /// - [Amazon Route 53 endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/r53.html)
840    /// - [Global services](https://docs.aws.amazon.com/whitepapers/latest/aws-fault-isolation-boundaries/global-services.html)
841    ///
842    /// If you omit this region field, cert-manager will use the region from
843    /// AWS_REGION and AWS_DEFAULT_REGION environment variables, if they are set
844    /// in the cert-manager controller Pod.
845    ///
846    /// The `region` field is not needed if you use [IAM Roles for Service Accounts (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html).
847    /// Instead an AWS_REGION environment variable is added to the cert-manager controller Pod by:
848    /// [Amazon EKS Pod Identity Webhook](https://github.com/aws/amazon-eks-pod-identity-webhook).
849    /// In this case this `region` field value is ignored.
850    ///
851    /// The `region` field is not needed if you use [EKS Pod Identities](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html).
852    /// Instead an AWS_REGION environment variable is added to the cert-manager controller Pod by:
853    /// [Amazon EKS Pod Identity Agent](https://github.com/aws/eks-pod-identity-agent),
854    /// In this case this `region` field value is ignored.
855    #[serde(default, skip_serializing_if = "Option::is_none")]
856    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
857    pub region: Option<String>,
858    /// Role is a Role ARN which the Route53 provider will assume using either the explicit credentials AccessKeyID/SecretAccessKey
859    /// or the inferred credentials from environment variables, shared credentials file or AWS Instance metadata
860    #[serde(default, skip_serializing_if = "Option::is_none")]
861    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
862    pub role: Option<String>,
863    /// The SecretAccessKey is used for authentication.
864    /// If neither the Access Key nor Key ID are set, we fall-back to using env
865    /// vars, shared credentials file or AWS Instance metadata,
866    /// see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials
867    #[serde(
868        default,
869        skip_serializing_if = "Option::is_none",
870        rename = "secretAccessKeySecretRef"
871    )]
872    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
873    pub secret_access_key_secret_ref:
874        Option<ClusterIssuerAcmeSolversDns01Route53SecretAccessKeySecretRef>,
875}
876
877/// The SecretAccessKey is used for authentication. If set, pull the AWS
878/// access key ID from a key within a Kubernetes Secret.
879/// Cannot be set when AccessKeyID is set.
880/// If neither the Access Key nor Key ID are set, we fall-back to using env
881/// vars, shared credentials file or AWS Instance metadata,
882/// see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials
883#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
884#[cfg_attr(feature = "builder", derive(TypedBuilder))]
885#[cfg_attr(feature = "schemars", derive(JsonSchema))]
886pub struct ClusterIssuerAcmeSolversDns01Route53AccessKeyIdSecretRef {
887    /// The key of the entry in the Secret resource's `data` field to be used.
888    /// Some instances of this field may be defaulted, in others it may be
889    /// required.
890    #[serde(default, skip_serializing_if = "Option::is_none")]
891    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
892    pub key: Option<String>,
893    /// Name of the resource being referred to.
894    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
895    pub name: String,
896}
897
898/// Auth configures how cert-manager authenticates.
899#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
900#[cfg_attr(feature = "builder", derive(TypedBuilder))]
901#[cfg_attr(feature = "schemars", derive(JsonSchema))]
902pub struct ClusterIssuerAcmeSolversDns01Route53Auth {
903    /// Kubernetes authenticates with Route53 using AssumeRoleWithWebIdentity
904    /// by passing a bound ServiceAccount token.
905    pub kubernetes: ClusterIssuerAcmeSolversDns01Route53AuthKubernetes,
906}
907
908/// Kubernetes authenticates with Route53 using AssumeRoleWithWebIdentity
909/// by passing a bound ServiceAccount token.
910#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
911#[cfg_attr(feature = "builder", derive(TypedBuilder))]
912#[cfg_attr(feature = "schemars", derive(JsonSchema))]
913pub struct ClusterIssuerAcmeSolversDns01Route53AuthKubernetes {
914    /// A reference to a service account that will be used to request a bound
915    /// token (also known as "projected token"). To use this field, you must
916    /// configure an RBAC rule to let cert-manager request a token.
917    #[serde(rename = "serviceAccountRef")]
918    pub service_account_ref: ClusterIssuerAcmeSolversDns01Route53AuthKubernetesServiceAccountRef,
919}
920
921/// A reference to a service account that will be used to request a bound
922/// token (also known as "projected token"). To use this field, you must
923/// configure an RBAC rule to let cert-manager request a token.
924#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
925#[cfg_attr(feature = "builder", derive(TypedBuilder))]
926#[cfg_attr(feature = "schemars", derive(JsonSchema))]
927pub struct ClusterIssuerAcmeSolversDns01Route53AuthKubernetesServiceAccountRef {
928    /// TokenAudiences is an optional list of audiences to include in the
929    /// token passed to AWS. The default token consisting of the issuer's namespace
930    /// and name is always included.
931    /// If unset the audience defaults to `sts.amazonaws.com`.
932    #[serde(default, skip_serializing_if = "Option::is_none")]
933    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
934    pub audiences: Option<Vec<String>>,
935    /// Name of the ServiceAccount used to request a token.
936    pub name: String,
937}
938
939/// The SecretAccessKey is used for authentication.
940/// If neither the Access Key nor Key ID are set, we fall-back to using env
941/// vars, shared credentials file or AWS Instance metadata,
942/// see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials
943#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
944#[cfg_attr(feature = "builder", derive(TypedBuilder))]
945#[cfg_attr(feature = "schemars", derive(JsonSchema))]
946pub struct ClusterIssuerAcmeSolversDns01Route53SecretAccessKeySecretRef {
947    /// The key of the entry in the Secret resource's `data` field to be used.
948    /// Some instances of this field may be defaulted, in others it may be
949    /// required.
950    #[serde(default, skip_serializing_if = "Option::is_none")]
951    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
952    pub key: Option<String>,
953    /// Name of the resource being referred to.
954    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
955    pub name: String,
956}
957
958/// Configure an external webhook based DNS01 challenge solver to manage
959/// DNS01 challenge records.
960#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
961#[cfg_attr(feature = "builder", derive(TypedBuilder))]
962#[cfg_attr(feature = "schemars", derive(JsonSchema))]
963pub struct ClusterIssuerAcmeSolversDns01Webhook {
964    /// Additional configuration that should be passed to the webhook apiserver
965    /// when challenges are processed.
966    /// This can contain arbitrary JSON data.
967    /// Secret values should not be specified in this stanza.
968    /// If secret values are needed (e.g., credentials for a DNS service), you
969    /// should use a SecretKeySelector to reference a Secret resource.
970    /// For details on the schema of this field, consult the webhook provider
971    /// implementation's documentation.
972    #[serde(default, skip_serializing_if = "Option::is_none")]
973    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
974    pub config: Option<serde_json::Value>,
975    /// The API group name that should be used when POSTing ChallengePayload
976    /// resources to the webhook apiserver.
977    /// This should be the same as the GroupName specified in the webhook
978    /// provider implementation.
979    #[serde(rename = "groupName")]
980    pub group_name: String,
981    /// The name of the solver to use, as defined in the webhook provider
982    /// implementation.
983    /// This will typically be the name of the provider, e.g., 'cloudflare'.
984    #[serde(rename = "solverName")]
985    pub solver_name: String,
986}
987
988/// Configures cert-manager to attempt to complete authorizations by
989/// performing the HTTP01 challenge flow.
990/// It is not possible to obtain certificates for wildcard domain names
991/// (e.g., `*.example.com`) using the HTTP01 challenge mechanism.
992#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
993#[cfg_attr(feature = "builder", derive(TypedBuilder))]
994#[cfg_attr(feature = "schemars", derive(JsonSchema))]
995pub struct ClusterIssuerAcmeSolversHttp01 {
996    /// The Gateway API is a sig-network community API that models service networking
997    /// in Kubernetes (https://gateway-api.sigs.k8s.io/). The Gateway solver will
998    /// create HTTPRoutes with the specified labels in the same namespace as the challenge.
999    /// This solver is experimental, and fields / behaviour may change in the future.
1000    #[serde(
1001        default,
1002        skip_serializing_if = "Option::is_none",
1003        rename = "gatewayHTTPRoute"
1004    )]
1005    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1006    pub gateway_http_route: Option<ClusterIssuerAcmeSolversHttp01GatewayHttpRoute>,
1007    /// The ingress based HTTP01 challenge solver will solve challenges by
1008    /// creating or modifying Ingress resources in order to route requests for
1009    /// '/.well-known/acme-challenge/XYZ' to 'challenge solver' pods that are
1010    /// provisioned by cert-manager for each Challenge to be completed.
1011    #[serde(default, skip_serializing_if = "Option::is_none")]
1012    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1013    pub ingress: Option<ClusterIssuerAcmeSolversHttp01Ingress>,
1014}
1015
1016/// The Gateway API is a sig-network community API that models service networking
1017/// in Kubernetes (https://gateway-api.sigs.k8s.io/). The Gateway solver will
1018/// create HTTPRoutes with the specified labels in the same namespace as the challenge.
1019/// This solver is experimental, and fields / behaviour may change in the future.
1020#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1021#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1022#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1023pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoute {
1024    /// Custom labels that will be applied to HTTPRoutes created by cert-manager
1025    /// while solving HTTP-01 challenges.
1026    #[serde(default, skip_serializing_if = "Option::is_none")]
1027    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1028    pub labels: Option<BTreeMap<String, String>>,
1029    /// When solving an HTTP-01 challenge, cert-manager creates an HTTPRoute.
1030    /// cert-manager needs to know which parentRefs should be used when creating
1031    /// the HTTPRoute. Usually, the parentRef references a Gateway. See:
1032    /// https://gateway-api.sigs.k8s.io/api-types/httproute/#attaching-to-gateways
1033    #[serde(
1034        default,
1035        skip_serializing_if = "Option::is_none",
1036        rename = "parentRefs"
1037    )]
1038    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1039    pub parent_refs: Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRouteParentRefs>>,
1040    /// Optional pod template used to configure the ACME challenge solver pods
1041    /// used for HTTP01 challenges.
1042    #[serde(
1043        default,
1044        skip_serializing_if = "Option::is_none",
1045        rename = "podTemplate"
1046    )]
1047    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1048    pub pod_template: Option<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplate>,
1049    /// Optional service type for Kubernetes solver service. Supported values
1050    /// are NodePort or ClusterIP. If unset, defaults to NodePort.
1051    #[serde(
1052        default,
1053        skip_serializing_if = "Option::is_none",
1054        rename = "serviceType"
1055    )]
1056    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1057    pub service_type: Option<String>,
1058}
1059
1060/// ParentReference identifies an API object (usually a Gateway) that can be considered
1061/// a parent of this resource (usually a route). There are two kinds of parent resources
1062/// with "Core" support:
1063///
1064/// * Gateway (Gateway conformance profile)
1065/// * Service (Mesh conformance profile, ClusterIP Services only)
1066///
1067/// This API may be extended in the future to support additional kinds of parent
1068/// resources.
1069///
1070/// The API object must be valid in the cluster; the Group and Kind must
1071/// be registered in the cluster for this reference to be valid.
1072#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1073#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1074#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1075pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRouteParentRefs {
1076    /// Group is the group of the referent.
1077    /// When unspecified, "gateway.networking.k8s.io" is inferred.
1078    /// To set the core API group (such as for a "Service" kind referent),
1079    /// Group must be explicitly set to "" (empty string).
1080    ///
1081    /// Support: Core
1082    #[serde(default, skip_serializing_if = "Option::is_none")]
1083    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1084    pub group: Option<String>,
1085    /// Kind is kind of the referent.
1086    ///
1087    /// There are two kinds of parent resources with "Core" support:
1088    ///
1089    /// * Gateway (Gateway conformance profile)
1090    /// * Service (Mesh conformance profile, ClusterIP Services only)
1091    ///
1092    /// Support for other resources is Implementation-Specific.
1093    #[serde(default, skip_serializing_if = "Option::is_none")]
1094    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1095    pub kind: Option<String>,
1096    /// Name is the name of the referent.
1097    ///
1098    /// Support: Core
1099    pub name: String,
1100    /// Namespace is the namespace of the referent. When unspecified, this refers
1101    /// to the local namespace of the Route.
1102    ///
1103    /// Note that there are specific rules for ParentRefs which cross namespace
1104    /// boundaries. Cross-namespace references are only valid if they are explicitly
1105    /// allowed by something in the namespace they are referring to. For example:
1106    /// Gateway has the AllowedRoutes field, and ReferenceGrant provides a
1107    /// generic way to enable any other kind of cross-namespace reference.
1108    ///
1109    /// <gateway:experimental:description>
1110    /// ParentRefs from a Route to a Service in the same namespace are "producer"
1111    /// routes, which apply default routing rules to inbound connections from
1112    /// any namespace to the Service.
1113    ///
1114    /// ParentRefs from a Route to a Service in a different namespace are
1115    /// "consumer" routes, and these routing rules are only applied to outbound
1116    /// connections originating from the same namespace as the Route, for which
1117    /// the intended destination of the connections are a Service targeted as a
1118    /// ParentRef of the Route.
1119    /// </gateway:experimental:description>
1120    ///
1121    /// Support: Core
1122    #[serde(default, skip_serializing_if = "Option::is_none")]
1123    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1124    pub namespace: Option<String>,
1125    /// Port is the network port this Route targets. It can be interpreted
1126    /// differently based on the type of parent resource.
1127    ///
1128    /// When the parent resource is a Gateway, this targets all listeners
1129    /// listening on the specified port that also support this kind of Route(and
1130    /// select this Route). It's not recommended to set `Port` unless the
1131    /// networking behaviors specified in a Route must apply to a specific port
1132    /// as opposed to a listener(s) whose port(s) may be changed. When both Port
1133    /// and SectionName are specified, the name and port of the selected listener
1134    /// must match both specified values.
1135    ///
1136    /// <gateway:experimental:description>
1137    /// When the parent resource is a Service, this targets a specific port in the
1138    /// Service spec. When both Port (experimental) and SectionName are specified,
1139    /// the name and port of the selected port must match both specified values.
1140    /// </gateway:experimental:description>
1141    ///
1142    /// Implementations MAY choose to support other parent resources.
1143    /// Implementations supporting other types of parent resources MUST clearly
1144    /// document how/if Port is interpreted.
1145    ///
1146    /// For the purpose of status, an attachment is considered successful as
1147    /// long as the parent resource accepts it partially. For example, Gateway
1148    /// listeners can restrict which Routes can attach to them by Route kind,
1149    /// namespace, or hostname. If 1 of 2 Gateway listeners accept attachment
1150    /// from the referencing Route, the Route MUST be considered successfully
1151    /// attached. If no Gateway listeners accept attachment from this Route,
1152    /// the Route MUST be considered detached from the Gateway.
1153    ///
1154    /// Support: Extended
1155    #[serde(default, skip_serializing_if = "Option::is_none")]
1156    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1157    pub port: Option<i32>,
1158    /// SectionName is the name of a section within the target resource. In the
1159    /// following resources, SectionName is interpreted as the following:
1160    ///
1161    /// * Gateway: Listener name. When both Port (experimental) and SectionName
1162    /// are specified, the name and port of the selected listener must match
1163    /// both specified values.
1164    /// * Service: Port name. When both Port (experimental) and SectionName
1165    /// are specified, the name and port of the selected listener must match
1166    /// both specified values.
1167    ///
1168    /// Implementations MAY choose to support attaching Routes to other resources.
1169    /// If that is the case, they MUST clearly document how SectionName is
1170    /// interpreted.
1171    ///
1172    /// When unspecified (empty string), this will reference the entire resource.
1173    /// For the purpose of status, an attachment is considered successful if at
1174    /// least one section in the parent resource accepts it. For example, Gateway
1175    /// listeners can restrict which Routes can attach to them by Route kind,
1176    /// namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from
1177    /// the referencing Route, the Route MUST be considered successfully
1178    /// attached. If no Gateway listeners accept attachment from this Route, the
1179    /// Route MUST be considered detached from the Gateway.
1180    ///
1181    /// Support: Core
1182    #[serde(
1183        default,
1184        skip_serializing_if = "Option::is_none",
1185        rename = "sectionName"
1186    )]
1187    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1188    pub section_name: Option<String>,
1189}
1190
1191/// Optional pod template used to configure the ACME challenge solver pods
1192/// used for HTTP01 challenges.
1193#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1194#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1195#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1196pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplate {
1197    /// ObjectMeta overrides for the pod used to solve HTTP01 challenges.
1198    /// Only the 'labels' and 'annotations' fields may be set.
1199    /// If labels or annotations overlap with in-built values, the values here
1200    /// will override the in-built values.
1201    #[serde(default, skip_serializing_if = "Option::is_none")]
1202    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1203    pub metadata: Option<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateMetadata>,
1204    /// PodSpec defines overrides for the HTTP01 challenge solver pod.
1205    /// Check ACMEChallengeSolverHTTP01IngressPodSpec to find out currently supported fields.
1206    /// All other fields will be ignored.
1207    #[serde(default, skip_serializing_if = "Option::is_none")]
1208    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1209    pub spec: Option<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpec>,
1210}
1211
1212/// ObjectMeta overrides for the pod used to solve HTTP01 challenges.
1213/// Only the 'labels' and 'annotations' fields may be set.
1214/// If labels or annotations overlap with in-built values, the values here
1215/// will override the in-built values.
1216#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1217#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1218#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1219pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateMetadata {
1220    /// Annotations that should be added to the created ACME HTTP01 solver pods.
1221    #[serde(default, skip_serializing_if = "Option::is_none")]
1222    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1223    pub annotations: Option<BTreeMap<String, String>>,
1224    /// Labels that should be added to the created ACME HTTP01 solver pods.
1225    #[serde(default, skip_serializing_if = "Option::is_none")]
1226    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1227    pub labels: Option<BTreeMap<String, String>>,
1228}
1229
1230/// PodSpec defines overrides for the HTTP01 challenge solver pod.
1231/// Check ACMEChallengeSolverHTTP01IngressPodSpec to find out currently supported fields.
1232/// All other fields will be ignored.
1233#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1234#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1235#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1236pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpec {
1237    /// If specified, the pod's scheduling constraints
1238    #[serde(default, skip_serializing_if = "Option::is_none")]
1239    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1240    pub affinity: Option<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinity>,
1241    /// If specified, the pod's imagePullSecrets
1242    #[serde(
1243        default,
1244        skip_serializing_if = "Option::is_none",
1245        rename = "imagePullSecrets"
1246    )]
1247    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1248    pub image_pull_secrets:
1249        Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecImagePullSecrets>>,
1250    /// NodeSelector is a selector which must be true for the pod to fit on a node.
1251    /// Selector which must match a node's labels for the pod to be scheduled on that node.
1252    /// More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
1253    #[serde(
1254        default,
1255        skip_serializing_if = "Option::is_none",
1256        rename = "nodeSelector"
1257    )]
1258    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1259    pub node_selector: Option<BTreeMap<String, String>>,
1260    /// If specified, the pod's priorityClassName.
1261    #[serde(
1262        default,
1263        skip_serializing_if = "Option::is_none",
1264        rename = "priorityClassName"
1265    )]
1266    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1267    pub priority_class_name: Option<String>,
1268    /// If specified, the pod's resource requirements.
1269    /// These values override the global resource configuration flags.
1270    /// Note that when only specifying resource limits, ensure they are greater than or equal
1271    /// to the corresponding global resource requests configured via controller flags
1272    /// (--acme-http01-solver-resource-request-cpu, --acme-http01-solver-resource-request-memory).
1273    /// Kubernetes will reject pod creation if limits are lower than requests, causing challenge failures.
1274    #[serde(default, skip_serializing_if = "Option::is_none")]
1275    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1276    pub resources: Option<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecResources>,
1277    /// If specified, the pod's security context
1278    #[serde(
1279        default,
1280        skip_serializing_if = "Option::is_none",
1281        rename = "securityContext"
1282    )]
1283    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1284    pub security_context:
1285        Option<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecSecurityContext>,
1286    /// If specified, the pod's service account
1287    #[serde(
1288        default,
1289        skip_serializing_if = "Option::is_none",
1290        rename = "serviceAccountName"
1291    )]
1292    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1293    pub service_account_name: Option<String>,
1294    /// If specified, the pod's tolerations.
1295    #[serde(default, skip_serializing_if = "Option::is_none")]
1296    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1297    pub tolerations:
1298        Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecTolerations>>,
1299}
1300
1301/// If specified, the pod's scheduling constraints
1302#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1303#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1304#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1305pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinity {
1306    /// Describes node affinity scheduling rules for the pod.
1307    #[serde(
1308        default,
1309        skip_serializing_if = "Option::is_none",
1310        rename = "nodeAffinity"
1311    )]
1312    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1313    pub node_affinity:
1314        Option<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityNodeAffinity>,
1315    /// Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)).
1316    #[serde(
1317        default,
1318        skip_serializing_if = "Option::is_none",
1319        rename = "podAffinity"
1320    )]
1321    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1322    pub pod_affinity:
1323        Option<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinity>,
1324    /// Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)).
1325    #[serde(
1326        default,
1327        skip_serializing_if = "Option::is_none",
1328        rename = "podAntiAffinity"
1329    )]
1330    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1331    pub pod_anti_affinity: Option<
1332        ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinity,
1333    >,
1334}
1335
1336/// Describes node affinity scheduling rules for the pod.
1337#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1338#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1339#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1340pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityNodeAffinity {
1341    /// The scheduler will prefer to schedule pods to nodes that satisfy
1342    /// the affinity expressions specified by this field, but it may choose
1343    /// a node that violates one or more of the expressions. The node that is
1344    /// most preferred is the one with the greatest sum of weights, i.e.
1345    /// for each node that meets all of the scheduling requirements (resource
1346    /// request, requiredDuringScheduling affinity expressions, etc.),
1347    /// compute a sum by iterating through the elements of this field and adding
1348    /// "weight" to the sum if the node matches the corresponding matchExpressions; the
1349    /// node(s) with the highest sum are the most preferred.
1350    #[serde(default, skip_serializing_if = "Option::is_none", rename = "preferredDuringSchedulingIgnoredDuringExecution")]
1351#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1352    pub preferred_during_scheduling_ignored_during_execution: Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecution>>,
1353    /// If the affinity requirements specified by this field are not met at
1354    /// scheduling time, the pod will not be scheduled onto the node.
1355    /// If the affinity requirements specified by this field cease to be met
1356    /// at some point during pod execution (e.g. due to an update), the system
1357    /// may or may not try to eventually evict the pod from its node.
1358    #[serde(default, skip_serializing_if = "Option::is_none", rename = "requiredDuringSchedulingIgnoredDuringExecution")]
1359#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1360    pub required_during_scheduling_ignored_during_execution: Option<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecution>,
1361}
1362
1363/// An empty preferred scheduling term matches all objects with implicit weight 0
1364/// (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).
1365#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1366#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1367#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1368pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecution {
1369    /// A node selector term, associated with the corresponding weight.
1370    pub preference: ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreference,
1371    /// Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.
1372    pub weight: i32,
1373}
1374
1375/// A node selector term, associated with the corresponding weight.
1376#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1377#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1378#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1379pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreference {
1380    /// A list of node selector requirements by node's labels.
1381    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
1382#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1383    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchExpressions>>,
1384    /// A list of node selector requirements by node's fields.
1385    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchFields")]
1386#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1387    pub match_fields: Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchFields>>,
1388}
1389
1390/// A node selector requirement is a selector that contains values, a key, and an operator
1391/// that relates the key and values.
1392#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1393#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1394#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1395pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchExpressions
1396{
1397    /// The label key that the selector applies to.
1398    pub key: String,
1399    /// Represents a key's relationship to a set of values.
1400    /// Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
1401    pub operator: String,
1402    /// An array of string values. If the operator is In or NotIn,
1403    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
1404    /// the values array must be empty. If the operator is Gt or Lt, the values
1405    /// array must have a single element, which will be interpreted as an integer.
1406    /// This array is replaced during a strategic merge patch.
1407    #[serde(default, skip_serializing_if = "Option::is_none")]
1408    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1409    pub values: Option<Vec<String>>,
1410}
1411
1412/// A node selector requirement is a selector that contains values, a key, and an operator
1413/// that relates the key and values.
1414#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1415#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1416#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1417pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchFields
1418{
1419    /// The label key that the selector applies to.
1420    pub key: String,
1421    /// Represents a key's relationship to a set of values.
1422    /// Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
1423    pub operator: String,
1424    /// An array of string values. If the operator is In or NotIn,
1425    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
1426    /// the values array must be empty. If the operator is Gt or Lt, the values
1427    /// array must have a single element, which will be interpreted as an integer.
1428    /// This array is replaced during a strategic merge patch.
1429    #[serde(default, skip_serializing_if = "Option::is_none")]
1430    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1431    pub values: Option<Vec<String>>,
1432}
1433
1434/// If the affinity requirements specified by this field are not met at
1435/// scheduling time, the pod will not be scheduled onto the node.
1436/// If the affinity requirements specified by this field cease to be met
1437/// at some point during pod execution (e.g. due to an update), the system
1438/// may or may not try to eventually evict the pod from its node.
1439#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1440#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1441#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1442pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecution {
1443    /// Required. A list of node selector terms. The terms are ORed.
1444    #[serde(rename = "nodeSelectorTerms")]
1445#[cfg_attr(feature = "builder", builder(default))]
1446    pub node_selector_terms: Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTerms>,
1447}
1448
1449/// A null or empty node selector term matches no objects. The requirements of
1450/// them are ANDed.
1451/// The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.
1452#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1453#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1454#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1455pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTerms {
1456    /// A list of node selector requirements by node's labels.
1457    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
1458#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1459    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchExpressions>>,
1460    /// A list of node selector requirements by node's fields.
1461    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchFields")]
1462#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1463    pub match_fields: Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchFields>>,
1464}
1465
1466/// A node selector requirement is a selector that contains values, a key, and an operator
1467/// that relates the key and values.
1468#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1469#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1470#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1471pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchExpressions
1472{
1473    /// The label key that the selector applies to.
1474    pub key: String,
1475    /// Represents a key's relationship to a set of values.
1476    /// Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
1477    pub operator: String,
1478    /// An array of string values. If the operator is In or NotIn,
1479    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
1480    /// the values array must be empty. If the operator is Gt or Lt, the values
1481    /// array must have a single element, which will be interpreted as an integer.
1482    /// This array is replaced during a strategic merge patch.
1483    #[serde(default, skip_serializing_if = "Option::is_none")]
1484    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1485    pub values: Option<Vec<String>>,
1486}
1487
1488/// A node selector requirement is a selector that contains values, a key, and an operator
1489/// that relates the key and values.
1490#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1491#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1492#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1493pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchFields
1494{
1495    /// The label key that the selector applies to.
1496    pub key: String,
1497    /// Represents a key's relationship to a set of values.
1498    /// Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
1499    pub operator: String,
1500    /// An array of string values. If the operator is In or NotIn,
1501    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
1502    /// the values array must be empty. If the operator is Gt or Lt, the values
1503    /// array must have a single element, which will be interpreted as an integer.
1504    /// This array is replaced during a strategic merge patch.
1505    #[serde(default, skip_serializing_if = "Option::is_none")]
1506    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1507    pub values: Option<Vec<String>>,
1508}
1509
1510/// Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)).
1511#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1512#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1513#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1514pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinity {
1515    /// The scheduler will prefer to schedule pods to nodes that satisfy
1516    /// the affinity expressions specified by this field, but it may choose
1517    /// a node that violates one or more of the expressions. The node that is
1518    /// most preferred is the one with the greatest sum of weights, i.e.
1519    /// for each node that meets all of the scheduling requirements (resource
1520    /// request, requiredDuringScheduling affinity expressions, etc.),
1521    /// compute a sum by iterating through the elements of this field and adding
1522    /// "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the
1523    /// node(s) with the highest sum are the most preferred.
1524    #[serde(default, skip_serializing_if = "Option::is_none", rename = "preferredDuringSchedulingIgnoredDuringExecution")]
1525#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1526    pub preferred_during_scheduling_ignored_during_execution: Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecution>>,
1527    /// If the affinity requirements specified by this field are not met at
1528    /// scheduling time, the pod will not be scheduled onto the node.
1529    /// If the affinity requirements specified by this field cease to be met
1530    /// at some point during pod execution (e.g. due to a pod label update), the
1531    /// system may or may not try to eventually evict the pod from its node.
1532    /// When there are multiple elements, the lists of nodes corresponding to each
1533    /// podAffinityTerm are intersected, i.e. all terms must be satisfied.
1534    #[serde(default, skip_serializing_if = "Option::is_none", rename = "requiredDuringSchedulingIgnoredDuringExecution")]
1535#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1536    pub required_during_scheduling_ignored_during_execution: Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecution>>,
1537}
1538
1539/// The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)
1540#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1541#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1542#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1543pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecution {
1544    /// Required. A pod affinity term, associated with the corresponding weight.
1545    #[serde(rename = "podAffinityTerm")]
1546    pub pod_affinity_term: ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm,
1547    /// weight associated with matching the corresponding podAffinityTerm,
1548    /// in the range 1-100.
1549    pub weight: i32,
1550}
1551
1552/// Required. A pod affinity term, associated with the corresponding weight.
1553#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1554#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1555#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1556pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm {
1557    /// A label query over a set of resources, in this case pods.
1558    /// If it's null, this PodAffinityTerm matches with no Pods.
1559    #[serde(default, skip_serializing_if = "Option::is_none", rename = "labelSelector")]
1560#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1561    pub label_selector: Option<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector>,
1562    /// MatchLabelKeys is a set of pod label keys to select which pods will
1563    /// be taken into consideration. The keys are used to lookup values from the
1564    /// incoming pod labels, those key-value labels are merged with `labelSelector` as `key in (value)`
1565    /// to select the group of existing pods which pods will be taken into consideration
1566    /// for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming
1567    /// pod labels will be ignored. The default value is empty.
1568    /// The same key is forbidden to exist in both matchLabelKeys and labelSelector.
1569    /// Also, matchLabelKeys cannot be set when labelSelector isn't set.
1570    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabelKeys")]
1571#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1572    pub match_label_keys: Option<Vec<String>>,
1573    /// MismatchLabelKeys is a set of pod label keys to select which pods will
1574    /// be taken into consideration. The keys are used to lookup values from the
1575    /// incoming pod labels, those key-value labels are merged with `labelSelector` as `key notin (value)`
1576    /// to select the group of existing pods which pods will be taken into consideration
1577    /// for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming
1578    /// pod labels will be ignored. The default value is empty.
1579    /// The same key is forbidden to exist in both mismatchLabelKeys and labelSelector.
1580    /// Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
1581    #[serde(default, skip_serializing_if = "Option::is_none", rename = "mismatchLabelKeys")]
1582#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1583    pub mismatch_label_keys: Option<Vec<String>>,
1584    /// A label query over the set of namespaces that the term applies to.
1585    /// The term is applied to the union of the namespaces selected by this field
1586    /// and the ones listed in the namespaces field.
1587    /// null selector and null or empty namespaces list means "this pod's namespace".
1588    /// An empty selector ({}) matches all namespaces.
1589    #[serde(default, skip_serializing_if = "Option::is_none", rename = "namespaceSelector")]
1590#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1591    pub namespace_selector: Option<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector>,
1592    /// namespaces specifies a static list of namespace names that the term applies to.
1593    /// The term is applied to the union of the namespaces listed in this field
1594    /// and the ones selected by namespaceSelector.
1595    /// null or empty namespaces list and null namespaceSelector means "this pod's namespace".
1596    #[serde(default, skip_serializing_if = "Option::is_none")]
1597#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1598    pub namespaces: Option<Vec<String>>,
1599    /// This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching
1600    /// the labelSelector in the specified namespaces, where co-located is defined as running on a node
1601    /// whose value of the label with key topologyKey matches that of any node on which any of the
1602    /// selected pods is running.
1603    /// Empty topologyKey is not allowed.
1604    #[serde(rename = "topologyKey")]
1605    pub topology_key: String,
1606}
1607
1608/// A label query over a set of resources, in this case pods.
1609/// If it's null, this PodAffinityTerm matches with no Pods.
1610#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1611#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1612#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1613pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector {
1614    /// matchExpressions is a list of label selector requirements. The requirements are ANDed.
1615    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
1616#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1617    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions>>,
1618    /// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
1619    /// map is equivalent to an element of matchExpressions, whose key field is "key", the
1620    /// operator is "In", and the values array contains only "value". The requirements are ANDed.
1621    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabels")]
1622#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1623    pub match_labels: Option<BTreeMap<String, String>>,
1624}
1625
1626/// A label selector requirement is a selector that contains values, a key, and an operator that
1627/// relates the key and values.
1628#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1629#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1630#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1631pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions
1632{
1633    /// key is the label key that the selector applies to.
1634    pub key: String,
1635    /// operator represents a key's relationship to a set of values.
1636    /// Valid operators are In, NotIn, Exists and DoesNotExist.
1637    pub operator: String,
1638    /// values is an array of string values. If the operator is In or NotIn,
1639    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
1640    /// the values array must be empty. This array is replaced during a strategic
1641    /// merge patch.
1642    #[serde(default, skip_serializing_if = "Option::is_none")]
1643    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1644    pub values: Option<Vec<String>>,
1645}
1646
1647/// A label query over the set of namespaces that the term applies to.
1648/// The term is applied to the union of the namespaces selected by this field
1649/// and the ones listed in the namespaces field.
1650/// null selector and null or empty namespaces list means "this pod's namespace".
1651/// An empty selector ({}) matches all namespaces.
1652#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1653#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1654#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1655pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector {
1656    /// matchExpressions is a list of label selector requirements. The requirements are ANDed.
1657    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
1658#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1659    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions>>,
1660    /// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
1661    /// map is equivalent to an element of matchExpressions, whose key field is "key", the
1662    /// operator is "In", and the values array contains only "value". The requirements are ANDed.
1663    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabels")]
1664#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1665    pub match_labels: Option<BTreeMap<String, String>>,
1666}
1667
1668/// A label selector requirement is a selector that contains values, a key, and an operator that
1669/// relates the key and values.
1670#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1671#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1672#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1673pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions
1674{
1675    /// key is the label key that the selector applies to.
1676    pub key: String,
1677    /// operator represents a key's relationship to a set of values.
1678    /// Valid operators are In, NotIn, Exists and DoesNotExist.
1679    pub operator: String,
1680    /// values is an array of string values. If the operator is In or NotIn,
1681    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
1682    /// the values array must be empty. This array is replaced during a strategic
1683    /// merge patch.
1684    #[serde(default, skip_serializing_if = "Option::is_none")]
1685    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1686    pub values: Option<Vec<String>>,
1687}
1688
1689/// Defines a set of pods (namely those matching the labelSelector
1690/// relative to the given namespace(s)) that this pod should be
1691/// co-located (affinity) or not co-located (anti-affinity) with,
1692/// where co-located is defined as running on a node whose value of
1693/// the label with key <topologyKey> matches that of any node on which
1694/// a pod of the set of pods is running
1695#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1696#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1697#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1698pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecution {
1699    /// A label query over a set of resources, in this case pods.
1700    /// If it's null, this PodAffinityTerm matches with no Pods.
1701    #[serde(default, skip_serializing_if = "Option::is_none", rename = "labelSelector")]
1702#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1703    pub label_selector: Option<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector>,
1704    /// MatchLabelKeys is a set of pod label keys to select which pods will
1705    /// be taken into consideration. The keys are used to lookup values from the
1706    /// incoming pod labels, those key-value labels are merged with `labelSelector` as `key in (value)`
1707    /// to select the group of existing pods which pods will be taken into consideration
1708    /// for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming
1709    /// pod labels will be ignored. The default value is empty.
1710    /// The same key is forbidden to exist in both matchLabelKeys and labelSelector.
1711    /// Also, matchLabelKeys cannot be set when labelSelector isn't set.
1712    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabelKeys")]
1713#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1714    pub match_label_keys: Option<Vec<String>>,
1715    /// MismatchLabelKeys is a set of pod label keys to select which pods will
1716    /// be taken into consideration. The keys are used to lookup values from the
1717    /// incoming pod labels, those key-value labels are merged with `labelSelector` as `key notin (value)`
1718    /// to select the group of existing pods which pods will be taken into consideration
1719    /// for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming
1720    /// pod labels will be ignored. The default value is empty.
1721    /// The same key is forbidden to exist in both mismatchLabelKeys and labelSelector.
1722    /// Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
1723    #[serde(default, skip_serializing_if = "Option::is_none", rename = "mismatchLabelKeys")]
1724#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1725    pub mismatch_label_keys: Option<Vec<String>>,
1726    /// A label query over the set of namespaces that the term applies to.
1727    /// The term is applied to the union of the namespaces selected by this field
1728    /// and the ones listed in the namespaces field.
1729    /// null selector and null or empty namespaces list means "this pod's namespace".
1730    /// An empty selector ({}) matches all namespaces.
1731    #[serde(default, skip_serializing_if = "Option::is_none", rename = "namespaceSelector")]
1732#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1733    pub namespace_selector: Option<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector>,
1734    /// namespaces specifies a static list of namespace names that the term applies to.
1735    /// The term is applied to the union of the namespaces listed in this field
1736    /// and the ones selected by namespaceSelector.
1737    /// null or empty namespaces list and null namespaceSelector means "this pod's namespace".
1738    #[serde(default, skip_serializing_if = "Option::is_none")]
1739#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1740    pub namespaces: Option<Vec<String>>,
1741    /// This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching
1742    /// the labelSelector in the specified namespaces, where co-located is defined as running on a node
1743    /// whose value of the label with key topologyKey matches that of any node on which any of the
1744    /// selected pods is running.
1745    /// Empty topologyKey is not allowed.
1746    #[serde(rename = "topologyKey")]
1747    pub topology_key: String,
1748}
1749
1750/// A label query over a set of resources, in this case pods.
1751/// If it's null, this PodAffinityTerm matches with no Pods.
1752#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1753#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1754#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1755pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector {
1756    /// matchExpressions is a list of label selector requirements. The requirements are ANDed.
1757    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
1758#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1759    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions>>,
1760    /// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
1761    /// map is equivalent to an element of matchExpressions, whose key field is "key", the
1762    /// operator is "In", and the values array contains only "value". The requirements are ANDed.
1763    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabels")]
1764#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1765    pub match_labels: Option<BTreeMap<String, String>>,
1766}
1767
1768/// A label selector requirement is a selector that contains values, a key, and an operator that
1769/// relates the key and values.
1770#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1771#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1772#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1773pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions
1774{
1775    /// key is the label key that the selector applies to.
1776    pub key: String,
1777    /// operator represents a key's relationship to a set of values.
1778    /// Valid operators are In, NotIn, Exists and DoesNotExist.
1779    pub operator: String,
1780    /// values is an array of string values. If the operator is In or NotIn,
1781    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
1782    /// the values array must be empty. This array is replaced during a strategic
1783    /// merge patch.
1784    #[serde(default, skip_serializing_if = "Option::is_none")]
1785    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1786    pub values: Option<Vec<String>>,
1787}
1788
1789/// A label query over the set of namespaces that the term applies to.
1790/// The term is applied to the union of the namespaces selected by this field
1791/// and the ones listed in the namespaces field.
1792/// null selector and null or empty namespaces list means "this pod's namespace".
1793/// An empty selector ({}) matches all namespaces.
1794#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1795#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1796#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1797pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector {
1798    /// matchExpressions is a list of label selector requirements. The requirements are ANDed.
1799    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
1800#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1801    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions>>,
1802    /// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
1803    /// map is equivalent to an element of matchExpressions, whose key field is "key", the
1804    /// operator is "In", and the values array contains only "value". The requirements are ANDed.
1805    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabels")]
1806#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1807    pub match_labels: Option<BTreeMap<String, String>>,
1808}
1809
1810/// A label selector requirement is a selector that contains values, a key, and an operator that
1811/// relates the key and values.
1812#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1813#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1814#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1815pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions
1816{
1817    /// key is the label key that the selector applies to.
1818    pub key: String,
1819    /// operator represents a key's relationship to a set of values.
1820    /// Valid operators are In, NotIn, Exists and DoesNotExist.
1821    pub operator: String,
1822    /// values is an array of string values. If the operator is In or NotIn,
1823    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
1824    /// the values array must be empty. This array is replaced during a strategic
1825    /// merge patch.
1826    #[serde(default, skip_serializing_if = "Option::is_none")]
1827    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1828    pub values: Option<Vec<String>>,
1829}
1830
1831/// Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)).
1832#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1833#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1834#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1835pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinity {
1836    /// The scheduler will prefer to schedule pods to nodes that satisfy
1837    /// the anti-affinity expressions specified by this field, but it may choose
1838    /// a node that violates one or more of the expressions. The node that is
1839    /// most preferred is the one with the greatest sum of weights, i.e.
1840    /// for each node that meets all of the scheduling requirements (resource
1841    /// request, requiredDuringScheduling anti-affinity expressions, etc.),
1842    /// compute a sum by iterating through the elements of this field and subtracting
1843    /// "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the
1844    /// node(s) with the highest sum are the most preferred.
1845    #[serde(default, skip_serializing_if = "Option::is_none", rename = "preferredDuringSchedulingIgnoredDuringExecution")]
1846#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1847    pub preferred_during_scheduling_ignored_during_execution: Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecution>>,
1848    /// If the anti-affinity requirements specified by this field are not met at
1849    /// scheduling time, the pod will not be scheduled onto the node.
1850    /// If the anti-affinity requirements specified by this field cease to be met
1851    /// at some point during pod execution (e.g. due to a pod label update), the
1852    /// system may or may not try to eventually evict the pod from its node.
1853    /// When there are multiple elements, the lists of nodes corresponding to each
1854    /// podAffinityTerm are intersected, i.e. all terms must be satisfied.
1855    #[serde(default, skip_serializing_if = "Option::is_none", rename = "requiredDuringSchedulingIgnoredDuringExecution")]
1856#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1857    pub required_during_scheduling_ignored_during_execution: Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecution>>,
1858}
1859
1860/// The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)
1861#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1862#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1863#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1864pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecution {
1865    /// Required. A pod affinity term, associated with the corresponding weight.
1866    #[serde(rename = "podAffinityTerm")]
1867    pub pod_affinity_term: ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm,
1868    /// weight associated with matching the corresponding podAffinityTerm,
1869    /// in the range 1-100.
1870    pub weight: i32,
1871}
1872
1873/// Required. A pod affinity term, associated with the corresponding weight.
1874#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1875#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1876#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1877pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm {
1878    /// A label query over a set of resources, in this case pods.
1879    /// If it's null, this PodAffinityTerm matches with no Pods.
1880    #[serde(default, skip_serializing_if = "Option::is_none", rename = "labelSelector")]
1881#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1882    pub label_selector: Option<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector>,
1883    /// MatchLabelKeys is a set of pod label keys to select which pods will
1884    /// be taken into consideration. The keys are used to lookup values from the
1885    /// incoming pod labels, those key-value labels are merged with `labelSelector` as `key in (value)`
1886    /// to select the group of existing pods which pods will be taken into consideration
1887    /// for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming
1888    /// pod labels will be ignored. The default value is empty.
1889    /// The same key is forbidden to exist in both matchLabelKeys and labelSelector.
1890    /// Also, matchLabelKeys cannot be set when labelSelector isn't set.
1891    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabelKeys")]
1892#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1893    pub match_label_keys: Option<Vec<String>>,
1894    /// MismatchLabelKeys is a set of pod label keys to select which pods will
1895    /// be taken into consideration. The keys are used to lookup values from the
1896    /// incoming pod labels, those key-value labels are merged with `labelSelector` as `key notin (value)`
1897    /// to select the group of existing pods which pods will be taken into consideration
1898    /// for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming
1899    /// pod labels will be ignored. The default value is empty.
1900    /// The same key is forbidden to exist in both mismatchLabelKeys and labelSelector.
1901    /// Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
1902    #[serde(default, skip_serializing_if = "Option::is_none", rename = "mismatchLabelKeys")]
1903#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1904    pub mismatch_label_keys: Option<Vec<String>>,
1905    /// A label query over the set of namespaces that the term applies to.
1906    /// The term is applied to the union of the namespaces selected by this field
1907    /// and the ones listed in the namespaces field.
1908    /// null selector and null or empty namespaces list means "this pod's namespace".
1909    /// An empty selector ({}) matches all namespaces.
1910    #[serde(default, skip_serializing_if = "Option::is_none", rename = "namespaceSelector")]
1911#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1912    pub namespace_selector: Option<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector>,
1913    /// namespaces specifies a static list of namespace names that the term applies to.
1914    /// The term is applied to the union of the namespaces listed in this field
1915    /// and the ones selected by namespaceSelector.
1916    /// null or empty namespaces list and null namespaceSelector means "this pod's namespace".
1917    #[serde(default, skip_serializing_if = "Option::is_none")]
1918#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1919    pub namespaces: Option<Vec<String>>,
1920    /// This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching
1921    /// the labelSelector in the specified namespaces, where co-located is defined as running on a node
1922    /// whose value of the label with key topologyKey matches that of any node on which any of the
1923    /// selected pods is running.
1924    /// Empty topologyKey is not allowed.
1925    #[serde(rename = "topologyKey")]
1926    pub topology_key: String,
1927}
1928
1929/// A label query over a set of resources, in this case pods.
1930/// If it's null, this PodAffinityTerm matches with no Pods.
1931#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1932#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1933#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1934pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector {
1935    /// matchExpressions is a list of label selector requirements. The requirements are ANDed.
1936    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
1937#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1938    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions>>,
1939    /// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
1940    /// map is equivalent to an element of matchExpressions, whose key field is "key", the
1941    /// operator is "In", and the values array contains only "value". The requirements are ANDed.
1942    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabels")]
1943#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1944    pub match_labels: Option<BTreeMap<String, String>>,
1945}
1946
1947/// A label selector requirement is a selector that contains values, a key, and an operator that
1948/// relates the key and values.
1949#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1950#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1951#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1952pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions
1953{
1954    /// key is the label key that the selector applies to.
1955    pub key: String,
1956    /// operator represents a key's relationship to a set of values.
1957    /// Valid operators are In, NotIn, Exists and DoesNotExist.
1958    pub operator: String,
1959    /// values is an array of string values. If the operator is In or NotIn,
1960    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
1961    /// the values array must be empty. This array is replaced during a strategic
1962    /// merge patch.
1963    #[serde(default, skip_serializing_if = "Option::is_none")]
1964    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1965    pub values: Option<Vec<String>>,
1966}
1967
1968/// A label query over the set of namespaces that the term applies to.
1969/// The term is applied to the union of the namespaces selected by this field
1970/// and the ones listed in the namespaces field.
1971/// null selector and null or empty namespaces list means "this pod's namespace".
1972/// An empty selector ({}) matches all namespaces.
1973#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1974#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1975#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1976pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector {
1977    /// matchExpressions is a list of label selector requirements. The requirements are ANDed.
1978    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
1979#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1980    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions>>,
1981    /// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
1982    /// map is equivalent to an element of matchExpressions, whose key field is "key", the
1983    /// operator is "In", and the values array contains only "value". The requirements are ANDed.
1984    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabels")]
1985#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
1986    pub match_labels: Option<BTreeMap<String, String>>,
1987}
1988
1989/// A label selector requirement is a selector that contains values, a key, and an operator that
1990/// relates the key and values.
1991#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
1992#[cfg_attr(feature = "builder", derive(TypedBuilder))]
1993#[cfg_attr(feature = "schemars", derive(JsonSchema))]
1994pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions
1995{
1996    /// key is the label key that the selector applies to.
1997    pub key: String,
1998    /// operator represents a key's relationship to a set of values.
1999    /// Valid operators are In, NotIn, Exists and DoesNotExist.
2000    pub operator: String,
2001    /// values is an array of string values. If the operator is In or NotIn,
2002    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
2003    /// the values array must be empty. This array is replaced during a strategic
2004    /// merge patch.
2005    #[serde(default, skip_serializing_if = "Option::is_none")]
2006    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2007    pub values: Option<Vec<String>>,
2008}
2009
2010/// Defines a set of pods (namely those matching the labelSelector
2011/// relative to the given namespace(s)) that this pod should be
2012/// co-located (affinity) or not co-located (anti-affinity) with,
2013/// where co-located is defined as running on a node whose value of
2014/// the label with key <topologyKey> matches that of any node on which
2015/// a pod of the set of pods is running
2016#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2017#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2018#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2019pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecution {
2020    /// A label query over a set of resources, in this case pods.
2021    /// If it's null, this PodAffinityTerm matches with no Pods.
2022    #[serde(default, skip_serializing_if = "Option::is_none", rename = "labelSelector")]
2023#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2024    pub label_selector: Option<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector>,
2025    /// MatchLabelKeys is a set of pod label keys to select which pods will
2026    /// be taken into consideration. The keys are used to lookup values from the
2027    /// incoming pod labels, those key-value labels are merged with `labelSelector` as `key in (value)`
2028    /// to select the group of existing pods which pods will be taken into consideration
2029    /// for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming
2030    /// pod labels will be ignored. The default value is empty.
2031    /// The same key is forbidden to exist in both matchLabelKeys and labelSelector.
2032    /// Also, matchLabelKeys cannot be set when labelSelector isn't set.
2033    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabelKeys")]
2034#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2035    pub match_label_keys: Option<Vec<String>>,
2036    /// MismatchLabelKeys is a set of pod label keys to select which pods will
2037    /// be taken into consideration. The keys are used to lookup values from the
2038    /// incoming pod labels, those key-value labels are merged with `labelSelector` as `key notin (value)`
2039    /// to select the group of existing pods which pods will be taken into consideration
2040    /// for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming
2041    /// pod labels will be ignored. The default value is empty.
2042    /// The same key is forbidden to exist in both mismatchLabelKeys and labelSelector.
2043    /// Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
2044    #[serde(default, skip_serializing_if = "Option::is_none", rename = "mismatchLabelKeys")]
2045#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2046    pub mismatch_label_keys: Option<Vec<String>>,
2047    /// A label query over the set of namespaces that the term applies to.
2048    /// The term is applied to the union of the namespaces selected by this field
2049    /// and the ones listed in the namespaces field.
2050    /// null selector and null or empty namespaces list means "this pod's namespace".
2051    /// An empty selector ({}) matches all namespaces.
2052    #[serde(default, skip_serializing_if = "Option::is_none", rename = "namespaceSelector")]
2053#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2054    pub namespace_selector: Option<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector>,
2055    /// namespaces specifies a static list of namespace names that the term applies to.
2056    /// The term is applied to the union of the namespaces listed in this field
2057    /// and the ones selected by namespaceSelector.
2058    /// null or empty namespaces list and null namespaceSelector means "this pod's namespace".
2059    #[serde(default, skip_serializing_if = "Option::is_none")]
2060#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2061    pub namespaces: Option<Vec<String>>,
2062    /// This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching
2063    /// the labelSelector in the specified namespaces, where co-located is defined as running on a node
2064    /// whose value of the label with key topologyKey matches that of any node on which any of the
2065    /// selected pods is running.
2066    /// Empty topologyKey is not allowed.
2067    #[serde(rename = "topologyKey")]
2068    pub topology_key: String,
2069}
2070
2071/// A label query over a set of resources, in this case pods.
2072/// If it's null, this PodAffinityTerm matches with no Pods.
2073#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2074#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2075#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2076pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector {
2077    /// matchExpressions is a list of label selector requirements. The requirements are ANDed.
2078    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
2079#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2080    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions>>,
2081    /// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
2082    /// map is equivalent to an element of matchExpressions, whose key field is "key", the
2083    /// operator is "In", and the values array contains only "value". The requirements are ANDed.
2084    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabels")]
2085#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2086    pub match_labels: Option<BTreeMap<String, String>>,
2087}
2088
2089/// A label selector requirement is a selector that contains values, a key, and an operator that
2090/// relates the key and values.
2091#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2092#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2093#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2094pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions
2095{
2096    /// key is the label key that the selector applies to.
2097    pub key: String,
2098    /// operator represents a key's relationship to a set of values.
2099    /// Valid operators are In, NotIn, Exists and DoesNotExist.
2100    pub operator: String,
2101    /// values is an array of string values. If the operator is In or NotIn,
2102    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
2103    /// the values array must be empty. This array is replaced during a strategic
2104    /// merge patch.
2105    #[serde(default, skip_serializing_if = "Option::is_none")]
2106    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2107    pub values: Option<Vec<String>>,
2108}
2109
2110/// A label query over the set of namespaces that the term applies to.
2111/// The term is applied to the union of the namespaces selected by this field
2112/// and the ones listed in the namespaces field.
2113/// null selector and null or empty namespaces list means "this pod's namespace".
2114/// An empty selector ({}) matches all namespaces.
2115#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2116#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2117#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2118pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector {
2119    /// matchExpressions is a list of label selector requirements. The requirements are ANDed.
2120    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
2121#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2122    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions>>,
2123    /// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
2124    /// map is equivalent to an element of matchExpressions, whose key field is "key", the
2125    /// operator is "In", and the values array contains only "value". The requirements are ANDed.
2126    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabels")]
2127#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2128    pub match_labels: Option<BTreeMap<String, String>>,
2129}
2130
2131/// A label selector requirement is a selector that contains values, a key, and an operator that
2132/// relates the key and values.
2133#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2134#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2135#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2136pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions
2137{
2138    /// key is the label key that the selector applies to.
2139    pub key: String,
2140    /// operator represents a key's relationship to a set of values.
2141    /// Valid operators are In, NotIn, Exists and DoesNotExist.
2142    pub operator: String,
2143    /// values is an array of string values. If the operator is In or NotIn,
2144    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
2145    /// the values array must be empty. This array is replaced during a strategic
2146    /// merge patch.
2147    #[serde(default, skip_serializing_if = "Option::is_none")]
2148    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2149    pub values: Option<Vec<String>>,
2150}
2151
2152/// LocalObjectReference contains enough information to let you locate the
2153/// referenced object inside the same namespace.
2154#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2155#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2156#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2157pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecImagePullSecrets {
2158    /// Name of the referent.
2159    /// This field is effectively required, but due to backwards compatibility is
2160    /// allowed to be empty. Instances of this type with an empty value here are
2161    /// almost certainly wrong.
2162    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
2163    #[serde(default, skip_serializing_if = "Option::is_none")]
2164    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2165    pub name: Option<String>,
2166}
2167
2168/// If specified, the pod's resource requirements.
2169/// These values override the global resource configuration flags.
2170/// Note that when only specifying resource limits, ensure they are greater than or equal
2171/// to the corresponding global resource requests configured via controller flags
2172/// (--acme-http01-solver-resource-request-cpu, --acme-http01-solver-resource-request-memory).
2173/// Kubernetes will reject pod creation if limits are lower than requests, causing challenge failures.
2174#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2175#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2176#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2177pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecResources {
2178    /// Limits describes the maximum amount of compute resources allowed.
2179    /// More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
2180    #[serde(default, skip_serializing_if = "Option::is_none")]
2181    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2182    pub limits: Option<BTreeMap<String, IntOrString>>,
2183    /// Requests describes the minimum amount of compute resources required.
2184    /// If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,
2185    /// otherwise to the global values configured via controller flags. Requests cannot exceed Limits.
2186    /// More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
2187    #[serde(default, skip_serializing_if = "Option::is_none")]
2188    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2189    pub requests: Option<BTreeMap<String, IntOrString>>,
2190}
2191
2192/// If specified, the pod's security context
2193#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2194#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2195#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2196pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecSecurityContext {
2197    /// A special supplemental group that applies to all containers in a pod.
2198    /// Some volume types allow the Kubelet to change the ownership of that volume
2199    /// to be owned by the pod:
2200    ///
2201    /// 1. The owning GID will be the FSGroup
2202    /// 2. The setgid bit is set (new files created in the volume will be owned by FSGroup)
2203    /// 3. The permission bits are OR'd with rw-rw----
2204    ///
2205    /// If unset, the Kubelet will not modify the ownership and permissions of any volume.
2206    /// Note that this field cannot be set when spec.os.name is windows.
2207    #[serde(default, skip_serializing_if = "Option::is_none", rename = "fsGroup")]
2208    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2209    pub fs_group: Option<i64>,
2210    /// fsGroupChangePolicy defines behavior of changing ownership and permission of the volume
2211    /// before being exposed inside Pod. This field will only apply to
2212    /// volume types which support fsGroup based ownership(and permissions).
2213    /// It will have no effect on ephemeral volume types such as: secret, configmaps
2214    /// and emptydir.
2215    /// Valid values are "OnRootMismatch" and "Always". If not specified, "Always" is used.
2216    /// Note that this field cannot be set when spec.os.name is windows.
2217    #[serde(
2218        default,
2219        skip_serializing_if = "Option::is_none",
2220        rename = "fsGroupChangePolicy"
2221    )]
2222    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2223    pub fs_group_change_policy: Option<String>,
2224    /// The GID to run the entrypoint of the container process.
2225    /// Uses runtime default if unset.
2226    /// May also be set in SecurityContext.  If set in both SecurityContext and
2227    /// PodSecurityContext, the value specified in SecurityContext takes precedence
2228    /// for that container.
2229    /// Note that this field cannot be set when spec.os.name is windows.
2230    #[serde(
2231        default,
2232        skip_serializing_if = "Option::is_none",
2233        rename = "runAsGroup"
2234    )]
2235    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2236    pub run_as_group: Option<i64>,
2237    /// Indicates that the container must run as a non-root user.
2238    /// If true, the Kubelet will validate the image at runtime to ensure that it
2239    /// does not run as UID 0 (root) and fail to start the container if it does.
2240    /// If unset or false, no such validation will be performed.
2241    /// May also be set in SecurityContext.  If set in both SecurityContext and
2242    /// PodSecurityContext, the value specified in SecurityContext takes precedence.
2243    #[serde(
2244        default,
2245        skip_serializing_if = "Option::is_none",
2246        rename = "runAsNonRoot"
2247    )]
2248    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2249    pub run_as_non_root: Option<bool>,
2250    /// The UID to run the entrypoint of the container process.
2251    /// Defaults to user specified in image metadata if unspecified.
2252    /// May also be set in SecurityContext.  If set in both SecurityContext and
2253    /// PodSecurityContext, the value specified in SecurityContext takes precedence
2254    /// for that container.
2255    /// Note that this field cannot be set when spec.os.name is windows.
2256    #[serde(default, skip_serializing_if = "Option::is_none", rename = "runAsUser")]
2257    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2258    pub run_as_user: Option<i64>,
2259    /// The SELinux context to be applied to all containers.
2260    /// If unspecified, the container runtime will allocate a random SELinux context for each
2261    /// container.  May also be set in SecurityContext.  If set in
2262    /// both SecurityContext and PodSecurityContext, the value specified in SecurityContext
2263    /// takes precedence for that container.
2264    /// Note that this field cannot be set when spec.os.name is windows.
2265    #[serde(
2266        default,
2267        skip_serializing_if = "Option::is_none",
2268        rename = "seLinuxOptions"
2269    )]
2270    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2271    pub se_linux_options: Option<
2272        ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecSecurityContextSeLinuxOptions,
2273    >,
2274    /// The seccomp options to use by the containers in this pod.
2275    /// Note that this field cannot be set when spec.os.name is windows.
2276    #[serde(
2277        default,
2278        skip_serializing_if = "Option::is_none",
2279        rename = "seccompProfile"
2280    )]
2281    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2282    pub seccomp_profile: Option<
2283        ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecSecurityContextSeccompProfile,
2284    >,
2285    /// A list of groups applied to the first process run in each container, in addition
2286    /// to the container's primary GID, the fsGroup (if specified), and group memberships
2287    /// defined in the container image for the uid of the container process. If unspecified,
2288    /// no additional groups are added to any container. Note that group memberships
2289    /// defined in the container image for the uid of the container process are still effective,
2290    /// even if they are not included in this list.
2291    /// Note that this field cannot be set when spec.os.name is windows.
2292    #[serde(
2293        default,
2294        skip_serializing_if = "Option::is_none",
2295        rename = "supplementalGroups"
2296    )]
2297    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2298    pub supplemental_groups: Option<Vec<i64>>,
2299    /// Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported
2300    /// sysctls (by the container runtime) might fail to launch.
2301    /// Note that this field cannot be set when spec.os.name is windows.
2302    #[serde(default, skip_serializing_if = "Option::is_none")]
2303    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2304    pub sysctls: Option<
2305        Vec<ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecSecurityContextSysctls>,
2306    >,
2307}
2308
2309/// The SELinux context to be applied to all containers.
2310/// If unspecified, the container runtime will allocate a random SELinux context for each
2311/// container.  May also be set in SecurityContext.  If set in
2312/// both SecurityContext and PodSecurityContext, the value specified in SecurityContext
2313/// takes precedence for that container.
2314/// Note that this field cannot be set when spec.os.name is windows.
2315#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2316#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2317#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2318pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecSecurityContextSeLinuxOptions
2319{
2320    /// Level is SELinux level label that applies to the container.
2321    #[serde(default, skip_serializing_if = "Option::is_none")]
2322    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2323    pub level: Option<String>,
2324    /// Role is a SELinux role label that applies to the container.
2325    #[serde(default, skip_serializing_if = "Option::is_none")]
2326    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2327    pub role: Option<String>,
2328    /// Type is a SELinux type label that applies to the container.
2329    #[serde(default, skip_serializing_if = "Option::is_none", rename = "type")]
2330    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2331    pub r#type: Option<String>,
2332    /// User is a SELinux user label that applies to the container.
2333    #[serde(default, skip_serializing_if = "Option::is_none")]
2334    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2335    pub user: Option<String>,
2336}
2337
2338/// The seccomp options to use by the containers in this pod.
2339/// Note that this field cannot be set when spec.os.name is windows.
2340#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2341#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2342#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2343pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecSecurityContextSeccompProfile
2344{
2345    /// localhostProfile indicates a profile defined in a file on the node should be used.
2346    /// The profile must be preconfigured on the node to work.
2347    /// Must be a descending path, relative to the kubelet's configured seccomp profile location.
2348    /// Must be set if type is "Localhost". Must NOT be set for any other type.
2349    #[serde(
2350        default,
2351        skip_serializing_if = "Option::is_none",
2352        rename = "localhostProfile"
2353    )]
2354    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2355    pub localhost_profile: Option<String>,
2356    /// type indicates which kind of seccomp profile will be applied.
2357    /// Valid options are:
2358    ///
2359    /// Localhost - a profile defined in a file on the node should be used.
2360    /// RuntimeDefault - the container runtime default profile should be used.
2361    /// Unconfined - no profile should be applied.
2362    #[serde(rename = "type")]
2363    pub r#type: String,
2364}
2365
2366/// Sysctl defines a kernel parameter to be set
2367#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2368#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2369#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2370pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecSecurityContextSysctls {
2371    /// Name of a property to set
2372    pub name: String,
2373    /// Value of a property to set
2374    pub value: String,
2375}
2376
2377/// The pod this Toleration is attached to tolerates any taint that matches
2378/// the triple <key,value,effect> using the matching operator <operator>.
2379#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2380#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2381#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2382pub struct ClusterIssuerAcmeSolversHttp01GatewayHttpRoutePodTemplateSpecTolerations {
2383    /// Effect indicates the taint effect to match. Empty means match all taint effects.
2384    /// When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.
2385    #[serde(default, skip_serializing_if = "Option::is_none")]
2386    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2387    pub effect: Option<String>,
2388    /// Key is the taint key that the toleration applies to. Empty means match all taint keys.
2389    /// If the key is empty, operator must be Exists; this combination means to match all values and all keys.
2390    #[serde(default, skip_serializing_if = "Option::is_none")]
2391    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2392    pub key: Option<String>,
2393    /// Operator represents a key's relationship to the value.
2394    /// Valid operators are Exists and Equal. Defaults to Equal.
2395    /// Exists is equivalent to wildcard for value, so that a pod can
2396    /// tolerate all taints of a particular category.
2397    #[serde(default, skip_serializing_if = "Option::is_none")]
2398    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2399    pub operator: Option<String>,
2400    /// TolerationSeconds represents the period of time the toleration (which must be
2401    /// of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,
2402    /// it is not set, which means tolerate the taint forever (do not evict). Zero and
2403    /// negative values will be treated as 0 (evict immediately) by the system.
2404    #[serde(
2405        default,
2406        skip_serializing_if = "Option::is_none",
2407        rename = "tolerationSeconds"
2408    )]
2409    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2410    pub toleration_seconds: Option<i64>,
2411    /// Value is the taint value the toleration matches to.
2412    /// If the operator is Exists, the value should be empty, otherwise just a regular string.
2413    #[serde(default, skip_serializing_if = "Option::is_none")]
2414    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2415    pub value: Option<String>,
2416}
2417
2418/// The ingress based HTTP01 challenge solver will solve challenges by
2419/// creating or modifying Ingress resources in order to route requests for
2420/// '/.well-known/acme-challenge/XYZ' to 'challenge solver' pods that are
2421/// provisioned by cert-manager for each Challenge to be completed.
2422#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2423#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2424#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2425pub struct ClusterIssuerAcmeSolversHttp01Ingress {
2426    /// This field configures the annotation `kubernetes.io/ingress.class` when
2427    /// creating Ingress resources to solve ACME challenges that use this
2428    /// challenge solver. Only one of `class`, `name` or `ingressClassName` may
2429    /// be specified.
2430    #[serde(default, skip_serializing_if = "Option::is_none")]
2431    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2432    pub class: Option<String>,
2433    /// This field configures the field `ingressClassName` on the created Ingress
2434    /// resources used to solve ACME challenges that use this challenge solver.
2435    /// This is the recommended way of configuring the ingress class. Only one of
2436    /// `class`, `name` or `ingressClassName` may be specified.
2437    #[serde(
2438        default,
2439        skip_serializing_if = "Option::is_none",
2440        rename = "ingressClassName"
2441    )]
2442    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2443    pub ingress_class_name: Option<String>,
2444    /// Optional ingress template used to configure the ACME challenge solver
2445    /// ingress used for HTTP01 challenges.
2446    #[serde(
2447        default,
2448        skip_serializing_if = "Option::is_none",
2449        rename = "ingressTemplate"
2450    )]
2451    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2452    pub ingress_template: Option<ClusterIssuerAcmeSolversHttp01IngressIngressTemplate>,
2453    /// The name of the ingress resource that should have ACME challenge solving
2454    /// routes inserted into it in order to solve HTTP01 challenges.
2455    /// This is typically used in conjunction with ingress controllers like
2456    /// ingress-gce, which maintains a 1:1 mapping between external IPs and
2457    /// ingress resources. Only one of `class`, `name` or `ingressClassName` may
2458    /// be specified.
2459    #[serde(default, skip_serializing_if = "Option::is_none")]
2460    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2461    pub name: Option<String>,
2462    /// Optional pod template used to configure the ACME challenge solver pods
2463    /// used for HTTP01 challenges.
2464    #[serde(
2465        default,
2466        skip_serializing_if = "Option::is_none",
2467        rename = "podTemplate"
2468    )]
2469    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2470    pub pod_template: Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplate>,
2471    /// Optional service type for Kubernetes solver service. Supported values
2472    /// are NodePort or ClusterIP. If unset, defaults to NodePort.
2473    #[serde(
2474        default,
2475        skip_serializing_if = "Option::is_none",
2476        rename = "serviceType"
2477    )]
2478    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2479    pub service_type: Option<String>,
2480}
2481
2482/// Optional ingress template used to configure the ACME challenge solver
2483/// ingress used for HTTP01 challenges.
2484#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2485#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2486#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2487pub struct ClusterIssuerAcmeSolversHttp01IngressIngressTemplate {
2488    /// ObjectMeta overrides for the ingress used to solve HTTP01 challenges.
2489    /// Only the 'labels' and 'annotations' fields may be set.
2490    /// If labels or annotations overlap with in-built values, the values here
2491    /// will override the in-built values.
2492    #[serde(default, skip_serializing_if = "Option::is_none")]
2493    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2494    pub metadata: Option<ClusterIssuerAcmeSolversHttp01IngressIngressTemplateMetadata>,
2495}
2496
2497/// ObjectMeta overrides for the ingress used to solve HTTP01 challenges.
2498/// Only the 'labels' and 'annotations' fields may be set.
2499/// If labels or annotations overlap with in-built values, the values here
2500/// will override the in-built values.
2501#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2502#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2503#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2504pub struct ClusterIssuerAcmeSolversHttp01IngressIngressTemplateMetadata {
2505    /// Annotations that should be added to the created ACME HTTP01 solver ingress.
2506    #[serde(default, skip_serializing_if = "Option::is_none")]
2507    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2508    pub annotations: Option<BTreeMap<String, String>>,
2509    /// Labels that should be added to the created ACME HTTP01 solver ingress.
2510    #[serde(default, skip_serializing_if = "Option::is_none")]
2511    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2512    pub labels: Option<BTreeMap<String, String>>,
2513}
2514
2515/// Optional pod template used to configure the ACME challenge solver pods
2516/// used for HTTP01 challenges.
2517#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2518#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2519#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2520pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplate {
2521    /// ObjectMeta overrides for the pod used to solve HTTP01 challenges.
2522    /// Only the 'labels' and 'annotations' fields may be set.
2523    /// If labels or annotations overlap with in-built values, the values here
2524    /// will override the in-built values.
2525    #[serde(default, skip_serializing_if = "Option::is_none")]
2526    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2527    pub metadata: Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplateMetadata>,
2528    /// PodSpec defines overrides for the HTTP01 challenge solver pod.
2529    /// Check ACMEChallengeSolverHTTP01IngressPodSpec to find out currently supported fields.
2530    /// All other fields will be ignored.
2531    #[serde(default, skip_serializing_if = "Option::is_none")]
2532    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2533    pub spec: Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpec>,
2534}
2535
2536/// ObjectMeta overrides for the pod used to solve HTTP01 challenges.
2537/// Only the 'labels' and 'annotations' fields may be set.
2538/// If labels or annotations overlap with in-built values, the values here
2539/// will override the in-built values.
2540#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2541#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2542#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2543pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateMetadata {
2544    /// Annotations that should be added to the created ACME HTTP01 solver pods.
2545    #[serde(default, skip_serializing_if = "Option::is_none")]
2546    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2547    pub annotations: Option<BTreeMap<String, String>>,
2548    /// Labels that should be added to the created ACME HTTP01 solver pods.
2549    #[serde(default, skip_serializing_if = "Option::is_none")]
2550    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2551    pub labels: Option<BTreeMap<String, String>>,
2552}
2553
2554/// PodSpec defines overrides for the HTTP01 challenge solver pod.
2555/// Check ACMEChallengeSolverHTTP01IngressPodSpec to find out currently supported fields.
2556/// All other fields will be ignored.
2557#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2558#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2559#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2560pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpec {
2561    /// If specified, the pod's scheduling constraints
2562    #[serde(default, skip_serializing_if = "Option::is_none")]
2563    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2564    pub affinity: Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinity>,
2565    /// If specified, the pod's imagePullSecrets
2566    #[serde(
2567        default,
2568        skip_serializing_if = "Option::is_none",
2569        rename = "imagePullSecrets"
2570    )]
2571    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2572    pub image_pull_secrets:
2573        Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecImagePullSecrets>>,
2574    /// NodeSelector is a selector which must be true for the pod to fit on a node.
2575    /// Selector which must match a node's labels for the pod to be scheduled on that node.
2576    /// More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
2577    #[serde(
2578        default,
2579        skip_serializing_if = "Option::is_none",
2580        rename = "nodeSelector"
2581    )]
2582    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2583    pub node_selector: Option<BTreeMap<String, String>>,
2584    /// If specified, the pod's priorityClassName.
2585    #[serde(
2586        default,
2587        skip_serializing_if = "Option::is_none",
2588        rename = "priorityClassName"
2589    )]
2590    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2591    pub priority_class_name: Option<String>,
2592    /// If specified, the pod's resource requirements.
2593    /// These values override the global resource configuration flags.
2594    /// Note that when only specifying resource limits, ensure they are greater than or equal
2595    /// to the corresponding global resource requests configured via controller flags
2596    /// (--acme-http01-solver-resource-request-cpu, --acme-http01-solver-resource-request-memory).
2597    /// Kubernetes will reject pod creation if limits are lower than requests, causing challenge failures.
2598    #[serde(default, skip_serializing_if = "Option::is_none")]
2599    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2600    pub resources: Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecResources>,
2601    /// If specified, the pod's security context
2602    #[serde(
2603        default,
2604        skip_serializing_if = "Option::is_none",
2605        rename = "securityContext"
2606    )]
2607    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2608    pub security_context:
2609        Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecSecurityContext>,
2610    /// If specified, the pod's service account
2611    #[serde(
2612        default,
2613        skip_serializing_if = "Option::is_none",
2614        rename = "serviceAccountName"
2615    )]
2616    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2617    pub service_account_name: Option<String>,
2618    /// If specified, the pod's tolerations.
2619    #[serde(default, skip_serializing_if = "Option::is_none")]
2620    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2621    pub tolerations: Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecTolerations>>,
2622}
2623
2624/// If specified, the pod's scheduling constraints
2625#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2626#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2627#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2628pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinity {
2629    /// Describes node affinity scheduling rules for the pod.
2630    #[serde(
2631        default,
2632        skip_serializing_if = "Option::is_none",
2633        rename = "nodeAffinity"
2634    )]
2635    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2636    pub node_affinity:
2637        Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityNodeAffinity>,
2638    /// Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)).
2639    #[serde(
2640        default,
2641        skip_serializing_if = "Option::is_none",
2642        rename = "podAffinity"
2643    )]
2644    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2645    pub pod_affinity:
2646        Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinity>,
2647    /// Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)).
2648    #[serde(
2649        default,
2650        skip_serializing_if = "Option::is_none",
2651        rename = "podAntiAffinity"
2652    )]
2653    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2654    pub pod_anti_affinity:
2655        Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinity>,
2656}
2657
2658/// Describes node affinity scheduling rules for the pod.
2659#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2660#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2661#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2662pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityNodeAffinity {
2663    /// The scheduler will prefer to schedule pods to nodes that satisfy
2664    /// the affinity expressions specified by this field, but it may choose
2665    /// a node that violates one or more of the expressions. The node that is
2666    /// most preferred is the one with the greatest sum of weights, i.e.
2667    /// for each node that meets all of the scheduling requirements (resource
2668    /// request, requiredDuringScheduling affinity expressions, etc.),
2669    /// compute a sum by iterating through the elements of this field and adding
2670    /// "weight" to the sum if the node matches the corresponding matchExpressions; the
2671    /// node(s) with the highest sum are the most preferred.
2672    #[serde(default, skip_serializing_if = "Option::is_none", rename = "preferredDuringSchedulingIgnoredDuringExecution")]
2673#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2674    pub preferred_during_scheduling_ignored_during_execution: Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecution>>,
2675    /// If the affinity requirements specified by this field are not met at
2676    /// scheduling time, the pod will not be scheduled onto the node.
2677    /// If the affinity requirements specified by this field cease to be met
2678    /// at some point during pod execution (e.g. due to an update), the system
2679    /// may or may not try to eventually evict the pod from its node.
2680    #[serde(default, skip_serializing_if = "Option::is_none", rename = "requiredDuringSchedulingIgnoredDuringExecution")]
2681#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2682    pub required_during_scheduling_ignored_during_execution: Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecution>,
2683}
2684
2685/// An empty preferred scheduling term matches all objects with implicit weight 0
2686/// (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).
2687#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2688#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2689#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2690pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecution {
2691    /// A node selector term, associated with the corresponding weight.
2692    pub preference: ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreference,
2693    /// Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.
2694    pub weight: i32,
2695}
2696
2697/// A node selector term, associated with the corresponding weight.
2698#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2699#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2700#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2701pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreference {
2702    /// A list of node selector requirements by node's labels.
2703    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
2704#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2705    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchExpressions>>,
2706    /// A list of node selector requirements by node's fields.
2707    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchFields")]
2708#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2709    pub match_fields: Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchFields>>,
2710}
2711
2712/// A node selector requirement is a selector that contains values, a key, and an operator
2713/// that relates the key and values.
2714#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2715#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2716#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2717pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchExpressions
2718{
2719    /// The label key that the selector applies to.
2720    pub key: String,
2721    /// Represents a key's relationship to a set of values.
2722    /// Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
2723    pub operator: String,
2724    /// An array of string values. If the operator is In or NotIn,
2725    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
2726    /// the values array must be empty. If the operator is Gt or Lt, the values
2727    /// array must have a single element, which will be interpreted as an integer.
2728    /// This array is replaced during a strategic merge patch.
2729    #[serde(default, skip_serializing_if = "Option::is_none")]
2730    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2731    pub values: Option<Vec<String>>,
2732}
2733
2734/// A node selector requirement is a selector that contains values, a key, and an operator
2735/// that relates the key and values.
2736#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2737#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2738#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2739pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchFields
2740{
2741    /// The label key that the selector applies to.
2742    pub key: String,
2743    /// Represents a key's relationship to a set of values.
2744    /// Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
2745    pub operator: String,
2746    /// An array of string values. If the operator is In or NotIn,
2747    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
2748    /// the values array must be empty. If the operator is Gt or Lt, the values
2749    /// array must have a single element, which will be interpreted as an integer.
2750    /// This array is replaced during a strategic merge patch.
2751    #[serde(default, skip_serializing_if = "Option::is_none")]
2752    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2753    pub values: Option<Vec<String>>,
2754}
2755
2756/// If the affinity requirements specified by this field are not met at
2757/// scheduling time, the pod will not be scheduled onto the node.
2758/// If the affinity requirements specified by this field cease to be met
2759/// at some point during pod execution (e.g. due to an update), the system
2760/// may or may not try to eventually evict the pod from its node.
2761#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2762#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2763#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2764pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecution {
2765    /// Required. A list of node selector terms. The terms are ORed.
2766    #[serde(rename = "nodeSelectorTerms")]
2767#[cfg_attr(feature = "builder", builder(default))]
2768    pub node_selector_terms: Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTerms>,
2769}
2770
2771/// A null or empty node selector term matches no objects. The requirements of
2772/// them are ANDed.
2773/// The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.
2774#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2775#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2776#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2777pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTerms {
2778    /// A list of node selector requirements by node's labels.
2779    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
2780#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2781    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchExpressions>>,
2782    /// A list of node selector requirements by node's fields.
2783    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchFields")]
2784#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2785    pub match_fields: Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchFields>>,
2786}
2787
2788/// A node selector requirement is a selector that contains values, a key, and an operator
2789/// that relates the key and values.
2790#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2791#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2792#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2793pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchExpressions
2794{
2795    /// The label key that the selector applies to.
2796    pub key: String,
2797    /// Represents a key's relationship to a set of values.
2798    /// Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
2799    pub operator: String,
2800    /// An array of string values. If the operator is In or NotIn,
2801    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
2802    /// the values array must be empty. If the operator is Gt or Lt, the values
2803    /// array must have a single element, which will be interpreted as an integer.
2804    /// This array is replaced during a strategic merge patch.
2805    #[serde(default, skip_serializing_if = "Option::is_none")]
2806    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2807    pub values: Option<Vec<String>>,
2808}
2809
2810/// A node selector requirement is a selector that contains values, a key, and an operator
2811/// that relates the key and values.
2812#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2813#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2814#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2815pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchFields
2816{
2817    /// The label key that the selector applies to.
2818    pub key: String,
2819    /// Represents a key's relationship to a set of values.
2820    /// Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
2821    pub operator: String,
2822    /// An array of string values. If the operator is In or NotIn,
2823    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
2824    /// the values array must be empty. If the operator is Gt or Lt, the values
2825    /// array must have a single element, which will be interpreted as an integer.
2826    /// This array is replaced during a strategic merge patch.
2827    #[serde(default, skip_serializing_if = "Option::is_none")]
2828    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2829    pub values: Option<Vec<String>>,
2830}
2831
2832/// Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)).
2833#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2834#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2835#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2836pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinity {
2837    /// The scheduler will prefer to schedule pods to nodes that satisfy
2838    /// the affinity expressions specified by this field, but it may choose
2839    /// a node that violates one or more of the expressions. The node that is
2840    /// most preferred is the one with the greatest sum of weights, i.e.
2841    /// for each node that meets all of the scheduling requirements (resource
2842    /// request, requiredDuringScheduling affinity expressions, etc.),
2843    /// compute a sum by iterating through the elements of this field and adding
2844    /// "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the
2845    /// node(s) with the highest sum are the most preferred.
2846    #[serde(default, skip_serializing_if = "Option::is_none", rename = "preferredDuringSchedulingIgnoredDuringExecution")]
2847#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2848    pub preferred_during_scheduling_ignored_during_execution: Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecution>>,
2849    /// If the affinity requirements specified by this field are not met at
2850    /// scheduling time, the pod will not be scheduled onto the node.
2851    /// If the affinity requirements specified by this field cease to be met
2852    /// at some point during pod execution (e.g. due to a pod label update), the
2853    /// system may or may not try to eventually evict the pod from its node.
2854    /// When there are multiple elements, the lists of nodes corresponding to each
2855    /// podAffinityTerm are intersected, i.e. all terms must be satisfied.
2856    #[serde(default, skip_serializing_if = "Option::is_none", rename = "requiredDuringSchedulingIgnoredDuringExecution")]
2857#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2858    pub required_during_scheduling_ignored_during_execution: Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecution>>,
2859}
2860
2861/// The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)
2862#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2863#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2864#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2865pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecution {
2866    /// Required. A pod affinity term, associated with the corresponding weight.
2867    #[serde(rename = "podAffinityTerm")]
2868    pub pod_affinity_term: ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm,
2869    /// weight associated with matching the corresponding podAffinityTerm,
2870    /// in the range 1-100.
2871    pub weight: i32,
2872}
2873
2874/// Required. A pod affinity term, associated with the corresponding weight.
2875#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2876#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2877#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2878pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm {
2879    /// A label query over a set of resources, in this case pods.
2880    /// If it's null, this PodAffinityTerm matches with no Pods.
2881    #[serde(default, skip_serializing_if = "Option::is_none", rename = "labelSelector")]
2882#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2883    pub label_selector: Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector>,
2884    /// MatchLabelKeys is a set of pod label keys to select which pods will
2885    /// be taken into consideration. The keys are used to lookup values from the
2886    /// incoming pod labels, those key-value labels are merged with `labelSelector` as `key in (value)`
2887    /// to select the group of existing pods which pods will be taken into consideration
2888    /// for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming
2889    /// pod labels will be ignored. The default value is empty.
2890    /// The same key is forbidden to exist in both matchLabelKeys and labelSelector.
2891    /// Also, matchLabelKeys cannot be set when labelSelector isn't set.
2892    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabelKeys")]
2893#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2894    pub match_label_keys: Option<Vec<String>>,
2895    /// MismatchLabelKeys is a set of pod label keys to select which pods will
2896    /// be taken into consideration. The keys are used to lookup values from the
2897    /// incoming pod labels, those key-value labels are merged with `labelSelector` as `key notin (value)`
2898    /// to select the group of existing pods which pods will be taken into consideration
2899    /// for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming
2900    /// pod labels will be ignored. The default value is empty.
2901    /// The same key is forbidden to exist in both mismatchLabelKeys and labelSelector.
2902    /// Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
2903    #[serde(default, skip_serializing_if = "Option::is_none", rename = "mismatchLabelKeys")]
2904#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2905    pub mismatch_label_keys: Option<Vec<String>>,
2906    /// A label query over the set of namespaces that the term applies to.
2907    /// The term is applied to the union of the namespaces selected by this field
2908    /// and the ones listed in the namespaces field.
2909    /// null selector and null or empty namespaces list means "this pod's namespace".
2910    /// An empty selector ({}) matches all namespaces.
2911    #[serde(default, skip_serializing_if = "Option::is_none", rename = "namespaceSelector")]
2912#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2913    pub namespace_selector: Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector>,
2914    /// namespaces specifies a static list of namespace names that the term applies to.
2915    /// The term is applied to the union of the namespaces listed in this field
2916    /// and the ones selected by namespaceSelector.
2917    /// null or empty namespaces list and null namespaceSelector means "this pod's namespace".
2918    #[serde(default, skip_serializing_if = "Option::is_none")]
2919#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2920    pub namespaces: Option<Vec<String>>,
2921    /// This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching
2922    /// the labelSelector in the specified namespaces, where co-located is defined as running on a node
2923    /// whose value of the label with key topologyKey matches that of any node on which any of the
2924    /// selected pods is running.
2925    /// Empty topologyKey is not allowed.
2926    #[serde(rename = "topologyKey")]
2927    pub topology_key: String,
2928}
2929
2930/// A label query over a set of resources, in this case pods.
2931/// If it's null, this PodAffinityTerm matches with no Pods.
2932#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2933#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2934#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2935pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector {
2936    /// matchExpressions is a list of label selector requirements. The requirements are ANDed.
2937    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
2938#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2939    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions>>,
2940    /// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
2941    /// map is equivalent to an element of matchExpressions, whose key field is "key", the
2942    /// operator is "In", and the values array contains only "value". The requirements are ANDed.
2943    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabels")]
2944#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2945    pub match_labels: Option<BTreeMap<String, String>>,
2946}
2947
2948/// A label selector requirement is a selector that contains values, a key, and an operator that
2949/// relates the key and values.
2950#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2951#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2952#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2953pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions
2954{
2955    /// key is the label key that the selector applies to.
2956    pub key: String,
2957    /// operator represents a key's relationship to a set of values.
2958    /// Valid operators are In, NotIn, Exists and DoesNotExist.
2959    pub operator: String,
2960    /// values is an array of string values. If the operator is In or NotIn,
2961    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
2962    /// the values array must be empty. This array is replaced during a strategic
2963    /// merge patch.
2964    #[serde(default, skip_serializing_if = "Option::is_none")]
2965    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2966    pub values: Option<Vec<String>>,
2967}
2968
2969/// A label query over the set of namespaces that the term applies to.
2970/// The term is applied to the union of the namespaces selected by this field
2971/// and the ones listed in the namespaces field.
2972/// null selector and null or empty namespaces list means "this pod's namespace".
2973/// An empty selector ({}) matches all namespaces.
2974#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2975#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2976#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2977pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector {
2978    /// matchExpressions is a list of label selector requirements. The requirements are ANDed.
2979    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
2980#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2981    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions>>,
2982    /// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
2983    /// map is equivalent to an element of matchExpressions, whose key field is "key", the
2984    /// operator is "In", and the values array contains only "value". The requirements are ANDed.
2985    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabels")]
2986#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
2987    pub match_labels: Option<BTreeMap<String, String>>,
2988}
2989
2990/// A label selector requirement is a selector that contains values, a key, and an operator that
2991/// relates the key and values.
2992#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
2993#[cfg_attr(feature = "builder", derive(TypedBuilder))]
2994#[cfg_attr(feature = "schemars", derive(JsonSchema))]
2995pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions
2996{
2997    /// key is the label key that the selector applies to.
2998    pub key: String,
2999    /// operator represents a key's relationship to a set of values.
3000    /// Valid operators are In, NotIn, Exists and DoesNotExist.
3001    pub operator: String,
3002    /// values is an array of string values. If the operator is In or NotIn,
3003    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
3004    /// the values array must be empty. This array is replaced during a strategic
3005    /// merge patch.
3006    #[serde(default, skip_serializing_if = "Option::is_none")]
3007    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3008    pub values: Option<Vec<String>>,
3009}
3010
3011/// Defines a set of pods (namely those matching the labelSelector
3012/// relative to the given namespace(s)) that this pod should be
3013/// co-located (affinity) or not co-located (anti-affinity) with,
3014/// where co-located is defined as running on a node whose value of
3015/// the label with key <topologyKey> matches that of any node on which
3016/// a pod of the set of pods is running
3017#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3018#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3019#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3020pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecution {
3021    /// A label query over a set of resources, in this case pods.
3022    /// If it's null, this PodAffinityTerm matches with no Pods.
3023    #[serde(default, skip_serializing_if = "Option::is_none", rename = "labelSelector")]
3024#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3025    pub label_selector: Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector>,
3026    /// MatchLabelKeys is a set of pod label keys to select which pods will
3027    /// be taken into consideration. The keys are used to lookup values from the
3028    /// incoming pod labels, those key-value labels are merged with `labelSelector` as `key in (value)`
3029    /// to select the group of existing pods which pods will be taken into consideration
3030    /// for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming
3031    /// pod labels will be ignored. The default value is empty.
3032    /// The same key is forbidden to exist in both matchLabelKeys and labelSelector.
3033    /// Also, matchLabelKeys cannot be set when labelSelector isn't set.
3034    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabelKeys")]
3035#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3036    pub match_label_keys: Option<Vec<String>>,
3037    /// MismatchLabelKeys is a set of pod label keys to select which pods will
3038    /// be taken into consideration. The keys are used to lookup values from the
3039    /// incoming pod labels, those key-value labels are merged with `labelSelector` as `key notin (value)`
3040    /// to select the group of existing pods which pods will be taken into consideration
3041    /// for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming
3042    /// pod labels will be ignored. The default value is empty.
3043    /// The same key is forbidden to exist in both mismatchLabelKeys and labelSelector.
3044    /// Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
3045    #[serde(default, skip_serializing_if = "Option::is_none", rename = "mismatchLabelKeys")]
3046#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3047    pub mismatch_label_keys: Option<Vec<String>>,
3048    /// A label query over the set of namespaces that the term applies to.
3049    /// The term is applied to the union of the namespaces selected by this field
3050    /// and the ones listed in the namespaces field.
3051    /// null selector and null or empty namespaces list means "this pod's namespace".
3052    /// An empty selector ({}) matches all namespaces.
3053    #[serde(default, skip_serializing_if = "Option::is_none", rename = "namespaceSelector")]
3054#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3055    pub namespace_selector: Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector>,
3056    /// namespaces specifies a static list of namespace names that the term applies to.
3057    /// The term is applied to the union of the namespaces listed in this field
3058    /// and the ones selected by namespaceSelector.
3059    /// null or empty namespaces list and null namespaceSelector means "this pod's namespace".
3060    #[serde(default, skip_serializing_if = "Option::is_none")]
3061#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3062    pub namespaces: Option<Vec<String>>,
3063    /// This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching
3064    /// the labelSelector in the specified namespaces, where co-located is defined as running on a node
3065    /// whose value of the label with key topologyKey matches that of any node on which any of the
3066    /// selected pods is running.
3067    /// Empty topologyKey is not allowed.
3068    #[serde(rename = "topologyKey")]
3069    pub topology_key: String,
3070}
3071
3072/// A label query over a set of resources, in this case pods.
3073/// If it's null, this PodAffinityTerm matches with no Pods.
3074#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3075#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3076#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3077pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector {
3078    /// matchExpressions is a list of label selector requirements. The requirements are ANDed.
3079    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
3080#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3081    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions>>,
3082    /// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
3083    /// map is equivalent to an element of matchExpressions, whose key field is "key", the
3084    /// operator is "In", and the values array contains only "value". The requirements are ANDed.
3085    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabels")]
3086#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3087    pub match_labels: Option<BTreeMap<String, String>>,
3088}
3089
3090/// A label selector requirement is a selector that contains values, a key, and an operator that
3091/// relates the key and values.
3092#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3093#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3094#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3095pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions
3096{
3097    /// key is the label key that the selector applies to.
3098    pub key: String,
3099    /// operator represents a key's relationship to a set of values.
3100    /// Valid operators are In, NotIn, Exists and DoesNotExist.
3101    pub operator: String,
3102    /// values is an array of string values. If the operator is In or NotIn,
3103    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
3104    /// the values array must be empty. This array is replaced during a strategic
3105    /// merge patch.
3106    #[serde(default, skip_serializing_if = "Option::is_none")]
3107    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3108    pub values: Option<Vec<String>>,
3109}
3110
3111/// A label query over the set of namespaces that the term applies to.
3112/// The term is applied to the union of the namespaces selected by this field
3113/// and the ones listed in the namespaces field.
3114/// null selector and null or empty namespaces list means "this pod's namespace".
3115/// An empty selector ({}) matches all namespaces.
3116#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3117#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3118#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3119pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector {
3120    /// matchExpressions is a list of label selector requirements. The requirements are ANDed.
3121    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
3122#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3123    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions>>,
3124    /// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
3125    /// map is equivalent to an element of matchExpressions, whose key field is "key", the
3126    /// operator is "In", and the values array contains only "value". The requirements are ANDed.
3127    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabels")]
3128#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3129    pub match_labels: Option<BTreeMap<String, String>>,
3130}
3131
3132/// A label selector requirement is a selector that contains values, a key, and an operator that
3133/// relates the key and values.
3134#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3135#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3136#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3137pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions
3138{
3139    /// key is the label key that the selector applies to.
3140    pub key: String,
3141    /// operator represents a key's relationship to a set of values.
3142    /// Valid operators are In, NotIn, Exists and DoesNotExist.
3143    pub operator: String,
3144    /// values is an array of string values. If the operator is In or NotIn,
3145    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
3146    /// the values array must be empty. This array is replaced during a strategic
3147    /// merge patch.
3148    #[serde(default, skip_serializing_if = "Option::is_none")]
3149    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3150    pub values: Option<Vec<String>>,
3151}
3152
3153/// Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)).
3154#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3155#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3156#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3157pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinity {
3158    /// The scheduler will prefer to schedule pods to nodes that satisfy
3159    /// the anti-affinity expressions specified by this field, but it may choose
3160    /// a node that violates one or more of the expressions. The node that is
3161    /// most preferred is the one with the greatest sum of weights, i.e.
3162    /// for each node that meets all of the scheduling requirements (resource
3163    /// request, requiredDuringScheduling anti-affinity expressions, etc.),
3164    /// compute a sum by iterating through the elements of this field and subtracting
3165    /// "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the
3166    /// node(s) with the highest sum are the most preferred.
3167    #[serde(default, skip_serializing_if = "Option::is_none", rename = "preferredDuringSchedulingIgnoredDuringExecution")]
3168#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3169    pub preferred_during_scheduling_ignored_during_execution: Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecution>>,
3170    /// If the anti-affinity requirements specified by this field are not met at
3171    /// scheduling time, the pod will not be scheduled onto the node.
3172    /// If the anti-affinity requirements specified by this field cease to be met
3173    /// at some point during pod execution (e.g. due to a pod label update), the
3174    /// system may or may not try to eventually evict the pod from its node.
3175    /// When there are multiple elements, the lists of nodes corresponding to each
3176    /// podAffinityTerm are intersected, i.e. all terms must be satisfied.
3177    #[serde(default, skip_serializing_if = "Option::is_none", rename = "requiredDuringSchedulingIgnoredDuringExecution")]
3178#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3179    pub required_during_scheduling_ignored_during_execution: Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecution>>,
3180}
3181
3182/// The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)
3183#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3184#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3185#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3186pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecution {
3187    /// Required. A pod affinity term, associated with the corresponding weight.
3188    #[serde(rename = "podAffinityTerm")]
3189    pub pod_affinity_term: ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm,
3190    /// weight associated with matching the corresponding podAffinityTerm,
3191    /// in the range 1-100.
3192    pub weight: i32,
3193}
3194
3195/// Required. A pod affinity term, associated with the corresponding weight.
3196#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3197#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3198#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3199pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm {
3200    /// A label query over a set of resources, in this case pods.
3201    /// If it's null, this PodAffinityTerm matches with no Pods.
3202    #[serde(default, skip_serializing_if = "Option::is_none", rename = "labelSelector")]
3203#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3204    pub label_selector: Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector>,
3205    /// MatchLabelKeys is a set of pod label keys to select which pods will
3206    /// be taken into consideration. The keys are used to lookup values from the
3207    /// incoming pod labels, those key-value labels are merged with `labelSelector` as `key in (value)`
3208    /// to select the group of existing pods which pods will be taken into consideration
3209    /// for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming
3210    /// pod labels will be ignored. The default value is empty.
3211    /// The same key is forbidden to exist in both matchLabelKeys and labelSelector.
3212    /// Also, matchLabelKeys cannot be set when labelSelector isn't set.
3213    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabelKeys")]
3214#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3215    pub match_label_keys: Option<Vec<String>>,
3216    /// MismatchLabelKeys is a set of pod label keys to select which pods will
3217    /// be taken into consideration. The keys are used to lookup values from the
3218    /// incoming pod labels, those key-value labels are merged with `labelSelector` as `key notin (value)`
3219    /// to select the group of existing pods which pods will be taken into consideration
3220    /// for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming
3221    /// pod labels will be ignored. The default value is empty.
3222    /// The same key is forbidden to exist in both mismatchLabelKeys and labelSelector.
3223    /// Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
3224    #[serde(default, skip_serializing_if = "Option::is_none", rename = "mismatchLabelKeys")]
3225#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3226    pub mismatch_label_keys: Option<Vec<String>>,
3227    /// A label query over the set of namespaces that the term applies to.
3228    /// The term is applied to the union of the namespaces selected by this field
3229    /// and the ones listed in the namespaces field.
3230    /// null selector and null or empty namespaces list means "this pod's namespace".
3231    /// An empty selector ({}) matches all namespaces.
3232    #[serde(default, skip_serializing_if = "Option::is_none", rename = "namespaceSelector")]
3233#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3234    pub namespace_selector: Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector>,
3235    /// namespaces specifies a static list of namespace names that the term applies to.
3236    /// The term is applied to the union of the namespaces listed in this field
3237    /// and the ones selected by namespaceSelector.
3238    /// null or empty namespaces list and null namespaceSelector means "this pod's namespace".
3239    #[serde(default, skip_serializing_if = "Option::is_none")]
3240#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3241    pub namespaces: Option<Vec<String>>,
3242    /// This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching
3243    /// the labelSelector in the specified namespaces, where co-located is defined as running on a node
3244    /// whose value of the label with key topologyKey matches that of any node on which any of the
3245    /// selected pods is running.
3246    /// Empty topologyKey is not allowed.
3247    #[serde(rename = "topologyKey")]
3248    pub topology_key: String,
3249}
3250
3251/// A label query over a set of resources, in this case pods.
3252/// If it's null, this PodAffinityTerm matches with no Pods.
3253#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3254#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3255#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3256pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector {
3257    /// matchExpressions is a list of label selector requirements. The requirements are ANDed.
3258    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
3259#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3260    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions>>,
3261    /// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
3262    /// map is equivalent to an element of matchExpressions, whose key field is "key", the
3263    /// operator is "In", and the values array contains only "value". The requirements are ANDed.
3264    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabels")]
3265#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3266    pub match_labels: Option<BTreeMap<String, String>>,
3267}
3268
3269/// A label selector requirement is a selector that contains values, a key, and an operator that
3270/// relates the key and values.
3271#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3272#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3273#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3274pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions
3275{
3276    /// key is the label key that the selector applies to.
3277    pub key: String,
3278    /// operator represents a key's relationship to a set of values.
3279    /// Valid operators are In, NotIn, Exists and DoesNotExist.
3280    pub operator: String,
3281    /// values is an array of string values. If the operator is In or NotIn,
3282    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
3283    /// the values array must be empty. This array is replaced during a strategic
3284    /// merge patch.
3285    #[serde(default, skip_serializing_if = "Option::is_none")]
3286    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3287    pub values: Option<Vec<String>>,
3288}
3289
3290/// A label query over the set of namespaces that the term applies to.
3291/// The term is applied to the union of the namespaces selected by this field
3292/// and the ones listed in the namespaces field.
3293/// null selector and null or empty namespaces list means "this pod's namespace".
3294/// An empty selector ({}) matches all namespaces.
3295#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3296#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3297#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3298pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector {
3299    /// matchExpressions is a list of label selector requirements. The requirements are ANDed.
3300    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
3301#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3302    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions>>,
3303    /// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
3304    /// map is equivalent to an element of matchExpressions, whose key field is "key", the
3305    /// operator is "In", and the values array contains only "value". The requirements are ANDed.
3306    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabels")]
3307#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3308    pub match_labels: Option<BTreeMap<String, String>>,
3309}
3310
3311/// A label selector requirement is a selector that contains values, a key, and an operator that
3312/// relates the key and values.
3313#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3314#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3315#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3316pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions
3317{
3318    /// key is the label key that the selector applies to.
3319    pub key: String,
3320    /// operator represents a key's relationship to a set of values.
3321    /// Valid operators are In, NotIn, Exists and DoesNotExist.
3322    pub operator: String,
3323    /// values is an array of string values. If the operator is In or NotIn,
3324    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
3325    /// the values array must be empty. This array is replaced during a strategic
3326    /// merge patch.
3327    #[serde(default, skip_serializing_if = "Option::is_none")]
3328    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3329    pub values: Option<Vec<String>>,
3330}
3331
3332/// Defines a set of pods (namely those matching the labelSelector
3333/// relative to the given namespace(s)) that this pod should be
3334/// co-located (affinity) or not co-located (anti-affinity) with,
3335/// where co-located is defined as running on a node whose value of
3336/// the label with key <topologyKey> matches that of any node on which
3337/// a pod of the set of pods is running
3338#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3339#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3340#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3341pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecution {
3342    /// A label query over a set of resources, in this case pods.
3343    /// If it's null, this PodAffinityTerm matches with no Pods.
3344    #[serde(default, skip_serializing_if = "Option::is_none", rename = "labelSelector")]
3345#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3346    pub label_selector: Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector>,
3347    /// MatchLabelKeys is a set of pod label keys to select which pods will
3348    /// be taken into consideration. The keys are used to lookup values from the
3349    /// incoming pod labels, those key-value labels are merged with `labelSelector` as `key in (value)`
3350    /// to select the group of existing pods which pods will be taken into consideration
3351    /// for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming
3352    /// pod labels will be ignored. The default value is empty.
3353    /// The same key is forbidden to exist in both matchLabelKeys and labelSelector.
3354    /// Also, matchLabelKeys cannot be set when labelSelector isn't set.
3355    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabelKeys")]
3356#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3357    pub match_label_keys: Option<Vec<String>>,
3358    /// MismatchLabelKeys is a set of pod label keys to select which pods will
3359    /// be taken into consideration. The keys are used to lookup values from the
3360    /// incoming pod labels, those key-value labels are merged with `labelSelector` as `key notin (value)`
3361    /// to select the group of existing pods which pods will be taken into consideration
3362    /// for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming
3363    /// pod labels will be ignored. The default value is empty.
3364    /// The same key is forbidden to exist in both mismatchLabelKeys and labelSelector.
3365    /// Also, mismatchLabelKeys cannot be set when labelSelector isn't set.
3366    #[serde(default, skip_serializing_if = "Option::is_none", rename = "mismatchLabelKeys")]
3367#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3368    pub mismatch_label_keys: Option<Vec<String>>,
3369    /// A label query over the set of namespaces that the term applies to.
3370    /// The term is applied to the union of the namespaces selected by this field
3371    /// and the ones listed in the namespaces field.
3372    /// null selector and null or empty namespaces list means "this pod's namespace".
3373    /// An empty selector ({}) matches all namespaces.
3374    #[serde(default, skip_serializing_if = "Option::is_none", rename = "namespaceSelector")]
3375#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3376    pub namespace_selector: Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector>,
3377    /// namespaces specifies a static list of namespace names that the term applies to.
3378    /// The term is applied to the union of the namespaces listed in this field
3379    /// and the ones selected by namespaceSelector.
3380    /// null or empty namespaces list and null namespaceSelector means "this pod's namespace".
3381    #[serde(default, skip_serializing_if = "Option::is_none")]
3382#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3383    pub namespaces: Option<Vec<String>>,
3384    /// This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching
3385    /// the labelSelector in the specified namespaces, where co-located is defined as running on a node
3386    /// whose value of the label with key topologyKey matches that of any node on which any of the
3387    /// selected pods is running.
3388    /// Empty topologyKey is not allowed.
3389    #[serde(rename = "topologyKey")]
3390    pub topology_key: String,
3391}
3392
3393/// A label query over a set of resources, in this case pods.
3394/// If it's null, this PodAffinityTerm matches with no Pods.
3395#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3396#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3397#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3398pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector {
3399    /// matchExpressions is a list of label selector requirements. The requirements are ANDed.
3400    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
3401#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3402    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions>>,
3403    /// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
3404    /// map is equivalent to an element of matchExpressions, whose key field is "key", the
3405    /// operator is "In", and the values array contains only "value". The requirements are ANDed.
3406    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabels")]
3407#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3408    pub match_labels: Option<BTreeMap<String, String>>,
3409}
3410
3411/// A label selector requirement is a selector that contains values, a key, and an operator that
3412/// relates the key and values.
3413#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3414#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3415#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3416pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions
3417{
3418    /// key is the label key that the selector applies to.
3419    pub key: String,
3420    /// operator represents a key's relationship to a set of values.
3421    /// Valid operators are In, NotIn, Exists and DoesNotExist.
3422    pub operator: String,
3423    /// values is an array of string values. If the operator is In or NotIn,
3424    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
3425    /// the values array must be empty. This array is replaced during a strategic
3426    /// merge patch.
3427    #[serde(default, skip_serializing_if = "Option::is_none")]
3428    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3429    pub values: Option<Vec<String>>,
3430}
3431
3432/// A label query over the set of namespaces that the term applies to.
3433/// The term is applied to the union of the namespaces selected by this field
3434/// and the ones listed in the namespaces field.
3435/// null selector and null or empty namespaces list means "this pod's namespace".
3436/// An empty selector ({}) matches all namespaces.
3437#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3438#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3439#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3440pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector {
3441    /// matchExpressions is a list of label selector requirements. The requirements are ANDed.
3442    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchExpressions")]
3443#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3444    pub match_expressions: Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions>>,
3445    /// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
3446    /// map is equivalent to an element of matchExpressions, whose key field is "key", the
3447    /// operator is "In", and the values array contains only "value". The requirements are ANDed.
3448    #[serde(default, skip_serializing_if = "Option::is_none", rename = "matchLabels")]
3449#[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3450    pub match_labels: Option<BTreeMap<String, String>>,
3451}
3452
3453/// A label selector requirement is a selector that contains values, a key, and an operator that
3454/// relates the key and values.
3455#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3456#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3457#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3458pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions
3459{
3460    /// key is the label key that the selector applies to.
3461    pub key: String,
3462    /// operator represents a key's relationship to a set of values.
3463    /// Valid operators are In, NotIn, Exists and DoesNotExist.
3464    pub operator: String,
3465    /// values is an array of string values. If the operator is In or NotIn,
3466    /// the values array must be non-empty. If the operator is Exists or DoesNotExist,
3467    /// the values array must be empty. This array is replaced during a strategic
3468    /// merge patch.
3469    #[serde(default, skip_serializing_if = "Option::is_none")]
3470    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3471    pub values: Option<Vec<String>>,
3472}
3473
3474/// LocalObjectReference contains enough information to let you locate the
3475/// referenced object inside the same namespace.
3476#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3477#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3478#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3479pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecImagePullSecrets {
3480    /// Name of the referent.
3481    /// This field is effectively required, but due to backwards compatibility is
3482    /// allowed to be empty. Instances of this type with an empty value here are
3483    /// almost certainly wrong.
3484    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
3485    #[serde(default, skip_serializing_if = "Option::is_none")]
3486    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3487    pub name: Option<String>,
3488}
3489
3490/// If specified, the pod's resource requirements.
3491/// These values override the global resource configuration flags.
3492/// Note that when only specifying resource limits, ensure they are greater than or equal
3493/// to the corresponding global resource requests configured via controller flags
3494/// (--acme-http01-solver-resource-request-cpu, --acme-http01-solver-resource-request-memory).
3495/// Kubernetes will reject pod creation if limits are lower than requests, causing challenge failures.
3496#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3497#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3498#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3499pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecResources {
3500    /// Limits describes the maximum amount of compute resources allowed.
3501    /// More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
3502    #[serde(default, skip_serializing_if = "Option::is_none")]
3503    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3504    pub limits: Option<BTreeMap<String, IntOrString>>,
3505    /// Requests describes the minimum amount of compute resources required.
3506    /// If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,
3507    /// otherwise to the global values configured via controller flags. Requests cannot exceed Limits.
3508    /// More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
3509    #[serde(default, skip_serializing_if = "Option::is_none")]
3510    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3511    pub requests: Option<BTreeMap<String, IntOrString>>,
3512}
3513
3514/// If specified, the pod's security context
3515#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3516#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3517#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3518pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecSecurityContext {
3519    /// A special supplemental group that applies to all containers in a pod.
3520    /// Some volume types allow the Kubelet to change the ownership of that volume
3521    /// to be owned by the pod:
3522    ///
3523    /// 1. The owning GID will be the FSGroup
3524    /// 2. The setgid bit is set (new files created in the volume will be owned by FSGroup)
3525    /// 3. The permission bits are OR'd with rw-rw----
3526    ///
3527    /// If unset, the Kubelet will not modify the ownership and permissions of any volume.
3528    /// Note that this field cannot be set when spec.os.name is windows.
3529    #[serde(default, skip_serializing_if = "Option::is_none", rename = "fsGroup")]
3530    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3531    pub fs_group: Option<i64>,
3532    /// fsGroupChangePolicy defines behavior of changing ownership and permission of the volume
3533    /// before being exposed inside Pod. This field will only apply to
3534    /// volume types which support fsGroup based ownership(and permissions).
3535    /// It will have no effect on ephemeral volume types such as: secret, configmaps
3536    /// and emptydir.
3537    /// Valid values are "OnRootMismatch" and "Always". If not specified, "Always" is used.
3538    /// Note that this field cannot be set when spec.os.name is windows.
3539    #[serde(
3540        default,
3541        skip_serializing_if = "Option::is_none",
3542        rename = "fsGroupChangePolicy"
3543    )]
3544    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3545    pub fs_group_change_policy: Option<String>,
3546    /// The GID to run the entrypoint of the container process.
3547    /// Uses runtime default if unset.
3548    /// May also be set in SecurityContext.  If set in both SecurityContext and
3549    /// PodSecurityContext, the value specified in SecurityContext takes precedence
3550    /// for that container.
3551    /// Note that this field cannot be set when spec.os.name is windows.
3552    #[serde(
3553        default,
3554        skip_serializing_if = "Option::is_none",
3555        rename = "runAsGroup"
3556    )]
3557    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3558    pub run_as_group: Option<i64>,
3559    /// Indicates that the container must run as a non-root user.
3560    /// If true, the Kubelet will validate the image at runtime to ensure that it
3561    /// does not run as UID 0 (root) and fail to start the container if it does.
3562    /// If unset or false, no such validation will be performed.
3563    /// May also be set in SecurityContext.  If set in both SecurityContext and
3564    /// PodSecurityContext, the value specified in SecurityContext takes precedence.
3565    #[serde(
3566        default,
3567        skip_serializing_if = "Option::is_none",
3568        rename = "runAsNonRoot"
3569    )]
3570    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3571    pub run_as_non_root: Option<bool>,
3572    /// The UID to run the entrypoint of the container process.
3573    /// Defaults to user specified in image metadata if unspecified.
3574    /// May also be set in SecurityContext.  If set in both SecurityContext and
3575    /// PodSecurityContext, the value specified in SecurityContext takes precedence
3576    /// for that container.
3577    /// Note that this field cannot be set when spec.os.name is windows.
3578    #[serde(default, skip_serializing_if = "Option::is_none", rename = "runAsUser")]
3579    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3580    pub run_as_user: Option<i64>,
3581    /// The SELinux context to be applied to all containers.
3582    /// If unspecified, the container runtime will allocate a random SELinux context for each
3583    /// container.  May also be set in SecurityContext.  If set in
3584    /// both SecurityContext and PodSecurityContext, the value specified in SecurityContext
3585    /// takes precedence for that container.
3586    /// Note that this field cannot be set when spec.os.name is windows.
3587    #[serde(
3588        default,
3589        skip_serializing_if = "Option::is_none",
3590        rename = "seLinuxOptions"
3591    )]
3592    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3593    pub se_linux_options:
3594        Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecSecurityContextSeLinuxOptions>,
3595    /// The seccomp options to use by the containers in this pod.
3596    /// Note that this field cannot be set when spec.os.name is windows.
3597    #[serde(
3598        default,
3599        skip_serializing_if = "Option::is_none",
3600        rename = "seccompProfile"
3601    )]
3602    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3603    pub seccomp_profile:
3604        Option<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecSecurityContextSeccompProfile>,
3605    /// A list of groups applied to the first process run in each container, in addition
3606    /// to the container's primary GID, the fsGroup (if specified), and group memberships
3607    /// defined in the container image for the uid of the container process. If unspecified,
3608    /// no additional groups are added to any container. Note that group memberships
3609    /// defined in the container image for the uid of the container process are still effective,
3610    /// even if they are not included in this list.
3611    /// Note that this field cannot be set when spec.os.name is windows.
3612    #[serde(
3613        default,
3614        skip_serializing_if = "Option::is_none",
3615        rename = "supplementalGroups"
3616    )]
3617    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3618    pub supplemental_groups: Option<Vec<i64>>,
3619    /// Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported
3620    /// sysctls (by the container runtime) might fail to launch.
3621    /// Note that this field cannot be set when spec.os.name is windows.
3622    #[serde(default, skip_serializing_if = "Option::is_none")]
3623    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3624    pub sysctls:
3625        Option<Vec<ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecSecurityContextSysctls>>,
3626}
3627
3628/// The SELinux context to be applied to all containers.
3629/// If unspecified, the container runtime will allocate a random SELinux context for each
3630/// container.  May also be set in SecurityContext.  If set in
3631/// both SecurityContext and PodSecurityContext, the value specified in SecurityContext
3632/// takes precedence for that container.
3633/// Note that this field cannot be set when spec.os.name is windows.
3634#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3635#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3636#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3637pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecSecurityContextSeLinuxOptions {
3638    /// Level is SELinux level label that applies to the container.
3639    #[serde(default, skip_serializing_if = "Option::is_none")]
3640    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3641    pub level: Option<String>,
3642    /// Role is a SELinux role label that applies to the container.
3643    #[serde(default, skip_serializing_if = "Option::is_none")]
3644    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3645    pub role: Option<String>,
3646    /// Type is a SELinux type label that applies to the container.
3647    #[serde(default, skip_serializing_if = "Option::is_none", rename = "type")]
3648    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3649    pub r#type: Option<String>,
3650    /// User is a SELinux user label that applies to the container.
3651    #[serde(default, skip_serializing_if = "Option::is_none")]
3652    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3653    pub user: Option<String>,
3654}
3655
3656/// The seccomp options to use by the containers in this pod.
3657/// Note that this field cannot be set when spec.os.name is windows.
3658#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3659#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3660#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3661pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecSecurityContextSeccompProfile {
3662    /// localhostProfile indicates a profile defined in a file on the node should be used.
3663    /// The profile must be preconfigured on the node to work.
3664    /// Must be a descending path, relative to the kubelet's configured seccomp profile location.
3665    /// Must be set if type is "Localhost". Must NOT be set for any other type.
3666    #[serde(
3667        default,
3668        skip_serializing_if = "Option::is_none",
3669        rename = "localhostProfile"
3670    )]
3671    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3672    pub localhost_profile: Option<String>,
3673    /// type indicates which kind of seccomp profile will be applied.
3674    /// Valid options are:
3675    ///
3676    /// Localhost - a profile defined in a file on the node should be used.
3677    /// RuntimeDefault - the container runtime default profile should be used.
3678    /// Unconfined - no profile should be applied.
3679    #[serde(rename = "type")]
3680    pub r#type: String,
3681}
3682
3683/// Sysctl defines a kernel parameter to be set
3684#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3685#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3686#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3687pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecSecurityContextSysctls {
3688    /// Name of a property to set
3689    pub name: String,
3690    /// Value of a property to set
3691    pub value: String,
3692}
3693
3694/// The pod this Toleration is attached to tolerates any taint that matches
3695/// the triple <key,value,effect> using the matching operator <operator>.
3696#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3697#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3698#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3699pub struct ClusterIssuerAcmeSolversHttp01IngressPodTemplateSpecTolerations {
3700    /// Effect indicates the taint effect to match. Empty means match all taint effects.
3701    /// When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.
3702    #[serde(default, skip_serializing_if = "Option::is_none")]
3703    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3704    pub effect: Option<String>,
3705    /// Key is the taint key that the toleration applies to. Empty means match all taint keys.
3706    /// If the key is empty, operator must be Exists; this combination means to match all values and all keys.
3707    #[serde(default, skip_serializing_if = "Option::is_none")]
3708    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3709    pub key: Option<String>,
3710    /// Operator represents a key's relationship to the value.
3711    /// Valid operators are Exists and Equal. Defaults to Equal.
3712    /// Exists is equivalent to wildcard for value, so that a pod can
3713    /// tolerate all taints of a particular category.
3714    #[serde(default, skip_serializing_if = "Option::is_none")]
3715    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3716    pub operator: Option<String>,
3717    /// TolerationSeconds represents the period of time the toleration (which must be
3718    /// of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,
3719    /// it is not set, which means tolerate the taint forever (do not evict). Zero and
3720    /// negative values will be treated as 0 (evict immediately) by the system.
3721    #[serde(
3722        default,
3723        skip_serializing_if = "Option::is_none",
3724        rename = "tolerationSeconds"
3725    )]
3726    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3727    pub toleration_seconds: Option<i64>,
3728    /// Value is the taint value the toleration matches to.
3729    /// If the operator is Exists, the value should be empty, otherwise just a regular string.
3730    #[serde(default, skip_serializing_if = "Option::is_none")]
3731    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3732    pub value: Option<String>,
3733}
3734
3735/// Selector selects a set of DNSNames on the Certificate resource that
3736/// should be solved using this challenge solver.
3737/// If not specified, the solver will be treated as the 'default' solver
3738/// with the lowest priority, i.e. if any other solver has a more specific
3739/// match, it will be used instead.
3740#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3741#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3742#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3743pub struct ClusterIssuerAcmeSolversSelector {
3744    /// List of DNSNames that this solver will be used to solve.
3745    /// If specified and a match is found, a dnsNames selector will take
3746    /// precedence over a dnsZones selector.
3747    /// If multiple solvers match with the same dnsNames value, the solver
3748    /// with the most matching labels in matchLabels will be selected.
3749    /// If neither has more matches, the solver defined earlier in the list
3750    /// will be selected.
3751    #[serde(default, skip_serializing_if = "Option::is_none", rename = "dnsNames")]
3752    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3753    pub dns_names: Option<Vec<String>>,
3754    /// List of DNSZones that this solver will be used to solve.
3755    /// The most specific DNS zone match specified here will take precedence
3756    /// over other DNS zone matches, so a solver specifying sys.example.com
3757    /// will be selected over one specifying example.com for the domain
3758    /// www.sys.example.com.
3759    /// If multiple solvers match with the same dnsZones value, the solver
3760    /// with the most matching labels in matchLabels will be selected.
3761    /// If neither has more matches, the solver defined earlier in the list
3762    /// will be selected.
3763    #[serde(default, skip_serializing_if = "Option::is_none", rename = "dnsZones")]
3764    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3765    pub dns_zones: Option<Vec<String>>,
3766    /// A label selector that is used to refine the set of certificate's that
3767    /// this challenge solver will apply to.
3768    #[serde(
3769        default,
3770        skip_serializing_if = "Option::is_none",
3771        rename = "matchLabels"
3772    )]
3773    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3774    pub match_labels: Option<BTreeMap<String, String>>,
3775}
3776
3777/// CA configures this issuer to sign certificates using a signing CA keypair
3778/// stored in a Secret resource.
3779/// This is used to build internal PKIs that are managed by cert-manager.
3780#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3781#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3782#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3783pub struct ClusterIssuerCa {
3784    /// The CRL distribution points is an X.509 v3 certificate extension which identifies
3785    /// the location of the CRL from which the revocation of this certificate can be checked.
3786    /// If not set, certificates will be issued without distribution points set.
3787    #[serde(
3788        default,
3789        skip_serializing_if = "Option::is_none",
3790        rename = "crlDistributionPoints"
3791    )]
3792    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3793    pub crl_distribution_points: Option<Vec<String>>,
3794    /// IssuingCertificateURLs is a list of URLs which this issuer should embed into certificates
3795    /// it creates. See https://www.rfc-editor.org/rfc/rfc5280#section-4.2.2.1 for more details.
3796    /// As an example, such a URL might be "http://ca.domain.com/ca.crt".
3797    #[serde(
3798        default,
3799        skip_serializing_if = "Option::is_none",
3800        rename = "issuingCertificateURLs"
3801    )]
3802    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3803    pub issuing_certificate_ur_ls: Option<Vec<String>>,
3804    /// The OCSP server list is an X.509 v3 extension that defines a list of
3805    /// URLs of OCSP responders. The OCSP responders can be queried for the
3806    /// revocation status of an issued certificate. If not set, the
3807    /// certificate will be issued with no OCSP servers set. For example, an
3808    /// OCSP server URL could be "http://ocsp.int-x3.letsencrypt.org".
3809    #[serde(
3810        default,
3811        skip_serializing_if = "Option::is_none",
3812        rename = "ocspServers"
3813    )]
3814    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3815    pub ocsp_servers: Option<Vec<String>>,
3816    /// SecretName is the name of the secret used to sign Certificates issued
3817    /// by this Issuer.
3818    #[serde(rename = "secretName")]
3819    pub secret_name: String,
3820}
3821
3822/// SelfSigned configures this issuer to 'self sign' certificates using the
3823/// private key used to create the CertificateRequest object.
3824#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3825#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3826#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3827pub struct ClusterIssuerSelfSigned {
3828    /// The CRL distribution points is an X.509 v3 certificate extension which identifies
3829    /// the location of the CRL from which the revocation of this certificate can be checked.
3830    /// If not set certificate will be issued without CDP. Values are strings.
3831    #[serde(
3832        default,
3833        skip_serializing_if = "Option::is_none",
3834        rename = "crlDistributionPoints"
3835    )]
3836    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3837    pub crl_distribution_points: Option<Vec<String>>,
3838}
3839
3840/// Vault configures this issuer to sign certificates using a HashiCorp Vault
3841/// PKI backend.
3842#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3843#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3844#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3845pub struct ClusterIssuerVault {
3846    /// Auth configures how cert-manager authenticates with the Vault server.
3847    pub auth: ClusterIssuerVaultAuth,
3848    /// Base64-encoded bundle of PEM CAs which will be used to validate the certificate
3849    /// chain presented by Vault. Only used if using HTTPS to connect to Vault and
3850    /// ignored for HTTP connections.
3851    /// Mutually exclusive with CABundleSecretRef.
3852    /// If neither CABundle nor CABundleSecretRef are defined, the certificate bundle in
3853    /// the cert-manager controller container is used to validate the TLS connection.
3854    #[serde(default, skip_serializing_if = "Option::is_none", rename = "caBundle")]
3855    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3856    pub ca_bundle: Option<String>,
3857    /// Reference to a Secret containing a bundle of PEM-encoded CAs to use when
3858    /// verifying the certificate chain presented by Vault when using HTTPS.
3859    /// Mutually exclusive with CABundle.
3860    /// If neither CABundle nor CABundleSecretRef are defined, the certificate bundle in
3861    /// the cert-manager controller container is used to validate the TLS connection.
3862    /// If no key for the Secret is specified, cert-manager will default to 'ca.crt'.
3863    #[serde(
3864        default,
3865        skip_serializing_if = "Option::is_none",
3866        rename = "caBundleSecretRef"
3867    )]
3868    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3869    pub ca_bundle_secret_ref: Option<ClusterIssuerVaultCaBundleSecretRef>,
3870    /// Reference to a Secret containing a PEM-encoded Client Certificate to use when the
3871    /// Vault server requires mTLS.
3872    #[serde(
3873        default,
3874        skip_serializing_if = "Option::is_none",
3875        rename = "clientCertSecretRef"
3876    )]
3877    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3878    pub client_cert_secret_ref: Option<ClusterIssuerVaultClientCertSecretRef>,
3879    /// Reference to a Secret containing a PEM-encoded Client Private Key to use when the
3880    /// Vault server requires mTLS.
3881    #[serde(
3882        default,
3883        skip_serializing_if = "Option::is_none",
3884        rename = "clientKeySecretRef"
3885    )]
3886    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3887    pub client_key_secret_ref: Option<ClusterIssuerVaultClientKeySecretRef>,
3888    /// Name of the vault namespace. Namespaces is a set of features within Vault Enterprise that allows Vault environments to support Secure Multi-tenancy. e.g: "ns1"
3889    /// More about namespaces can be found here https://www.vaultproject.io/docs/enterprise/namespaces
3890    #[serde(default, skip_serializing_if = "Option::is_none")]
3891    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3892    pub namespace: Option<String>,
3893    /// Path is the mount path of the Vault PKI backend's `sign` endpoint, e.g:
3894    /// "my_pki_mount/sign/my-role-name".
3895    pub path: String,
3896    /// Server is the connection address for the Vault server, e.g: "https://vault.example.com:8200".
3897    pub server: String,
3898    /// ServerName is used to verify the hostname on the returned certificates
3899    /// by the Vault server.
3900    #[serde(
3901        default,
3902        skip_serializing_if = "Option::is_none",
3903        rename = "serverName"
3904    )]
3905    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3906    pub server_name: Option<String>,
3907}
3908
3909/// Auth configures how cert-manager authenticates with the Vault server.
3910#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3911#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3912#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3913pub struct ClusterIssuerVaultAuth {
3914    /// AppRole authenticates with Vault using the App Role auth mechanism,
3915    /// with the role and secret stored in a Kubernetes Secret resource.
3916    #[serde(default, skip_serializing_if = "Option::is_none", rename = "appRole")]
3917    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3918    pub app_role: Option<ClusterIssuerVaultAuthAppRole>,
3919    /// ClientCertificate authenticates with Vault by presenting a client
3920    /// certificate during the request's TLS handshake.
3921    /// Works only when using HTTPS protocol.
3922    #[serde(
3923        default,
3924        skip_serializing_if = "Option::is_none",
3925        rename = "clientCertificate"
3926    )]
3927    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3928    pub client_certificate: Option<ClusterIssuerVaultAuthClientCertificate>,
3929    /// Kubernetes authenticates with Vault by passing the ServiceAccount
3930    /// token stored in the named Secret resource to the Vault server.
3931    #[serde(default, skip_serializing_if = "Option::is_none")]
3932    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3933    pub kubernetes: Option<ClusterIssuerVaultAuthKubernetes>,
3934    /// TokenSecretRef authenticates with Vault by presenting a token.
3935    #[serde(
3936        default,
3937        skip_serializing_if = "Option::is_none",
3938        rename = "tokenSecretRef"
3939    )]
3940    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3941    pub token_secret_ref: Option<ClusterIssuerVaultAuthTokenSecretRef>,
3942}
3943
3944/// AppRole authenticates with Vault using the App Role auth mechanism,
3945/// with the role and secret stored in a Kubernetes Secret resource.
3946#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3947#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3948#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3949pub struct ClusterIssuerVaultAuthAppRole {
3950    /// Path where the App Role authentication backend is mounted in Vault, e.g:
3951    /// "approle"
3952    pub path: String,
3953    /// RoleID configured in the App Role authentication backend when setting
3954    /// up the authentication backend in Vault.
3955    #[serde(rename = "roleId")]
3956    pub role_id: String,
3957    /// Reference to a key in a Secret that contains the App Role secret used
3958    /// to authenticate with Vault.
3959    /// The `key` field must be specified and denotes which entry within the Secret
3960    /// resource is used as the app role secret.
3961    #[serde(rename = "secretRef")]
3962    pub secret_ref: ClusterIssuerVaultAuthAppRoleSecretRef,
3963}
3964
3965/// Reference to a key in a Secret that contains the App Role secret used
3966/// to authenticate with Vault.
3967/// The `key` field must be specified and denotes which entry within the Secret
3968/// resource is used as the app role secret.
3969#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3970#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3971#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3972pub struct ClusterIssuerVaultAuthAppRoleSecretRef {
3973    /// The key of the entry in the Secret resource's `data` field to be used.
3974    /// Some instances of this field may be defaulted, in others it may be
3975    /// required.
3976    #[serde(default, skip_serializing_if = "Option::is_none")]
3977    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3978    pub key: Option<String>,
3979    /// Name of the resource being referred to.
3980    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
3981    pub name: String,
3982}
3983
3984/// ClientCertificate authenticates with Vault by presenting a client
3985/// certificate during the request's TLS handshake.
3986/// Works only when using HTTPS protocol.
3987#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
3988#[cfg_attr(feature = "builder", derive(TypedBuilder))]
3989#[cfg_attr(feature = "schemars", derive(JsonSchema))]
3990pub struct ClusterIssuerVaultAuthClientCertificate {
3991    /// The Vault mountPath here is the mount path to use when authenticating with
3992    /// Vault. For example, setting a value to `/v1/auth/foo`, will use the path
3993    /// `/v1/auth/foo/login` to authenticate with Vault. If unspecified, the
3994    /// default value "/v1/auth/cert" will be used.
3995    #[serde(default, skip_serializing_if = "Option::is_none", rename = "mountPath")]
3996    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
3997    pub mount_path: Option<String>,
3998    /// Name of the certificate role to authenticate against.
3999    /// If not set, matching any certificate role, if available.
4000    #[serde(default, skip_serializing_if = "Option::is_none")]
4001    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4002    pub name: Option<String>,
4003    /// Reference to Kubernetes Secret of type "kubernetes.io/tls" (hence containing
4004    /// tls.crt and tls.key) used to authenticate to Vault using TLS client
4005    /// authentication.
4006    #[serde(
4007        default,
4008        skip_serializing_if = "Option::is_none",
4009        rename = "secretName"
4010    )]
4011    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4012    pub secret_name: Option<String>,
4013}
4014
4015/// Kubernetes authenticates with Vault by passing the ServiceAccount
4016/// token stored in the named Secret resource to the Vault server.
4017#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
4018#[cfg_attr(feature = "builder", derive(TypedBuilder))]
4019#[cfg_attr(feature = "schemars", derive(JsonSchema))]
4020pub struct ClusterIssuerVaultAuthKubernetes {
4021    /// The Vault mountPath here is the mount path to use when authenticating with
4022    /// Vault. For example, setting a value to `/v1/auth/foo`, will use the path
4023    /// `/v1/auth/foo/login` to authenticate with Vault. If unspecified, the
4024    /// default value "/v1/auth/kubernetes" will be used.
4025    #[serde(default, skip_serializing_if = "Option::is_none", rename = "mountPath")]
4026    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4027    pub mount_path: Option<String>,
4028    /// A required field containing the Vault Role to assume. A Role binds a
4029    /// Kubernetes ServiceAccount with a set of Vault policies.
4030    pub role: String,
4031    /// The required Secret field containing a Kubernetes ServiceAccount JWT used
4032    /// for authenticating with Vault. Use of 'ambient credentials' is not
4033    /// supported.
4034    #[serde(default, skip_serializing_if = "Option::is_none", rename = "secretRef")]
4035    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4036    pub secret_ref: Option<ClusterIssuerVaultAuthKubernetesSecretRef>,
4037    /// A reference to a service account that will be used to request a bound
4038    /// token (also known as "projected token"). Compared to using "secretRef",
4039    /// using this field means that you don't rely on statically bound tokens. To
4040    /// use this field, you must configure an RBAC rule to let cert-manager
4041    /// request a token.
4042    #[serde(
4043        default,
4044        skip_serializing_if = "Option::is_none",
4045        rename = "serviceAccountRef"
4046    )]
4047    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4048    pub service_account_ref: Option<ClusterIssuerVaultAuthKubernetesServiceAccountRef>,
4049}
4050
4051/// The required Secret field containing a Kubernetes ServiceAccount JWT used
4052/// for authenticating with Vault. Use of 'ambient credentials' is not
4053/// supported.
4054#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
4055#[cfg_attr(feature = "builder", derive(TypedBuilder))]
4056#[cfg_attr(feature = "schemars", derive(JsonSchema))]
4057pub struct ClusterIssuerVaultAuthKubernetesSecretRef {
4058    /// The key of the entry in the Secret resource's `data` field to be used.
4059    /// Some instances of this field may be defaulted, in others it may be
4060    /// required.
4061    #[serde(default, skip_serializing_if = "Option::is_none")]
4062    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4063    pub key: Option<String>,
4064    /// Name of the resource being referred to.
4065    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
4066    pub name: String,
4067}
4068
4069/// A reference to a service account that will be used to request a bound
4070/// token (also known as "projected token"). Compared to using "secretRef",
4071/// using this field means that you don't rely on statically bound tokens. To
4072/// use this field, you must configure an RBAC rule to let cert-manager
4073/// request a token.
4074#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
4075#[cfg_attr(feature = "builder", derive(TypedBuilder))]
4076#[cfg_attr(feature = "schemars", derive(JsonSchema))]
4077pub struct ClusterIssuerVaultAuthKubernetesServiceAccountRef {
4078    /// TokenAudiences is an optional list of extra audiences to include in the token passed to Vault. The default token
4079    /// consisting of the issuer's namespace and name is always included.
4080    #[serde(default, skip_serializing_if = "Option::is_none")]
4081    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4082    pub audiences: Option<Vec<String>>,
4083    /// Name of the ServiceAccount used to request a token.
4084    pub name: String,
4085}
4086
4087/// TokenSecretRef authenticates with Vault by presenting a token.
4088#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
4089#[cfg_attr(feature = "builder", derive(TypedBuilder))]
4090#[cfg_attr(feature = "schemars", derive(JsonSchema))]
4091pub struct ClusterIssuerVaultAuthTokenSecretRef {
4092    /// The key of the entry in the Secret resource's `data` field to be used.
4093    /// Some instances of this field may be defaulted, in others it may be
4094    /// required.
4095    #[serde(default, skip_serializing_if = "Option::is_none")]
4096    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4097    pub key: Option<String>,
4098    /// Name of the resource being referred to.
4099    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
4100    pub name: String,
4101}
4102
4103/// Reference to a Secret containing a bundle of PEM-encoded CAs to use when
4104/// verifying the certificate chain presented by Vault when using HTTPS.
4105/// Mutually exclusive with CABundle.
4106/// If neither CABundle nor CABundleSecretRef are defined, the certificate bundle in
4107/// the cert-manager controller container is used to validate the TLS connection.
4108/// If no key for the Secret is specified, cert-manager will default to 'ca.crt'.
4109#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
4110#[cfg_attr(feature = "builder", derive(TypedBuilder))]
4111#[cfg_attr(feature = "schemars", derive(JsonSchema))]
4112pub struct ClusterIssuerVaultCaBundleSecretRef {
4113    /// The key of the entry in the Secret resource's `data` field to be used.
4114    /// Some instances of this field may be defaulted, in others it may be
4115    /// required.
4116    #[serde(default, skip_serializing_if = "Option::is_none")]
4117    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4118    pub key: Option<String>,
4119    /// Name of the resource being referred to.
4120    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
4121    pub name: String,
4122}
4123
4124/// Reference to a Secret containing a PEM-encoded Client Certificate to use when the
4125/// Vault server requires mTLS.
4126#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
4127#[cfg_attr(feature = "builder", derive(TypedBuilder))]
4128#[cfg_attr(feature = "schemars", derive(JsonSchema))]
4129pub struct ClusterIssuerVaultClientCertSecretRef {
4130    /// The key of the entry in the Secret resource's `data` field to be used.
4131    /// Some instances of this field may be defaulted, in others it may be
4132    /// required.
4133    #[serde(default, skip_serializing_if = "Option::is_none")]
4134    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4135    pub key: Option<String>,
4136    /// Name of the resource being referred to.
4137    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
4138    pub name: String,
4139}
4140
4141/// Reference to a Secret containing a PEM-encoded Client Private Key to use when the
4142/// Vault server requires mTLS.
4143#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
4144#[cfg_attr(feature = "builder", derive(TypedBuilder))]
4145#[cfg_attr(feature = "schemars", derive(JsonSchema))]
4146pub struct ClusterIssuerVaultClientKeySecretRef {
4147    /// The key of the entry in the Secret resource's `data` field to be used.
4148    /// Some instances of this field may be defaulted, in others it may be
4149    /// required.
4150    #[serde(default, skip_serializing_if = "Option::is_none")]
4151    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4152    pub key: Option<String>,
4153    /// Name of the resource being referred to.
4154    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
4155    pub name: String,
4156}
4157
4158/// Venafi configures this issuer to sign certificates using a Venafi TPP
4159/// or Venafi Cloud policy zone.
4160#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
4161#[cfg_attr(feature = "builder", derive(TypedBuilder))]
4162#[cfg_attr(feature = "schemars", derive(JsonSchema))]
4163pub struct ClusterIssuerVenafi {
4164    /// Cloud specifies the Venafi cloud configuration settings.
4165    /// Only one of TPP or Cloud may be specified.
4166    #[serde(default, skip_serializing_if = "Option::is_none")]
4167    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4168    pub cloud: Option<ClusterIssuerVenafiCloud>,
4169    /// TPP specifies Trust Protection Platform configuration settings.
4170    /// Only one of TPP or Cloud may be specified.
4171    #[serde(default, skip_serializing_if = "Option::is_none")]
4172    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4173    pub tpp: Option<ClusterIssuerVenafiTpp>,
4174    /// Zone is the Venafi Policy Zone to use for this issuer.
4175    /// All requests made to the Venafi platform will be restricted by the named
4176    /// zone policy.
4177    /// This field is required.
4178    pub zone: String,
4179}
4180
4181/// Cloud specifies the Venafi cloud configuration settings.
4182/// Only one of TPP or Cloud may be specified.
4183#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
4184#[cfg_attr(feature = "builder", derive(TypedBuilder))]
4185#[cfg_attr(feature = "schemars", derive(JsonSchema))]
4186pub struct ClusterIssuerVenafiCloud {
4187    /// APITokenSecretRef is a secret key selector for the Venafi Cloud API token.
4188    #[serde(rename = "apiTokenSecretRef")]
4189    pub api_token_secret_ref: ClusterIssuerVenafiCloudApiTokenSecretRef,
4190    /// URL is the base URL for Venafi Cloud.
4191    /// Defaults to "https://api.venafi.cloud/".
4192    #[serde(default, skip_serializing_if = "Option::is_none")]
4193    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4194    pub url: Option<String>,
4195}
4196
4197/// APITokenSecretRef is a secret key selector for the Venafi Cloud API token.
4198#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
4199#[cfg_attr(feature = "builder", derive(TypedBuilder))]
4200#[cfg_attr(feature = "schemars", derive(JsonSchema))]
4201pub struct ClusterIssuerVenafiCloudApiTokenSecretRef {
4202    /// The key of the entry in the Secret resource's `data` field to be used.
4203    /// Some instances of this field may be defaulted, in others it may be
4204    /// required.
4205    #[serde(default, skip_serializing_if = "Option::is_none")]
4206    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4207    pub key: Option<String>,
4208    /// Name of the resource being referred to.
4209    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
4210    pub name: String,
4211}
4212
4213/// TPP specifies Trust Protection Platform configuration settings.
4214/// Only one of TPP or Cloud may be specified.
4215#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
4216#[cfg_attr(feature = "builder", derive(TypedBuilder))]
4217#[cfg_attr(feature = "schemars", derive(JsonSchema))]
4218pub struct ClusterIssuerVenafiTpp {
4219    /// Base64-encoded bundle of PEM CAs which will be used to validate the certificate
4220    /// chain presented by the TPP server. Only used if using HTTPS; ignored for HTTP.
4221    /// If undefined, the certificate bundle in the cert-manager controller container
4222    /// is used to validate the chain.
4223    #[serde(default, skip_serializing_if = "Option::is_none", rename = "caBundle")]
4224    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4225    pub ca_bundle: Option<String>,
4226    /// Reference to a Secret containing a base64-encoded bundle of PEM CAs
4227    /// which will be used to validate the certificate chain presented by the TPP server.
4228    /// Only used if using HTTPS; ignored for HTTP. Mutually exclusive with CABundle.
4229    /// If neither CABundle nor CABundleSecretRef is defined, the certificate bundle in
4230    /// the cert-manager controller container is used to validate the TLS connection.
4231    #[serde(
4232        default,
4233        skip_serializing_if = "Option::is_none",
4234        rename = "caBundleSecretRef"
4235    )]
4236    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4237    pub ca_bundle_secret_ref: Option<ClusterIssuerVenafiTppCaBundleSecretRef>,
4238    /// CredentialsRef is a reference to a Secret containing the Venafi TPP API credentials.
4239    /// The secret must contain the key 'access-token' for the Access Token Authentication,
4240    /// or two keys, 'username' and 'password' for the API Keys Authentication.
4241    #[serde(rename = "credentialsRef")]
4242    pub credentials_ref: ClusterIssuerVenafiTppCredentialsRef,
4243    /// URL is the base URL for the vedsdk endpoint of the Venafi TPP instance,
4244    /// for example: "https://tpp.example.com/vedsdk".
4245    pub url: String,
4246}
4247
4248/// Reference to a Secret containing a base64-encoded bundle of PEM CAs
4249/// which will be used to validate the certificate chain presented by the TPP server.
4250/// Only used if using HTTPS; ignored for HTTP. Mutually exclusive with CABundle.
4251/// If neither CABundle nor CABundleSecretRef is defined, the certificate bundle in
4252/// the cert-manager controller container is used to validate the TLS connection.
4253#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
4254#[cfg_attr(feature = "builder", derive(TypedBuilder))]
4255#[cfg_attr(feature = "schemars", derive(JsonSchema))]
4256pub struct ClusterIssuerVenafiTppCaBundleSecretRef {
4257    /// The key of the entry in the Secret resource's `data` field to be used.
4258    /// Some instances of this field may be defaulted, in others it may be
4259    /// required.
4260    #[serde(default, skip_serializing_if = "Option::is_none")]
4261    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4262    pub key: Option<String>,
4263    /// Name of the resource being referred to.
4264    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
4265    pub name: String,
4266}
4267
4268/// CredentialsRef is a reference to a Secret containing the Venafi TPP API credentials.
4269/// The secret must contain the key 'access-token' for the Access Token Authentication,
4270/// or two keys, 'username' and 'password' for the API Keys Authentication.
4271#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
4272#[cfg_attr(feature = "builder", derive(TypedBuilder))]
4273#[cfg_attr(feature = "schemars", derive(JsonSchema))]
4274pub struct ClusterIssuerVenafiTppCredentialsRef {
4275    /// Name of the resource being referred to.
4276    /// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
4277    pub name: String,
4278}
4279
4280/// Status of the ClusterIssuer. This is set and managed automatically.
4281#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
4282#[cfg_attr(feature = "builder", derive(TypedBuilder))]
4283#[cfg_attr(feature = "schemars", derive(JsonSchema))]
4284pub struct ClusterIssuerStatus {
4285    /// ACME specific status options.
4286    /// This field should only be set if the Issuer is configured to use an ACME
4287    /// server to issue certificates.
4288    #[serde(default, skip_serializing_if = "Option::is_none")]
4289    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4290    pub acme: Option<ClusterIssuerStatusAcme>,
4291    /// List of status conditions to indicate the status of a CertificateRequest.
4292    /// Known condition types are `Ready`.
4293    #[serde(default, skip_serializing_if = "Option::is_none")]
4294    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4295    pub conditions: Option<Vec<Condition>>,
4296}
4297
4298/// ACME specific status options.
4299/// This field should only be set if the Issuer is configured to use an ACME
4300/// server to issue certificates.
4301#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
4302#[cfg_attr(feature = "builder", derive(TypedBuilder))]
4303#[cfg_attr(feature = "schemars", derive(JsonSchema))]
4304pub struct ClusterIssuerStatusAcme {
4305    /// LastPrivateKeyHash is a hash of the private key associated with the latest
4306    /// registered ACME account, in order to track changes made to registered account
4307    /// associated with the Issuer
4308    #[serde(
4309        default,
4310        skip_serializing_if = "Option::is_none",
4311        rename = "lastPrivateKeyHash"
4312    )]
4313    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4314    pub last_private_key_hash: Option<String>,
4315    /// LastRegisteredEmail is the email associated with the latest registered
4316    /// ACME account, in order to track changes made to registered account
4317    /// associated with the  Issuer
4318    #[serde(
4319        default,
4320        skip_serializing_if = "Option::is_none",
4321        rename = "lastRegisteredEmail"
4322    )]
4323    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4324    pub last_registered_email: Option<String>,
4325    /// URI is the unique account identifier, which can also be used to retrieve
4326    /// account details from the CA
4327    #[serde(default, skip_serializing_if = "Option::is_none")]
4328    #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
4329    pub uri: Option<String>,
4330}