Skip to content

Commit 0a9fad0

Browse files
author
Vipin Jain
committed
Merge branch 'scheduler_integ'
2 parents dc3007a + b307db4 commit 0a9fad0

File tree

8 files changed

+292
-43
lines changed

8 files changed

+292
-43
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
2+
{
3+
"Hosts" : [{
4+
"Name" : "host1",
5+
"VtepIp" : "192.168.2.10"
6+
},
7+
{
8+
"Name" : "host2",
9+
"VtepIp" : "192.168.2.11"
10+
}],
11+
"Tenants" : [ {
12+
"Name" : "tenant-one",
13+
"DefaultNetType" : "vxlan",
14+
"SubnetPool" : "11.1.0.0/16",
15+
"AllocSubnetLen" : 24,
16+
"Vxlans" : "10001-20000",
17+
"Networks" : [ {
18+
"Name" : "orange",
19+
"Endpoints" : [ {
20+
"Container" : "myContainer1"
21+
},
22+
{
23+
"Container" : "myContainer3"
24+
} ]
25+
},
26+
{
27+
"Name" : "purple",
28+
"Endpoints" : [ {
29+
"Container" : "myContainer2"
30+
},
31+
{
32+
"Container" : "myContainer4"
33+
} ]
34+
} ]
35+
} ]
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
2+
[{
3+
"Container" : "myContainer1",
4+
"Host" : "host1"
5+
},
6+
{
7+
"Container" : "myContainer2",
8+
"Host" : "host1"
9+
},
10+
{
11+
"Container" : "myContainer3",
12+
"Host" : "host2"
13+
},
14+
{
15+
"Container" : "myContainer4",
16+
"Host" : "host2"
17+
}]

netdcli/cfg.go

+26-7
Original file line numberDiff line numberDiff line change
@@ -233,18 +233,34 @@ func executeJsonCfg(defOpts *cliOpts) (err error) {
233233
return err
234234
}
235235

236-
allCfg := &netmaster.Config{}
237-
err = json.Unmarshal(data, allCfg)
236+
stateDriver, err := initEtcd(defOpts)
238237
if err != nil {
239-
log.Printf("unmarshal error '%s', tenants %v \n", err, allCfg)
238+
log.Fatalf("Failed to init etcd driver. Error: %s", err)
239+
}
240+
241+
if opts.cfgHostBindings {
242+
epBindings := []netmaster.ConfigEp{}
243+
err = json.Unmarshal(data, &epBindings)
244+
if err != nil {
245+
log.Printf("error '%s' unmarshing host bindings, data %s \n",
246+
err, data)
247+
return
248+
}
249+
250+
err = netmaster.CreateEpBindings(stateDriver, &epBindings)
251+
if err != nil {
252+
log.Printf("error '%s' creating host bindings \n", err)
253+
}
240254
return
241255
}
242-
// log.Printf("parsed config %v \n", allCfg)
243256

244-
stateDriver, err := initEtcd(defOpts)
257+
allCfg := &netmaster.Config{}
258+
err = json.Unmarshal(data, allCfg)
245259
if err != nil {
246-
log.Fatalf("Failed to init etcd driver. Error: %s", err)
260+
log.Printf("error '%s' unmarshaling tenant cfg, data %s \n", err, data)
261+
return
247262
}
263+
// log.Printf("parsed config %v \n", allCfg)
248264

249265
if defOpts.cfgDesired {
250266
err = deleteDelta(stateDriver, allCfg)
@@ -256,8 +272,11 @@ func executeJsonCfg(defOpts *cliOpts) (err error) {
256272

257273
if defOpts.cfgDeletions {
258274
err = processDeletions(stateDriver, allCfg)
259-
} else {
275+
} else if defOpts.cfgAdditions || defOpts.cfgDesired {
260276
err = processAdditions(stateDriver, allCfg)
277+
} else {
278+
log.Fatalf("invalid json config file type\n")
279+
return
261280
}
262281
if err != nil {
263282
log.Printf("error processing cfg '%s' \n", err)

netdcli/netdcli.go

+30-25
Original file line numberDiff line numberDiff line change
@@ -104,30 +104,31 @@ func (c *Construct) Get() interface{} {
104104
}
105105

106106
type cliOpts struct {
107-
help bool
108-
cfgDesired bool
109-
cfgAdditions bool
110-
cfgDeletions bool
111-
oper Operation
112-
construct Construct
113-
etcdUrl string
114-
tenant string
115-
netId string
116-
pktTag string
117-
pktTagType string
118-
subnetCidr string
119-
ipAddr string
120-
contName string
121-
subnetIp string
122-
subnetLen uint
123-
allocSubnetLen uint
124-
defaultGw string
125-
idStr string
126-
vlans string
127-
vxlans string
128-
homingHost string
129-
vtepIp string
130-
intfName string
107+
help bool
108+
cfgDesired bool
109+
cfgAdditions bool
110+
cfgDeletions bool
111+
cfgHostBindings bool
112+
oper Operation
113+
construct Construct
114+
etcdUrl string
115+
tenant string
116+
netId string
117+
pktTag string
118+
pktTagType string
119+
subnetCidr string
120+
ipAddr string
121+
contName string
122+
subnetIp string
123+
subnetLen uint
124+
allocSubnetLen uint
125+
defaultGw string
126+
idStr string
127+
vlans string
128+
vxlans string
129+
homingHost string
130+
vtepIp string
131+
intfName string
131132
}
132133

133134
var opts cliOpts
@@ -141,6 +142,10 @@ func init() {
141142
flagSet.Var(&opts.construct,
142143
"construct",
143144
"Construct to operate on i.e network or endpoint")
145+
flagSet.BoolVar(&opts.cfgHostBindings,
146+
"host-bindings-cfg",
147+
false,
148+
"Json file describing container to host bindings")
144149
flagSet.BoolVar(&opts.cfgAdditions,
145150
"add-cfg",
146151
false,
@@ -461,7 +466,7 @@ func main() {
461466
}
462467
opts.idStr = flagSet.Arg(0)
463468

464-
if opts.cfgDesired || opts.cfgDeletions || opts.cfgAdditions {
469+
if opts.cfgDesired || opts.cfgDeletions || opts.cfgAdditions || opts.cfgHostBindings {
465470
err = executeJsonCfg(&opts)
466471
} else {
467472
err = executeOpts(&opts)

netmaster/netmaster.go

+49-4
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@ See the License for the specific language governing permissions and
1313
limitations under the License.
1414
*/
1515

16-
// netmaster - implements the network intent translation to plugin
17-
// events; uses state distribution to achieve intent realization
18-
// netmaster runs as a logically centralized unit on in the cluster
19-
2016
package netmaster
2117

2218
import (
@@ -697,6 +693,9 @@ func validateEndpointConfig(stateDriver core.StateDriver, tenant *ConfigTenant)
697693
}
698694

699695
for _, ep := range network.Endpoints {
696+
if ep.Container == "" {
697+
return errors.New("invalid container name for the endpoint")
698+
}
700699
if ep.IpAddress != "" {
701700
nwMasterCfg := &MasterNwConfig{StateDriver: stateDriver}
702701
err = nwMasterCfg.Read(network.Name)
@@ -927,3 +926,49 @@ func DeleteEndpoints(stateDriver core.StateDriver, tenant *ConfigTenant) error {
927926

928927
return err
929928
}
929+
930+
func validateEpBindings(epBindings *[]ConfigEp) error {
931+
for _, ep := range *epBindings {
932+
if ep.Host == "" {
933+
return errors.New("invalid host name for the endpoint")
934+
}
935+
if ep.Container == "" {
936+
return errors.New("invalid container name for the endpoint")
937+
}
938+
}
939+
940+
return nil
941+
}
942+
943+
func CreateEpBindings(stateDriver core.StateDriver, epBindings *[]ConfigEp) error {
944+
945+
err := validateEpBindings(epBindings)
946+
if err != nil {
947+
log.Printf("error '%s' validating the ep bindings \n", err)
948+
return err
949+
}
950+
951+
epCfgs, err := drivers.ReadAllOvsCfgEndpoints(stateDriver)
952+
if err != nil {
953+
log.Printf("error '%s' fetching eps \n", err)
954+
return err
955+
}
956+
for _, ep := range *epBindings {
957+
log.Printf("creating binding between container '%s' and host '%s' \n",
958+
ep.Container, ep.Host)
959+
960+
for _, epCfg := range epCfgs {
961+
if epCfg.ContName != ep.Container {
962+
continue
963+
}
964+
epCfg.HomingHost = ep.Host
965+
err = epCfg.Write()
966+
if err != nil {
967+
log.Printf("error '%s' updating epCfg \n", err)
968+
return err
969+
}
970+
}
971+
}
972+
973+
return nil
974+
}

netmaster/netmaster_test.go

+84-7
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ type ValueData struct {
3232
var testState map[string]ValueData
3333

3434
// fake implementation of state driver for the tests
35-
var d = &fakeStateDriver{}
35+
var fakeDriver = &fakeStateDriver{}
3636

3737
type fakeStateDriver struct {
3838
}
@@ -123,32 +123,32 @@ func applyConfig(t *testing.T, cfgBytes []byte) {
123123
t.Fatalf("error '%s' parsing config '%s'\n", err, cfgBytes)
124124
}
125125

126-
d.Init(nil)
126+
fakeDriver.Init(nil)
127127
for _, host := range cfg.Hosts {
128-
err = CreateHost(d, &host)
128+
err = CreateHost(fakeDriver, &host)
129129
if err != nil {
130130
t.Fatalf("error '%s' creating host\n", err)
131131
}
132132
}
133133

134134
for _, tenant := range cfg.Tenants {
135-
err = CreateTenant(d, &tenant)
135+
err = CreateTenant(fakeDriver, &tenant)
136136
if err != nil {
137137
t.Fatalf("error '%s' creating tenant\n", err)
138138
}
139139

140-
err = CreateNetworks(d, &tenant)
140+
err = CreateNetworks(fakeDriver, &tenant)
141141
if err != nil {
142142
t.Fatalf("error '%s' creating networks\n", err)
143143
}
144144

145-
err = CreateEndpoints(d, &tenant)
145+
err = CreateEndpoints(fakeDriver, &tenant)
146146
if err != nil {
147147
t.Fatalf("error '%s' creating endpoints\n", err)
148148
}
149149
}
150150

151-
d.DumpState()
151+
fakeDriver.DumpState()
152152
}
153153

154154
func verifyKeys(t *testing.T, keys []string) {
@@ -304,3 +304,80 @@ func TestVxlanConfig(t *testing.T) {
304304

305305
verifyKeys(t, keys)
306306
}
307+
308+
func TestVxlanConfigWithLateHostBindings(t *testing.T) {
309+
cfgBytes := []byte(`{
310+
"Hosts" : [{
311+
"Name" : "host1",
312+
"VtepIp" : "192.168.2.11"
313+
},
314+
{
315+
"Name" : "host2",
316+
"VtepIp" : "192.168.2.12"
317+
}],
318+
"Tenants" : [{
319+
"Name" : "tenant-one",
320+
"DefaultNetType" : "vxlan",
321+
"SubnetPool" : "11.1.0.0/16",
322+
"AllocSubnetLen" : 24,
323+
"Vxlans" : "10001-20000",
324+
"Networks" : [{
325+
"Name" : "orange",
326+
"Endpoints" : [
327+
{
328+
"Container" : "myContainer1"
329+
},
330+
{
331+
"Container" : "myContainer3"
332+
}
333+
]
334+
},
335+
{
336+
"Name" : "purple",
337+
"Endpoints" : [{
338+
"Container" : "myContainer2"
339+
},
340+
{
341+
"Container" : "myContainer4"
342+
}]
343+
}]
344+
}]}`)
345+
346+
applyConfig(t, cfgBytes)
347+
fakeDriver.DumpState()
348+
349+
keys := []string{"tenant-one", "nets/orange", "nets/purple",
350+
"orange-host1", "purple-host1",
351+
"purple-host2", "orange-host2"}
352+
353+
verifyKeys(t, keys)
354+
355+
epBindings := []ConfigEp{{
356+
Container: "myContainer1",
357+
Host: "host1",
358+
}, {
359+
Container: "myContainer2",
360+
Host: "host1",
361+
}, {
362+
Container: "myContainer3",
363+
Host: "host2",
364+
}, {
365+
Container: "myContainer4",
366+
Host: "host2",
367+
}}
368+
369+
err := CreateEpBindings(fakeDriver, &epBindings)
370+
if err != nil {
371+
t.Fatalf("error '%s' creating tenant\n", err)
372+
}
373+
374+
keys = []string{"tenant-one", "nets/orange", "nets/purple",
375+
"myContainer1", "myContainer2",
376+
"myContainer3", "myContainer4",
377+
"orange-host1", "purple-host1",
378+
"purple-host2", "orange-host2"}
379+
380+
fakeDriver.DumpState()
381+
382+
verifyKeys(t, keys)
383+
}

0 commit comments

Comments
 (0)