# generated by datamodel-codegen:
#   filename:  certificate_schema.json
#   timestamp: 2025-08-03T16:40:06+00:00

from __future__ import annotations

from datetime import datetime
from enum import Enum
from typing import Any, Optional

from pydantic import BaseModel, Field


class Type(Enum):
    DER = 'DER'
    CombinedPEM = 'CombinedPEM'


class AdditionalOutputFormat(BaseModel):
    type: Type = Field(
        ...,
        description="Type is the name of the format type that should be written to the\nCertificate's target Secret.",
    )


class IssuerRef(BaseModel):
    group: Optional[str] = Field(
        None, description='Group of the resource being referred to.'
    )
    kind: Optional[str] = Field(
        None, description='Kind of the resource being referred to.'
    )
    name: str = Field(..., description='Name of the resource being referred to.')


class PasswordSecretRef(BaseModel):
    key: Optional[str] = Field(
        None,
        description="The key of the entry in the Secret resource's `data` field to be used.\nSome instances of this field may be defaulted, in others it may be\nrequired.",
    )
    name: str = Field(
        ...,
        description='Name of the resource being referred to.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names',
    )


class Jks(BaseModel):
    alias: Optional[str] = Field(
        None,
        description='Alias specifies the alias of the key in the keystore, required by the JKS format.\nIf not provided, the default alias `certificate` will be used.',
    )
    create: bool = Field(
        ...,
        description='Create enables JKS keystore creation for the Certificate.\nIf true, a file named `keystore.jks` will be created in the target\nSecret resource, encrypted using the password stored in\n`passwordSecretRef` or `password`.\nThe keystore file will be updated immediately.\nIf the issuer provided a CA certificate, a file named `truststore.jks`\nwill also be created in the target Secret resource, encrypted using the\npassword stored in `passwordSecretRef`\ncontaining the issuing Certificate Authority',
    )
    password: Optional[str] = Field(
        None,
        description='Password provides a literal password used to encrypt the JKS keystore.\nMutually exclusive with passwordSecretRef.\nOne of password or passwordSecretRef must provide a password with a non-zero length.',
    )
    passwordSecretRef: Optional[PasswordSecretRef] = Field(
        None,
        description='PasswordSecretRef is a reference to a non-empty key in a Secret resource\ncontaining the password used to encrypt the JKS keystore.\nMutually exclusive with password.\nOne of password or passwordSecretRef must provide a password with a non-zero length.',
    )


class Profile(Enum):
    LegacyRC2 = 'LegacyRC2'
    LegacyDES = 'LegacyDES'
    Modern2023 = 'Modern2023'


class Pkcs12(BaseModel):
    create: bool = Field(
        ...,
        description='Create enables PKCS12 keystore creation for the Certificate.\nIf true, a file named `keystore.p12` will be created in the target\nSecret resource, encrypted using the password stored in\n`passwordSecretRef` or in `password`.\nThe keystore file will be updated immediately.\nIf the issuer provided a CA certificate, a file named `truststore.p12` will\nalso be created in the target Secret resource, encrypted using the\npassword stored in `passwordSecretRef` containing the issuing Certificate\nAuthority',
    )
    password: Optional[str] = Field(
        None,
        description='Password provides a literal password used to encrypt the PKCS#12 keystore.\nMutually exclusive with passwordSecretRef.\nOne of password or passwordSecretRef must provide a password with a non-zero length.',
    )
    passwordSecretRef: Optional[PasswordSecretRef] = Field(
        None,
        description='PasswordSecretRef is a reference to a non-empty key in a Secret resource\ncontaining the password used to encrypt the PKCS#12 keystore.\nMutually exclusive with password.\nOne of password or passwordSecretRef must provide a password with a non-zero length.',
    )
    profile: Optional[Profile] = Field(
        None,
        description='Profile specifies the key and certificate encryption algorithms and the HMAC algorithm\nused to create the PKCS12 keystore. Default value is `LegacyRC2` for backward compatibility.\n\nIf provided, allowed values are:\n`LegacyRC2`: Deprecated. Not supported by default in OpenSSL 3 or Java 20.\n`LegacyDES`: Less secure algorithm. Use this option for maximal compatibility.\n`Modern2023`: Secure algorithm. Use this option in case you have to always use secure algorithms\n(e.g., because of company policy). Please note that the security of the algorithm is not that important\nin reality, because the unencrypted certificate and private key are also stored in the Secret.',
    )


class Keystores(BaseModel):
    jks: Optional[Jks] = Field(
        None,
        description='JKS configures options for storing a JKS keystore in the\n`spec.secretName` Secret resource.',
    )
    pkcs12: Optional[Pkcs12] = Field(
        None,
        description='PKCS12 configures options for storing a PKCS12 keystore in the\n`spec.secretName` Secret resource.',
    )


class Excluded(BaseModel):
    dnsDomains: Optional[list[str]] = Field(
        None,
        description='DNSDomains is a list of DNS domains that are permitted or excluded.',
    )
    emailAddresses: Optional[list[str]] = Field(
        None,
        description='EmailAddresses is a list of Email Addresses that are permitted or excluded.',
    )
    ipRanges: Optional[list[str]] = Field(
        None,
        description='IPRanges is a list of IP Ranges that are permitted or excluded.\nThis should be a valid CIDR notation.',
    )
    uriDomains: Optional[list[str]] = Field(
        None,
        description='URIDomains is a list of URI domains that are permitted or excluded.',
    )


class Permitted(BaseModel):
    dnsDomains: Optional[list[str]] = Field(
        None,
        description='DNSDomains is a list of DNS domains that are permitted or excluded.',
    )
    emailAddresses: Optional[list[str]] = Field(
        None,
        description='EmailAddresses is a list of Email Addresses that are permitted or excluded.',
    )
    ipRanges: Optional[list[str]] = Field(
        None,
        description='IPRanges is a list of IP Ranges that are permitted or excluded.\nThis should be a valid CIDR notation.',
    )
    uriDomains: Optional[list[str]] = Field(
        None,
        description='URIDomains is a list of URI domains that are permitted or excluded.',
    )


class NameConstraints(BaseModel):
    critical: Optional[bool] = Field(
        None, description='if true then the name constraints are marked critical.'
    )
    excluded: Optional[Excluded] = Field(
        None,
        description='Excluded contains the constraints which must be disallowed. Any name matching a\nrestriction in the excluded field is invalid regardless\nof information appearing in the permitted',
    )
    permitted: Optional[Permitted] = Field(
        None,
        description='Permitted contains the constraints in which the names must be located.',
    )


class OtherName(BaseModel):
    oid: Optional[str] = Field(
        None,
        description='OID is the object identifier for the otherName SAN.\nThe object identifier must be expressed as a dotted string, for\nexample, "1.2.840.113556.1.4.221".',
    )
    utf8Value: Optional[str] = Field(
        None,
        description='utf8Value is the string value of the otherName SAN.\nThe utf8Value accepts any valid UTF8 string to set as value for the otherName SAN.',
    )


class Algorithm(Enum):
    RSA = 'RSA'
    ECDSA = 'ECDSA'
    Ed25519 = 'Ed25519'


class Encoding(Enum):
    PKCS1 = 'PKCS1'
    PKCS8 = 'PKCS8'


class RotationPolicy(Enum):
    Never = 'Never'
    Always = 'Always'


class PrivateKey(BaseModel):
    algorithm: Optional[Algorithm] = Field(
        None,
        description='Algorithm is the private key algorithm of the corresponding private key\nfor this certificate.\n\nIf provided, allowed values are either `RSA`, `ECDSA` or `Ed25519`.\nIf `algorithm` is specified and `size` is not provided,\nkey size of 2048 will be used for `RSA` key algorithm and\nkey size of 256 will be used for `ECDSA` key algorithm.\nkey size is ignored when using the `Ed25519` key algorithm.',
    )
    encoding: Optional[Encoding] = Field(
        None,
        description="The private key cryptography standards (PKCS) encoding for this\ncertificate's private key to be encoded in.\n\nIf provided, allowed values are `PKCS1` and `PKCS8` standing for PKCS#1\nand PKCS#8, respectively.\nDefaults to `PKCS1` if not specified.",
    )
    rotationPolicy: Optional[RotationPolicy] = Field(
        None,
        description='RotationPolicy controls how private keys should be regenerated when a\nre-issuance is being processed.\n\nIf set to `Never`, a private key will only be generated if one does not\nalready exist in the target `spec.secretName`. If one does exist but it\ndoes not have the correct algorithm or size, a warning will be raised\nto await user intervention.\nIf set to `Always`, a private key matching the specified requirements\nwill be generated whenever a re-issuance occurs.\nDefault is `Always`.\nThe default was changed from `Never` to `Always` in cert-manager >=v1.18.0.\nThe new default can be disabled by setting the\n`--feature-gates=DefaultPrivateKeyRotationPolicyAlways=false` option on\nthe controller component.',
    )
    size: Optional[int] = Field(
        None,
        description='Size is the key bit size of the corresponding private key for this certificate.\n\nIf `algorithm` is set to `RSA`, valid values are `2048`, `4096` or `8192`,\nand will default to `2048` if not specified.\nIf `algorithm` is set to `ECDSA`, valid values are `256`, `384` or `521`,\nand will default to `256` if not specified.\nIf `algorithm` is set to `Ed25519`, Size is ignored.\nNo other values are allowed.',
    )


class SecretTemplate(BaseModel):
    annotations: Optional[dict[str, str]] = Field(
        None,
        description='Annotations is a key value map to be copied to the target Kubernetes Secret.',
    )
    labels: Optional[dict[str, str]] = Field(
        None,
        description='Labels is a key value map to be copied to the target Kubernetes Secret.',
    )


class SignatureAlgorithm(Enum):
    SHA256WithRSA = 'SHA256WithRSA'
    SHA384WithRSA = 'SHA384WithRSA'
    SHA512WithRSA = 'SHA512WithRSA'
    ECDSAWithSHA256 = 'ECDSAWithSHA256'
    ECDSAWithSHA384 = 'ECDSAWithSHA384'
    ECDSAWithSHA512 = 'ECDSAWithSHA512'
    PureEd25519 = 'PureEd25519'


class Subject(BaseModel):
    countries: Optional[list[str]] = Field(
        None, description='Countries to be used on the Certificate.'
    )
    localities: Optional[list[str]] = Field(
        None, description='Cities to be used on the Certificate.'
    )
    organizationalUnits: Optional[list[str]] = Field(
        None, description='Organizational Units to be used on the Certificate.'
    )
    organizations: Optional[list[str]] = Field(
        None, description='Organizations to be used on the Certificate.'
    )
    postalCodes: Optional[list[str]] = Field(
        None, description='Postal codes to be used on the Certificate.'
    )
    provinces: Optional[list[str]] = Field(
        None, description='State/Provinces to be used on the Certificate.'
    )
    serialNumber: Optional[str] = Field(
        None, description='Serial number to be used on the Certificate.'
    )
    streetAddresses: Optional[list[str]] = Field(
        None, description='Street addresses to be used on the Certificate.'
    )


class Usage(Enum):
    signing = 'signing'
    digital_signature = 'digital signature'
    content_commitment = 'content commitment'
    key_encipherment = 'key encipherment'
    key_agreement = 'key agreement'
    data_encipherment = 'data encipherment'
    cert_sign = 'cert sign'
    crl_sign = 'crl sign'
    encipher_only = 'encipher only'
    decipher_only = 'decipher only'
    any = 'any'
    server_auth = 'server auth'
    client_auth = 'client auth'
    code_signing = 'code signing'
    email_protection = 'email protection'
    s_mime = 's/mime'
    ipsec_end_system = 'ipsec end system'
    ipsec_tunnel = 'ipsec tunnel'
    ipsec_user = 'ipsec user'
    timestamping = 'timestamping'
    ocsp_signing = 'ocsp signing'
    microsoft_sgc = 'microsoft sgc'
    netscape_sgc = 'netscape sgc'


class Spec(BaseModel):
    additionalOutputFormats: Optional[list[AdditionalOutputFormat]] = Field(
        None,
        description="Defines extra output formats of the private key and signed certificate chain\nto be written to this Certificate's target Secret.",
    )
    commonName: Optional[str] = Field(
        None,
        description='Requested common name X509 certificate subject attribute.\nMore info: https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.6\nNOTE: TLS clients will ignore this value when any subject alternative name is\nset (see https://tools.ietf.org/html/rfc6125#section-6.4.4).\n\nShould have a length of 64 characters or fewer to avoid generating invalid CSRs.\nCannot be set if the `literalSubject` field is set.',
    )
    dnsNames: Optional[list[str]] = Field(
        None, description='Requested DNS subject alternative names.'
    )
    duration: Optional[str] = Field(
        None,
        description="Requested 'duration' (i.e. lifetime) of the Certificate. Note that the\nissuer may choose to ignore the requested duration, just like any other\nrequested attribute.\n\nIf unset, this defaults to 90 days.\nMinimum accepted duration is 1 hour.\nValue must be in units accepted by Go time.ParseDuration https://golang.org/pkg/time/#ParseDuration.",
    )
    emailAddresses: Optional[list[str]] = Field(
        None, description='Requested email subject alternative names.'
    )
    encodeUsagesInRequest: Optional[bool] = Field(
        None,
        description='Whether the KeyUsage and ExtKeyUsage extensions should be set in the encoded CSR.\n\nThis option defaults to true, and should only be disabled if the target\nissuer does not support CSRs with these X509 KeyUsage/ ExtKeyUsage extensions.',
    )
    ipAddresses: Optional[list[str]] = Field(
        None, description='Requested IP address subject alternative names.'
    )
    isCA: Optional[bool] = Field(
        None,
        description='Requested basic constraints isCA value.\nThe isCA value is used to set the `isCA` field on the created CertificateRequest\nresources. Note that the issuer may choose to ignore the requested isCA value, just\nlike any other requested attribute.\n\nIf true, this will automatically add the `cert sign` usage to the list\nof requested `usages`.',
    )
    issuerRef: IssuerRef = Field(
        ...,
        description='Reference to the issuer responsible for issuing the certificate.\nIf the issuer is namespace-scoped, it must be in the same namespace\nas the Certificate. If the issuer is cluster-scoped, it can be used\nfrom any namespace.\n\nThe `name` field of the reference must always be specified.',
    )
    keystores: Optional[Keystores] = Field(
        None,
        description="Additional keystore output formats to be stored in the Certificate's Secret.",
    )
    literalSubject: Optional[str] = Field(
        None,
        description='Requested X.509 certificate subject, represented using the LDAP "String\nRepresentation of a Distinguished Name" [1].\nImportant: the LDAP string format also specifies the order of the attributes\nin the subject, this is important when issuing certs for LDAP authentication.\nExample: `CN=foo,DC=corp,DC=example,DC=com`\nMore info [1]: https://datatracker.ietf.org/doc/html/rfc4514\nMore info: https://github.com/cert-manager/cert-manager/issues/3203\nMore info: https://github.com/cert-manager/cert-manager/issues/4424\n\nCannot be set if the `subject` or `commonName` field is set.',
    )
    nameConstraints: Optional[NameConstraints] = Field(
        None,
        description='x.509 certificate NameConstraint extension which MUST NOT be used in a non-CA certificate.\nMore Info: https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.10\n\nThis is an Alpha Feature and is only enabled with the\n`--feature-gates=NameConstraints=true` option set on both\nthe controller and webhook components.',
    )
    otherNames: Optional[list[OtherName]] = Field(
        None,
        description='`otherNames` is an escape hatch for SAN that allows any type. We currently restrict the support to string like otherNames, cf RFC 5280 p 37\nAny UTF8 String valued otherName can be passed with by setting the keys oid: x.x.x.x and UTF8Value: somevalue for `otherName`.\nMost commonly this would be UPN set with oid: 1.3.6.1.4.1.311.20.2.3\nYou should ensure that any OID passed is valid for the UTF8String type as we do not explicitly validate this.',
    )
    privateKey: Optional[PrivateKey] = Field(
        None,
        description='Private key options. These include the key algorithm and size, the used\nencoding and the rotation policy.',
    )
    renewBefore: Optional[str] = Field(
        None,
        description="How long before the currently issued certificate's expiry cert-manager should\nrenew the certificate. For example, if a certificate is valid for 60 minutes,\nand `renewBefore=10m`, cert-manager will begin to attempt to renew the certificate\n50 minutes after it was issued (i.e. when there are 10 minutes remaining until\nthe certificate is no longer valid).\n\nNOTE: The actual lifetime of the issued certificate is used to determine the\nrenewal time. If an issuer returns a certificate with a different lifetime than\nthe one requested, cert-manager will use the lifetime of the issued certificate.\n\nIf unset, this defaults to 1/3 of the issued certificate's lifetime.\nMinimum accepted value is 5 minutes.\nValue must be in units accepted by Go time.ParseDuration https://golang.org/pkg/time/#ParseDuration.\nCannot be set if the `renewBeforePercentage` field is set.",
    )
    renewBeforePercentage: Optional[int] = Field(
        None,
        description='`renewBeforePercentage` is like `renewBefore`, except it is a relative percentage\nrather than an absolute duration. For example, if a certificate is valid for 60\nminutes, and  `renewBeforePercentage=25`, cert-manager will begin to attempt to\nrenew the certificate 45 minutes after it was issued (i.e. when there are 15\nminutes (25%) remaining until the certificate is no longer valid).\n\nNOTE: The actual lifetime of the issued certificate is used to determine the\nrenewal time. If an issuer returns a certificate with a different lifetime than\nthe one requested, cert-manager will use the lifetime of the issued certificate.\n\nValue must be an integer in the range (0,100). The minimum effective\n`renewBefore` derived from the `renewBeforePercentage` and `duration` fields is 5\nminutes.\nCannot be set if the `renewBefore` field is set.',
    )
    revisionHistoryLimit: Optional[int] = Field(
        None,
        description="The maximum number of CertificateRequest revisions that are maintained in\nthe Certificate's history. Each revision represents a single `CertificateRequest`\ncreated by this Certificate, either when it was created, renewed, or Spec\nwas changed. Revisions will be removed by oldest first if the number of\nrevisions exceeds this number.\n\nIf set, revisionHistoryLimit must be a value of `1` or greater.\nDefault value is `1`.",
    )
    secretName: str = Field(
        ...,
        description='Name of the Secret resource that will be automatically created and\nmanaged by this Certificate resource. It will be populated with a\nprivate key and certificate, signed by the denoted issuer. The Secret\nresource lives in the same namespace as the Certificate resource.',
    )
    secretTemplate: Optional[SecretTemplate] = Field(
        None,
        description="Defines annotations and labels to be copied to the Certificate's Secret.\nLabels and annotations on the Secret will be changed as they appear on the\nSecretTemplate when added or removed. SecretTemplate annotations are added\nin conjunction with, and cannot overwrite, the base set of annotations\ncert-manager sets on the Certificate's Secret.",
    )
    signatureAlgorithm: Optional[SignatureAlgorithm] = Field(
        None,
        description='Signature algorithm to use.\nAllowed values for RSA keys: SHA256WithRSA, SHA384WithRSA, SHA512WithRSA.\nAllowed values for ECDSA keys: ECDSAWithSHA256, ECDSAWithSHA384, ECDSAWithSHA512.\nAllowed values for Ed25519 keys: PureEd25519.',
    )
    subject: Optional[Subject] = Field(
        None,
        description='Requested set of X509 certificate subject attributes.\nMore info: https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.6\n\nThe common name attribute is specified separately in the `commonName` field.\nCannot be set if the `literalSubject` field is set.',
    )
    uris: Optional[list[str]] = Field(
        None, description='Requested URI subject alternative names.'
    )
    usages: Optional[list[Usage]] = Field(
        None,
        description='Requested key usages and extended key usages.\nThese usages are used to set the `usages` field on the created CertificateRequest\nresources. If `encodeUsagesInRequest` is unset or set to `true`, the usages\nwill additionally be encoded in the `request` field which contains the CSR blob.\n\nIf unset, defaults to `digital signature` and `key encipherment`.',
    )


class Status1(Enum):
    True_ = 'True'
    False_ = 'False'
    Unknown = 'Unknown'


class Condition(BaseModel):
    lastTransitionTime: Optional[datetime] = Field(
        None,
        description='LastTransitionTime is the timestamp corresponding to the last status\nchange of this condition.',
    )
    message: Optional[str] = Field(
        None,
        description='Message is a human readable description of the details of the last\ntransition, complementing reason.',
    )
    observedGeneration: Optional[int] = Field(
        None,
        description='If set, this represents the .metadata.generation that the condition was\nset based upon.\nFor instance, if .metadata.generation is currently 12, but the\n.status.condition[x].observedGeneration is 9, the condition is out of date\nwith respect to the current state of the Certificate.',
    )
    reason: Optional[str] = Field(
        None,
        description="Reason is a brief machine readable explanation for the condition's last\ntransition.",
    )
    status: Status1 = Field(
        ..., description='Status of the condition, one of (`True`, `False`, `Unknown`).'
    )
    type: str = Field(
        ..., description='Type of the condition, known values are (`Ready`, `Issuing`).'
    )


class Status(BaseModel):
    conditions: Optional[list[Condition]] = Field(
        None,
        description='List of status conditions to indicate the status of certificates.\nKnown condition types are `Ready` and `Issuing`.',
    )
    failedIssuanceAttempts: Optional[int] = Field(
        None,
        description='The number of continuous failed issuance attempts up till now. This\nfield gets removed (if set) on a successful issuance and gets set to\n1 if unset and an issuance has failed. If an issuance has failed, the\ndelay till the next issuance will be calculated using formula\ntime.Hour * 2 ^ (failedIssuanceAttempts - 1).',
    )
    lastFailureTime: Optional[datetime] = Field(
        None,
        description='LastFailureTime is set only if the latest issuance for this\nCertificate failed and contains the time of the failure. If an\nissuance has failed, the delay till the next issuance will be\ncalculated using formula time.Hour * 2 ^ (failedIssuanceAttempts -\n1). If the latest issuance has succeeded this field will be unset.',
    )
    nextPrivateKeySecretName: Optional[str] = Field(
        None,
        description='The name of the Secret resource containing the private key to be used\nfor the next certificate iteration.\nThe keymanager controller will automatically set this field if the\n`Issuing` condition is set to `True`.\nIt will automatically unset this field when the Issuing condition is\nnot set or False.',
    )
    notAfter: Optional[datetime] = Field(
        None,
        description='The expiration time of the certificate stored in the secret named\nby this resource in `spec.secretName`.',
    )
    notBefore: Optional[datetime] = Field(
        None,
        description='The time after which the certificate stored in the secret named\nby this resource in `spec.secretName` is valid.',
    )
    renewalTime: Optional[datetime] = Field(
        None,
        description='RenewalTime is the time at which the certificate will be next\nrenewed.\nIf not set, no upcoming renewal is scheduled.',
    )
    revision: Optional[int] = Field(
        None,
        description="The current 'revision' of the certificate as issued.\n\nWhen a CertificateRequest resource is created, it will have the\n`cert-manager.io/certificate-revision` set to one greater than the\ncurrent value of this field.\n\nUpon issuance, this field will be set to the value of the annotation\non the CertificateRequest resource used to issue the certificate.\n\nPersisting the value on the CertificateRequest resource allows the\ncertificates controller to know whether a request is part of an old\nissuance or if it is part of the ongoing revision's issuance by\nchecking if the revision value in the annotation is greater than this\nfield.",
    )


class Certificate(BaseModel):
    apiVersion: Optional[str] = Field(
        None,
        description='APIVersion defines the versioned schema of this representation of an object.\nServers should convert recognized schemas to the latest internal value, and\nmay reject unrecognized values.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources',
    )
    kind: Optional[str] = Field(
        None,
        description='Kind is a string value representing the REST resource this object represents.\nServers may infer this from the endpoint the client submits requests to.\nCannot be updated.\nIn CamelCase.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds',
    )
    metadata: Optional[dict[str, Any]] = None
    spec: Optional[Spec] = Field(
        None,
        description='Specification of the desired state of the Certificate resource.\nhttps://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status',
    )
    status: Optional[Status] = Field(
        None,
        description='Status of the Certificate.\nThis is set and managed automatically.\nRead-only.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status',
    )
