func (s *ToolsSuite) TestAddToolsRemovesExistingRemoveFails(c *gc.C) { // Add a metadata doc and a blob at a known path, then // call AddTools and ensure that AddTools attempts to remove // the original blob, but does not return an error if it // fails. s.addMetadataDoc(c, version.Current, 3, "hash(abc)", "path") err := s.managedStorage.PutForEnvironment("my-uuid", "path", strings.NewReader("blah"), 4) c.Assert(err, jc.ErrorIsNil) storage := toolstorage.NewStorage( "my-uuid", removeFailsManagedStorage{s.managedStorage}, s.metadataCollection, s.txnRunner, ) addedMetadata := toolstorage.Metadata{ Version: version.Current, Size: 6, SHA256: "hash(xyzzzz)", } err = storage.AddTools(strings.NewReader("xyzzzz"), addedMetadata) c.Assert(err, jc.ErrorIsNil) // old blob should still be there r, _, err := s.managedStorage.GetForEnvironment("my-uuid", "path") c.Assert(err, jc.ErrorIsNil) r.Close() s.assertTools(c, addedMetadata, "xyzzzz") }
func (s *ToolsSuite) SetUpTest(c *gc.C) { s.BaseSuite.SetUpTest(c) s.mongo = &gitjujutesting.MgoInstance{} s.mongo.Start(nil) var err error s.session, err = s.mongo.Dial() c.Assert(err, jc.ErrorIsNil) rs := blobstore.NewGridFS("blobstore", "my-uuid", s.session) catalogue := s.session.DB("catalogue") s.managedStorage = blobstore.NewManagedStorage(catalogue, rs) s.metadataCollection = catalogue.C("toolsmetadata") s.txnRunner = jujutxn.NewRunner(jujutxn.RunnerParams{Database: catalogue}) s.storage = toolstorage.NewStorage("my-uuid", s.managedStorage, s.metadataCollection, s.txnRunner) }
func (s *ToolsSuite) TestAddToolsRemovesBlobOnFailure(c *gc.C) { storage := toolstorage.NewStorage( "my-uuid", s.managedStorage, s.metadataCollection, errorTransactionRunner{s.txnRunner}, ) addedMetadata := toolstorage.Metadata{ Version: version.Current, Size: 6, SHA256: "hash", } err := storage.AddTools(strings.NewReader("xyzzzz"), addedMetadata) c.Assert(err, gc.ErrorMatches, "cannot store tools metadata: Run fails") path := fmt.Sprintf("tools/%s-%s", addedMetadata.Version, addedMetadata.SHA256) _, _, err = s.managedStorage.GetForEnvironment("my-uuid", path) c.Assert(err, jc.Satisfies, errors.IsNotFound) }
func (s *ToolsSuite) TestAddToolsRemovesBlobOnFailureRemoveFails(c *gc.C) { storage := toolstorage.NewStorage( "my-uuid", removeFailsManagedStorage{s.managedStorage}, s.metadataCollection, errorTransactionRunner{s.txnRunner}, ) addedMetadata := toolstorage.Metadata{ Version: version.Current, Size: 6, SHA256: "hash", } err := storage.AddTools(strings.NewReader("xyzzzz"), addedMetadata) c.Assert(err, gc.ErrorMatches, "cannot store tools metadata: Run fails") // blob should still be there, because the removal failed. path := fmt.Sprintf("tools/%s-%s", addedMetadata.Version, addedMetadata.SHA256) r, _, err := s.managedStorage.GetForEnvironment("my-uuid", path) c.Assert(err, jc.ErrorIsNil) r.Close() }