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 <[email protected]>
  • Loading branch information
s1061123 committed Oct 31, 2023
1 parent 5968d61 commit 2aa3157
Show file tree
Hide file tree
Showing 2 changed files with 137 additions and 1 deletion.
57 changes: 57 additions & 0 deletions pkg/types/100/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
package types100

import (
"bytes"
"encoding/json"
"fmt"
"io"
Expand Down Expand Up @@ -95,6 +96,62 @@ type Result struct {
DNS types.DNS `json:"dns,omitempty"`
}

// Note: DNS should be omit if DNS is empty empty but default Marshal function
// will output empty structure hence need to write a Marshal function
func (r *Result) MarshalJSON() ([]byte, error) {
var buf bytes.Buffer
buf.WriteString("{")
fieldSeparator := ""

if r.CNIVersion != "" {
buf.WriteString(fmt.Sprintf("\"cniVersion\":%q", r.CNIVersion))
fieldSeparator = ","
}

if len(r.Interfaces) != 0 {
buf.WriteString(fmt.Sprintf("%s\"interfaces\":", fieldSeparator))
b, err := json.Marshal(r.Interfaces)
if err != nil {
return nil, err
}
buf.Write(b)
fieldSeparator = ","
}

if len(r.IPs) != 0 {
buf.WriteString(fmt.Sprintf("%s\"ips\":", fieldSeparator))
b, err := json.Marshal(r.IPs)
if err != nil {
return nil, err
}
buf.Write(b)
fieldSeparator = ","
}

if len(r.Routes) != 0 {
buf.WriteString(fmt.Sprintf("%s\"routes\":", fieldSeparator))
b, err := json.Marshal(r.Routes)
if err != nil {
return nil, err
}
buf.Write(b)
fieldSeparator = ","
}

if !r.DNS.IsEmpty() {
buf.WriteString(fmt.Sprintf("%s\"dns\":", fieldSeparator))
b, err := json.Marshal(r.DNS)
if err != nil {
return nil, err
}
buf.Write(b)
fieldSeparator = ","

Check failure on line 148 in pkg/types/100/types.go

View workflow job for this annotation

GitHub Actions / Lint

ineffectual assignment to fieldSeparator (ineffassign)
}
buf.WriteString("}")

return buf.Bytes(), nil
}

// 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
81 changes: 80 additions & 1 deletion pkg/types/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
package types

import (
"bytes"
"encoding/json"
"fmt"
"io"
Expand Down Expand Up @@ -64,16 +65,86 @@ 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 empty but default Marshal function
// will output empty structure hence need to write a Marshal function
func (n *NetConf) MarshalJSON() ([]byte, error) {
var buf bytes.Buffer
buf.WriteString("{")
fieldSeparator := ""

if n.CNIVersion != "" {
buf.WriteString(fmt.Sprintf("\"cniVersion\":%q", n.CNIVersion))
fieldSeparator = ","
}

if n.Name != "" {
buf.WriteString(fmt.Sprintf("%s\"name\":%q", fieldSeparator, n.Name))
fieldSeparator = ","
}

if n.Type != "" {
buf.WriteString(fmt.Sprintf("%s\"type\":%q", fieldSeparator, n.Type))
fieldSeparator = ","
}

if len(n.Capabilities) != 0 {
buf.WriteString(fmt.Sprintf("%s\"capabilities\":", fieldSeparator))
b, err := json.Marshal(n.Capabilities)
if err != nil {
return nil, err
}
buf.Write(b)
fieldSeparator = ","
}

if !n.IPAM.IsEmpty() {
buf.WriteString(fmt.Sprintf("%s\"ipam\":", fieldSeparator))
b, err := json.Marshal(n.IPAM)
if err != nil {
return nil, err
}
buf.Write(b)
fieldSeparator = ","
}

if !n.DNS.IsEmpty() {
buf.WriteString(fmt.Sprintf("%s\"dns\":", fieldSeparator))
b, err := json.Marshal(n.DNS)
if err != nil {
return nil, err
}
buf.Write(b)
fieldSeparator = ","
}

if len(n.RawPrevResult) != 0 {
buf.WriteString(fmt.Sprintf("%s\"prevResult\":", fieldSeparator))
b, err := json.Marshal(n.RawPrevResult)
if err != nil {
return nil, err
}
buf.Write(b)
}
buf.WriteString("}")

return buf.Bytes(), nil
}

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 +187,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 2aa3157

Please sign in to comment.