firstboot: generate netplan config rather than ifupdown #1731

Merged
merged 2 commits into from Aug 25, 2016
Jump to file or symbol
Failed to load files and symbols.
+47 −76
Split
View
@@ -20,7 +20,6 @@
package firstboot
import (
- "fmt"
"os"
"os/exec"
"path/filepath"
@@ -46,38 +45,32 @@ func StampFirstBoot() error {
return osutil.AtomicWriteFile(dirs.SnapFirstBootStamp, []byte{}, 0644, 0)
}
-var globs = []string{"/sys/class/net/eth*", "/sys/class/net/en*"}
-var ethdir = "/etc/network/interfaces.d"
-var ifup = "/sbin/ifup"
+var netplanConfigFile = "/etc/netplan/00-initial-config.yaml"
+var enableConfig = []string{"netplan", "apply"}
-func EnableFirstEther() error {
- // ensure that udev is ready and we have the net stuff
- if output, err := exec.Command("udevadm", "settle").CombinedOutput(); err != nil {
- return osutil.OutputErr(output, err)
- }
-
- var eths []string
- for _, glob := range globs {
- eths, _ = filepath.Glob(glob)
- if len(eths) != 0 {
- break
- }
- }
- if len(eths) == 0 {
- return nil
- }
- eth := filepath.Base(eths[0])
- ethfile := filepath.Join(ethdir, eth)
- data := fmt.Sprintf("allow-hotplug %[1]s\niface %[1]s inet dhcp\n", eth)
+var netplanConfigData = `
+network:
+ version 2:
+ ethernets:
+ all:
+ match:
+ name: "*"
+ dhcp4: true
+`
- if err := osutil.AtomicWriteFile(ethfile, []byte(data), 0644, 0); err != nil {
+// InitialNetworkConfig writes and applies a netplan config that
+// enables dhcp on all wired interfaces. In the long run this should
+// be run as part of the config-changed hook and read the snap's
+// config to determine the netplan config to write.
+func InitialNetworkConfig() error {
+ if err := osutil.AtomicWriteFile(netplanConfigFile, []byte(netplanConfigData), 0644, 0); err != nil {
return err
}
- ifup := exec.Command(ifup, eth)
- ifup.Stdout = os.Stdout
- ifup.Stderr = os.Stderr
- if err := ifup.Run(); err != nil {
+ enable := exec.Command(enableConfig[0], enableConfig[1:]...)
+ enable.Stdout = os.Stdout
+ enable.Stderr = os.Stderr
+ if err := enable.Run(); err != nil {
return err
}
@@ -22,24 +22,20 @@ package firstboot
import (
"io/ioutil"
"os"
+ "os/exec"
"path/filepath"
"testing"
. "gopkg.in/check.v1"
"github.com/snapcore/snapd/dirs"
- "github.com/snapcore/snapd/testutil"
)
func TestStore(t *testing.T) { TestingT(t) }
type FirstBootTestSuite struct {
- globs []string
- ethdir string
- ifup string
- e error
-
- udevadm *testutil.MockCmd
+ netplanConfigFile string
+ enableConfig []string
}
var _ = Suite(&FirstBootTestSuite{})
@@ -48,53 +44,35 @@ func (s *FirstBootTestSuite) SetUpTest(c *C) {
tempdir := c.MkDir()
dirs.SetRootDir(tempdir)
- s.globs = globs
- globs = nil
- s.ethdir = ethdir
- ethdir = c.MkDir()
- s.ifup = ifup
- ifup = "/bin/true"
-
- s.e = nil
- s.udevadm = testutil.MockCommand(c, "udevadm", "")
+ s.netplanConfigFile = netplanConfigFile
+ netplanConfigFile = filepath.Join(c.MkDir(), "config.yaml")
+ s.enableConfig = enableConfig
+ enableConfig = []string{"/bin/true"}
}
func (s *FirstBootTestSuite) TearDownTest(c *C) {
- globs = s.globs
- ethdir = s.ethdir
- ifup = s.ifup
- s.udevadm.Restore()
-}
-
-func (s *FirstBootTestSuite) TestEnableFirstEther(c *C) {
- c.Check(EnableFirstEther(), IsNil)
- fs, _ := filepath.Glob(filepath.Join(ethdir, "*"))
- c.Assert(fs, HasLen, 0)
+ netplanConfigFile = s.netplanConfigFile
+ enableConfig = s.enableConfig
}
-func (s *FirstBootTestSuite) TestEnableFirstEtherSomeEth(c *C) {
- dir := c.MkDir()
- _, err := os.Create(filepath.Join(dir, "eth42"))
- c.Assert(err, IsNil)
-
- globs = []string{filepath.Join(dir, "eth*")}
- c.Check(EnableFirstEther(), IsNil)
- fs, _ := filepath.Glob(filepath.Join(ethdir, "*"))
- c.Assert(fs, HasLen, 1)
- bs, err := ioutil.ReadFile(fs[0])
+func (s *FirstBootTestSuite) TestInitialNetworkConfig(c *C) {
+ c.Check(InitialNetworkConfig(), IsNil)
+ bs, err := ioutil.ReadFile(netplanConfigFile)
c.Assert(err, IsNil)
- c.Check(string(bs), Equals, "allow-hotplug eth42\niface eth42 inet dhcp\n")
-
+ c.Check(string(bs), Equals, netplanConfigData)
}
-func (s *FirstBootTestSuite) TestEnableFirstEtherBadEthDir(c *C) {
- dir := c.MkDir()
- _, err := os.Create(filepath.Join(dir, "eth42"))
- c.Assert(err, IsNil)
-
- ethdir = "/no/such/thing"
- globs = []string{filepath.Join(dir, "eth*")}
- err = EnableFirstEther()
+func (s *FirstBootTestSuite) TestInitialNetworkConfigBadPath(c *C) {
+ netplanConfigFile = "/no/such/thing"
+ err := InitialNetworkConfig()
c.Check(err, NotNil)
c.Check(os.IsNotExist(err), Equals, true)
}
+
+func (s *FirstBootTestSuite) TestInitialNetworkConfigEnableFails(c *C) {
+ enableConfig = []string{"/bin/false"}
+ err := InitialNetworkConfig()
+ c.Check(err, NotNil)
+ _, isExitError := err.(*exec.ExitError)
+ c.Check(isExitError, Equals, true)
+}
@@ -214,8 +214,8 @@ func FirstBoot() error {
if firstboot.HasRun() {
return ErrNotFirstBoot
}
- if err := firstboot.EnableFirstEther(); err != nil {
- logger.Noticef("Failed to bring up ethernet: %s", err)
+ if err := firstboot.InitialNetworkConfig(); err != nil {
+ logger.Noticef("Failed during inital network configuration: %s", err)
}
// snappy will be in a very unhappy state if this happens,