The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/3816

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===

From 9cb022f80613b5840a45ca910fab7f9129972d3c Mon Sep 17 00:00:00 2001
From: Alberto Donato <alberto.don...@canonical.com>
Date: Mon, 18 Sep 2017 09:50:14 +0200
Subject: [PATCH 1/2] network: only add --quiet-* options to dnsmasq if version
 supports them

Signed-off-by: Alberto Donato <alberto.don...@canonical.com>
---
 lxd/networks.go       | 10 +++++++++-
 lxd/networks_utils.go | 10 ++++++++++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/lxd/networks.go b/lxd/networks.go
index 939869556..007706cb7 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -778,7 +778,15 @@ func (n *network) Start() error {
                fmt.Sprintf("--interface=%s", n.name)}
 
        if !debug {
-               dnsmasqCmd = append(dnsmasqCmd, []string{"--quiet-dhcp", 
"--quiet-dhcp6", "--quiet-ra"}...)
+               // --quiet options are only supported on >2.67
+               v, err := networkGetDnsmasqVersion()
+               if err != nil {
+                       return err
+               }
+               minVer, _ := version.NewDottedVersion("2.67")
+               if v.Compare(minVer) > 0 {
+                       dnsmasqCmd = append(dnsmasqCmd, 
[]string{"--quiet-dhcp", "--quiet-dhcp6", "--quiet-ra"}...)
+               }
        }
 
        // Configure IPv4
diff --git a/lxd/networks_utils.go b/lxd/networks_utils.go
index 37ab63d83..5e6594231 100644
--- a/lxd/networks_utils.go
+++ b/lxd/networks_utils.go
@@ -24,6 +24,7 @@ import (
        "github.com/lxc/lxd/lxd/state"
        "github.com/lxc/lxd/shared"
        "github.com/lxc/lxd/shared/logger"
+       "github.com/lxc/lxd/shared/version"
 )
 
 var networkStaticLock sync.Mutex
@@ -727,6 +728,15 @@ func networkKillDnsmasq(name string, reload bool) error {
        return nil
 }
 
+func networkGetDnsmasqVersion() (*version.DottedVersion, error) {
+       output, err := shared.TryRunCommand("dnsmasq", "--version")
+       if err != nil {
+               return nil, fmt.Errorf("Failed to check dnsmasq version")
+       }
+       lines := strings.Split(output, " ")
+       return version.NewDottedVersion(lines[2])
+}
+
 func networkUpdateStatic(s *state.State, networkName string) error {
        // We don't want to race with ourselves here
        networkStaticLock.Lock()

From f71426436dda81e7c811b88419ab970b967e5784 Mon Sep 17 00:00:00 2001
From: Alberto Donato <alberto.don...@canonical.com>
Date: Tue, 19 Sep 2017 09:32:25 +0200
Subject: [PATCH 2/2] shared: add helpers to parse/compare versions

Signed-off-by: Alberto Donato <alberto.don...@canonical.com>
---
 shared/version/version.go      | 91 +++++++++++++++++++++++++++++++++++++++++
 shared/version/version_test.go | 93 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 184 insertions(+)
 create mode 100644 shared/version/version.go
 create mode 100644 shared/version/version_test.go

diff --git a/shared/version/version.go b/shared/version/version.go
new file mode 100644
index 000000000..51ac6715f
--- /dev/null
+++ b/shared/version/version.go
@@ -0,0 +1,91 @@
+package version
+
+import (
+       "fmt"
+       "regexp"
+       "strconv"
+       "strings"
+)
+
+// DottedVersion holds element of a version in the maj.min[.patch] format.
+type DottedVersion struct {
+       Major int
+       Minor int
+       Patch int
+}
+
+// NewDottedVersion returns a new Version.
+func NewDottedVersion(versionString string) (*DottedVersion, error) {
+       formatError := fmt.Errorf("Invalid version format: %s", versionString)
+       split := strings.Split(versionString, ".")
+       if len(split) < 2 {
+               return nil, formatError
+       }
+
+       maj, err := strconv.Atoi(split[0])
+       if err != nil {
+               return nil, formatError
+       }
+
+       min, err := strconv.Atoi(split[1])
+       if err != nil {
+               return nil, formatError
+       }
+
+       patch := -1
+       if len(split) == 3 {
+               patch, err = strconv.Atoi(split[2])
+               if err != nil {
+                       return nil, formatError
+               }
+       }
+
+       return &DottedVersion{
+               Major: maj,
+               Minor: min,
+               Patch: patch,
+       }, nil
+}
+
+// Parse parses a string starting with a dotted version and returns it.
+func Parse(s string) (*DottedVersion, error) {
+       r, _ := regexp.Compile(`^([0-9]+.[0-9]+(.[0-9]+))?.*`)
+       matches := r.FindAllStringSubmatch(s, -1)
+       if len(matches[0]) < 2 {
+               return nil, fmt.Errorf("Can't parse a version")
+       }
+       return NewDottedVersion(matches[0][1])
+}
+
+// String returns version as a string
+func (v *DottedVersion) String() string {
+       version := fmt.Sprintf("%d.%d", v.Major, v.Minor)
+       if v.Patch != -1 {
+               version += fmt.Sprintf(".%d", v.Patch)
+       }
+       return version
+}
+
+// Compare returns result of comparison between two versions
+func (v *DottedVersion) Compare(other *DottedVersion) int {
+       result := compareInts(v.Major, other.Major)
+       if result != 0 {
+               return result
+       }
+       result = compareInts(v.Minor, other.Minor)
+       if result != 0 {
+               return result
+       }
+       return compareInts(v.Patch, other.Patch)
+}
+
+func compareInts(i1 int, i2 int) int {
+       switch {
+       case i1 < i2:
+               return -1
+       case i1 > i2:
+               return 1
+       default:
+               return 0
+       }
+}
diff --git a/shared/version/version_test.go b/shared/version/version_test.go
new file mode 100644
index 000000000..8c6c2c24d
--- /dev/null
+++ b/shared/version/version_test.go
@@ -0,0 +1,93 @@
+package version
+
+import (
+       "testing"
+
+       "github.com/stretchr/testify/suite"
+)
+
+type versionTestSuite struct {
+       suite.Suite
+}
+
+func TestVersionTestSuite(t *testing.T) {
+       suite.Run(t, new(versionTestSuite))
+}
+
+func (s *versionTestSuite) TestNewVersion() {
+       v, err := NewDottedVersion("1.2.3")
+       s.Nil(err)
+       s.Equal(1, v.Major)
+       s.Equal(2, v.Minor)
+       s.Equal(3, v.Patch)
+}
+
+func (s *versionTestSuite) TestNewVersionNoPatch() {
+       v, err := NewDottedVersion("1.2")
+       s.Nil(err)
+       s.Equal(-1, v.Patch)
+}
+
+func (s *versionTestSuite) TestNewVersionInvalid() {
+       v, err := NewDottedVersion("1.nope")
+       s.Nil(v)
+       s.NotNil(err)
+}
+
+func (s *versionTestSuite) TestParseDashes() {
+       v, err := Parse("1.2.3-asdf")
+       s.Nil(err)
+       s.Equal(1, v.Major)
+       s.Equal(2, v.Minor)
+       s.Equal(3, v.Patch)
+}
+
+func (s *versionTestSuite) TestParseParentheses() {
+       v, err := Parse("1.2.3(beta1)")
+       s.Nil(err)
+       s.Equal(1, v.Major)
+       s.Equal(2, v.Minor)
+       s.Equal(3, v.Patch)
+}
+
+func (s *versionTestSuite) TestParseFail() {
+       v, err := Parse("asdfaf")
+       s.Nil(v)
+       s.NotNil(err)
+}
+
+func (s *versionTestSuite) TestString() {
+       v, _ := NewDottedVersion("1.2.3")
+       s.Equal("1.2.3", v.String())
+}
+
+func (s *versionTestSuite) TestCompareEqual() {
+       v1, _ := NewDottedVersion("1.2.3")
+       v2, _ := NewDottedVersion("1.2.3")
+       s.Equal(0, v1.Compare(v2))
+       s.Equal(0, v2.Compare(v1))
+       v3, _ := NewDottedVersion("1.2")
+       v4, _ := NewDottedVersion("1.2")
+       s.Equal(0, v3.Compare(v4))
+       s.Equal(0, v4.Compare(v3))
+}
+
+func (s *versionTestSuite) TestCompareOlder() {
+       v1, _ := NewDottedVersion("1.2.3")
+       v2, _ := NewDottedVersion("1.2.4")
+       v3, _ := NewDottedVersion("1.3")
+       v4, _ := NewDottedVersion("2.2.3")
+       s.Equal(-1, v1.Compare(v2))
+       s.Equal(-1, v1.Compare(v3))
+       s.Equal(-1, v1.Compare(v4))
+}
+
+func (s *versionTestSuite) TestCompareNewer() {
+       v1, _ := NewDottedVersion("1.2.3")
+       v2, _ := NewDottedVersion("1.2.2")
+       v3, _ := NewDottedVersion("1.1")
+       v4, _ := NewDottedVersion("0.3.3")
+       s.Equal(1, v1.Compare(v2))
+       s.Equal(1, v1.Compare(v3))
+       s.Equal(1, v1.Compare(v4))
+}
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to