Merge pull request #3 from aboch/master
Add implementation and test for SetIPForwarding()
This commit is contained in:
commit
8305579ffc
|
@ -29,7 +29,3 @@ func (b *BridgeSetup) QueueStep(step SetupStep) {
|
||||||
func SetupIPTables(i *Interface) error {
|
func SetupIPTables(i *Interface) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetupIPForwarding(i *Interface) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
package bridge
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
IPV4_FORW_CONF_FILE = "/proc/sys/net/ipv4/ip_forward"
|
||||||
|
PERM = 0644
|
||||||
|
)
|
||||||
|
|
||||||
|
func SetupIPForwarding(i *Interface) error {
|
||||||
|
// Sanity Check
|
||||||
|
if i.Config.EnableIPForwarding == false {
|
||||||
|
return fmt.Errorf("Unexpected request to enable IP Forwarding for: %v", *i)
|
||||||
|
}
|
||||||
|
// Enable IPv4 forwarding
|
||||||
|
return ioutil.WriteFile(IPV4_FORW_CONF_FILE, []byte{'1', '\n'}, PERM)
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
package bridge
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"io/ioutil"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestSetupIPForwarding(t *testing.T) {
|
||||||
|
// Read current setting and ensure the original value gets restored
|
||||||
|
procSetting := readCurrentIPForwardingSetting(t)
|
||||||
|
defer reconcileIPForwardingSetting(t, procSetting)
|
||||||
|
|
||||||
|
// Disable IP Forwarding if enabled
|
||||||
|
if bytes.Compare(procSetting, []byte("1\n")) == 0 {
|
||||||
|
writeIPForwardingSetting(t, []byte{'0', '\n'})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create test interface with ip forwarding setting enabled
|
||||||
|
br := &Interface{
|
||||||
|
Config: &Configuration{
|
||||||
|
BridgeName: DefaultBridgeName,
|
||||||
|
EnableIPForwarding: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set IP Forwarding
|
||||||
|
if err := SetupIPForwarding(br); err != nil {
|
||||||
|
t.Fatalf("Failed to setup IP forwarding: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read new setting
|
||||||
|
procSetting = readCurrentIPForwardingSetting(t)
|
||||||
|
if bytes.Compare(procSetting, []byte("1\n")) != 0 {
|
||||||
|
t.Fatalf("Failed to effectively setup IP forwarding")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUnexpectedSetupIPForwarding(t *testing.T) {
|
||||||
|
// Read current setting and ensure the original value gets restored
|
||||||
|
procSetting := readCurrentIPForwardingSetting(t)
|
||||||
|
defer reconcileIPForwardingSetting(t, procSetting)
|
||||||
|
|
||||||
|
// Create test interface without ip forwarding setting enabled
|
||||||
|
br := &Interface{
|
||||||
|
Config: &Configuration{
|
||||||
|
BridgeName: DefaultBridgeName,
|
||||||
|
EnableIPForwarding: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attempt Set IP Forwarding
|
||||||
|
if err := SetupIPForwarding(br); err == nil {
|
||||||
|
t.Fatalf(err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func readCurrentIPForwardingSetting(t *testing.T) []byte {
|
||||||
|
procSetting, err := ioutil.ReadFile(IPV4_FORW_CONF_FILE)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Can't execute test: Failed to read current IP forwarding setting: %v", err)
|
||||||
|
}
|
||||||
|
return procSetting
|
||||||
|
}
|
||||||
|
|
||||||
|
func writeIPForwardingSetting(t *testing.T, chars []byte) {
|
||||||
|
err := ioutil.WriteFile(IPV4_FORW_CONF_FILE, chars, PERM)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Can't execute or cleanup after test: Failed to reset IP forwarding: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func reconcileIPForwardingSetting(t *testing.T, original []byte) {
|
||||||
|
current := readCurrentIPForwardingSetting(t)
|
||||||
|
if bytes.Compare(original, current) != 0 {
|
||||||
|
writeIPForwardingSetting(t, original)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue