{ apiVersion = "apiextensions.k8s.io/v1"; kind = "CustomResourceDefinition"; metadata = { annotations = {"controller-gen.kubebuilder.io/version" = "v0.11.1";}; creationTimestamp = null; name = "bgppeers.metallb.io"; }; spec = { conversion = { strategy = "Webhook"; webhook = { clientConfig = { caBundle = "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpNSUlGWlRDQ0EwMmdBd0lCQWdJVU5GRW1XcTM3MVpKdGkrMmlSQzk1WmpBV1MxZ3dEUVlKS29aSWh2Y05BUUVMDQpCUUF3UWpFTE1Ba0dBMVVFQmhNQ1dGZ3hGVEFUQmdOVkJBY01ERVJsWm1GMWJIUWdRMmwwZVRFY01Cb0dBMVVFDQpDZ3dUUkdWbVlYVnNkQ0JEYjIxd1lXNTVJRXgwWkRBZUZ3MHlNakEzTVRrd09UTXlNek5hRncweU1qQTRNVGd3DQpPVE15TXpOYU1FSXhDekFKQmdOVkJBWVRBbGhZTVJVd0V3WURWUVFIREF4RVpXWmhkV3gwSUVOcGRIa3hIREFhDQpCZ05WQkFvTUUwUmxabUYxYkhRZ1EyOXRjR0Z1ZVNCTWRHUXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDDQpEd0F3Z2dJS0FvSUNBUUNxVFpxMWZRcC9vYkdlenhES0o3OVB3Ny94azJwellualNzMlkzb1ZYSm5sRmM4YjVlDQpma2ZZQnY2bndscW1keW5PL2phWFBaQmRQSS82aFdOUDBkdVhadEtWU0NCUUpyZzEyOGNXb3F0MGNTN3pLb1VpDQpvcU1tQ0QvRXVBeFFNZjhRZDF2c1gvVllkZ0poVTZBRXJLZEpIaXpFOUJtUkNkTDBGMW1OVW55Rk82UnRtWFZUDQpidkxsTDVYeTc2R0FaQVBLOFB4aVlDa0NtbDdxN0VnTWNiOXlLWldCYmlxQ3VkTXE5TGJLNmdKNzF6YkZnSXV4DQo1L1pXK2JraTB2RlplWk9ZODUxb1psckFUNzJvMDI4NHNTWW9uN0pHZVZkY3NoUnh5R1VpSFpSTzdkaXZVTDVTDQpmM2JmSDFYbWY1ZDQzT0NWTWRuUUV2NWVaOG8zeWVLa3ZrbkZQUGVJMU9BbjdGbDlFRVNNR2dhOGFaSG1URSttDQpsLzlMSmdDYjBnQmtPT0M0WnV4bWh2aERKV1EzWnJCS3pMQlNUZXN0NWlLNVlwcXRWVVk2THRyRW9FelVTK1lsDQpwWndXY2VQWHlHeHM5ZURsR3lNVmQraW15Y3NTU1UvVno2Mmx6MnZCS21NTXBkYldDQWhud0RsRTVqU2dyMjRRDQp0eGNXLys2N3d5KzhuQlI3UXdqVTFITndVRjBzeERWdEwrZ1NHVERnSEVZSlhZelYvT05zMy94TkpoVFNPSkxNDQpoeXNVdyttaGdackdhbUdXcHVIVU1DUitvTWJzMTc1UkcrQjJnUFFHVytPTjJnUTRyOXN2b0ZBNHBBQm8xd1dLDQpRYjRhY3pmeVVscElBOVFoSmFsZEY3S3dPSHVlV3gwRUNrNXg0T2tvVDBvWVp0dzFiR0JjRGtaSmF3SURBUUFCDQpvMU13VVRBZEJnTlZIUTRFRmdRVW90UlNIUm9IWTEyRFZ4R0NCdEhpb1g2ZmVFQXdId1lEVlIwakJCZ3dGb0FVDQpvdFJTSFJvSFkxMkRWeEdDQnRIaW9YNmZlRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCDQpBUXNGQUFPQ0FnRUFSbkpsWWRjMTFHd0VxWnh6RDF2R3BDR2pDN2VWTlQ3aVY1d3IybXlybHdPYi9aUWFEa0xYDQpvVStaOVVXT1VlSXJTdzUydDdmQUpvVVAwSm5iYkMveVIrU1lqUGhvUXNiVHduOTc2ZldBWTduM3FMOXhCd1Y0DQphek41OXNjeUp0dlhMeUtOL2N5ak1ReDRLajBIMFg0bWJ6bzVZNUtzWWtYVU0vOEFPdWZMcEd0S1NGVGgrSEFDDQpab1Q5YnZHS25adnNHd0tYZFF0Wnh0akhaUjVqK3U3ZGtQOTJBT051RFNabS8rWVV4b2tBK09JbzdSR3BwSHNXDQo1ZTdNY0FTVXRtb1FORXd6dVFoVkJaRWQ1OGtKYjUrV0VWbGNzanlXNnRTbzErZ25tTWNqR1BsMWgxR2hVbjV4DQpFY0lWRnBIWXM5YWo1NmpBSjk1MVQvZjhMaWxmTlVnanBLQ0c1bnl0SUt3emxhOHNtdGlPdm1UNEpYbXBwSkI2DQo4bmdHRVluVjUrUTYwWFJ2OEhSSGp1VG9CRHVhaERrVDA2R1JGODU1d09FR2V4bkZpMXZYWUxLVllWb1V2MXRKDQo4dVdUR1pwNllDSVJldlBqbzg5ZytWTlJSaVFYUThJd0dybXE5c0RoVTlqTjA0SjdVL1RvRDFpNHE3VnlsRUc5DQorV1VGNkNLaEdBeTJIaEhwVncyTGFoOS9lUzdZMUZ1YURrWmhPZG1laG1BOCtqdHNZamJadnR5Mm1SWlF0UUZzDQpUU1VUUjREbUR2bVVPRVRmeStpRHdzK2RkWXVNTnJGeVVYV2dkMnpBQU4ydVl1UHFGY2pRcFNPODFzVTJTU3R3DQoxVzAyeUtYOGJEYmZFdjBzbUh3UzliQnFlSGo5NEM1Mjg0YXpsdTBmaUdpTm1OUEM4ckJLRmhBPQ0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ=="; service = { name = "webhook-service"; namespace = "metallb-system"; path = "/convert"; }; }; conversionReviewVersions = ["v1beta1" "v1beta2"]; }; }; group = "metallb.io"; names = { kind = "BGPPeer"; listKind = "BGPPeerList"; plural = "bgppeers"; singular = "bgppeer"; }; scope = "Namespaced"; versions = [ { additionalPrinterColumns = [ { jsonPath = ".spec.peerAddress"; name = "Address"; type = "string"; } { jsonPath = ".spec.peerASN"; name = "ASN"; type = "string"; } { jsonPath = ".spec.bfdProfile"; name = "BFD Profile"; type = "string"; } { jsonPath = ".spec.ebgpMultiHop"; name = "Multi Hops"; type = "string"; } ]; name = "v1beta1"; schema = { openAPIV3Schema = { description = "BGPPeer is the Schema for the peers API."; properties = { apiVersion = { description = "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More 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. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"; type = "string"; }; metadata = {type = "object";}; spec = { description = "BGPPeerSpec defines the desired state of Peer."; properties = { bfdProfile = {type = "string";}; ebgpMultiHop = { description = "EBGP peer is multi-hops away"; type = "boolean"; }; holdTime = { description = "Requested BGP hold time, per RFC4271."; type = "string"; }; keepaliveTime = { description = "Requested BGP keepalive time, per RFC4271."; type = "string"; }; myASN = { description = "AS number to use for the local end of the session."; format = "int32"; maximum = 4294967295; minimum = 0; type = "integer"; }; nodeSelectors = { description = "Only connect to this peer on nodes that match one of these selectors."; items = { properties = { matchExpressions = { items = { properties = { key = {type = "string";}; operator = {type = "string";}; values = { items = {type = "string";}; minItems = 1; type = "array"; }; }; required = ["key" "operator" "values"]; type = "object"; }; type = "array"; }; matchLabels = { additionalProperties = {type = "string";}; type = "object"; }; }; type = "object"; }; type = "array"; }; password = { description = "Authentication password for routers enforcing TCP MD5 authenticated sessions"; type = "string"; }; peerASN = { description = "AS number to expect from the remote end of the session."; format = "int32"; maximum = 4294967295; minimum = 0; type = "integer"; }; peerAddress = { description = "Address to dial when establishing the session."; type = "string"; }; peerPort = { description = "Port to dial when establishing the session."; maximum = 16384; minimum = 0; type = "integer"; }; routerID = { description = "BGP router ID to advertise to the peer"; type = "string"; }; sourceAddress = { description = "Source address to use when establishing the session."; type = "string"; }; }; required = ["myASN" "peerASN" "peerAddress"]; type = "object"; }; status = { description = "BGPPeerStatus defines the observed state of Peer."; type = "object"; }; }; type = "object"; }; }; served = true; storage = false; subresources = {status = {};}; } { additionalPrinterColumns = [ { jsonPath = ".spec.peerAddress"; name = "Address"; type = "string"; } { jsonPath = ".spec.peerASN"; name = "ASN"; type = "string"; } { jsonPath = ".spec.bfdProfile"; name = "BFD Profile"; type = "string"; } { jsonPath = ".spec.ebgpMultiHop"; name = "Multi Hops"; type = "string"; } ]; name = "v1beta2"; schema = { openAPIV3Schema = { description = "BGPPeer is the Schema for the peers API."; properties = { apiVersion = { description = "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More 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. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"; type = "string"; }; metadata = {type = "object";}; spec = { description = "BGPPeerSpec defines the desired state of Peer."; properties = { bfdProfile = { description = "The name of the BFD Profile to be used for the BFD session associated to the BGP session. If not set, the BFD session won't be set up."; type = "string"; }; ebgpMultiHop = { description = "To set if the BGPPeer is multi-hops away. Needed for FRR mode only."; type = "boolean"; }; holdTime = { description = "Requested BGP hold time, per RFC4271."; type = "string"; }; keepaliveTime = { description = "Requested BGP keepalive time, per RFC4271."; type = "string"; }; myASN = { description = "AS number to use for the local end of the session."; format = "int32"; maximum = 4294967295; minimum = 0; type = "integer"; }; nodeSelectors = { description = "Only connect to this peer on nodes that match one of these selectors."; items = { description = "A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects."; 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 relates 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. Valid operators are In, NotIn, Exists and DoesNotExist."; type = "string"; }; values = { description = "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch."; items = {type = "string";}; type = "array"; }; }; required = ["key" "operator"]; type = "object"; }; type = "array"; }; matchLabels = { additionalProperties = {type = "string";}; description = "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed."; type = "object"; }; }; type = "object"; x-kubernetes-map-type = "atomic"; }; type = "array"; }; password = { description = "Authentication password for routers enforcing TCP MD5 authenticated sessions"; type = "string"; }; passwordSecret = { description = "passwordSecret is name of the authentication secret for BGP Peer. the secret must be of type \"kubernetes.io/basic-auth\", and created in the same namespace as the MetalLB deployment. The password is stored in the secret as the key \"password\"."; properties = { name = { description = "name is unique within a namespace to reference a secret resource."; type = "string"; }; namespace = { description = "namespace defines the space within which the secret name must be unique."; type = "string"; }; }; type = "object"; x-kubernetes-map-type = "atomic"; }; peerASN = { description = "AS number to expect from the remote end of the session."; format = "int32"; maximum = 4294967295; minimum = 0; type = "integer"; }; peerAddress = { description = "Address to dial when establishing the session."; type = "string"; }; peerPort = { default = 179; description = "Port to dial when establishing the session."; maximum = 16384; minimum = 0; type = "integer"; }; routerID = { description = "BGP router ID to advertise to the peer"; type = "string"; }; sourceAddress = { description = "Source address to use when establishing the session."; type = "string"; }; vrf = { description = "To set if we want to peer with the BGPPeer using an interface belonging to a host vrf"; type = "string"; }; }; required = ["myASN" "peerASN" "peerAddress"]; type = "object"; }; status = { description = "BGPPeerStatus defines the observed state of Peer."; type = "object"; }; }; type = "object"; }; }; served = true; storage = true; subresources = {status = {};}; } ]; }; }