@@ -24,8 +24,10 @@ import (
24
24
"encoding/json"
25
25
"errors"
26
26
"fmt"
27
+ "io/ioutil"
27
28
"log"
28
29
"net"
30
+ "os"
29
31
"runtime"
30
32
"sort"
31
33
"time"
@@ -36,6 +38,7 @@ import (
36
38
"github.com/containernetworking/plugins/pkg/ip"
37
39
"github.com/containernetworking/plugins/pkg/ipam"
38
40
"github.com/containernetworking/plugins/pkg/ns"
41
+ "github.com/imdario/mergo"
39
42
"github.com/j-keck/arping"
40
43
"github.com/vishvananda/netlink"
41
44
@@ -51,11 +54,13 @@ const (
51
54
52
55
type netConf struct {
53
56
types.NetConf
54
- BrName string `json:"bridge,omitempty"`
55
- VlanTag * uint `json:"vlan"`
56
- MTU int `json:"mtu"`
57
- Trunk []* trunk `json:"trunk,omitempty"`
58
- DeviceID string `json:"deviceID"` // PCI address of a VF in valid sysfs format
57
+ BrName string `json:"bridge,omitempty"`
58
+ VlanTag * uint `json:"vlan"`
59
+ MTU int `json:"mtu"`
60
+ Trunk []* trunk `json:"trunk,omitempty"`
61
+ DeviceID string `json:"deviceID"` // PCI address of a VF in valid sysfs format
62
+ ConfigurationPath string `json:"configuration_path"`
63
+ SocketFile string `json:"socket_file"`
59
64
}
60
65
61
66
type trunk struct {
@@ -112,6 +117,61 @@ func loadNetConf(bytes []byte) (*netConf, error) {
112
117
return netconf , nil
113
118
}
114
119
120
+ func loadFlatNetConf (configPath string ) (* netConf , error ) {
121
+ confFiles := getOvsConfFiles ()
122
+ if configPath != "" {
123
+ confFiles = append ([]string {configPath }, confFiles ... )
124
+ }
125
+
126
+ // loop through the path and parse the JSON config
127
+ flatNetConf := & netConf {}
128
+ for _ , confFile := range confFiles {
129
+ confExists , err := pathExists (confFile )
130
+ if err != nil {
131
+ return nil , fmt .Errorf ("error checking ovs config file: error: %v" , err )
132
+ }
133
+ if confExists {
134
+ jsonFile , err := os .Open (confFile )
135
+ if err != nil {
136
+ return nil , fmt .Errorf ("open ovs config file %s error: %v" , confFile , err )
137
+ }
138
+ defer jsonFile .Close ()
139
+ jsonBytes , err := ioutil .ReadAll (jsonFile )
140
+ if err != nil {
141
+ return nil , fmt .Errorf ("load ovs config file %s: error: %v" , confFile , err )
142
+ }
143
+ if err := json .Unmarshal (jsonBytes , flatNetConf ); err != nil {
144
+ return nil , fmt .Errorf ("parse ovs config file %s: error: %v" , confFile , err )
145
+ }
146
+ break
147
+ }
148
+ }
149
+
150
+ return flatNetConf , nil
151
+ }
152
+
153
+ func mergeConf (netconf , flatNetConf * netConf ) (* netConf , error ) {
154
+ if err := mergo .Merge (netconf , flatNetConf ); err != nil {
155
+ return nil , fmt .Errorf ("merge with ovs config file: error: %v" , err )
156
+ }
157
+ return netconf , nil
158
+ }
159
+
160
+ func pathExists (path string ) (bool , error ) {
161
+ _ , err := os .Stat (path )
162
+ if err == nil {
163
+ return true , nil
164
+ }
165
+ if os .IsNotExist (err ) {
166
+ return false , nil
167
+ }
168
+ return false , err
169
+ }
170
+
171
+ func getOvsConfFiles () []string {
172
+ return []string {"/etc/kubernetes/cni/net.d/ovs.d/ovs.conf" , "/etc/cni/net.d/ovs.d/ovs.conf" }
173
+ }
174
+
115
175
func generateRandomMac () net.HardwareAddr {
116
176
prefix := []byte {0x02 , 0x00 , 0x00 } // local unicast prefix
117
177
suffix := make ([]byte , 3 )
@@ -284,6 +344,14 @@ func CmdAdd(args *skel.CmdArgs) error {
284
344
if err != nil {
285
345
return err
286
346
}
347
+ flatNetConf , err := loadFlatNetConf (netconf .ConfigurationPath )
348
+ if err != nil {
349
+ return err
350
+ }
351
+ netconf , err = mergeConf (netconf , flatNetConf )
352
+ if err != nil {
353
+ return err
354
+ }
287
355
288
356
var vlanTagNum uint = 0
289
357
trunks := make ([]uint , 0 )
@@ -306,7 +374,7 @@ func CmdAdd(args *skel.CmdArgs) error {
306
374
return err
307
375
}
308
376
309
- ovsDriver , err := ovsdb .NewOvsBridgeDriver (bridgeName )
377
+ ovsDriver , err := ovsdb .NewOvsBridgeDriver (bridgeName , netconf . SocketFile )
310
378
if err != nil {
311
379
return err
312
380
}
@@ -480,7 +548,7 @@ func CmdDel(args *skel.CmdArgs) error {
480
548
return err
481
549
}
482
550
483
- ovsDriver , err := ovsdb .NewOvsBridgeDriver (bridgeName )
551
+ ovsDriver , err := ovsdb .NewOvsBridgeDriver (bridgeName , netconf . SocketFile )
484
552
if err != nil {
485
553
return err
486
554
}
0 commit comments