Skip to content

Commit 0fb62c1

Browse files
authored
Merge pull request #145 from jennybuckley/same-order
Make fieldset v1 serialization alphabetical
2 parents 0b0d0c6 + 5bd5770 commit 0fb62c1

File tree

6 files changed

+23
-9
lines changed

6 files changed

+23
-9
lines changed

fieldpath/serialize.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,12 @@ func (s *Set) emitContents_v1(includeSelf bool, stream *jsoniter.Stream, r *reus
8787
stream.WriteMore()
8888
}
8989

90+
if includeSelf && !(len(s.Members.members) == 0 && len(s.Children.members) == 0) {
91+
preWrite()
92+
stream.WriteObjectField(".")
93+
stream.WriteEmptyObject()
94+
}
95+
9096
for mi < len(s.Members.members) && ci < len(s.Children.members) {
9197
mpe := s.Members.members[mi]
9298
cpe := s.Children.members[ci].pathElement
@@ -155,11 +161,6 @@ func (s *Set) emitContents_v1(includeSelf bool, stream *jsoniter.Stream, r *reus
155161
ci++
156162
}
157163

158-
if includeSelf && !first {
159-
preWrite()
160-
stream.WriteObjectField(".")
161-
stream.WriteEmptyObject()
162-
}
163164
return manageMemory(stream)
164165
}
165166

internal/cli/main_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package cli
1818

1919
import (
2020
"bytes"
21+
"encoding/json"
2122
"io/ioutil"
2223
"path/filepath"
2324
"testing"
@@ -233,6 +234,18 @@ func TestFieldSet(t *testing.T) {
233234
t.Errorf("unexpected error: %v", err)
234235
}
235236
tt.checkOutput(t, b.Bytes())
237+
238+
// Test that round tripping through unstructured will preserve ordering
239+
u := map[string]interface{}{}
240+
err = json.Unmarshal(b.Bytes(), &u)
241+
if err != nil {
242+
t.Errorf("unexpected error: %v", err)
243+
}
244+
m, err := json.Marshal(&u)
245+
if err != nil {
246+
t.Errorf("unexpected error: %v", err)
247+
}
248+
tt.checkOutput(t, m)
236249
})
237250
}
238251
}

internal/testdata/endpointsset.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"f:apiVersion":{},"f:kind":{},"f:metadata":{"f:creationTimestamp":{},"f:labels":{"f:app":{},".":{}},"f:name":{},"f:namespace":{},"f:resourceVersion":{},"f:selfLink":{},"f:uid":{},".":{}},"f:subsets":{}}
1+
{"f:apiVersion":{},"f:kind":{},"f:metadata":{".":{},"f:creationTimestamp":{},"f:labels":{".":{},"f:app":{}},"f:name":{},"f:namespace":{},"f:resourceVersion":{},"f:selfLink":{},"f:uid":{}},"f:subsets":{}}

internal/testdata/nodeset.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"f:apiVersion":{},"f:kind":{},"f:metadata":{"f:annotations":{"f:container.googleapis.com/instance_id":{},"f:node.alpha.kubernetes.io/ttl":{},"f:volumes.kubernetes.io/controller-managed-attach-detach":{},".":{}},"f:creationTimestamp":{},"f:labels":{"f:beta.kubernetes.io/arch":{},"f:beta.kubernetes.io/fluentd-ds-ready":{},"f:beta.kubernetes.io/instance-type":{},"f:beta.kubernetes.io/os":{},"f:cloud.google.com/gke-nodepool":{},"f:cloud.google.com/gke-os-distribution":{},"f:failure-domain.beta.kubernetes.io/region":{},"f:failure-domain.beta.kubernetes.io/zone":{},"f:kubernetes.io/hostname":{},".":{}},"f:name":{},"f:resourceVersion":{},"f:selfLink":{},"f:uid":{},".":{}},"f:spec":{"f:podCIDR":{},"f:providerID":{},".":{}},"f:status":{"f:addresses":{"k:{\"type\":\"ExternalIP\"}":{"f:address":{},"f:type":{},".":{}},"k:{\"type\":\"Hostname\"}":{"f:address":{},"f:type":{},".":{}},"k:{\"type\":\"InternalIP\"}":{"f:address":{},"f:type":{},".":{}},".":{}},"f:allocatable":{"f:cpu":{},"f:ephemeral-storage":{},"f:hugepages-2Mi":{},"f:memory":{},"f:pods":{},".":{}},"f:capacity":{"f:cpu":{},"f:ephemeral-storage":{},"f:hugepages-2Mi":{},"f:memory":{},"f:pods":{},".":{}},"f:conditions":{"k:{\"type\":\"CorruptDockerOverlay2\"}":{"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{},".":{}},"k:{\"type\":\"DiskPressure\"}":{"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{},".":{}},"k:{\"type\":\"FrequentContainerdRestart\"}":{"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{},".":{}},"k:{\"type\":\"FrequentDockerRestart\"}":{"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{},".":{}},"k:{\"type\":\"FrequentKubeletRestart\"}":{"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{},".":{}},"k:{\"type\":\"FrequentUnregisterNetDevice\"}":{"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{},".":{}},"k:{\"type\":\"KernelDeadlock\"}":{"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{},".":{}},"k:{\"type\":\"MemoryPressure\"}":{"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{},".":{}},"k:{\"type\":\"NetworkUnavailable\"}":{"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{},".":{}},"k:{\"type\":\"OutOfDisk\"}":{"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{},".":{}},"k:{\"type\":\"PIDPressure\"}":{"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{},".":{}},"k:{\"type\":\"ReadonlyFilesystem\"}":{"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{},".":{}},"k:{\"type\":\"Ready\"}":{"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{},".":{}},".":{}},"f:daemonEndpoints":{"f:kubeletEndpoint":{"f:Port":{},".":{}},".":{}},"f:images":{},"f:nodeInfo":{"f:architecture":{},"f:bootID":{},"f:containerRuntimeVersion":{},"f:kernelVersion":{},"f:kubeProxyVersion":{},"f:kubeletVersion":{},"f:machineID":{},"f:operatingSystem":{},"f:osImage":{},"f:systemUUID":{},".":{}},"f:volumesAttached":{},"f:volumesInUse":{},".":{}}}
1+
{"f:apiVersion":{},"f:kind":{},"f:metadata":{".":{},"f:annotations":{".":{},"f:container.googleapis.com/instance_id":{},"f:node.alpha.kubernetes.io/ttl":{},"f:volumes.kubernetes.io/controller-managed-attach-detach":{}},"f:creationTimestamp":{},"f:labels":{".":{},"f:beta.kubernetes.io/arch":{},"f:beta.kubernetes.io/fluentd-ds-ready":{},"f:beta.kubernetes.io/instance-type":{},"f:beta.kubernetes.io/os":{},"f:cloud.google.com/gke-nodepool":{},"f:cloud.google.com/gke-os-distribution":{},"f:failure-domain.beta.kubernetes.io/region":{},"f:failure-domain.beta.kubernetes.io/zone":{},"f:kubernetes.io/hostname":{}},"f:name":{},"f:resourceVersion":{},"f:selfLink":{},"f:uid":{}},"f:spec":{".":{},"f:podCIDR":{},"f:providerID":{}},"f:status":{".":{},"f:addresses":{".":{},"k:{\"type\":\"ExternalIP\"}":{".":{},"f:address":{},"f:type":{}},"k:{\"type\":\"Hostname\"}":{".":{},"f:address":{},"f:type":{}},"k:{\"type\":\"InternalIP\"}":{".":{},"f:address":{},"f:type":{}}},"f:allocatable":{".":{},"f:cpu":{},"f:ephemeral-storage":{},"f:hugepages-2Mi":{},"f:memory":{},"f:pods":{}},"f:capacity":{".":{},"f:cpu":{},"f:ephemeral-storage":{},"f:hugepages-2Mi":{},"f:memory":{},"f:pods":{}},"f:conditions":{".":{},"k:{\"type\":\"CorruptDockerOverlay2\"}":{".":{},"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{}},"k:{\"type\":\"DiskPressure\"}":{".":{},"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{}},"k:{\"type\":\"FrequentContainerdRestart\"}":{".":{},"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{}},"k:{\"type\":\"FrequentDockerRestart\"}":{".":{},"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{}},"k:{\"type\":\"FrequentKubeletRestart\"}":{".":{},"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{}},"k:{\"type\":\"FrequentUnregisterNetDevice\"}":{".":{},"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{}},"k:{\"type\":\"KernelDeadlock\"}":{".":{},"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{}},"k:{\"type\":\"MemoryPressure\"}":{".":{},"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{}},"k:{\"type\":\"NetworkUnavailable\"}":{".":{},"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{}},"k:{\"type\":\"OutOfDisk\"}":{".":{},"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{}},"k:{\"type\":\"PIDPressure\"}":{".":{},"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{}},"k:{\"type\":\"ReadonlyFilesystem\"}":{".":{},"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{}},"k:{\"type\":\"Ready\"}":{".":{},"f:lastHeartbeatTime":{},"f:lastTransitionTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{}}},"f:daemonEndpoints":{".":{},"f:kubeletEndpoint":{".":{},"f:Port":{}}},"f:images":{},"f:nodeInfo":{".":{},"f:architecture":{},"f:bootID":{},"f:containerRuntimeVersion":{},"f:kernelVersion":{},"f:kubeProxyVersion":{},"f:kubeletVersion":{},"f:machineID":{},"f:operatingSystem":{},"f:osImage":{},"f:systemUUID":{}},"f:volumesAttached":{},"f:volumesInUse":{}}}

internal/testdata/podset.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"f:apiVersion":{},"f:kind":{},"f:metadata":{"f:labels":{"f:app":{},"f:plugin1":{},"f:plugin2":{},"f:plugin3":{},"f:plugin4":{},".":{}},"f:name":{},"f:namespace":{},"f:ownerReferences":{"k:{\"uid\":\"0a9d2b9e-779e-11e7-b422-42010a8001be\"}":{"f:apiVersion":{},"f:blockOwnerDeletion":{},"f:controller":{},"f:kind":{},"f:name":{},"f:uid":{},".":{}},".":{}},".":{}},"f:spec":{"f:containers":{"k:{\"name\":\"some-name\"}":{"f:args":{},"f:env":{"k:{\"name\":\"VAR_1\"}":{"f:name":{},"f:valueFrom":{"f:secretKeyRef":{"f:key":{},"f:name":{},".":{}},".":{}},".":{}},"k:{\"name\":\"VAR_2\"}":{"f:name":{},"f:valueFrom":{"f:secretKeyRef":{"f:key":{},"f:name":{},".":{}},".":{}},".":{}},"k:{\"name\":\"VAR_3\"}":{"f:name":{},"f:valueFrom":{"f:secretKeyRef":{"f:key":{},"f:name":{},".":{}},".":{}},".":{}},".":{}},"f:image":{},"f:imagePullPolicy":{},"f:name":{},"f:resources":{"f:requests":{"f:cpu":{},".":{}},".":{}},"f:terminationMessagePath":{},"f:terminationMessagePolicy":{},"f:volumeMounts":{"k:{\"mountPath\":\"/var/run/secrets/kubernetes.io/serviceaccount\"}":{"f:mountPath":{},"f:name":{},"f:readOnly":{},".":{}},".":{}},".":{}},".":{}},"f:dnsPolicy":{},"f:nodeName":{},"f:priority":{},"f:restartPolicy":{},"f:schedulerName":{},"f:securityContext":{},"f:serviceAccount":{},"f:serviceAccountName":{},"f:terminationGracePeriodSeconds":{},"f:tolerations":{},"f:volumes":{"k:{\"name\":\"default-token-hu5jz\"}":{"f:name":{},"f:secret":{"f:defaultMode":{},"f:secretName":{},".":{}},".":{}},".":{}},".":{}},"f:status":{"f:conditions":{"k:{\"type\":\"ContainersReady\"}":{"f:lastProbeTime":{},"f:lastTransitionTime":{},"f:status":{},"f:type":{},".":{}},"k:{\"type\":\"Initialized\"}":{"f:lastProbeTime":{},"f:lastTransitionTime":{},"f:status":{},"f:type":{},".":{}},"k:{\"type\":\"PodScheduled\"}":{"f:lastProbeTime":{},"f:lastTransitionTime":{},"f:status":{},"f:type":{},".":{}},"k:{\"type\":\"Ready\"}":{"f:lastProbeTime":{},"f:lastTransitionTime":{},"f:status":{},"f:type":{},".":{}},".":{}},"f:containerStatuses":{},"f:hostIP":{},"f:phase":{},"f:podIP":{},"f:qosClass":{},"f:startTime":{},".":{}}}
1+
{"f:apiVersion":{},"f:kind":{},"f:metadata":{".":{},"f:labels":{".":{},"f:app":{},"f:plugin1":{},"f:plugin2":{},"f:plugin3":{},"f:plugin4":{}},"f:name":{},"f:namespace":{},"f:ownerReferences":{".":{},"k:{\"uid\":\"0a9d2b9e-779e-11e7-b422-42010a8001be\"}":{".":{},"f:apiVersion":{},"f:blockOwnerDeletion":{},"f:controller":{},"f:kind":{},"f:name":{},"f:uid":{}}}},"f:spec":{".":{},"f:containers":{".":{},"k:{\"name\":\"some-name\"}":{".":{},"f:args":{},"f:env":{".":{},"k:{\"name\":\"VAR_1\"}":{".":{},"f:name":{},"f:valueFrom":{".":{},"f:secretKeyRef":{".":{},"f:key":{},"f:name":{}}}},"k:{\"name\":\"VAR_2\"}":{".":{},"f:name":{},"f:valueFrom":{".":{},"f:secretKeyRef":{".":{},"f:key":{},"f:name":{}}}},"k:{\"name\":\"VAR_3\"}":{".":{},"f:name":{},"f:valueFrom":{".":{},"f:secretKeyRef":{".":{},"f:key":{},"f:name":{}}}}},"f:image":{},"f:imagePullPolicy":{},"f:name":{},"f:resources":{".":{},"f:requests":{".":{},"f:cpu":{}}},"f:terminationMessagePath":{},"f:terminationMessagePolicy":{},"f:volumeMounts":{".":{},"k:{\"mountPath\":\"/var/run/secrets/kubernetes.io/serviceaccount\"}":{".":{},"f:mountPath":{},"f:name":{},"f:readOnly":{}}}}},"f:dnsPolicy":{},"f:nodeName":{},"f:priority":{},"f:restartPolicy":{},"f:schedulerName":{},"f:securityContext":{},"f:serviceAccount":{},"f:serviceAccountName":{},"f:terminationGracePeriodSeconds":{},"f:tolerations":{},"f:volumes":{".":{},"k:{\"name\":\"default-token-hu5jz\"}":{".":{},"f:name":{},"f:secret":{".":{},"f:defaultMode":{},"f:secretName":{}}}}},"f:status":{".":{},"f:conditions":{".":{},"k:{\"type\":\"ContainersReady\"}":{".":{},"f:lastProbeTime":{},"f:lastTransitionTime":{},"f:status":{},"f:type":{}},"k:{\"type\":\"Initialized\"}":{".":{},"f:lastProbeTime":{},"f:lastTransitionTime":{},"f:status":{},"f:type":{}},"k:{\"type\":\"PodScheduled\"}":{".":{},"f:lastProbeTime":{},"f:lastTransitionTime":{},"f:status":{},"f:type":{}},"k:{\"type\":\"Ready\"}":{".":{},"f:lastProbeTime":{},"f:lastTransitionTime":{},"f:status":{},"f:type":{}}},"f:containerStatuses":{},"f:hostIP":{},"f:phase":{},"f:podIP":{},"f:qosClass":{},"f:startTime":{}}}

0 commit comments

Comments
 (0)