Skip to content

Commit 6dfc996

Browse files
authored
Merge pull request kubernetes#77423 from apelisse/rollout-restart-other-workloads
Implement rollout restart for statefulset and daemonset
2 parents b276043 + 145935d commit 6dfc996

File tree

3 files changed

+56
-3
lines changed

3 files changed

+56
-3
lines changed

pkg/kubectl/cmd/rollout/rollout_restart.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,14 @@ var (
5454
restartLong = templates.LongDesc(`
5555
Restart a resource.
5656
57-
A deployment with the "RolloutStrategy" will be rolling restarted.`)
57+
Resource will be rollout restarted.`)
5858

5959
restartExample = templates.Examples(`
6060
# Restart a deployment
61-
kubectl rollout restart deployment/nginx`)
61+
kubectl rollout restart deployment/nginx
62+
63+
# Restart a daemonset
64+
kubectl rollout restart daemonset/abc`)
6265
)
6366

6467
// NewRolloutRestartOptions returns an initialized RestartOptions instance
@@ -73,7 +76,7 @@ func NewRolloutRestartOptions(streams genericclioptions.IOStreams) *RestartOptio
7376
func NewCmdRolloutRestart(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command {
7477
o := NewRolloutRestartOptions(streams)
7578

76-
validArgs := []string{"deployment"}
79+
validArgs := []string{"deployment", "daemonset", "statefulset"}
7780

7881
cmd := &cobra.Command{
7982
Use: "restart RESOURCE",

pkg/kubectl/polymorphichelpers/objectrestarter.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,48 @@ func defaultObjectRestarter(obj runtime.Object) ([]byte, error) {
7171
obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339)
7272
return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1beta1.SchemeGroupVersion), obj)
7373

74+
case *extensionsv1beta1.DaemonSet:
75+
if obj.Spec.Template.ObjectMeta.Annotations == nil {
76+
obj.Spec.Template.ObjectMeta.Annotations = make(map[string]string)
77+
}
78+
obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339)
79+
return runtime.Encode(scheme.Codecs.LegacyCodec(extensionsv1beta1.SchemeGroupVersion), obj)
80+
81+
case *appsv1.DaemonSet:
82+
if obj.Spec.Template.ObjectMeta.Annotations == nil {
83+
obj.Spec.Template.ObjectMeta.Annotations = make(map[string]string)
84+
}
85+
obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339)
86+
return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1.SchemeGroupVersion), obj)
87+
88+
case *appsv1beta2.DaemonSet:
89+
if obj.Spec.Template.ObjectMeta.Annotations == nil {
90+
obj.Spec.Template.ObjectMeta.Annotations = make(map[string]string)
91+
}
92+
obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339)
93+
return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1beta2.SchemeGroupVersion), obj)
94+
95+
case *appsv1.StatefulSet:
96+
if obj.Spec.Template.ObjectMeta.Annotations == nil {
97+
obj.Spec.Template.ObjectMeta.Annotations = make(map[string]string)
98+
}
99+
obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339)
100+
return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1.SchemeGroupVersion), obj)
101+
102+
case *appsv1beta1.StatefulSet:
103+
if obj.Spec.Template.ObjectMeta.Annotations == nil {
104+
obj.Spec.Template.ObjectMeta.Annotations = make(map[string]string)
105+
}
106+
obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339)
107+
return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1beta1.SchemeGroupVersion), obj)
108+
109+
case *appsv1beta2.StatefulSet:
110+
if obj.Spec.Template.ObjectMeta.Annotations == nil {
111+
obj.Spec.Template.ObjectMeta.Annotations = make(map[string]string)
112+
}
113+
obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339)
114+
return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1beta2.SchemeGroupVersion), obj)
115+
74116
default:
75117
return nil, fmt.Errorf("restarting is not supported")
76118
}

test/cmd/apps.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ run_daemonset_tests() {
4343
kubectl set resources daemonsets/bind "${kube_flags[@]:?}" --limits=cpu=200m,memory=512Mi
4444
kube::test::get_object_assert 'daemonsets bind' "{{${template_generation_field:?}}}" '4'
4545

46+
# Rollout restart should change generation
47+
kubectl rollout restart daemonset/bind "${kube_flags[@]}"
48+
kube::test::get_object_assert 'daemonsets bind' "{{${template_generation_field}}}" '5'
49+
4650
# Clean up
4751
kubectl delete -f hack/testdata/rollingupdate-daemonset.yaml "${kube_flags[@]:?}"
4852

@@ -488,6 +492,10 @@ run_stateful_set_tests() {
488492
# TODO: test robust scaling in an e2e.
489493
wait-for-pods-with-label "app=nginx-statefulset" "nginx-0"
490494

495+
# Rollout restart should change generation
496+
kubectl rollout restart statefulset nginx "${kube_flags[@]}"
497+
kube::test::get_object_assert 'statefulset nginx' "{{$statefulset_observed_generation}}" '3'
498+
491499
### Clean up
492500
kubectl delete -f hack/testdata/rollingupdate-statefulset.yaml "${kube_flags[@]:?}"
493501
# Post-condition: no pods from statefulset controller

0 commit comments

Comments
 (0)