github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/environs/imagemetadata_test.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package environs_test
     5  
     6  import (
     7  	stdcontext "context"
     8  
     9  	"github.com/juju/errors"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/environs"
    14  	"github.com/juju/juju/environs/bootstrap"
    15  	"github.com/juju/juju/environs/imagemetadata"
    16  	"github.com/juju/juju/environs/simplestreams"
    17  	sstesting "github.com/juju/juju/environs/simplestreams/testing"
    18  	envtesting "github.com/juju/juju/environs/testing"
    19  	"github.com/juju/juju/jujuclient"
    20  	"github.com/juju/juju/provider/dummy"
    21  	"github.com/juju/juju/testing"
    22  	coretesting "github.com/juju/juju/testing"
    23  )
    24  
    25  type ImageMetadataSuite struct {
    26  	coretesting.BaseSuite
    27  }
    28  
    29  var _ = gc.Suite(&ImageMetadataSuite{})
    30  
    31  func (s *ImageMetadataSuite) TearDownTest(c *gc.C) {
    32  	dummy.Reset(c)
    33  	s.BaseSuite.TearDownTest(c)
    34  }
    35  
    36  func (s *ImageMetadataSuite) env(c *gc.C, imageMetadataURL, stream string, defaultsDisabled bool) environs.Environ {
    37  	attrs := dummy.SampleConfig()
    38  	if stream != "" {
    39  		attrs = attrs.Merge(testing.Attrs{
    40  			"image-stream": stream,
    41  		})
    42  	}
    43  	if imageMetadataURL != "" {
    44  		attrs = attrs.Merge(testing.Attrs{
    45  			"image-metadata-url": imageMetadataURL,
    46  		})
    47  	}
    48  	if defaultsDisabled {
    49  		attrs = attrs.Merge(testing.Attrs{
    50  			"image-metadata-defaults-disabled": true,
    51  		})
    52  	}
    53  	env, err := bootstrap.PrepareController(
    54  		false,
    55  		envtesting.BootstrapContext(stdcontext.TODO(), c),
    56  		jujuclient.NewMemStore(),
    57  		bootstrap.PrepareParams{
    58  			ControllerConfig: testing.FakeControllerConfig(),
    59  			ControllerName:   attrs["name"].(string),
    60  			ModelConfig:      attrs,
    61  			Cloud:            dummy.SampleCloudSpec(),
    62  			AdminSecret:      "admin-secret",
    63  		},
    64  	)
    65  	c.Assert(err, jc.ErrorIsNil)
    66  	return env.(environs.Environ)
    67  }
    68  
    69  func (s *ImageMetadataSuite) TestImageMetadataURLsNoConfigURL(c *gc.C) {
    70  	env := s.env(c, "", "", false)
    71  	sources, err := environs.ImageMetadataSources(env, sstesting.TestDataSourceFactory())
    72  	c.Assert(err, jc.ErrorIsNil)
    73  	sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{
    74  		{"http://cloud-images.ubuntu.com/releases/", imagemetadata.SimplestreamsImagesPublicKey, true},
    75  	})
    76  }
    77  
    78  func (s *ImageMetadataSuite) TestImageMetadataURLs(c *gc.C) {
    79  	env := s.env(c, "config-image-metadata-url", "", false)
    80  	sources, err := environs.ImageMetadataSources(env, sstesting.TestDataSourceFactory())
    81  	c.Assert(err, jc.ErrorIsNil)
    82  	sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{
    83  		{"config-image-metadata-url/", "", false},
    84  		{"http://cloud-images.ubuntu.com/releases/", imagemetadata.SimplestreamsImagesPublicKey, true},
    85  	})
    86  }
    87  
    88  func (s *ImageMetadataSuite) TestImageMetadataURLsNoDefaults(c *gc.C) {
    89  	env := s.env(c, "https://custom.meta.data/", "", true)
    90  	sources, err := environs.ImageMetadataSources(env, sstesting.TestDataSourceFactory())
    91  	c.Assert(err, jc.ErrorIsNil)
    92  	sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{
    93  		{"https://custom.meta.data/", "", false},
    94  	})
    95  }
    96  
    97  func (s *ImageMetadataSuite) TestImageMetadataURLsNoDefaultsNoConfigURL(c *gc.C) {
    98  	env := s.env(c, "", "", true)
    99  	sources, err := environs.ImageMetadataSources(env, sstesting.TestDataSourceFactory())
   100  	c.Assert(err, jc.ErrorIsNil)
   101  	sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{})
   102  }
   103  
   104  func (s *ImageMetadataSuite) TestImageMetadataURLsRegisteredFuncs(c *gc.C) {
   105  	factory := sstesting.TestDataSourceFactory()
   106  	environs.RegisterImageDataSourceFunc("id0", func(environs.Environ) (simplestreams.DataSource, error) {
   107  		return factory.NewDataSource(simplestreams.Config{
   108  			Description:          "id0",
   109  			BaseURL:              "betwixt/releases",
   110  			HostnameVerification: false,
   111  			Priority:             simplestreams.DEFAULT_CLOUD_DATA}), nil
   112  	})
   113  	environs.RegisterImageDataSourceFunc("id1", func(environs.Environ) (simplestreams.DataSource, error) {
   114  		return factory.NewDataSource(simplestreams.Config{
   115  			Description:          "id1",
   116  			BaseURL:              "yoink",
   117  			HostnameVerification: false,
   118  			Priority:             simplestreams.SPECIFIC_CLOUD_DATA}), nil
   119  	})
   120  	// overwrite the one previously registered against id1
   121  	environs.RegisterImageDataSourceFunc("id1", func(environs.Environ) (simplestreams.DataSource, error) {
   122  		return nil, errors.NewNotSupported(nil, "oyvey")
   123  	})
   124  	environs.RegisterUserImageDataSourceFunc("id2", func(environs.Environ) (simplestreams.DataSource, error) {
   125  		return factory.NewDataSource(simplestreams.Config{
   126  			Description:          "id2",
   127  			BaseURL:              "foobar",
   128  			HostnameVerification: false,
   129  			Priority:             simplestreams.CUSTOM_CLOUD_DATA}), nil
   130  	})
   131  	defer environs.UnregisterImageDataSourceFunc("id0")
   132  	defer environs.UnregisterImageDataSourceFunc("id1")
   133  	defer environs.UnregisterImageDataSourceFunc("id2")
   134  
   135  	env := s.env(c, "config-image-metadata-url", "", false)
   136  	sources, err := environs.ImageMetadataSources(env, sstesting.TestDataSourceFactory())
   137  	c.Assert(err, jc.ErrorIsNil)
   138  	sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{
   139  		{"config-image-metadata-url/", "", false},
   140  		{"foobar/", "", false},
   141  		{"betwixt/releases/", "", false},
   142  		{"http://cloud-images.ubuntu.com/releases/", imagemetadata.SimplestreamsImagesPublicKey, true},
   143  	})
   144  }
   145  
   146  func (s *ImageMetadataSuite) TestImageMetadataURLsRegisteredFuncsNoDefaultsNoConfigURL(c *gc.C) {
   147  	factory := sstesting.TestDataSourceFactory()
   148  	environs.RegisterImageDataSourceFunc("id0", func(environs.Environ) (simplestreams.DataSource, error) {
   149  		return factory.NewDataSource(simplestreams.Config{
   150  			Description:          "id0",
   151  			BaseURL:              "betwixt/releases",
   152  			HostnameVerification: false,
   153  			Priority:             simplestreams.DEFAULT_CLOUD_DATA}), nil
   154  	})
   155  	environs.RegisterImageDataSourceFunc("id1", func(environs.Environ) (simplestreams.DataSource, error) {
   156  		return factory.NewDataSource(simplestreams.Config{
   157  			Description:          "id1",
   158  			BaseURL:              "yoink",
   159  			HostnameVerification: false,
   160  			Priority:             simplestreams.SPECIFIC_CLOUD_DATA}), nil
   161  	})
   162  	// overwrite the one previously registered against id1
   163  	environs.RegisterImageDataSourceFunc("id1", func(environs.Environ) (simplestreams.DataSource, error) {
   164  		return nil, errors.NewNotSupported(nil, "oyvey")
   165  	})
   166  	environs.RegisterUserImageDataSourceFunc("id2", func(environs.Environ) (simplestreams.DataSource, error) {
   167  		return factory.NewDataSource(simplestreams.Config{
   168  			Description:          "id2",
   169  			BaseURL:              "foobar",
   170  			HostnameVerification: false,
   171  			Priority:             simplestreams.CUSTOM_CLOUD_DATA}), nil
   172  	})
   173  	defer environs.UnregisterImageDataSourceFunc("id0")
   174  	defer environs.UnregisterImageDataSourceFunc("id1")
   175  	defer environs.UnregisterImageDataSourceFunc("id2")
   176  
   177  	env := s.env(c, "", "", true)
   178  	sources, err := environs.ImageMetadataSources(env, sstesting.TestDataSourceFactory())
   179  	c.Assert(err, jc.ErrorIsNil)
   180  	sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{
   181  		{"foobar/", "", false},
   182  		{"betwixt/releases/", "", false},
   183  	})
   184  }
   185  
   186  func (s *ImageMetadataSuite) TestImageMetadataURLsRegisteredFuncsError(c *gc.C) {
   187  	environs.RegisterImageDataSourceFunc("id0", func(environs.Environ) (simplestreams.DataSource, error) {
   188  		return nil, errors.New("oyvey!")
   189  	})
   190  	defer environs.UnregisterImageDataSourceFunc("id0")
   191  
   192  	env := s.env(c, "config-image-metadata-url", "", false)
   193  	_, err := environs.ImageMetadataSources(env, sstesting.TestDataSourceFactory())
   194  	c.Assert(err, gc.ErrorMatches, "oyvey!")
   195  }
   196  
   197  func (s *ImageMetadataSuite) TestImageMetadataURLsNonReleaseStream(c *gc.C) {
   198  	env := s.env(c, "", "daily", false)
   199  	sources, err := environs.ImageMetadataSources(env, sstesting.TestDataSourceFactory())
   200  	c.Assert(err, jc.ErrorIsNil)
   201  	sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{
   202  		{"http://cloud-images.ubuntu.com/daily/", imagemetadata.SimplestreamsImagesPublicKey, true},
   203  	})
   204  }