k8s_openapi/v1_32/api/storage/v1alpha1/
volume_attributes_class.rs1#[derive(Clone, Debug, Default, PartialEq)]
5pub struct VolumeAttributesClass {
6 pub driver_name: String,
8
9 pub metadata: crate::apimachinery::pkg::apis::meta::v1::ObjectMeta,
11
12 pub parameters: Option<std::collections::BTreeMap<String, String>>,
16}
17
18impl crate::Resource for VolumeAttributesClass {
19 const API_VERSION: &'static str = "storage.k8s.io/v1alpha1";
20 const GROUP: &'static str = "storage.k8s.io";
21 const KIND: &'static str = "VolumeAttributesClass";
22 const VERSION: &'static str = "v1alpha1";
23 const URL_PATH_SEGMENT: &'static str = "volumeattributesclasses";
24 type Scope = crate::ClusterResourceScope;
25}
26
27impl crate::ListableResource for VolumeAttributesClass {
28 const LIST_KIND: &'static str = "VolumeAttributesClassList";
29}
30
31impl crate::Metadata for VolumeAttributesClass {
32 type Ty = crate::apimachinery::pkg::apis::meta::v1::ObjectMeta;
33
34 fn metadata(&self) -> &<Self as crate::Metadata>::Ty {
35 &self.metadata
36 }
37
38 fn metadata_mut(&mut self) -> &mut<Self as crate::Metadata>::Ty {
39 &mut self.metadata
40 }
41}
42
43impl crate::DeepMerge for VolumeAttributesClass {
44 fn merge_from(&mut self, other: Self) {
45 crate::DeepMerge::merge_from(&mut self.driver_name, other.driver_name);
46 crate::DeepMerge::merge_from(&mut self.metadata, other.metadata);
47 crate::merge_strategies::map::granular(&mut self.parameters, other.parameters, |current_item, other_item| {
48 crate::DeepMerge::merge_from(current_item, other_item);
49 });
50 }
51}
52
53impl<'de> crate::serde::Deserialize<'de> for VolumeAttributesClass {
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_driver_name,
60 Key_metadata,
61 Key_parameters,
62 Other,
63 }
64
65 impl<'de> crate::serde::Deserialize<'de> for Field {
66 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: crate::serde::Deserializer<'de> {
67 struct Visitor;
68
69 impl crate::serde::de::Visitor<'_> for Visitor {
70 type Value = Field;
71
72 fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
73 f.write_str("field identifier")
74 }
75
76 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> where E: crate::serde::de::Error {
77 Ok(match v {
78 "apiVersion" => Field::Key_api_version,
79 "kind" => Field::Key_kind,
80 "driverName" => Field::Key_driver_name,
81 "metadata" => Field::Key_metadata,
82 "parameters" => Field::Key_parameters,
83 _ => Field::Other,
84 })
85 }
86 }
87
88 deserializer.deserialize_identifier(Visitor)
89 }
90 }
91
92 struct Visitor;
93
94 impl<'de> crate::serde::de::Visitor<'de> for Visitor {
95 type Value = VolumeAttributesClass;
96
97 fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
98 f.write_str(<Self::Value as crate::Resource>::KIND)
99 }
100
101 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> where A: crate::serde::de::MapAccess<'de> {
102 let mut value_driver_name: Option<String> = None;
103 let mut value_metadata: Option<crate::apimachinery::pkg::apis::meta::v1::ObjectMeta> = None;
104 let mut value_parameters: Option<std::collections::BTreeMap<String, String>> = None;
105
106 while let Some(key) = crate::serde::de::MapAccess::next_key::<Field>(&mut map)? {
107 match key {
108 Field::Key_api_version => {
109 let value_api_version: String = crate::serde::de::MapAccess::next_value(&mut map)?;
110 if value_api_version != <Self::Value as crate::Resource>::API_VERSION {
111 return Err(crate::serde::de::Error::invalid_value(crate::serde::de::Unexpected::Str(&value_api_version), &<Self::Value as crate::Resource>::API_VERSION));
112 }
113 },
114 Field::Key_kind => {
115 let value_kind: String = crate::serde::de::MapAccess::next_value(&mut map)?;
116 if value_kind != <Self::Value as crate::Resource>::KIND {
117 return Err(crate::serde::de::Error::invalid_value(crate::serde::de::Unexpected::Str(&value_kind), &<Self::Value as crate::Resource>::KIND));
118 }
119 },
120 Field::Key_driver_name => value_driver_name = crate::serde::de::MapAccess::next_value(&mut map)?,
121 Field::Key_metadata => value_metadata = crate::serde::de::MapAccess::next_value(&mut map)?,
122 Field::Key_parameters => value_parameters = crate::serde::de::MapAccess::next_value(&mut map)?,
123 Field::Other => { let _: crate::serde::de::IgnoredAny = crate::serde::de::MapAccess::next_value(&mut map)?; },
124 }
125 }
126
127 Ok(VolumeAttributesClass {
128 driver_name: value_driver_name.unwrap_or_default(),
129 metadata: value_metadata.unwrap_or_default(),
130 parameters: value_parameters,
131 })
132 }
133 }
134
135 deserializer.deserialize_struct(
136 <Self as crate::Resource>::KIND,
137 &[
138 "apiVersion",
139 "kind",
140 "driverName",
141 "metadata",
142 "parameters",
143 ],
144 Visitor,
145 )
146 }
147}
148
149impl crate::serde::Serialize for VolumeAttributesClass {
150 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: crate::serde::Serializer {
151 let mut state = serializer.serialize_struct(
152 <Self as crate::Resource>::KIND,
153 4 +
154 self.parameters.as_ref().map_or(0, |_| 1),
155 )?;
156 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "apiVersion", <Self as crate::Resource>::API_VERSION)?;
157 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "kind", <Self as crate::Resource>::KIND)?;
158 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "driverName", &self.driver_name)?;
159 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "metadata", &self.metadata)?;
160 if let Some(value) = &self.parameters {
161 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "parameters", value)?;
162 }
163 crate::serde::ser::SerializeStruct::end(state)
164 }
165}
166
167#[cfg(feature = "schemars")]
168impl crate::schemars::JsonSchema for VolumeAttributesClass {
169 fn schema_name() -> String {
170 "io.k8s.api.storage.v1alpha1.VolumeAttributesClass".to_owned()
171 }
172
173 fn json_schema(__gen: &mut crate::schemars::gen::SchemaGenerator) -> crate::schemars::schema::Schema {
174 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
175 metadata: Some(Box::new(crate::schemars::schema::Metadata {
176 description: Some("VolumeAttributesClass represents a specification of mutable volume attributes defined by the CSI driver. The class can be specified during dynamic provisioning of PersistentVolumeClaims, and changed in the PersistentVolumeClaim spec after provisioning.".to_owned()),
177 ..Default::default()
178 })),
179 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::Object))),
180 object: Some(Box::new(crate::schemars::schema::ObjectValidation {
181 properties: [
182 (
183 "apiVersion".to_owned(),
184 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
185 metadata: Some(Box::new(crate::schemars::schema::Metadata {
186 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()),
187 ..Default::default()
188 })),
189 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
190 ..Default::default()
191 }),
192 ),
193 (
194 "driverName".to_owned(),
195 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
196 metadata: Some(Box::new(crate::schemars::schema::Metadata {
197 description: Some("Name of the CSI driver This field is immutable.".to_owned()),
198 ..Default::default()
199 })),
200 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
201 ..Default::default()
202 }),
203 ),
204 (
205 "kind".to_owned(),
206 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
207 metadata: Some(Box::new(crate::schemars::schema::Metadata {
208 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()),
209 ..Default::default()
210 })),
211 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
212 ..Default::default()
213 }),
214 ),
215 (
216 "metadata".to_owned(),
217 {
218 let mut schema_obj = __gen.subschema_for::<crate::apimachinery::pkg::apis::meta::v1::ObjectMeta>().into_object();
219 schema_obj.metadata = Some(Box::new(crate::schemars::schema::Metadata {
220 description: Some("Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata".to_owned()),
221 ..Default::default()
222 }));
223 crate::schemars::schema::Schema::Object(schema_obj)
224 },
225 ),
226 (
227 "parameters".to_owned(),
228 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
229 metadata: Some(Box::new(crate::schemars::schema::Metadata {
230 description: Some("parameters hold volume attributes defined by the CSI driver. These values are opaque to the Kubernetes and are passed directly to the CSI driver. The underlying storage provider supports changing these attributes on an existing volume, however the parameters field itself is immutable. To invoke a volume update, a new VolumeAttributesClass should be created with new parameters, and the PersistentVolumeClaim should be updated to reference the new VolumeAttributesClass.\n\nThis field is required and must contain at least one key/value pair. The keys cannot be empty, and the maximum number of parameters is 512, with a cumulative max size of 256K. If the CSI driver rejects invalid parameters, the target PersistentVolumeClaim will be set to an \"Infeasible\" state in the modifyVolumeStatus field.".to_owned()),
231 ..Default::default()
232 })),
233 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::Object))),
234 object: Some(Box::new(crate::schemars::schema::ObjectValidation {
235 additional_properties: Some(Box::new(
236 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
237 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
238 ..Default::default()
239 })
240 )),
241 ..Default::default()
242 })),
243 ..Default::default()
244 }),
245 ),
246 ].into(),
247 required: [
248 "driverName".to_owned(),
249 "metadata".to_owned(),
250 ].into(),
251 ..Default::default()
252 })),
253 ..Default::default()
254 })
255 }
256}