k8s_openapi/v1_32/api/discovery/v1/
endpoint_slice.rs1#[derive(Clone, Debug, Default, PartialEq)]
5pub struct EndpointSlice {
6 pub address_type: String,
8
9 pub endpoints: Vec<crate::api::discovery::v1::Endpoint>,
11
12 pub metadata: crate::apimachinery::pkg::apis::meta::v1::ObjectMeta,
14
15 pub ports: Option<Vec<crate::api::discovery::v1::EndpointPort>>,
17}
18
19impl crate::Resource for EndpointSlice {
20 const API_VERSION: &'static str = "discovery.k8s.io/v1";
21 const GROUP: &'static str = "discovery.k8s.io";
22 const KIND: &'static str = "EndpointSlice";
23 const VERSION: &'static str = "v1";
24 const URL_PATH_SEGMENT: &'static str = "endpointslices";
25 type Scope = crate::NamespaceResourceScope;
26}
27
28impl crate::ListableResource for EndpointSlice {
29 const LIST_KIND: &'static str = "EndpointSliceList";
30}
31
32impl crate::Metadata for EndpointSlice {
33 type Ty = crate::apimachinery::pkg::apis::meta::v1::ObjectMeta;
34
35 fn metadata(&self) -> &<Self as crate::Metadata>::Ty {
36 &self.metadata
37 }
38
39 fn metadata_mut(&mut self) -> &mut<Self as crate::Metadata>::Ty {
40 &mut self.metadata
41 }
42}
43
44impl crate::DeepMerge for EndpointSlice {
45 fn merge_from(&mut self, other: Self) {
46 crate::DeepMerge::merge_from(&mut self.address_type, other.address_type);
47 crate::merge_strategies::list::atomic(&mut self.endpoints, other.endpoints);
48 crate::DeepMerge::merge_from(&mut self.metadata, other.metadata);
49 crate::merge_strategies::list::atomic(&mut self.ports, other.ports);
50 }
51}
52
53impl<'de> crate::serde::Deserialize<'de> for EndpointSlice {
54 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: crate::serde::Deserializer<'de> {
55 #[allow(non_camel_case_types)]
56 enum Field {
57 Key_api_version,
58 Key_kind,
59 Key_address_type,
60 Key_endpoints,
61 Key_metadata,
62 Key_ports,
63 Other,
64 }
65
66 impl<'de> crate::serde::Deserialize<'de> for Field {
67 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: crate::serde::Deserializer<'de> {
68 struct Visitor;
69
70 impl crate::serde::de::Visitor<'_> for Visitor {
71 type Value = Field;
72
73 fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
74 f.write_str("field identifier")
75 }
76
77 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> where E: crate::serde::de::Error {
78 Ok(match v {
79 "apiVersion" => Field::Key_api_version,
80 "kind" => Field::Key_kind,
81 "addressType" => Field::Key_address_type,
82 "endpoints" => Field::Key_endpoints,
83 "metadata" => Field::Key_metadata,
84 "ports" => Field::Key_ports,
85 _ => Field::Other,
86 })
87 }
88 }
89
90 deserializer.deserialize_identifier(Visitor)
91 }
92 }
93
94 struct Visitor;
95
96 impl<'de> crate::serde::de::Visitor<'de> for Visitor {
97 type Value = EndpointSlice;
98
99 fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
100 f.write_str(<Self::Value as crate::Resource>::KIND)
101 }
102
103 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> where A: crate::serde::de::MapAccess<'de> {
104 let mut value_address_type: Option<String> = None;
105 let mut value_endpoints: Option<Vec<crate::api::discovery::v1::Endpoint>> = None;
106 let mut value_metadata: Option<crate::apimachinery::pkg::apis::meta::v1::ObjectMeta> = None;
107 let mut value_ports: Option<Vec<crate::api::discovery::v1::EndpointPort>> = None;
108
109 while let Some(key) = crate::serde::de::MapAccess::next_key::<Field>(&mut map)? {
110 match key {
111 Field::Key_api_version => {
112 let value_api_version: String = crate::serde::de::MapAccess::next_value(&mut map)?;
113 if value_api_version != <Self::Value as crate::Resource>::API_VERSION {
114 return Err(crate::serde::de::Error::invalid_value(crate::serde::de::Unexpected::Str(&value_api_version), &<Self::Value as crate::Resource>::API_VERSION));
115 }
116 },
117 Field::Key_kind => {
118 let value_kind: String = crate::serde::de::MapAccess::next_value(&mut map)?;
119 if value_kind != <Self::Value as crate::Resource>::KIND {
120 return Err(crate::serde::de::Error::invalid_value(crate::serde::de::Unexpected::Str(&value_kind), &<Self::Value as crate::Resource>::KIND));
121 }
122 },
123 Field::Key_address_type => value_address_type = crate::serde::de::MapAccess::next_value(&mut map)?,
124 Field::Key_endpoints => value_endpoints = crate::serde::de::MapAccess::next_value(&mut map)?,
125 Field::Key_metadata => value_metadata = crate::serde::de::MapAccess::next_value(&mut map)?,
126 Field::Key_ports => value_ports = crate::serde::de::MapAccess::next_value(&mut map)?,
127 Field::Other => { let _: crate::serde::de::IgnoredAny = crate::serde::de::MapAccess::next_value(&mut map)?; },
128 }
129 }
130
131 Ok(EndpointSlice {
132 address_type: value_address_type.unwrap_or_default(),
133 endpoints: value_endpoints.unwrap_or_default(),
134 metadata: value_metadata.unwrap_or_default(),
135 ports: value_ports,
136 })
137 }
138 }
139
140 deserializer.deserialize_struct(
141 <Self as crate::Resource>::KIND,
142 &[
143 "apiVersion",
144 "kind",
145 "addressType",
146 "endpoints",
147 "metadata",
148 "ports",
149 ],
150 Visitor,
151 )
152 }
153}
154
155impl crate::serde::Serialize for EndpointSlice {
156 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: crate::serde::Serializer {
157 let mut state = serializer.serialize_struct(
158 <Self as crate::Resource>::KIND,
159 5 +
160 self.ports.as_ref().map_or(0, |_| 1),
161 )?;
162 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "apiVersion", <Self as crate::Resource>::API_VERSION)?;
163 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "kind", <Self as crate::Resource>::KIND)?;
164 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "addressType", &self.address_type)?;
165 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "endpoints", &self.endpoints)?;
166 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "metadata", &self.metadata)?;
167 if let Some(value) = &self.ports {
168 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "ports", value)?;
169 }
170 crate::serde::ser::SerializeStruct::end(state)
171 }
172}
173
174#[cfg(feature = "schemars")]
175impl crate::schemars::JsonSchema for EndpointSlice {
176 fn schema_name() -> String {
177 "io.k8s.api.discovery.v1.EndpointSlice".to_owned()
178 }
179
180 fn json_schema(__gen: &mut crate::schemars::gen::SchemaGenerator) -> crate::schemars::schema::Schema {
181 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
182 metadata: Some(Box::new(crate::schemars::schema::Metadata {
183 description: Some("EndpointSlice represents a subset of the endpoints that implement a service. For a given service there may be multiple EndpointSlice objects, selected by labels, which must be joined to produce the full set of endpoints.".to_owned()),
184 ..Default::default()
185 })),
186 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::Object))),
187 object: Some(Box::new(crate::schemars::schema::ObjectValidation {
188 properties: [
189 (
190 "addressType".to_owned(),
191 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
192 metadata: Some(Box::new(crate::schemars::schema::Metadata {
193 description: Some("addressType specifies the type of address carried by this EndpointSlice. All addresses in this slice must be the same type. This field is immutable after creation. The following address types are currently supported: * IPv4: Represents an IPv4 Address. * IPv6: Represents an IPv6 Address. * FQDN: Represents a Fully Qualified Domain Name.".to_owned()),
194 ..Default::default()
195 })),
196 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
197 ..Default::default()
198 }),
199 ),
200 (
201 "apiVersion".to_owned(),
202 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
203 metadata: Some(Box::new(crate::schemars::schema::Metadata {
204 description: Some("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".to_owned()),
205 ..Default::default()
206 })),
207 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
208 ..Default::default()
209 }),
210 ),
211 (
212 "endpoints".to_owned(),
213 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
214 metadata: Some(Box::new(crate::schemars::schema::Metadata {
215 description: Some("endpoints is a list of unique endpoints in this slice. Each slice may include a maximum of 1000 endpoints.".to_owned()),
216 ..Default::default()
217 })),
218 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::Array))),
219 array: Some(Box::new(crate::schemars::schema::ArrayValidation {
220 items: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(__gen.subschema_for::<crate::api::discovery::v1::Endpoint>()))),
221 ..Default::default()
222 })),
223 ..Default::default()
224 }),
225 ),
226 (
227 "kind".to_owned(),
228 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
229 metadata: Some(Box::new(crate::schemars::schema::Metadata {
230 description: Some("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".to_owned()),
231 ..Default::default()
232 })),
233 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
234 ..Default::default()
235 }),
236 ),
237 (
238 "metadata".to_owned(),
239 {
240 let mut schema_obj = __gen.subschema_for::<crate::apimachinery::pkg::apis::meta::v1::ObjectMeta>().into_object();
241 schema_obj.metadata = Some(Box::new(crate::schemars::schema::Metadata {
242 description: Some("Standard object's metadata.".to_owned()),
243 ..Default::default()
244 }));
245 crate::schemars::schema::Schema::Object(schema_obj)
246 },
247 ),
248 (
249 "ports".to_owned(),
250 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
251 metadata: Some(Box::new(crate::schemars::schema::Metadata {
252 description: Some("ports specifies the list of network ports exposed by each endpoint in this slice. Each port must have a unique name. When ports is empty, it indicates that there are no defined ports. When a port is defined with a nil port value, it indicates \"all ports\". Each slice may include a maximum of 100 ports.".to_owned()),
253 ..Default::default()
254 })),
255 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::Array))),
256 array: Some(Box::new(crate::schemars::schema::ArrayValidation {
257 items: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(__gen.subschema_for::<crate::api::discovery::v1::EndpointPort>()))),
258 ..Default::default()
259 })),
260 ..Default::default()
261 }),
262 ),
263 ].into(),
264 required: [
265 "addressType".to_owned(),
266 "endpoints".to_owned(),
267 "metadata".to_owned(),
268 ].into(),
269 ..Default::default()
270 })),
271 ..Default::default()
272 })
273 }
274}