Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2.3 bionic netplan bridging vlans and bonds 1764735 #8697

Merged
merged 10 commits into from May 16, 2018
5 changes: 3 additions & 2 deletions cloudconfig/containerinit/container_userdata.go
Expand Up @@ -188,7 +188,8 @@ func GenerateNetplan(networkConfig *container.NetworkConfig) (string, error) {
if cidr := info.CIDRAddress(); cidr != "" {
iface.Addresses = append(iface.Addresses, cidr)
} else if info.ConfigType == network.ConfigDHCP {
iface.Dhcp4 = true
t := true
iface.DHCP4 = &t
}

for _, dns := range info.DNSServers {
Expand Down Expand Up @@ -217,7 +218,7 @@ func GenerateNetplan(networkConfig *container.NetworkConfig) (string, error) {
route := netplan.Route{
To: route.DestinationCIDR,
Via: route.GatewayIP,
Metric: route.Metric,
Metric: &route.Metric,
}
iface.Routes = append(iface.Routes, route)
}
Expand Down
39 changes: 24 additions & 15 deletions network/netplan/activate.go
Expand Up @@ -26,8 +26,8 @@ type ActivationParams struct {
// ActivationResult captures the result of actively bridging the
// interfaces using ifup/ifdown.
type ActivationResult struct {
Stdout []byte
Stderr []byte
Stdout string
Stderr string
Code int
}

Expand All @@ -48,19 +48,28 @@ func BridgeAndActivate(params ActivationParams) (*ActivationResult, error) {

for _, device := range params.Devices {
var deviceId string
err := errors.NotFoundf("No such device - name %q MAC %q", device.DeviceName, device.MACAddress)
if device.MACAddress != "" {
deviceId, err = netplan.FindEthernetByMAC(device.MACAddress)
}
if err != nil && device.DeviceName != "" {
deviceId, err = netplan.FindEthernetByName(device.DeviceName)
}
deviceId, deviceType, err := netplan.FindDeviceByNameOrMAC(device.DeviceName, device.MACAddress)
if err != nil {
return nil, err
return nil, errors.Trace(err)
}
err = netplan.BridgeEthernetById(deviceId, device.BridgeName)
if err != nil {
return nil, err
switch deviceType {
case TypeEthernet:
err = netplan.BridgeEthernetById(deviceId, device.BridgeName)
if err != nil {
return nil, err
}
case TypeBond:
err = netplan.BridgeBondById(deviceId, device.BridgeName)
if err != nil {
return nil, err
}
case TypeVLAN:
err = netplan.BridgeVLANById(deviceId, device.BridgeName)
if err != nil {
return nil, err
}
default:
return nil, errors.Errorf("unable to create bridge for %q, unknown device type %q", deviceId, deviceType)
}
}
_, err = netplan.Write("")
Expand All @@ -82,8 +91,8 @@ func BridgeAndActivate(params ActivationParams) (*ActivationResult, error) {
result, err := scriptrunner.RunCommand(command, environ, params.Clock, params.Timeout)

activationResult := ActivationResult{
Stderr: result.Stderr,
Stdout: result.Stdout,
Stderr: string(result.Stderr),
Stdout: string(result.Stdout),
Code: result.Code,
}

Expand Down
43 changes: 40 additions & 3 deletions network/netplan/activate_test.go
Expand Up @@ -11,6 +11,7 @@ import (
gc "gopkg.in/check.v1"

"github.com/juju/juju/network/netplan"
coretesting "github.com/juju/juju/testing"
)

type ActivateSuite struct {
Expand Down Expand Up @@ -39,6 +40,7 @@ func (s *ActivateSuite) TestNoDirectory(c *gc.C) {
}

func (s *ActivateSuite) TestActivateSuccess(c *gc.C) {
coretesting.SkipIfWindowsBug(c, "lp:1771077")
tempDir := c.MkDir()
params := netplan.ActivationParams{
Devices: []netplan.DeviceToBridge{
Expand Down Expand Up @@ -70,7 +72,41 @@ func (s *ActivateSuite) TestActivateSuccess(c *gc.C) {
c.Check(err, jc.ErrorIsNil)
}

func (s *ActivateSuite) TestActivateDeviceAndVLAN(c *gc.C) {
coretesting.SkipIfWindowsBug(c, "lp:1771077")
tempDir := c.MkDir()
params := netplan.ActivationParams{
Devices: []netplan.DeviceToBridge{
{
DeviceName: "eno1",
MACAddress: "00:11:22:33:44:99", // That's a wrong MAC, we should fall back to name
BridgeName: "br-eno1",
},
{
DeviceName: "eno1.123",
MACAddress: "00:11:22:33:44:99",
BridgeName: "br-eno1.123",
},
},
Directory: tempDir,
RunPrefix: "exit 0 &&",
}
files := []string{"00.yaml", "01.yaml"}
contents := make([][]byte, len(files))
for i, file := range files {
var err error
contents[i], err = ioutil.ReadFile(path.Join("testdata/TestReadWriteBackup", file))
c.Assert(err, jc.ErrorIsNil)
err = ioutil.WriteFile(path.Join(tempDir, file), contents[i], 0644)
c.Assert(err, jc.ErrorIsNil)
}
result, err := netplan.BridgeAndActivate(params)
c.Check(result, gc.IsNil)
c.Check(err, jc.ErrorIsNil)
}

func (s *ActivateSuite) TestActivateFailure(c *gc.C) {
coretesting.SkipIfWindowsBug(c, "lp:1771077")
tempDir := c.MkDir()
params := netplan.ActivationParams{
Devices: []netplan.DeviceToBridge{
Expand Down Expand Up @@ -99,8 +135,8 @@ func (s *ActivateSuite) TestActivateFailure(c *gc.C) {
}
result, err := netplan.BridgeAndActivate(params)
c.Assert(result, gc.NotNil)
c.Check(result.Stdout, gc.DeepEquals, []byte("This is stdout"))
c.Check(result.Stderr, gc.DeepEquals, []byte("This is stderr"))
c.Check(string(result.Stdout), gc.DeepEquals, "This is stdout")
c.Check(string(result.Stderr), gc.DeepEquals, "This is stderr")
c.Check(result.Code, gc.Equals, 1)
c.Check(err, gc.ErrorMatches, "bridge activation error code 1")

Expand All @@ -124,6 +160,7 @@ func (s *ActivateSuite) TestActivateFailure(c *gc.C) {
}

func (s *ActivateSuite) TestActivateTimeout(c *gc.C) {
// coretesting.SkipIfWindowsBug(c, "lp:1771077")
tempDir := c.MkDir()
params := netplan.ActivationParams{
Devices: []netplan.DeviceToBridge{
Expand Down Expand Up @@ -153,6 +190,6 @@ func (s *ActivateSuite) TestActivateTimeout(c *gc.C) {
c.Assert(err, jc.ErrorIsNil)
}
result, err := netplan.BridgeAndActivate(params)
c.Assert(result, gc.NotNil)
c.Check(result, gc.NotNil)
c.Check(err, gc.ErrorMatches, "bridge activation error: command cancelled")
}