Get the proxy to re-attach the weave router if it sees it restart

This commit is contained in:
Bryan Boreham committed 2015-10-19 15:46:47 +00:00
1 parent 5ff740cddc
commit a87cc5c3b1
3 files changed
+49 -2

No files matched your search

+18
View File
@@ -305,6 +305,8 @@ func (proxy *Proxy) ContainerStarted(ident string) {
// If this was a container we modified the entrypoint for, attach it to the network
if containerShouldAttach(container) {
proxy.attach(container, true)
} else if containerIsWeaveRouter(container) {
proxy.attachRouter(container)
}
proxy.notifyWaiters(container.ID)
}
@@ -313,6 +315,10 @@ func containerShouldAttach(container *docker.Container) bool {
return len(container.Config.Entrypoint) > 0 && container.Config.Entrypoint[0] == weaveWaitEntrypoint[0]
}
func containerIsWeaveRouter(container *docker.Container) bool {
return strings.HasPrefix(container.Config.Image, "weaveworks/weave")
}
func (proxy *Proxy) createWait(r *http.Request, ident string) {
proxy.Lock()
ch := make(chan struct{})
@@ -386,6 +392,18 @@ func (proxy *Proxy) attach(container *docker.Container, orDie bool) error {
return nil
}
func (proxy *Proxy) attachRouter(container *docker.Container) error {
Log.Infof("Attaching weave router container")
args := []string{"attach-router"}
if _, stderr, err := callWeave(args...); err != nil {
Log.Warningf("Attaching container %s to weave network failed: %s", container.ID, string(stderr))
return errors.New(string(stderr))
} else if len(stderr) > 0 {
Log.Warningf("Attaching container %s to weave network: %s", container.ID, string(stderr))
}
return nil
}
func (proxy *Proxy) weaveCIDRs(networkMode string, env []string) ([]string, error) {
if networkMode == "host" || strings.HasPrefix(networkMode, "container:") {
return nil, fmt.Errorf("the container was created with the '--net=%s'", networkMode)
+6 -2
View File
@@ -13,13 +13,18 @@ check_attached() {
start_suite "Proxy restart reattaches networking to containers"
weave_on $HOST1 launch
WEAVE_DOCKER_ARGS=--restart=always WEAVEPROXY_DOCKER_ARGS=--restart=always weave_on $HOST1 launch
proxy_start_container $HOST1 -e WEAVE_CIDR=$C2/24 -di --name=c2 --restart=always -h $NAME
proxy_start_container_with_dns $HOST1 -e WEAVE_CIDR=$C1/24 -di --name=c1 --restart=always
proxy docker_on $HOST1 restart -t=1 c2
check_attached
# Restart weave router
docker_on $HOST1 restart weave
sleep 1
check_attached
# Kill outside of Docker so Docker will restart it
run_on $HOST1 sudo kill -KILL $(docker_on $HOST1 inspect --format='{{.State.Pid}}' c2)
sleep 1
@@ -34,7 +39,6 @@ assert_raises "proxy exec_on $HOST1 c3 $CHECK_ETHWE_UP"
# Restart docker itself, using different commands for systemd- and upstart-managed.
run_on $HOST1 sh -c "command -v systemctl >/dev/null && sudo systemctl restart docker || sudo service docker restart"
sleep 1
weave_on $HOST1 launch
check_attached
end_suite
+25
View File
@@ -685,6 +685,10 @@ setup_router_iface_bridge() {
echo "Perhaps you are running the docker daemon with container networking disabled (-b=none)." >&2
return 1
fi
# No-op if already attached
if netnsenter ip link show $CONTAINER_IFNAME >/dev/null 2>&1 ; then
return 0
fi
connect_container_to_bridge $CONTAINER_IFNAME &&
netnsenter ethtool -K eth0 tx off >/dev/null &&
netnsenter ip link set $CONTAINER_IFNAME up
@@ -1467,6 +1471,17 @@ launch_router() {
--dns-effective-listen-address $DOCKER_BRIDGE_IP \
${NETHOST_OPT:+$DNS_ROUTER_OPTS} $NO_DNS_OPT \
--docker-api "unix:///var/run/docker.sock" "$@")
}
# Recreate the parameter values that are set when the router is first launched
fetch_router_args() {
IPRANGE=$(docker inspect -f '{{.Args}}' $1 | grep -o -e '-ipalloc-range [^ ]*')
# This doesn't get back the right syntax, but it's enough for our purposes
DNS_PORT_MAPPING=$(docker inspect -f '{{with index .HostConfig.PortBindings "53/udp"}}{{.}}{{end}}' $1)
}
attach_router() {
ROUTER_CONTAINER=$1
with_container_netns_or_die $ROUTER_CONTAINER setup_router_iface_$BRIDGE_TYPE
err_msg=$(death_msg $CONTAINER_NAME)
container_ip $CONTAINER_NAME "$err_msg" "$err_msg" || return 1
@@ -1643,14 +1658,24 @@ case "$COMMAND" in
check_not_running $PROXY_CONTAINER_NAME $BASE_EXEC_IMAGE
COMMON_ARGS=$(common_launch_args "$@")
launch_router "$@"
attach_router $CONTAINER_NAME
launch_proxy $COMMON_ARGS
;;
launch-router)
deprecation_warnings "$@"
check_not_running $CONTAINER_NAME $BASE_IMAGE
launch_router "$@"
attach_router $CONTAINER_NAME
echo $ROUTER_CONTAINER
;;
attach-router)
deprecation_warnings "$@"
check_running $CONTAINER_NAME
enforce_docker_bridge_addr_assign_type
create_bridge
fetch_router_args $CONTAINER_NAME
attach_router $CONTAINER_NAME
;;
launch-proxy)
deprecation_warnings "$@"
check_not_running $PROXY_CONTAINER_NAME $BASE_EXEC_IMAGE