1/*
2Copyright 2017 The Kubernetes Authors.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8    http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17package v1
18
19import (
20	appsv1 "k8s.io/api/apps/v1"
21	"k8s.io/apimachinery/pkg/runtime"
22	"k8s.io/apimachinery/pkg/util/intstr"
23)
24
25func addDefaultingFuncs(scheme *runtime.Scheme) error {
26	return RegisterDefaults(scheme)
27}
28
29// SetDefaults_Deployment sets additional defaults compared to its counterpart
30// in extensions. These addons are:
31// - MaxUnavailable during rolling update set to 25% (1 in extensions)
32// - MaxSurge value during rolling update set to 25% (1 in extensions)
33// - RevisionHistoryLimit set to 10 (not set in extensions)
34// - ProgressDeadlineSeconds set to 600s (not set in extensions)
35func SetDefaults_Deployment(obj *appsv1.Deployment) {
36	// Set DeploymentSpec.Replicas to 1 if it is not set.
37	if obj.Spec.Replicas == nil {
38		obj.Spec.Replicas = new(int32)
39		*obj.Spec.Replicas = 1
40	}
41	strategy := &obj.Spec.Strategy
42	// Set default DeploymentStrategyType as RollingUpdate.
43	if strategy.Type == "" {
44		strategy.Type = appsv1.RollingUpdateDeploymentStrategyType
45	}
46	if strategy.Type == appsv1.RollingUpdateDeploymentStrategyType {
47		if strategy.RollingUpdate == nil {
48			rollingUpdate := appsv1.RollingUpdateDeployment{}
49			strategy.RollingUpdate = &rollingUpdate
50		}
51		if strategy.RollingUpdate.MaxUnavailable == nil {
52			// Set default MaxUnavailable as 25% by default.
53			maxUnavailable := intstr.FromString("25%")
54			strategy.RollingUpdate.MaxUnavailable = &maxUnavailable
55		}
56		if strategy.RollingUpdate.MaxSurge == nil {
57			// Set default MaxSurge as 25% by default.
58			maxSurge := intstr.FromString("25%")
59			strategy.RollingUpdate.MaxSurge = &maxSurge
60		}
61	}
62	if obj.Spec.RevisionHistoryLimit == nil {
63		obj.Spec.RevisionHistoryLimit = new(int32)
64		*obj.Spec.RevisionHistoryLimit = 10
65	}
66	if obj.Spec.ProgressDeadlineSeconds == nil {
67		obj.Spec.ProgressDeadlineSeconds = new(int32)
68		*obj.Spec.ProgressDeadlineSeconds = 600
69	}
70}
71
72func SetDefaults_DaemonSet(obj *appsv1.DaemonSet) {
73	updateStrategy := &obj.Spec.UpdateStrategy
74	if updateStrategy.Type == "" {
75		updateStrategy.Type = appsv1.RollingUpdateDaemonSetStrategyType
76	}
77	if updateStrategy.Type == appsv1.RollingUpdateDaemonSetStrategyType {
78		if updateStrategy.RollingUpdate == nil {
79			rollingUpdate := appsv1.RollingUpdateDaemonSet{}
80			updateStrategy.RollingUpdate = &rollingUpdate
81		}
82		if updateStrategy.RollingUpdate.MaxUnavailable == nil {
83			// Set default MaxUnavailable as 1 by default.
84			maxUnavailable := intstr.FromInt(1)
85			updateStrategy.RollingUpdate.MaxUnavailable = &maxUnavailable
86		}
87		if updateStrategy.RollingUpdate.MaxSurge == nil {
88			// Set default MaxSurge as 0 by default.
89			maxSurge := intstr.FromInt(0)
90			updateStrategy.RollingUpdate.MaxSurge = &maxSurge
91		}
92	}
93	if obj.Spec.RevisionHistoryLimit == nil {
94		obj.Spec.RevisionHistoryLimit = new(int32)
95		*obj.Spec.RevisionHistoryLimit = 10
96	}
97}
98
99func SetDefaults_StatefulSet(obj *appsv1.StatefulSet) {
100	if len(obj.Spec.PodManagementPolicy) == 0 {
101		obj.Spec.PodManagementPolicy = appsv1.OrderedReadyPodManagement
102	}
103
104	if obj.Spec.UpdateStrategy.Type == "" {
105		obj.Spec.UpdateStrategy.Type = appsv1.RollingUpdateStatefulSetStrategyType
106
107		if obj.Spec.UpdateStrategy.RollingUpdate == nil {
108			// UpdateStrategy.RollingUpdate will take default values below.
109			obj.Spec.UpdateStrategy.RollingUpdate = &appsv1.RollingUpdateStatefulSetStrategy{}
110		}
111	}
112
113	if obj.Spec.UpdateStrategy.Type == appsv1.RollingUpdateStatefulSetStrategyType &&
114		obj.Spec.UpdateStrategy.RollingUpdate != nil &&
115		obj.Spec.UpdateStrategy.RollingUpdate.Partition == nil {
116		obj.Spec.UpdateStrategy.RollingUpdate.Partition = new(int32)
117		*obj.Spec.UpdateStrategy.RollingUpdate.Partition = 0
118	}
119
120	if obj.Spec.Replicas == nil {
121		obj.Spec.Replicas = new(int32)
122		*obj.Spec.Replicas = 1
123	}
124	if obj.Spec.RevisionHistoryLimit == nil {
125		obj.Spec.RevisionHistoryLimit = new(int32)
126		*obj.Spec.RevisionHistoryLimit = 10
127	}
128}
129func SetDefaults_ReplicaSet(obj *appsv1.ReplicaSet) {
130	if obj.Spec.Replicas == nil {
131		obj.Spec.Replicas = new(int32)
132		*obj.Spec.Replicas = 1
133	}
134}
135