github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/apiserver/provisioner/imagemetadata_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package provisioner_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	jc "github.com/juju/testing/checkers"
     9  	gc "gopkg.in/check.v1"
    10  
    11  	"github.com/juju/juju/apiserver/params"
    12  	"github.com/juju/juju/apiserver/provisioner"
    13  	"github.com/juju/juju/environs/imagemetadata"
    14  	imagetesting "github.com/juju/juju/environs/imagemetadata/testing"
    15  	sstesting "github.com/juju/juju/environs/simplestreams/testing"
    16  	"github.com/juju/juju/juju/keys"
    17  	"github.com/juju/juju/state/cloudimagemetadata"
    18  )
    19  
    20  // useTestImageData causes the given content to be served when published metadata is requested.
    21  func useTestImageData(c *gc.C, files map[string]string) {
    22  	if files != nil {
    23  		sstesting.SetRoundTripperFiles(sstesting.AddSignedFiles(c, files), nil)
    24  	} else {
    25  		sstesting.SetRoundTripperFiles(nil, nil)
    26  	}
    27  }
    28  
    29  type ImageMetadataSuite struct {
    30  	provisionerSuite
    31  }
    32  
    33  var _ = gc.Suite(&ImageMetadataSuite{})
    34  
    35  func (s *ImageMetadataSuite) SetUpSuite(c *gc.C) {
    36  	s.provisionerSuite.SetUpSuite(c)
    37  
    38  	// Make sure that there is nothing in data sources.
    39  	// Each individual tests will decide if it needs metadata there.
    40  	imagetesting.PatchOfficialDataSources(&s.CleanupSuite, "test:/daily")
    41  	s.PatchValue(&imagemetadata.SimplestreamsImagesPublicKey, sstesting.SignedMetadataPublicKey)
    42  	s.PatchValue(&keys.JujuPublicKey, sstesting.SignedMetadataPublicKey)
    43  	useTestImageData(c, nil)
    44  }
    45  
    46  func (s *ImageMetadataSuite) TearDownSuite(c *gc.C) {
    47  	useTestImageData(c, nil)
    48  	s.provisionerSuite.TearDownSuite(c)
    49  }
    50  
    51  func (s *ImageMetadataSuite) SetUpTest(c *gc.C) {
    52  	s.provisionerSuite.SetUpTest(c)
    53  }
    54  
    55  func (s *ImageMetadataSuite) TestMetadataNone(c *gc.C) {
    56  	api, err := provisioner.NewProvisionerAPI(s.State, s.resources, s.authorizer)
    57  	c.Assert(err, jc.ErrorIsNil)
    58  
    59  	result, err := api.ProvisioningInfo(s.getTestMachinesTags(c))
    60  	c.Assert(err, jc.ErrorIsNil)
    61  
    62  	expected := make([][]params.CloudImageMetadata, len(s.machines))
    63  	for i, _ := range result.Results {
    64  		expected[i] = nil
    65  	}
    66  	s.assertImageMetadataResults(c, result, expected...)
    67  }
    68  
    69  func (s *ImageMetadataSuite) TestMetadataNotInStateButInDataSources(c *gc.C) {
    70  	// ensure metadata in data sources and not in state
    71  	useTestImageData(c, testImagesData)
    72  
    73  	criteria := cloudimagemetadata.MetadataFilter{Stream: "daily"}
    74  	found, err := s.State.CloudImageMetadataStorage.FindMetadata(criteria)
    75  	c.Assert(errors.IsNotFound(err), jc.IsTrue)
    76  	c.Assert(found, gc.HasLen, 0)
    77  
    78  	api, err := provisioner.NewProvisionerAPI(s.State, s.resources, s.authorizer)
    79  	c.Assert(err, jc.ErrorIsNil)
    80  
    81  	result, err := api.ProvisioningInfo(s.getTestMachinesTags(c))
    82  	c.Assert(err, jc.ErrorIsNil)
    83  
    84  	expected := s.expectedDataSoureImageMetadata()
    85  	s.assertImageMetadataResults(c, result, expected...)
    86  
    87  	// Also make sure that these images metadata has been written to state for re-use
    88  	saved, err := s.State.CloudImageMetadataStorage.FindMetadata(criteria)
    89  	c.Assert(err, jc.ErrorIsNil)
    90  	stateExpected := s.convertCloudImageMetadata(expected[0])
    91  	if len(saved["default cloud images"]) == len(stateExpected) {
    92  		for i, image := range saved["default cloud images"] {
    93  			stateExpected[i].DateCreated = image.DateCreated
    94  		}
    95  	}
    96  	c.Assert(saved, gc.DeepEquals, map[string][]cloudimagemetadata.Metadata{
    97  		"default cloud images": stateExpected,
    98  	})
    99  }
   100  
   101  func (s *ImageMetadataSuite) TestMetadataFromState(c *gc.C) {
   102  	api, err := provisioner.NewProvisionerAPI(s.State, s.resources, s.authorizer)
   103  	c.Assert(err, jc.ErrorIsNil)
   104  
   105  	expected := s.expectedDataSoureImageMetadata()
   106  
   107  	// Write metadata to state.
   108  	metadata := s.convertCloudImageMetadata(expected[0])
   109  	for _, m := range metadata {
   110  		err := s.State.CloudImageMetadataStorage.SaveMetadata(
   111  			[]cloudimagemetadata.Metadata{m},
   112  		)
   113  		c.Assert(err, jc.ErrorIsNil)
   114  	}
   115  
   116  	result, err := api.ProvisioningInfo(s.getTestMachinesTags(c))
   117  	c.Assert(err, jc.ErrorIsNil)
   118  
   119  	s.assertImageMetadataResults(c, result, expected...)
   120  }
   121  
   122  func (s *ImageMetadataSuite) getTestMachinesTags(c *gc.C) params.Entities {
   123  
   124  	testMachines := make([]params.Entity, len(s.machines))
   125  
   126  	for i, m := range s.machines {
   127  		testMachines[i] = params.Entity{Tag: m.Tag().String()}
   128  	}
   129  	return params.Entities{Entities: testMachines}
   130  }
   131  
   132  func (s *ImageMetadataSuite) convertCloudImageMetadata(all []params.CloudImageMetadata) []cloudimagemetadata.Metadata {
   133  	expected := make([]cloudimagemetadata.Metadata, len(all))
   134  	for i, one := range all {
   135  		expected[i] = cloudimagemetadata.Metadata{
   136  			cloudimagemetadata.MetadataAttributes{
   137  				Region:          one.Region,
   138  				Version:         one.Version,
   139  				Series:          one.Series,
   140  				Arch:            one.Arch,
   141  				VirtType:        one.VirtType,
   142  				RootStorageType: one.RootStorageType,
   143  				Source:          one.Source,
   144  				Stream:          one.Stream,
   145  			},
   146  			one.Priority,
   147  			one.ImageId,
   148  			0,
   149  		}
   150  	}
   151  	return expected
   152  }
   153  
   154  func (s *ImageMetadataSuite) expectedDataSoureImageMetadata() [][]params.CloudImageMetadata {
   155  	expected := make([][]params.CloudImageMetadata, len(s.machines))
   156  	for i, _ := range s.machines {
   157  		expected[i] = []params.CloudImageMetadata{
   158  			{ImageId: "ami-1126745463",
   159  				Region:          "another_dummy_region",
   160  				Version:         "12.10",
   161  				Series:          "quantal",
   162  				Arch:            "amd64",
   163  				VirtType:        "pv",
   164  				RootStorageType: "ebs",
   165  				Source:          "default cloud images",
   166  				Stream:          "daily",
   167  				Priority:        10,
   168  			},
   169  			{ImageId: "ami-26745463",
   170  				Region:          "dummy_region",
   171  				Version:         "12.10",
   172  				Series:          "quantal",
   173  				Arch:            "amd64",
   174  				VirtType:        "pv",
   175  				RootStorageType: "ebs",
   176  				Stream:          "daily",
   177  				Source:          "default cloud images",
   178  				Priority:        10},
   179  		}
   180  	}
   181  	return expected
   182  }
   183  
   184  func (s *ImageMetadataSuite) assertImageMetadataResults(c *gc.C, obtained params.ProvisioningInfoResults, expected ...[]params.CloudImageMetadata) {
   185  	c.Assert(obtained.Results, gc.HasLen, len(expected))
   186  	for i, one := range obtained.Results {
   187  		// We are only concerned with images here
   188  		c.Assert(one.Result.ImageMetadata, gc.DeepEquals, expected[i])
   189  	}
   190  }
   191  
   192  // TODO (anastasiamac 2015-09-04) This metadata is so verbose.
   193  // Need to generate the text by creating a struct and marshalling it.
   194  var testImagesData = map[string]string{
   195  	"/daily/streams/v1/index.json": `
   196  		{
   197  		 "index": {
   198  		  "com.ubuntu.cloud:daily:aws": {
   199  		   "updated": "Wed, 01 May 2013 13:31:26 +0000",
   200  		   "clouds": [
   201  			{
   202  			 "region": "dummy_region",
   203  			 "endpoint": "https://anywhere"
   204  			},
   205  			{
   206  			 "region": "another_dummy_region",
   207  			 "endpoint": ""
   208  			}
   209  		   ],
   210  		   "cloudname": "aws",
   211  		   "datatype": "image-ids",
   212  		   "format": "products:1.0",
   213  		   "products": [
   214  			"com.ubuntu.cloud.daily:server:12.10:amd64",
   215  			"com.ubuntu.cloud.daily:server:14.04:amd64"
   216  		   ],
   217  		   "path": "streams/v1/image_metadata.json"
   218  		   }
   219  		  },
   220  		 "updated": "Wed, 27 May 2015 13:31:26 +0000",
   221  		 "format": "index:1.0"
   222  		}
   223  `,
   224  	"/daily/streams/v1/image_metadata.json": `
   225  {
   226   "updated": "Wed, 27 May 2015 13:31:26 +0000",
   227   "content_id": "com.ubuntu.cloud:daily:aws",
   228   "products": {
   229    "com.ubuntu.cloud.daily:server:14.04:amd64": {
   230     "release": "trusty",
   231     "version": "14.04",
   232     "arch": "amd64",
   233     "versions": {
   234      "20140118": {
   235       "items": {
   236        "nzww1pe": {
   237         "root_store": "ebs",
   238         "virt": "pv",
   239         "crsn": "da1",
   240         "id": "ami-36745463"
   241        },
   242        "nzww1pe2": {
   243         "root_store": "ebs",
   244         "virt": "pv",
   245         "crsn": "da2",
   246         "id": "ami-1136745463"
   247        }
   248       },
   249       "pubname": "ubuntu-trusty-14.04-amd64-server-20140118",
   250       "label": "release"
   251      }
   252     }
   253    },
   254    "com.ubuntu.cloud.daily:server:12.10:amd64": {
   255     "release": "quantal",
   256     "version": "12.10",
   257     "arch": "amd64",
   258     "versions": {
   259      "20121218": {
   260       "items": {
   261        "usww1pe": {
   262         "root_store": "ebs",
   263         "virt": "pv",
   264         "crsn": "da1",
   265         "id": "ami-26745463"
   266        },
   267        "usww1pe2": {
   268         "root_store": "ebs",
   269         "virt": "pv",
   270         "crsn": "da2",
   271         "id": "ami-1126745463"
   272        }
   273       },
   274       "pubname": "ubuntu-quantal-12.10-amd64-server-20121218",
   275       "label": "release"
   276      }
   277     }
   278    }
   279   },
   280   "_aliases": {
   281    "crsn": {
   282     "da1": {
   283      "region": "dummy_region",
   284      "endpoint": "https://anywhere"
   285     },
   286     "da2": {
   287      "region": "another_dummy_region",
   288      "endpoint": ""
   289     }
   290    }
   291   },
   292   "format": "products:1.0"
   293  }
   294  `,
   295  }