Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
be3f88656b | ||
|
|
27367ab292 | ||
|
|
20620f0002 | ||
|
|
8d79e33ba1 | ||
|
|
ce4857f5dc | ||
|
|
bceabe32a2 | ||
|
|
6a9f9f66dc | ||
|
|
639e0e82c9 | ||
|
|
4b0a6e1433 | ||
|
|
cb6db91b09 | ||
|
|
6a02e2dc17 | ||
|
|
b377207faf | ||
|
|
24ebb7cc7c | ||
|
|
b5518db03c | ||
|
|
2aa4e6a83a | ||
|
|
7c655cc3ba | ||
|
|
75cda01167 | ||
|
|
4f0f3cf98d | ||
|
|
e014140134 | ||
|
|
c8ae128e59 | ||
|
|
12d848162d | ||
|
|
b12096bd6c | ||
|
|
1430982166 | ||
|
|
2a83aad1d6 | ||
|
|
4a7157959a | ||
|
|
e52abafc48 | ||
|
|
ee531b8023 | ||
|
|
5e761a62b0 | ||
|
|
b442567406 | ||
|
|
17d53af2a2 | ||
|
|
1228dbddb9 | ||
|
|
c00b00d623 | ||
|
|
7bbc9f1b82 | ||
|
|
15a92f9c92 | ||
|
|
9386c01845 |
No files matched your search
+5
-20
@@ -1,28 +1,13 @@
|
||||
language: go
|
||||
language: python
|
||||
sudo: false
|
||||
go:
|
||||
- 1.4
|
||||
|
||||
env:
|
||||
- PATH="${PATH}:${HOME}/.local/bin"
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- libpcap-dev
|
||||
- PATH="${PATH}:${HOME}/gsutil"
|
||||
|
||||
install:
|
||||
- go clean -i net
|
||||
- go install -tags netgo std
|
||||
- go get github.com/golang/lint/golint
|
||||
- pip install --user --upgrade gsutil
|
||||
- pip install pyopenssl
|
||||
- curl --silent --location https://storage.googleapis.com/pub/gsutil.tar.gz | tar xz -C $HOME
|
||||
- bin/setup-ci-secrets $encrypted_5ba036e89377_key $encrypted_5ba036e89377_iv
|
||||
- make travis
|
||||
- go get ./...
|
||||
|
||||
script:
|
||||
- make tests
|
||||
|
||||
after_success:
|
||||
- go get github.com/mattn/goveralls
|
||||
- test "${TRAVIS_PULL_REQUEST}" = "false" && site/build-and-publish.sh
|
||||
- 'test "${TRAVIS_PULL_REQUEST}" = "true" || site/build-and-publish.sh'
|
||||
@@ -1,3 +1,36 @@
|
||||
## Release 1.4.5
|
||||
|
||||
Higher performance for multicast and broadcast traffic when using
|
||||
Weave's Fast Datapath
|
||||
|
||||
* The flow rule to deliver broadcast and multicast packets in-kernel
|
||||
was not created correctly, hence every such packet caused a
|
||||
context-switch to the software router #2003/#2008
|
||||
|
||||
Other fixes:
|
||||
|
||||
* Remove DNS entries for containers that are being restarted by Docker
|
||||
but are not live yet #1977/#1989
|
||||
* Don't let one failing allocation attempt prevent others from
|
||||
succeeding; they could be in different subnets which are more
|
||||
available #1996/#2001
|
||||
* Don't complain on second router launch on kernels that lack support
|
||||
for Fast Datapath #1929/#1983
|
||||
* Fix build broken by change in libnetwork IPAM API #1984/#1985
|
||||
|
||||
## Release 1.4.4
|
||||
|
||||
Fixing a rather serious issue that slipped through our preparations
|
||||
for Docker 1.10:
|
||||
|
||||
* Restarting Docker or rebooting your machine while the Weave Net
|
||||
plugin is running causes Docker 1.10.0 to fail to start #1959/#1963
|
||||
|
||||
Also one other small fix:
|
||||
|
||||
* Avoid a hang when trying to use plugin and proxy at the same time
|
||||
#1956/#1961
|
||||
|
||||
## Release 1.4.3
|
||||
|
||||
Preparing for Docker 1.10, plus some bug-fixes.
|
||||
|
||||
@@ -97,7 +97,7 @@ func (c *Client) AddObserver(ob ContainerObserver) error {
|
||||
func (c *Client) IsContainerNotRunning(idStr string) bool {
|
||||
container, err := c.InspectContainer(idStr)
|
||||
if err == nil {
|
||||
return !container.State.Running
|
||||
return !container.State.Running || container.State.Restarting
|
||||
}
|
||||
if _, notThere := err.(*docker.NoSuchContainer); notThere {
|
||||
return true
|
||||
|
||||
+11
-17
@@ -140,29 +140,23 @@ func (alloc *Allocator) cancelOpsFor(ops *[]operation, ident string) bool {
|
||||
return found
|
||||
}
|
||||
|
||||
// Try all pending operations
|
||||
func (alloc *Allocator) tryPendingOps() {
|
||||
// The slightly different semantics requires us to operate on 'claims' and
|
||||
// 'allocates' separately:
|
||||
// Claims must be tried before Allocates
|
||||
for i := 0; i < len(alloc.pendingClaims); {
|
||||
op := alloc.pendingClaims[i]
|
||||
// Try all operations in a queue
|
||||
func (alloc *Allocator) tryOps(ops *[]operation) {
|
||||
for i := 0; i < len(*ops); {
|
||||
op := (*ops)[i]
|
||||
if !op.Try(alloc) {
|
||||
i++
|
||||
continue
|
||||
}
|
||||
alloc.pendingClaims = append(alloc.pendingClaims[:i], alloc.pendingClaims[i+1:]...)
|
||||
*ops = append((*ops)[:i], (*ops)[i+1:]...)
|
||||
}
|
||||
}
|
||||
|
||||
// When the first Allocate fails, bail - no need to
|
||||
// send too many begs for space.
|
||||
for i := 0; i < len(alloc.pendingAllocates); {
|
||||
op := alloc.pendingAllocates[i]
|
||||
if !op.Try(alloc) {
|
||||
break
|
||||
}
|
||||
alloc.pendingAllocates = append(alloc.pendingAllocates[:i], alloc.pendingAllocates[i+1:]...)
|
||||
}
|
||||
// Try all pending operations
|
||||
func (alloc *Allocator) tryPendingOps() {
|
||||
// Process existing claims before servicing new allocations
|
||||
alloc.tryOps(&alloc.pendingClaims)
|
||||
alloc.tryOps(&alloc.pendingAllocates)
|
||||
}
|
||||
|
||||
func (alloc *Allocator) spaceRequestDenied(sender mesh.PeerName, r address.Range) {
|
||||
|
||||
@@ -84,8 +84,8 @@ func (n *Nameserver) broadcastEntries(es ...Entry) error {
|
||||
}
|
||||
|
||||
func (n *Nameserver) AddEntry(hostname, containerid string, origin mesh.PeerName, addr address.Address) error {
|
||||
n.infof("adding entry %s -> %s", hostname, addr.String())
|
||||
n.Lock()
|
||||
n.infof("adding entry for %s: %s -> %s", containerid, hostname, addr.String())
|
||||
entry := n.entries.add(hostname, containerid, origin, addr)
|
||||
n.Unlock()
|
||||
return n.broadcastEntries(entry)
|
||||
|
||||
@@ -53,7 +53,7 @@ func EnsureInterfaceAndMcastRoute(ifaceName string) (*net.Interface, error) {
|
||||
}
|
||||
dest := net.IPv4(224, 0, 0, 0)
|
||||
check := func(route netlink.Route) bool {
|
||||
return route.LinkIndex == iface.Index && route.Dst != nil && route.Dst.IP.Equal(dest)
|
||||
return route.Dst != nil && route.Dst.IP.Equal(dest)
|
||||
}
|
||||
// check for currently-existing route after subscribing, to avoid race
|
||||
routes, err := netlink.RouteList(nil, netlink.FAMILY_V4)
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/docker/libnetwork/discoverapi"
|
||||
"github.com/docker/libnetwork/ipamapi"
|
||||
"github.com/docker/libnetwork/netlabel"
|
||||
godocker "github.com/fsouza/go-dockerclient"
|
||||
@@ -67,3 +68,13 @@ func (i *ipam) ReleaseAddress(poolID string, address net.IP) error {
|
||||
Log.Debugln("ReleaseAddress", poolID, address)
|
||||
return i.weave.ReleaseIP(address.String())
|
||||
}
|
||||
|
||||
// Functions required by ipamapi "contract" but not actually used.
|
||||
|
||||
func (i *ipam) DiscoverNew(discoverapi.DiscoveryType, interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (i *ipam) DiscoverDelete(discoverapi.DiscoveryType, interface{}) error {
|
||||
return nil
|
||||
}
|
||||
@@ -106,9 +106,6 @@ func run(dockerClient *docker.Client, address, meshAddress, meshNetworkName, nam
|
||||
select {
|
||||
case sig := <-sigChan:
|
||||
Log.Debugf("Caught signal %s; shutting down", sig)
|
||||
if meshNetworkName != "" {
|
||||
return dockerClient.Client.RemoveNetwork(meshNetworkName)
|
||||
}
|
||||
return nil
|
||||
case err := <-endChan:
|
||||
return err
|
||||
|
||||
+2
-1
@@ -132,7 +132,8 @@ func (proxy *Proxy) AttachExistingContainers() {
|
||||
}
|
||||
continue
|
||||
}
|
||||
if containerShouldAttach(container) && (container.State.Running || container.State.Paused) {
|
||||
// The 'Running' check is purely an optimisation.
|
||||
if containerShouldAttach(container) && container.State.Running {
|
||||
proxy.attach(container, false)
|
||||
}
|
||||
}
|
||||
|
||||
+8
-4
@@ -775,10 +775,10 @@ func (fwd *fastDatapathForwarder) Forward(key ForwardPacketKey) FlowOp {
|
||||
defer fwd.lock.RUnlock()
|
||||
|
||||
if fwd.remoteAddr == nil {
|
||||
// Returning nil would discard the packet, but also
|
||||
// result in a flow rule, which we would have to
|
||||
// invalidate when we learn the remote IP. So for
|
||||
// now, just prevent flows.
|
||||
// Returning a DiscardingFlowOp would discard the
|
||||
// packet, but also result in a flow rule, which we
|
||||
// would have to invalidate when we learn the remote
|
||||
// IP. So for now, just prevent flows.
|
||||
return vetoFlowCreationFlowOp{}
|
||||
}
|
||||
|
||||
@@ -1086,6 +1086,10 @@ func (fastdp *FastDatapath) send(fops FlowOp, frame []byte, lock *fastDatapathLo
|
||||
case vetoFlowCreationFlowOp:
|
||||
createFlow = false
|
||||
default:
|
||||
if xfop.Discards() {
|
||||
continue
|
||||
}
|
||||
|
||||
// A foreign FlowOp (e.g. a sleeve forwarding
|
||||
// FlowOp), so send the packet through the
|
||||
// FlowOp interface, decoding the packet
|
||||
|
||||
+1
-4
@@ -84,15 +84,12 @@ func (mfop *MultiFlowOp) Discards() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
// Flatten out a FlowOp to eliminate any MultiFlowOps
|
||||
func FlattenFlowOp(fop FlowOp) []FlowOp {
|
||||
return collectFlowOps(nil, fop)
|
||||
}
|
||||
|
||||
func collectFlowOps(into []FlowOp, fop FlowOp) []FlowOp {
|
||||
if fop == nil {
|
||||
return into
|
||||
}
|
||||
|
||||
if mfop, ok := fop.(*MultiFlowOp); ok {
|
||||
for _, op := range mfop.ops {
|
||||
into = collectFlowOps(into, op)
|
||||
|
||||
+9
-1
@@ -87,7 +87,12 @@ launched via the Docker
|
||||
[command-line interface](https://docs.docker.com/reference/commandline/cli/)
|
||||
or
|
||||
[remote API](https://docs.docker.com/reference/api/docker_remote_api/)
|
||||
are attached to the weave network before they begin execution.
|
||||
are attached to the weave network before they begin execution. To use
|
||||
the proxy, run
|
||||
|
||||
$ eval $(weave env)
|
||||
|
||||
and then start containers as usual.
|
||||
|
||||
Containers started in this way that subsequently restart, either by an
|
||||
explicit `docker restart` command or by Docker restart policy, are
|
||||
@@ -100,6 +105,9 @@ named `weave` is created by `weave launch`, which you can use like this:
|
||||
|
||||
$ docker run --net=weave -ti ubuntu
|
||||
|
||||
> NB: The plugin is an *alternative* to the proxy, hence one should
|
||||
> *not* run `eval $(weave env)` beforehand.
|
||||
|
||||
For more details see the [plugin documentation](plugin.html).
|
||||
|
||||
### <a name="addressing"></a>Address allocation
|
||||
|
||||
+22
-2
@@ -18,13 +18,33 @@ Subsequently you can start containers with, e.g.
|
||||
|
||||
on any of the hosts, and they can all communicate with each other.
|
||||
|
||||
> WARNING: It is inadvisable to attach containers to the weave network
|
||||
> using both the Weave Docker Networking Plugin and
|
||||
> [Weave Docker API Proxy](proxy.html) simultaneously. Such containers
|
||||
> will end up with two weave network interfaces and two IP addresses,
|
||||
> which is rarely desirable. To ensure the proxy is not being used,
|
||||
> *do not run `eval $(weave env)`, or `docker $(weave config) ...`*.
|
||||
|
||||
In order to use Weave's [Service Discovery](weavedns.html), you
|
||||
need to pass the additional arguments `--dns` and `-dns-search`, for
|
||||
which we provide a helper in the weave script:
|
||||
|
||||
$ docker run --net=weave -h foo.weave.local $(weave dns-args) -tdi ubuntu
|
||||
$ docker run --net=weave -h bar.weave.local $(weave dns-args) -ti ubuntu
|
||||
# ping foo
|
||||
|
||||
Here is a complete example of using the plugin for connectivity
|
||||
between two containers running on different hosts:
|
||||
|
||||
host1$ weave launch
|
||||
host1$ docker run --net=weave -h foo.weave.local $(weave dns-args) -tdi ubuntu
|
||||
|
||||
host2$ weave launch $HOST1
|
||||
host2$ docker run --net=weave $(weave dns-args) -ti ubuntu
|
||||
root@cb73d1a8aece:/# ping -c1 -q foo
|
||||
PING foo (10.32.0.1) 56(84) bytes of data.
|
||||
|
||||
--- foo ping statistics ---
|
||||
1 packets transmitted, 1 received, 0% packet loss, time 0ms
|
||||
rtt min/avg/max/mdev = 1.341/1.341/1.341/0.000 ms
|
||||
|
||||
## Under the hood
|
||||
|
||||
|
||||
@@ -124,6 +124,13 @@ Proxy](proxy.html#troubleshooting).
|
||||
|
||||
### <a name="weave-status-connections"></a>List connections
|
||||
|
||||
Connections between weave peers carry control traffic over TCP and
|
||||
data traffic over UDP. For a connection to be fully established, the
|
||||
TCP connection and UDP data path must be able to transmit information
|
||||
in both directions. Weave routers check this regularly with
|
||||
heartbeats. Failed connections are automatically retried, with an
|
||||
exponential back-off.
|
||||
|
||||
Detailed information on the local weave router's connections can be
|
||||
obtained with `weave status connections`:
|
||||
|
||||
|
||||
@@ -18,7 +18,6 @@ hosts.
|
||||
* [Adding and removing extra DNS entries](#add-remove)
|
||||
* [Resolve weaveDNS entries from host](#resolve-weavedns-entries-from-host)
|
||||
* [Hot-swapping service containers](#hot-swapping)
|
||||
* [Retaining DNS entries when containers stop](#retain-stopped)
|
||||
* [Configuring a custom TTL](#ttl)
|
||||
* [Configuring the domain search path](#domain-search-path)
|
||||
* [Using a different local domain](#local-domain)
|
||||
|
||||
@@ -536,7 +536,9 @@ create_bridge() {
|
||||
add_iptables_rule nat POSTROUTING -j WEAVE
|
||||
else
|
||||
if [ -n "$LAUNCHING_ROUTER" ] ; then
|
||||
if [ "$BRIDGE_TYPE" = bridge -a -z "$WEAVE_NO_FASTDP" ] ; then
|
||||
if [ "$BRIDGE_TYPE" = bridge -a -z "$WEAVE_NO_FASTDP" ] &&
|
||||
util_op create-datapath $DATAPATH 2>/dev/null &&
|
||||
util_op delete-datapath $DATAPATH 2>/dev/null ; then
|
||||
cat <<EOF >&1
|
||||
WEAVE_NO_FASTDP is not set, but there is already a bridge present of
|
||||
the wrong type for fast datapath. Please do 'weave reset' to remove
|
||||
|
||||
Reference in new issue
Block a user