Merge pull request #93162 from julianvmodesto/before-first-apply-test
Add tests for stopped managed fields tracking Kubernetes-commit: 0eeb676468daae4abe0bdcb706f420c55b44f166
This commit is contained in:
commit
49afbdcc5f
|
@ -680,7 +680,7 @@
|
|||
},
|
||||
{
|
||||
"ImportPath": "k8s.io/component-base",
|
||||
"Rev": "1cf1c2dded48"
|
||||
"Rev": "e83f66bbf913"
|
||||
},
|
||||
{
|
||||
"ImportPath": "k8s.io/gengo",
|
||||
|
|
4
go.mod
4
go.mod
|
@ -44,7 +44,7 @@ require (
|
|||
k8s.io/api v0.0.0-20200828051551-f7be94ed4426
|
||||
k8s.io/apimachinery v0.0.0-20200828051414-598f8782ef6f
|
||||
k8s.io/client-go v0.0.0-20200828051815-67e1ce8f656f
|
||||
k8s.io/component-base v0.0.0-20200821052257-1cf1c2dded48
|
||||
k8s.io/component-base v0.0.0-20200828052305-e83f66bbf913
|
||||
k8s.io/klog/v2 v2.2.0
|
||||
k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6
|
||||
k8s.io/utils v0.0.0-20200729134348-d5654de09c73
|
||||
|
@ -57,5 +57,5 @@ replace (
|
|||
k8s.io/api => k8s.io/api v0.0.0-20200828051551-f7be94ed4426
|
||||
k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20200828051414-598f8782ef6f
|
||||
k8s.io/client-go => k8s.io/client-go v0.0.0-20200828051815-67e1ce8f656f
|
||||
k8s.io/component-base => k8s.io/component-base v0.0.0-20200821052257-1cf1c2dded48
|
||||
k8s.io/component-base => k8s.io/component-base v0.0.0-20200828052305-e83f66bbf913
|
||||
)
|
||||
|
|
2
go.sum
2
go.sum
|
@ -510,7 +510,7 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt
|
|||
k8s.io/api v0.0.0-20200828051551-f7be94ed4426/go.mod h1:Eof5ZBY8Afte3+74dUzF8SySMRjc2uj3osb9bq8B3HI=
|
||||
k8s.io/apimachinery v0.0.0-20200828051414-598f8782ef6f/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA=
|
||||
k8s.io/client-go v0.0.0-20200828051815-67e1ce8f656f/go.mod h1:vMZdCwztNFjeGmgNga++CEa3cbVQ1qoriOWYAK7ryq8=
|
||||
k8s.io/component-base v0.0.0-20200821052257-1cf1c2dded48/go.mod h1:1gG5qkov95cjSJQkbTCGYvuR7DSA+qOT2xW+oQp5MUQ=
|
||||
k8s.io/component-base v0.0.0-20200828052305-e83f66bbf913/go.mod h1:uWiI7f7Tvt3aVPEoe7YmG+5By+6mhbkGnX16+GxpDYg=
|
||||
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
|
||||
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
|
||||
k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A=
|
||||
|
|
|
@ -111,6 +111,7 @@ func NewTestFieldManager(gvk schema.GroupVersionKind, chainFieldManager func(fie
|
|||
f = fieldmanager.NewStripMetaManager(f)
|
||||
f = fieldmanager.NewManagedFieldsUpdater(f)
|
||||
f = fieldmanager.NewBuildManagerInfoManager(f, gvk.GroupVersion())
|
||||
f = fieldmanager.NewProbabilisticSkipNonAppliedManager(f, &fakeObjectCreater{gvk: gvk}, gvk, fieldmanager.DefaultTrackOnCreateProbability)
|
||||
f = fieldmanager.NewLastAppliedManager(f, typeConverter, objectConverter, gvk.GroupVersion())
|
||||
f = fieldmanager.NewLastAppliedUpdater(f)
|
||||
if chainFieldManager != nil {
|
||||
|
@ -1039,6 +1040,145 @@ spec:
|
|||
}
|
||||
}
|
||||
|
||||
func TestNoTrackManagedFieldsForClientSideApply(t *testing.T) {
|
||||
f := NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("apps/v1", "Deployment"))
|
||||
|
||||
// create object
|
||||
newObj := &unstructured.Unstructured{Object: map[string]interface{}{}}
|
||||
deployment := []byte(`
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: my-deployment
|
||||
labels:
|
||||
app: my-app
|
||||
spec:
|
||||
replicas: 100
|
||||
`)
|
||||
if err := yaml.Unmarshal(deployment, &newObj.Object); err != nil {
|
||||
t.Errorf("error decoding YAML: %v", err)
|
||||
}
|
||||
if err := f.Update(newObj, "test_kubectl_create"); err != nil {
|
||||
t.Errorf("failed to update object: %v", err)
|
||||
}
|
||||
if m := f.ManagedFields(); len(m) == 0 {
|
||||
t.Errorf("expected to have managed fields, but got: %v", m)
|
||||
}
|
||||
|
||||
// stop tracking managed fields
|
||||
newObj = &unstructured.Unstructured{Object: map[string]interface{}{}}
|
||||
deployment = []byte(`
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: my-deployment
|
||||
managedFields: [] # stop tracking managed fields
|
||||
labels:
|
||||
app: my-app
|
||||
spec:
|
||||
replicas: 100
|
||||
`)
|
||||
if err := yaml.Unmarshal(deployment, &newObj.Object); err != nil {
|
||||
t.Errorf("error decoding YAML: %v", err)
|
||||
}
|
||||
newObj.SetUID("nonempty")
|
||||
if err := f.Update(newObj, "test_kubectl_replace"); err != nil {
|
||||
t.Errorf("failed to update object: %v", err)
|
||||
}
|
||||
if m := f.ManagedFields(); len(m) != 0 {
|
||||
t.Errorf("expected to have stop tracking managed fields, but got: %v", m)
|
||||
}
|
||||
|
||||
// check that we still don't track managed fields
|
||||
newObj = &unstructured.Unstructured{Object: map[string]interface{}{}}
|
||||
deployment = []byte(`
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: my-deployment
|
||||
labels:
|
||||
app: my-app
|
||||
spec:
|
||||
replicas: 100
|
||||
`)
|
||||
if err := yaml.Unmarshal(deployment, &newObj.Object); err != nil {
|
||||
t.Errorf("error decoding YAML: %v", err)
|
||||
}
|
||||
if err := setLastAppliedFromEncoded(newObj, deployment); err != nil {
|
||||
t.Errorf("failed to set last applied: %v", err)
|
||||
}
|
||||
if err := f.Update(newObj, "test_k_client_side_apply"); err != nil {
|
||||
t.Errorf("failed to update object: %v", err)
|
||||
}
|
||||
if m := f.ManagedFields(); len(m) != 0 {
|
||||
t.Errorf("expected to continue to not track managed fields, but got: %v", m)
|
||||
}
|
||||
lastApplied, err := getLastApplied(f.liveObj)
|
||||
if err != nil {
|
||||
t.Errorf("failed to get last applied: %v", err)
|
||||
}
|
||||
if !strings.Contains(lastApplied, "my-app") {
|
||||
t.Errorf("expected last applied annotation to be set properly, but got: %q", lastApplied)
|
||||
}
|
||||
|
||||
// start tracking managed fields
|
||||
newObj = &unstructured.Unstructured{Object: map[string]interface{}{}}
|
||||
deployment = []byte(`
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: my-deployment
|
||||
labels:
|
||||
app: my-app
|
||||
spec:
|
||||
replicas: 100
|
||||
`)
|
||||
if err := yaml.Unmarshal(deployment, &newObj.Object); err != nil {
|
||||
t.Errorf("error decoding YAML: %v", err)
|
||||
}
|
||||
if err := f.Apply(newObj, "test_server_side_apply_without_upgrade", false); err != nil {
|
||||
t.Errorf("error applying object: %v", err)
|
||||
}
|
||||
if m := f.ManagedFields(); len(m) < 2 {
|
||||
t.Errorf("expected to start tracking managed fields with at least 2 field managers, but got: %v", m)
|
||||
}
|
||||
if e, a := "test_server_side_apply_without_upgrade", f.ManagedFields()[0].Manager; e != a {
|
||||
t.Fatalf("exected first manager name to be %v, but got %v: %#v", e, a, f.ManagedFields())
|
||||
}
|
||||
if e, a := "before-first-apply", f.ManagedFields()[1].Manager; e != a {
|
||||
t.Fatalf("exected second manager name to be %v, but got %v: %#v", e, a, f.ManagedFields())
|
||||
}
|
||||
|
||||
// upgrade management of the object from client-side apply to server-side apply
|
||||
newObj = &unstructured.Unstructured{Object: map[string]interface{}{}}
|
||||
deployment = []byte(`
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: my-deployment
|
||||
labels:
|
||||
app: my-app-v2 # change
|
||||
spec:
|
||||
replicas: 8 # change
|
||||
`)
|
||||
if err := yaml.Unmarshal(deployment, &newObj.Object); err != nil {
|
||||
t.Errorf("error decoding YAML: %v", err)
|
||||
}
|
||||
if err := f.Apply(newObj, "kubectl", false); err != nil {
|
||||
t.Errorf("error applying object: %v", err)
|
||||
}
|
||||
if m := f.ManagedFields(); len(m) == 0 {
|
||||
t.Errorf("expected to track managed fields, but got: %v", m)
|
||||
}
|
||||
lastApplied, err = getLastApplied(f.liveObj)
|
||||
if err != nil {
|
||||
t.Errorf("failed to get last applied: %v", err)
|
||||
}
|
||||
if !strings.Contains(lastApplied, "my-app-v2") {
|
||||
t.Errorf("expected last applied annotation to be updated, but got: %q", lastApplied)
|
||||
}
|
||||
}
|
||||
|
||||
func yamlToJSON(y []byte) (string, error) {
|
||||
obj := &unstructured.Unstructured{Object: map[string]interface{}{}}
|
||||
if err := yaml.Unmarshal(y, &obj.Object); err != nil {
|
||||
|
|
Loading…
Reference in New Issue