k8s_openapi/v1_32/api/apps/v1/
deployment_spec.rs

1// Generated from definition io.k8s.api.apps.v1.DeploymentSpec
2
3/// DeploymentSpec is the specification of the desired behavior of the Deployment.
4#[derive(Clone, Debug, Default, PartialEq)]
5pub struct DeploymentSpec {
6    /// Minimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)
7    pub min_ready_seconds: Option<i32>,
8
9    /// Indicates that the deployment is paused.
10    pub paused: Option<bool>,
11
12    /// The maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Note that progress will not be estimated during the time a deployment is paused. Defaults to 600s.
13    pub progress_deadline_seconds: Option<i32>,
14
15    /// Number of desired pods. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1.
16    pub replicas: Option<i32>,
17
18    /// The number of old ReplicaSets to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. Defaults to 10.
19    pub revision_history_limit: Option<i32>,
20
21    /// Label selector for pods. Existing ReplicaSets whose pods are selected by this will be the ones affected by this deployment. It must match the pod template's labels.
22    pub selector: crate::apimachinery::pkg::apis::meta::v1::LabelSelector,
23
24    /// The deployment strategy to use to replace existing pods with new ones.
25    pub strategy: Option<crate::api::apps::v1::DeploymentStrategy>,
26
27    /// Template describes the pods that will be created. The only allowed template.spec.restartPolicy value is "Always".
28    pub template: crate::api::core::v1::PodTemplateSpec,
29}
30
31impl crate::DeepMerge for DeploymentSpec {
32    fn merge_from(&mut self, other: Self) {
33        crate::DeepMerge::merge_from(&mut self.min_ready_seconds, other.min_ready_seconds);
34        crate::DeepMerge::merge_from(&mut self.paused, other.paused);
35        crate::DeepMerge::merge_from(&mut self.progress_deadline_seconds, other.progress_deadline_seconds);
36        crate::DeepMerge::merge_from(&mut self.replicas, other.replicas);
37        crate::DeepMerge::merge_from(&mut self.revision_history_limit, other.revision_history_limit);
38        crate::DeepMerge::merge_from(&mut self.selector, other.selector);
39        crate::DeepMerge::merge_from(&mut self.strategy, other.strategy);
40        crate::DeepMerge::merge_from(&mut self.template, other.template);
41    }
42}
43
44impl<'de> crate::serde::Deserialize<'de> for DeploymentSpec {
45    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: crate::serde::Deserializer<'de> {
46        #[allow(non_camel_case_types)]
47        enum Field {
48            Key_min_ready_seconds,
49            Key_paused,
50            Key_progress_deadline_seconds,
51            Key_replicas,
52            Key_revision_history_limit,
53            Key_selector,
54            Key_strategy,
55            Key_template,
56            Other,
57        }
58
59        impl<'de> crate::serde::Deserialize<'de> for Field {
60            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: crate::serde::Deserializer<'de> {
61                struct Visitor;
62
63                impl crate::serde::de::Visitor<'_> for Visitor {
64                    type Value = Field;
65
66                    fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
67                        f.write_str("field identifier")
68                    }
69
70                    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> where E: crate::serde::de::Error {
71                        Ok(match v {
72                            "minReadySeconds" => Field::Key_min_ready_seconds,
73                            "paused" => Field::Key_paused,
74                            "progressDeadlineSeconds" => Field::Key_progress_deadline_seconds,
75                            "replicas" => Field::Key_replicas,
76                            "revisionHistoryLimit" => Field::Key_revision_history_limit,
77                            "selector" => Field::Key_selector,
78                            "strategy" => Field::Key_strategy,
79                            "template" => Field::Key_template,
80                            _ => Field::Other,
81                        })
82                    }
83                }
84
85                deserializer.deserialize_identifier(Visitor)
86            }
87        }
88
89        struct Visitor;
90
91        impl<'de> crate::serde::de::Visitor<'de> for Visitor {
92            type Value = DeploymentSpec;
93
94            fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
95                f.write_str("DeploymentSpec")
96            }
97
98            fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> where A: crate::serde::de::MapAccess<'de> {
99                let mut value_min_ready_seconds: Option<i32> = None;
100                let mut value_paused: Option<bool> = None;
101                let mut value_progress_deadline_seconds: Option<i32> = None;
102                let mut value_replicas: Option<i32> = None;
103                let mut value_revision_history_limit: Option<i32> = None;
104                let mut value_selector: Option<crate::apimachinery::pkg::apis::meta::v1::LabelSelector> = None;
105                let mut value_strategy: Option<crate::api::apps::v1::DeploymentStrategy> = None;
106                let mut value_template: Option<crate::api::core::v1::PodTemplateSpec> = None;
107
108                while let Some(key) = crate::serde::de::MapAccess::next_key::<Field>(&mut map)? {
109                    match key {
110                        Field::Key_min_ready_seconds => value_min_ready_seconds = crate::serde::de::MapAccess::next_value(&mut map)?,
111                        Field::Key_paused => value_paused = crate::serde::de::MapAccess::next_value(&mut map)?,
112                        Field::Key_progress_deadline_seconds => value_progress_deadline_seconds = crate::serde::de::MapAccess::next_value(&mut map)?,
113                        Field::Key_replicas => value_replicas = crate::serde::de::MapAccess::next_value(&mut map)?,
114                        Field::Key_revision_history_limit => value_revision_history_limit = crate::serde::de::MapAccess::next_value(&mut map)?,
115                        Field::Key_selector => value_selector = crate::serde::de::MapAccess::next_value(&mut map)?,
116                        Field::Key_strategy => value_strategy = crate::serde::de::MapAccess::next_value(&mut map)?,
117                        Field::Key_template => value_template = crate::serde::de::MapAccess::next_value(&mut map)?,
118                        Field::Other => { let _: crate::serde::de::IgnoredAny = crate::serde::de::MapAccess::next_value(&mut map)?; },
119                    }
120                }
121
122                Ok(DeploymentSpec {
123                    min_ready_seconds: value_min_ready_seconds,
124                    paused: value_paused,
125                    progress_deadline_seconds: value_progress_deadline_seconds,
126                    replicas: value_replicas,
127                    revision_history_limit: value_revision_history_limit,
128                    selector: value_selector.unwrap_or_default(),
129                    strategy: value_strategy,
130                    template: value_template.unwrap_or_default(),
131                })
132            }
133        }
134
135        deserializer.deserialize_struct(
136            "DeploymentSpec",
137            &[
138                "minReadySeconds",
139                "paused",
140                "progressDeadlineSeconds",
141                "replicas",
142                "revisionHistoryLimit",
143                "selector",
144                "strategy",
145                "template",
146            ],
147            Visitor,
148        )
149    }
150}
151
152impl crate::serde::Serialize for DeploymentSpec {
153    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: crate::serde::Serializer {
154        let mut state = serializer.serialize_struct(
155            "DeploymentSpec",
156            2 +
157            self.min_ready_seconds.as_ref().map_or(0, |_| 1) +
158            self.paused.as_ref().map_or(0, |_| 1) +
159            self.progress_deadline_seconds.as_ref().map_or(0, |_| 1) +
160            self.replicas.as_ref().map_or(0, |_| 1) +
161            self.revision_history_limit.as_ref().map_or(0, |_| 1) +
162            self.strategy.as_ref().map_or(0, |_| 1),
163        )?;
164        if let Some(value) = &self.min_ready_seconds {
165            crate::serde::ser::SerializeStruct::serialize_field(&mut state, "minReadySeconds", value)?;
166        }
167        if let Some(value) = &self.paused {
168            crate::serde::ser::SerializeStruct::serialize_field(&mut state, "paused", value)?;
169        }
170        if let Some(value) = &self.progress_deadline_seconds {
171            crate::serde::ser::SerializeStruct::serialize_field(&mut state, "progressDeadlineSeconds", value)?;
172        }
173        if let Some(value) = &self.replicas {
174            crate::serde::ser::SerializeStruct::serialize_field(&mut state, "replicas", value)?;
175        }
176        if let Some(value) = &self.revision_history_limit {
177            crate::serde::ser::SerializeStruct::serialize_field(&mut state, "revisionHistoryLimit", value)?;
178        }
179        crate::serde::ser::SerializeStruct::serialize_field(&mut state, "selector", &self.selector)?;
180        if let Some(value) = &self.strategy {
181            crate::serde::ser::SerializeStruct::serialize_field(&mut state, "strategy", value)?;
182        }
183        crate::serde::ser::SerializeStruct::serialize_field(&mut state, "template", &self.template)?;
184        crate::serde::ser::SerializeStruct::end(state)
185    }
186}
187
188#[cfg(feature = "schemars")]
189impl crate::schemars::JsonSchema for DeploymentSpec {
190    fn schema_name() -> String {
191        "io.k8s.api.apps.v1.DeploymentSpec".to_owned()
192    }
193
194    fn json_schema(__gen: &mut crate::schemars::gen::SchemaGenerator) -> crate::schemars::schema::Schema {
195        crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
196            metadata: Some(Box::new(crate::schemars::schema::Metadata {
197                description: Some("DeploymentSpec is the specification of the desired behavior of the Deployment.".to_owned()),
198                ..Default::default()
199            })),
200            instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::Object))),
201            object: Some(Box::new(crate::schemars::schema::ObjectValidation {
202                properties: [
203                    (
204                        "minReadySeconds".to_owned(),
205                        crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
206                            metadata: Some(Box::new(crate::schemars::schema::Metadata {
207                                description: Some("Minimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)".to_owned()),
208                                ..Default::default()
209                            })),
210                            instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::Integer))),
211                            format: Some("int32".to_owned()),
212                            ..Default::default()
213                        }),
214                    ),
215                    (
216                        "paused".to_owned(),
217                        crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
218                            metadata: Some(Box::new(crate::schemars::schema::Metadata {
219                                description: Some("Indicates that the deployment is paused.".to_owned()),
220                                ..Default::default()
221                            })),
222                            instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::Boolean))),
223                            ..Default::default()
224                        }),
225                    ),
226                    (
227                        "progressDeadlineSeconds".to_owned(),
228                        crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
229                            metadata: Some(Box::new(crate::schemars::schema::Metadata {
230                                description: Some("The maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Note that progress will not be estimated during the time a deployment is paused. Defaults to 600s.".to_owned()),
231                                ..Default::default()
232                            })),
233                            instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::Integer))),
234                            format: Some("int32".to_owned()),
235                            ..Default::default()
236                        }),
237                    ),
238                    (
239                        "replicas".to_owned(),
240                        crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
241                            metadata: Some(Box::new(crate::schemars::schema::Metadata {
242                                description: Some("Number of desired pods. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1.".to_owned()),
243                                ..Default::default()
244                            })),
245                            instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::Integer))),
246                            format: Some("int32".to_owned()),
247                            ..Default::default()
248                        }),
249                    ),
250                    (
251                        "revisionHistoryLimit".to_owned(),
252                        crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
253                            metadata: Some(Box::new(crate::schemars::schema::Metadata {
254                                description: Some("The number of old ReplicaSets to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. Defaults to 10.".to_owned()),
255                                ..Default::default()
256                            })),
257                            instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::Integer))),
258                            format: Some("int32".to_owned()),
259                            ..Default::default()
260                        }),
261                    ),
262                    (
263                        "selector".to_owned(),
264                        {
265                            let mut schema_obj = __gen.subschema_for::<crate::apimachinery::pkg::apis::meta::v1::LabelSelector>().into_object();
266                            schema_obj.metadata = Some(Box::new(crate::schemars::schema::Metadata {
267                                description: Some("Label selector for pods. Existing ReplicaSets whose pods are selected by this will be the ones affected by this deployment. It must match the pod template's labels.".to_owned()),
268                                ..Default::default()
269                            }));
270                            crate::schemars::schema::Schema::Object(schema_obj)
271                        },
272                    ),
273                    (
274                        "strategy".to_owned(),
275                        {
276                            let mut schema_obj = __gen.subschema_for::<crate::api::apps::v1::DeploymentStrategy>().into_object();
277                            schema_obj.metadata = Some(Box::new(crate::schemars::schema::Metadata {
278                                description: Some("The deployment strategy to use to replace existing pods with new ones.".to_owned()),
279                                ..Default::default()
280                            }));
281                            crate::schemars::schema::Schema::Object(schema_obj)
282                        },
283                    ),
284                    (
285                        "template".to_owned(),
286                        {
287                            let mut schema_obj = __gen.subschema_for::<crate::api::core::v1::PodTemplateSpec>().into_object();
288                            schema_obj.metadata = Some(Box::new(crate::schemars::schema::Metadata {
289                                description: Some("Template describes the pods that will be created. The only allowed template.spec.restartPolicy value is \"Always\".".to_owned()),
290                                ..Default::default()
291                            }));
292                            crate::schemars::schema::Schema::Object(schema_obj)
293                        },
294                    ),
295                ].into(),
296                required: [
297                    "selector".to_owned(),
298                    "template".to_owned(),
299                ].into(),
300                ..Default::default()
301            })),
302            ..Default::default()
303        })
304    }
305}