func checkFileHasContents(c *gc.C, stor storage.StorageReader, name string, contents []byte, attempt utils.AttemptStrategy) { r, err := storage.GetWithRetry(stor, name, attempt) c.Assert(err, gc.IsNil) c.Check(r, gc.NotNil) defer r.Close() data, err := ioutil.ReadAll(r) c.Check(err, gc.IsNil) c.Check(data, gc.DeepEquals, contents) url, err := stor.URL(name) c.Assert(err, gc.IsNil) var resp *http.Response for a := attempt.Start(); a.Next(); { resp, err = utils.GetValidatingHTTPClient().Get(url) c.Assert(err, gc.IsNil) if resp.StatusCode != 404 { break } c.Logf("get retrying after earlier get succeeded. *sigh*.") } c.Assert(err, gc.IsNil) data, err = ioutil.ReadAll(resp.Body) c.Assert(err, gc.IsNil) defer resp.Body.Close() c.Assert(resp.StatusCode, gc.Equals, 200, gc.Commentf("error response: %s", data)) c.Check(data, gc.DeepEquals, contents) }
// ListWithRetry lists the files matching prefix from stor using the specified attempt strategy. func ListWithRetry(stor StorageReader, prefix string, attempt utils.AttemptStrategy) (list []string, err error) { for a := attempt.Start(); a.Next(); { list, err = stor.List(prefix) if err == nil || !stor.ShouldRetry(err) { break } } return list, err }
// GetWithRetry gets the named file from stor using the specified attempt strategy. func GetWithRetry(stor StorageReader, name string, attempt utils.AttemptStrategy) (r io.ReadCloser, err error) { for a := attempt.Start(); a.Next(); { r, err = stor.Get(name) if err == nil || !stor.ShouldRetry(err) { break } } return r, err }
func (s *mongoPingerSuite) TestAgentConnectionsShutDownWhenStateDies(c *gc.C) { s.PatchValue(apiserver.MongoPingInterval, coretesting.ShortWait) st, _ := s.OpenAPIAsNewMachine(c) err := st.Ping() c.Assert(err, gc.IsNil) coretesting.MgoServer.Destroy() attempt := utils.AttemptStrategy{ Total: coretesting.LongWait, Delay: coretesting.ShortWait, } for a := attempt.Start(); a.Next(); { if err := st.Ping(); err != nil { c.Assert(err, gc.ErrorMatches, "connection is shut down") return } } c.Fatalf("timed out waiting for API server to die") }