@@ -24,7 +24,8 @@ import (
24
24
"github.com/pingcap/tidb-operator/pkg/label"
25
25
"github.com/pingcap/tidb-operator/pkg/webhook/util"
26
26
"k8s.io/api/admission/v1beta1"
27
- apps "k8s.io/api/apps/v1beta1"
27
+ apps "k8s.io/api/apps/v1"
28
+ appsv1beta1 "k8s.io/api/apps/v1beta1"
28
29
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
29
30
"k8s.io/apimachinery/pkg/runtime"
30
31
"k8s.io/client-go/rest"
@@ -45,8 +46,9 @@ func AdmitStatefulSets(ar v1beta1.AdmissionReview) *v1beta1.AdmissionResponse {
45
46
namespace := ar .Request .Namespace
46
47
glog .V (4 ).Infof ("admit statefulsets [%s/%s]" , namespace , name )
47
48
48
- setResource := metav1.GroupVersionResource {Group : "apps" , Version : "v1beta1" , Resource : "statefulsets" }
49
- if ar .Request .Resource != setResource {
49
+ apiVersion := ar .Request .Resource .Version
50
+ setResource := metav1.GroupVersionResource {Group : "apps" , Version : apiVersion , Resource : "statefulsets" }
51
+ if ar .Request .Resource .Group != "apps" || ar .Request .Resource .Resource != "statefulsets" {
50
52
err := fmt .Errorf ("expect resource to be %s instead of %s" , setResource , ar .Request .Resource )
51
53
glog .Errorf ("%v" , err )
52
54
return util .ARFail (err )
@@ -66,21 +68,20 @@ func AdmitStatefulSets(ar v1beta1.AdmissionReview) *v1beta1.AdmissionResponse {
66
68
}
67
69
}
68
70
69
- raw := ar .Request .OldObject .Raw
70
- set := apps.StatefulSet {}
71
- if _ , _ , err := deserializer .Decode (raw , nil , & set ); err != nil {
71
+ stsObjectMeta , stsPartition , err := getStsAttributes (ar .Request .OldObject .Raw , apiVersion )
72
+ if err != nil {
72
73
glog .Errorf ("statefulset %s/%s, decode request failed, err: %v" , namespace , name , err )
73
74
return util .ARFail (err )
74
75
}
75
76
76
- l := label .Label (set .Labels )
77
+ l := label .Label (stsObjectMeta .Labels )
77
78
78
79
if ! (l .IsTiDB () || l .IsTiKV ()) {
79
80
// If it is not statefulset of tikv and tidb, return quickly.
80
81
return util .ARSuccess ()
81
82
}
82
83
83
- controllerRef := metav1 .GetControllerOf (& set )
84
+ controllerRef := metav1 .GetControllerOf (stsObjectMeta )
84
85
if controllerRef == nil || controllerRef .Kind != controller .ControllerKind .Kind {
85
86
// In this case, we can't tell if this statefulset is controlled by tidb-operator,
86
87
// so we don't block this statefulset upgrade, return directly.
@@ -111,11 +112,27 @@ func AdmitStatefulSets(ar v1beta1.AdmissionReview) *v1beta1.AdmissionResponse {
111
112
return util .ARFail (err )
112
113
}
113
114
114
- setPartition := * set . Spec . UpdateStrategy . RollingUpdate . Partition
115
+ setPartition := * ( stsPartition )
115
116
if setPartition > 0 && setPartition <= int32 (partition ) {
116
117
glog .V (4 ).Infof ("statefulset %s/%s has been protect by partition %s annotations" , namespace , name , partitionStr )
117
118
return util .ARFail (errors .New ("protect by partition annotation" ))
118
119
}
119
120
glog .Infof ("admit statefulset %s/%s update partition to %d, protect partition is %d" , namespace , name , setPartition , partition )
120
121
return util .ARSuccess ()
121
122
}
123
+
124
+ func getStsAttributes (data []byte , apiVersion string ) (* metav1.ObjectMeta , * int32 , error ) {
125
+ if apiVersion == "v1" {
126
+ set := apps.StatefulSet {}
127
+ if _ , _ , err := deserializer .Decode (data , nil , & set ); err != nil {
128
+ return nil , nil , err
129
+ }
130
+ return & (set .ObjectMeta ), set .Spec .UpdateStrategy .RollingUpdate .Partition , nil
131
+ }
132
+
133
+ set := appsv1beta1.StatefulSet {}
134
+ if _ , _ , err := deserializer .Decode (data , nil , & set ); err != nil {
135
+ return nil , nil , err
136
+ }
137
+ return & (set .ObjectMeta ), set .Spec .UpdateStrategy .RollingUpdate .Partition , nil
138
+ }
0 commit comments