func (s *metadataHelperSuite) TestWriteMetadataLegacyIndex(c *gc.C) { stor, _ := s.writeMetadataMultipleStream(c) // Read back the legacy index rdr, err := stor.Get("tools/streams/v1/index.json") defer rdr.Close() c.Assert(err, jc.ErrorIsNil) data, err := ioutil.ReadAll(rdr) c.Assert(err, jc.ErrorIsNil) var indices simplestreams.Indices err = json.Unmarshal(data, &indices) c.Assert(err, jc.ErrorIsNil) c.Assert(indices.Indexes, gc.HasLen, 1) indices.Updated = "" c.Assert(indices.Indexes["com.ubuntu.juju:released:tools"], gc.NotNil) indices.Indexes["com.ubuntu.juju:released:tools"].Updated = "" expected := simplestreams.Indices{ Format: "index:1.0", Indexes: map[string]*simplestreams.IndexMetadata{ "com.ubuntu.juju:released:tools": { Format: "products:1.0", DataType: "content-download", ProductsFilePath: "streams/v1/com.ubuntu.juju-released-tools.json", ProductIds: []string{"com.ubuntu.juju:12.04:amd64"}, }, }, } c.Assert(indices, jc.DeepEquals, expected) }
// marshalToolsMetadataIndexJSON marshals tools metadata to index JSON. // updated is the time at which the JSON file was updated. func marshalToolsMetadataIndexJSON(streamMetadata map[string][]*ToolsMetadata, updated time.Time) (out, outlegacy []byte, err error) { var indices simplestreams.Indices indices.Updated = updated.Format(time.RFC1123Z) indices.Format = simplestreams.IndexFormat indices.Indexes = make(map[string]*simplestreams.IndexMetadata, len(streamMetadata)) var indicesLegacy simplestreams.Indices indicesLegacy.Updated = updated.Format(time.RFC1123Z) indicesLegacy.Format = simplestreams.IndexFormat for stream, metadata := range streamMetadata { var productIds []string for _, t := range metadata { id, err := t.productId() if err != nil { if series.IsUnknownSeriesVersionError(err) { logger.Infof("ignoring tools metadata with unknown series %q", t.Release) continue } return nil, nil, err } productIds = append(productIds, id) } indexMetadata := &simplestreams.IndexMetadata{ Updated: indices.Updated, Format: simplestreams.ProductFormat, DataType: ContentDownload, ProductsFilePath: ProductMetadataPath(stream), ProductIds: set.NewStrings(productIds...).SortedValues(), } indices.Indexes[ToolsContentId(stream)] = indexMetadata if stream == ReleasedStream { indicesLegacy.Indexes = make(map[string]*simplestreams.IndexMetadata, 1) indicesLegacy.Indexes[ToolsContentId(stream)] = indexMetadata } } out, err = json.MarshalIndent(&indices, "", " ") if len(indicesLegacy.Indexes) == 0 { return out, nil, err } outlegacy, err = json.MarshalIndent(&indicesLegacy, "", " ") if err != nil { return nil, nil, err } return out, outlegacy, nil }
// MarshalToolsMetadataIndexJSON marshals tools metadata to index JSON. // // updated is the time at which the JSON file was updated. func MarshalToolsMetadataIndexJSON(metadata []*ToolsMetadata, updated time.Time) (out []byte, err error) { productIds := make([]string, len(metadata)) for i, t := range metadata { productIds[i], err = t.productId() if err != nil { return nil, err } } var indices simplestreams.Indices indices.Updated = updated.Format(time.RFC1123Z) indices.Format = "index:1.0" indices.Indexes = map[string]*simplestreams.IndexMetadata{ ToolsContentId: &simplestreams.IndexMetadata{ Updated: indices.Updated, Format: "products:1.0", DataType: "content-download", ProductsFilePath: ProductMetadataPath, ProductIds: set.NewStrings(productIds...).SortedValues(), }, } return json.MarshalIndent(&indices, "", " ") }
// MarshalImageMetadataIndexJSON marshals image metadata to index JSON. // // updated is the time at which the JSON file was updated. func MarshalImageMetadataIndexJSON(metadata []*ImageMetadata, cloudSpec []simplestreams.CloudSpec, updated time.Time) (out []byte, err error) { productIds := make([]string, len(metadata)) for i, t := range metadata { productIds[i] = t.productId() } var indices simplestreams.Indices indices.Updated = updated.Format(time.RFC1123Z) indices.Format = simplestreams.IndexFormat indices.Indexes = map[string]*simplestreams.IndexMetadata{ ImageContentId: { CloudName: "custom", Updated: indices.Updated, Format: simplestreams.ProductFormat, DataType: "image-ids", ProductsFilePath: ProductMetadataPath, ProductIds: set.NewStrings(productIds...).SortedValues(), Clouds: cloudSpec, }, } return json.MarshalIndent(&indices, "", " ") }