Merge pull request #3 from aboch/master

Add implementation and test for SetIPForwarding()
This commit is contained in:
Arnaud Porterie 2015-03-04 11:18:13 -08:00
commit 8305579ffc
3 changed files with 98 additions and 4 deletions

View File

@ -29,7 +29,3 @@ func (b *BridgeSetup) QueueStep(step SetupStep) {
func SetupIPTables(i *Interface) error {
return nil
}
func SetupIPForwarding(i *Interface) error {
return nil
}

View File

@ -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)
}

View File

@ -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)
}
}