func (s *generateSuite) TestWriteIndexRegionOnce(c *gc.C) { existingImageMetadata := []*imagemetadata.ImageMetadata{ { Id: "1234", Arch: "amd64", Version: "13.04", VirtType: "kvm", }, } cloudSpec := &simplestreams.CloudSpec{ Region: "region", Endpoint: "endpoint", } dir := c.MkDir() targetStorage, err := filestorage.NewFileStorageWriter(dir) c.Assert(err, jc.ErrorIsNil) err = imagemetadata.MergeAndWriteMetadata("raring", existingImageMetadata, cloudSpec, targetStorage) c.Assert(err, jc.ErrorIsNil) newImageMetadata := []*imagemetadata.ImageMetadata{ { Id: "abcd", Arch: "amd64", Version: "13.04", VirtType: "lxd", }, } err = imagemetadata.MergeAndWriteMetadata("raring", newImageMetadata, cloudSpec, targetStorage) c.Assert(err, jc.ErrorIsNil) foundIndex, _ := testing.ParseIndexMetadataFromStorage(c, targetStorage) expectedCloudSpecs := []simplestreams.CloudSpec{*cloudSpec} c.Assert(foundIndex.Clouds, jc.SameContents, expectedCloudSpecs) }
func (s *generateSuite) TestWriteMetadataMergeDifferentRegion(c *gc.C) { existingImageMetadata := []*imagemetadata.ImageMetadata{ { Id: "1234", Arch: "amd64", Version: "13.04", }, } cloudSpec := &simplestreams.CloudSpec{ Region: "region", Endpoint: "endpoint", } dir := c.MkDir() targetStorage, err := filestorage.NewFileStorageWriter(dir) c.Assert(err, jc.ErrorIsNil) err = imagemetadata.MergeAndWriteMetadata("raring", existingImageMetadata, cloudSpec, targetStorage) c.Assert(err, jc.ErrorIsNil) newImageMetadata := []*imagemetadata.ImageMetadata{ { Id: "abcd", Arch: "amd64", Version: "13.04", }, { Id: "xyz", Arch: "arm", Version: "13.04", }, } cloudSpec = &simplestreams.CloudSpec{ Region: "region2", Endpoint: "endpoint2", } err = imagemetadata.MergeAndWriteMetadata("raring", newImageMetadata, cloudSpec, targetStorage) c.Assert(err, jc.ErrorIsNil) metadata := testing.ParseMetadataFromDir(c, dir) c.Assert(metadata, gc.HasLen, 3) for _, im := range newImageMetadata { im.RegionName = "region2" im.Endpoint = "endpoint2" } existingImageMetadata[0].RegionName = "region" existingImageMetadata[0].Endpoint = "endpoint" newImageMetadata = append(newImageMetadata, existingImageMetadata[0]) imagemetadata.Sort(newImageMetadata) c.Assert(metadata, gc.DeepEquals, newImageMetadata) assertFetch(c, targetStorage, "raring", "amd64", "region", "endpoint", "1234") assertFetch(c, targetStorage, "raring", "amd64", "region2", "endpoint2", "abcd") }
func (c *ImageMetadataCommand) Run(context *cmd.Context) error { if err := c.setParams(context); err != nil { return err } out := context.Stdout im := &imagemetadata.ImageMetadata{ Id: c.ImageId, Arch: c.Arch, } cloudSpec := simplestreams.CloudSpec{ Region: c.Region, Endpoint: c.Endpoint, } targetStorage, err := filestorage.NewFileStorageWriter(c.Dir) if err != nil { return err } err = imagemetadata.MergeAndWriteMetadata(c.Series, []*imagemetadata.ImageMetadata{im}, &cloudSpec, targetStorage) if err != nil { return fmt.Errorf("image metadata files could not be created: %v", err) } dir := context.AbsPath(c.Dir) dest := filepath.Join(dir, storage.BaseImagesPath, "streams", "v1") fmt.Fprintf(out, fmt.Sprintf(helpDoc, dest, dir, dir)) return nil }
func createImageMetadata(c *gc.C) (sourceDir string, destDir string, destStor storage.Storage, metadata *imagemetadata.ImageMetadata) { destDir = c.MkDir() var err error destStor, err = filestorage.NewFileStorageWriter(destDir) c.Assert(err, gc.IsNil) // Generate some metadata. sourceDir = c.MkDir() im := []*imagemetadata.ImageMetadata{ { Id: "1234", Arch: "amd64", Version: "13.04", }, } cloudSpec := &simplestreams.CloudSpec{ Region: "region", Endpoint: "endpoint", } im[0].RegionName = cloudSpec.Region im[0].Endpoint = cloudSpec.Endpoint var sourceStor storage.Storage sourceStor, err = filestorage.NewFileStorageWriter(sourceDir) c.Assert(err, gc.IsNil) err = imagemetadata.MergeAndWriteMetadata("raring", im, cloudSpec, sourceStor) c.Assert(err, gc.IsNil) return sourceDir, destDir, destStor, im[0] }
func (s *archSuite) setupMetadata(c *gc.C, arches []string) (environs.Environ, simplestreams.CloudSpec) { s.PatchValue(&imagemetadata.DefaultBaseURL, "") stor := newStorage(s, c) env := &mockEnviron{ storage: stor, config: configGetter(c), } var images []*imagemetadata.ImageMetadata for _, arch := range arches { images = append(images, &imagemetadata.ImageMetadata{ Id: "image-id", Arch: arch, RegionName: "Region", Endpoint: "https://endpoint/", }) } // Append an image from another region with some other arch to ensure it is ignored. images = append(images, &imagemetadata.ImageMetadata{ Id: "image-id", Arch: "arch", RegionName: "Region-Two", Endpoint: "https://endpoint/", }) cloudSpec := simplestreams.CloudSpec{ Region: "Region", Endpoint: "https://endpoint/", } err := imagemetadata.MergeAndWriteMetadata("precise", images, &cloudSpec, env.Storage()) c.Assert(err, gc.IsNil) return env, cloudSpec }
func makeTestMetadata(c *gc.C, env environs.Environ, series, location string, im []*imagemetadata.ImageMetadata) { cloudSpec := simplestreams.CloudSpec{ Region: location, Endpoint: "https://management.core.windows.net/", } err := imagemetadata.MergeAndWriteMetadata(series, im, &cloudSpec, env.Storage()) c.Assert(err, gc.IsNil) }
// lp#1600054 func (s *generateSuite) TestWriteMetadataMergeDifferentVirtType(c *gc.C) { existingImageMetadata := []*imagemetadata.ImageMetadata{ { Id: "1234", Arch: "amd64", Version: "13.04", VirtType: "kvm", }, } cloudSpec := &simplestreams.CloudSpec{ Region: "region", Endpoint: "endpoint", } dir := c.MkDir() targetStorage, err := filestorage.NewFileStorageWriter(dir) c.Assert(err, jc.ErrorIsNil) err = imagemetadata.MergeAndWriteMetadata("raring", existingImageMetadata, cloudSpec, targetStorage) c.Assert(err, jc.ErrorIsNil) newImageMetadata := []*imagemetadata.ImageMetadata{ { Id: "abcd", Arch: "amd64", Version: "13.04", VirtType: "lxd", }, } err = imagemetadata.MergeAndWriteMetadata("raring", newImageMetadata, cloudSpec, targetStorage) c.Assert(err, jc.ErrorIsNil) foundMetadata := testing.ParseMetadataFromDir(c, dir) expectedMetadata := append(newImageMetadata, existingImageMetadata...) c.Assert(len(foundMetadata), gc.Equals, len(expectedMetadata)) for _, im := range expectedMetadata { im.RegionName = cloudSpec.Region im.Endpoint = cloudSpec.Endpoint } imagemetadata.Sort(expectedMetadata) c.Assert(foundMetadata, gc.DeepEquals, expectedMetadata) assertFetch(c, targetStorage, "raring", "amd64", "region", "endpoint", "1234", "abcd") }
func (s *generateSuite) TestWriteMetadataMergeOverwriteSameArch(c *gc.C) { existingImageMetadata := []*imagemetadata.ImageMetadata{ { Id: "1234", Arch: "amd64", Version: "13.04", }, } cloudSpec := &simplestreams.CloudSpec{ Region: "region", Endpoint: "endpoint", } dir := c.MkDir() targetStorage, err := filestorage.NewFileStorageWriter(dir) c.Assert(err, gc.IsNil) err = imagemetadata.MergeAndWriteMetadata("raring", existingImageMetadata, cloudSpec, targetStorage) c.Assert(err, gc.IsNil) newImageMetadata := []*imagemetadata.ImageMetadata{ { Id: "abcd", Arch: "amd64", Version: "13.04", }, { Id: "xyz", Arch: "arm", Version: "13.04", }, } err = imagemetadata.MergeAndWriteMetadata("raring", newImageMetadata, cloudSpec, targetStorage) c.Assert(err, gc.IsNil) metadata := testing.ParseMetadataFromDir(c, dir) c.Assert(metadata, gc.HasLen, 2) for _, im := range newImageMetadata { im.RegionName = cloudSpec.Region im.Endpoint = cloudSpec.Endpoint } c.Assert(metadata, gc.DeepEquals, newImageMetadata) assertFetch(c, targetStorage, "raring", "amd64", "region", "endpoint", "abcd") assertFetch(c, targetStorage, "raring", "arm", "region", "endpoint", "xyz") }
func (s *archSuite) setupMetadata(c *gc.C, arches []string) (environs.Environ, simplestreams.CloudSpec) { imagetesting.PatchOfficialDataSources(&s.CleanupSuite, "") env := &mockEnviron{ config: configGetter(c), } var images []*imagemetadata.ImageMetadata for _, arch := range arches { images = append(images, &imagemetadata.ImageMetadata{ Id: "image-id", Arch: arch, RegionName: "Region", Endpoint: "https://endpoint/", }) } // Append an image from another region with some other arch to ensure it is ignored. images = append(images, &imagemetadata.ImageMetadata{ Id: "image-id", Arch: "arch", RegionName: "Region-Two", Endpoint: "https://endpoint/", }) cloudSpec := simplestreams.CloudSpec{ Region: "Region", Endpoint: "https://endpoint/", } metadataDir := c.MkDir() stor, err := filestorage.NewFileStorageWriter(metadataDir) c.Assert(err, jc.ErrorIsNil) err = imagemetadata.MergeAndWriteMetadata("precise", images, &cloudSpec, stor) c.Assert(err, jc.ErrorIsNil) id := "SupportedArchitectures" environs.RegisterImageDataSourceFunc(id, func(environs.Environ) (simplestreams.DataSource, error) { return simplestreams.NewURLDataSource(id, "file://"+metadataDir+"/images", false, simplestreams.DEFAULT_CLOUD_DATA, false), nil }) s.AddCleanup(func(*gc.C) { environs.UnregisterImageDataSourceFunc(id) }) return env, cloudSpec }
func (s *ValidateImageMetadataSuite) makeLocalMetadata(c *gc.C, id, region, series, endpoint, stream string) error { im := &imagemetadata.ImageMetadata{ Id: id, Arch: "amd64", Stream: stream, } cloudSpec := simplestreams.CloudSpec{ Region: region, Endpoint: endpoint, } targetStorage, err := filestorage.NewFileStorageWriter(s.metadataDir) if err != nil { return err } err = imagemetadata.MergeAndWriteMetadata(series, []*imagemetadata.ImageMetadata{im}, &cloudSpec, targetStorage) if err != nil { return err } return nil }
// createImageMetadata creates some image metadata in a local directory. func createImageMetadata(c *gc.C) (dir string, _ []*imagemetadata.ImageMetadata) { // Generate some image metadata. im := []*imagemetadata.ImageMetadata{{ Id: "1234", Arch: "amd64", Version: "13.04", RegionName: "region", Endpoint: "endpoint", }} cloudSpec := &simplestreams.CloudSpec{ Region: "region", Endpoint: "endpoint", } sourceDir := c.MkDir() sourceStor, err := filestorage.NewFileStorageWriter(sourceDir) c.Assert(err, jc.ErrorIsNil) err = imagemetadata.MergeAndWriteMetadata("raring", im, cloudSpec, sourceStor) c.Assert(err, jc.ErrorIsNil) return sourceDir, im }
func (s *generateSuite) TestWriteMetadata(c *gc.C) { im := []*imagemetadata.ImageMetadata{ { Id: "1234", Arch: "amd64", Version: "13.04", }, } cloudSpec := &simplestreams.CloudSpec{ Region: "region", Endpoint: "endpoint", } dir := c.MkDir() targetStorage, err := filestorage.NewFileStorageWriter(dir) c.Assert(err, jc.ErrorIsNil) err = imagemetadata.MergeAndWriteMetadata("raring", im, cloudSpec, targetStorage) c.Assert(err, jc.ErrorIsNil) metadata := testing.ParseMetadataFromDir(c, dir) c.Assert(metadata, gc.HasLen, 1) im[0].RegionName = cloudSpec.Region im[0].Endpoint = cloudSpec.Endpoint c.Assert(im[0], gc.DeepEquals, metadata[0]) assertFetch(c, targetStorage, "raring", "amd64", "region", "endpoint", "1234") }