Merge pull request #87706 from liggitt/fix-statefulset-conversion

Fix statefulset conversion
This commit is contained in:
Kubernetes Prow Robot
2020-01-31 20:08:16 -08:00
committed by GitHub
9 changed files with 249 additions and 62 deletions

View File

@@ -34,10 +34,14 @@ go_test(
embed = [":go_default_library"],
tags = ["integration"],
deps = [
"//cmd/kube-apiserver/app/testing:go_default_library",
"//staging/src/k8s.io/api/apps/v1:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
"//staging/src/k8s.io/client-go/dynamic:go_default_library",
"//test/integration/framework:go_default_library",
],
)

View File

@@ -21,12 +21,92 @@ import (
"testing"
appsv1 "k8s.io/api/apps/v1"
"k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/util/json"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/dynamic"
apiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing"
"k8s.io/kubernetes/test/integration/framework"
)
// TestVolumeTemplateNoopUpdate ensures embedded StatefulSet objects with embedded PersistentVolumes can be updated
func TestVolumeTemplateNoopUpdate(t *testing.T) {
// Start the server with default storage setup
server, err := apiservertesting.StartTestServer(t, apiservertesting.NewDefaultTestServerOptions(), nil, framework.SharedEtcd())
if err != nil {
t.Fatal(err)
}
defer server.TearDownFn()
c, err := dynamic.NewForConfig(server.ClientConfig)
if err != nil {
t.Fatal(err)
}
// Use an unstructured client to ensure we send exactly the bytes we expect for the embedded PVC template
sts := &unstructured.Unstructured{}
err = json.Unmarshal([]byte(`{
"apiVersion": "apps/v1",
"kind": "StatefulSet",
"metadata": {"name": "web"},
"spec": {
"selector": {"matchLabels": {"app": "nginx"}},
"serviceName": "nginx",
"replicas": 3,
"template": {
"metadata": {"labels": {"app": "nginx"}},
"spec": {
"terminationGracePeriodSeconds": 10,
"containers": [{
"name": "nginx",
"image": "k8s.gcr.io/nginx-slim:0.8",
"ports": [{"containerPort": 80,"name": "web"}],
"volumeMounts": [{"name": "www","mountPath": "/usr/share/nginx/html"}]
}]
}
},
"volumeClaimTemplates": [{
"apiVersion": "v1",
"kind": "PersistentVolumeClaim",
"metadata": {"name": "www"},
"spec": {
"accessModes": ["ReadWriteOnce"],
"storageClassName": "my-storage-class",
"resources": {"requests": {"storage": "1Gi"}}
}
}
]
}
}`), &sts.Object)
if err != nil {
t.Fatal(err)
}
stsClient := c.Resource(appsv1.SchemeGroupVersion.WithResource("statefulsets")).Namespace("default")
// Create the statefulset
persistedSTS, err := stsClient.Create(sts, metav1.CreateOptions{})
if err != nil {
t.Fatal(err)
}
// Update with the original spec (all the same defaulting should apply, should be a no-op and pass validation
originalSpec, ok, err := unstructured.NestedFieldCopy(sts.Object, "spec")
if err != nil || !ok {
t.Fatal(err, ok)
}
err = unstructured.SetNestedField(persistedSTS.Object, originalSpec, "spec")
if err != nil {
t.Fatal(err)
}
_, err = stsClient.Update(persistedSTS, metav1.UpdateOptions{})
if err != nil {
t.Fatal(err)
}
}
func TestSpecReplicasChange(t *testing.T) {
s, closeFn, rm, informers, c := scSetup(t)
defer closeFn()