#[derive(Clone, Debug, Default, PartialEq)]
pub struct StorageClass {
pub allow_volume_expansion: Option<bool>,
pub allowed_topologies: Option<Vec<crate::api::core::v1::TopologySelectorTerm>>,
pub metadata: crate::apimachinery::pkg::apis::meta::v1::ObjectMeta,
pub mount_options: Option<Vec<String>>,
pub parameters: Option<std::collections::BTreeMap<String, String>>,
pub provisioner: String,
pub reclaim_policy: Option<String>,
pub volume_binding_mode: Option<String>,
}
impl crate::Resource for StorageClass {
const API_VERSION: &'static str = "storage.k8s.io/v1";
const GROUP: &'static str = "storage.k8s.io";
const KIND: &'static str = "StorageClass";
const VERSION: &'static str = "v1";
const URL_PATH_SEGMENT: &'static str = "storageclasses";
type Scope = crate::ClusterResourceScope;
}
impl crate::ListableResource for StorageClass {
const LIST_KIND: &'static str = "StorageClassList";
}
impl crate::Metadata for StorageClass {
type Ty = crate::apimachinery::pkg::apis::meta::v1::ObjectMeta;
fn metadata(&self) -> &<Self as crate::Metadata>::Ty {
&self.metadata
}
fn metadata_mut(&mut self) -> &mut<Self as crate::Metadata>::Ty {
&mut self.metadata
}
}
impl crate::DeepMerge for StorageClass {
fn merge_from(&mut self, other: Self) {
crate::DeepMerge::merge_from(&mut self.allow_volume_expansion, other.allow_volume_expansion);
crate::merge_strategies::list::atomic(&mut self.allowed_topologies, other.allowed_topologies);
crate::DeepMerge::merge_from(&mut self.metadata, other.metadata);
crate::merge_strategies::list::atomic(&mut self.mount_options, other.mount_options);
crate::merge_strategies::map::granular(&mut self.parameters, other.parameters, |current_item, other_item| {
crate::DeepMerge::merge_from(current_item, other_item);
});
crate::DeepMerge::merge_from(&mut self.provisioner, other.provisioner);
crate::DeepMerge::merge_from(&mut self.reclaim_policy, other.reclaim_policy);
crate::DeepMerge::merge_from(&mut self.volume_binding_mode, other.volume_binding_mode);
}
}
impl<'de> crate::serde::Deserialize<'de> for StorageClass {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: crate::serde::Deserializer<'de> {
#[allow(non_camel_case_types)]
enum Field {
Key_api_version,
Key_kind,
Key_allow_volume_expansion,
Key_allowed_topologies,
Key_metadata,
Key_mount_options,
Key_parameters,
Key_provisioner,
Key_reclaim_policy,
Key_volume_binding_mode,
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 crate::serde::de::Visitor<'_> 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 {
"apiVersion" => Field::Key_api_version,
"kind" => Field::Key_kind,
"allowVolumeExpansion" => Field::Key_allow_volume_expansion,
"allowedTopologies" => Field::Key_allowed_topologies,
"metadata" => Field::Key_metadata,
"mountOptions" => Field::Key_mount_options,
"parameters" => Field::Key_parameters,
"provisioner" => Field::Key_provisioner,
"reclaimPolicy" => Field::Key_reclaim_policy,
"volumeBindingMode" => Field::Key_volume_binding_mode,
_ => Field::Other,
})
}
}
deserializer.deserialize_identifier(Visitor)
}
}
struct Visitor;
impl<'de> crate::serde::de::Visitor<'de> for Visitor {
type Value = StorageClass;
fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(<Self::Value as crate::Resource>::KIND)
}
fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> where A: crate::serde::de::MapAccess<'de> {
let mut value_allow_volume_expansion: Option<bool> = None;
let mut value_allowed_topologies: Option<Vec<crate::api::core::v1::TopologySelectorTerm>> = None;
let mut value_metadata: Option<crate::apimachinery::pkg::apis::meta::v1::ObjectMeta> = None;
let mut value_mount_options: Option<Vec<String>> = None;
let mut value_parameters: Option<std::collections::BTreeMap<String, String>> = None;
let mut value_provisioner: Option<String> = None;
let mut value_reclaim_policy: Option<String> = None;
let mut value_volume_binding_mode: Option<String> = None;
while let Some(key) = crate::serde::de::MapAccess::next_key::<Field>(&mut map)? {
match key {
Field::Key_api_version => {
let value_api_version: String = crate::serde::de::MapAccess::next_value(&mut map)?;
if value_api_version != <Self::Value as crate::Resource>::API_VERSION {
return Err(crate::serde::de::Error::invalid_value(crate::serde::de::Unexpected::Str(&value_api_version), &<Self::Value as crate::Resource>::API_VERSION));
}
},
Field::Key_kind => {
let value_kind: String = crate::serde::de::MapAccess::next_value(&mut map)?;
if value_kind != <Self::Value as crate::Resource>::KIND {
return Err(crate::serde::de::Error::invalid_value(crate::serde::de::Unexpected::Str(&value_kind), &<Self::Value as crate::Resource>::KIND));
}
},
Field::Key_allow_volume_expansion => value_allow_volume_expansion = crate::serde::de::MapAccess::next_value(&mut map)?,
Field::Key_allowed_topologies => value_allowed_topologies = crate::serde::de::MapAccess::next_value(&mut map)?,
Field::Key_metadata => value_metadata = crate::serde::de::MapAccess::next_value(&mut map)?,
Field::Key_mount_options => value_mount_options = crate::serde::de::MapAccess::next_value(&mut map)?,
Field::Key_parameters => value_parameters = crate::serde::de::MapAccess::next_value(&mut map)?,
Field::Key_provisioner => value_provisioner = crate::serde::de::MapAccess::next_value(&mut map)?,
Field::Key_reclaim_policy => value_reclaim_policy = crate::serde::de::MapAccess::next_value(&mut map)?,
Field::Key_volume_binding_mode => value_volume_binding_mode = crate::serde::de::MapAccess::next_value(&mut map)?,
Field::Other => { let _: crate::serde::de::IgnoredAny = crate::serde::de::MapAccess::next_value(&mut map)?; },
}
}
Ok(StorageClass {
allow_volume_expansion: value_allow_volume_expansion,
allowed_topologies: value_allowed_topologies,
metadata: value_metadata.unwrap_or_default(),
mount_options: value_mount_options,
parameters: value_parameters,
provisioner: value_provisioner.unwrap_or_default(),
reclaim_policy: value_reclaim_policy,
volume_binding_mode: value_volume_binding_mode,
})
}
}
deserializer.deserialize_struct(
<Self as crate::Resource>::KIND,
&[
"apiVersion",
"kind",
"allowVolumeExpansion",
"allowedTopologies",
"metadata",
"mountOptions",
"parameters",
"provisioner",
"reclaimPolicy",
"volumeBindingMode",
],
Visitor,
)
}
}
impl crate::serde::Serialize for StorageClass {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: crate::serde::Serializer {
let mut state = serializer.serialize_struct(
<Self as crate::Resource>::KIND,
4 +
self.allow_volume_expansion.as_ref().map_or(0, |_| 1) +
self.allowed_topologies.as_ref().map_or(0, |_| 1) +
self.mount_options.as_ref().map_or(0, |_| 1) +
self.parameters.as_ref().map_or(0, |_| 1) +
self.reclaim_policy.as_ref().map_or(0, |_| 1) +
self.volume_binding_mode.as_ref().map_or(0, |_| 1),
)?;
crate::serde::ser::SerializeStruct::serialize_field(&mut state, "apiVersion", <Self as crate::Resource>::API_VERSION)?;
crate::serde::ser::SerializeStruct::serialize_field(&mut state, "kind", <Self as crate::Resource>::KIND)?;
if let Some(value) = &self.allow_volume_expansion {
crate::serde::ser::SerializeStruct::serialize_field(&mut state, "allowVolumeExpansion", value)?;
}
if let Some(value) = &self.allowed_topologies {
crate::serde::ser::SerializeStruct::serialize_field(&mut state, "allowedTopologies", value)?;
}
crate::serde::ser::SerializeStruct::serialize_field(&mut state, "metadata", &self.metadata)?;
if let Some(value) = &self.mount_options {
crate::serde::ser::SerializeStruct::serialize_field(&mut state, "mountOptions", value)?;
}
if let Some(value) = &self.parameters {
crate::serde::ser::SerializeStruct::serialize_field(&mut state, "parameters", value)?;
}
crate::serde::ser::SerializeStruct::serialize_field(&mut state, "provisioner", &self.provisioner)?;
if let Some(value) = &self.reclaim_policy {
crate::serde::ser::SerializeStruct::serialize_field(&mut state, "reclaimPolicy", value)?;
}
if let Some(value) = &self.volume_binding_mode {
crate::serde::ser::SerializeStruct::serialize_field(&mut state, "volumeBindingMode", value)?;
}
crate::serde::ser::SerializeStruct::end(state)
}
}
#[cfg(feature = "schemars")]
impl crate::schemars::JsonSchema for StorageClass {
fn schema_name() -> String {
"io.k8s.api.storage.v1.StorageClass".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("StorageClass describes the parameters for a class of storage for which PersistentVolumes can be dynamically provisioned.\n\nStorageClasses are non-namespaced; the name of the storage class according to etcd is in ObjectMeta.Name.".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: [
(
"allowVolumeExpansion".to_owned(),
crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
metadata: Some(Box::new(crate::schemars::schema::Metadata {
description: Some("allowVolumeExpansion shows whether the storage class allow volume expand.".to_owned()),
..Default::default()
})),
instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::Boolean))),
..Default::default()
}),
),
(
"allowedTopologies".to_owned(),
crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
metadata: Some(Box::new(crate::schemars::schema::Metadata {
description: Some("allowedTopologies restrict the node topologies where volumes can be dynamically provisioned. Each volume plugin defines its own supported topology specifications. An empty TopologySelectorTerm list means there is no topology restriction. This field is only honored by servers that enable the VolumeScheduling feature.".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(__gen.subschema_for::<crate::api::core::v1::TopologySelectorTerm>()))),
..Default::default()
})),
..Default::default()
}),
),
(
"apiVersion".to_owned(),
crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
metadata: Some(Box::new(crate::schemars::schema::Metadata {
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()),
..Default::default()
})),
instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
..Default::default()
}),
),
(
"kind".to_owned(),
crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
metadata: Some(Box::new(crate::schemars::schema::Metadata {
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()),
..Default::default()
})),
instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
..Default::default()
}),
),
(
"metadata".to_owned(),
{
let mut schema_obj = __gen.subschema_for::<crate::apimachinery::pkg::apis::meta::v1::ObjectMeta>().into_object();
schema_obj.metadata = Some(Box::new(crate::schemars::schema::Metadata {
description: Some("Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata".to_owned()),
..Default::default()
}));
crate::schemars::schema::Schema::Object(schema_obj)
},
),
(
"mountOptions".to_owned(),
crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
metadata: Some(Box::new(crate::schemars::schema::Metadata {
description: Some("mountOptions controls the mountOptions for dynamically provisioned PersistentVolumes of this storage class. e.g. [\"ro\", \"soft\"]. Not validated - mount of the PVs will simply fail if one is invalid.".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()
}),
),
(
"parameters".to_owned(),
crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
metadata: Some(Box::new(crate::schemars::schema::Metadata {
description: Some("parameters holds the parameters for the provisioner that should create volumes of this storage class.".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()
}),
),
(
"provisioner".to_owned(),
crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
metadata: Some(Box::new(crate::schemars::schema::Metadata {
description: Some("provisioner indicates the type of the provisioner.".to_owned()),
..Default::default()
})),
instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
..Default::default()
}),
),
(
"reclaimPolicy".to_owned(),
crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
metadata: Some(Box::new(crate::schemars::schema::Metadata {
description: Some("reclaimPolicy controls the reclaimPolicy for dynamically provisioned PersistentVolumes of this storage class. Defaults to Delete.".to_owned()),
..Default::default()
})),
instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
..Default::default()
}),
),
(
"volumeBindingMode".to_owned(),
crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
metadata: Some(Box::new(crate::schemars::schema::Metadata {
description: Some("volumeBindingMode indicates how PersistentVolumeClaims should be provisioned and bound. When unset, VolumeBindingImmediate is used. This field is only honored by servers that enable the VolumeScheduling feature.".to_owned()),
..Default::default()
})),
instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
..Default::default()
}),
),
].into(),
required: [
"metadata".to_owned(),
"provisioner".to_owned(),
].into(),
..Default::default()
})),
..Default::default()
})
}
}