Skip to content

Commit

Permalink
Add Marshal function in Result/NetConf to omit empty value
Browse files Browse the repository at this point in the history
This change fix to avoid empty DNS field in NetConf/Result
if DNS is empty.

Signed-off-by: Tomofumi Hayashi <tohayash@redhat.com>
  • Loading branch information
s1061123 committed Dec 18, 2023
1 parent 66c292a commit d1276f1
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 6 deletions.
8 changes: 3 additions & 5 deletions libcni/api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -486,8 +486,7 @@ var _ = Describe("Invoking plugins", func() {
Expect(err).NotTo(HaveOccurred())
cachedJson := `{
"cniVersion": "` + version.Current() + `",
"ips": [{"address": "10.1.2.3/24"}],
"dns": {}
"ips": [{"address": "10.1.2.3/24"}]
}`
err = os.WriteFile(cacheFile, []byte(cachedJson), 0o600)
Expect(err).NotTo(HaveOccurred())
Expand Down Expand Up @@ -676,8 +675,7 @@ var _ = Describe("Invoking plugins", func() {
Expect(err).NotTo(HaveOccurred())
cachedJson := `{
"cniVersion": "` + version.Current() + `",
"ips": [{"address": "10.1.2.3/24"}],
"dns": {}
"ips": [{"address": "10.1.2.3/24"}]
}`
err = os.WriteFile(cacheFile, []byte(cachedJson), 0o600)
Expect(err).NotTo(HaveOccurred())
Expand Down Expand Up @@ -971,7 +969,7 @@ var _ = Describe("Invoking plugins", func() {
"otherCapability": capabilityArgs["otherCapability"],
}

ipResult = fmt.Sprintf(`{"cniVersion": "%s", "dns":{},"ips":[{"address": "10.1.2.3/24"}]}`, version.Current())
ipResult = fmt.Sprintf(`{"cniVersion": "%s", "ips":[{"address": "10.1.2.3/24"}]}`, version.Current())
netConfigList, plugins = makePluginList(version.Current(), ipResult, rcMap)

ctx = context.TODO()
Expand Down
23 changes: 23 additions & 0 deletions pkg/types/100/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,29 @@ type Result struct {
DNS types.DNS `json:"dns,omitempty"`
}

// Note: DNS should be omit if DNS is empty but default Marshal function
// will output empty structure hence need to write a Marshal function
func (r *Result) MarshalJSON() ([]byte, error) {
// use type alias to escape recursion for json.Marshal() to MarshalJSON()
type fixObjType = Result

bytes, err := json.Marshal(fixObjType(*r)) //nolint:all
if err != nil {
return nil, err
}

fixupObj := make(map[string]interface{})
if err := json.Unmarshal(bytes, &fixupObj); err != nil {
return nil, err
}

if r.DNS.IsEmpty() {
delete(fixupObj, "dns")
}

return json.Marshal(fixupObj)
}

// convertFrom100 does nothing except set the version; the types are the same
func convertFrom100(from types.Result, toVersion string) (types.Result, error) {
fromResult := from.(*Result)
Expand Down
38 changes: 37 additions & 1 deletion pkg/types/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,16 +64,44 @@ type NetConf struct {
Type string `json:"type,omitempty"`
Capabilities map[string]bool `json:"capabilities,omitempty"`
IPAM IPAM `json:"ipam,omitempty"`
DNS DNS `json:"dns"`
DNS DNS `json:"dns,omitempty"`

RawPrevResult map[string]interface{} `json:"prevResult,omitempty"`
PrevResult Result `json:"-"`
}

// Note: DNS should be omit if DNS is empty but default Marshal function
// will output empty structure hence need to write a Marshal function
func (n *NetConf) MarshalJSON() ([]byte, error) {
// use type alias to escape recursion for json.Marshal() to MarshalJSON()
type fixObjType = NetConf

bytes, err := json.Marshal(fixObjType(*n)) //nolint:all
if err != nil {
return nil, err
}

fixupObj := make(map[string]interface{})
if err := json.Unmarshal(bytes, &fixupObj); err != nil {
return nil, err
}

if n.DNS.IsEmpty() {
delete(fixupObj, "dns")
}

return json.Marshal(fixupObj)
}

type IPAM struct {
Type string `json:"type,omitempty"`
}

// IsEmpty returns true if IPAM structure has no value, otherwise return false
func (i *IPAM) IsEmpty() bool {
return i.Type == ""
}

// NetConfList describes an ordered list of networks.
type NetConfList struct {
CNIVersion string `json:"cniVersion,omitempty"`
Expand Down Expand Up @@ -116,6 +144,14 @@ type DNS struct {
Options []string `json:"options,omitempty"`
}

// IsEmpty returns true if DNS structure has no value, otherwise return false
func (d *DNS) IsEmpty() bool {
if len(d.Nameservers) == 0 && d.Domain == "" && len(d.Search) == 0 && len(d.Options) == 0 {
return true
}
return false
}

func (d *DNS) Copy() *DNS {
if d == nil {
return nil
Expand Down

0 comments on commit d1276f1

Please sign in to comment.