Signed-off-by: Dong Chen <dongluo.chen@docker.com>
Dong Chen authored on 2017/05/19 19:25:14... | ... |
@@ -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 |
} |