Skip to content

Commit 2029329

Browse files
committed
add support to launch containers onto pre-defined bridge
1 parent 14c8669 commit 2029329

2 files changed

Lines changed: 54 additions & 9 deletions

File tree

plugin/driver/driver.go

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626

2727
Log "github.com/Sirupsen/logrus"
2828
"github.com/docker/libnetwork/drivers/remote/api"
29+
"github.com/docker/libnetwork/netlabel"
2930
docker "github.com/fsouza/go-dockerclient"
3031

3132
"github.com/gorilla/mux"
@@ -128,13 +129,25 @@ func (driver *driver) createNetwork(w http.ResponseWriter, r *http.Request) {
128129
}
129130
Log.Infof("Create network request %+v", &create)
130131

131-
domainid := create.Options["com.docker.network.generic"].(map[string]interface{})["domain"]
132+
domainid := create.Options[netlabel.GenericData].(map[string]interface{})["domain"]
132133
if domainid == nil {
133134
domainid = default_vd
134135
}
135136
DomainCreate(domainid.(string))
136-
router := create.Options["com.docker.network.generic"].(map[string]interface{})["router"]
137+
137138
gatewayip := create.IPv4Data[0].Gateway.IP.String()
139+
neName := create.Options[netlabel.GenericData].(map[string]interface{})["bridge"]
140+
141+
if neName != nil {
142+
neID := GetNeId(neName.(string), domainid.(string))
143+
AddNetworkInfo(create.NetworkID, neID)
144+
AddGatewayInfo(create.NetworkID, domainid.(string), gatewayip)
145+
emptyResponse(w)
146+
147+
return
148+
}
149+
150+
router := create.Options[netlabel.GenericData].(map[string]interface{})["router"]
138151
BridgeCreate(create.NetworkID, domainid.(string), gatewayip)
139152

140153
if router != nil {
@@ -160,7 +173,7 @@ func (driver *driver) deleteNetwork(w http.ResponseWriter, r *http.Request) {
160173
}
161174
Log.Infof("Delete network request: %+v", &delete)
162175

163-
domainid := FindDomainFromNetwork(delete.NetworkID)
176+
domainid, _ := FindDomainFromNetwork(delete.NetworkID)
164177
if domainid == "" {
165178
domainid = default_vd
166179
}
@@ -229,7 +242,7 @@ func (driver *driver) joinEndpoint(w http.ResponseWriter, r *http.Request) {
229242

230243
netID := j.NetworkID
231244
endID := j.EndpointID
232-
domainid := FindDomainFromNetwork(netID)
245+
domainid, bridgeID := FindDomainFromNetwork(netID)
233246
if domainid == "" {
234247
domainid = default_vd
235248
}
@@ -270,7 +283,7 @@ func (driver *driver) joinEndpoint(w http.ResponseWriter, r *http.Request) {
270283
Log.Infof("output of cmd: %+v\n", out1.String())
271284

272285
//second command {up the port on plumgrid}
273-
cmdStr2 := "sudo /opt/pg/bin/ifc_ctl gateway ifup " + if_local_name + " access_container cont_" + endID[:2] + " " + mac[:17] + " pgtag2=bridge-" + netID[:10] + " pgtag1=" + domainid
286+
cmdStr2 := "sudo /opt/pg/bin/ifc_ctl gateway ifup " + if_local_name + " access_container cont_" + endID[:2] + " " + mac[:17] + " pgtag2=" + bridgeID + " pgtag1=" + domainid
274287
Log.Infof("third cmd: %s", cmdStr2)
275288
cmd2 := exec.Command("/bin/sh", "-c", cmdStr2)
276289
var out2 bytes.Buffer

plugin/driver/pg_helper.go

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ func BridgeCreate(ID string, domainid string, gatewayip string) {
2727
"action_text": "create_and_link_ifc(DYN_1)"}
2828
},
2929
"ifc": {},
30+
"metadata": "` + ID + `",
3031
"mobility": "true",
3132
"ne_description": "PLUMgrid Bridge",
3233
"ne_dname": "net-` + ID[:10] + `",
@@ -45,7 +46,7 @@ func BridgeCreate(ID string, domainid string, gatewayip string) {
4546
"rules` + ID + `": {
4647
"add_context": "",
4748
"criteria": "pgtag2",
48-
"match": "bridge-` + ID[:10] + `"
49+
"match": "bri` + ID + `"
4950
}
5051
}
5152
}`)
@@ -57,6 +58,13 @@ func BridgeCreate(ID string, domainid string, gatewayip string) {
5758
RestCall("PUT", url, data)
5859
}
5960

61+
func AddGatewayInfo(ID string, domainid string, gatewayip string) {
62+
63+
url := "/0/connectivity/domain_prop/" + domainid + "/ne/brii" + ID
64+
data := []byte(`{"ne_metadata": "` + gatewayip + `"}`)
65+
RestCall("PUT", url, data)
66+
}
67+
6068
func BridgeDelete(ID string, domainid string) {
6169

6270
url := "/0/connectivity/domain_prop/" + domainid + "/ne/brii" + ID
@@ -69,7 +77,7 @@ func BridgeDelete(ID string, domainid string) {
6977
RestCall("DELETE", url, nil)
7078
}
7179

72-
func FindDomainFromNetwork(ID string) (domainid string) {
80+
func AddNetworkInfo(dNetwork string, neID string) {
7381

7482
url := "/0/connectivity/domain?configonly=true&level=3"
7583
body, _ := RestCall("GET", url, nil)
@@ -80,12 +88,36 @@ func FindDomainFromNetwork(ID string) (domainid string) {
8088
}
8189
for domains, domain_val := range domain_data {
8290
if nes, ok := domain_val.(map[string]interface{})["ne"]; ok {
83-
if _, ok := nes.(map[string]interface{})["bri"+ID]; ok {
84-
domainid = domains
91+
if ne, ok := nes.(map[string]interface{})[neID]; ok {
92+
ne.(map[string]interface{})["metadata"] = dNetwork
93+
ne_data, _ := json.Marshal(ne)
94+
RestCall("PUT", "/0/connectivity/domain/"+domains+"/ne/"+neID, ne_data)
8595
break
8696
}
8797
}
8898
}
99+
}
100+
101+
func FindDomainFromNetwork(ID string) (domainid string, netid string) {
102+
103+
url := "/0/connectivity/domain?configonly=true&level=3"
104+
body, _ := RestCall("GET", url, nil)
105+
var domain_data map[string]interface{}
106+
err := json.Unmarshal([]byte(body), &domain_data)
107+
if err != nil {
108+
panic(err)
109+
}
110+
for domains, domain_val := range domain_data {
111+
if nes, ok := domain_val.(map[string]interface{})["ne"]; ok {
112+
for ne, data := range nes.(map[string]interface{}) {
113+
if data.(map[string]interface{})["metadata"] == ID {
114+
domainid = domains
115+
netid = ne
116+
break
117+
}
118+
}
119+
}
120+
}
89121
return
90122
}
91123

0 commit comments

Comments
 (0)