Compare commits

..
31 Commits
Author SHA1 Message Date
Matthias Radestock f4b3a68531 0.8.0 changelog 2015-01-04 09:32:45 +00:00
Matthias Radestock ee7a3e48c9 weave setup to download all required docker images
Closes #308.
2015-01-04 09:15:22 +00:00
rade ba27fd6523 Merge pull request #309 from rade/101_eliminate_dependencies
eliminate dependency on ethtool and conntrack on host

Closes #101.
2015-01-04 08:57:33 +00:00
Matthias Radestock 2d43b92572 display weavetools version 2015-01-02 18:29:52 +00:00
Bryan Boreham e9469b88af Add file init.go which was missed from previous refactor 2015-01-02 17:45:16 +00:00
Bryan Boreham 0af9b2cbab Fix up nameserver tests for previous refactoring 2015-01-02 17:12:21 +00:00
Michael Bridgen 734a3abae8 Merge branch 'pr297' 2015-01-02 16:46:34 +00:00
Matthias Radestock cd985c1bed cosmetic: more idiomatic way of figuring out directory 2015-01-02 16:39:02 +00:00
Matthias Radestock b8e4ad1314 add 'make update' to update dependencies 2015-01-02 16:35:51 +00:00
Matthias Radestock da3d343f26 tidying: remove 'publish' targer from .PHONY
we forgot to do that when removing the target itsel
2015-01-02 16:27:37 +00:00
Matthias Radestock 618de144d9 update changelog entry for 0.7.0 to point out new download locations 2015-01-02 15:43:34 +00:00
Bryan Boreham 82b54aabcd Move logging, updating and testing utils into common directory 2015-01-02 14:49:49 +00:00
Matthias Radestock 1fc37bf8df update README 2015-01-01 12:14:11 +00:00
Matthias Radestock e33885ecca wire weavetools into release 2015-01-01 11:51:15 +00:00
Matthias Radestock 57e86a8796 update .gitignore 2015-01-01 11:50:51 +00:00
Matthias Radestock eb628ec84a invoke ethtool and conntrack from the weavetools image 2015-01-01 01:05:27 +00:00
Matthias Radestock 7b6ea37fea wire in weavetools image build
We use a plain ubuntu container as a build environment for ethtool &
conntrack, so a) we don't require onerous tooling on the build host,
and b) don't pollute the build host with build artefacts. The latter
arise because I can only get conntrack to build by installing its
dependencies 'globally'.

Th dir containing the build script is volume-mounted into the
container, and that is where we also expect to see the result, namely
a 'bin' sub-dir containing two executables.

The weavetools image is then constructed from the 'scratch' image and
contains just that dir.
2015-01-01 00:57:02 +00:00
Matthias Radestock dd34099e06 machinery to build ethtool and conntrack 2015-01-01 00:54:23 +00:00
Matthias Radestock 5da2219dc8 cosmetic: remove weaver/.gitignore
and handle that in the top-level .gitignore instead. Just as we do for weavedns.
2015-01-01 00:49:34 +00:00
Matthias Radestock fd6f65e28f correct markdown for changelog 2014-12-30 17:32:23 +00:00
Matthias Radestock edabd8393d cosmetic 2014-12-30 17:24:40 +00:00
Michael Bridgen 82423ad466 Merge branch 'pr306_lock_versions' 2014-12-30 17:22:34 +00:00
Michael Bridgen 5f69637f31 Merge branch '34_version_alignment' of https://github.com/rade/weave into pr306_lock_versions 2014-12-30 17:00:08 +00:00
Michael Bridgen 2a1a40c05e Merge branch 'pr291_improve_testdev' 2014-12-30 16:55:01 +00:00
Matthias Radestock 2481079957 don't include image version when checking for existing containers
So we complain with "already running" rather than "Found another
running container" when encountering a 'weave' container running a
different image version. Similarly, we remove stopped 'weave'
containers regardless of version.

Ditto for weavedns.

Which is all how it used to work.
2014-12-30 16:49:41 +00:00
Michael Bridgen 87b3537b54 Merge branch 'improve_dev_and_test_env' of https://github.com/errordeveloper/weave into pr291_improve_testdev 2014-12-30 16:44:32 +00:00
Ilya Dmitrichenko 859878c004 Install latest Go toolchain on vagrant dev vms 2014-12-30 16:28:13 +00:00
Ilya Dmitrichenko 00832dcbb5 Ignore ssh know hosts for test vms 2014-12-30 16:28:03 +00:00
Matthias Radestock 57856a5584 align script and image versions
- released weave scripts run their corresponding image versions
- unreleased weave scripts run the 'latest'-tagged image versions

The image version to run can also be specified explicitly by setting
VERSION. Useful for testing, mainly.
2014-12-30 16:20:00 +00:00
Michael Bridgen d3002384d7 Also push the :latest tags to Dockerhub when publishing 2014-12-30 16:01:10 +00:00
Michael Bridgen a2fcda9267 Use the download URL for the latest release 2014-12-30 14:49:48 +00:00
25 changed files with 291 additions and 148 deletions

No files matched your search

+2
View File
@@ -27,5 +27,7 @@ _testmain.go
*~
# Project specific
weaver/weaver
weavedns/weavedns
tools/bin
releases
+29 -3
View File
@@ -1,4 +1,30 @@
== Release 0.7.0
## Release 0.8.0
This is the first release assigned a version number. See the README at
https://github.com/zettio/weave#readme for more information.
- Align script and image version. When the `weave` script has a
version number, i.e. it is part of an official release, it runs
docker images matching that version. Thus the script and image
versions are automatically aligned. Unversioned/unreleased `weave`
scripts run the 'latest'-tagged image versions.
- Eliminate dependency on ethtool and conntrack. Instead of requiring
these to be installed on the host, weave invokes them via a
`weavetools` docker image that contains minimally packaged versions
of these utilities.
- New `weave setup` command. This downloads all docker images used by
weave. Invoking this is strictly optional; its main purpose is to
facilitate automated installation of weave and preventing delays in
subsequent weave command execution due to image downloading.
## Release 0.7.0
This is the first release assigned a version number.
When downloading weave you now have the following choices...
1. a specific version, e.g. https://github.com/zettio/weave/releases/download/v0.7.0/weave
2. latest released version: https://github.com/zettio/weave/releases/download/latest_release/weave
3. most recent 'master' commit: https://raw.githubusercontent.com/zettio/weave/master/weave
Previously the only documented download location was (3). We recommend
that any automated scripts using that be changed to either (1) or (2).
+19 -5
View File
@@ -1,5 +1,5 @@
.DEFAULT: all
.PHONY: all publish clean tests
.PHONY: all update tests clean
# If you can use docker without being root, you can do "make SUDO="
SUDO=sudo
@@ -7,15 +7,21 @@ SUDO=sudo
WEAVE_VERSION=git-$(shell git rev-parse --short=12 HEAD)
WEAVER_EXE=weaver/weaver
WEAVEDNS_EXE=weavedns/weavedns
WEAVETOOLS_EXES=tools/bin
WEAVER_IMAGE=zettio/weave
WEAVEDNS_IMAGE=zettio/weavedns
WEAVETOOLS_IMAGE=zettio/weavetools
WEAVER_EXPORT=/var/tmp/weave.tar
WEAVEDNS_EXPORT=/var/tmp/weavedns.tar
WEAVETOOLS_EXPORT=/var/tmp/weavetools.tar
all: $(WEAVER_EXPORT) $(WEAVEDNS_EXPORT)
all: $(WEAVER_EXPORT) $(WEAVEDNS_EXPORT) $(WEAVETOOLS_EXPORT)
update:
go get -u -f -v -tags -netgo ./$(dir $(WEAVER_EXE)) ./$(dir $(WEAVEDNS_EXE))
$(WEAVER_EXE) $(WEAVEDNS_EXE):
go get -tags netgo ./$(shell dirname $@)
go get -tags netgo ./$(@D)
go build -ldflags "-extldflags \"-static\" -X main.version $(WEAVE_VERSION)" -tags netgo -o $@ ./$(shell dirname $@)
@strings $@ | grep cgo_stub\\\.go >/dev/null || { \
rm $@; \
@@ -29,6 +35,9 @@ $(WEAVER_EXE) $(WEAVEDNS_EXE):
$(WEAVER_EXE): router/*.go weaver/main.go
$(WEAVEDNS_EXE): nameserver/*.go weavedns/main.go
$(WEAVETOOLS_EXES): tools/build.sh
$(SUDO) docker run --rm -v $(realpath $(<D)):/home/weave ubuntu sh /home/weave/build.sh
$(WEAVER_EXPORT): weaver/Dockerfile $(WEAVER_EXE)
$(SUDO) docker build -t $(WEAVER_IMAGE) weaver
$(SUDO) docker save $(WEAVER_IMAGE):latest > $@
@@ -37,10 +46,15 @@ $(WEAVEDNS_EXPORT): weavedns/Dockerfile $(WEAVEDNS_EXE)
$(SUDO) docker build -t $(WEAVEDNS_IMAGE) weavedns
$(SUDO) docker save $(WEAVEDNS_IMAGE):latest > $@
$(WEAVETOOLS_EXPORT): tools/Dockerfile $(WEAVETOOLS_EXES)
$(SUDO) docker build -t $(WEAVETOOLS_IMAGE) tools
$(SUDO) docker save $(WEAVETOOLS_IMAGE):latest > $@
# Add more directories in here as more tests are created
tests:
cd nameserver; go test -tags netgo
clean:
-$(SUDO) docker rmi $(WEAVER_IMAGE) $(WEAVEDNS_IMAGE)
rm -f $(WEAVER_EXE) $(WEAVEDNS_EXE) $(WEAVER_EXPORT) $(WEAVEDNS_EXPORT)
-$(SUDO) docker rmi $(WEAVER_IMAGE) $(WEAVEDNS_IMAGE) $(WEAVETOOLS_IMAGE)
rm -f $(WEAVER_EXE) $(WEAVEDNS_EXE) $(WEAVER_EXPORT) $(WEAVEDNS_EXPORT) $(WEAVETOOLS_EXPORT)
$(SUDO) rm -rf $(WEAVETOOLS_EXES)
+12 -20
View File
@@ -27,26 +27,12 @@ capabilities, so these can continue to be used by containers.
## Installation
To run weave on a host, you need to install...
Ensure you are running Linux (kernel 3.5 or later) and have Docker
(version 0.9.1 or later) installed. Then install weave with
1. Linux and Docker. We've tested with Docker versions 0.9.1 through
1.3.1, but other versions should work too. Linux kernels after 3.5
are known to work; the newer the better.
2. weave. Install this with
sudo wget -O /usr/local/bin/weave \
https://raw.githubusercontent.com/zettio/weave/master/weave
sudo chmod a+x /usr/local/bin/weave
3. (recommended) ethtool. On many systems this is installed already;
if not then grab it via your favourite package manager. On some
systems, weave application container networking may not operate
correctly unless ethtool is available.
4. (optional) conntrack. Install this via your favourite package
manager. Without conntrack, the weave network may not re-establish
itself fully when individual weave instances are stopped (with
`weave stop`) and restarted quickly (typically within ~3 minutes).
sudo wget -O /usr/local/bin/weave \
https://github.com/zettio/weave/releases/download/latest_release/weave
sudo chmod a+x /usr/local/bin/weave
## Quick Start Screencast
@@ -66,7 +52,13 @@ On `$HOST1` run (as root)
host1# C=$(weave run 10.0.1.1/24 -t -i ubuntu)
The first line starts the weave router, in a container. This needs to
be done once on each host.
be done once on each host. The required docker image for the weave
router container is downloaded automatically. There is also a `weave
setup` command for downloading this and other images required for
weave operation; this is a strictly optional step which is especially
useful for automated installation of weave and ensures that any
subsequent weave commands do not encounter delays due to image
downloading.
The second line runs our application container. We give it an IP
address and network, in
Vendored
+10 -5
View File
@@ -1,7 +1,7 @@
VAGRANTFILE_API_VERSION = "2"
vm_ip = "172.16.0.3" # arbitrary private IP
pkgs = "lxc-docker golang ethtool libpcap-dev git mercurial"
pkgs = "lxc-docker build-essential ethtool libpcap-dev git mercurial"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "phusion/ubuntu-14.04-amd64"
@@ -14,14 +14,19 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.provision :shell, :inline => "sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9"
config.vm.provision :shell, :inline => "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
pkg_cmd = "apt-get update -qq; " \
"apt-get install -q -y --force-yes --no-install-recommends "
pkg_cmd << pkgs
pkg_cmd = "export DEBIAN_FRONTEND=noninteractive; " \
"apt-get update -qq; " \
"apt-get install -qq --no-install-recommends #{pkgs}"
install_go_toolchain = "curl -s https://storage.googleapis.com/golang/go1.4.linux-amd64.tar.gz | tar xz -C /usr/local"
config.vm.provision :shell, :inline => pkg_cmd
config.vm.provision :shell, :inline => install_go_toolchain
config.vm.provision :shell, :inline => "usermod -a -G docker vagrant; "
config.vm.provision :shell, :inline => "echo export GOPATH=/home/vagrant >> /home/vagrant/.bashrc"
config.vm.provision :shell, :inline => "echo export PATH=/usr/local/go/bin:${PATH} >> /home/vagrant/.bashrc"
config.vm.provision :shell, :inline => "chown -R vagrant:vagrant /home/vagrant/src"
config.vm.provision :shell, :inline => "sudo go install -a -tags netgo std"
config.vm.provision :shell, :inline => "/usr/local/go/bin/go clean -i net; /usr/local/go/bin/go install -tags netgo std"
end
+9 -10
View File
@@ -37,7 +37,7 @@ build() {
cd $RELEASE_DIR
## Check that the top changelog entry is this version
if ! latest_changelog=$(grep -o "== Release [0-9].*" -m1 ./CHANGELOG.md) || \
if ! latest_changelog=$(grep -o "## Release [0-9].*" -m1 ./CHANGELOG.md) || \
! [ `echo "$latest_changelog" | grep -o '[0-9][^ ]*'` == "$VERSION" ]; then
echo -e "\u2757 Latest changelog entry \"$latest_changelog\" does not match the release version $VERSION" >&2
exit 1
@@ -121,14 +121,13 @@ publish() {
echo '** Sanity checks OK for publishing tag' $LATEST_TAG as $DOCKERHUB_USER/weave:$VERSION
echo == Tagging $DOCKERHUB_USER/weave and $DOCKERHUB_USER/weavedns as $VERSION
docker tag $DOCKERHUB_USER/weave $DOCKERHUB_USER/weave:$VERSION
docker tag $DOCKERHUB_USER/weavedns $DOCKERHUB_USER/weavedns:$VERSION
docker push $DOCKERHUB_USER/weave:$VERSION
echo "** Pushed $DOCKERHUB_USER/weave:$VERSION to docker hub"
docker push $DOCKERHUB_USER/weavedns:$VERSION
echo "** Pushed $DOCKERHUB_USER/weavedns:$VERSION to docker hub"
for IMAGE in weave weavedns weavetools ; do
echo == Tagging $DOCKERHUB_USER/$IMAGE as $VERSION
docker tag $DOCKERHUB_USER/$IMAGE $DOCKERHUB_USER/$IMAGE:$VERSION
docker push $DOCKERHUB_USER/$IMAGE:$VERSION
docker push $DOCKERHUB_USER/$IMAGE:latest
echo "** Pushed $DOCKERHUB_USER/$IMAGE:$VERSION to docker hub"
done
echo "== Creating GitHub release $RELEASE_NAME $VERSION"
# This cannot be done as a draft because of a bug in
@@ -173,7 +172,7 @@ publish() {
--file "./weave"
echo "** Published $RELEASE_NAME as latest_release at"
echo -e "\thttps://github.com/$GITHUB_USER/weave/releases/latest_release"
echo -e "\thttps://github.com/$GITHUB_USER/weave/releases/latest_release"
}
usage() {
+10
View File
@@ -0,0 +1,10 @@
package common
import (
"io/ioutil"
"os"
)
func init() {
InitLogging(ioutil.Discard, os.Stdout, os.Stdout, os.Stderr)
}
+7 -3
View File
@@ -1,4 +1,4 @@
package nameserver
package common
import (
"io"
@@ -32,6 +32,10 @@ func InitLogging(debugHandle io.Writer,
Error = log.New(errorHandle, "ERROR: ", standardLogFlags)
}
func init() {
InitLogging(ioutil.Discard, os.Stdout, os.Stdout, os.Stderr)
func InitDefaultLogging(debug bool) {
debugOut := ioutil.Discard
if debug {
debugOut = os.Stderr
}
InitLogging(debugOut, os.Stdout, os.Stdout, os.Stderr)
}
+51
View File
@@ -0,0 +1,51 @@
package common
import (
"fmt"
"reflect"
"runtime"
"strings"
"testing"
)
func CallSite() string {
_, file, line, ok := runtime.Caller(2)
if ok {
// Truncate file name at last file name separator.
if index := strings.LastIndex(file, "/"); index >= 0 {
file = file[index+1:]
} else if index = strings.LastIndex(file, "\\"); index >= 0 {
file = file[index+1:]
}
} else {
file = "???"
line = 1
}
return fmt.Sprintf("%s:%d: ", file, line)
}
func AssertNoErr(t *testing.T, err error) {
if err != nil {
t.Fatal(CallSite(), err)
}
}
func AssertStatus(t *testing.T, got int, wanted int, desc string) {
if got != wanted {
t.Fatalf("%s: Expected %s %d but got %d", CallSite(), desc, wanted, got)
}
}
func AssertErrorInterface(t *testing.T, got interface{}, wanted interface{}, desc string) {
gotT, wantedT := reflect.TypeOf(got), reflect.TypeOf(wanted).Elem()
if !gotT.Implements(wantedT) {
t.Fatalf("%s: Expected %s but got %s (%s)", CallSite(), wantedT.String(), gotT.String(), desc)
}
}
func AssertErrorType(t *testing.T, got interface{}, wanted interface{}, desc string) {
gotT, wantedT := reflect.TypeOf(got), reflect.TypeOf(wanted).Elem()
if gotT != wantedT {
t.Fatalf("%s: Expected %s but got %s (%s)", CallSite(), wantedT.String(), gotT.String(), desc)
}
}
+1
View File
@@ -4,6 +4,7 @@ import (
"errors"
"fmt"
"github.com/miekg/dns"
. "github.com/zettio/weave/common"
"io"
"log"
"net"
+14 -13
View File
@@ -2,6 +2,7 @@ package nameserver
import (
"fmt"
wt "github.com/zettio/weave/common"
"math/rand"
"net"
"net/http"
@@ -38,12 +39,12 @@ func TestHttp(t *testing.T) {
addrUrl := fmt.Sprintf("http://localhost:%d/name/%s/%s", port, containerID, addrParts[0])
resp, err := genForm("PUT", addrUrl,
url.Values{"fqdn": {successTestName}, "local_ip": {dockerIP}, "routing_prefix": {addrParts[1]}})
assertNoErr(t, err)
assertStatus(t, resp.StatusCode, http.StatusOK, "http response")
wt.AssertNoErr(t, err)
wt.AssertStatus(t, resp.StatusCode, http.StatusOK, "http response")
// Check that the address is now there.
foundIP, err := zone.LookupLocal(successTestName)
assertNoErr(t, err)
wt.AssertNoErr(t, err)
ip, _, _ := net.ParseCIDR(testAddr1)
if !foundIP.Equal(ip) {
t.Fatal("Unexpected result for", successTestName, foundIP)
@@ -52,34 +53,34 @@ func TestHttp(t *testing.T) {
// Adding exactly the same address should be OK
resp, err = genForm("PUT", addrUrl,
url.Values{"fqdn": {successTestName}, "local_ip": {dockerIP}, "routing_prefix": {addrParts[1]}})
assertNoErr(t, err)
assertStatus(t, resp.StatusCode, http.StatusOK, "http success response for duplicate add")
wt.AssertNoErr(t, err)
wt.AssertStatus(t, resp.StatusCode, http.StatusOK, "http success response for duplicate add")
// Now try adding the same address again with a different ident --
// again should be fine
otherUrl := fmt.Sprintf("http://localhost:%d/name/%s/%s", port, "other", addrParts[0])
resp, err = genForm("PUT", otherUrl,
url.Values{"fqdn": {successTestName}, "local_ip": {dockerIP}, "routing_prefix": {addrParts[1]}})
assertNoErr(t, err)
assertStatus(t, resp.StatusCode, http.StatusOK, "http response")
wt.AssertNoErr(t, err)
wt.AssertStatus(t, resp.StatusCode, http.StatusOK, "http response")
// Delete the address
resp, err = genForm("DELETE", addrUrl, nil)
assertNoErr(t, err)
assertStatus(t, resp.StatusCode, http.StatusOK, "http response")
wt.AssertNoErr(t, err)
wt.AssertStatus(t, resp.StatusCode, http.StatusOK, "http response")
// Check that the address is still resolvable.
_, err = zone.LookupLocal(successTestName)
assertNoErr(t, err)
wt.AssertNoErr(t, err)
// Delete the address record mentioning the other container
resp, err = genForm("DELETE", otherUrl, nil)
assertNoErr(t, err)
assertStatus(t, resp.StatusCode, http.StatusOK, "http response")
wt.AssertNoErr(t, err)
wt.AssertStatus(t, resp.StatusCode, http.StatusOK, "http response")
// Check that the address is gone
_, err = zone.LookupLocal(successTestName)
assertErrorType(t, err, (*LookupError)(nil), "fully-removed address")
wt.AssertErrorType(t, err, (*LookupError)(nil), "fully-removed address")
// Would like to shut down the http server at the end of this test
// but it's complicated.
+4 -3
View File
@@ -2,6 +2,7 @@ package nameserver
import (
"github.com/miekg/dns"
wt "github.com/zettio/weave/common"
"log"
"net"
"testing"
@@ -61,9 +62,9 @@ func RunLocalMulticastServer() (*dns.Server, error) {
func setup(t *testing.T) (*MDNSClient, *dns.Server, error) {
mdnsClient, err := NewMDNSClient()
assertNoErr(t, err)
wt.AssertNoErr(t, err)
err = mdnsClient.Start(nil)
assertNoErr(t, err)
wt.AssertNoErr(t, err)
server, err := RunLocalMulticastServer()
if err != nil {
@@ -87,7 +88,7 @@ func (c *testContext) checkResponse(t *testing.T, channelOk bool, resp *Response
c.channel = nil
return
}
assertNoErr(t, resp.Err)
wt.AssertNoErr(t, resp.Err)
log.Printf("Got address response %s addr %s", resp.Name, resp.Addr)
c.receivedAddr = resp.Addr
c.receivedCount++
+1
View File
@@ -2,6 +2,7 @@ package nameserver
import (
"github.com/miekg/dns"
. "github.com/zettio/weave/common"
"net"
)
+4 -3
View File
@@ -2,6 +2,7 @@ package nameserver
import (
"github.com/miekg/dns"
wt "github.com/zettio/weave/common"
"log"
"net"
"testing"
@@ -36,16 +37,16 @@ func TestServerSimpleQuery(t *testing.T) {
zone.AddRecord(containerID, "test.weave.", ip)
mdnsServer, err := NewMDNSServer(zone)
assertNoErr(t, err)
wt.AssertNoErr(t, err)
err = mdnsServer.Start(nil)
assertNoErr(t, err)
wt.AssertNoErr(t, err)
var receivedAddr net.IP
receivedCount := 0
// Implement a minimal listener for responses
multicast, err := LinkLocalMulticastListener(nil)
assertNoErr(t, err)
wt.AssertNoErr(t, err)
handleMDNS := func(w dns.ResponseWriter, r *dns.Msg) {
// Only handle responses here
+1
View File
@@ -3,6 +3,7 @@ package nameserver
import (
"fmt"
"github.com/miekg/dns"
. "github.com/zettio/weave/common"
"net"
)
-38
View File
@@ -1,38 +0,0 @@
package nameserver
import (
"reflect"
"testing"
)
func assertNoErr(t *testing.T, err error) {
if err != nil {
t.Fatal(err)
}
}
func assertStatus(t *testing.T, got int, wanted int, desc string) {
if got != wanted {
t.Fatalf("Expected %s %d but got %d", desc, wanted, got)
}
}
func assertErrorInterface(t *testing.T, got interface{}, wanted interface{}, desc string) {
if got == nil {
t.Fatalf("Expected %s but got nil (%s)", reflect.TypeOf(wanted).Elem(), desc)
}
gotT, wantedT := reflect.TypeOf(got), reflect.TypeOf(wanted).Elem()
if !gotT.Implements(wantedT) {
t.Fatalf("Expected %s but got %s (%s)", wantedT, gotT, desc)
}
}
func assertErrorType(t *testing.T, got interface{}, wanted interface{}, desc string) {
if got == nil {
t.Fatalf("Expected %s but got nil (%s)", reflect.TypeOf(wanted).Elem(), desc)
}
gotT, wantedT := reflect.TypeOf(got), reflect.TypeOf(wanted).Elem()
if gotT != wantedT {
t.Fatalf("Expected %s but got %s (%s)", wantedT, gotT, desc)
}
}
+1
View File
@@ -2,6 +2,7 @@ package nameserver
import (
"github.com/fsouza/go-dockerclient"
. "github.com/zettio/weave/common"
)
func checkError(err error, apiPath string) {
+15 -14
View File
@@ -1,6 +1,7 @@
package nameserver
import (
wt "github.com/zettio/weave/common"
"net"
"testing"
)
@@ -17,17 +18,17 @@ func TestZone(t *testing.T) {
ip, _, _ := net.ParseCIDR(testAddr1)
err := zone.AddRecord(containerID, successTestName, ip)
assertNoErr(t, err)
wt.AssertNoErr(t, err)
// Add a few more records to make the job harder
err = zone.AddRecord("abcdef0123", "adummy.weave.", net.ParseIP("10.0.0.1"))
assertNoErr(t, err)
wt.AssertNoErr(t, err)
err = zone.AddRecord("0123abcdef", "zdummy.weave.", net.ParseIP("10.0.0.2"))
assertNoErr(t, err)
wt.AssertNoErr(t, err)
// Check that the address is now there.
foundIP, err := zone.LookupLocal(successTestName)
assertNoErr(t, err)
wt.AssertNoErr(t, err)
if !foundIP.Equal(ip) {
t.Fatal("Unexpected result for", successTestName, foundIP)
@@ -35,33 +36,33 @@ func TestZone(t *testing.T) {
// See if we can find the address by IP.
foundName, err := zone.ReverseLookupLocal(ip)
assertNoErr(t, err)
wt.AssertNoErr(t, err)
if foundName != successTestName {
t.Fatal("Unexpected result for", ip, foundName)
}
err = zone.AddRecord(containerID, successTestName, ip)
assertErrorType(t, err, (*DuplicateError)(nil), "duplicate add")
wt.AssertErrorType(t, err, (*DuplicateError)(nil), "duplicate add")
err = zone.AddRecord(otherContainerID, successTestName, ip)
// Delete the record for the original container
err = zone.DeleteRecord(containerID, ip)
assertNoErr(t, err)
wt.AssertNoErr(t, err)
_, err = zone.LookupLocal(successTestName)
assertNoErr(t, err)
wt.AssertNoErr(t, err)
err = zone.DeleteRecord(otherContainerID, ip)
assertNoErr(t, err)
wt.AssertNoErr(t, err)
// Check that the address is not there now.
_, err = zone.LookupLocal(successTestName)
assertErrorType(t, err, (*LookupError)(nil), "after deleting record")
wt.AssertErrorType(t, err, (*LookupError)(nil), "after deleting record")
// Delete a record that isn't there
err = zone.DeleteRecord(containerID, net.ParseIP("0.0.0.0"))
assertErrorType(t, err, (*LookupError)(nil), "when deleting record that doesn't exist")
wt.AssertErrorType(t, err, (*LookupError)(nil), "when deleting record that doesn't exist")
}
func TestDeleteFor(t *testing.T) {
@@ -75,13 +76,13 @@ func TestDeleteFor(t *testing.T) {
for _, addr := range []string{addr1, addr2} {
ip, _, _ := net.ParseCIDR(addr)
err := zone.AddRecord(id, name, ip)
assertNoErr(t, err)
wt.AssertNoErr(t, err)
}
_, err := zone.LookupLocal(name)
assertNoErr(t, err)
wt.AssertNoErr(t, err)
err = zone.DeleteRecordsFor(id)
_, err = zone.LookupLocal(name)
assertErrorType(t, err, (*LookupError)(nil), "after deleting records for ident")
wt.AssertErrorType(t, err, (*LookupError)(nil), "after deleting records for ident")
}
+1
View File
@@ -1,3 +1,4 @@
insecure_private_key
assert.sh
.vagrant
.ssh_known_hosts
+1 -1
View File
@@ -4,7 +4,7 @@ set -e
. ./assert.sh
SSH=${SSH:-ssh -l vagrant -i ./insecure_private_key}
SSH=${SSH:-ssh -l vagrant -i ./insecure_private_key -o UserKnownHostsFile=./.ssh_known_hosts -o CheckHostIP=no -o StrictHostKeyChecking=no}
HOST1=${HOST1:-192.168.48.19}
HOST2=${HOST2:-192.168.48.15}
+3
View File
@@ -0,0 +1,3 @@
FROM scratch
MAINTAINER Weaveworks Inc <help@weave.works>
ADD ./bin /bin
+40
View File
@@ -0,0 +1,40 @@
#!/bin/sh
set -e
apt-get -y update
apt-get -y install curl make pkg-config gcc bison flex
BASEDIR=$(dirname $0)
mkdir -p "$BASEDIR"/bin
# ethtool
ETHTOOL=ethtool-3.16
rm -rf $ETHTOOL
curl -s -S https://www.kernel.org/pub/software/network/ethtool/$ETHTOOL.tar.gz | tar xvz
(cd $ETHTOOL; ./configure LDFLAGS=-static; make)
cp $ETHTOOL/ethtool "$BASEDIR"/bin/
# conntrack
PACKAGES="libmnl-1.0.3 libnfnetlink-1.0.1 libnetfilter_cttimeout-1.0.0 libnetfilter_cthelper-1.0.0 libnetfilter_queue-1.0.2 libnetfilter_conntrack-1.0.4"
CONNTRACK=conntrack-tools-1.4.2
rm -rf $PACKAGES $CONNTRACK
fetch() {
curl -s -S http://www.netfilter.org/projects/${1%-*}/files/$1.tar.bz2 | tar xj
}
for PACKAGE in $PACKAGES; do
fetch $PACKAGE
(cd $PACKAGE; ./configure && make LDFLAGS=-static install)
done
fetch $CONNTRACK
(cd $CONNTRACK; ./configure && make LDFLAGS=-static && rm -f src/conntrack && make LDFLAGS=-all-static)
cp $CONNTRACK/src/conntrack "$BASEDIR"/bin/
touch "$BASEDIR"/bin
+49 -18
View File
@@ -5,6 +5,7 @@ SCRIPT_VERSION="(unreleased version)"
usage() {
echo "Usage:"
echo "weave setup"
echo "weave launch [-password <password> | -passwordfile <path>] <peer> ..."
echo "weave launch-dns <cidr>"
echo "weave connect <peer>"
@@ -33,8 +34,20 @@ usage() {
[ $# -gt 0 ] || usage
IMAGE=zettio/weave
DNS_IMAGE=zettio/weavedns
if [ "$SCRIPT_VERSION" = "(unreleased version)" ] ; then
IMAGE_VERSION=latest
else
IMAGE_VERSION=$SCRIPT_VERSION
fi
IMAGE_VERSION=${VERSION:-$IMAGE_VERSION}
BASE_IMAGE=zettio/weave
BASE_DNS_IMAGE=zettio/weavedns
BASE_TOOLS_IMAGE=zettio/weavetools
IMAGE=$BASE_IMAGE:$IMAGE_VERSION
DNS_IMAGE=$BASE_DNS_IMAGE:$IMAGE_VERSION
TOOLS_IMAGE=$BASE_TOOLS_IMAGE:$IMAGE_VERSION
CONTAINER_NAME=weave
DNS_CONTAINER_NAME=weavedns
BRIDGE=weave
@@ -55,11 +68,11 @@ command_exists () {
command -v $1 >/dev/null 2>&1
}
command_exists_or_warn () {
if ! command_exists $1 ; then
echo "Cannot find $1; please install it. Continuing without it." >&2
return 1
fi
run_tool() {
TOOL_NET=$1
TOOL_COMMAND=$2
shift 2
docker run --rm --privileged --net=$TOOL_NET $TOOLS_IMAGE /bin/$TOOL_COMMAND "$@"
}
is_cidr() {
@@ -119,7 +132,7 @@ create_bridge() {
ip link set dev v${CONTAINER_IFNAME}du master $BRIDGE
ip link del dev v${CONTAINER_IFNAME}du
# disable offloading
if command_exists_or_warn ethtool; then ethtool -K $BRIDGE tx off >/dev/null; fi
run_tool host ethtool -K $BRIDGE tx off >/dev/null
# Work around the situation where there are no rules allowing traffic
# across our bridge. E.g. ufw
add_iptables_rule filter FORWARD -i $BRIDGE -o $BRIDGE -j ACCEPT
@@ -205,7 +218,7 @@ connect_container_to_bridge() {
return 1
fi
if { if command_exists_or_warn ethtool; then ethtool -K $GUEST_IFNAME tx off >/dev/null; fi } &&
if run_tool host ethtool -K $GUEST_IFNAME tx off >/dev/null &&
ip link set $LOCAL_IFNAME master $BRIDGE &&
ip link set $LOCAL_IFNAME up &&
ip link set $GUEST_IFNAME netns $NETNS ; then
@@ -224,7 +237,7 @@ launch() {
return 1
fi
connect_container_to_bridge &&
{ if command_exists_or_warn ethtool ; then ip netns exec $NETNS ethtool -K eth0 tx off >/dev/null; fi } &&
run_tool container:$CONTAINER ethtool -K eth0 tx off >/dev/null &&
ip netns exec $NETNS ip link set $CONTAINER_IFNAME up
}
@@ -358,9 +371,16 @@ check_not_running() {
echo "$1 is already running." >&2
exit 1
;;
"true $2:"*)
echo "$1 is already running." >&2
exit 1
;;
"false $2")
docker rm $1 >/dev/null
;;
"false $2:"*)
docker rm $1 >/dev/null
;;
true*)
echo "Found another running container named '$1'. Aborting." >&2
exit 1
@@ -428,8 +448,13 @@ DOCKER_VERSION_MINOR=$(echo "$DOCKER_VERSION" | cut -d. -f 2)
DOCKER_VERSION_PATCH=$(echo "$DOCKER_VERSION" | cut -d. -f 3)
case "$COMMAND" in
setup)
for img in $IMAGE $DNS_IMAGE $TOOLS_IMAGE ; do
docker pull $img
done
;;
launch)
check_not_running $CONTAINER_NAME $IMAGE
check_not_running $CONTAINER_NAME $BASE_IMAGE
create_bridge
# We set the router name to the bridge mac since that is
# stable across re-creations of the containers.
@@ -466,7 +491,7 @@ case "$COMMAND" in
[ $# -gt 0 ] || usage
CIDR=$1
shift 1
check_not_running $DNS_CONTAINER_NAME $DNS_IMAGE
check_not_running $DNS_CONTAINER_NAME $BASE_DNS_IMAGE
create_bridge
docker_bridge_ip
DNS_CONTAINER=$(docker run --privileged -d --name=$DNS_CONTAINER_NAME \
@@ -498,6 +523,16 @@ case "$COMMAND" in
echo weave script $SCRIPT_VERSION
ask_version $CONTAINER_NAME $IMAGE
ask_version $DNS_CONTAINER_NAME $DNS_IMAGE
if ! TOOLS_IMAGE_ID=$(docker inspect --format='{{ .Id }}' $TOOLS_IMAGE 2>/dev/null) ; then
echo "Unable to find $TOOLS_IMAGE image." >&2
else
TOOLS_VERSION=$(docker images --no-trunc | grep $TOOLS_IMAGE_ID | grep -v latest | tr -s ' ' | cut -d ' ' -f 2 | tr "\n" ' ')
if [ -n "$TOOLS_VERSION" ] ; then
echo "weave tools $TOOLS_VERSION"
else
echo "weave tools (unreleased version)"
fi
fi
;;
run)
[ $# -gt 0 ] || usage
@@ -581,9 +616,7 @@ case "$COMMAND" in
echo "Weave is not running." >&2
fi
docker rm -f $CONTAINER_NAME >/dev/null 2>&1 || true
if command_exists_or_warn conntrack; then
conntrack -D -p udp --dport $PORT >/dev/null 2>&1 || true
fi
run_tool host conntrack -D -p udp --dport $PORT >/dev/null 2>&1 || true
;;
stop-dns)
[ $# -eq 0 ] || usage
@@ -598,9 +631,7 @@ case "$COMMAND" in
docker kill $DNS_CONTAINER_NAME >/dev/null 2>&1 || true
docker rm -f $CONTAINER_NAME >/dev/null 2>&1 || true
docker rm -f $DNS_CONTAINER_NAME >/dev/null 2>&1 || true
if command_exists_or_warn conntrack; then
conntrack -D -p udp --dport $PORT >/dev/null 2>&1 || true
fi
run_tool host conntrack -D -p udp --dport $PORT >/dev/null 2>&1 || true
destroy_bridge
for LOCAL_IFNAME in $(ip link show | grep v${CONTAINER_IFNAME}pl | cut -d ' ' -f 2 | tr -d ':') ; do
ip link del $LOCAL_IFNAME
+7 -11
View File
@@ -3,10 +3,10 @@ package main
import (
"flag"
"fmt"
. "github.com/zettio/weave/common"
weavedns "github.com/zettio/weave/nameserver"
weavenet "github.com/zettio/weave/net"
"io"
"io/ioutil"
"net"
"os"
)
@@ -40,35 +40,31 @@ func main() {
os.Exit(0)
}
debugOut := ioutil.Discard
if debug {
debugOut = os.Stderr
}
weavedns.InitLogging(debugOut, os.Stdout, os.Stdout, os.Stderr)
InitDefaultLogging(debug)
var zone = new(weavedns.ZoneDb)
if watch {
err := weavedns.StartUpdater(apiPath, zone)
if err != nil {
weavedns.Error.Fatal("Unable to start watcher", err)
Error.Fatal("Unable to start watcher", err)
}
}
var iface *net.Interface = nil
if ifaceName != "" {
var err error
weavedns.Info.Println("Waiting for interface", ifaceName, "to come up")
Info.Println("Waiting for interface", ifaceName, "to come up")
iface, err = weavenet.EnsureInterface(ifaceName, wait)
if err != nil {
weavedns.Error.Fatal(err)
Error.Fatal(err)
} else {
weavedns.Info.Println("Interface", ifaceName, "is up")
Info.Println("Interface", ifaceName, "is up")
}
}
err := weavedns.StartServer(zone, iface, dnsPort, httpPort, wait)
if err != nil {
weavedns.Error.Fatal("Failed to start server", err)
Error.Fatal("Failed to start server", err)
}
}
-1
View File
@@ -1 +0,0 @@
weaver