// Fetch returns a list of images for the specified cloud matching the constraint. // The base URL locations are as specified - the first location which has a file is the one used. // Signed data is preferred, but if there is no signed data available and onlySigned is false, // then unsigned data is used. func Fetch( sources []simplestreams.DataSource, cons *ImageConstraint, ) ([]*ImageMetadata, *simplestreams.ResolveInfo, error) { params := simplestreams.GetMetadataParams{ StreamsVersion: currentStreamsVersion, LookupConstraint: cons, ValueParams: simplestreams.ValueParams{ DataType: ImageIds, FilterFunc: appendMatchingImages, ValueTemplate: ImageMetadata{}, }, } items, resolveInfo, err := simplestreams.GetMetadata(sources, params) if err != nil { return nil, resolveInfo, err } metadata := make([]*ImageMetadata, len(items)) for i, md := range items { metadata[i] = md.(*ImageMetadata) } // Sorting the metadata is not strictly necessary, but it ensures consistent ordering for // all compilers, and it just makes it easier to look at the data. Sort(metadata) return metadata, resolveInfo, nil }
// Fetch returns a list of tools for the specified cloud matching the constraint. // The base URL locations are as specified - the first location which has a file is the one used. // Signed data is preferred, but if there is no signed data available and onlySigned is false, // then unsigned data is used. func Fetch( sources []simplestreams.DataSource, cons *ToolsConstraint, onlySigned bool) ([]*ToolsMetadata, *simplestreams.ResolveInfo, error) { params := simplestreams.GetMetadataParams{ StreamsVersion: currentStreamsVersion, OnlySigned: onlySigned, LookupConstraint: cons, ValueParams: simplestreams.ValueParams{ DataType: ContentDownload, FilterFunc: appendMatchingTools, MirrorContentId: ToolsContentId(cons.Stream), ValueTemplate: ToolsMetadata{}, PublicKey: simplestreamsToolsPublicKey, }, } items, resolveInfo, err := simplestreams.GetMetadata(sources, params) if err != nil { return nil, nil, err } metadata := make([]*ToolsMetadata, len(items)) for i, md := range items { metadata[i] = md.(*ToolsMetadata) } // Sorting the metadata is not strictly necessary, but it ensures consistent ordering for // all compilers, and it just makes it easier to look at the data. Sort(metadata) return metadata, resolveInfo, nil }
// FetchMetadata fetches and returns Juju GUI metadata from simplestreams, // sorted by version descending. func FetchMetadata(stream string, sources ...simplestreams.DataSource) ([]*Metadata, error) { params := simplestreams.GetMetadataParams{ StreamsVersion: streamsVersion, LookupConstraint: &constraint{ LookupParams: simplestreams.LookupParams{Stream: stream}, majorVersion: jujuversion.Current.Major, }, ValueParams: simplestreams.ValueParams{ DataType: downloadType, MirrorContentId: contentId(stream), FilterFunc: appendArchives, ValueTemplate: Metadata{}, }, } items, _, err := simplestreams.GetMetadata(sources, params) if err != nil { return nil, errors.Annotate(err, "error fetching simplestreams metadata") } allMeta := make([]*Metadata, len(items)) for i, item := range items { allMeta[i] = item.(*Metadata) } sort.Sort(byVersion(allMeta)) return allMeta, nil }
func (s *simplestreamsSuite) TestGetMetadataNoMatching(c *gc.C) { source := &countingSource{ DataSource: simplestreams.NewURLDataSource( "test", "test:/daily", utils.VerifySSLHostnames, ), } sources := []simplestreams.DataSource{source, source, source} constraint := sstesting.NewTestConstraint(simplestreams.LookupParams{ CloudSpec: simplestreams.CloudSpec{ Region: "us-east-1", Endpoint: "https://ec2.us-east-1.amazonaws.com", }, Series: []string{"precise"}, Arches: []string{"not-a-real-arch"}, // never matches }) params := simplestreams.GetMetadataParams{ StreamsVersion: s.StreamsVersion, LookupConstraint: constraint, ValueParams: simplestreams.ValueParams{DataType: "image-ids"}, } items, resolveInfo, err := simplestreams.GetMetadata(sources, params) c.Assert(err, jc.ErrorIsNil) c.Assert(items, gc.HasLen, 0) c.Assert(resolveInfo, gc.DeepEquals, &simplestreams.ResolveInfo{ Source: "test", Signed: false, IndexURL: "test:/daily/streams/v1/index.json", MirrorURL: "", }) // There should be 4 calls to each data-source: // one for .sjson, one for .json, repeated for legacy vs new index files. c.Assert(source.count, gc.Equals, 4*len(sources)) }
func imageMetadataFetch(sources []simplestreams.DataSource, cons *imagemetadata.ImageConstraint) ([]*OvaFileMetadata, error) { params := simplestreams.GetMetadataParams{ StreamsVersion: imagemetadata.StreamsVersionV1, LookupConstraint: cons, ValueParams: simplestreams.ValueParams{ DataType: "image-downloads", FilterFunc: appendMatchingFunc, ValueTemplate: OvaFileMetadata{}, }, } items, _, err := simplestreams.GetMetadata(sources, params) if err != nil { return nil, errors.Trace(err) } metadata := make([]*OvaFileMetadata, len(items)) for i, md := range items { metadata[i] = md.(*OvaFileMetadata) } return metadata, nil }