Skip to content

Commit

Permalink
CNS writes Cilium Conflist (#1901)
Browse files Browse the repository at this point in the history
* implement cilium conflist generator

* add cilium conflist for generator test

* update generator-windows

* cleaning up generator constants
  • Loading branch information
camrynl authored Apr 11, 2023
1 parent 5f89e37 commit e792ef5
Show file tree
Hide file tree
Showing 6 changed files with 104 additions and 7 deletions.
43 changes: 39 additions & 4 deletions cns/cniconflist/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,15 @@ import (
)

const (
cniVersion = "0.3.0" //nolint:unused,deadcode,varcheck // used in linux
cniName = "azure" //nolint:unused,deadcode,varcheck // used in linux
cniType = "azure-vnet" //nolint:unused,deadcode,varcheck // used in linux
nodeLocalDNSIP = "169.254.20.10" //nolint:unused,deadcode,varcheck // used in linux
ciliumcniVersion = "0.3.1" //nolint:unused,deadcode,varcheck // used in linux
ciliumcniName = "cilium" //nolint:unused,deadcode,varcheck // used in linux
ciliumcniType = "cilium-cni" //nolint:unused,deadcode,varcheck // used in linux
ciliumLogFile = "/var/log/cilium-cni.log" //nolint:unused,deadcode,varcheck // used in linux
ciliumIPAM = "azure-ipam" //nolint:unused,deadcode,varcheck // used in linux
overlaycniVersion = "0.3.0" //nolint:unused,deadcode,varcheck // used in linux
overlaycniName = "azure" //nolint:unused,deadcode,varcheck // used in linux
overlaycniType = "azure-vnet" //nolint:unused,deadcode,varcheck // used in linux
nodeLocalDNSIP = "169.254.20.10" //nolint:unused,deadcode,varcheck // used in linux
)

// cniConflist represents the containernetworking/cni/pkg/types.NetConfList
Expand All @@ -21,15 +26,45 @@ type cniConflist struct { //nolint:unused,deadcode // used in linux
Plugins []any `json:"plugins,omitempty"`
}

// NetConf describes a network. It represents the Cilium specific containernetworking/cni/pkg/types.NetConf
type NetConf struct {
CNIVersion string `json:"cniVersion,omitempty"`
Name string `json:"name,omitempty"`
Type string `json:"type,omitempty"`
Capabilities map[string]bool `json:"capabilities,omitempty"`
IPAM IPAM `json:"ipam,omitempty"`
EnableDebug bool `json:"enable-debug"`
LogFile string `json:"log-file"`

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

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

// V4OverlayGenerator generates the Azure CNI conflist for the ipv4 Overlay scenario
type V4OverlayGenerator struct {
Writer io.WriteCloser
}

// CiliumGenerator generates the Azure CNI conflist for the Cilium scenario
type CiliumGenerator struct {
Writer io.WriteCloser
}

func (v *V4OverlayGenerator) Close() error {
if err := v.Writer.Close(); err != nil {
return errors.Wrap(err, "error closing generator")
}

return nil
}

func (v *CiliumGenerator) Close() error {
if err := v.Writer.Close(); err != nil {
return errors.Wrap(err, "error closing generator")
}

return nil
}
32 changes: 29 additions & 3 deletions cns/cniconflist/generator_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@ var portmapConfig any = struct {
// Generate writes the CNI conflist to the Generator's output stream
func (v *V4OverlayGenerator) Generate() error {
conflist := cniConflist{
CNIVersion: cniVersion,
Name: cniName,
CNIVersion: overlaycniVersion,
Name: overlaycniName,
Plugins: []any{
cni.NetworkConfig{
Type: cniType,
Type: overlaycniType,
Mode: cninet.OpModeTransparent,
ExecutionMode: string(util.V4Swift),
IPsToRouteViaHost: []string{nodeLocalDNSIP},
Expand All @@ -51,3 +51,29 @@ func (v *V4OverlayGenerator) Generate() error {

return nil
}

// Generate writes the CNI conflist to the Generator's output stream
func (v *CiliumGenerator) Generate() error {
conflist := cniConflist{
CNIVersion: ciliumcniVersion,
Name: ciliumcniName,
Plugins: []any{
NetConf{
Type: ciliumcniType,
LogFile: ciliumLogFile,
EnableDebug: true,
IPAM: IPAM{
Type: ciliumIPAM,
},
},
},
}

enc := json.NewEncoder(v.Writer)
enc.SetIndent("", "\t")
if err := enc.Encode(conflist); err != nil {
return errors.Wrap(err, "error encoding conflist to json")
}

return nil
}
15 changes: 15 additions & 0 deletions cns/cniconflist/generator_linux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,21 @@ func TestGenerateV4OverlayConflist(t *testing.T) {
assert.Equal(t, removeNewLines(fixtureBytes), removeNewLines(buffer.Bytes()))
}

func TestGenerateCiliumConflist(t *testing.T) {
fixture := "testdata/fixtures/cilium.conflist"

buffer := new(bytes.Buffer)
g := cniconflist.CiliumGenerator{Writer: &bufferWriteCloser{buffer}}
err := g.Generate()
assert.NoError(t, err)

fixtureBytes, err := os.ReadFile(fixture)
assert.NoError(t, err)

// remove newlines and carriage returns in case these UTs are running on Windows
assert.Equal(t, removeNewLines(fixtureBytes), removeNewLines(buffer.Bytes()))
}

// removeNewLines will remove the newlines and carriage returns from the byte slice
func removeNewLines(b []byte) []byte {
var bb []byte //nolint:prealloc // can't prealloc since we don't know how many bytes will get removed
Expand Down
4 changes: 4 additions & 0 deletions cns/cniconflist/generator_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,7 @@ var errNotImplemented = errors.New("cni conflist generator not implemented on Wi
func (v *V4OverlayGenerator) Generate() error {
return errNotImplemented
}

func (v *CiliumGenerator) Generate() error {
return errNotImplemented
}
14 changes: 14 additions & 0 deletions cns/cniconflist/testdata/fixtures/cilium.conflist
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"cniVersion": "0.3.1",
"name": "cilium",
"plugins": [
{
"type": "cilium-cni",
"ipam": {
"type": "azure-ipam"
},
"enable-debug": true,
"log-file": "/var/log/cilium-cni.log"
}
]
}
3 changes: 3 additions & 0 deletions cns/service/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ type cniConflistScenario string

const (
scenarioV4Overlay cniConflistScenario = "v4overlay"
scenarioCilium cniConflistScenario = "cilium"
)

var (
Expand Down Expand Up @@ -535,6 +536,8 @@ func main() {
switch scenario := cniConflistScenario(scenarioString); scenario {
case scenarioV4Overlay:
conflistGenerator = &cniconflist.V4OverlayGenerator{Writer: writer}
case scenarioCilium:
conflistGenerator = &cniconflist.CiliumGenerator{Writer: writer}
default:
logger.Errorf("unable to generate cni conflist for unknown scenario: %s", scenario)
os.Exit(1)
Expand Down

0 comments on commit e792ef5

Please sign in to comment.