{
  "properties": {
    "apiVersion": {
      "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",
      "type": "string"
    },
    "kind": {
      "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",
      "type": "string"
    },
    "metadata": {
      "type": "object"
    },
    "spec": {
      "description": "Spec is the specification of the desired behavior of the CiliumBGPPeerConfig.",
      "properties": {
        "authSecretRef": {
          "description": "AuthSecretRef is the name of the secret to use to fetch a TCP\nauthentication password for this peer.\n\nIf not specified, no authentication is used.",
          "type": "string"
        },
        "ebgpMultihop": {
          "default": 1,
          "description": "EBGPMultihopTTL controls the multi-hop feature for eBGP peers.\nIts value defines the Time To Live (TTL) value used in BGP\npackets sent to the peer.\n\nIf not specified, EBGP multihop is disabled. This field is ignored for iBGP neighbors.",
          "format": "int32",
          "maximum": 255,
          "minimum": 1,
          "type": "integer"
        },
        "families": {
          "description": "Families, if provided, defines a set of AFI/SAFIs the speaker will\nnegotiate with it's peer.\n\nIf not specified, the default families of IPv6/unicast and IPv4/unicast will be created.",
          "items": {
            "description": "CiliumBGPFamilyWithAdverts represents a AFI/SAFI address family pair along with reference to BGP Advertisements.",
            "properties": {
              "advertisements": {
                "description": "Advertisements selects group of BGP Advertisement(s) to advertise for this family.\n\nIf not specified, no advertisements are sent for this family.",
                "properties": {
                  "matchExpressions": {
                    "description": "matchExpressions is a list of label selector requirements. The requirements are ANDed.",
                    "items": {
                      "description": "A label selector requirement is a selector that contains values, a key, and an operator that\nrelates the key and values.",
                      "properties": {
                        "key": {
                          "description": "key is the label key that the selector applies to.",
                          "type": "string"
                        },
                        "operator": {
                          "description": "operator represents a key's relationship to a set of values.\nValid operators are In, NotIn, Exists and DoesNotExist.",
                          "enum": [
                            "In",
                            "NotIn",
                            "Exists",
                            "DoesNotExist"
                          ],
                          "type": "string"
                        },
                        "values": {
                          "description": "values is an array of string values. If the operator is In or NotIn,\nthe values array must be non-empty. If the operator is Exists or DoesNotExist,\nthe values array must be empty. This array is replaced during a strategic\nmerge patch.",
                          "items": {
                            "type": "string"
                          },
                          "type": "array",
                          "x-kubernetes-list-type": "atomic"
                        }
                      },
                      "required": [
                        "key",
                        "operator"
                      ],
                      "type": "object",
                      "additionalProperties": false
                    },
                    "type": "array",
                    "x-kubernetes-list-type": "atomic"
                  },
                  "matchLabels": {
                    "additionalProperties": {
                      "description": "MatchLabelsValue represents the value from the MatchLabels {key,value} pair.",
                      "maxLength": 63,
                      "pattern": "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$",
                      "type": "string"
                    },
                    "description": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\nmap is equivalent to an element of matchExpressions, whose key field is \"key\", the\noperator is \"In\", and the values array contains only \"value\". The requirements are ANDed.",
                    "type": "object"
                  }
                },
                "type": "object",
                "x-kubernetes-map-type": "atomic",
                "additionalProperties": false
              },
              "afi": {
                "description": "Afi is the Address Family Identifier (AFI) of the family.",
                "enum": [
                  "ipv4",
                  "ipv6",
                  "l2vpn",
                  "ls",
                  "opaque"
                ],
                "type": "string"
              },
              "safi": {
                "description": "Safi is the Subsequent Address Family Identifier (SAFI) of the family.",
                "enum": [
                  "unicast",
                  "multicast",
                  "mpls_label",
                  "encapsulation",
                  "vpls",
                  "evpn",
                  "ls",
                  "sr_policy",
                  "mup",
                  "mpls_vpn",
                  "mpls_vpn_multicast",
                  "route_target_constraints",
                  "flowspec_unicast",
                  "flowspec_vpn",
                  "key_value"
                ],
                "type": "string"
              }
            },
            "required": [
              "afi",
              "safi"
            ],
            "type": "object",
            "additionalProperties": false
          },
          "type": "array"
        },
        "gracefulRestart": {
          "description": "GracefulRestart defines graceful restart parameters which are negotiated\nwith this peer.\n\nIf not specified, the graceful restart capability is disabled.",
          "properties": {
            "enabled": {
              "description": "Enabled flag, when set enables graceful restart capability.",
              "type": "boolean"
            },
            "restartTimeSeconds": {
              "default": 120,
              "description": "RestartTimeSeconds is the estimated time it will take for the BGP\nsession to be re-established with peer after a restart.\nAfter this period, peer will remove stale routes. This is\ndescribed RFC 4724 section 4.2.",
              "format": "int32",
              "maximum": 4095,
              "minimum": 1,
              "type": "integer"
            }
          },
          "required": [
            "enabled"
          ],
          "type": "object",
          "additionalProperties": false
        },
        "timers": {
          "description": "Timers defines the BGP timers for the peer.\n\nIf not specified, the default timers are used.",
          "properties": {
            "connectRetryTimeSeconds": {
              "default": 120,
              "description": "ConnectRetryTimeSeconds defines the initial value for the BGP ConnectRetryTimer (RFC 4271, Section 8).\n\nIf not specified, defaults to 120 seconds.",
              "format": "int32",
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer"
            },
            "holdTimeSeconds": {
              "default": 90,
              "description": "HoldTimeSeconds defines the initial value for the BGP HoldTimer (RFC 4271, Section 4.2).\nUpdating this value will cause a session reset.\n\nIf not specified, defaults to 90 seconds.",
              "format": "int32",
              "maximum": 65535,
              "minimum": 3,
              "type": "integer"
            },
            "keepAliveTimeSeconds": {
              "default": 30,
              "description": "KeepaliveTimeSeconds defines the initial value for the BGP KeepaliveTimer (RFC 4271, Section 8).\nIt can not be larger than HoldTimeSeconds. Updating this value will cause a session reset.\n\nIf not specified, defaults to 30 seconds.",
              "format": "int32",
              "maximum": 65535,
              "minimum": 1,
              "type": "integer"
            }
          },
          "type": "object",
          "x-kubernetes-validations": [
            {
              "message": "keepAliveTimeSeconds can not be larger than holdTimeSeconds",
              "rule": "self.keepAliveTimeSeconds <= self.holdTimeSeconds"
            }
          ],
          "additionalProperties": false
        },
        "transport": {
          "description": "Transport defines the BGP transport parameters for the peer.\n\nIf not specified, the default transport parameters are used.",
          "properties": {
            "localPort": {
              "description": "Deprecated\nLocalPort is the local port to be used for the BGP session.\n\nIf not specified, ephemeral port will be picked to initiate a connection.\n\nThis field is deprecated and will be removed in a future release.\nLocal port configuration is unnecessary and is not recommended.",
              "format": "int32",
              "maximum": 65535,
              "minimum": 1,
              "type": "integer"
            },
            "peerPort": {
              "default": 179,
              "description": "PeerPort is the peer port to be used for the BGP session.\n\nIf not specified, defaults to TCP port 179.",
              "format": "int32",
              "maximum": 65535,
              "minimum": 1,
              "type": "integer"
            }
          },
          "type": "object",
          "additionalProperties": false
        }
      },
      "type": "object",
      "additionalProperties": false
    },
    "status": {
      "description": "Status is the running status of the CiliumBGPPeerConfig",
      "properties": {
        "conditions": {
          "description": "The current conditions of the CiliumBGPPeerConfig",
          "items": {
            "description": "Condition contains details for one aspect of the current state of this API Resource.",
            "properties": {
              "lastTransitionTime": {
                "description": "lastTransitionTime is the last time the condition transitioned from one status to another.\nThis should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.",
                "format": "date-time",
                "type": "string"
              },
              "message": {
                "description": "message is a human readable message indicating details about the transition.\nThis may be an empty string.",
                "maxLength": 32768,
                "type": "string"
              },
              "observedGeneration": {
                "description": "observedGeneration represents the .metadata.generation that the condition was set based upon.\nFor instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\nwith respect to the current state of the instance.",
                "format": "int64",
                "minimum": 0,
                "type": "integer"
              },
              "reason": {
                "description": "reason contains a programmatic identifier indicating the reason for the condition's last transition.\nProducers of specific condition types may define expected values and meanings for this field,\nand whether the values are considered a guaranteed API.\nThe value should be a CamelCase string.\nThis field may not be empty.",
                "maxLength": 1024,
                "minLength": 1,
                "pattern": "^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$",
                "type": "string"
              },
              "status": {
                "description": "status of the condition, one of True, False, Unknown.",
                "enum": [
                  "True",
                  "False",
                  "Unknown"
                ],
                "type": "string"
              },
              "type": {
                "description": "type of condition in CamelCase or in foo.example.com/CamelCase.",
                "maxLength": 316,
                "pattern": "^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$",
                "type": "string"
              }
            },
            "required": [
              "lastTransitionTime",
              "message",
              "reason",
              "status",
              "type"
            ],
            "type": "object",
            "additionalProperties": false
          },
          "type": "array",
          "x-kubernetes-list-map-keys": [
            "type"
          ],
          "x-kubernetes-list-type": "map"
        }
      },
      "type": "object",
      "additionalProperties": false
    }
  },
  "required": [
    "metadata",
    "spec"
  ],
  "type": "object"
}
