Signed-off-by: Dong Chen <dongluo.chen@docker.com>
| ... | ... |
@@ -2002,6 +2002,35 @@ func (s *DockerSwarmSuite) TestSwarmJoinLeave(c *check.C) {
|
| 2002 | 2002 |
} |
| 2003 | 2003 |
} |
| 2004 | 2004 |
|
| 2005 |
+const defaultRetryCount = 10 |
|
| 2006 |
+ |
|
| 2007 |
+func waitForEvent(c *check.C, d *daemon.Swarm, since string, filter string, event string, retry int) string {
|
|
| 2008 |
+ if retry < 1 {
|
|
| 2009 |
+ c.Fatalf("retry count %d is invalid. It should be no less than 1", retry)
|
|
| 2010 |
+ return "" |
|
| 2011 |
+ } |
|
| 2012 |
+ var out string |
|
| 2013 |
+ for i := 0; i < retry; i++ {
|
|
| 2014 |
+ until := daemonUnixTime(c) |
|
| 2015 |
+ var err error |
|
| 2016 |
+ if len(filter) > 0 {
|
|
| 2017 |
+ out, err = d.Cmd("events", "--since", since, "--until", until, filter)
|
|
| 2018 |
+ } else {
|
|
| 2019 |
+ out, err = d.Cmd("events", "--since", since, "--until", until)
|
|
| 2020 |
+ } |
|
| 2021 |
+ c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2022 |
+ if strings.Contains(out, event) {
|
|
| 2023 |
+ return strings.TrimSpace(out) |
|
| 2024 |
+ } |
|
| 2025 |
+ // no need to sleep after last retry |
|
| 2026 |
+ if i < retry-1 {
|
|
| 2027 |
+ time.Sleep(200 * time.Millisecond) |
|
| 2028 |
+ } |
|
| 2029 |
+ } |
|
| 2030 |
+ c.Fatalf("docker events output '%s' doesn't contain event '%s'", out, event)
|
|
| 2031 |
+ return "" |
|
| 2032 |
+} |
|
| 2033 |
+ |
|
| 2005 | 2034 |
func (s *DockerSwarmSuite) TestSwarmClusterEventsSource(c *check.C) {
|
| 2006 | 2035 |
d1 := s.AddDaemon(c, true, true) |
| 2007 | 2036 |
d2 := s.AddDaemon(c, true, true) |
| ... | ... |
@@ -2013,21 +2042,13 @@ func (s *DockerSwarmSuite) TestSwarmClusterEventsSource(c *check.C) {
|
| 2013 | 2013 |
networkID := strings.TrimSpace(out) |
| 2014 | 2014 |
c.Assert(networkID, checker.Not(checker.Equals), "") |
| 2015 | 2015 |
|
| 2016 |
- until := daemonUnixTime(c) |
|
| 2017 |
- // d1 is a manager |
|
| 2018 |
- out, err = d1.Cmd("events", "--since=0", "--until", until, "-f scope=swarm")
|
|
| 2019 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2020 |
- c.Assert(strings.TrimSpace(out), checker.Contains, "network create "+networkID) |
|
| 2021 |
- |
|
| 2022 |
- // d2 is a manager |
|
| 2023 |
- out, err = d2.Cmd("events", "--since=0", "--until", until, "-f scope=swarm")
|
|
| 2024 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2025 |
- c.Assert(strings.TrimSpace(out), checker.Contains, "network create "+networkID) |
|
| 2016 |
+ // d1, d2 are managers that can get swarm events |
|
| 2017 |
+ waitForEvent(c, d1, "0", "-f scope=swarm", "network create "+networkID, defaultRetryCount) |
|
| 2018 |
+ waitForEvent(c, d2, "0", "-f scope=swarm", "network create "+networkID, defaultRetryCount) |
|
| 2026 | 2019 |
|
| 2027 | 2020 |
// d3 is a worker, not able to get cluster events |
| 2028 |
- out, err = d3.Cmd("events", "--since=0", "--until", until, "-f scope=swarm")
|
|
| 2029 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2030 |
- c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), "network create ") |
|
| 2021 |
+ out = waitForEvent(c, d3, "0", "-f scope=swarm", "", 1) |
|
| 2022 |
+ c.Assert(out, checker.Not(checker.Contains), "network create ") |
|
| 2031 | 2023 |
} |
| 2032 | 2024 |
|
| 2033 | 2025 |
func (s *DockerSwarmSuite) TestSwarmClusterEventsScope(c *check.C) {
|
| ... | ... |
@@ -2038,24 +2059,17 @@ func (s *DockerSwarmSuite) TestSwarmClusterEventsScope(c *check.C) {
|
| 2038 | 2038 |
c.Assert(err, checker.IsNil, check.Commentf(out)) |
| 2039 | 2039 |
serviceID := strings.Split(out, "\n")[0] |
| 2040 | 2040 |
|
| 2041 |
- until := daemonUnixTime(c) |
|
| 2042 | 2041 |
// scope swarm filters cluster events |
| 2043 |
- out, err = d.Cmd("events", "--since=0", "--until", until, "-f scope=swarm")
|
|
| 2044 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2045 |
- c.Assert(strings.TrimSpace(out), checker.Contains, "service create "+serviceID) |
|
| 2046 |
- c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), "container create ") |
|
| 2042 |
+ out = waitForEvent(c, d, "0", "-f scope=swarm", "service create "+serviceID, defaultRetryCount) |
|
| 2043 |
+ c.Assert(out, checker.Not(checker.Contains), "container create ") |
|
| 2047 | 2044 |
|
| 2048 |
- // without scope all events are returned |
|
| 2049 |
- out, err = d.Cmd("events", "--since=0", "--until", until)
|
|
| 2050 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2051 |
- c.Assert(strings.TrimSpace(out), checker.Contains, "service create "+serviceID) |
|
| 2052 |
- c.Assert(strings.TrimSpace(out), checker.Contains, "container create ") |
|
| 2045 |
+ // all events are returned if scope is not specified |
|
| 2046 |
+ waitForEvent(c, d, "0", "", "service create "+serviceID, 1) |
|
| 2047 |
+ waitForEvent(c, d, "0", "", "container create ", defaultRetryCount) |
|
| 2053 | 2048 |
|
| 2054 |
- // scope local only show non-cluster events |
|
| 2055 |
- out, err = d.Cmd("events", "--since=0", "--until", until, "-f scope=local")
|
|
| 2056 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2057 |
- c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), "service create ") |
|
| 2058 |
- c.Assert(strings.TrimSpace(out), checker.Contains, "container create ") |
|
| 2049 |
+ // scope local only shows non-cluster events |
|
| 2050 |
+ out = waitForEvent(c, d, "0", "-f scope=local", "container create ", 1) |
|
| 2051 |
+ c.Assert(out, checker.Not(checker.Contains), "service create ") |
|
| 2059 | 2052 |
} |
| 2060 | 2053 |
|
| 2061 | 2054 |
func (s *DockerSwarmSuite) TestSwarmClusterEventsType(c *check.C) {
|
| ... | ... |
@@ -2072,17 +2086,12 @@ func (s *DockerSwarmSuite) TestSwarmClusterEventsType(c *check.C) {
|
| 2072 | 2072 |
networkID := strings.TrimSpace(out) |
| 2073 | 2073 |
c.Assert(networkID, checker.Not(checker.Equals), "") |
| 2074 | 2074 |
|
| 2075 |
- until := daemonUnixTime(c) |
|
| 2076 | 2075 |
// filter by service |
| 2077 |
- out, err = d.Cmd("events", "--since=0", "--until", until, "-f type=service")
|
|
| 2078 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2079 |
- c.Assert(out, checker.Contains, "service create "+serviceID) |
|
| 2076 |
+ out = waitForEvent(c, d, "0", "-f type=service", "service create "+serviceID, defaultRetryCount) |
|
| 2080 | 2077 |
c.Assert(out, checker.Not(checker.Contains), "network create") |
| 2081 | 2078 |
|
| 2082 | 2079 |
// filter by network |
| 2083 |
- out, err = d.Cmd("events", "--since=0", "--until", until, "-f type=network")
|
|
| 2084 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2085 |
- c.Assert(out, checker.Contains, "network create "+networkID) |
|
| 2080 |
+ out = waitForEvent(c, d, "0", "-f type=network", "network create "+networkID, defaultRetryCount) |
|
| 2086 | 2081 |
c.Assert(out, checker.Not(checker.Contains), "service create") |
| 2087 | 2082 |
} |
| 2088 | 2083 |
|
| ... | ... |
@@ -2094,40 +2103,36 @@ func (s *DockerSwarmSuite) TestSwarmClusterEventsService(c *check.C) {
|
| 2094 | 2094 |
c.Assert(err, checker.IsNil, check.Commentf(out)) |
| 2095 | 2095 |
serviceID := strings.Split(out, "\n")[0] |
| 2096 | 2096 |
|
| 2097 |
- t1 := daemonUnixTime(c) |
|
| 2098 | 2097 |
// validate service create event |
| 2099 |
- out, err = d.Cmd("events", "--since=0", "--until", t1, "-f scope=swarm")
|
|
| 2100 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2101 |
- c.Assert(out, checker.Contains, "service create "+serviceID) |
|
| 2098 |
+ waitForEvent(c, d, "0", "-f scope=swarm", "service create "+serviceID, defaultRetryCount) |
|
| 2102 | 2099 |
|
| 2100 |
+ t1 := daemonUnixTime(c) |
|
| 2103 | 2101 |
out, err = d.Cmd("service", "update", "--force", "--detach=false", "test")
|
| 2104 | 2102 |
c.Assert(err, checker.IsNil, check.Commentf(out)) |
| 2105 | 2103 |
|
| 2106 |
- t2 := daemonUnixTime(c) |
|
| 2107 |
- out, err = d.Cmd("events", "--since", t1, "--until", t2, "-f scope=swarm")
|
|
| 2108 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2109 |
- c.Assert(out, checker.Contains, "service update "+serviceID) |
|
| 2104 |
+ // wait for service update start |
|
| 2105 |
+ out = waitForEvent(c, d, t1, "-f scope=swarm", "service update "+serviceID, defaultRetryCount) |
|
| 2110 | 2106 |
c.Assert(out, checker.Contains, "updatestate.new=updating") |
| 2107 |
+ |
|
| 2108 |
+ // allow service update complete. This is a service with 1 instance |
|
| 2109 |
+ time.Sleep(400 * time.Millisecond) |
|
| 2110 |
+ out = waitForEvent(c, d, t1, "-f scope=swarm", "service update "+serviceID, defaultRetryCount) |
|
| 2111 | 2111 |
c.Assert(out, checker.Contains, "updatestate.new=completed, updatestate.old=updating") |
| 2112 | 2112 |
|
| 2113 | 2113 |
// scale service |
| 2114 |
+ t2 := daemonUnixTime(c) |
|
| 2114 | 2115 |
out, err = d.Cmd("service", "scale", "test=3")
|
| 2115 | 2116 |
c.Assert(err, checker.IsNil, check.Commentf(out)) |
| 2116 | 2117 |
|
| 2117 |
- t3 := daemonUnixTime(c) |
|
| 2118 |
- out, err = d.Cmd("events", "--since", t2, "--until", t3, "-f scope=swarm")
|
|
| 2119 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2120 |
- c.Assert(out, checker.Contains, "service update "+serviceID) |
|
| 2118 |
+ out = waitForEvent(c, d, t2, "-f scope=swarm", "service update "+serviceID, defaultRetryCount) |
|
| 2121 | 2119 |
c.Assert(out, checker.Contains, "replicas.new=3, replicas.old=1") |
| 2122 | 2120 |
|
| 2123 | 2121 |
// remove service |
| 2122 |
+ t3 := daemonUnixTime(c) |
|
| 2124 | 2123 |
out, err = d.Cmd("service", "rm", "test")
|
| 2125 | 2124 |
c.Assert(err, checker.IsNil, check.Commentf(out)) |
| 2126 | 2125 |
|
| 2127 |
- t4 := daemonUnixTime(c) |
|
| 2128 |
- out, err = d.Cmd("events", "--since", t3, "--until", t4, "-f scope=swarm")
|
|
| 2129 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2130 |
- c.Assert(out, checker.Contains, "service remove "+serviceID) |
|
| 2126 |
+ waitForEvent(c, d, t3, "-f scope=swarm", "service remove "+serviceID, defaultRetryCount) |
|
| 2131 | 2127 |
} |
| 2132 | 2128 |
|
| 2133 | 2129 |
func (s *DockerSwarmSuite) TestSwarmClusterEventsNode(c *check.C) {
|
| ... | ... |
@@ -2136,38 +2141,28 @@ func (s *DockerSwarmSuite) TestSwarmClusterEventsNode(c *check.C) {
|
| 2136 | 2136 |
d3 := s.AddDaemon(c, true, true) |
| 2137 | 2137 |
|
| 2138 | 2138 |
d3ID := d3.NodeID |
| 2139 |
- t1 := daemonUnixTime(c) |
|
| 2140 |
- out, err := d1.Cmd("events", "--since=0", "--until", t1, "-f scope=swarm")
|
|
| 2141 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2142 |
- c.Assert(out, checker.Contains, "node create "+d3ID) |
|
| 2139 |
+ waitForEvent(c, d1, "0", "-f scope=swarm", "node create "+d3ID, defaultRetryCount) |
|
| 2143 | 2140 |
|
| 2144 |
- out, err = d1.Cmd("node", "update", "--availability=pause", d3ID)
|
|
| 2141 |
+ t1 := daemonUnixTime(c) |
|
| 2142 |
+ out, err := d1.Cmd("node", "update", "--availability=pause", d3ID)
|
|
| 2145 | 2143 |
c.Assert(err, checker.IsNil, check.Commentf(out)) |
| 2146 | 2144 |
|
| 2147 |
- t2 := daemonUnixTime(c) |
|
| 2148 | 2145 |
// filter by type |
| 2149 |
- out, err = d1.Cmd("events", "--since", t1, "--until", t2, "-f type=node")
|
|
| 2150 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2151 |
- c.Assert(out, checker.Contains, "node update "+d3ID) |
|
| 2146 |
+ out = waitForEvent(c, d1, t1, "-f type=node", "node update "+d3ID, defaultRetryCount) |
|
| 2152 | 2147 |
c.Assert(out, checker.Contains, "availability.new=pause, availability.old=active") |
| 2153 | 2148 |
|
| 2149 |
+ t2 := daemonUnixTime(c) |
|
| 2154 | 2150 |
out, err = d1.Cmd("node", "demote", d3ID)
|
| 2155 | 2151 |
c.Assert(err, checker.IsNil, check.Commentf(out)) |
| 2156 | 2152 |
|
| 2157 |
- t3 := daemonUnixTime(c) |
|
| 2158 |
- // filter by type and scope |
|
| 2159 |
- out, err = d1.Cmd("events", "--since", t2, "--until", t3, "-f type=node", "-f scope=swarm")
|
|
| 2160 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2161 |
- c.Assert(out, checker.Contains, "node update "+d3ID) |
|
| 2153 |
+ waitForEvent(c, d1, t2, "-f type=node", "node update "+d3ID, defaultRetryCount) |
|
| 2162 | 2154 |
|
| 2155 |
+ t3 := daemonUnixTime(c) |
|
| 2163 | 2156 |
out, err = d1.Cmd("node", "rm", "-f", d3ID)
|
| 2164 | 2157 |
c.Assert(err, checker.IsNil, check.Commentf(out)) |
| 2165 | 2158 |
|
| 2166 |
- t4 := daemonUnixTime(c) |
|
| 2167 |
- // filter by type and scope |
|
| 2168 |
- out, err = d1.Cmd("events", "--since", t3, "--until", t4, "-f type=node", "-f scope=swarm")
|
|
| 2169 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2170 |
- c.Assert(out, checker.Contains, "node remove "+d3ID) |
|
| 2159 |
+ // filter by scope |
|
| 2160 |
+ waitForEvent(c, d1, t3, "-f scope=swarm", "node remove "+d3ID, defaultRetryCount) |
|
| 2171 | 2161 |
} |
| 2172 | 2162 |
|
| 2173 | 2163 |
func (s *DockerSwarmSuite) TestSwarmClusterEventsNetwork(c *check.C) {
|
| ... | ... |
@@ -2178,20 +2173,15 @@ func (s *DockerSwarmSuite) TestSwarmClusterEventsNetwork(c *check.C) {
|
| 2178 | 2178 |
c.Assert(err, checker.IsNil, check.Commentf(out)) |
| 2179 | 2179 |
networkID := strings.TrimSpace(out) |
| 2180 | 2180 |
|
| 2181 |
- t1 := daemonUnixTime(c) |
|
| 2182 |
- out, err = d.Cmd("events", "--since=0", "--until", t1, "-f scope=swarm")
|
|
| 2183 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2184 |
- c.Assert(out, checker.Contains, "network create "+networkID) |
|
| 2181 |
+ waitForEvent(c, d, "0", "-f scope=swarm", "network create "+networkID, defaultRetryCount) |
|
| 2185 | 2182 |
|
| 2186 | 2183 |
// remove network |
| 2184 |
+ t1 := daemonUnixTime(c) |
|
| 2187 | 2185 |
out, err = d.Cmd("network", "rm", "foo")
|
| 2188 | 2186 |
c.Assert(err, checker.IsNil, check.Commentf(out)) |
| 2189 | 2187 |
|
| 2190 |
- t2 := daemonUnixTime(c) |
|
| 2191 | 2188 |
// filtered by network |
| 2192 |
- out, err = d.Cmd("events", "--since", t1, "--until", t2, "-f type=network")
|
|
| 2193 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2194 |
- c.Assert(out, checker.Contains, "network remove "+networkID) |
|
| 2189 |
+ waitForEvent(c, d, t1, "-f type=network", "network remove "+networkID, defaultRetryCount) |
|
| 2195 | 2190 |
} |
| 2196 | 2191 |
|
| 2197 | 2192 |
func (s *DockerSwarmSuite) TestSwarmClusterEventsSecret(c *check.C) {
|
| ... | ... |
@@ -2206,15 +2196,10 @@ func (s *DockerSwarmSuite) TestSwarmClusterEventsSecret(c *check.C) {
|
| 2206 | 2206 |
}) |
| 2207 | 2207 |
c.Assert(id, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", id))
|
| 2208 | 2208 |
|
| 2209 |
- t1 := daemonUnixTime(c) |
|
| 2210 |
- out, err := d.Cmd("events", "--since=0", "--until", t1, "-f scope=swarm")
|
|
| 2211 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2212 |
- c.Assert(out, checker.Contains, "secret create "+id) |
|
| 2209 |
+ waitForEvent(c, d, "0", "-f scope=swarm", "secret create "+id, defaultRetryCount) |
|
| 2213 | 2210 |
|
| 2211 |
+ t1 := daemonUnixTime(c) |
|
| 2214 | 2212 |
d.DeleteSecret(c, id) |
| 2215 |
- t2 := daemonUnixTime(c) |
|
| 2216 | 2213 |
// filtered by secret |
| 2217 |
- out, err = d.Cmd("events", "--since", t1, "--until", t2, "-f type=secret")
|
|
| 2218 |
- c.Assert(err, checker.IsNil, check.Commentf(out)) |
|
| 2219 |
- c.Assert(out, checker.Contains, "secret remove "+id) |
|
| 2214 |
+ waitForEvent(c, d, t1, "-f type=secret", "secret remove "+id, defaultRetryCount) |
|
| 2220 | 2215 |
} |