Implement rollout restart for statefulset and daemonset
This commit is contained in:
		| @@ -54,11 +54,14 @@ var ( | |||||||
| 	restartLong = templates.LongDesc(` | 	restartLong = templates.LongDesc(` | ||||||
| 		Restart a resource. | 		Restart a resource. | ||||||
|  |  | ||||||
| 	        A deployment with the "RolloutStrategy" will be rolling restarted.`) | 	        Resource will be rollout restarted.`) | ||||||
|  |  | ||||||
| 	restartExample = templates.Examples(` | 	restartExample = templates.Examples(` | ||||||
| 		# Restart a deployment | 		# Restart a deployment | ||||||
| 		kubectl rollout restart deployment/nginx`) | 		kubectl rollout restart deployment/nginx | ||||||
|  |  | ||||||
|  | 		# Restart a daemonset | ||||||
|  | 		kubectl rollout restart daemonset/abc`) | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // NewRolloutRestartOptions returns an initialized RestartOptions instance | // NewRolloutRestartOptions returns an initialized RestartOptions instance | ||||||
| @@ -73,7 +76,7 @@ func NewRolloutRestartOptions(streams genericclioptions.IOStreams) *RestartOptio | |||||||
| func NewCmdRolloutRestart(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command { | func NewCmdRolloutRestart(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	o := NewRolloutRestartOptions(streams) | 	o := NewRolloutRestartOptions(streams) | ||||||
|  |  | ||||||
| 	validArgs := []string{"deployment"} | 	validArgs := []string{"deployment", "daemonset", "statefulset"} | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
| 		Use:                   "restart RESOURCE", | 		Use:                   "restart RESOURCE", | ||||||
|   | |||||||
| @@ -71,6 +71,48 @@ func defaultObjectRestarter(obj runtime.Object) ([]byte, error) { | |||||||
| 		obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339) | 		obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339) | ||||||
| 		return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1beta1.SchemeGroupVersion), obj) | 		return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1beta1.SchemeGroupVersion), obj) | ||||||
|  |  | ||||||
|  | 	case *extensionsv1beta1.DaemonSet: | ||||||
|  | 		if obj.Spec.Template.ObjectMeta.Annotations == nil { | ||||||
|  | 			obj.Spec.Template.ObjectMeta.Annotations = make(map[string]string) | ||||||
|  | 		} | ||||||
|  | 		obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339) | ||||||
|  | 		return runtime.Encode(scheme.Codecs.LegacyCodec(extensionsv1beta1.SchemeGroupVersion), obj) | ||||||
|  |  | ||||||
|  | 	case *appsv1.DaemonSet: | ||||||
|  | 		if obj.Spec.Template.ObjectMeta.Annotations == nil { | ||||||
|  | 			obj.Spec.Template.ObjectMeta.Annotations = make(map[string]string) | ||||||
|  | 		} | ||||||
|  | 		obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339) | ||||||
|  | 		return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1.SchemeGroupVersion), obj) | ||||||
|  |  | ||||||
|  | 	case *appsv1beta2.DaemonSet: | ||||||
|  | 		if obj.Spec.Template.ObjectMeta.Annotations == nil { | ||||||
|  | 			obj.Spec.Template.ObjectMeta.Annotations = make(map[string]string) | ||||||
|  | 		} | ||||||
|  | 		obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339) | ||||||
|  | 		return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1beta2.SchemeGroupVersion), obj) | ||||||
|  |  | ||||||
|  | 	case *appsv1.StatefulSet: | ||||||
|  | 		if obj.Spec.Template.ObjectMeta.Annotations == nil { | ||||||
|  | 			obj.Spec.Template.ObjectMeta.Annotations = make(map[string]string) | ||||||
|  | 		} | ||||||
|  | 		obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339) | ||||||
|  | 		return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1.SchemeGroupVersion), obj) | ||||||
|  |  | ||||||
|  | 	case *appsv1beta1.StatefulSet: | ||||||
|  | 		if obj.Spec.Template.ObjectMeta.Annotations == nil { | ||||||
|  | 			obj.Spec.Template.ObjectMeta.Annotations = make(map[string]string) | ||||||
|  | 		} | ||||||
|  | 		obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339) | ||||||
|  | 		return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1beta1.SchemeGroupVersion), obj) | ||||||
|  |  | ||||||
|  | 	case *appsv1beta2.StatefulSet: | ||||||
|  | 		if obj.Spec.Template.ObjectMeta.Annotations == nil { | ||||||
|  | 			obj.Spec.Template.ObjectMeta.Annotations = make(map[string]string) | ||||||
|  | 		} | ||||||
|  | 		obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339) | ||||||
|  | 		return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1beta2.SchemeGroupVersion), obj) | ||||||
|  |  | ||||||
| 	default: | 	default: | ||||||
| 		return nil, fmt.Errorf("restarting is not supported") | 		return nil, fmt.Errorf("restarting is not supported") | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -43,6 +43,10 @@ run_daemonset_tests() { | |||||||
|   kubectl set resources daemonsets/bind "${kube_flags[@]}" --limits=cpu=200m,memory=512Mi |   kubectl set resources daemonsets/bind "${kube_flags[@]}" --limits=cpu=200m,memory=512Mi | ||||||
|   kube::test::get_object_assert 'daemonsets bind' "{{${template_generation_field}}}" '4' |   kube::test::get_object_assert 'daemonsets bind' "{{${template_generation_field}}}" '4' | ||||||
|  |  | ||||||
|  |   # Rollout restart should change generation | ||||||
|  |   kubectl rollout restart daemonset/bind "${kube_flags[@]}" | ||||||
|  |   kube::test::get_object_assert 'daemonsets bind' "{{${template_generation_field}}}" '5' | ||||||
|  |  | ||||||
|   # Clean up |   # Clean up | ||||||
|   kubectl delete -f hack/testdata/rollingupdate-daemonset.yaml "${kube_flags[@]}" |   kubectl delete -f hack/testdata/rollingupdate-daemonset.yaml "${kube_flags[@]}" | ||||||
|  |  | ||||||
| @@ -488,6 +492,10 @@ run_stateful_set_tests() { | |||||||
|   # TODO: test robust scaling in an e2e. |   # TODO: test robust scaling in an e2e. | ||||||
|   wait-for-pods-with-label "app=nginx-statefulset" "nginx-0" |   wait-for-pods-with-label "app=nginx-statefulset" "nginx-0" | ||||||
|  |  | ||||||
|  |   # Rollout restart should change generation | ||||||
|  |   kubectl rollout restart statefulset nginx "${kube_flags[@]}" | ||||||
|  |   kube::test::get_object_assert 'statefulset nginx' "{{$statefulset_observed_generation}}" '3' | ||||||
|  |  | ||||||
|   ### Clean up |   ### Clean up | ||||||
|   kubectl delete -f hack/testdata/rollingupdate-statefulset.yaml "${kube_flags[@]}" |   kubectl delete -f hack/testdata/rollingupdate-statefulset.yaml "${kube_flags[@]}" | ||||||
|   # Post-condition: no pods from statefulset controller |   # Post-condition: no pods from statefulset controller | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Antoine Pelisse
					Antoine Pelisse