mirror of
https://github.com/k3s-io/kubernetes.git
synced 2026-01-05 23:47:50 +00:00
Merge pull request #87706 from liggitt/fix-statefulset-conversion
Fix statefulset conversion
This commit is contained in:
@@ -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",
|
||||
],
|
||||
)
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user