From 6ec9ce1bc670a7c069d43f7c99bcb9b89a5db2b6 Mon Sep 17 00:00:00 2001 From: Josh Curl Date: Thu, 26 May 2016 18:54:42 -0700 Subject: [PATCH] Replace wait-for-network services with retries --- Dockerfile.dapper | 2 + assets/go-dnsclient.patch | 24 ++++++++ cmd/network/network.go | 53 ++++++++-------- cmd/waitfornetwork/waitfornetwork.go | 23 ------- images/02-network/Dockerfile | 3 - images/02-network/network.sh | 4 -- main.go | 2 - os-config.tpl.yml | 38 ++---------- .../assets/test_10/cloud-config.yml | 2 +- .../assets/test_18/cloud-config.yml | 11 ++++ .../rostest/test_10_network_from_url.py | 3 - .../rostest/test_18_network_on_boot.py | 26 ++++++++ util/network/network.go | 61 ++++++++----------- 13 files changed, 122 insertions(+), 130 deletions(-) create mode 100644 assets/go-dnsclient.patch delete mode 100644 cmd/waitfornetwork/waitfornetwork.go delete mode 100644 images/02-network/Dockerfile delete mode 100755 images/02-network/network.sh create mode 100644 tests/integration/assets/test_18/cloud-config.yml create mode 100644 tests/integration/rostest/test_18_network_on_boot.py diff --git a/Dockerfile.dapper b/Dockerfile.dapper index a35ba539..85416c72 100644 --- a/Dockerfile.dapper +++ b/Dockerfile.dapper @@ -101,9 +101,11 @@ RUN if [ -n "${!VBOX_MODULES_URL}" ]; then \ ;fi # Install Go +COPY assets/go-dnsclient.patch ${DAPPER_SOURCE} ENV GO_VERSION 1.6.2 RUN ln -sf go-6 /usr/bin/go && \ curl -sfL https://storage.googleapis.com/golang/go${GO_VERSION}.src.tar.gz | tar -xzf - -C /usr/local && \ + patch /usr/local/go/src/net/dnsclient_unix.go ${DAPPER_SOURCE}/go-dnsclient.patch && \ cd /usr/local/go/src && \ GOROOT_BOOTSTRAP=/usr GOARCH=${HOST_ARCH} GOHOSTARCH=${HOST_ARCH} ./make.bash && \ rm /usr/bin/go diff --git a/assets/go-dnsclient.patch b/assets/go-dnsclient.patch new file mode 100644 index 00000000..9df6543e --- /dev/null +++ b/assets/go-dnsclient.patch @@ -0,0 +1,24 @@ +265,270d264 +< // Ensure only one update at a time checks resolv.conf. +< if !conf.tryAcquireSema() { +< return +< } +< defer conf.releaseSema() +< +276a271,280 +> conf.update(name) +> } +> +> func (conf *resolverConfig) update(name string) { +> // Ensure only one update at a time checks resolv.conf. +> if !conf.tryAcquireSema() { +> return +> } +> defer conf.releaseSema() +> +293a298,302 +> } +> +> func UpdateDnsConf() { +> resolvConf.initOnce.Do(resolvConf.init) +> resolvConf.update("/etc/resolv.conf") diff --git a/cmd/network/network.go b/cmd/network/network.go index ca4514bf..3917d3f5 100644 --- a/cmd/network/network.go +++ b/cmd/network/network.go @@ -3,44 +3,50 @@ package network import ( "flag" "os" - "os/exec" + + "golang.org/x/net/context" log "github.com/Sirupsen/logrus" "github.com/docker/libnetwork/resolvconf" "github.com/rancher/netconf" "github.com/rancher/os/config" + "github.com/rancher/os/docker" "github.com/rancher/os/hostname" ) -const ( - NETWORK_DONE = "/var/run/network.done" - WAIT_FOR_NETWORK = "wait-for-network" -) - var ( - daemon bool - flags *flag.FlagSet + stopNetworkPre bool + flags *flag.FlagSet ) func init() { flags = flag.NewFlagSet(os.Args[0], flag.ContinueOnError) - flags.BoolVar(&daemon, "daemon", false, "run dhcpd as daemon") -} - -func sendTerm(proc string) { - cmd := exec.Command("killall", "-TERM", proc) - cmd.Stderr = os.Stderr - cmd.Stdout = os.Stdout - cmd.Run() + flags.BoolVar(&stopNetworkPre, "stop-network-pre", false, "") } func Main() { flags.Parse(os.Args[1:]) - log.Infof("Running network: daemon=%v", daemon) + log.Infof("Running network: stop-network-pre=%v", stopNetworkPre) + + if stopNetworkPre { + client, err := docker.NewSystemClient() + if err != nil { + log.Error(err) + } + + err = client.ContainerStop(context.Background(), "network-pre", 10) + if err != nil { + log.Error(err) + } + + _, err = client.ContainerWait(context.Background(), "network-pre") + if err != nil { + log.Error(err) + } + } - os.Remove(NETWORK_DONE) // ignore error cfg, err := config.LoadConfig() if err != nil { log.Fatal(err) @@ -75,14 +81,5 @@ func Main() { log.Error(err) } - if f, err := os.Create(NETWORK_DONE); err != nil { - log.Error(err) - } else { - f.Close() - } - sendTerm(WAIT_FOR_NETWORK) - - if daemon { - select {} - } + select {} } diff --git a/cmd/waitfornetwork/waitfornetwork.go b/cmd/waitfornetwork/waitfornetwork.go deleted file mode 100644 index 74a4326a..00000000 --- a/cmd/waitfornetwork/waitfornetwork.go +++ /dev/null @@ -1,23 +0,0 @@ -package waitfornetwork - -import ( - "github.com/rancher/os/cmd/network" - "os" - "os/signal" - "syscall" -) - -func handleTerm() { - c := make(chan os.Signal, 1) - signal.Notify(c, syscall.SIGTERM) - <-c - os.Exit(0) -} - -func Main() { - go handleTerm() - if _, err := os.Stat(network.NETWORK_DONE); err == nil { - os.Exit(0) - } - select {} -} diff --git a/images/02-network/Dockerfile b/images/02-network/Dockerfile deleted file mode 100644 index 127752b4..00000000 --- a/images/02-network/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM rancher/os-base -COPY network.sh / -CMD ["/network.sh"] diff --git a/images/02-network/network.sh b/images/02-network/network.sh deleted file mode 100755 index 0fd36043..00000000 --- a/images/02-network/network.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -set -x -e - -netconf -daemon=${DAEMON:-false} diff --git a/main.go b/main.go index c4a855f6..a65691ac 100644 --- a/main.go +++ b/main.go @@ -16,7 +16,6 @@ import ( "github.com/rancher/os/cmd/systemdocker" "github.com/rancher/os/cmd/userdocker" "github.com/rancher/os/cmd/wait" - "github.com/rancher/os/cmd/waitfornetwork" "github.com/rancher/os/config" osInit "github.com/rancher/os/init" ) @@ -53,7 +52,6 @@ func main() { registerCmd("/usr/bin/ros", control.Main) registerCmd("/usr/bin/cloud-init", cloudinit.Main) registerCmd("/usr/sbin/netconf", network.Main) - registerCmd("/usr/sbin/wait-for-network", waitfornetwork.Main) registerCmd("/usr/sbin/wait-for-docker", wait.Main) if !reexec.Init() { diff --git a/os-config.tpl.yml b/os-config.tpl.yml index 396f464c..b52337cf 100644 --- a/os-config.tpl.yml +++ b/os-config.tpl.yml @@ -149,13 +149,12 @@ rancher: - /usr/bin/ros:/usr/bin/ros:ro - /usr/bin/ros:/usr/bin/cloud-init:ro - /usr/bin/ros:/usr/sbin/netconf:ro - - /usr/bin/ros:/usr/sbin/wait-for-network:ro - /usr/bin/ros:/usr/sbin/wait-for-docker:ro console: image: {{.OS_REPO}}/os-console:{{.VERSION}}{{.SUFFIX}} labels: io.rancher.os.scope: system - io.rancher.os.after: wait-for-network + io.rancher.os.after: network io.docker.compose.rebuild: always net: host uts: host @@ -181,9 +180,9 @@ rancher: - /var/lib/system-docker:/var/lib/system-docker - /var/lib/rkt:/var/lib/rkt network-pre: - image: {{.OS_REPO}}/os-network:{{.VERSION}}{{.SUFFIX}} + image: {{.OS_REPO}}/os-base:{{.VERSION}}{{.SUFFIX}} + command: netconf labels: - io.rancher.os.detach: "false" io.rancher.os.scope: system io.rancher.os.after: cloud-init-pre net: host @@ -194,12 +193,11 @@ rancher: - command-volumes - system-volumes network: - image: {{.OS_REPO}}/os-network:{{.VERSION}}{{.SUFFIX}} + image: {{.OS_REPO}}/os-base:{{.VERSION}}{{.SUFFIX}} + command: netconf --stop-network-pre labels: io.rancher.os.scope: system io.rancher.os.after: cloud-init - environment: - - DAEMON=true net: host uts: host pid: host @@ -207,35 +205,11 @@ rancher: volumes_from: - command-volumes - system-volumes - wait-for-network-pre: - image: {{.OS_REPO}}/os-network:{{.VERSION}}{{.SUFFIX}} - command: wait-for-network - labels: - io.rancher.os.detach: "false" - io.rancher.os.scope: system - io.rancher.os.after: network-pre - pid: host - privileged: true - volumes_from: - - command-volumes - - system-volumes - wait-for-network: - image: {{.OS_REPO}}/os-network:{{.VERSION}}{{.SUFFIX}} - command: wait-for-network - labels: - io.rancher.os.detach: "false" - io.rancher.os.scope: system - io.rancher.os.after: network - pid: host - privileged: true - volumes_from: - - command-volumes - - system-volumes ntp: image: {{.OS_REPO}}/os-ntp:{{.VERSION}}{{.SUFFIX}} labels: io.rancher.os.scope: system - io.rancher.os.after: wait-for-network-pre + io.rancher.os.after: network-pre net: host uts: host privileged: true diff --git a/tests/integration/assets/test_10/cloud-config.yml b/tests/integration/assets/test_10/cloud-config.yml index a42d3e9d..e4fc4807 100644 --- a/tests/integration/assets/test_10/cloud-config.yml +++ b/tests/integration/assets/test_10/cloud-config.yml @@ -2,4 +2,4 @@ rancher: cloud_init: datasources: - - url:https://s3-us-west-2.amazonaws.com/rancher-os-test/cloud-config.yml + - url:https://gist.githubusercontent.com/joshwget/0bdc616cd26162ad87c535644c8b1ef6/raw/8cce947c08cf006e932b71d92ddbb96bae8e3325/gistfile1.txt diff --git a/tests/integration/assets/test_18/cloud-config.yml b/tests/integration/assets/test_18/cloud-config.yml new file mode 100644 index 00000000..8b240b65 --- /dev/null +++ b/tests/integration/assets/test_18/cloud-config.yml @@ -0,0 +1,11 @@ +#cloud-config +rancher: + services: + missing_image: + image: tianon/true + labels: + io.rancher.os.scope: system + services_include: + debian-console: true +ssh_authorized_keys: + - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC85w9stZyiLQp/DkVO6fqwiShYcj1ClKdtCqgHtf+PLpJkFReSFu8y21y+ev09gsSMRRrjF7yt0pUHV6zncQhVeqsZtgc5WbELY2DOYUGmRn/CCvPbXovoBrQjSorqlBmpuPwsStYLr92Xn+VVsMNSUIegHY22DphGbDKG85vrKB8HxUxGIDxFBds/uE8FhSy+xsoyT/jUZDK6pgq2HnGl6D81ViIlKecpOpWlW3B+fea99ADNyZNVvDzbHE5pcI3VRw8u59WmpWOUgT6qacNVACl8GqpBvQk8sw7O/X9DSZHCKafeD9G5k+GYbAUz92fKWrx/lOXfUXPS3+c8dRIF diff --git a/tests/integration/rostest/test_10_network_from_url.py b/tests/integration/rostest/test_10_network_from_url.py index fa9dd66c..550ad4d1 100644 --- a/tests/integration/rostest/test_10_network_from_url.py +++ b/tests/integration/rostest/test_10_network_from_url.py @@ -28,9 +28,6 @@ set -x -e ip link show dev br0 ip link show dev br0.100 | grep br0.100@br0 ip link show dev eth1.100 | grep 'master br0' -ip link show dev eth6 | grep 'master bond0' -ip link show dev eth7 | grep 'master bond0' -[ "$(