fn: docker version check2 (#744)

1) now required docker version is 17.06
2) enable circle ci latest docker install
3) docker driver & agent check minimum version before start
This commit is contained in:
Tolga Ceylan
2018-02-06 16:16:40 -08:00
committed by GitHub
parent 640a47fe55
commit ebc6657071
16 changed files with 1028 additions and 18 deletions

View File

@@ -12,6 +12,7 @@ import (
"strings"
"time"
"github.com/coreos/go-semver/semver"
"github.com/fnproject/fn/api/agent/drivers"
"github.com/fnproject/fn/api/common"
"github.com/fnproject/fn/api/models"
@@ -58,12 +59,45 @@ func NewDocker(conf drivers.Config) *DockerDriver {
logrus.WithError(err).Fatal("couldn't resolve hostname")
}
return &DockerDriver{
driver := &DockerDriver{
conf: conf,
docker: newClient(),
hostname: hostname,
auths: registryFromEnv(),
}
if conf.ServerVersion != "" {
err = checkDockerVersion(driver, conf.ServerVersion)
if err != nil {
logrus.WithError(err).Fatal("docker version error")
}
}
return driver
}
func checkDockerVersion(driver *DockerDriver, expected string) error {
info, err := driver.docker.Info(context.Background())
if err != nil {
return err
}
actual, err := semver.NewVersion(info.ServerVersion)
if err != nil {
return err
}
wanted, err := semver.NewVersion(expected)
if err != nil {
return err
}
if actual.Compare(*wanted) < 0 {
return fmt.Errorf("docker version is too old. Required: %s Found: %s", expected, info.ServerVersion)
}
return nil
}
func registryFromEnv() map[string]docker.AuthConfiguration {

View File

@@ -38,6 +38,7 @@ type dockerClient interface {
InspectImage(ctx context.Context, name string) (*docker.Image, error)
InspectContainerWithContext(container string, ctx context.Context) (*docker.Container, error)
Stats(opts docker.StatsOptions) error
Info(ctx context.Context) (*docker.DockerInfo, error)
}
// TODO: switch to github.com/docker/engine-api
@@ -169,6 +170,19 @@ func filterNoSuchContainer(ctx context.Context, err error) error {
return err
}
func (d *dockerWrap) Info(ctx context.Context) (info *docker.DockerInfo, err error) {
span, ctx := opentracing.StartSpanFromContext(ctx, "docker_server_version")
defer span.Finish()
ctx, cancel := context.WithTimeout(ctx, retryTimeout)
defer cancel()
err = d.retry(ctx, func() error {
info, err = d.docker.Info()
return err
})
return info, err
}
func (d *dockerWrap) AttachToContainerNonBlocking(ctx context.Context, opts docker.AttachToContainerOptions) (w docker.CloseWaiter, err error) {
span, ctx := opentracing.StartSpanFromContext(ctx, "docker_attach_container")
defer span.Finish()

View File

@@ -63,6 +63,26 @@ func TestRunnerDocker(t *testing.T) {
}
}
func TestRunnerDockerVersion(t *testing.T) {
dkr := NewDocker(drivers.Config{
ServerVersion: "0.0.0",
})
if dkr == nil {
t.Fatal("should not be nil")
}
err := checkDockerVersion(dkr, "1.0.0")
if err != nil {
t.Fatal(err)
}
err = checkDockerVersion(dkr, "9999.0.0")
if err == nil {
t.Fatal("should have failed")
}
}
func TestRunnerDockerStdin(t *testing.T) {
dkr := NewDocker(drivers.Config{})
ctx := context.Background()