// Generated from definition io.k8s.api.discovery.v1beta1.Endpoint
/// Endpoint represents a single logical "backend" implementing a service.
#[derive(Clone, Debug, Default, PartialEq)]
pub struct Endpoint {
/// addresses of this endpoint. The contents of this field are interpreted according to the corresponding EndpointSlice addressType field. Consumers must handle different types of addresses in the context of their own capabilities. This must contain at least one address but no more than 100.
pub addresses: Vec<String>,
/// conditions contains information about the current status of the endpoint.
pub conditions: Option<crate::api::discovery::v1beta1::EndpointConditions>,
/// hostname of this endpoint. This field may be used by consumers of endpoints to distinguish endpoints from each other (e.g. in DNS names). Multiple endpoints which use the same hostname should be considered fungible (e.g. multiple A values in DNS). Must pass DNS Label (RFC 1123) validation.
pub hostname: Option<String>,
/// targetRef is a reference to a Kubernetes object that represents this endpoint.
pub target_ref: Option<crate::api::core::v1::ObjectReference>,
/// topology contains arbitrary topology information associated with the endpoint. These key/value pairs must conform with the label format. https://kubernetes.io/docs/concepts/overview/working-with-objects/labels Topology may include a maximum of 16 key/value pairs. This includes, but is not limited to the following well known keys: * kubernetes.io/hostname: the value indicates the hostname of the node
/// where the endpoint is located. This should match the corresponding
/// node label.
/// * topology.kubernetes.io/zone: the value indicates the zone where the
/// endpoint is located. This should match the corresponding node label.
/// * topology.kubernetes.io/region: the value indicates the region where the
/// endpoint is located. This should match the corresponding node label.
pub topology: Option<std::collections::BTreeMap<String, String>>,
}
impl crate::DeepMerge for Endpoint {
fn merge_from(&mut self, other: Self) {
crate::DeepMerge::merge_from(&mut self.addresses, other.addresses);
crate::DeepMerge::merge_from(&mut self.conditions, other.conditions);
crate::DeepMerge::merge_from(&mut self.hostname, other.hostname);
crate::DeepMerge::merge_from(&mut self.target_ref, other.target_ref);
crate::DeepMerge::merge_from(&mut self.topology, other.topology);
}
}
impl<'de> crate::serde::Deserialize<'de> for Endpoint {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: crate::serde::Deserializer<'de> {
#[allow(non_camel_case_types)]
enum Field {
Key_addresses,
Key_conditions,
Key_hostname,
Key_target_ref,
Key_topology,
Other,
}
impl<'de> crate::serde::Deserialize<'de> for Field {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: crate::serde::Deserializer<'de> {
struct Visitor;
impl<'de> crate::serde::de::Visitor<'de> for Visitor {
type Value = Field;
fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str("field identifier")
}
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> where E: crate::serde::de::Error {
Ok(match v {
"addresses" => Field::Key_addresses,
"conditions" => Field::Key_conditions,
"hostname" => Field::Key_hostname,
"targetRef" => Field::Key_target_ref,
"topology" => Field::Key_topology,
_ => Field::Other,
})
}
}
deserializer.deserialize_identifier(Visitor)
}
}
struct Visitor;
impl<'de> crate::serde::de::Visitor<'de> for Visitor {
type Value = Endpoint;
fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str("Endpoint")
}
fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> where A: crate::serde::de::MapAccess<'de> {
let mut value_addresses: Option<Vec<String>> = None;
let mut value_conditions: Option<crate::api::discovery::v1beta1::EndpointConditions> = None;
let mut value_hostname: Option<String> = None;
let mut value_target_ref: Option<crate::api::core::v1::ObjectReference> = None;
let mut value_topology: Option<std::collections::BTreeMap<String, String>> = None;
while let Some(key) = crate::serde::de::MapAccess::next_key::<Field>(&mut map)? {
match key {
Field::Key_addresses => value_addresses = crate::serde::de::MapAccess::next_value(&mut map)?,
Field::Key_conditions => value_conditions = crate::serde::de::MapAccess::next_value(&mut map)?,
Field::Key_hostname => value_hostname = crate::serde::de::MapAccess::next_value(&mut map)?,
Field::Key_target_ref => value_target_ref = crate::serde::de::MapAccess::next_value(&mut map)?,
Field::Key_topology => value_topology = crate::serde::de::MapAccess::next_value(&mut map)?,
Field::Other => { let _: crate::serde::de::IgnoredAny = crate::serde::de::MapAccess::next_value(&mut map)?; },
}
}
Ok(Endpoint {
addresses: value_addresses.unwrap_or_default(),
conditions: value_conditions,
hostname: value_hostname,
target_ref: value_target_ref,
topology: value_topology,
})
}
}
deserializer.deserialize_struct(
"Endpoint",
&[
"addresses",
"conditions",
"hostname",
"targetRef",
"topology",
],
Visitor,
)
}
}
impl crate::serde::Serialize for Endpoint {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: crate::serde::Serializer {
let mut state = serializer.serialize_struct(
"Endpoint",
1 +
self.conditions.as_ref().map_or(0, |_| 1) +
self.hostname.as_ref().map_or(0, |_| 1) +
self.target_ref.as_ref().map_or(0, |_| 1) +
self.topology.as_ref().map_or(0, |_| 1),
)?;
crate::serde::ser::SerializeStruct::serialize_field(&mut state, "addresses", &self.addresses)?;
if let Some(value) = &self.conditions {
crate::serde::ser::SerializeStruct::serialize_field(&mut state, "conditions", value)?;
}
if let Some(value) = &self.hostname {
crate::serde::ser::SerializeStruct::serialize_field(&mut state, "hostname", value)?;
}
if let Some(value) = &self.target_ref {
crate::serde::ser::SerializeStruct::serialize_field(&mut state, "targetRef", value)?;
}
if let Some(value) = &self.topology {
crate::serde::ser::SerializeStruct::serialize_field(&mut state, "topology", value)?;
}
crate::serde::ser::SerializeStruct::end(state)
}
}
#[cfg(feature = "schemars")]
impl crate::schemars::JsonSchema for Endpoint {
fn schema_name() -> String {
"io.k8s.api.discovery.v1beta1.Endpoint".to_owned()
}
fn json_schema(__gen: &mut crate::schemars::gen::SchemaGenerator) -> crate::schemars::schema::Schema {
crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
metadata: Some(Box::new(crate::schemars::schema::Metadata {
description: Some("Endpoint represents a single logical \"backend\" implementing a service.".to_owned()),
..Default::default()
})),
instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::Object))),
object: Some(Box::new(crate::schemars::schema::ObjectValidation {
properties: [
(
"addresses".to_owned(),
crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
metadata: Some(Box::new(crate::schemars::schema::Metadata {
description: Some("addresses of this endpoint. The contents of this field are interpreted according to the corresponding EndpointSlice addressType field. Consumers must handle different types of addresses in the context of their own capabilities. This must contain at least one address but no more than 100.".to_owned()),
..Default::default()
})),
instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::Array))),
array: Some(Box::new(crate::schemars::schema::ArrayValidation {
items: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(
crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
..Default::default()
})
))),
..Default::default()
})),
..Default::default()
}),
),
(
"conditions".to_owned(),
{
let mut schema_obj = __gen.subschema_for::<crate::api::discovery::v1beta1::EndpointConditions>().into_object();
schema_obj.metadata = Some(Box::new(crate::schemars::schema::Metadata {
description: Some("conditions contains information about the current status of the endpoint.".to_owned()),
..Default::default()
}));
crate::schemars::schema::Schema::Object(schema_obj)
},
),
(
"hostname".to_owned(),
crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
metadata: Some(Box::new(crate::schemars::schema::Metadata {
description: Some("hostname of this endpoint. This field may be used by consumers of endpoints to distinguish endpoints from each other (e.g. in DNS names). Multiple endpoints which use the same hostname should be considered fungible (e.g. multiple A values in DNS). Must pass DNS Label (RFC 1123) validation.".to_owned()),
..Default::default()
})),
instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
..Default::default()
}),
),
(
"targetRef".to_owned(),
{
let mut schema_obj = __gen.subschema_for::<crate::api::core::v1::ObjectReference>().into_object();
schema_obj.metadata = Some(Box::new(crate::schemars::schema::Metadata {
description: Some("targetRef is a reference to a Kubernetes object that represents this endpoint.".to_owned()),
..Default::default()
}));
crate::schemars::schema::Schema::Object(schema_obj)
},
),
(
"topology".to_owned(),
crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
metadata: Some(Box::new(crate::schemars::schema::Metadata {
description: Some("topology contains arbitrary topology information associated with the endpoint. These key/value pairs must conform with the label format. https://kubernetes.io/docs/concepts/overview/working-with-objects/labels Topology may include a maximum of 16 key/value pairs. This includes, but is not limited to the following well known keys: * kubernetes.io/hostname: the value indicates the hostname of the node\n where the endpoint is located. This should match the corresponding\n node label.\n* topology.kubernetes.io/zone: the value indicates the zone where the\n endpoint is located. This should match the corresponding node label.\n* topology.kubernetes.io/region: the value indicates the region where the\n endpoint is located. This should match the corresponding node label.".to_owned()),
..Default::default()
})),
instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::Object))),
object: Some(Box::new(crate::schemars::schema::ObjectValidation {
additional_properties: Some(Box::new(
crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
..Default::default()
})
)),
..Default::default()
})),
..Default::default()
}),
),
].into(),
required: [
"addresses".to_owned(),
].into(),
..Default::default()
})),
..Default::default()
})
}
}