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

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package imagemetadata_test
     5  
     6  import (
     7  	jc "github.com/juju/testing/checkers"
     8  	gc "gopkg.in/check.v1"
     9  
    10  	corebase "github.com/juju/juju/core/base"
    11  	"github.com/juju/juju/environs/filestorage"
    12  	"github.com/juju/juju/environs/imagemetadata"
    13  	"github.com/juju/juju/environs/imagemetadata/testing"
    14  	"github.com/juju/juju/environs/simplestreams"
    15  	sstesting "github.com/juju/juju/environs/simplestreams/testing"
    16  	"github.com/juju/juju/environs/storage"
    17  	coretesting "github.com/juju/juju/testing"
    18  )
    19  
    20  var (
    21  	testBase    = corebase.MustParseBaseFromString("ubuntu@16.04")
    22  	testVersion = "16.04"
    23  )
    24  
    25  var _ = gc.Suite(&generateSuite{})
    26  
    27  type generateSuite struct {
    28  	coretesting.BaseSuite
    29  }
    30  
    31  func (s *generateSuite) SetUpTest(c *gc.C) {
    32  	s.PatchValue(&corebase.UbuntuDistroInfo, "/path/notexists")
    33  }
    34  
    35  func assertFetch(c *gc.C, ss *simplestreams.Simplestreams, stor storage.Storage, version, arch, region, endpoint string, ids ...string) {
    36  	cons, err := imagemetadata.NewImageConstraint(simplestreams.LookupParams{
    37  		CloudSpec: simplestreams.CloudSpec{region, endpoint},
    38  		Releases:  []string{version},
    39  		Arches:    []string{arch},
    40  	})
    41  	c.Assert(err, jc.ErrorIsNil)
    42  	dataSource := storage.NewStorageSimpleStreamsDataSource("test datasource", stor, "images", simplestreams.DEFAULT_CLOUD_DATA, false)
    43  	metadata, _, err := imagemetadata.Fetch(ss, []simplestreams.DataSource{dataSource}, cons)
    44  	c.Assert(err, jc.ErrorIsNil)
    45  	c.Assert(metadata, gc.HasLen, len(ids))
    46  	for i, id := range ids {
    47  		c.Assert(metadata[i].Id, gc.Equals, id)
    48  	}
    49  }
    50  
    51  func (s *generateSuite) TestWriteMetadata(c *gc.C) {
    52  	ss := simplestreams.NewSimpleStreams(sstesting.TestDataSourceFactory())
    53  	im := []*imagemetadata.ImageMetadata{
    54  		{
    55  			Id:      "1234",
    56  			Arch:    "amd64",
    57  			Version: testVersion,
    58  		},
    59  	}
    60  	cloudSpec := &simplestreams.CloudSpec{
    61  		Region:   "region",
    62  		Endpoint: "endpoint",
    63  	}
    64  	dir := c.MkDir()
    65  	targetStorage, err := filestorage.NewFileStorageWriter(dir)
    66  	c.Assert(err, jc.ErrorIsNil)
    67  	err = imagemetadata.MergeAndWriteMetadata(ss, testBase, im, cloudSpec, targetStorage)
    68  	c.Assert(err, jc.ErrorIsNil)
    69  	metadata := testing.ParseMetadataFromDir(c, dir)
    70  	c.Assert(metadata, gc.HasLen, 1)
    71  	im[0].RegionName = cloudSpec.Region
    72  	im[0].Endpoint = cloudSpec.Endpoint
    73  	c.Assert(im[0], gc.DeepEquals, metadata[0])
    74  	assertFetch(c, ss, targetStorage, testVersion, "amd64", "region", "endpoint", "1234")
    75  }
    76  
    77  func (s *generateSuite) TestWriteMetadataMergeOverwriteSameArch(c *gc.C) {
    78  	ss := simplestreams.NewSimpleStreams(sstesting.TestDataSourceFactory())
    79  	existingImageMetadata := []*imagemetadata.ImageMetadata{
    80  		{
    81  			Id:      "1234",
    82  			Arch:    "amd64",
    83  			Version: testVersion,
    84  		},
    85  	}
    86  	cloudSpec := &simplestreams.CloudSpec{
    87  		Region:   "region",
    88  		Endpoint: "endpoint",
    89  	}
    90  	dir := c.MkDir()
    91  	targetStorage, err := filestorage.NewFileStorageWriter(dir)
    92  	c.Assert(err, jc.ErrorIsNil)
    93  	err = imagemetadata.MergeAndWriteMetadata(ss, testBase, existingImageMetadata, cloudSpec, targetStorage)
    94  	c.Assert(err, jc.ErrorIsNil)
    95  	newImageMetadata := []*imagemetadata.ImageMetadata{
    96  		{
    97  			Id:      "abcd",
    98  			Arch:    "amd64",
    99  			Version: testVersion,
   100  		},
   101  		{
   102  			Id:      "xyz",
   103  			Arch:    "arm",
   104  			Version: testVersion,
   105  		},
   106  	}
   107  	err = imagemetadata.MergeAndWriteMetadata(ss, testBase, newImageMetadata, cloudSpec, targetStorage)
   108  	c.Assert(err, jc.ErrorIsNil)
   109  	metadata := testing.ParseMetadataFromDir(c, dir)
   110  	c.Assert(metadata, gc.HasLen, 2)
   111  	for _, im := range newImageMetadata {
   112  		im.RegionName = cloudSpec.Region
   113  		im.Endpoint = cloudSpec.Endpoint
   114  	}
   115  	c.Assert(metadata, gc.DeepEquals, newImageMetadata)
   116  	assertFetch(c, ss, targetStorage, testVersion, "amd64", "region", "endpoint", "abcd")
   117  	assertFetch(c, ss, targetStorage, testVersion, "arm", "region", "endpoint", "xyz")
   118  }
   119  
   120  func (s *generateSuite) TestWriteMetadataMergeDifferentSeries(c *gc.C) {
   121  	ss := simplestreams.NewSimpleStreams(sstesting.TestDataSourceFactory())
   122  	existingImageMetadata := []*imagemetadata.ImageMetadata{
   123  		{
   124  			Id:      "1234",
   125  			Arch:    "amd64",
   126  			Version: testVersion,
   127  		},
   128  	}
   129  	cloudSpec := &simplestreams.CloudSpec{
   130  		Region:   "region",
   131  		Endpoint: "endpoint",
   132  	}
   133  	dir := c.MkDir()
   134  	targetStorage, err := filestorage.NewFileStorageWriter(dir)
   135  	c.Assert(err, jc.ErrorIsNil)
   136  	err = imagemetadata.MergeAndWriteMetadata(ss, testBase, existingImageMetadata, cloudSpec, targetStorage)
   137  	c.Assert(err, jc.ErrorIsNil)
   138  	newImageMetadata := []*imagemetadata.ImageMetadata{
   139  		{
   140  			Id:      "abcd",
   141  			Arch:    "amd64",
   142  			Version: "12.04",
   143  		},
   144  		{
   145  			Id:      "xyz",
   146  			Arch:    "arm",
   147  			Version: "12.04",
   148  		},
   149  	}
   150  	base := corebase.MustParseBaseFromString("ubuntu@12.04")
   151  	err = imagemetadata.MergeAndWriteMetadata(ss, base, newImageMetadata, cloudSpec, targetStorage)
   152  	c.Assert(err, jc.ErrorIsNil)
   153  	metadata := testing.ParseMetadataFromDir(c, dir)
   154  	c.Assert(metadata, gc.HasLen, 3)
   155  	newImageMetadata = append(newImageMetadata, existingImageMetadata[0])
   156  	for _, im := range newImageMetadata {
   157  		im.RegionName = cloudSpec.Region
   158  		im.Endpoint = cloudSpec.Endpoint
   159  	}
   160  	imagemetadata.Sort(newImageMetadata)
   161  	c.Assert(metadata, gc.DeepEquals, newImageMetadata)
   162  	assertFetch(c, ss, targetStorage, testVersion, "amd64", "region", "endpoint", "1234")
   163  	assertFetch(c, ss, targetStorage, "12.04", "amd64", "region", "endpoint", "abcd")
   164  }
   165  
   166  func (s *generateSuite) TestWriteMetadataMergeDifferentRegion(c *gc.C) {
   167  	ss := simplestreams.NewSimpleStreams(sstesting.TestDataSourceFactory())
   168  	existingImageMetadata := []*imagemetadata.ImageMetadata{
   169  		{
   170  			Id:      "1234",
   171  			Arch:    "amd64",
   172  			Version: testVersion,
   173  		},
   174  	}
   175  	cloudSpec := &simplestreams.CloudSpec{
   176  		Region:   "region",
   177  		Endpoint: "endpoint",
   178  	}
   179  	dir := c.MkDir()
   180  	targetStorage, err := filestorage.NewFileStorageWriter(dir)
   181  	c.Assert(err, jc.ErrorIsNil)
   182  	err = imagemetadata.MergeAndWriteMetadata(ss, testBase, existingImageMetadata, cloudSpec, targetStorage)
   183  	c.Assert(err, jc.ErrorIsNil)
   184  	newImageMetadata := []*imagemetadata.ImageMetadata{
   185  		{
   186  			Id:      "abcd",
   187  			Arch:    "amd64",
   188  			Version: testVersion,
   189  		},
   190  		{
   191  			Id:      "xyz",
   192  			Arch:    "arm",
   193  			Version: testVersion,
   194  		},
   195  	}
   196  	cloudSpec = &simplestreams.CloudSpec{
   197  		Region:   "region2",
   198  		Endpoint: "endpoint2",
   199  	}
   200  	err = imagemetadata.MergeAndWriteMetadata(ss, testBase, newImageMetadata, cloudSpec, targetStorage)
   201  	c.Assert(err, jc.ErrorIsNil)
   202  	metadata := testing.ParseMetadataFromDir(c, dir)
   203  	c.Assert(metadata, gc.HasLen, 3)
   204  	for _, im := range newImageMetadata {
   205  		im.RegionName = "region2"
   206  		im.Endpoint = "endpoint2"
   207  	}
   208  	existingImageMetadata[0].RegionName = "region"
   209  	existingImageMetadata[0].Endpoint = "endpoint"
   210  	newImageMetadata = append(newImageMetadata, existingImageMetadata[0])
   211  	imagemetadata.Sort(newImageMetadata)
   212  	c.Assert(metadata, gc.DeepEquals, newImageMetadata)
   213  	assertFetch(c, ss, targetStorage, testVersion, "amd64", "region", "endpoint", "1234")
   214  	assertFetch(c, ss, targetStorage, testVersion, "amd64", "region2", "endpoint2", "abcd")
   215  }
   216  
   217  // lp#1600054
   218  func (s *generateSuite) TestWriteMetadataMergeDifferentVirtType(c *gc.C) {
   219  	ss := simplestreams.NewSimpleStreams(sstesting.TestDataSourceFactory())
   220  	existingImageMetadata := []*imagemetadata.ImageMetadata{
   221  		{
   222  			Id:       "1234",
   223  			Arch:     "amd64",
   224  			Version:  testVersion,
   225  			VirtType: "kvm",
   226  		},
   227  	}
   228  	cloudSpec := &simplestreams.CloudSpec{
   229  		Region:   "region",
   230  		Endpoint: "endpoint",
   231  	}
   232  	dir := c.MkDir()
   233  	targetStorage, err := filestorage.NewFileStorageWriter(dir)
   234  	c.Assert(err, jc.ErrorIsNil)
   235  	err = imagemetadata.MergeAndWriteMetadata(ss, testBase, existingImageMetadata, cloudSpec, targetStorage)
   236  	c.Assert(err, jc.ErrorIsNil)
   237  	newImageMetadata := []*imagemetadata.ImageMetadata{
   238  		{
   239  			Id:       "abcd",
   240  			Arch:     "amd64",
   241  			Version:  testVersion,
   242  			VirtType: "lxd",
   243  		},
   244  	}
   245  	err = imagemetadata.MergeAndWriteMetadata(ss, testBase, newImageMetadata, cloudSpec, targetStorage)
   246  	c.Assert(err, jc.ErrorIsNil)
   247  
   248  	foundMetadata := testing.ParseMetadataFromDir(c, dir)
   249  
   250  	expectedMetadata := append(newImageMetadata, existingImageMetadata...)
   251  	c.Assert(len(foundMetadata), gc.Equals, len(expectedMetadata))
   252  	for _, im := range expectedMetadata {
   253  		im.RegionName = cloudSpec.Region
   254  		im.Endpoint = cloudSpec.Endpoint
   255  	}
   256  	imagemetadata.Sort(expectedMetadata)
   257  	c.Assert(foundMetadata, gc.DeepEquals, expectedMetadata)
   258  	assertFetch(c, ss, targetStorage, testVersion, "amd64", "region", "endpoint", "1234", "abcd")
   259  }
   260  
   261  func (s *generateSuite) TestWriteIndexRegionOnce(c *gc.C) {
   262  	ss := simplestreams.NewSimpleStreams(sstesting.TestDataSourceFactory())
   263  	existingImageMetadata := []*imagemetadata.ImageMetadata{
   264  		{
   265  			Id:       "1234",
   266  			Arch:     "amd64",
   267  			Version:  testVersion,
   268  			VirtType: "kvm",
   269  		},
   270  	}
   271  	cloudSpec := &simplestreams.CloudSpec{
   272  		Region:   "region",
   273  		Endpoint: "endpoint",
   274  	}
   275  	dir := c.MkDir()
   276  	targetStorage, err := filestorage.NewFileStorageWriter(dir)
   277  	c.Assert(err, jc.ErrorIsNil)
   278  	err = imagemetadata.MergeAndWriteMetadata(ss, testBase, existingImageMetadata, cloudSpec, targetStorage)
   279  	c.Assert(err, jc.ErrorIsNil)
   280  	newImageMetadata := []*imagemetadata.ImageMetadata{
   281  		{
   282  			Id:       "abcd",
   283  			Arch:     "amd64",
   284  			Version:  testVersion,
   285  			VirtType: "lxd",
   286  		},
   287  	}
   288  	err = imagemetadata.MergeAndWriteMetadata(ss, testBase, newImageMetadata, cloudSpec, targetStorage)
   289  	c.Assert(err, jc.ErrorIsNil)
   290  
   291  	foundIndex, _ := testing.ParseIndexMetadataFromStorage(c, targetStorage)
   292  	expectedCloudSpecs := []simplestreams.CloudSpec{*cloudSpec}
   293  	c.Assert(foundIndex.Clouds, jc.SameContents, expectedCloudSpecs)
   294  }
   295  
   296  func (s *generateSuite) TestWriteDistinctIndexRegions(c *gc.C) {
   297  	ss := simplestreams.NewSimpleStreams(sstesting.TestDataSourceFactory())
   298  	existingImageMetadata := []*imagemetadata.ImageMetadata{
   299  		{
   300  			Id:       "1234",
   301  			Arch:     "amd64",
   302  			Version:  testVersion,
   303  			VirtType: "kvm",
   304  		},
   305  	}
   306  	cloudSpec := &simplestreams.CloudSpec{
   307  		Region:   "region",
   308  		Endpoint: "endpoint",
   309  	}
   310  	dir := c.MkDir()
   311  	targetStorage, err := filestorage.NewFileStorageWriter(dir)
   312  	c.Assert(err, jc.ErrorIsNil)
   313  	err = imagemetadata.MergeAndWriteMetadata(ss, testBase, existingImageMetadata, cloudSpec, targetStorage)
   314  	c.Assert(err, jc.ErrorIsNil)
   315  
   316  	expectedCloudSpecs := []simplestreams.CloudSpec{*cloudSpec}
   317  
   318  	newImageMetadata := []*imagemetadata.ImageMetadata{
   319  		{
   320  			Id:       "abcd",
   321  			Arch:     "amd64",
   322  			Version:  testVersion,
   323  			VirtType: "lxd",
   324  		},
   325  	}
   326  	cloudSpec = &simplestreams.CloudSpec{
   327  		Region:   "region2",
   328  		Endpoint: "endpoint2",
   329  	}
   330  	err = imagemetadata.MergeAndWriteMetadata(ss, testBase, newImageMetadata, cloudSpec, targetStorage)
   331  	c.Assert(err, jc.ErrorIsNil)
   332  
   333  	foundIndex, _ := testing.ParseIndexMetadataFromStorage(c, targetStorage)
   334  	expectedCloudSpecs = append(expectedCloudSpecs, *cloudSpec)
   335  	c.Assert(foundIndex.Clouds, jc.SameContents, expectedCloudSpecs)
   336  }