|
@@ -4,19 +4,15 @@ package main
|
|
|
|
|
|
import (
|
|
import (
|
|
"fmt"
|
|
"fmt"
|
|
- "path"
|
|
|
|
"strconv"
|
|
"strconv"
|
|
"strings"
|
|
"strings"
|
|
"time"
|
|
"time"
|
|
|
|
|
|
"github.com/docker/docker/api/types"
|
|
"github.com/docker/docker/api/types"
|
|
"github.com/docker/docker/api/types/swarm"
|
|
"github.com/docker/docker/api/types/swarm"
|
|
- "github.com/docker/docker/api/types/swarm/runtime"
|
|
|
|
"github.com/docker/docker/integration-cli/checker"
|
|
"github.com/docker/docker/integration-cli/checker"
|
|
"github.com/docker/docker/integration-cli/daemon"
|
|
"github.com/docker/docker/integration-cli/daemon"
|
|
testdaemon "github.com/docker/docker/internal/test/daemon"
|
|
testdaemon "github.com/docker/docker/internal/test/daemon"
|
|
- "github.com/docker/docker/internal/test/fixtures/plugin"
|
|
|
|
- "github.com/docker/docker/internal/test/registry"
|
|
|
|
"github.com/go-check/check"
|
|
"github.com/go-check/check"
|
|
"golang.org/x/net/context"
|
|
"golang.org/x/net/context"
|
|
"golang.org/x/sys/unix"
|
|
"golang.org/x/sys/unix"
|
|
@@ -611,78 +607,3 @@ func (s *DockerSwarmSuite) TestAPISwarmServicesStateReporting(c *check.C) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
-// Test plugins deployed via swarm services
|
|
|
|
-func (s *DockerSwarmSuite) TestAPISwarmServicesPlugin(c *check.C) {
|
|
|
|
- testRequires(c, ExperimentalDaemon, DaemonIsLinux, IsAmd64)
|
|
|
|
-
|
|
|
|
- reg := registry.NewV2(c)
|
|
|
|
- defer reg.Close()
|
|
|
|
-
|
|
|
|
- repo := path.Join(privateRegistryURL, "swarm", "test:v1")
|
|
|
|
- repo2 := path.Join(privateRegistryURL, "swarm", "test:v2")
|
|
|
|
- name := "test"
|
|
|
|
-
|
|
|
|
- err := plugin.CreateInRegistry(context.Background(), repo, nil)
|
|
|
|
- c.Assert(err, checker.IsNil, check.Commentf("failed to create plugin"))
|
|
|
|
- err = plugin.CreateInRegistry(context.Background(), repo2, nil)
|
|
|
|
- c.Assert(err, checker.IsNil, check.Commentf("failed to create plugin"))
|
|
|
|
-
|
|
|
|
- d1 := s.AddDaemon(c, true, true)
|
|
|
|
- d2 := s.AddDaemon(c, true, true)
|
|
|
|
- d3 := s.AddDaemon(c, true, false)
|
|
|
|
-
|
|
|
|
- makePlugin := func(repo, name string, constraints []string) func(*swarm.Service) {
|
|
|
|
- return func(s *swarm.Service) {
|
|
|
|
- s.Spec.TaskTemplate.Runtime = "plugin"
|
|
|
|
- s.Spec.TaskTemplate.PluginSpec = &runtime.PluginSpec{
|
|
|
|
- Name: name,
|
|
|
|
- Remote: repo,
|
|
|
|
- }
|
|
|
|
- if constraints != nil {
|
|
|
|
- s.Spec.TaskTemplate.Placement = &swarm.Placement{
|
|
|
|
- Constraints: constraints,
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- id := d1.CreateService(c, makePlugin(repo, name, nil))
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d1.CheckPluginRunning(name), checker.True)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d2.CheckPluginRunning(name), checker.True)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d3.CheckPluginRunning(name), checker.True)
|
|
|
|
-
|
|
|
|
- service := d1.GetService(c, id)
|
|
|
|
- d1.UpdateService(c, service, makePlugin(repo2, name, nil))
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d1.CheckPluginImage(name), checker.Equals, repo2)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d2.CheckPluginImage(name), checker.Equals, repo2)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d3.CheckPluginImage(name), checker.Equals, repo2)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d1.CheckPluginRunning(name), checker.True)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d2.CheckPluginRunning(name), checker.True)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d3.CheckPluginRunning(name), checker.True)
|
|
|
|
-
|
|
|
|
- d1.RemoveService(c, id)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d1.CheckPluginRunning(name), checker.False)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d2.CheckPluginRunning(name), checker.False)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d3.CheckPluginRunning(name), checker.False)
|
|
|
|
-
|
|
|
|
- // constrain to managers only
|
|
|
|
- id = d1.CreateService(c, makePlugin(repo, name, []string{"node.role==manager"}))
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d1.CheckPluginRunning(name), checker.True)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d2.CheckPluginRunning(name), checker.True)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d3.CheckPluginRunning(name), checker.False) // Not a manager, not running it
|
|
|
|
- d1.RemoveService(c, id)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d1.CheckPluginRunning(name), checker.False)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d2.CheckPluginRunning(name), checker.False)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d3.CheckPluginRunning(name), checker.False)
|
|
|
|
-
|
|
|
|
- // with no name
|
|
|
|
- id = d1.CreateService(c, makePlugin(repo, "", nil))
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d1.CheckPluginRunning(repo), checker.True)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d2.CheckPluginRunning(repo), checker.True)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d3.CheckPluginRunning(repo), checker.True)
|
|
|
|
- d1.RemoveService(c, id)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d1.CheckPluginRunning(repo), checker.False)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d2.CheckPluginRunning(repo), checker.False)
|
|
|
|
- waitAndAssert(c, defaultReconciliationTimeout, d3.CheckPluginRunning(repo), checker.False)
|
|
|
|
-}
|
|
|