Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ebfaf11f4a | ||
|
|
1abce148a3 | ||
|
|
264e5c9979 | ||
|
|
a6a1ce5c9e | ||
|
|
5e660311d2 | ||
|
|
4a49ff3083 | ||
|
|
7f92c8c4c6 | ||
|
|
85ac8177ad |
No files matched your search
@@ -1,3 +1,14 @@
|
|||||||
|
## Release 1.7.2
|
||||||
|
|
||||||
|
Bug fixes and minor improvements
|
||||||
|
|
||||||
|
* Fixed an error where the Docker plugin could fail to attach a
|
||||||
|
container with a `bridge "weave" not present` error #2540/#2541
|
||||||
|
* Fixed `cannot connect to itself` panic on weave launch #2527/#2543
|
||||||
|
* Fixed inferred initial peer count when target peers includes self
|
||||||
|
#2481/#2543
|
||||||
|
* Fixed compilation on Raspberry Pi #2506/#2538
|
||||||
|
|
||||||
## Release 1.7.1
|
## Release 1.7.1
|
||||||
|
|
||||||
Bug fixes and minor improvements
|
Bug fixes and minor improvements
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/j-keck/arping"
|
|
||||||
"github.com/vishvananda/netlink"
|
"github.com/vishvananda/netlink"
|
||||||
"github.com/vishvananda/netns"
|
"github.com/vishvananda/netns"
|
||||||
|
|
||||||
@@ -167,20 +166,3 @@ func GetBridgeNetDev(bridgeName string) (NetDev, error) {
|
|||||||
|
|
||||||
return linkToNetDev(link)
|
return linkToNetDev(link)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do post-attach configuration of all veths we have created
|
|
||||||
func ConfigureARPforVeths(processID int, prefix string) error {
|
|
||||||
_, err := FindNetDevs(processID, func(link netlink.Link) bool {
|
|
||||||
ifName := link.Attrs().Name
|
|
||||||
if strings.HasPrefix(ifName, prefix) {
|
|
||||||
weavenet.ConfigureARPCache(ifName)
|
|
||||||
if addrs, err := netlink.AddrList(link, netlink.FAMILY_V4); err == nil {
|
|
||||||
for _, addr := range addrs {
|
|
||||||
arping.GratuitousArpOverIfaceByName(addr.IPNet.IP, ifName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
})
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,10 @@
|
|||||||
package net
|
package net
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"os/exec"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
"github.com/vishvananda/netlink"
|
"github.com/vishvananda/netlink"
|
||||||
@@ -63,3 +66,27 @@ func WithNetNSLinkByPidUnsafe(pid int, ifName string, work func(link netlink.Lin
|
|||||||
|
|
||||||
return WithNetNSLinkUnsafe(ns, ifName, work)
|
return WithNetNSLinkUnsafe(ns, ifName, work)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A safe version of WithNetNS* which creates a process executing
|
||||||
|
// "nsenter --net=<ns-path> weaveutil <cmd> [args]".
|
||||||
|
func WithNetNS(nsPath string, cmd string, args ...string) (string, error) {
|
||||||
|
var stdout, stderr bytes.Buffer
|
||||||
|
|
||||||
|
args = append([]string{"--net=" + nsPath, "weaveutil", cmd}, args...)
|
||||||
|
c := exec.Command("nsenter", args...)
|
||||||
|
c.Stdout = &stdout
|
||||||
|
c.Stderr = &stderr
|
||||||
|
if err := c.Run(); err != nil {
|
||||||
|
return "", fmt.Errorf("%s: %s", string(stderr.Bytes()), err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return string(stdout.Bytes()), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithNetNSByPid(pid int, cmd string, args ...string) (string, error) {
|
||||||
|
return WithNetNS(NSPathByPid(pid), cmd, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func NSPathByPid(pid int) string {
|
||||||
|
return fmt.Sprintf("/proc/%d/ns/net", pid)
|
||||||
|
}
|
||||||
@@ -4,7 +4,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
weaveapi "github.com/weaveworks/weave/api"
|
weaveapi "github.com/weaveworks/weave/api"
|
||||||
"github.com/weaveworks/weave/common"
|
|
||||||
"github.com/weaveworks/weave/common/docker"
|
"github.com/weaveworks/weave/common/docker"
|
||||||
weavenet "github.com/weaveworks/weave/net"
|
weavenet "github.com/weaveworks/weave/net"
|
||||||
)
|
)
|
||||||
@@ -46,7 +45,7 @@ func (w *watcher) ContainerStarted(id string) {
|
|||||||
if err := w.weave.RegisterWithDNS(id, fqdn, net.IPAddress); err != nil {
|
if err := w.weave.RegisterWithDNS(id, fqdn, net.IPAddress); err != nil {
|
||||||
w.driver.warn("ContainerStarted", "unable to register %s with weaveDNS: %s", id, err)
|
w.driver.warn("ContainerStarted", "unable to register %s with weaveDNS: %s", id, err)
|
||||||
}
|
}
|
||||||
if err := common.ConfigureARPforVeths(info.State.Pid, weavenet.VethName); err != nil {
|
if _, err := weavenet.WithNetNSByPid(info.State.Pid, "configure-arp", weavenet.VethName); err != nil {
|
||||||
w.driver.warn("ContainerStarted", "unable to configure interfaces: %s", err)
|
w.driver.warn("ContainerStarted", "unable to configure interfaces: %s", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-13
@@ -32,9 +32,21 @@ func checkForUpdates(dockerVersion string, network string) {
|
|||||||
|
|
||||||
var uts syscall.Utsname
|
var uts syscall.Utsname
|
||||||
syscall.Uname(&uts)
|
syscall.Uname(&uts)
|
||||||
|
|
||||||
|
release := uts.Release[:]
|
||||||
|
releaseBytes := make([]byte, len(release))
|
||||||
|
i := 0
|
||||||
|
for ; i < len(release); i++ {
|
||||||
|
if release[i] == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
releaseBytes[i] = uint8(release[i])
|
||||||
|
}
|
||||||
|
kernelVersion := string(releaseBytes[:i])
|
||||||
|
|
||||||
flags := map[string]string{
|
flags := map[string]string{
|
||||||
"docker-version": dockerVersion,
|
"docker-version": dockerVersion,
|
||||||
"kernel-version": charsToString(uts.Release[:]),
|
"kernel-version": kernelVersion,
|
||||||
}
|
}
|
||||||
if network != "" {
|
if network != "" {
|
||||||
flags["network"] = network
|
flags["network"] = network
|
||||||
@@ -49,15 +61,3 @@ func checkForUpdates(dockerVersion string, network string) {
|
|||||||
}
|
}
|
||||||
checker = checkpoint.CheckInterval(¶ms, updateCheckPeriod, handleResponse)
|
checker = checkpoint.CheckInterval(¶ms, updateCheckPeriod, handleResponse)
|
||||||
}
|
}
|
||||||
|
|
||||||
func charsToString(ca []int8) string {
|
|
||||||
s := make([]byte, len(ca))
|
|
||||||
i := 0
|
|
||||||
for ; i < len(ca); i++ {
|
|
||||||
if ca[i] == 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
s[i] = uint8(ca[i])
|
|
||||||
}
|
|
||||||
return string(s[:i])
|
|
||||||
}
|
|
||||||
@@ -23,6 +23,7 @@ func init() {
|
|||||||
"process-addrs": processAddrs,
|
"process-addrs": processAddrs,
|
||||||
"attach-container": attach,
|
"attach-container": attach,
|
||||||
"detach-container": detach,
|
"detach-container": detach,
|
||||||
|
"configure-arp": configureARP,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/j-keck/arping"
|
||||||
|
"github.com/vishvananda/netlink"
|
||||||
|
|
||||||
|
weavenet "github.com/weaveworks/weave/net"
|
||||||
|
)
|
||||||
|
|
||||||
|
func configureARP(args []string) error {
|
||||||
|
if len(args) != 1 {
|
||||||
|
cmdUsage("configure-arp", "<iface-name-prefix>")
|
||||||
|
}
|
||||||
|
prefix := args[0]
|
||||||
|
|
||||||
|
links, err := netlink.LinkList()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, link := range links {
|
||||||
|
ifName := link.Attrs().Name
|
||||||
|
if strings.HasPrefix(ifName, prefix) {
|
||||||
|
weavenet.ConfigureARPCache(ifName)
|
||||||
|
if addrs, err := netlink.AddrList(link, netlink.FAMILY_V4); err == nil {
|
||||||
|
for _, addr := range addrs {
|
||||||
|
arping.GratuitousArpOverIfaceByName(addr.IPNet.IP, ifName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
+1
-1
Submodule vendor/github.com/weaveworks/mesh updated: 50329b4166...3e1ae95e23.
Reference in new issue
Block a user