Skip to content

Commit 3e07c67

Browse files
authored
Merge pull request #54 from plumgrid/sagheer-dev
add checks against router and bridge options
2 parents 73f14d7 + b923f75 commit 3e07c67

3 files changed

Lines changed: 70 additions & 14 deletions

File tree

plugin/driver/driver.go

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,12 @@ func (driver *driver) createNetwork(w http.ResponseWriter, r *http.Request) {
139139
neName := create.Options[netlabel.GenericData].(map[string]interface{})["bridge"]
140140

141141
if neName != nil {
142-
AddNetworkInfo(create.NetworkID, neName.(string), domainid.(string))
142+
if err := AddNetworkInfo(create.NetworkID, neName.(string), domainid.(string)); err != nil {
143+
Log.Error(err)
144+
DomainDelete(domainid.(string))
145+
errorResponse(w, fmt.Sprintf("Bridge (%s) doesnot exist in doamin (%s).", neName.(string), domainid.(string)))
146+
return
147+
}
143148
AddGatewayInfo(create.NetworkID, domainid.(string), gatewayip)
144149
emptyResponse(w)
145150

@@ -155,7 +160,13 @@ func (driver *driver) createNetwork(w http.ResponseWriter, r *http.Request) {
155160
tm, _ := hex.DecodeString(ipnet.Mask.String())
156161
netmask := fmt.Sprintf("%v.%v.%v.%v", tm[0], tm[1], tm[2], tm[3])
157162
Log.Infof("Adding router interface for : ", router, gatewayip, netmask)
158-
CreateNetworkLink(router.(string), domainid.(string), create.NetworkID, gatewayip, netmask)
163+
if err := CreateNetworkLink(router.(string), domainid.(string), create.NetworkID, gatewayip, netmask); err != nil {
164+
Log.Error(err)
165+
BridgeDelete(create.NetworkID, domainid.(string))
166+
DomainDelete(domainid.(string))
167+
errorResponse(w, fmt.Sprintf("Router (%s) doesnot exist in doamin (%s).", router.(string), domainid.(string)))
168+
return
169+
}
159170
}
160171

161172
emptyResponse(w)
@@ -202,7 +213,7 @@ func (driver *driver) createEndpoint(w http.ResponseWriter, r *http.Request) {
202213
local := vethPair(endID[:5])
203214
if err := netlink.LinkAdd(local); err != nil {
204215
Log.Error(err)
205-
errorResponsef(w, "could not create veth pair")
216+
errorResponse(w, "could not create veth pair")
206217
return
207218
}
208219
link, _ := netlink.LinkByName(local.PeerName)
@@ -273,7 +284,6 @@ func (driver *driver) joinEndpoint(w http.ResponseWriter, r *http.Request) {
273284
mac := link.Attrs().HardwareAddr.String()
274285
Log.Infof("mac address: %s\n", mac)
275286

276-
//first command {adding port on plumgrid}
277287
cmdStr := "sudo /opt/pg/bin/ifc_ctl gateway add_port " + if_local_name
278288
Log.Infof("addport cmd: %s", cmdStr)
279289
cmd := exec.Command("/bin/sh", "-c", cmdStr)
@@ -282,9 +292,12 @@ func (driver *driver) joinEndpoint(w http.ResponseWriter, r *http.Request) {
282292
if err := cmd.Run(); err != nil {
283293
Log.Error("Error thrown: ", err)
284294
}
285-
Log.Infof("output: %+v\n", addport.String())
295+
if addport.String() != "" {
296+
Log.Error(fmt.Errorf(addport.String()))
297+
errorResponse(w, "Unable to on-board container onto PLUMgrid")
298+
return
299+
}
286300

287-
//second command {up the port on plumgrid}
288301
cmdStr = "sudo /opt/pg/bin/ifc_ctl gateway ifup " + if_local_name + " access_container cont_" + endID[:8] + " " + mac + " pgtag2=" + bridgeID + " pgtag1=" + domainid
289302
Log.Infof("ifup cmd: %s", cmdStr)
290303
cmd = exec.Command("/bin/sh", "-c", cmdStr)
@@ -293,10 +306,14 @@ func (driver *driver) joinEndpoint(w http.ResponseWriter, r *http.Request) {
293306
if err := cmd.Run(); err != nil {
294307
Log.Error("Error thrown: ", err)
295308
}
296-
Log.Infof("output: %+v\n", ifup.String())
309+
if ifup.String() != "" {
310+
Log.Error(fmt.Errorf(ifup.String()))
311+
errorResponse(w, "Unable to on-board container onto PLUMgrid")
312+
return
313+
}
297314

298315
if netlink.LinkSetUp(local) != nil {
299-
errorResponsef(w, `unable to bring veth up`)
316+
errorResponse(w, "unable to bring veth up")
300317
return
301318
}
302319

@@ -329,7 +346,6 @@ func (driver *driver) leaveEndpoint(w http.ResponseWriter, r *http.Request) {
329346

330347
if_local_name := "tap" + l.EndpointID[:5]
331348

332-
//first command {adding port on plumgrid}
333349
cmdStr := "sudo /opt/pg/bin/ifc_ctl gateway ifdown " + if_local_name
334350
Log.Infof("ifdown cmd: %s", cmdStr)
335351
cmd := exec.Command("/bin/sh", "-c", cmdStr)
@@ -338,9 +354,11 @@ func (driver *driver) leaveEndpoint(w http.ResponseWriter, r *http.Request) {
338354
if err := cmd.Run(); err != nil {
339355
Log.Error("Error thrown: ", err)
340356
}
341-
Log.Infof("output: %+v\n", ifdown.String())
357+
if ifdown.String() != "" {
358+
Log.Error(fmt.Errorf(ifdown.String()))
359+
errorResponse(w, "Unable to off-board container from PLUMgrid")
360+
}
342361

343-
//second command {up the port on plumgrid}
344362
cmdStr = "sudo /opt/pg/bin/ifc_ctl gateway del_port " + if_local_name
345363
Log.Infof("delport cmd: %s", cmdStr)
346364
cmd = exec.Command("/bin/sh", "-c", cmdStr)
@@ -350,6 +368,10 @@ func (driver *driver) leaveEndpoint(w http.ResponseWriter, r *http.Request) {
350368
Log.Error("Error thrown: ", err)
351369
}
352370
Log.Infof("output: %+v\n", delport.String())
371+
if delport.String() != "" {
372+
Log.Error(fmt.Errorf(delport.String()))
373+
errorResponse(w, "Unable to off-board container from PLUMgrid")
374+
}
353375

354376
RemoveMetaconfig(domainid, bridgeID, l.EndpointID)
355377

plugin/driver/pg_helper.go

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package driver
1616

1717
import (
1818
"encoding/json"
19+
"fmt"
1920
"strings"
2021
)
2122

@@ -77,14 +78,19 @@ func BridgeDelete(ID string, domainid string) {
7778
RestCall("DELETE", url, nil)
7879
}
7980

80-
func AddNetworkInfo(dNetwork string, neName string, domain string) {
81+
func AddNetworkInfo(dNetwork string, neName string, domain string) error {
82+
8183
id := GetNeId(neName, domain)
8284
var neId string
8385
if id == "" {
8486
neId = neName
8587
} else {
8688
neId = id
8789
}
90+
if !CheckNeExists(neId, domain) {
91+
return fmt.Errorf("Bridge (%s) doesnot exist in doamin (%s).", neName, domain)
92+
}
93+
8894
url := "/0/connectivity/domain/" + domain + "/ne/" + neId
8995
body, _ := RestCall("GET", url+"?configonly=true", nil)
9096
var netData map[string]interface{}
@@ -95,6 +101,8 @@ func AddNetworkInfo(dNetwork string, neName string, domain string) {
95101
netData["metadata"] = dNetwork
96102
finalData, _ := json.Marshal(netData)
97103
RestCall("PUT", url, finalData)
104+
105+
return nil
98106
}
99107

100108
func FindDomainFromNetwork(ID string) (domainid string, netid string) {
@@ -238,9 +246,13 @@ func GetNeId(NeName string, DomainID string) (NeID string) {
238246
return ""
239247
}
240248

241-
func CreateNetworkLink(NeName string, DomainID string, NetworkID string, IP string, Netmask string) {
249+
func CreateNetworkLink(NeName string, DomainID string, NetworkID string, IP string, Netmask string) error {
242250

243251
ne_ID := GetNeId(NeName, DomainID)
252+
if !CheckNeExists(ne_ID, DomainID) {
253+
return fmt.Errorf("Router (%s) doesnot exist in doamin (%s).", NeName, DomainID)
254+
}
255+
244256
CheckNeChildList(ne_ID, DomainID, "ifc")
245257
CheckNeChildList(NetworkName(NetworkID), DomainID, "ifc")
246258
ne_ifc := NetworkID
@@ -271,6 +283,8 @@ func CreateNetworkLink(NeName string, DomainID string, NetworkID string, IP stri
271283
"attachment1": "/ne/` + ne_ID + `/ifc/` + ne_ifc + `",
272284
"attachment2": "/ne/` + NetworkName(NetworkID) + `/ifc/` + net_ifc + `"}`)
273285
RestCall("PUT", url, data)
286+
287+
return nil
274288
}
275289

276290
func DeleteNetworkLinks(DomainID string, NetworkID string) {
@@ -409,3 +423,23 @@ func DeleteAttachedLB(DomainID string, NetworkID string) {
409423
}
410424
}
411425
}
426+
427+
func CheckNeExists(ne_name, domain string) bool {
428+
429+
url := "/0/connectivity/domain/" + domain + "/ne?configonly=true"
430+
431+
body, _ := RestCall("GET", url+"?configonly=true", nil)
432+
var domain_data map[string]interface{}
433+
err := json.Unmarshal([]byte(body), &domain_data)
434+
if err != nil {
435+
panic(err)
436+
}
437+
438+
for ne, _ := range domain_data {
439+
if ne_name == ne {
440+
return true
441+
}
442+
}
443+
444+
return false
445+
}

plugin/driver/utils.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func sendError(w http.ResponseWriter, msg string, code int) {
3636
http.Error(w, msg, code)
3737
}
3838

39-
func errorResponsef(w http.ResponseWriter, fmtString string, item ...interface{}) {
39+
func errorResponse(w http.ResponseWriter, fmtString string, item ...interface{}) {
4040
json.NewEncoder(w).Encode(map[string]string{
4141
"Err": fmt.Sprintf(fmtString, item...),
4242
})

0 commit comments

Comments
 (0)