From c25a449e6946b6e22c7fdbb064f8e51655ce5d2e Mon Sep 17 00:00:00 2001 From: Adphi Date: Mon, 8 Aug 2022 17:58:49 +0200 Subject: [PATCH] convert / build: add networking support through network-manager flag Signed-off-by: Adphi --- builder_test.go | 8 +------- cmd/d2vm/build.go | 12 +++++++----- cmd/d2vm/convert.go | 3 ++- convert.go | 4 ++-- dockerfile.go | 31 +++++++++++++++++++++++++------ templates/alpine.Dockerfile | 8 ++++++++ templates/debian.Dockerfile | 23 +++++++++++++++++++++++ templates/ubuntu.Dockerfile | 23 +++++++++++++++++++++++ 8 files changed, 91 insertions(+), 21 deletions(-) diff --git a/builder_test.go b/builder_test.go index b00bca3..9498e87 100644 --- a/builder_test.go +++ b/builder_test.go @@ -27,7 +27,7 @@ func testSysconfig(t *testing.T, ctx context.Context, img, sysconf, kernel, init sys, err := sysconfig(r) require.NoError(t, err) assert.Equal(t, sysconf, sys) - d, err := NewDockerfile(r, img, "root") + d, err := NewDockerfile(r, img, "root", "") require.NoError(t, err) logrus.Infof("docker image based on %s", d.Release.Name) p := filepath.Join(tmpPath, docker.FormatImgName(img)) @@ -75,12 +75,6 @@ func TestSyslinuxCfg(t *testing.T) { initrd: "/boot/initrd.img", sysconfig: syslinuxCfgUbuntu, }, - { - image: "debian:8", - kernel: "/vmlinuz", - initrd: "/initrd.img", - sysconfig: syslinuxCfgDebian, - }, { image: "debian:9", kernel: "/vmlinuz", diff --git a/cmd/d2vm/build.go b/cmd/d2vm/build.go index a1daa35..0e93e4c 100644 --- a/cmd/d2vm/build.go +++ b/cmd/d2vm/build.go @@ -30,10 +30,11 @@ import ( ) var ( - file = "Dockerfile" - tag = uuid.New().String() - buildArgs []string - buildCmd = &cobra.Command{ + file = "Dockerfile" + tag = uuid.New().String() + networkManager string + buildArgs []string + buildCmd = &cobra.Command{ Use: "build [context directory]", Short: "Build a vm image from Dockerfile", Args: cobra.ExactArgs(1), @@ -54,7 +55,7 @@ var ( if err := docker.Build(cmd.Context(), tag, file, args[0], buildArgs...); err != nil { return err } - return d2vm.Convert(cmd.Context(), tag, size, password, output, cmdLineExtra) + return d2vm.Convert(cmd.Context(), tag, size, password, output, cmdLineExtra, d2vm.NetworkManager(networkManager)) }, } ) @@ -71,4 +72,5 @@ func init() { buildCmd.Flags().BoolVarP(&debug, "debug", "d", false, "Enable Debug output") buildCmd.Flags().BoolVar(&force, "force", false, "Override output image") buildCmd.Flags().StringVar(&cmdLineExtra, "append-to-cmdline", "", "Extra kernel cmdline arguments to append to the generated one") + buildCmd.Flags().StringVar(&networkManager, "network-manager", "", "Network manager to use for the image: none, netplan, ifupdown") } diff --git a/cmd/d2vm/convert.go b/cmd/d2vm/convert.go index a645020..bfc9a03 100644 --- a/cmd/d2vm/convert.go +++ b/cmd/d2vm/convert.go @@ -79,7 +79,7 @@ var ( return err } } - return d2vm.Convert(cmd.Context(), img, size, password, output, cmdLineExtra) + return d2vm.Convert(cmd.Context(), img, size, password, output, cmdLineExtra, d2vm.NetworkManager(networkManager)) }, } ) @@ -100,5 +100,6 @@ func init() { convertCmd.Flags().BoolVarP(&debug, "debug", "d", false, "Enable Debug output") convertCmd.Flags().BoolVarP(&force, "force", "f", false, "Override output qcow2 image") convertCmd.Flags().StringVar(&cmdLineExtra, "append-to-cmdline", "", "Extra kernel cmdline arguments to append to the generated one") + convertCmd.Flags().StringVar(&networkManager, "network-manager", "", "Network manager to use for the image: none, netplan, ifupdown") rootCmd.AddCommand(convertCmd) } diff --git a/convert.go b/convert.go index c67daef..b19c578 100644 --- a/convert.go +++ b/convert.go @@ -28,7 +28,7 @@ import ( "go.linka.cloud/d2vm/pkg/docker" ) -func Convert(ctx context.Context, img string, size int64, password string, output string, cmdLineExtra string) error { +func Convert(ctx context.Context, img string, size int64, password string, output string, cmdLineExtra string, networkManager NetworkManager) error { imgUUID := uuid.New().String() tmpPath := filepath.Join(os.TempDir(), "d2vm", imgUUID) if err := os.MkdirAll(tmpPath, os.ModePerm); err != nil { @@ -41,7 +41,7 @@ func Convert(ctx context.Context, img string, size int64, password string, outpu if err != nil { return err } - d, err := NewDockerfile(r, img, password) + d, err := NewDockerfile(r, img, password, networkManager) if err != nil { return err } diff --git a/dockerfile.go b/dockerfile.go index cc09d8c..e0d281b 100644 --- a/dockerfile.go +++ b/dockerfile.go @@ -19,6 +19,8 @@ import ( "fmt" "io" "text/template" + + "github.com/sirupsen/logrus" ) //go:embed templates/ubuntu.Dockerfile @@ -40,33 +42,50 @@ var ( centOSDockerfileTemplate = template.Must(template.New("centos.Dockerfile").Parse(centOSDockerfile)) ) +type NetworkManager string + +const ( + NetworkManagerNone NetworkManager = "none" + NetworkManagerIfupdown2 NetworkManager = "ifupdown" + NetworkManagerNetplan NetworkManager = "netplan" +) + type Dockerfile struct { - Image string - Password string - Release OSRelease - tmpl *template.Template + Image string + Password string + Release OSRelease + NetworkManager NetworkManager + tmpl *template.Template } func (d Dockerfile) Render(w io.Writer) error { return d.tmpl.Execute(w, d) } -func NewDockerfile(release OSRelease, img, password string) (Dockerfile, error) { +func NewDockerfile(release OSRelease, img, password string, networkManager NetworkManager) (Dockerfile, error) { if password == "" { password = "root" } - d := Dockerfile{Release: release, Image: img, Password: password} + d := Dockerfile{Release: release, Image: img, Password: password, NetworkManager: networkManager} + var net NetworkManager switch release.ID { case ReleaseDebian: d.tmpl = debianDockerfileTemplate + net = NetworkManagerIfupdown2 case ReleaseUbuntu: d.tmpl = ubuntuDockerfileTemplate + net = NetworkManagerNetplan case ReleaseAlpine: d.tmpl = alpineDockerfileTemplate + net = NetworkManagerIfupdown2 case ReleaseCentOS: d.tmpl = centOSDockerfileTemplate default: return Dockerfile{}, fmt.Errorf("unsupported distribution: %s", release.ID) } + if d.NetworkManager == "" { + logrus.Warnf("no network manager specified, using distribution defaults: %s", net) + d.NetworkManager = net + } return d, nil } diff --git a/templates/alpine.Dockerfile b/templates/alpine.Dockerfile index 5d035e1..56c803d 100644 --- a/templates/alpine.Dockerfile +++ b/templates/alpine.Dockerfile @@ -21,3 +21,11 @@ RUN for s in devfs dmesg hwdrivers mdev; do rc-update add $s sysinit; done RUN echo "root:{{- if .Password}}{{ .Password}}{{- else}}root{{- end}}" | chpasswd +{{ if eq .NetworkManager "ifupdown"}} +RUN apk add --no-cache ifupdown-ng +RUN mkdir -p /etc/network && printf '\ +auto eth0\n\ +allow-hotplug eth0\n\ +iface eth0 inet dhcp\n\ +' > /etc/network/interfaces +{{ end }} diff --git a/templates/debian.Dockerfile b/templates/debian.Dockerfile index e241fd3..809cccb 100644 --- a/templates/debian.Dockerfile +++ b/templates/debian.Dockerfile @@ -17,3 +17,26 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ RUN systemctl preset-all RUN echo "root:{{- if .Password}}{{ .Password}}{{- else}}root{{- end}}" | chpasswd + +{{ if eq .NetworkManager "netplan" }} +RUN apt install -y netplan.io +RUN mkdir -p /etc/netplan && printf '\ +network:\n\ + version: 2\n\ + renderer: networkd\n\ + ethernets:\n\ + eth0:\n\ + dhcp4: true\n\ + nameservers:\n\ + addresses:\n\ + - 8.8.8.8\n\ + - 8.8.4.4\n\ +' > /etc/netplan/00-netcfg.yaml \ +{{ else if eq .NetworkManager "ifupdown"}} +RUN apt install -y ifupdown2 +RUN mkdir -p /etc/network && printf '\ +auto eth0\n\ +allow-hotplug eth0\n\ +iface eth0 inet dhcp\n\ +' > /etc/network/interfaces +{{ end }} diff --git a/templates/ubuntu.Dockerfile b/templates/ubuntu.Dockerfile index 90b1b47..4111c6a 100644 --- a/templates/ubuntu.Dockerfile +++ b/templates/ubuntu.Dockerfile @@ -16,3 +16,26 @@ RUN apt-get update -y && \ RUN systemctl preset-all RUN echo "root:{{- if .Password}}{{ .Password}}{{- else}}root{{- end}}" | chpasswd + +{{ if eq .NetworkManager "netplan" }} +RUN apt install -y netplan.io +RUN mkdir -p /etc/netplan && printf '\ +network:\n\ + version: 2\n\ + renderer: networkd\n\ + ethernets:\n\ + eth0:\n\ + dhcp4: true\n\ + nameservers:\n\ + addresses:\n\ + - 8.8.8.8\n\ + - 8.8.4.4\n\ +' > /etc/netplan/00-netcfg.yaml \ +{{ else if eq .NetworkManager "ifupdown"}} +RUN apt install -y ifupdown-ng +RUN mkdir -p /etc/network && printf '\ +auto eth0\n\ +allow-hotplug eth0\n\ +iface eth0 inet dhcp\n\ +' > /etc/network/interfaces +{{ end }}