mirror of
https://github.com/moby/moby.git
synced 2025-07-30 18:23:29 +03:00
Make plugin emit strongly typed, consumable events
Enables other subsystems to watch actions for a plugin(s). This will be used specifically for implementing plugins on swarm where a swarm controller needs to watch the state of a plugin. Signed-off-by: Brian Goff <cpuguy83@gmail.com>
This commit is contained in:
@ -4,15 +4,19 @@ package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"path"
|
||||
"strconv"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"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/daemon"
|
||||
"github.com/docker/docker/integration-cli/fixtures/plugin"
|
||||
"github.com/go-check/check"
|
||||
"golang.org/x/net/context"
|
||||
)
|
||||
|
||||
func setPortConfig(portConfig []swarm.PortConfig) daemon.ServiceConstructor {
|
||||
@ -596,3 +600,77 @@ func (s *DockerSwarmSuite) TestAPISwarmServicesStateReporting(c *check.C) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Test plugins deployed via swarm services
|
||||
func (s *DockerSwarmSuite) TestAPISwarmServicesPlugin(c *check.C) {
|
||||
testRequires(c, DaemonIsLinux, IsAmd64)
|
||||
reg := setupRegistry(c, false, "", "")
|
||||
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)
|
||||
}
|
||||
|
Reference in New Issue
Block a user