func (s *ImageMetadataSuite) TestImageMetadataURLsRegisteredFuncs(c *gc.C) { environs.RegisterImageDataSourceFunc("id0", func(environs.Environ) (simplestreams.DataSource, error) { return simplestreams.NewURLDataSource("id0", "betwixt/releases", utils.NoVerifySSLHostnames), nil }) environs.RegisterImageDataSourceFunc("id1", func(environs.Environ) (simplestreams.DataSource, error) { return simplestreams.NewURLDataSource("id1", "yoink", utils.NoVerifySSLHostnames), nil }) // overwrite the one previously registered against id1 environs.RegisterImageDataSourceFunc("id1", func(environs.Environ) (simplestreams.DataSource, error) { return nil, errors.NewNotSupported(nil, "oyvey") }) environs.RegisterUserImageDataSourceFunc("id2", func(environs.Environ) (simplestreams.DataSource, error) { return simplestreams.NewURLDataSource("id2", "foobar", utils.NoVerifySSLHostnames), nil }) defer environs.UnregisterImageDataSourceFunc("id0") defer environs.UnregisterImageDataSourceFunc("id1") defer environs.UnregisterImageDataSourceFunc("id2") env := s.env(c, "config-image-metadata-url", "") sources, err := environs.ImageMetadataSources(env) c.Assert(err, jc.ErrorIsNil) sstesting.AssertExpectedSources(c, sources, []string{ "config-image-metadata-url/", "foobar/", "betwixt/releases/", "http://cloud-images.ubuntu.com/releases/", }) }
func (s *ImageMetadataSuite) TestImageMetadataURLsRegisteredFuncs(c *gc.C) { environs.RegisterImageDataSourceFunc("id0", func(environs.Environ) (simplestreams.DataSource, error) { return simplestreams.NewURLDataSource("id0", "betwixt/releases", utils.NoVerifySSLHostnames, simplestreams.DEFAULT_CLOUD_DATA, false), nil }) environs.RegisterImageDataSourceFunc("id1", func(environs.Environ) (simplestreams.DataSource, error) { return simplestreams.NewURLDataSource("id1", "yoink", utils.NoVerifySSLHostnames, simplestreams.SPECIFIC_CLOUD_DATA, false), nil }) // overwrite the one previously registered against id1 environs.RegisterImageDataSourceFunc("id1", func(environs.Environ) (simplestreams.DataSource, error) { return nil, errors.NewNotSupported(nil, "oyvey") }) environs.RegisterUserImageDataSourceFunc("id2", func(environs.Environ) (simplestreams.DataSource, error) { return simplestreams.NewURLDataSource("id2", "foobar", utils.NoVerifySSLHostnames, simplestreams.CUSTOM_CLOUD_DATA, false), nil }) defer environs.UnregisterImageDataSourceFunc("id0") defer environs.UnregisterImageDataSourceFunc("id1") defer environs.UnregisterImageDataSourceFunc("id2") env := s.env(c, "config-image-metadata-url", "") sources, err := environs.ImageMetadataSources(env) c.Assert(err, jc.ErrorIsNil) sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{ {"config-image-metadata-url/", ""}, {"foobar/", ""}, {"betwixt/releases/", ""}, {"https://streams.canonical.com/juju/images/releases/", imagemetadata.SimplestreamsImagesPublicKey}, {"http://cloud-images.ubuntu.com/releases/", imagemetadata.SimplestreamsImagesPublicKey}, }) }
func (s *bootstrapSuite) TestBootstrapMetadata(c *gc.C) { environs.UnregisterImageDataSourceFunc("bootstrap metadata") metadataDir, metadata := createImageMetadata(c) stor, err := filestorage.NewFileStorageWriter(metadataDir) c.Assert(err, jc.ErrorIsNil) envtesting.UploadFakeTools(c, stor, "released", "released") env := newEnviron("foo", useDefaultKeys, nil) s.setDummyStorage(c, env) err = bootstrap.Bootstrap(envtesting.BootstrapContext(c), env, bootstrap.BootstrapParams{ MetadataDir: metadataDir, }) c.Assert(err, jc.ErrorIsNil) c.Assert(env.bootstrapCount, gc.Equals, 1) c.Assert(envtools.DefaultBaseURL, gc.Equals, metadataDir) datasources, err := environs.ImageMetadataSources(env) c.Assert(err, jc.ErrorIsNil) c.Assert(datasources, gc.HasLen, 3) c.Assert(datasources[0].Description(), gc.Equals, "bootstrap metadata") c.Assert(env.instanceConfig, gc.NotNil) c.Assert(env.instanceConfig.CustomImageMetadata, gc.HasLen, 1) c.Assert(env.instanceConfig.CustomImageMetadata[0], gc.DeepEquals, metadata[0]) }
func (s *bootstrapSuite) TestBootstrapMetadata(c *gc.C) { environs.UnregisterImageDataSourceFunc("bootstrap metadata") metadataDir, metadata := createImageMetadata(c) stor, err := filestorage.NewFileStorageWriter(metadataDir) c.Assert(err, jc.ErrorIsNil) envtesting.UploadFakeTools(c, stor, "released", "released") env := newEnviron("foo", useDefaultKeys, nil) s.setDummyStorage(c, env) err = bootstrap.Bootstrap(envtesting.BootstrapContext(c), env, bootstrap.BootstrapParams{ MetadataDir: metadataDir, }) c.Assert(err, jc.ErrorIsNil) c.Assert(env.bootstrapCount, gc.Equals, 1) c.Assert(envtools.DefaultBaseURL, gc.Equals, metadataDir) datasources, err := environs.ImageMetadataSources(env) c.Assert(err, jc.ErrorIsNil) c.Assert(datasources, gc.HasLen, 3) c.Assert(datasources[0].Description(), gc.Equals, "bootstrap metadata") // This data source does not require to contain signed data. // However, it may still contain it. // Since we will always try to read signed data first, // we want to be able to try to read this signed data // with a user provided key. // for this test, user provided key is empty. // Bugs #1542127, #1542131 c.Assert(datasources[0].PublicSigningKey(), gc.Equals, "") c.Assert(env.instanceConfig, gc.NotNil) c.Assert(env.instanceConfig.CustomImageMetadata, gc.HasLen, 1) c.Assert(env.instanceConfig.CustomImageMetadata[0], gc.DeepEquals, metadata[0]) }
func (s *bootstrapSuite) TestBootstrapMetadataImagesMissing(c *gc.C) { environs.UnregisterImageDataSourceFunc("bootstrap metadata") noImagesDir := c.MkDir() stor, err := filestorage.NewFileStorageWriter(noImagesDir) c.Assert(err, jc.ErrorIsNil) envtesting.UploadFakeTools(c, stor, "released", "released") env := newEnviron("foo", useDefaultKeys, nil) s.setDummyStorage(c, env) err = bootstrap.Bootstrap(envtesting.BootstrapContext(c), env, bootstrap.BootstrapParams{ ControllerConfig: coretesting.FakeControllerConfig(), AdminSecret: "admin-secret", CAPrivateKey: coretesting.CAKey, MetadataDir: noImagesDir, }) c.Assert(err, jc.ErrorIsNil) c.Assert(env.bootstrapCount, gc.Equals, 1) datasources, err := environs.ImageMetadataSources(env) c.Assert(err, jc.ErrorIsNil) c.Assert(datasources, gc.HasLen, 2) c.Assert(datasources[0].Description(), gc.Equals, "default cloud images") c.Assert(datasources[1].Description(), gc.Equals, "default ubuntu cloud images") }
func (s *ImageMetadataSuite) TestImageMetadataURLsRegisteredFuncsError(c *gc.C) { environs.RegisterImageDataSourceFunc("id0", func(environs.Environ) (simplestreams.DataSource, error) { return nil, errors.New("oyvey!") }) defer environs.UnregisterImageDataSourceFunc("id0") env := s.env(c, "config-image-metadata-url", "") _, err := environs.ImageMetadataSources(env) c.Assert(err, gc.ErrorMatches, "oyvey!") }
func (s *regionMetadataSuite) createTestDataSource(c *gc.C, dsID string, files []struct{ path, content string }) int { metadataDir := c.MkDir() writeTempFiles(c, metadataDir, files) ds := simplestreams.NewURLDataSource(dsID, "file://"+metadataDir, false, 20, false) environs.RegisterImageDataSourceFunc(dsID, func(environs.Environ) (simplestreams.DataSource, error) { return ds, nil }) s.AddCleanup(func(*gc.C) { environs.UnregisterImageDataSourceFunc(dsID) }) return ds.Priority() }
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 }
// unregisterSimplestreamsDataSource de-registers an environmentStorageDataSource. func unregisterSimplestreamsDataSource() { environs.UnregisterImageDataSourceFunc(storageDataSourceId) }