func (*metadataHelperSuite) TestResolveMetadata(c *gc.C) { var versionStrings = []string{"1.2.3-precise-amd64"} dir := c.MkDir() toolstesting.MakeTools(c, dir, "released", versionStrings) toolsList := coretools.List{{ Version: version.MustParseBinary(versionStrings[0]), Size: 123, SHA256: "abc", }} stor, err := filestorage.NewFileStorageReader(dir) c.Assert(err, jc.ErrorIsNil) err = tools.ResolveMetadata(stor, "released", nil) c.Assert(err, jc.ErrorIsNil) // We already have size/sha256, so ensure that storage isn't consulted. countingStorage := &countingStorage{StorageReader: stor} metadata := tools.MetadataFromTools(toolsList, "released") err = tools.ResolveMetadata(countingStorage, "released", metadata) c.Assert(err, jc.ErrorIsNil) c.Assert(countingStorage.counter, gc.Equals, 0) // Now clear size/sha256, and check that it is called, and // the size/sha256 sum are updated. metadata[0].Size = 0 metadata[0].SHA256 = "" err = tools.ResolveMetadata(countingStorage, "released", metadata) c.Assert(err, jc.ErrorIsNil) c.Assert(countingStorage.counter, gc.Equals, 1) c.Assert(metadata[0].Size, gc.Not(gc.Equals), 0) c.Assert(metadata[0].SHA256, gc.Not(gc.Equals), "") }
// This is essentially the same as tools.MergeAndWriteMetadata, but also // resolves metadata for existing tools by fetching them and computing // size/sha256 locally. func mergeAndWriteMetadata(stor storage.Storage, toolsList coretools.List, writeMirrors envtools.ShouldWriteMirrors) error { existing, err := envtools.ReadMetadata(stor) if err != nil { return err } metadata := envtools.MetadataFromTools(toolsList) if metadata, err = envtools.MergeMetadata(metadata, existing); err != nil { return err } if err = envtools.ResolveMetadata(stor, metadata); err != nil { return err } return envtools.WriteMetadata(stor, metadata, writeMirrors) }
func (*metadataHelperSuite) TestResolveMetadataLegacyPPC64(c *gc.C) { var versionStrings = []string{"1.2.3-precise-amd64", "1.2.3-precise-ppc64el"} dir := c.MkDir() toolstesting.MakeTools(c, dir, "released", versionStrings) toolsList := coretools.List{ { Version: version.MustParseBinary(versionStrings[0]), }, { Version: version.MustParseBinary(versionStrings[1]), }, { Version: version.MustParseBinary("1.2.3-precise-ppc64"), }, } toolsMetadata := tools.MetadataFromTools(toolsList, dir) stor, err := filestorage.NewFileStorageReader(dir) c.Assert(err, jc.ErrorIsNil) err = tools.ResolveMetadata(stor, "released", toolsMetadata) c.Assert(err, jc.ErrorIsNil) c.Assert(toolsMetadata, gc.DeepEquals, []*tools.ToolsMetadata{ { Release: "precise", Version: "1.2.3", Arch: "amd64", Size: 19, FileType: "tar.gz", SHA256: "dcdd65b962b804a3d63b108d670290ee95a867a97fe9b9f99b2b77b5c7173e59", Path: fmt.Sprintf("%s/juju-1.2.3-precise-amd64.tgz", dir), }, { Release: "precise", Version: "1.2.3", Arch: "ppc64el", Size: 21, FileType: "tar.gz", SHA256: "a3460ed45eb07a69adfcd541413a495f988c5842d715c6a40353075c3ad47af2", Path: fmt.Sprintf("%s/juju-1.2.3-precise-ppc64el.tgz", dir), }, { Release: "precise", Version: "1.2.3", Arch: "ppc64", Size: 21, FileType: "tar.gz", SHA256: "a3460ed45eb07a69adfcd541413a495f988c5842d715c6a40353075c3ad47af2", Path: fmt.Sprintf("%s/juju-1.2.3-precise-ppc64el.tgz", dir), }, }) }
// This is essentially the same as tools.MergeAndWriteMetadata, but also // resolves metadata for existing tools by fetching them and computing // size/sha256 locally. func mergeAndWriteMetadata( stor storage.Storage, toolsDir, stream string, clean bool, toolsList coretools.List, writeMirrors envtools.ShouldWriteMirrors, ) error { existing, err := envtools.ReadAllMetadata(stor) if err != nil { return err } if clean { delete(existing, stream) } metadata := envtools.MetadataFromTools(toolsList, toolsDir) var mergedMetadata []*envtools.ToolsMetadata if mergedMetadata, err = envtools.MergeMetadata(metadata, existing[stream]); err != nil { return err } if err = envtools.ResolveMetadata(stor, toolsDir, mergedMetadata); err != nil { return err } existing[stream] = mergedMetadata return envtools.WriteMetadata(stor, existing, []string{stream}, writeMirrors) }