Skip to content

Commit e792ef5

Browse files
authored
CNS writes Cilium Conflist (#1901)
* implement cilium conflist generator * add cilium conflist for generator test * update generator-windows * cleaning up generator constants
1 parent 5f89e37 commit e792ef5

File tree

6 files changed

+104
-7
lines changed

6 files changed

+104
-7
lines changed

cns/cniconflist/generator.go

+39-4
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,15 @@ import (
77
)
88

99
const (
10-
cniVersion = "0.3.0" //nolint:unused,deadcode,varcheck // used in linux
11-
cniName = "azure" //nolint:unused,deadcode,varcheck // used in linux
12-
cniType = "azure-vnet" //nolint:unused,deadcode,varcheck // used in linux
13-
nodeLocalDNSIP = "169.254.20.10" //nolint:unused,deadcode,varcheck // used in linux
10+
ciliumcniVersion = "0.3.1" //nolint:unused,deadcode,varcheck // used in linux
11+
ciliumcniName = "cilium" //nolint:unused,deadcode,varcheck // used in linux
12+
ciliumcniType = "cilium-cni" //nolint:unused,deadcode,varcheck // used in linux
13+
ciliumLogFile = "/var/log/cilium-cni.log" //nolint:unused,deadcode,varcheck // used in linux
14+
ciliumIPAM = "azure-ipam" //nolint:unused,deadcode,varcheck // used in linux
15+
overlaycniVersion = "0.3.0" //nolint:unused,deadcode,varcheck // used in linux
16+
overlaycniName = "azure" //nolint:unused,deadcode,varcheck // used in linux
17+
overlaycniType = "azure-vnet" //nolint:unused,deadcode,varcheck // used in linux
18+
nodeLocalDNSIP = "169.254.20.10" //nolint:unused,deadcode,varcheck // used in linux
1419
)
1520

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

29+
// NetConf describes a network. It represents the Cilium specific containernetworking/cni/pkg/types.NetConf
30+
type NetConf struct {
31+
CNIVersion string `json:"cniVersion,omitempty"`
32+
Name string `json:"name,omitempty"`
33+
Type string `json:"type,omitempty"`
34+
Capabilities map[string]bool `json:"capabilities,omitempty"`
35+
IPAM IPAM `json:"ipam,omitempty"`
36+
EnableDebug bool `json:"enable-debug"`
37+
LogFile string `json:"log-file"`
38+
39+
RawPrevResult map[string]interface{} `json:"prevResult,omitempty"`
40+
}
41+
42+
type IPAM struct {
43+
Type string `json:"type,omitempty"`
44+
}
45+
2446
// V4OverlayGenerator generates the Azure CNI conflist for the ipv4 Overlay scenario
2547
type V4OverlayGenerator struct {
2648
Writer io.WriteCloser
2749
}
2850

51+
// CiliumGenerator generates the Azure CNI conflist for the Cilium scenario
52+
type CiliumGenerator struct {
53+
Writer io.WriteCloser
54+
}
55+
2956
func (v *V4OverlayGenerator) Close() error {
3057
if err := v.Writer.Close(); err != nil {
3158
return errors.Wrap(err, "error closing generator")
3259
}
3360

3461
return nil
3562
}
63+
64+
func (v *CiliumGenerator) Close() error {
65+
if err := v.Writer.Close(); err != nil {
66+
return errors.Wrap(err, "error closing generator")
67+
}
68+
69+
return nil
70+
}

cns/cniconflist/generator_linux.go

+29-3
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ var portmapConfig any = struct {
2626
// Generate writes the CNI conflist to the Generator's output stream
2727
func (v *V4OverlayGenerator) Generate() error {
2828
conflist := cniConflist{
29-
CNIVersion: cniVersion,
30-
Name: cniName,
29+
CNIVersion: overlaycniVersion,
30+
Name: overlaycniName,
3131
Plugins: []any{
3232
cni.NetworkConfig{
33-
Type: cniType,
33+
Type: overlaycniType,
3434
Mode: cninet.OpModeTransparent,
3535
ExecutionMode: string(util.V4Swift),
3636
IPsToRouteViaHost: []string{nodeLocalDNSIP},
@@ -51,3 +51,29 @@ func (v *V4OverlayGenerator) Generate() error {
5151

5252
return nil
5353
}
54+
55+
// Generate writes the CNI conflist to the Generator's output stream
56+
func (v *CiliumGenerator) Generate() error {
57+
conflist := cniConflist{
58+
CNIVersion: ciliumcniVersion,
59+
Name: ciliumcniName,
60+
Plugins: []any{
61+
NetConf{
62+
Type: ciliumcniType,
63+
LogFile: ciliumLogFile,
64+
EnableDebug: true,
65+
IPAM: IPAM{
66+
Type: ciliumIPAM,
67+
},
68+
},
69+
},
70+
}
71+
72+
enc := json.NewEncoder(v.Writer)
73+
enc.SetIndent("", "\t")
74+
if err := enc.Encode(conflist); err != nil {
75+
return errors.Wrap(err, "error encoding conflist to json")
76+
}
77+
78+
return nil
79+
}

cns/cniconflist/generator_linux_test.go

+15
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,21 @@ func TestGenerateV4OverlayConflist(t *testing.T) {
3232
assert.Equal(t, removeNewLines(fixtureBytes), removeNewLines(buffer.Bytes()))
3333
}
3434

35+
func TestGenerateCiliumConflist(t *testing.T) {
36+
fixture := "testdata/fixtures/cilium.conflist"
37+
38+
buffer := new(bytes.Buffer)
39+
g := cniconflist.CiliumGenerator{Writer: &bufferWriteCloser{buffer}}
40+
err := g.Generate()
41+
assert.NoError(t, err)
42+
43+
fixtureBytes, err := os.ReadFile(fixture)
44+
assert.NoError(t, err)
45+
46+
// remove newlines and carriage returns in case these UTs are running on Windows
47+
assert.Equal(t, removeNewLines(fixtureBytes), removeNewLines(buffer.Bytes()))
48+
}
49+
3550
// removeNewLines will remove the newlines and carriage returns from the byte slice
3651
func removeNewLines(b []byte) []byte {
3752
var bb []byte //nolint:prealloc // can't prealloc since we don't know how many bytes will get removed

cns/cniconflist/generator_windows.go

+4
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,7 @@ var errNotImplemented = errors.New("cni conflist generator not implemented on Wi
99
func (v *V4OverlayGenerator) Generate() error {
1010
return errNotImplemented
1111
}
12+
13+
func (v *CiliumGenerator) Generate() error {
14+
return errNotImplemented
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"cniVersion": "0.3.1",
3+
"name": "cilium",
4+
"plugins": [
5+
{
6+
"type": "cilium-cni",
7+
"ipam": {
8+
"type": "azure-ipam"
9+
},
10+
"enable-debug": true,
11+
"log-file": "/var/log/cilium-cni.log"
12+
}
13+
]
14+
}

cns/service/main.go

+3
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ type cniConflistScenario string
8787

8888
const (
8989
scenarioV4Overlay cniConflistScenario = "v4overlay"
90+
scenarioCilium cniConflistScenario = "cilium"
9091
)
9192

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

0 commit comments

Comments
 (0)