mirror of
https://github.com/kemko/nomad.git
synced 2026-01-03 17:05:43 +03:00
Merge pull request #2797 from hashicorp/f-2785-docker-bridge-ip
Add driver.docker.bridge_ip node attribute
This commit is contained in:
@@ -31,6 +31,7 @@ IMPROVEMENTS:
|
||||
* driver/docker: Allow setting seccomp profiles [GH-2658]
|
||||
* driver/docker: Support Docker credential helpers [GH-2651]
|
||||
* driver/docker: Auth failures can optionally be ignored [GH-2786]
|
||||
* driver/docker: Add `driver.docker.bridge_ip` node attribute [GH-2797]
|
||||
* driver/docker: Allow setting container IP with user defined networks
|
||||
[GH-2535]
|
||||
* driver/rkt: Support `no_overlay` [GH-2702]
|
||||
|
||||
@@ -333,6 +333,24 @@ func (d *DockerDriver) Fingerprint(cfg *config.Config, node *structs.Node) (bool
|
||||
node.Attributes["driver."+dockerVolumesConfigOption] = "1"
|
||||
}
|
||||
|
||||
// Detect bridge IP address - #2785
|
||||
if nets, err := client.ListNetworks(); err != nil {
|
||||
d.logger.Printf("[WARN] driver.docker: error discovering bridge IP: %v", err)
|
||||
} else {
|
||||
for _, n := range nets {
|
||||
if n.Name != "bridge" {
|
||||
continue
|
||||
}
|
||||
|
||||
if len(n.IPAM.Config) == 0 {
|
||||
d.logger.Printf("[WARN] driver.docker: no IPAM config for bridge network")
|
||||
break
|
||||
}
|
||||
|
||||
node.Attributes["driver.docker.bridge_ip"] = n.IPAM.Config[0].Gateway
|
||||
}
|
||||
}
|
||||
|
||||
d.fingerprintSuccess = helper.BoolToPtr(true)
|
||||
return true, nil
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import (
|
||||
"time"
|
||||
|
||||
docker "github.com/fsouza/go-dockerclient"
|
||||
sockaddr "github.com/hashicorp/go-sockaddr"
|
||||
"github.com/hashicorp/nomad/client/allocdir"
|
||||
"github.com/hashicorp/nomad/client/config"
|
||||
"github.com/hashicorp/nomad/client/driver/env"
|
||||
@@ -177,6 +178,40 @@ func TestDockerDriver_Fingerprint(t *testing.T) {
|
||||
t.Logf("Found docker version %s", node.Attributes["driver.docker.version"])
|
||||
}
|
||||
|
||||
// TestDockerDriver_Fingerprint_Bridge asserts that if Docker is running we set
|
||||
// the bridge network's IP as a node attribute. See #2785
|
||||
func TestDockerDriver_Fingerprint_Bridge(t *testing.T) {
|
||||
if !testutil.DockerIsConnected(t) {
|
||||
t.Skip("requires Docker")
|
||||
}
|
||||
|
||||
// This seems fragile, so we might need to reconsider this test if it
|
||||
// proves flaky
|
||||
expectedAddr, err := sockaddr.GetInterfaceIP("docker0")
|
||||
if err != nil {
|
||||
t.Fatalf("unable to get ip for docker0: %v", err)
|
||||
}
|
||||
if expectedAddr == "" {
|
||||
t.Fatalf("unable to get ip for docker bridge")
|
||||
}
|
||||
|
||||
conf := testConfig()
|
||||
conf.Node = mock.Node()
|
||||
dd := NewDockerDriver(NewDriverContext("", "", conf, conf.Node, testLogger(), nil))
|
||||
ok, err := dd.Fingerprint(conf, conf.Node)
|
||||
if err != nil {
|
||||
t.Fatalf("error fingerprinting docker: %v", err)
|
||||
}
|
||||
if !ok {
|
||||
t.Fatalf("expected Docker to be enabled but false was returned")
|
||||
}
|
||||
|
||||
if found := conf.Node.Attributes["driver.docker.bridge_ip"]; found != expectedAddr {
|
||||
t.Fatalf("expected bridge ip %q but found: %q", expectedAddr, found)
|
||||
}
|
||||
t.Logf("docker bridge ip: %q", conf.Node.Attributes["driver.docker.bridge_ip"])
|
||||
}
|
||||
|
||||
func TestDockerDriver_StartOpen_Wait(t *testing.T) {
|
||||
if !testutil.DockerIsConnected(t) {
|
||||
t.SkipNow()
|
||||
|
||||
@@ -529,6 +529,8 @@ The `docker` driver will set the following client attributes:
|
||||
|
||||
* `driver.docker` - This will be set to "1", indicating the driver is
|
||||
available.
|
||||
* `driver.docker.bridge_ip` - The IP of the Docker bridge network if one
|
||||
exists.
|
||||
* `driver.docker.version` - This will be set to version of the docker server.
|
||||
|
||||
Here is an example of using these properties in a job file:
|
||||
|
||||
Reference in New Issue
Block a user