func (s *managedStorageSuite) TestPendingUpload(c *gc.C) { // Manually set up a scenario where there's a resource recorded // but the upload has not occurred. rc := storage.GetResourceCatalog(s.managedStorage) rh := &storage.ResourceHash{"foo", "bar"} id, _, _, err := rc.Put(rh, 100) c.Assert(err, gc.IsNil) managedResource := storage.ManagedResource{ EnvUUID: "env", User: "******", Path: "environs/env/path/to/blob", } _, err = storage.PutManagedResource(s.managedStorage, managedResource, id) c.Assert(err, gc.IsNil) _, _, err = s.managedStorage.GetForEnvironment("env", "/path/to/blob") c.Assert(err, gc.Equals, storage.ErrUploadPending) }
func (s *managedStorageSuite) TestPutRaceWhereCatalogEntryRemoved(c *gc.C) { blob := []byte("some resource") // Remove the resource catalog entry with the resourceId that we are about // to write to a managed resource entry. beforeFunc := []func(){ nil, // resourceCatalog Put() nil, // managedResource Put() func() { // Shamelessly exploit our knowledge of how ids are made. md5hash, sha256hash := calculateCheckSums(c, 0, int64(len(blob)), blob) _, _, err := storage.GetResourceCatalog(s.managedStorage).Remove(md5hash + sha256hash) c.Assert(err, gc.IsNil) }, } defer txntesting.SetBeforeHooks(c, s.txnRunner, beforeFunc...).Check() rdr := bytes.NewReader(blob) err := s.managedStorage.PutForEnvironment("env", "/path/to/blob", rdr, int64(len(blob))) c.Assert(err, gc.ErrorMatches, "unexpected deletion .*") s.assertResourceCatalogCount(c, 0) }
func (s *managedStorageSuite) TestPutManagedResourceFail(c *gc.C) { var resourcePath string s.PatchValue(storage.PutResourceTxn, func( coll *mgo.Collection, managedResource storage.ManagedResource, resourceId string) (string, []txn.Op, error) { rc := storage.GetResourceCatalog(s.managedStorage) r, err := rc.Get(resourceId) c.Assert(err, gc.IsNil) resourcePath = r.Path return "", nil, errors.Errorf("some error") }) // Attempt to put the data. blob := []byte("data") rdr := bytes.NewReader(blob) err := s.managedStorage.PutForEnvironment("env", "/some/path", rdr, int64(len(blob))) c.Assert(err, gc.ErrorMatches, "cannot update managed resource catalog: some error") // Now ensure there's no blob data left behind in storage, nor a resource catalog record. s.assertResourceCatalogCount(c, 0) _, err = s.resourceStorage.Get(resourcePath) c.Assert(err, gc.ErrorMatches, ".*not found") }