Skip to content

Commit e26439f

Browse files
authored
Merge pull request #60 from plumgrid/sagheer-dev
checks added for router & bridge options
2 parents f3f0800 + b923f75 commit e26439f

2 files changed

Lines changed: 101 additions & 12 deletions

File tree

plugin/driver/driver.go

Lines changed: 65 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,19 @@
1515
package driver
1616

1717
import (
18+
"bytes"
1819
"encoding/hex"
1920
"encoding/json"
2021
"fmt"
2122
"io"
2223
"net"
2324
"net/http"
25+
"os/exec"
2426

2527
Log "github.com/Sirupsen/logrus"
2628
"github.com/docker/libnetwork/drivers/remote/api"
2729
"github.com/docker/libnetwork/netlabel"
2830
docker "github.com/fsouza/go-dockerclient"
29-
"github.com/plumgrid/cli/helpers/plumgrid/ifc_ctl"
3031

3132
"github.com/gorilla/mux"
3233
"github.com/vishvananda/netlink"
@@ -138,7 +139,12 @@ func (driver *driver) createNetwork(w http.ResponseWriter, r *http.Request) {
138139
neName := create.Options[netlabel.GenericData].(map[string]interface{})["bridge"]
139140

140141
if neName != nil {
141-
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+
}
142148
AddGatewayInfo(create.NetworkID, domainid.(string), gatewayip)
143149
emptyResponse(w)
144150

@@ -154,7 +160,13 @@ func (driver *driver) createNetwork(w http.ResponseWriter, r *http.Request) {
154160
tm, _ := hex.DecodeString(ipnet.Mask.String())
155161
netmask := fmt.Sprintf("%v.%v.%v.%v", tm[0], tm[1], tm[2], tm[3])
156162
Log.Infof("Adding router interface for : ", router, gatewayip, netmask)
157-
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+
}
158170
}
159171

160172
emptyResponse(w)
@@ -272,14 +284,36 @@ func (driver *driver) joinEndpoint(w http.ResponseWriter, r *http.Request) {
272284
mac := link.Attrs().HardwareAddr.String()
273285
Log.Infof("mac address: %s\n", mac)
274286

275-
// ifc_ctl interface up {Interface Name, Container ID, Domain ID, Bridge ID, MAC address, SE name}
276-
if err := ifc_ctl.PgIfUp(if_local_name, "cont_"+endID[:8], domainid, bridgeID, mac, "gateway"); err != nil {
277-
Log.Error(err)
287+
cmdStr := "sudo /opt/pg/bin/ifc_ctl gateway add_port " + if_local_name
288+
Log.Infof("addport cmd: %s", cmdStr)
289+
cmd := exec.Command("/bin/sh", "-c", cmdStr)
290+
var addport bytes.Buffer
291+
cmd.Stdout = &addport
292+
if err := cmd.Run(); err != nil {
293+
Log.Error("Error thrown: ", err)
294+
}
295+
if addport.String() != "" {
296+
Log.Error(fmt.Errorf(addport.String()))
297+
errorResponse(w, "Unable to on-board container onto PLUMgrid")
298+
return
299+
}
300+
301+
cmdStr = "sudo /opt/pg/bin/ifc_ctl gateway ifup " + if_local_name + " access_container cont_" + endID[:8] + " " + mac + " pgtag2=" + bridgeID + " pgtag1=" + domainid
302+
Log.Infof("ifup cmd: %s", cmdStr)
303+
cmd = exec.Command("/bin/sh", "-c", cmdStr)
304+
var ifup bytes.Buffer
305+
cmd.Stdout = &ifup
306+
if err := cmd.Run(); err != nil {
307+
Log.Error("Error thrown: ", err)
308+
}
309+
if ifup.String() != "" {
310+
Log.Error(fmt.Errorf(ifup.String()))
278311
errorResponse(w, "Unable to on-board container onto PLUMgrid")
312+
return
279313
}
280314

281315
if netlink.LinkSetUp(local) != nil {
282-
errorResponse(w, `unable to bring veth up`)
316+
errorResponse(w, "unable to bring veth up")
283317
return
284318
}
285319

@@ -312,9 +346,30 @@ func (driver *driver) leaveEndpoint(w http.ResponseWriter, r *http.Request) {
312346

313347
if_local_name := "tap" + l.EndpointID[:5]
314348

315-
// ifc_ctl interface down {Interface name, SE name}
316-
if err := ifc_ctl.PgIfDown(if_local_name, "gateway"); err != nil {
317-
Log.Error(err)
349+
cmdStr := "sudo /opt/pg/bin/ifc_ctl gateway ifdown " + if_local_name
350+
Log.Infof("ifdown cmd: %s", cmdStr)
351+
cmd := exec.Command("/bin/sh", "-c", cmdStr)
352+
var ifdown bytes.Buffer
353+
cmd.Stdout = &ifdown
354+
if err := cmd.Run(); err != nil {
355+
Log.Error("Error thrown: ", err)
356+
}
357+
if ifdown.String() != "" {
358+
Log.Error(fmt.Errorf(ifdown.String()))
359+
errorResponse(w, "Unable to off-board container from PLUMgrid")
360+
}
361+
362+
cmdStr = "sudo /opt/pg/bin/ifc_ctl gateway del_port " + if_local_name
363+
Log.Infof("delport cmd: %s", cmdStr)
364+
cmd = exec.Command("/bin/sh", "-c", cmdStr)
365+
var delport bytes.Buffer
366+
cmd.Stdout = &delport
367+
if err := cmd.Run(); err != nil {
368+
Log.Error("Error thrown: ", err)
369+
}
370+
Log.Infof("output: %+v\n", delport.String())
371+
if delport.String() != "" {
372+
Log.Error(fmt.Errorf(delport.String()))
318373
errorResponse(w, "Unable to off-board container from PLUMgrid")
319374
}
320375

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+
}

0 commit comments

Comments
 (0)