|
|
|
|
@@ -17,8 +17,10 @@ limitations under the License.
|
|
|
|
|
package internal
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"reflect"
|
|
|
|
|
"testing"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
|
|
|
|
|
|
|
|
@@ -29,7 +31,14 @@ import (
|
|
|
|
|
// (api format) to the format used by sigs.k8s.io/structured-merge-diff and back
|
|
|
|
|
func TestRoundTripManagedFields(t *testing.T) {
|
|
|
|
|
tests := []string{
|
|
|
|
|
`- apiVersion: v1
|
|
|
|
|
`- apiVersion: v1beta1
|
|
|
|
|
fields:
|
|
|
|
|
i:5:
|
|
|
|
|
f:i: {}
|
|
|
|
|
manager: foo
|
|
|
|
|
operation: Update
|
|
|
|
|
time: "2011-12-13T14:15:16Z"
|
|
|
|
|
- apiVersion: v1
|
|
|
|
|
fields:
|
|
|
|
|
v:3:
|
|
|
|
|
f:alsoPi: {}
|
|
|
|
|
@@ -40,13 +49,6 @@ func TestRoundTripManagedFields(t *testing.T) {
|
|
|
|
|
manager: foo
|
|
|
|
|
operation: Update
|
|
|
|
|
time: "2001-02-03T04:05:06Z"
|
|
|
|
|
- apiVersion: v1beta1
|
|
|
|
|
fields:
|
|
|
|
|
i:5:
|
|
|
|
|
f:i: {}
|
|
|
|
|
manager: foo
|
|
|
|
|
operation: Update
|
|
|
|
|
time: "2011-12-13T14:15:16Z"
|
|
|
|
|
`,
|
|
|
|
|
`- apiVersion: v1
|
|
|
|
|
fields:
|
|
|
|
|
@@ -205,13 +207,85 @@ func TestSortEncodedManagedFields(t *testing.T) {
|
|
|
|
|
managedFields []metav1.ManagedFieldsEntry
|
|
|
|
|
expected []metav1.ManagedFieldsEntry
|
|
|
|
|
}{
|
|
|
|
|
{
|
|
|
|
|
name: "empty",
|
|
|
|
|
managedFields: []metav1.ManagedFieldsEntry{},
|
|
|
|
|
expected: []metav1.ManagedFieldsEntry{},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "nil",
|
|
|
|
|
managedFields: nil,
|
|
|
|
|
expected: nil,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "remains untouched",
|
|
|
|
|
managedFields: []metav1.ManagedFieldsEntry{
|
|
|
|
|
{Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: &metav1.Time{}},
|
|
|
|
|
{Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: nil},
|
|
|
|
|
{Manager: "a", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2001-01-01T01:00:00Z")},
|
|
|
|
|
},
|
|
|
|
|
expected: []metav1.ManagedFieldsEntry{
|
|
|
|
|
{Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: &metav1.Time{}},
|
|
|
|
|
{Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: nil},
|
|
|
|
|
{Manager: "a", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2001-01-01T01:00:00Z")},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "apply first",
|
|
|
|
|
managedFields: []metav1.ManagedFieldsEntry{
|
|
|
|
|
{Manager: "a", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2001-01-01T01:00:00Z")},
|
|
|
|
|
{Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: nil},
|
|
|
|
|
},
|
|
|
|
|
expected: []metav1.ManagedFieldsEntry{
|
|
|
|
|
{Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: nil},
|
|
|
|
|
{Manager: "a", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2001-01-01T01:00:00Z")},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "newest first",
|
|
|
|
|
managedFields: []metav1.ManagedFieldsEntry{
|
|
|
|
|
{Manager: "c", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2001-01-01T01:00:00Z")},
|
|
|
|
|
{Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: nil},
|
|
|
|
|
{Manager: "c", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2002-01-01T01:00:00Z")},
|
|
|
|
|
{Manager: "b", Operation: metav1.ManagedFieldsOperationApply, Time: nil},
|
|
|
|
|
},
|
|
|
|
|
expected: []metav1.ManagedFieldsEntry{
|
|
|
|
|
{Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: nil},
|
|
|
|
|
{Manager: "b", Operation: metav1.ManagedFieldsOperationApply, Time: nil},
|
|
|
|
|
{Manager: "c", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2002-01-01T01:00:00Z")},
|
|
|
|
|
{Manager: "c", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2001-01-01T01:00:00Z")},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "manager last",
|
|
|
|
|
managedFields: []metav1.ManagedFieldsEntry{
|
|
|
|
|
{Manager: "c", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2001-01-01T01:00:00Z")},
|
|
|
|
|
{Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: nil},
|
|
|
|
|
{Manager: "d", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2002-01-01T01:00:00Z")},
|
|
|
|
|
{Manager: "b", Operation: metav1.ManagedFieldsOperationApply, Time: nil},
|
|
|
|
|
},
|
|
|
|
|
expected: []metav1.ManagedFieldsEntry{
|
|
|
|
|
{Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: nil},
|
|
|
|
|
{Manager: "b", Operation: metav1.ManagedFieldsOperationApply, Time: nil},
|
|
|
|
|
{Manager: "d", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2002-01-01T01:00:00Z")},
|
|
|
|
|
{Manager: "c", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2001-01-01T01:00:00Z")},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "manager sorted",
|
|
|
|
|
managedFields: []metav1.ManagedFieldsEntry{
|
|
|
|
|
{Manager: "c", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2001-01-01T01:00:00Z")},
|
|
|
|
|
{Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: nil},
|
|
|
|
|
{Manager: "f", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2002-01-01T01:00:00Z")},
|
|
|
|
|
{Manager: "d", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2002-01-01T01:00:00Z")},
|
|
|
|
|
{Manager: "e", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2002-01-01T01:00:00Z")},
|
|
|
|
|
{Manager: "b", Operation: metav1.ManagedFieldsOperationApply, Time: nil},
|
|
|
|
|
},
|
|
|
|
|
expected: []metav1.ManagedFieldsEntry{
|
|
|
|
|
{Manager: "a", Operation: metav1.ManagedFieldsOperationApply, Time: nil},
|
|
|
|
|
{Manager: "b", Operation: metav1.ManagedFieldsOperationApply, Time: nil},
|
|
|
|
|
{Manager: "d", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2002-01-01T01:00:00Z")},
|
|
|
|
|
{Manager: "e", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2002-01-01T01:00:00Z")},
|
|
|
|
|
{Manager: "f", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2002-01-01T01:00:00Z")},
|
|
|
|
|
{Manager: "c", Operation: metav1.ManagedFieldsOperationUpdate, Time: parseTimeOrPanic("2001-01-01T01:00:00Z")},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
@@ -228,3 +302,11 @@ func TestSortEncodedManagedFields(t *testing.T) {
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func parseTimeOrPanic(s string) *metav1.Time {
|
|
|
|
|
t, err := time.Parse(time.RFC3339, s)
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic(fmt.Sprintf("failed to parse time %s, got: %v", s, err))
|
|
|
|
|
}
|
|
|
|
|
return &metav1.Time{Time: t.UTC()}
|
|
|
|
|
}
|
|
|
|
|
|