1#[derive(Clone, Debug, Default, PartialEq)]
5pub struct BasicDevice {
6 pub all_nodes: Option<bool>,
10
11 pub attributes: Option<std::collections::BTreeMap<std::string::String, crate::api::resource::v1beta1::DeviceAttribute>>,
15
16 pub capacity: Option<std::collections::BTreeMap<std::string::String, crate::api::resource::v1beta1::DeviceCapacity>>,
20
21 pub consumes_counters: Option<std::vec::Vec<crate::api::resource::v1beta1::DeviceCounterConsumption>>,
27
28 pub node_name: Option<std::string::String>,
32
33 pub node_selector: Option<crate::api::core::v1::NodeSelector>,
39
40 pub taints: Option<std::vec::Vec<crate::api::resource::v1beta1::DeviceTaint>>,
46}
47
48impl crate::DeepMerge for BasicDevice {
49 fn merge_from(&mut self, other: Self) {
50 crate::DeepMerge::merge_from(&mut self.all_nodes, other.all_nodes);
51 crate::merge_strategies::map::granular(&mut self.attributes, other.attributes, |current_item, other_item| {
52 crate::DeepMerge::merge_from(current_item, other_item);
53 });
54 crate::merge_strategies::map::granular(&mut self.capacity, other.capacity, |current_item, other_item| {
55 crate::DeepMerge::merge_from(current_item, other_item);
56 });
57 crate::merge_strategies::list::atomic(&mut self.consumes_counters, other.consumes_counters);
58 crate::DeepMerge::merge_from(&mut self.node_name, other.node_name);
59 crate::DeepMerge::merge_from(&mut self.node_selector, other.node_selector);
60 crate::merge_strategies::list::atomic(&mut self.taints, other.taints);
61 }
62}
63
64impl<'de> crate::serde::Deserialize<'de> for BasicDevice {
65 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: crate::serde::Deserializer<'de> {
66 #[allow(non_camel_case_types)]
67 enum Field {
68 Key_all_nodes,
69 Key_attributes,
70 Key_capacity,
71 Key_consumes_counters,
72 Key_node_name,
73 Key_node_selector,
74 Key_taints,
75 Other,
76 }
77
78 impl<'de> crate::serde::Deserialize<'de> for Field {
79 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: crate::serde::Deserializer<'de> {
80 struct Visitor;
81
82 impl crate::serde::de::Visitor<'_> for Visitor {
83 type Value = Field;
84
85 fn expecting(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
86 f.write_str("field identifier")
87 }
88
89 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> where E: crate::serde::de::Error {
90 Ok(match v {
91 "allNodes" => Field::Key_all_nodes,
92 "attributes" => Field::Key_attributes,
93 "capacity" => Field::Key_capacity,
94 "consumesCounters" => Field::Key_consumes_counters,
95 "nodeName" => Field::Key_node_name,
96 "nodeSelector" => Field::Key_node_selector,
97 "taints" => Field::Key_taints,
98 _ => Field::Other,
99 })
100 }
101 }
102
103 deserializer.deserialize_identifier(Visitor)
104 }
105 }
106
107 struct Visitor;
108
109 impl<'de> crate::serde::de::Visitor<'de> for Visitor {
110 type Value = BasicDevice;
111
112 fn expecting(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
113 f.write_str("BasicDevice")
114 }
115
116 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> where A: crate::serde::de::MapAccess<'de> {
117 let mut value_all_nodes: Option<bool> = None;
118 let mut value_attributes: Option<std::collections::BTreeMap<std::string::String, crate::api::resource::v1beta1::DeviceAttribute>> = None;
119 let mut value_capacity: Option<std::collections::BTreeMap<std::string::String, crate::api::resource::v1beta1::DeviceCapacity>> = None;
120 let mut value_consumes_counters: Option<std::vec::Vec<crate::api::resource::v1beta1::DeviceCounterConsumption>> = None;
121 let mut value_node_name: Option<std::string::String> = None;
122 let mut value_node_selector: Option<crate::api::core::v1::NodeSelector> = None;
123 let mut value_taints: Option<std::vec::Vec<crate::api::resource::v1beta1::DeviceTaint>> = None;
124
125 while let Some(key) = crate::serde::de::MapAccess::next_key::<Field>(&mut map)? {
126 match key {
127 Field::Key_all_nodes => value_all_nodes = crate::serde::de::MapAccess::next_value(&mut map)?,
128 Field::Key_attributes => value_attributes = crate::serde::de::MapAccess::next_value(&mut map)?,
129 Field::Key_capacity => value_capacity = crate::serde::de::MapAccess::next_value(&mut map)?,
130 Field::Key_consumes_counters => value_consumes_counters = crate::serde::de::MapAccess::next_value(&mut map)?,
131 Field::Key_node_name => value_node_name = crate::serde::de::MapAccess::next_value(&mut map)?,
132 Field::Key_node_selector => value_node_selector = crate::serde::de::MapAccess::next_value(&mut map)?,
133 Field::Key_taints => value_taints = crate::serde::de::MapAccess::next_value(&mut map)?,
134 Field::Other => { let _: crate::serde::de::IgnoredAny = crate::serde::de::MapAccess::next_value(&mut map)?; },
135 }
136 }
137
138 Ok(BasicDevice {
139 all_nodes: value_all_nodes,
140 attributes: value_attributes,
141 capacity: value_capacity,
142 consumes_counters: value_consumes_counters,
143 node_name: value_node_name,
144 node_selector: value_node_selector,
145 taints: value_taints,
146 })
147 }
148 }
149
150 deserializer.deserialize_struct(
151 "BasicDevice",
152 &[
153 "allNodes",
154 "attributes",
155 "capacity",
156 "consumesCounters",
157 "nodeName",
158 "nodeSelector",
159 "taints",
160 ],
161 Visitor,
162 )
163 }
164}
165
166impl crate::serde::Serialize for BasicDevice {
167 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: crate::serde::Serializer {
168 let mut state = serializer.serialize_struct(
169 "BasicDevice",
170 self.all_nodes.as_ref().map_or(0, |_| 1) +
171 self.attributes.as_ref().map_or(0, |_| 1) +
172 self.capacity.as_ref().map_or(0, |_| 1) +
173 self.consumes_counters.as_ref().map_or(0, |_| 1) +
174 self.node_name.as_ref().map_or(0, |_| 1) +
175 self.node_selector.as_ref().map_or(0, |_| 1) +
176 self.taints.as_ref().map_or(0, |_| 1),
177 )?;
178 if let Some(value) = &self.all_nodes {
179 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "allNodes", value)?;
180 }
181 if let Some(value) = &self.attributes {
182 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "attributes", value)?;
183 }
184 if let Some(value) = &self.capacity {
185 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "capacity", value)?;
186 }
187 if let Some(value) = &self.consumes_counters {
188 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "consumesCounters", value)?;
189 }
190 if let Some(value) = &self.node_name {
191 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "nodeName", value)?;
192 }
193 if let Some(value) = &self.node_selector {
194 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "nodeSelector", value)?;
195 }
196 if let Some(value) = &self.taints {
197 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "taints", value)?;
198 }
199 crate::serde::ser::SerializeStruct::end(state)
200 }
201}
202
203#[cfg(feature = "schemars")]
204impl crate::schemars::JsonSchema for BasicDevice {
205 fn schema_name() -> std::string::String {
206 "io.k8s.api.resource.v1beta1.BasicDevice".into()
207 }
208
209 fn json_schema(__gen: &mut crate::schemars::gen::SchemaGenerator) -> crate::schemars::schema::Schema {
210 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
211 metadata: Some(std::boxed::Box::new(crate::schemars::schema::Metadata {
212 description: Some("BasicDevice defines one device instance.".into()),
213 ..Default::default()
214 })),
215 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(std::boxed::Box::new(crate::schemars::schema::InstanceType::Object))),
216 object: Some(std::boxed::Box::new(crate::schemars::schema::ObjectValidation {
217 properties: [
218 (
219 "allNodes".into(),
220 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
221 metadata: Some(std::boxed::Box::new(crate::schemars::schema::Metadata {
222 description: Some("AllNodes indicates that all nodes have access to the device.\n\nMust only be set if Spec.PerDeviceNodeSelection is set to true. At most one of NodeName, NodeSelector and AllNodes can be set.".into()),
223 ..Default::default()
224 })),
225 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(std::boxed::Box::new(crate::schemars::schema::InstanceType::Boolean))),
226 ..Default::default()
227 }),
228 ),
229 (
230 "attributes".into(),
231 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
232 metadata: Some(std::boxed::Box::new(crate::schemars::schema::Metadata {
233 description: Some("Attributes defines the set of attributes for this device. The name of each attribute must be unique in that set.\n\nThe maximum number of attributes and capacities combined is 32.".into()),
234 ..Default::default()
235 })),
236 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(std::boxed::Box::new(crate::schemars::schema::InstanceType::Object))),
237 object: Some(std::boxed::Box::new(crate::schemars::schema::ObjectValidation {
238 additional_properties: Some(std::boxed::Box::new(__gen.subschema_for::<crate::api::resource::v1beta1::DeviceAttribute>())),
239 ..Default::default()
240 })),
241 ..Default::default()
242 }),
243 ),
244 (
245 "capacity".into(),
246 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
247 metadata: Some(std::boxed::Box::new(crate::schemars::schema::Metadata {
248 description: Some("Capacity defines the set of capacities for this device. The name of each capacity must be unique in that set.\n\nThe maximum number of attributes and capacities combined is 32.".into()),
249 ..Default::default()
250 })),
251 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(std::boxed::Box::new(crate::schemars::schema::InstanceType::Object))),
252 object: Some(std::boxed::Box::new(crate::schemars::schema::ObjectValidation {
253 additional_properties: Some(std::boxed::Box::new(__gen.subschema_for::<crate::api::resource::v1beta1::DeviceCapacity>())),
254 ..Default::default()
255 })),
256 ..Default::default()
257 }),
258 ),
259 (
260 "consumesCounters".into(),
261 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
262 metadata: Some(std::boxed::Box::new(crate::schemars::schema::Metadata {
263 description: Some("ConsumesCounters defines a list of references to sharedCounters and the set of counters that the device will consume from those counter sets.\n\nThere can only be a single entry per counterSet.\n\nThe total number of device counter consumption entries must be <= 32. In addition, the total number in the entire ResourceSlice must be <= 1024 (for example, 64 devices with 16 counters each).".into()),
264 ..Default::default()
265 })),
266 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(std::boxed::Box::new(crate::schemars::schema::InstanceType::Array))),
267 array: Some(std::boxed::Box::new(crate::schemars::schema::ArrayValidation {
268 items: Some(crate::schemars::schema::SingleOrVec::Single(std::boxed::Box::new(__gen.subschema_for::<crate::api::resource::v1beta1::DeviceCounterConsumption>()))),
269 ..Default::default()
270 })),
271 ..Default::default()
272 }),
273 ),
274 (
275 "nodeName".into(),
276 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
277 metadata: Some(std::boxed::Box::new(crate::schemars::schema::Metadata {
278 description: Some("NodeName identifies the node where the device is available.\n\nMust only be set if Spec.PerDeviceNodeSelection is set to true. At most one of NodeName, NodeSelector and AllNodes can be set.".into()),
279 ..Default::default()
280 })),
281 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(std::boxed::Box::new(crate::schemars::schema::InstanceType::String))),
282 ..Default::default()
283 }),
284 ),
285 (
286 "nodeSelector".into(),
287 {
288 let mut schema_obj = __gen.subschema_for::<crate::api::core::v1::NodeSelector>().into_object();
289 schema_obj.metadata = Some(std::boxed::Box::new(crate::schemars::schema::Metadata {
290 description: Some("NodeSelector defines the nodes where the device is available.\n\nMust use exactly one term.\n\nMust only be set if Spec.PerDeviceNodeSelection is set to true. At most one of NodeName, NodeSelector and AllNodes can be set.".into()),
291 ..Default::default()
292 }));
293 crate::schemars::schema::Schema::Object(schema_obj)
294 },
295 ),
296 (
297 "taints".into(),
298 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
299 metadata: Some(std::boxed::Box::new(crate::schemars::schema::Metadata {
300 description: Some("If specified, these are the driver-defined taints.\n\nThe maximum number of taints is 4.\n\nThis is an alpha field and requires enabling the DRADeviceTaints feature gate.".into()),
301 ..Default::default()
302 })),
303 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(std::boxed::Box::new(crate::schemars::schema::InstanceType::Array))),
304 array: Some(std::boxed::Box::new(crate::schemars::schema::ArrayValidation {
305 items: Some(crate::schemars::schema::SingleOrVec::Single(std::boxed::Box::new(__gen.subschema_for::<crate::api::resource::v1beta1::DeviceTaint>()))),
306 ..Default::default()
307 })),
308 ..Default::default()
309 }),
310 ),
311 ].into(),
312 ..Default::default()
313 })),
314 ..Default::default()
315 })
316 }
317}